feat: add Grok Build support (#1030)

* test: define Grok Build integration behavior

* feat: add Grok Build agent integration

* test: cover Grok permissions and resume paths

* docs: add Grok Build setup guide

* fix: scope Grok ACP discovery to session cwd

* fix: align Grok permission UI semantics

* docs: clarify Grok runner setup

* test: require Grok create model and effort options

* feat: add Grok create model and effort pickers

* test: define Grok runtime parity behavior

* feat: add Grok runtime ACP controls and discovery

* fix: tighten Grok runtime controls

* fix: suppress nonfatal Grok title quota errors

* feat: support Grok Auto permission mode

* feat: forward ACP native session titles for Grok

* fix: guard Grok Windows shell arguments
This commit is contained in:
SSU-WEI HUANG
2026-07-13 08:41:30 +08:00
committed by GitHub
parent de07643828
commit b9eed7c071
92 changed files with 3796 additions and 63 deletions
+18
View File
@@ -32,6 +32,8 @@ import {
type RpcListCodexModelsResponse,
type RpcListCursorModelsResponse,
type RpcListOpencodeModelsResponse,
type RpcListGrokModelsResponse,
type RpcListGrokReasoningEffortOptionsResponse,
type RpcListOpencodeReasoningEffortOptionsResponse,
type RpcCursorModel,
type RpcOpencodeModel,
@@ -53,6 +55,8 @@ export type {
RpcListCodexModelsResponse,
RpcListCursorModelsResponse,
RpcListOpencodeModelsResponse,
RpcListGrokModelsResponse,
RpcListGrokReasoningEffortOptionsResponse,
RpcListOpencodeReasoningEffortOptionsResponse,
RpcCursorModel,
RpcOpencodeModel,
@@ -763,6 +767,7 @@ export class SyncEngine {
if (flavor === 'codex') return metadata.codexSessionId ?? null
if (flavor === 'gemini') return metadata.geminiSessionId ?? null
if (flavor === 'opencode') return metadata.opencodeSessionId ?? null
if (flavor === 'grok') return metadata.grokSessionId ?? null
if (flavor === 'cursor') return metadata.cursorSessionId ?? null
if (flavor === 'kimi') return metadata.kimiSessionId ?? null
if (flavor === 'pi') return metadata.piSessionId ?? null
@@ -1469,6 +1474,7 @@ export class SyncEngine {
&& (prev?.claudeSessionId ?? null) === (next.claudeSessionId ?? null)
&& (prev?.geminiSessionId ?? null) === (next.geminiSessionId ?? null)
&& (prev?.opencodeSessionId ?? null) === (next.opencodeSessionId ?? null)
&& (prev?.grokSessionId ?? null) === (next.grokSessionId ?? null)
&& (prev?.cursorSessionId ?? null) === (next.cursorSessionId ?? null)
&& (prev?.piSessionId ?? null) === (next.piSessionId ?? null)
&& (prev?.kimiSessionId ?? null) === (next.kimiSessionId ?? null)
@@ -1615,6 +1621,18 @@ export class SyncEngine {
return await this.rpcGateway.listOpencodeModelsForCwd(machineId, cwd)
}
async listGrokModelsForCwd(machineId: string, cwd: string): Promise<RpcListGrokModelsResponse> {
return await this.rpcGateway.listGrokModelsForCwd(machineId, cwd)
}
async listGrokModelsForSession(sessionId: string): Promise<RpcListGrokModelsResponse> {
return await this.rpcGateway.listGrokModelsForSession(sessionId)
}
async listGrokReasoningEffortOptionsForSession(sessionId: string): Promise<RpcListGrokReasoningEffortOptionsResponse> {
return await this.rpcGateway.listGrokReasoningEffortOptionsForSession(sessionId)
}
/** Generic Pi RPC — delegates to rpcGateway.callPiRpc. */
async callPiRpc<T = unknown>(sessionId: string, method: string, params?: Record<string, unknown>, timeoutMs?: number): Promise<T> {
return await this.rpcGateway.callPiRpc<T>(sessionId, method, params, timeoutMs)