Align the Grok CLI runtime plugin adapter with the real xAI grok CLI stream contract so tool responses are no longer silently dropped, and update tests/docs to match. - Rework stream-parser.ts to parse the actual grok CLI event/message shape instead of the previously assumed schema - Trim runtime-adapter.ts and types.ts down to the fields the real CLI contract emits, removing speculative/unsupported fields - Update cli-stream.ts to match the corrected event handling - Rewrite runtime-adapter, stream-parser, and cli-stream test suites to exercise the real CLI contract end-to-end - Update docs/grok-cli-contract.md and plugin README to document the verified contract - Add changeset for the grok-runtime plugin fix Files changed: .changeset/fn-7790-grok-cli-real-contract.md | 7 + docs/grok-cli-contract.md | 432 +++++++-------------- plugins/fusion-plugin-grok-runtime/README.md | 149 ++----- .../src/__tests__/cli-stream.test.ts | 22 +- .../src/__tests__/runtime-adapter.test.ts | 250 ++++-------- .../src/__tests__/stream-parser.test.ts | 108 ++---- .../fusion-plugin-grok-runtime/src/cli-stream.ts | 22 +- .../src/runtime-adapter.ts | 109 ++---- .../src/stream-parser.ts | 27 +- plugins/fusion-plugin-grok-runtime/src/types.ts | 104 +---- 10 files changed, 338 insertions(+), 892 deletions(-) Fusion-Task-Id: FN-7790 Fusion-Task-Lineage: 377e86c4-c005-46a5-9eb4-69e858c38b79 Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
fusion-plugin-grok-runtime
Grok CLI-backed provider/runtime plugin for Fusion.
Install
This plugin ships bundled with Fusion and is auto-installed like the other
built-in runtime plugins. It shells out to an operator-installed grok
binary on PATH — Fusion never downloads or bundles the CLI itself.
- Canonical upstream: xAI official Grok CLI / Grok Build TUI (
grok --versionobserved asgrok 0.2.93 (f00f96316d4b)). - Docs / homepage: https://grok.com/, https://docs.x.ai/, and
grok --help/grok agent --helpfor exact flags. - Release / download: operator-installed; Fusion resolves
grokfrom PATH orgrokCliBinaryPath. - Binary name:
grok. - Checksum:
upstream-pending-verificationbecause Fusion does not download or pin the operator's binary.
The previously assumed superagent-ai/grok-cli contract is a different product that shares the grok binary name. This plugin targets xAI's official CLI contract.
Contract summary
- Provider ID:
grok-cli - Binary probe:
grok --version - Auth model — the
grokCLI owns its own authentication; Fusion does not require a Fusion-visible API key to enable/use it (FN-7716). Fusion additionally probes theGROK_API_KEYenv var and~/.grok/user-settings.json→{ "apiKey": "..." }purely as a non-blocking informational hint (apiKeyDetected); it never gates Enable or the authenticated state. The direct xAI OpenAI-compatible streaming path (base URLhttps://api.x.ai/v1) still uses$GROK_API_KEYwhen present, independent of the CLI provider. - Model discovery:
grok models(plain text). The observed xAI shape isDefault model: <id>, thenAvailable models:, then* <id> (default)/- <id>bullet rows.
CLI streaming execution path (FN-7790)
The plugin's GrokRuntimeAdapter streams a real Grok response through xAI's CLI:
grok -p "<text>" --output-format streaming-json
# with optional model/cwd:
grok -p "<text>" --output-format streaming-json -m "grok-4.5" --cwd "/path/to/project"
-p, --single <PROMPT>runs a single prompt and exits; it does not require interactive stdin.--output-format streaming-jsonemits NDJSON with event typesthought,text, andend.thought.datadrivesonThinking;text.datadrivesonTextand persisted assistant content;end.sessionIdis stored when present. The subprocesscloseevent remains the authoritative resolution point so stderr/exit diagnostics are preserved.- A wrong-binary/wrong-flag run that emits no parsed NDJSON surfaces a concrete diagnostic instead of a blank assistant response. A real
endevent with empty accumulated text remains a legitimate silent response. - Auth implication: because the
grokbinary resolves its own credentials for this path, a CLI-routed selection needs no Fusion-visibleGROK_API_KEY— unlike the direct xAI OpenAI-compatible streaming path.
See docs/grok-cli-contract.md for the full contract, live captures, and the reason Fusion no longer uses the old grok --prompt <text> --format json / step_* schema.
Routing Grok through the CLI runtime (FN-7725 / FN-7753 / FN-7790)
By default, selecting a grok-cli/* model for an agent/task routes through
the direct xAI OpenAI-compatible endpoint (https://api.x.ai/v1,
FN-7711/FN-7714) whenever Fusion can see a GROK_API_KEY (environment or
~/.grok/user-settings.json apiKey). If no Fusion-visible key resolves and
the Grok Runtime plugin is registered, Fusion automatically routes that session
through the grok CLI runtime instead, letting the CLI own auth end-to-end.
To route a specific agent's execution through the grok CLI runtime explicitly:
- Open the agent in the dashboard (New Agent or an existing agent's detail view).
- Under Runtime Source, choose Runtime instead of Built-in Model.
- Select Grok Runtime from the runtime dropdown (sourced from
GET /api/plugins/runtimes). - Save. The agent's
runtimeConfig.runtimeHintis now"grok"; every session that agent drives resolves through this plugin'sGrokRuntimeAdapterinstead of the default pi runtime.
Automatic fallback precedence (FN-7753): explicit runtime hint > Fusion-visible key/direct endpoint > automatic CLI fallback. The fallback is only derived when no explicit runtime hint is set, the provider is grok-cli, no Fusion-visible key resolves, and runtime id "grok" is registered. The selected model is normalized from grok-cli/<id> (or grok/<id>) to <id> and sent as -m <id>.
Known limitation: explicit Runtime-mode is still model-agnostic — it does not carry a specific grok-cli/* model id through to the adapter, so GrokRuntimeAdapter.createSession() falls back to "grok/default" and omits -m. Built-in Model selections preserve the model either through the direct endpoint (when a key is visible) or through the FN-7753 automatic CLI fallback (when no key is visible).
Enable via Settings → Authentication
- Install the
grokCLI and authenticate it by any method it supports — Fusion does not need to see the key. - Open Settings → Authentication in the Fusion dashboard.
- The "Grok — via Grok CLI" card shows probe status. Click Enable once the binary is available; a non-blocking hint appears only if Fusion did not detect a key, noting the direct xAI streaming path uses
GROK_API_KEYwhen present. - Discovered Grok models (via
grok models) then merge into the model picker under thegrok-cliprovider id.
Notes
Do not invent a grok status/whoami JSON auth contract — readiness is derived from binary availability, mirroring the Cursor CLI provider. See AGENTS.md's "External-integration evidence" policy for why the release/checksum fields above stay at upstream-pending-verification.