Switches the Grok runtime plugin to execute prompts via the Grok CLI, parsing its NDJSON stream output instead of the previous invocation path. - Add cli-stream.ts to spawn and stream the Grok CLI process - Add stream-parser.ts to parse NDJSON CLI output into runtime events - Rework runtime-adapter.ts to route execution through CLI streaming - Extend types.ts with CLI stream/NDJSON event types - Add docs/grok-cli-contract.md documenting the CLI streaming contract - Add/update tests for stream-parser and runtime-adapter - Update plugin README with CLI streaming details - Add changeset for the Grok CLI streaming change Files changed: .changeset/fn-7722-grok-cli-streaming.md | 7 + docs/grok-cli-contract.md | 200 +++++++++++++++++++++ plugins/fusion-plugin-grok-runtime/README.md | 28 +++ .../src/__tests__/runtime-adapter.test.ts | 135 ++++++++++++-- .../src/__tests__/stream-parser.test.ts | 79 ++++++++ .../fusion-plugin-grok-runtime/src/cli-stream.ts | 52 ++++++ .../src/runtime-adapter.ts | 182 ++++++++++++++++--- .../src/stream-parser.ts | 54 ++++++ plugins/fusion-plugin-grok-runtime/src/types.ts | 120 +++++++++++++ 9 files changed, 816 insertions(+), 41 deletions(-) Fusion-Task-Id: FN-7722 Fusion-Task-Lineage: c5f33e9d-0032-432b-88b5-4ad8d786d67e 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 repo: https://github.com/superagent-ai/grok-cli
- Docs / homepage: https://github.com/superagent-ai/grok-cli#readme
- Install script: https://raw.githubusercontent.com/superagent-ai/grok-cli/main/install.sh
- npm alternative:
bun add -g grok-dev(see https://github.com/superagent-ai/grok-cli/releases) - Binary name:
grok - This is a community-built project, not affiliated with xAI. No fixed
release artifact is bundled by Fusion, so no checksum is pinned
(
upstream-pending-verification).
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). Grok has nostatus/whoamisubcommand, so Fusion probes binary availability only and treats a working binary as "ready" (authenticated: true). The CLI itself resolves credentials from more sources than Fusion can see (GROK_API_KEYenv var, a project.env,grok -k <key>,GROK_BASE_URL, sandbox secrets, etc.). Fusion additionally probes two of those locations — 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, and a missing/unreadable/malformed settings file degrades gracefully (never throws). 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 output, with pricing hints per the upstream README). The exact line shape isupstream-pending-verification, so discovery parses conservatively: the leading token before a-label separator, or before the first multi-space pricing column, is treated as the model id; ids are deduplicated. Output that happens to be JSON is tolerated defensively even though the CLI is not known to emit it.
CLI streaming execution path (FN-7722)
In addition to model discovery/probe, this plugin's GrokRuntimeAdapter can
stream a real Grok response through the CLI itself:
grok --prompt "<text>" --format json
--format jsonemits newline-delimited JSON (NDJSON) — one JSON object per line — with event typesstep_start,text,tool_use,step_finish, anderror(verified against upstream source, not just docs prose; seedocs/grok-cli-contract.md).- The adapter parses that stream (
src/stream-parser.ts) and drivesonTextastextevents arrive. There is nothinking/reasoningevent in the verified schema, soonThinkingis never invoked for this path. - Auth implication: because the
grokbinary resolves its own credentials for this path (env var, project.env,grok -k, or~/.grok/user-settings.json), a CLI-routed selection needs no Fusion-visibleGROK_API_KEY— unlike the direct xAI OpenAI-compatible streaming path (https://api.x.ai/v1), which still requires one. - This adapter is only reached when an agent's
runtimeConfig.runtimeHint === "grok". Nothing in the product sets that today — routing Grok execution through the CLI end-to-end (vs. the direct xAI endpoint, which remains the default) is tracked as a follow-up. Seedocs/grok-cli-contract.mdfor the full contract and decision record.
Enable via Settings → Authentication
- Install the
grokCLI and authenticate it by any method it supports (env var, project.env,grok -k, etc.) — 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.