-
Notifications
You must be signed in to change notification settings - Fork 34
Expand file tree
/
Copy pathpackage.json
More file actions
478 lines (478 loc) · 20.4 KB
/
Copy pathpackage.json
File metadata and controls
478 lines (478 loc) · 20.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
{
"name": "grok-vscode-phuryn",
"displayName": "Grok Build for VS Code (Community)",
"description": "GUI for Grok Build CLI (incl. Grok 4.6). Voice control, multiple sessions, images and videos, Mermaid diagrams, and LaTeX. Works with SuperGrok, X Premium+, and xAI API key. Fair Source (FSL-1.1-MIT). Not affiliated with or endorsed by SpaceXAI (formerly xAI).",
"version": "3.9.0",
"publisher": "PawelHuryn",
"author": {
"name": "Paweł Huryn",
"url": "https://www.productcompass.pm"
},
"license": "FSL-1.1-MIT",
"homepage": "https://github.com/phuryn/grok-build-vscode",
"bugs": {
"url": "https://github.com/phuryn/grok-build-vscode/issues"
},
"repository": {
"type": "git",
"url": "https://github.com/phuryn/grok-build-vscode"
},
"engines": {
"vscode": "^1.106.0"
},
"categories": [
"AI",
"Chat"
],
"keywords": [
"grok",
"grok-build",
"xai",
"xai-grok",
"acp",
"acp-client",
"agent-client-protocol",
"agent",
"ai",
"chat",
"thinking",
"tool-calls",
"sidebar"
],
"icon": "resources/grok-icon.png",
"main": "./out/extension.js",
"activationEvents": [
"onStartupFinished"
],
"contributes": {
"viewsContainers": {
"secondarySidebar": [
{
"id": "grokSidebar",
"title": "Grok",
"icon": "resources/grok-icon.svg"
}
],
"activitybar": [
{
"id": "grokPrimary",
"title": "Grok",
"icon": "resources/grok-icon.svg"
},
{
"id": "grokProjects",
"title": "Grok",
"icon": "resources/grok-icon.svg"
}
],
"panel": [
{
"id": "grokPanel",
"title": "Grok",
"icon": "resources/grok-icon.svg"
}
]
},
"views": {
"grokSidebar": [
{
"type": "webview",
"id": "grok.chat",
"name": "Grok"
}
],
"grokProjects": [
{
"type": "webview",
"id": "grok.projects",
"name": "Projects"
}
]
},
"commands": [
{
"command": "grok.open",
"title": "Grok: Open"
},
{
"command": "grok.moveView",
"title": "Grok: Move Chat View"
},
{
"command": "grok.newSession",
"title": "Grok: New Session"
},
{
"command": "grok.newWorktreeSession",
"title": "Grok: New Worktree Session"
},
{
"command": "grok.applyWorktree",
"title": "Grok: Apply Worktree"
},
{
"command": "grok.removeWorktree",
"title": "Grok: Remove Worktree"
},
{
"command": "grok.rewind",
"title": "Grok: Rewind Conversation"
},
{
"command": "grok.compact",
"title": "Grok: Compact Conversation"
},
{
"command": "grok.pickModel",
"title": "Grok: Pick Model"
},
{
"command": "grok.toggleMode",
"title": "Grok: Toggle Plan / Agent Mode"
},
{
"command": "grok.sendSelection",
"title": "Add Selection to Grok"
},
{
"command": "grok.sendFile",
"title": "Grok: Send File"
},
{
"command": "grok.insertAtMention",
"title": "Grok: Insert @-Mention"
},
{
"command": "grok.showLogs",
"title": "Grok: Show Logs"
},
{
"command": "grok.settings",
"title": "Grok: Settings",
"icon": "$(gear)"
},
{
"command": "grok.expandAllToolDetails",
"title": "Grok: Expand All Tool Details (This Session)"
},
{
"command": "grok.collapseAllToolDetails",
"title": "Grok: Collapse All Tool Details (This Session)"
},
{
"command": "grok.logout",
"title": "Grok: Log Out"
},
{
"command": "grok.linkRemote",
"title": "AFK Pilot: Link this device"
},
{
"command": "grok.unlinkRemote",
"title": "AFK Pilot: Unlink this device"
},
{
"command": "grok._debugDummyPlan",
"title": "Grok: Debug — Show dummy plan card (for testing Approve/Reject/Cancel)"
},
{
"command": "grok.composerForward",
"title": "Grok: Composer — Move Forward"
},
{
"command": "grok.composerPreviousLine",
"title": "Grok: Composer — Move to Previous Line"
}
],
"keybindings": [
{
"command": "grok.open",
"key": "ctrl+;",
"mac": "cmd+;"
},
{
"command": "grok.insertAtMention",
"key": "alt+g",
"when": "editorTextFocus"
},
{
"command": "grok.composerForward",
"key": "ctrl+f",
"when": "isMac && grok.composerFocus"
},
{
"command": "grok.composerPreviousLine",
"key": "ctrl+p",
"when": "isMac && grok.composerFocus"
}
],
"menus": {
"view/title": [
{
"command": "grok.settings",
"when": "view == grok.chat",
"group": "navigation"
}
],
"commandPalette": [
{
"command": "grok._debugDummyPlan",
"when": "false"
},
{
"command": "grok.composerForward",
"when": "false"
},
{
"command": "grok.composerPreviousLine",
"when": "false"
}
],
"editor/context": [
{
"command": "grok.sendSelection",
"when": "editorHasSelection",
"group": "grok@1"
}
],
"explorer/context": [
{
"command": "grok.sendFile",
"when": "resourceScheme == file",
"group": "grok@1"
}
],
"editor/title/context": [
{
"command": "grok.sendFile",
"when": "resourceScheme == file",
"group": "grok@1"
}
]
},
"configuration": {
"title": "Grok",
"properties": {
"grok.cliPath": {
"type": "string",
"default": "",
"description": "Path to the grok binary. Empty = auto-discover (~/.grok/bin/grok, then PATH)."
},
"grok.codexCliPath": {
"type": "string",
"default": "",
"description": "Path to the OpenAI Codex binary. Empty = auto-discover on PATH, then in the newest OpenAI ChatGPT bundle installed by VS Code, Cursor, or remote VS Code."
},
"grok.defaultModel": {
"type": "string",
"default": "",
"description": "Model ID to use on new sessions. Empty = CLI default. If a non-empty value isn't available for the session's agent, it's replaced with the model the CLI falls back to (no prompt)."
},
"grok.defaultMode": {
"type": "string",
"enum": [
"",
"agent",
"yolo"
],
"enumDescriptions": [
"Agent mode (CLI default)",
"Agent mode",
"Auto accept — auto-approve every permission request"
],
"default": "",
"description": "Mode for new sessions. Updated automatically to remember your last switch between Agent and Auto accept (Plan is never remembered). Empty = Agent."
},
"grok.includeActiveFileByDefault": {
"type": "boolean",
"default": true,
"description": "Auto-add the active editor file as a context chip."
},
"grok.mentionIndexLimit": {
"type": "number",
"default": 5000,
"minimum": 100,
"markdownDescription": "Max workspace files indexed for composer **@** file autocomplete. Default 5000 keeps a cold index build bounded; raise it (no upper limit) if files are missing from the `@` list in large repos. Applies on the next `@` after the setting changes. Very large values cost more time on the first rebuild."
},
"grok.defaultEffort": {
"type": "string",
"enum": [
"",
"none",
"minimal",
"low",
"medium",
"high",
"xhigh"
],
"enumDescriptions": [
"CLI default (no flag passed to grok agent stdio)",
"None",
"Minimal",
"Low — faster, lighter reasoning",
"Medium",
"High",
"XHigh — deepest reasoning, slowest"
],
"default": "",
"description": "Reasoning effort passed as --reasoning-effort to grok agent stdio. Values match the grok CLI's accepted set (none, minimal, low, medium, high, xhigh). Applies live on recent CLIs (grok 0.2.101+); older CLIs, and resetting to the model default, restart the session."
},
"grok.useCtrlEnterToSend": {
"type": "boolean",
"default": false,
"description": "Use Ctrl/Cmd+Enter to send (Enter inserts newline)."
},
"grok.terminalShell": {
"type": "string",
"enum": [
"auto",
"cmd"
],
"enumDescriptions": [
"PowerShell on Windows (pwsh, then Windows PowerShell 5.1) — matches the standalone Grok CLI",
"Force cmd.exe on Windows (legacy)"
],
"default": "auto",
"markdownDescription": "Which shell runs the agent's commands **on Windows**. `auto` (default) uses PowerShell — `pwsh.exe` if installed, else Windows PowerShell 5.1 — so your PowerShell profile functions and pipelines work like they do in the standalone Grok CLI (#46). `cmd` forces `cmd.exe` (the pre-1.5.13 behavior) if the PowerShell host causes trouble. **Tip: install PowerShell 7 (`pwsh`)** — the 5.1 fallback rejects `&&` chains and reports every failing command's exit code as 1. No effect on macOS/Linux (always `/bin/sh`)."
},
"grok.showThinking": {
"type": "boolean",
"default": false,
"markdownDescription": "Show Grok's reasoning (thinking) traces in chat. Off by default — a lightweight \"Thinking…\" indicator stands in while Grok reasons. Also toggleable live from the gear menu → **Config & debug → Show thinking traces** (applies to already-loaded sessions too)."
},
"grok.expandCommandOutputs": {
"type": "boolean",
"default": false,
"markdownDescription": "Expand tool details by default — each shell command's IN/OUT block (full command text + captured output) and each edit's inline diff (useful for auditing Auto-accept sessions). With this setting on, groups containing command or edit details (such as \"Ran N commands\" or \"Edited N files\") open too; read/explore-only groups stay collapsed, and a lone command outside a group opens its details. Off: click a row or group header (›) to expand it — edit rows always show a `+N −M` change count, even when their diff is closed. Also toggleable live from the gear menu → **Config & debug → Expand tool details**."
},
"grok.steerByDefault": {
"type": "boolean",
"default": false,
"markdownDescription": "Send straight into Grok's running turn instead of queueing it. Off (default): a message you send while Grok is working waits, and is sent as one prompt when the turn ends — you can still steer it on demand with the **Steer** button on the pending message. On: sending while Grok works **skips the queue** and injects the message into the turn immediately, so Grok changes course mid-answer. Steering never cancels the turn and never discards in-flight tool work — it is not a Stop. It carries plain text only: no attached files, no editor context, and no `/commands`. Needs a recent Grok Build CLI; where it's unsupported, messages fall back to the queue. Also toggleable live from the gear menu → **Config & debug → Steer by default**."
},
"grok.soundNotifications": {
"type": "boolean",
"default": false,
"markdownDescription": "Play a short sound when Grok finishes a turn or hits an error — a rising chime on completion, a lower tone on error. Off by default. Plays **only when the Grok panel isn't focused** (you've switched to the editor or another window), so it notifies you when you've stepped away without beeping while you watch. Also toggleable live from the gear menu → **Config & debug → Sound notifications**."
},
"grok.processingSound": {
"type": "boolean",
"default": false,
"markdownDescription": "Play a quiet repeating sound while Grok is still working. The first cue waits seven seconds, then repeats every eight seconds until the turn ends. Off by default and separate from the completion/error sound. Also toggleable live from the gear menu → **Config & debug → Still-processing sound**."
},
"grok.readRepliesAloud": {
"type": "boolean",
"default": false,
"description": "Read completed Grok replies aloud in the VS Code chat. Code blocks are skipped."
},
"grok.summarizeRepliesAloud": {
"type": "boolean",
"default": true,
"markdownDescription": "Read simplified summaries of spoken Grok replies. Each reply costs an extra xAI call and adds network delay; the full reply is used if summarization fails. Uses the same credential resolution as Voice input. AFK Pilot keeps its own per-device browser preference."
},
"grok.remote.keepAwake": {
"type": "boolean",
"default": true,
"markdownDescription": "Keep this machine awake while it's linked to an **AFK Pilot** account, so a remote turn isn't cut off by idle sleep. Only active once you've signed in (gear → AFK Pilot → *Sign in*); unlinking releases the lock immediately. The display is still free to sleep — only system/idle sleep is blocked. Uses `caffeinate` on macOS, `SetThreadExecutionState` on Windows and `systemd-inhibit` on Linux. **A closed laptop lid still sleeps** on every platform — that's an OS-level decision no application can override."
},
"grok.telemetry.enabled": {
"type": "boolean",
"default": true,
"markdownDescription": "Send anonymous, privacy-first usage telemetry. A single `session_start` event per session carries an anonymous install id (a random GUID, no account/identity) plus a low-cardinality settings snapshot (including mode/model/effort, host kind, UI preferences, whether voice input is available, and which providers are connected; full list in [docs/privacy.md](https://github.com/PawelHuryn/grok-vscode/blob/main/docs/privacy.md)) — **never** any message content, code, file paths, or free-text settings. Also requires VS Code's global `telemetry.telemetryLevel` to be enabled and this to be the official build; turning either setting off stops all sending."
},
"grok.chatFontScale": {
"type": "number",
"default": 100,
"minimum": 60,
"maximum": 300,
"markdownDescription": "Zoom for the Grok chat panel only, as a percent (100 = default). Scales the whole chat UI — text, icons, spacing — without affecting the rest of VS Code (unlike `Ctrl/Cmd+Shift+=`). Applies live, no reload needed. Supports User (global) and Workspace (local) scope."
},
"grok.voiceApiKey": {
"type": "string",
"default": "",
"markdownDescription": "Optional override key for voice Speech-to-Text (`api.x.ai/v1/stt`). **Leave empty and it just works** — the extension reuses your `grok login` token automatically. Set this (or `GROK_VOICE_API_KEY` / `XAI_API_KEY` in your workspace `.env`) only to use a dedicated [console.x.ai](https://console.x.ai) developer key instead. Setup + costs: [docs/voice-setup.md](https://github.com/PawelHuryn/grok-vscode/blob/main/docs/voice-setup.md)."
},
"grok.ffmpegPath": {
"type": "string",
"default": "",
"description": "Path to the ffmpeg binary used to record the microphone for voice control. Empty = use 'ffmpeg' from PATH. Install ffmpeg from https://ffmpeg.org if voice control reports it as missing."
},
"grok.voiceInputDevice": {
"type": "string",
"default": "",
"description": "Microphone device for voice control. Empty = system default (on Windows, the first DirectShow audio device is auto-detected). Set this to a specific device name (Windows/dshow) or index (macOS/avfoundation) to override."
},
"grok.voiceSendPhrase": {
"type": "string",
"default": "grok send",
"description": "Spoken phrase that auto-submits the message when it ends a voice transcription (e.g. say \"…fix the bug, grok send\"). The phrase is stripped before sending. Leave empty to disable hands-free sending."
},
"grok.voiceKeyterms": {
"type": "array",
"items": {
"type": "string"
},
"default": [],
"description": "Words or phrases to help streaming voice recognition spell code and project vocabulary correctly (for example, \"Get-ChildItem\", \"useEffect\", or an internal package name). Put the most important terms first. xAI accepts at most 100 terms of 50 characters each; the send phrase and \"Grok\" are kept first, then user terms fill the remaining slots. Supports User and Workspace scope."
},
"grok.voiceLanguage": {
"type": "string",
"default": "",
"description": "Optional language code for streaming voice text formatting (for example, \"en\", \"fr\", \"de\", or \"ja\"). When set, xAI converts spoken numbers, currencies, and units to written forms. Leave empty to keep Inverse Text Normalization off and preserve spoken-form text. Supports User and Workspace scope."
},
"grok.voiceStreaming": {
"type": "boolean",
"default": true,
"description": "Stream voice transcription live as you speak (words appear in the composer in real time, and \"grok send\" can submit without a second click). Disable to use one-shot batch mode (click to start, click to stop, then transcribe). Streaming costs $0.20/hr of audio vs $0.10/hr batch."
}
}
}
},
"scripts": {
"vscode:prepublish": "tsc -p .",
"compile": "tsc -p .",
"watch": "tsc -p . -w",
"test": "vitest run",
"test:watch": "vitest",
"test:perf": "vitest run --config vitest.perf.config.ts",
"compile:integration": "node -e \"require('fs').rmSync('out-integration',{recursive:true,force:true})\" && tsc -p integration/tsconfig.json",
"test:integration": "npm run compile && npm run compile:integration && vscode-test",
"test:live": "tsc -p . && node scripts/live-tests.cjs",
"desktop": "npm run compile && node scripts/run-desktop.cjs",
"desktop-dev": "npm run compile && node scripts/run-desktop.cjs --relay-dev --open-devtools",
"test:desktop": "npm run compile && vitest run --config vitest.desktop.config.ts",
"e2e:screens": "npm run compile && node scripts/desk-screens-check.mjs",
"smoke:live": "npm run compile && node scripts/live-smoke.mjs",
"telemetry:probe": "tsc -p . && node scripts/telemetry-probe.cjs",
"check:vsix": "npm run compile && node scripts/check-vsix-requires.mjs",
"prepackage": "node -e \"const fs=require('fs'); for (const f of fs.readdirSync('.')) if (f.endsWith('.vsix')) fs.unlinkSync(f); fs.rmSync('out',{recursive:true,force:true})\" && npm run check:vsix",
"package": "vsce package --readme-path README.marketplace.md",
"publish": "vsce publish --readme-path README.marketplace.md",
"publish:ovsx": "node scripts/publish-ovsx.mjs",
"dist": "npm run compile && electron-builder --publish never",
"dist:mac": "npm run compile && electron-builder --mac --publish never",
"dist:win": "npm run compile && electron-builder --win --x64 --publish never",
"dist:dir": "npm run compile && electron-builder --dir --publish never"
},
"devDependencies": {
"@types/mocha": "^10.0.10",
"@types/node": "^20.0.0",
"@types/vscode": "^1.94.0",
"@types/ws": "^8.18.1",
"@vscode/test-cli": "^0.0.10",
"@vscode/test-electron": "^2.5.2",
"@vscode/vsce": "3.9.2",
"electron": "^33.2.1",
"electron-builder": "^25.1.8",
"happy-dom": "^20.9.0",
"playwright": "^1.49.1",
"typescript": "^5.4.0",
"vitest": "^1.6.0"
},
"dependencies": {
"@agentclientprotocol/codex-acp": "1.1.14",
"electron-updater": "^6.6.4",
"jpeg-js": "^0.4.4",
"ws": "^8.21.0"
}
}