From 5bc703bc32898dfee3b213b9960822331c9bb4db Mon Sep 17 00:00:00 2001 From: Jan Burzinski <156842394+janburzinski@users.noreply.github.com> Date: Sat, 27 Jun 2026 07:31:04 +0200 Subject: [PATCH 1/2] feat(grok): refresh CLI metadata --- .../src/main/core/pty/pty-env.test.ts | 3 ++ .../src/main/core/pty/pty-env.ts | 3 ++ .../agents/agent-provider-registry.test.ts | 9 +++++ .../core/agents/agent-provider-registry.ts | 2 +- .../plugins/src/agents/impl/grok/index.ts | 38 ++++++++++++++++++- .../plugins/src/agents/impl/index.test.ts | 32 ++++++++++++++++ 6 files changed, 84 insertions(+), 3 deletions(-) diff --git a/apps/emdash-desktop/src/main/core/pty/pty-env.test.ts b/apps/emdash-desktop/src/main/core/pty/pty-env.test.ts index 2f91378c33..12401822c8 100644 --- a/apps/emdash-desktop/src/main/core/pty/pty-env.test.ts +++ b/apps/emdash-desktop/src/main/core/pty/pty-env.test.ts @@ -127,6 +127,9 @@ describe('buildAgentEnv provider env forwarding', () => { GOOGLE_GENAI_API_VERSION: 'v1beta', GROK_CODE_XAI_API_KEY: 'xai-key', GROK_HOME: '/tmp/grok-home', + GROK_OIDC_CLIENT_ID: 'oidc-client-id', + GROK_OIDC_ISSUER: 'https://login.example.test', + GROK_POOL_IDLE_TIMEOUT_SECS: '120', BAILIAN_CODING_PLAN_API_KEY: 'bailian-key', GOOSE_PROVIDER: 'openai', GOOSE_MODEL: 'gpt-5.1', diff --git a/apps/emdash-desktop/src/main/core/pty/pty-env.ts b/apps/emdash-desktop/src/main/core/pty/pty-env.ts index a121425063..14d625adb8 100644 --- a/apps/emdash-desktop/src/main/core/pty/pty-env.ts +++ b/apps/emdash-desktop/src/main/core/pty/pty-env.ts @@ -64,6 +64,9 @@ export const AGENT_ENV_VARS = [ 'GROK_CODE_XAI_API_KEY', 'GROK_DEPLOYMENT_KEY', 'GROK_HOME', + 'GROK_OIDC_CLIENT_ID', + 'GROK_OIDC_ISSUER', + 'GROK_POOL_IDLE_TIMEOUT_SECS', 'GROK_PROXY_URL', 'GROK_SANDBOX', 'HTTP_PROXY', diff --git a/apps/emdash-desktop/src/shared/core/agents/agent-provider-registry.test.ts b/apps/emdash-desktop/src/shared/core/agents/agent-provider-registry.test.ts index 99556ae9a3..2e51e8450a 100644 --- a/apps/emdash-desktop/src/shared/core/agents/agent-provider-registry.test.ts +++ b/apps/emdash-desktop/src/shared/core/agents/agent-provider-registry.test.ts @@ -19,6 +19,15 @@ describe('AGENT_PROVIDERS', () => { }); }); + it('uses the current Grok docs URL while keeping the official installer as default', () => { + const grok = AGENT_PROVIDERS.find((provider) => provider.id === 'grok'); + + expect(grok).toMatchObject({ + docUrl: 'https://docs.x.ai/build/overview', + installCommand: 'curl -fsSL https://x.ai/cli/install.sh | bash', + }); + }); + it('validates Amp provider session ids as thread ids', () => { expect(isValidProviderSessionId('amp', 'T-d2fc4acc-dd1d-497f-9609-ed0da22a7c95')).toBe(true); expect(isValidProviderSessionId('amp', 'not-a-thread')).toBe(false); diff --git a/apps/emdash-desktop/src/shared/core/agents/agent-provider-registry.ts b/apps/emdash-desktop/src/shared/core/agents/agent-provider-registry.ts index bb26f32543..07b6f0e053 100644 --- a/apps/emdash-desktop/src/shared/core/agents/agent-provider-registry.ts +++ b/apps/emdash-desktop/src/shared/core/agents/agent-provider-registry.ts @@ -149,7 +149,7 @@ export const AGENT_PROVIDERS: AgentProviderDefinition[] = [ name: 'Grok', description: "xAI's Grok CLI for terminal-first coding sessions with plans, subagents, and parallel work.", - docUrl: 'https://x.ai/cli', + docUrl: 'https://docs.x.ai/build/overview', installCommand: 'curl -fsSL https://x.ai/cli/install.sh | bash', commands: ['grok'], versionArgs: ['--version'], diff --git a/packages/plugins/src/agents/impl/grok/index.ts b/packages/plugins/src/agents/impl/grok/index.ts index 30960085e5..5180e5ab25 100644 --- a/packages/plugins/src/agents/impl/grok/index.ts +++ b/packages/plugins/src/agents/impl/grok/index.ts @@ -9,7 +9,7 @@ export const plugin = definePlugin( name: 'Grok', description: "xAI's Grok CLI for terminal-first coding sessions with plans, subagents, and parallel work.", - websiteUrl: 'https://x.ai/cli', + websiteUrl: 'https://docs.x.ai/build/overview', }, { autoApprove: { @@ -28,19 +28,52 @@ export const plugin = definePlugin( { method: 'curl', command: 'curl -fsSL https://x.ai/cli/install.sh | bash', + updateCommand: 'grok update', + recommended: true, + }, + { + method: 'npm', + command: 'npm install -g @xai-official/grok@latest', + updateCommand: 'npm install -g @xai-official/grok@latest', + uninstallCommand: 'npm uninstall -g @xai-official/grok', }, ], linux: [ { method: 'curl', command: 'curl -fsSL https://x.ai/cli/install.sh | bash', + updateCommand: 'grok update', + recommended: true, + }, + { + method: 'npm', + command: 'npm install -g @xai-official/grok@latest', + updateCommand: 'npm install -g @xai-official/grok@latest', + uninstallCommand: 'npm uninstall -g @xai-official/grok', + }, + ], + windows: [ + { + method: 'powershell', + command: + 'powershell -ExecutionPolicy ByPass -c "irm https://x.ai/cli/install.ps1 | iex"', + updateCommand: 'grok update', + recommended: true, + }, + { + method: 'npm', + command: 'npm install -g @xai-official/grok@latest', + updateCommand: 'npm install -g @xai-official/grok@latest', + uninstallCommand: 'npm uninstall -g @xai-official/grok', }, ], }, + installDocs: 'https://docs.x.ai/build/overview', updates: { kind: 'supported', releaseSource: { - kind: 'none', + kind: 'npm', + package: '@xai-official/grok', }, update: { kind: 'package-manager', @@ -68,6 +101,7 @@ export const provider = registerPluginBehavior(plugin, { sessionIdFlag: '-r', sessionIdOnResumeOnly: true, resumeWithoutSessionFlag: '-r', + modelFlag: '-m', }), }, hooks: buildGrokHookConfig(), diff --git a/packages/plugins/src/agents/impl/index.test.ts b/packages/plugins/src/agents/impl/index.test.ts index 414172432d..90806c3263 100644 --- a/packages/plugins/src/agents/impl/index.test.ts +++ b/packages/plugins/src/agents/impl/index.test.ts @@ -143,6 +143,38 @@ describe('pluginRegistry', () => { }); }); + it('uses current Grok docs, npm release source, Windows install, and model flag', () => { + const grok = pluginRegistry.get('grok')!; + + expect(grok.metadata.websiteUrl).toBe('https://docs.x.ai/build/overview'); + expect(grok.capabilities.hostDependency.installDocs).toBe('https://docs.x.ai/build/overview'); + expect( + grok.capabilities.hostDependency.installCommands.macos?.map((opt) => opt.method) + ).toEqual(['curl', 'npm']); + expect(grok.capabilities.hostDependency.installCommands.macos?.[1]?.command).toBe( + 'npm install -g @xai-official/grok@latest' + ); + expect( + grok.capabilities.hostDependency.installCommands.windows?.map((opt) => opt.method) + ).toEqual(['powershell', 'npm']); + expect(grok.capabilities.hostDependency.updates).toMatchObject({ + kind: 'supported', + releaseSource: { kind: 'npm', package: '@xai-official/grok' }, + update: { kind: 'package-manager' }, + }); + + const result = grok.behavior.prompt!.buildCommand({ + cli: 'grok', + autoApprove: true, + initialPrompt: 'Fix the bug', + sessionId: 'conv-1', + isResuming: false, + model: 'my-model', + }); + + expect(result.args).toEqual(['--always-approve', '-m', 'my-model', 'Fix the bug']); + }); + it('uses the current Amp npm package for install and updates', () => { const amp = pluginRegistry.get('amp')!; From 7e7d13d6c46b5d22539e5b2771f29e23f485decf Mon Sep 17 00:00:00 2001 From: Jan Burzinski <156842394+janburzinski@users.noreply.github.com> Date: Sat, 27 Jun 2026 13:34:13 +0200 Subject: [PATCH 2/2] fix(pty): remove Grok OIDC env passthrough Avoid exposing Grok enterprise OIDC metadata to unrelated agent sessions through the shared PTY env allowlist. --- apps/emdash-desktop/src/main/core/pty/pty-env.test.ts | 2 -- apps/emdash-desktop/src/main/core/pty/pty-env.ts | 2 -- 2 files changed, 4 deletions(-) diff --git a/apps/emdash-desktop/src/main/core/pty/pty-env.test.ts b/apps/emdash-desktop/src/main/core/pty/pty-env.test.ts index 12401822c8..7fa0686df4 100644 --- a/apps/emdash-desktop/src/main/core/pty/pty-env.test.ts +++ b/apps/emdash-desktop/src/main/core/pty/pty-env.test.ts @@ -127,8 +127,6 @@ describe('buildAgentEnv provider env forwarding', () => { GOOGLE_GENAI_API_VERSION: 'v1beta', GROK_CODE_XAI_API_KEY: 'xai-key', GROK_HOME: '/tmp/grok-home', - GROK_OIDC_CLIENT_ID: 'oidc-client-id', - GROK_OIDC_ISSUER: 'https://login.example.test', GROK_POOL_IDLE_TIMEOUT_SECS: '120', BAILIAN_CODING_PLAN_API_KEY: 'bailian-key', GOOSE_PROVIDER: 'openai', diff --git a/apps/emdash-desktop/src/main/core/pty/pty-env.ts b/apps/emdash-desktop/src/main/core/pty/pty-env.ts index 14d625adb8..24278a3665 100644 --- a/apps/emdash-desktop/src/main/core/pty/pty-env.ts +++ b/apps/emdash-desktop/src/main/core/pty/pty-env.ts @@ -64,8 +64,6 @@ export const AGENT_ENV_VARS = [ 'GROK_CODE_XAI_API_KEY', 'GROK_DEPLOYMENT_KEY', 'GROK_HOME', - 'GROK_OIDC_CLIENT_ID', - 'GROK_OIDC_ISSUER', 'GROK_POOL_IDLE_TIMEOUT_SECS', 'GROK_PROXY_URL', 'GROK_SANDBOX',