@ken-jo/agent-connector 0.5.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/dist/{action-LEYTHNIU.js → action-EKK6FMPY.js} +8 -8
- package/dist/{audit-HPKCUCES.js → audit-H7PQWIVH.js} +5 -5
- package/dist/{chunk-BXPSDNIB.js → chunk-34RRWEWU.js} +2 -2
- package/dist/{chunk-SFY6YLVK.js → chunk-4YOYR3T5.js} +5 -6
- package/dist/{chunk-SFY6YLVK.js.map → chunk-4YOYR3T5.js.map} +1 -1
- package/dist/{chunk-6WN37NVN.js → chunk-6FRAVOVF.js} +2 -2
- package/dist/{chunk-2Y2MZRLP.js → chunk-CWUPIT72.js} +2 -2
- package/dist/{chunk-6XMV2OOA.js → chunk-CZOXXS77.js} +3 -3
- package/dist/{chunk-IRUYJD23.js → chunk-IVJUPNLD.js} +2 -8
- package/dist/chunk-IVJUPNLD.js.map +1 -0
- package/dist/{chunk-FKW5A6HE.js → chunk-IY3SSCNK.js} +4 -4
- package/dist/{chunk-U2XJWG7N.js → chunk-JUBEM3OR.js} +2 -2
- package/dist/{chunk-UM5S7DKK.js → chunk-KOFCNA5T.js} +11 -2
- package/dist/{chunk-UM5S7DKK.js.map → chunk-KOFCNA5T.js.map} +1 -1
- package/dist/{chunk-4KIXXJ7B.js → chunk-KY2VQGD7.js} +2 -2
- package/dist/{chunk-M6OS4OLU.js → chunk-R4FABNAL.js} +2 -2
- package/dist/{chunk-T5AI3AW3.js → chunk-SA6CSOH5.js} +19 -19
- package/dist/{chunk-G5HAIYRM.js → chunk-XJSVJD5T.js} +37 -29
- package/dist/chunk-XJSVJD5T.js.map +1 -0
- package/dist/{chunk-WZMSSIDN.js → chunk-XSR3GF55.js} +14 -6
- package/dist/chunk-XSR3GF55.js.map +1 -0
- package/dist/{claude-code-LJ6DVXWQ.js → claude-code-VEERATN5.js} +4 -4
- package/dist/cli/sdk.js +4 -4
- package/dist/cli.js +1 -1
- package/dist/{cline-JAPJNOZQ.js → cline-UW6WCQRK.js} +2 -2
- package/dist/cline-UW6WCQRK.js.map +1 -0
- package/dist/{codebuff-3VODFPD4.js → codebuff-R7QBLCSJ.js} +11 -11
- package/dist/codebuff-R7QBLCSJ.js.map +1 -0
- package/dist/{codex-RXIS5BHM.js → codex-S2RADR5K.js} +2 -2
- package/dist/{crush-YB3SK6NK.js → crush-AJNQRFVE.js} +2 -2
- package/dist/{define-connector-odRHEC4H.d.ts → define-connector-iosc34CA.d.ts} +1 -1
- package/dist/{detect-USP5JMWM.js → detect-ZC344YOJ.js} +4 -4
- package/dist/{doctor-VSW5KHBM.js → doctor-ABYQF2YX.js} +13 -13
- package/dist/{goose-3X7ID7YW.js → goose-SXFRT7UF.js} +2 -2
- package/dist/grok-build-EP2ZUFXZ.js +682 -0
- package/dist/grok-build-EP2ZUFXZ.js.map +1 -0
- package/dist/{grok-cli-4VFVF2CQ.js → grok-cli-UUNPOUYY.js} +4 -3
- package/dist/grok-cli-UUNPOUYY.js.map +1 -0
- package/dist/{hook-QRW3ON6C.js → hook-M3KQSEO3.js} +8 -8
- package/dist/index.d.ts +3 -3
- package/dist/index.js +2 -2
- package/dist/{install-ASTAUZKB.js → install-4X4JDKGY.js} +10 -10
- package/dist/{introspect-gTx6GzpW.d.ts → introspect-z3eKVWHN.d.ts} +1 -1
- package/dist/{kilo-SW7BH6EG.js → kilo-FVBFSS4Y.js} +1 -1
- package/dist/kilo-FVBFSS4Y.js.map +1 -0
- package/dist/{kilo-T4OXNUYY.js → kilo-N5T6KXAG.js} +2 -2
- package/dist/{kilo-cli-I2S3W245.js → kilo-cli-JOAEWYI4.js} +2 -2
- package/dist/{leaderboard-3XSVSGAJ.js → leaderboard-Q4YZ3LI7.js} +3 -3
- package/dist/{mux-BO2L5CTW.js → mux-WSZWWZOX.js} +27 -21
- package/dist/mux-WSZWWZOX.js.map +1 -0
- package/dist/{package-VWBPHCLA.js → package-FY2QZWRM.js} +6 -6
- package/dist/runtime/index.d.ts +1 -1
- package/dist/runtime/index.js +6 -6
- package/dist/sdk/index.d.ts +4 -4
- package/dist/sdk/index.js +3 -3
- package/dist/sdk/test.d.ts +2 -2
- package/dist/sdk/test.js +6 -6
- package/dist/{serve-IQGHE4SJ.js → serve-XT76DWUN.js} +8 -8
- package/dist/{status-BVLY6XDL.js → status-DHVWBRLI.js} +8 -8
- package/dist/{statusline-PRODZV2J.js → statusline-SY5UBQOJ.js} +7 -7
- package/dist/{telemetry-UU4SHJ23.js → telemetry-TJIFAKWX.js} +5 -5
- package/dist/{types-DWXnnx-N.d.ts → types-CAKApZpX.d.ts} +4 -4
- package/dist/{uninstall-WI5YLDCT.js → uninstall-VQO36IQ4.js} +10 -10
- package/dist/{upgrade-L45BTG6X.js → upgrade-QEYZOA7S.js} +10 -10
- package/dist/{usage-K3NQTAJP.js → usage-LV7UGO64.js} +3 -3
- package/dist/{usage-event-J5CQ6LNT.js → usage-event-MQMKMK2R.js} +7 -7
- package/dist/{windsurf-R6D2JUTN.js → windsurf-ZWVFNJ73.js} +1 -1
- package/dist/windsurf-ZWVFNJ73.js.map +1 -0
- package/dist/{zed-DQV3ZUCU.js → zed-JCOKXOLA.js} +2 -2
- package/package.json +1 -1
- package/dist/chunk-G5HAIYRM.js.map +0 -1
- package/dist/chunk-IRUYJD23.js.map +0 -1
- package/dist/chunk-WZMSSIDN.js.map +0 -1
- package/dist/cline-JAPJNOZQ.js.map +0 -1
- package/dist/codebuff-3VODFPD4.js.map +0 -1
- package/dist/grok-cli-4VFVF2CQ.js.map +0 -1
- package/dist/kilo-SW7BH6EG.js.map +0 -1
- package/dist/mux-BO2L5CTW.js.map +0 -1
- package/dist/roo-code-SUWI4BBN.js +0 -229
- package/dist/roo-code-SUWI4BBN.js.map +0 -1
- package/dist/roo-code-VI2ZKTZC.js +0 -361
- package/dist/roo-code-VI2ZKTZC.js.map +0 -1
- package/dist/windsurf-R6D2JUTN.js.map +0 -1
- /package/dist/{action-LEYTHNIU.js.map → action-EKK6FMPY.js.map} +0 -0
- /package/dist/{audit-HPKCUCES.js.map → audit-H7PQWIVH.js.map} +0 -0
- /package/dist/{chunk-BXPSDNIB.js.map → chunk-34RRWEWU.js.map} +0 -0
- /package/dist/{chunk-6WN37NVN.js.map → chunk-6FRAVOVF.js.map} +0 -0
- /package/dist/{chunk-2Y2MZRLP.js.map → chunk-CWUPIT72.js.map} +0 -0
- /package/dist/{chunk-6XMV2OOA.js.map → chunk-CZOXXS77.js.map} +0 -0
- /package/dist/{chunk-FKW5A6HE.js.map → chunk-IY3SSCNK.js.map} +0 -0
- /package/dist/{chunk-U2XJWG7N.js.map → chunk-JUBEM3OR.js.map} +0 -0
- /package/dist/{chunk-4KIXXJ7B.js.map → chunk-KY2VQGD7.js.map} +0 -0
- /package/dist/{chunk-M6OS4OLU.js.map → chunk-R4FABNAL.js.map} +0 -0
- /package/dist/{chunk-T5AI3AW3.js.map → chunk-SA6CSOH5.js.map} +0 -0
- /package/dist/{claude-code-LJ6DVXWQ.js.map → claude-code-VEERATN5.js.map} +0 -0
- /package/dist/{codex-RXIS5BHM.js.map → codex-S2RADR5K.js.map} +0 -0
- /package/dist/{crush-YB3SK6NK.js.map → crush-AJNQRFVE.js.map} +0 -0
- /package/dist/{detect-USP5JMWM.js.map → detect-ZC344YOJ.js.map} +0 -0
- /package/dist/{doctor-VSW5KHBM.js.map → doctor-ABYQF2YX.js.map} +0 -0
- /package/dist/{goose-3X7ID7YW.js.map → goose-SXFRT7UF.js.map} +0 -0
- /package/dist/{hook-QRW3ON6C.js.map → hook-M3KQSEO3.js.map} +0 -0
- /package/dist/{install-ASTAUZKB.js.map → install-4X4JDKGY.js.map} +0 -0
- /package/dist/{kilo-T4OXNUYY.js.map → kilo-N5T6KXAG.js.map} +0 -0
- /package/dist/{kilo-cli-I2S3W245.js.map → kilo-cli-JOAEWYI4.js.map} +0 -0
- /package/dist/{leaderboard-3XSVSGAJ.js.map → leaderboard-Q4YZ3LI7.js.map} +0 -0
- /package/dist/{package-VWBPHCLA.js.map → package-FY2QZWRM.js.map} +0 -0
- /package/dist/{serve-IQGHE4SJ.js.map → serve-XT76DWUN.js.map} +0 -0
- /package/dist/{status-BVLY6XDL.js.map → status-DHVWBRLI.js.map} +0 -0
- /package/dist/{statusline-PRODZV2J.js.map → statusline-SY5UBQOJ.js.map} +0 -0
- /package/dist/{telemetry-UU4SHJ23.js.map → telemetry-TJIFAKWX.js.map} +0 -0
- /package/dist/{uninstall-WI5YLDCT.js.map → uninstall-VQO36IQ4.js.map} +0 -0
- /package/dist/{upgrade-L45BTG6X.js.map → upgrade-QEYZOA7S.js.map} +0 -0
- /package/dist/{usage-K3NQTAJP.js.map → usage-LV7UGO64.js.map} +0 -0
- /package/dist/{usage-event-J5CQ6LNT.js.map → usage-event-MQMKMK2R.js.map} +0 -0
- /package/dist/{zed-DQV3ZUCU.js.map → zed-JCOKXOLA.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/adapters/grok-build/index.ts"],"sourcesContent":["/**\n * adapters/grok-build — Grok Build (xAI's official coding agent CLI) adapter.\n *\n * Grok Build is xai-org/grok-build (Apache-2.0): a Rust agent harness + TUI,\n * binary artifact `xai-grok-pager`, shipped by official installs as `grok`.\n * DISAMBIGUATION: this is NOT the community `superagent-ai/grok-cli` behind our\n * adapter id `grok-cli` — different vendor, different product, different config\n * file. The two happen to share the DEFAULT directory `~/.grok` but never a\n * file (see the detection note below), which is why both adapters key detection\n * on their own exclusive marker.\n *\n * Every fact below is byte-confirmed against the upstream repo (primary source),\n * not inferred:\n * - user guide crates/codegen/xai-grok-pager/docs/user-guide/*.md\n * - hook schema crates/codegen/xai-grok-hooks/src/event.rs\n *\n * Paradigm: \"json-stdio\" — the host pipes a JSON event to a command on stdin and\n * reads JSON / an exit code back.\n *\n * NATIVE CONFIG SURFACES\n * 1. MCP — `$GROK_HOME/config.toml` (default `~/.grok/config.toml`), TOML,\n * under `[mcp_servers.<name>]`. stdio keys { command, args, env, enabled,\n * startup_timeout_sec, tool_timeout_sec }; remote keys { url, headers }.\n * Project scope is `<projectDir>/.grok/config.toml`, which contributes\n * EXACTLY `[mcp_servers]`, `[plugins]`, `[permission]` and\n * `[mcp] max_output_bytes` — every other table is read from the user file\n * only (07-mcp-servers.md, 26-config-reference.md:22,32).\n * TOML has no interpolation → env-refs resolve to literals at install time.\n * 2. Hooks — `$GROK_HOME/hooks/*.json` (user, \"Always\" trusted) and\n * `<project>/.grok/hooks/*.json` (requires folder trust). The file body is\n * the Claude-compatible object: { hooks: { <Event>: [ { matcher?, hooks:\n * [ { type:\"command\", command, timeout? } ] } ] } } (10-hooks.md §Hook\n * Locations + §The Hook JSON Format). We write our OWN file rather than\n * merging into the user's config.toml `[[hooks.<Event>]]` block: the hooks\n * directory is purpose-built for exactly this, and an isolated file keeps\n * install/uninstall from ever rewriting hand-authored config.\n * 3. Skills — `<scope>/.grok/skills/<name>/SKILL.md`, Anthropic-format YAML\n * frontmatter (`name`, `description` + optional model/allowed-tools/...).\n * 4. Commands — `<scope>/.grok/commands/<name>.md`, FLAT markdown files whose\n * filename stem is the slash-command name (\"matching Claude Code's legacy\n * custom-command layout\", 08-skills.md).\n * 5. Subagents — `<scope>/.grok/agents/<name>.md`, md + YAML frontmatter\n * (name, description, tools, model — 16-subagents.md).\n * 6. Memory — AGENTS.md. 12-project-rules.md is titled \"Project Rules\n * (AGENTS.md)\": Grok loads AGENTS.md from the repo root down to the cwd,\n * deeper files winning. User scope uses `$GROK_HOME/rules/*.md` (\"Always\n * scanned; applies to all projects\").\n *\n * DETECTION / THE ~/.grok COLLISION\n * `grok-cli` (community) stores everything in `~/.grok/user-settings.json`;\n * Grok Build stores everything under `$GROK_HOME` with `config.toml` as its\n * user config. Detecting either on the bare DIRECTORY would misreport the other\n * as installed, so each adapter claims the dir only when the sibling's\n * exclusive marker is absent (the same bow-out hardening the openclaw/nemoclaw\n * pair uses). Marker files: Grok Build `config.toml`, Grok CLI\n * `user-settings.json`.\n *\n * HOOK EVENTS (crates/codegen/xai-grok-hooks/src/event.rs, HookEventName)\n * Grok fires PascalCase names 1:1 with ours for twelve of the thirteen canonical\n * events: SessionStart, SessionEnd, UserPromptSubmit, PreToolUse, PostToolUse,\n * PostToolUseFailure, Stop, Notification, SubagentStart, SubagentStop,\n * PreCompact, PostCompact. It ALSO fires StopFailure / StopCancelled /\n * PermissionDenied, which have no canonical analog and ride the nativeHooks\n * escape hatch.\n *\n * PermissionRequest has NO Grok analog and the capability flag stays UNSET.\n * Grok's nearest event, `PermissionDenied`, fires AFTER the permission system\n * has already denied a call and is documented \"Blocking? No\" — it is an\n * observation of a completed denial, not the decision-capable pre-dialog gate\n * our PermissionRequest contract requires. A declared PermissionRequest hook\n * therefore warn-skips at install rather than being silently mis-registered.\n *\n * WIRE SHAPE (event.rs HookEventEnvelope, `#[serde(rename_all = \"camelCase\")]`)\n * Common fields: hookEventName, sessionId, cwd, workspaceRoot, timestamp,\n * transcriptPath?, clientIdentifier?, promptId?, permissionMode?, plus the\n * flattened per-event payload. `to_hook_json` then adds ADDITIVE snake_case\n * aliases (sessionId→session_id, toolName→tool_name, toolInput→tool_input,\n * toolResult→tool_response, toolUseId→tool_use_id, durationMs→duration_ms,\n * isInterrupt→is_interrupt) and overwrites `hook_event_name` with the PascalCase\n * name. Both spellings are present on the wire; parseEvent reads the camelCase\n * key first (authoritative) and falls back to the snake alias.\n *\n * Two payload fields are FALSE FRIENDS and are the reason this adapter is\n * source-verified rather than docs-verified:\n * - PostToolUse carries `toolResult` (NOT `tool_response`/`toolOutput`).\n * - PreCompact / PostCompact carry **`source`**, NOT `trigger` — the prose\n * calls it \"the compaction trigger\" but the struct field is `source`.\n * PostToolUse has NO is_error field at all: a tool that fails to dispatch, or an\n * MCP error result, fires PostToolUseFailure instead, so isError is reported\n * false for every PostToolUse (never invented).\n *\n * REPLY PROTOCOL (10-hooks.md §Output (Blocking Hooks), §PostToolUse Output,\n * §Stop Decision Control, §Passive Hooks)\n * - PreToolUse: `hookSpecificOutput.permissionDecision` is the CANONICAL\n * decision key (allow|deny|ask|defer) with `permissionDecisionReason`;\n * `updatedInput` rewrites the call and, unlike Codex, needs NO paired allow\n * (\"Omitting `decision` while returning `updatedInput` allows the call and\n * applies the rewrite\"). `additionalContext` is honored. `ask` is native.\n * - PostToolUse: `{decision:\"block\",reason}` feeds the model, and\n * `hookSpecificOutput.updatedToolOutput` REPLACES the model's copy of the\n * result (\"Universal key; works for every tool\") → canModifyOutput = true.\n * - Stop / SubagentStop: `{decision:\"block\",reason}` keeps the agent working;\n * `hookSpecificOutput.additionalContext` is non-error feedback.\n * - UserPromptSubmit: `{decision:\"block\",reason}` blocks the prompt. Context\n * injection is NOT available — \"stdout of an allowing hook is discarded (no\n * `additionalContext`)\".\n * - SessionStart / Notification / PreCompact / PostCompact / SubagentStart:\n * \"stdout is ignored. Just exit 0.\" → canInjectSessionContext = false, and\n * these format to a bare exit-0 passthrough.\n */\n\nimport { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\n\nimport TOML from \"@iarna/toml\";\n\nimport type {\n ChangeRecord,\n DetectedPlatform,\n HealthCheck,\n HookEventName,\n HookParadigm,\n HookResponse,\n PlatformCapabilities,\n PlatformId,\n ServerDef,\n SubagentDef,\n} from \"../../core/types.js\";\nimport { ensureDir } from \"../../core/paths.js\";\nimport { grokBuildConfigHome } from \"../../core/host-paths.js\";\nimport { resolveEnvRefsDeep } from \"../../core/interpolate.js\";\nimport {\n removeFromObjectMap,\n upsertInObjectMap,\n type ObjectMapCodec,\n} from \"../../core/object-map.js\";\nimport {\n buildHomeBinHookCommand,\n buildWrappedStdio,\n} from \"../../core/spawn.js\";\nimport {\n renderCommandMd,\n renderSkillMd,\n renderSubagentMd,\n} from \"../claude-code/render.js\";\nimport { normalizeSessionSource } from \"../claude-code/wire.js\";\nimport { BaseAdapter, type HookMergeDescriptor } from \"../base.js\";\nimport type {\n HookReply,\n InstallContext,\n MemoryTarget,\n NormalizedEvent,\n} from \"../spi.js\";\n\n// ─────────────────────────────────────────────────────────────────────────\n// Native shapes\n// ─────────────────────────────────────────────────────────────────────────\n\n/**\n * Raw Grok Build hook payload. camelCase is authoritative (the serde envelope);\n * the snake_case twins are the ADDITIVE aliases `to_hook_json` injects, so both\n * are present on the wire and every read prefers the camel key.\n */\ninterface GrokBuildHookInput {\n // Envelope (camelCase authoritative, snake alias where one exists).\n sessionId?: string;\n session_id?: string;\n cwd?: string;\n workspaceRoot?: string;\n // Tool events.\n toolName?: string;\n tool_name?: string;\n toolInput?: Record<string, unknown>;\n tool_input?: Record<string, unknown>;\n toolUseId?: string;\n tool_use_id?: string;\n /** PostToolUse ONLY. Named `toolResult` upstream (aliased to `tool_response`). */\n toolResult?: unknown;\n tool_response?: unknown;\n durationMs?: number;\n duration_ms?: number;\n isInterrupt?: boolean;\n is_interrupt?: boolean;\n /** PostToolUseFailure ONLY — the captured failure message. */\n error?: string;\n // SessionStart (source) / SessionEnd + Stop (reason).\n source?: string;\n reason?: string;\n // UserPromptSubmit.\n prompt?: string;\n // Stop / SubagentStop.\n stopHookActive?: boolean;\n lastAssistantMessage?: string;\n // Notification.\n notificationType?: string;\n message?: string;\n // SubagentStart / SubagentStop.\n subagentId?: string;\n subagentType?: string;\n}\n\n/** One hook entry inside a hooks/*.json file (Claude-compatible shape). */\ninterface GrokBuildHookEntry {\n matcher?: string;\n hooks: Array<{ type: \"command\"; command: string }>;\n}\n\n/** Rendered `[mcp_servers.<id>]` table (TOML — no native interpolation). */\ninterface GrokBuildMcpEntry {\n // stdio transport\n command?: string;\n args?: string[];\n env?: Record<string, string>;\n // remote transports: Grok infers HTTP/SSE from `url` (no transport key in the\n // TOML — `grok mcp add --transport http|sse` writes `url` either way).\n url?: string;\n headers?: Record<string, string>;\n /** Written only when the connector explicitly disables the server. */\n enabled?: boolean;\n}\n\n/**\n * The canonical events Grok Build fires natively, in the order they are written\n * into our hooks file. Every name is PascalCase and 1:1 with ours (verified in\n * event.rs `HookEventName`).\n */\nconst GROK_BUILD_HOOK_EVENTS = [\n \"SessionStart\",\n \"SessionEnd\",\n \"UserPromptSubmit\",\n \"PreToolUse\",\n \"PostToolUse\",\n \"PostToolUseFailure\",\n \"Stop\",\n \"Notification\",\n \"SubagentStart\",\n \"SubagentStop\",\n \"PreCompact\",\n \"PostCompact\",\n] as const;\n\ntype GrokBuildHookEventName = (typeof GROK_BUILD_HOOK_EVENTS)[number];\n\n/**\n * PreToolUse matcher — Grok's OWN tool names plus the Claude aliases Grok maps\n * onto them (\"A matcher keeps its original name too\", 10-hooks.md §Tool Name\n * Aliases: Bash→run_terminal_command, Read→read_file, Edit/Write/MultiEdit→\n * search_replace, Task→spawn_subagent). Charset-clean ([A-Za-z0-9_|] only) so\n * the host's Rust `regex` matcher needs no look-around.\n *\n * MCP tool calls are deliberately NOT matched: Grok surfaces them through the\n * internal `use_tool` dispatcher under the qualified `server__tool` name (e.g.\n * `linear__save_issue`) with NO stable `mcp__` prefix to catch, so there is no\n * charset-clean literal that matches \"any MCP tool\" without also matching\n * unrelated built-ins.\n */\nconst PRE_TOOL_USE_MATCHER =\n \"run_terminal_command|Bash|search_replace|Edit|Write|MultiEdit|apply_patch|spawn_subagent|Task\";\n\n/**\n * The single canonical event Grok Build cannot fire. Grok's `PermissionDenied`\n * is a passive post-denial observation, not our decision-capable pre-dialog\n * gate, so a declared PermissionRequest hook warn-skips (exit-1) at install —\n * the established convention for a newer event with no host analog.\n */\nconst WARN_SKIP_EVENTS: ReadonlySet<HookEventName> = new Set([\"PermissionRequest\"]);\n\n/** The hooks file this adapter owns inside the host's hooks/ directory. */\nconst HOOKS_FILENAME = \"agent-connector.json\";\n\n/**\n * Coerce Grok's PostToolUse `toolResult` (serde_json::Value — a tagged object\n * such as `{\"type\":\"Bash\",…}` for built-ins, anything at all for MCP tools) to\n * the string-typed normalized `toolOutput`. Strings pass through verbatim;\n * everything else is JSON-stringified; null/undefined leaves it unset.\n */\nfunction coerceToolResult(value: unknown): string | undefined {\n if (value === undefined || value === null) return undefined;\n if (typeof value === \"string\") return value;\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────\n// Adapter\n// ─────────────────────────────────────────────────────────────────────────\n\nexport class GrokBuildAdapter extends BaseAdapter {\n readonly id: PlatformId = \"grok-build\";\n readonly name = \"Grok Build\";\n readonly paradigm: HookParadigm = \"json-stdio\";\n\n readonly capabilities: PlatformCapabilities = {\n preToolUse: true,\n postToolUse: true,\n preCompact: true,\n sessionStart: true,\n sessionEnd: true,\n userPromptSubmit: true,\n stop: true,\n notification: true,\n // PostToolUseFailure is a first-class Grok event (a dispatch failure or an\n // MCP error result fires it INSTEAD of PostToolUse); SubagentStart/Stop and\n // PostCompact are all native. permissionRequest stays UNSET — see the header.\n postToolUseFailure: true,\n subagentStart: true,\n subagentStop: true,\n postCompact: true,\n // PreToolUse `updatedInput` rewrites the call before it runs, and every\n // downstream consumer (plan-mode gate, permission prompt, the tool, the later\n // PostToolUse payload) sees the rewritten input.\n canModifyArgs: true,\n // PostToolUse `updatedToolOutput` replaces the model's copy of the result —\n // \"Universal key; works for every tool\".\n canModifyOutput: true,\n // FALSE: Grok ignores stdout on SessionStart (\"For events like SessionStart\n // or Notification, stdout is ignored. Just exit 0.\") and on an allowing\n // UserPromptSubmit (\"stdout of an allowing hook is discarded (no\n // additionalContext)\"). Context injection exists only on the tool events,\n // which this flag does not describe.\n canInjectSessionContext: false,\n // `grok mcp add` documents stdio (default), --transport http and\n // --transport sse; the TOML carries `url` for both remote forms.\n transports: [\"stdio\", \"http\", \"sse\"],\n // Content surfaces, all under <scope>/.grok:\n // command → commands/<name>.md (flat md, stem = slash name)\n // skill → skills/<name>/SKILL.md (Anthropic frontmatter)\n // subagent → agents/<name>.md (name/description/tools/model)\n supportsCommands: true,\n supportsSkills: true,\n supportsSubagents: true,\n // Memory: AGENTS.md (project) / $GROK_HOME/rules (user).\n supportsMemory: true,\n };\n\n // ── Detection ──────────────────────────────────────────────────────────\n\n /**\n * Grok Build is installed when its OWN marker file exists, or when a config\n * dir exists that is not merely the community Grok CLI's `~/.grok`. The\n * sibling bow-out is what keeps the two products' shared default directory\n * from cross-reporting (see the header).\n */\n detectInstalled(projectDir: string): DetectedPlatform {\n const userDir = this.userConfigDir();\n const projDir = join(projectDir, \".grok\");\n const userCfg = join(userDir, \"config.toml\");\n const projCfg = join(projDir, \"config.toml\");\n\n // The community grok-cli's exclusive marker; never written by Grok Build.\n const siblingOnly =\n existsSync(join(userDir, \"user-settings.json\")) && !existsSync(userCfg);\n\n const userInstalled = existsSync(userCfg) || (existsSync(userDir) && !siblingOnly);\n const projInstalled = existsSync(projCfg) || existsSync(projDir);\n const installed = userInstalled || projInstalled;\n const scope = projInstalled && !userInstalled ? \"project\" : \"user\";\n const configPath = scope === \"project\" ? projCfg : userCfg;\n\n return {\n id: this.id,\n name: this.name,\n installed,\n paradigm: this.paradigm,\n capabilities: this.capabilities,\n configPath,\n scope,\n reason: installed\n ? `found Grok Build config dir (${scope})`\n : siblingOnly\n ? `${userDir} holds only the community Grok CLI's user-settings.json`\n : `no .grok config dir at ${userDir} or ${projDir}`,\n confidence: installed ? \"high\" : \"low\",\n };\n }\n\n // ── Native paths ───────────────────────────────────────────────────────\n\n override getConfigDir(ctx: InstallContext): string {\n if (ctx.scope === \"project\") return join(ctx.projectDir, \".grok\");\n return this.userConfigDir();\n }\n\n override getServerConfigPath(ctx: InstallContext): string {\n return join(this.getConfigDir(ctx), \"config.toml\");\n }\n\n /**\n * Hooks live in their OWN directory, one JSON file per author —\n * `$GROK_HOME/hooks/*.json` (user) or `<project>/.grok/hooks/*.json`. We own\n * exactly one file there, so an install never rewrites a hand-authored config.\n */\n override getHookConfigPath(ctx: InstallContext): string {\n return join(this.getConfigDir(ctx), \"hooks\", HOOKS_FILENAME);\n }\n\n /** `$GROK_HOME` (tilde-expanded, then resolved) || `~/.grok`. */\n private userConfigDir(): string {\n return grokBuildConfigHome();\n }\n\n // ── Memory surface: AGENTS.md (project) / $GROK_HOME/rules (user) ────────\n // 12-project-rules.md is titled \"Project Rules (AGENTS.md)\" and documents\n // AGENTS.md discovery from the repo root down to the cwd. The USER tier has no\n // AGENTS.md equivalent: home-level guidance is `*.md` under\n // `$GROK_HOME/rules/` (\"Always scanned; applies to all projects\").\n protected override memoryTargets(ctx: InstallContext): MemoryTarget[] {\n if (this.memoryOverride(ctx)?.path) return super.memoryTargets(ctx);\n if (ctx.scope === \"project\") {\n return [\n {\n path: join(ctx.projectDir, \"AGENTS.md\"),\n reason: \"AGENTS.md standard (project root; Grok Build loads it root → cwd)\",\n },\n ];\n }\n if (ctx.scope === \"user\") {\n return [\n {\n path: join(this.userConfigDir(), \"rules\", \"agent-connector.md\"),\n reason: \"$GROK_HOME/rules/*.md global rules (always scanned, all projects)\",\n },\n ];\n }\n return [];\n }\n\n // ── TOML config IO (config.toml is TOML, not JSON) ───────────────────────\n\n private readToml(path: string): Record<string, unknown> {\n if (!existsSync(path)) return {};\n try {\n return TOML.parse(readFileSync(path, \"utf8\")) as Record<string, unknown>;\n } catch {\n return {};\n }\n }\n\n private writeToml(path: string, data: Record<string, unknown>, dryRun: boolean): void {\n if (dryRun) return;\n ensureDir(dirname(path));\n // @iarna/toml's stringify type wants its JsonMap; our object is structurally compatible.\n writeFileSync(path, TOML.stringify(data as never), \"utf8\");\n }\n\n /** ObjectMapCodec over config.toml, mirroring codex: readToml fail-softs to\n * {} so a corrupt file coerces rather than warn-skipping. */\n private tomlObjectMapCodec(): ObjectMapCodec {\n return {\n parse: (path) => this.readToml(path),\n serialize: (path, data, dryRun) => this.writeToml(path, data, dryRun),\n isPresentButUnparseable: () => false,\n };\n }\n\n // ── Install server (config.toml → [mcp_servers.<id>]) ────────────────────\n\n override installServer(ctx: InstallContext): ChangeRecord[] {\n const { connector, dryRun } = ctx;\n const server = this.effectiveServer(ctx);\n const path = this.getServerConfigPath(ctx);\n\n if (!server) {\n return [{ platform: this.id, action: \"skip\", path, detail: \"no server declared\" }];\n }\n const isStdio = server.transport === \"stdio\" && !!server.command;\n const isRemote = (server.transport === \"http\" || server.transport === \"sse\") && !!server.url;\n if (!isStdio && !isRemote) {\n return [\n {\n platform: this.id,\n action: \"skip\",\n path,\n detail: `transport \"${server.transport}\" not registrable in config.toml (stdio + http/sse url only)`,\n },\n ];\n }\n\n const symlink = this.symlinkPathWarning(path);\n if (symlink) return [symlink];\n\n return [\n upsertInObjectMap({\n codec: this.tomlObjectMapCodec(),\n rootKey: \"mcp_servers\",\n policy: \"coerce\",\n platform: this.id,\n configPath: path,\n entryId: connector.id,\n entry: this.renderMcpEntry(ctx, server),\n dryRun,\n }),\n ];\n }\n\n override uninstallServer(ctx: InstallContext): ChangeRecord[] {\n const { connector, dryRun } = ctx;\n const path = this.getServerConfigPath(ctx);\n const symlink = this.symlinkPathWarning(path);\n if (symlink) return [symlink];\n\n return [\n removeFromObjectMap({\n codec: this.tomlObjectMapCodec(),\n rootKey: \"mcp_servers\",\n policy: \"coerce\",\n platform: this.id,\n configPath: path,\n entryId: connector.id,\n dryRun,\n }),\n ];\n }\n\n // ── Install hooks (hooks/agent-connector.json) ───────────────────────────\n\n override installHooks(ctx: InstallContext): ChangeRecord[] {\n const path = this.getHookConfigPath(ctx);\n const hooksOff = ctx.connector.platforms[this.id]?.hooks === false;\n const declared = hooksOff ? [] : ctx.connector.hookEvents;\n\n if (declared.length === 0) {\n return [{ platform: this.id, action: \"skip\", path, detail: \"no hooks declared\" }];\n }\n\n // Unsupported events first (reported by the descriptor, never dropped),\n // then the supported ones in host order. renderEntry derives the matcher.\n const supported = (e: HookEventName) =>\n (GROK_BUILD_HOOK_EVENTS as readonly string[]).includes(e);\n const pending = [\n ...declared\n .filter((e) => !supported(e))\n .map((event) => ({ event: event as string, matcher: \"\" })),\n ...declared.filter(supported).map((event) => ({ event: event as string, matcher: \"\" })),\n ];\n return this.upsertHookEntries(ctx, path, pending, this.hookDescriptor(ctx));\n }\n\n override uninstallHooks(ctx: InstallContext): ChangeRecord[] {\n return this.removeHookEntries(ctx, this.getHookConfigPath(ctx), this.hookDescriptor(ctx));\n }\n\n /** Hook-merge policy for the shared object-map engine (Claude-compatible file). */\n private hookDescriptor(_ctx: InstallContext): HookMergeDescriptor<GrokBuildHookEntry> {\n return {\n malformedPolicy: \"coerce\",\n mapEvent: (e) =>\n (GROK_BUILD_HOOK_EVENTS as readonly string[]).includes(e) ? e : undefined,\n unmappedWarnDetail: (e) => `${e} has no Grok Build hook equivalent — skipped`,\n unmappedAction: (e) => (WARN_SKIP_EVENTS.has(e as HookEventName) ? \"warn\" : \"skip\"),\n renderEntry: (event, _matcher, command) => {\n const entry: GrokBuildHookEntry = { hooks: [{ type: \"command\", command }] };\n // EVENT-derived matcher: the tool events carry the tool-name matcher, and\n // everything else registers \"\" (matches all). Grok warns on a matcher for\n // Stop / UserPromptSubmit, so those must stay empty.\n entry.matcher = event === \"PreToolUse\" ? PRE_TOOL_USE_MATCHER : \"\";\n return entry;\n },\n entryOwnsCommand: (entry, command) =>\n Array.isArray(entry.hooks) &&\n entry.hooks.some(\n (h) => (h.command ?? \"\").replace(/\\\\/g, \"/\") === command.replace(/\\\\/g, \"/\"),\n ),\n ownsEntryForRemove: (c, event) => (entry) =>\n this.isOurEntry(c, event as GrokBuildHookEventName, entry),\n skipDetail: (e) => `hooks.${e}`,\n removeDetail: (e, _n) => `hooks.${e}`,\n absentDetail: `no ${HOOKS_FILENAME}`,\n noMatchDetail: \"no agent-connector hooks present\",\n removeEventKeys: GROK_BUILD_HOOK_EVENTS,\n };\n }\n\n // ── Health checks ────────────────────────────────────────────────────────\n\n override getHealthChecks(ctx: InstallContext): readonly HealthCheck[] {\n const path = this.getServerConfigPath(ctx);\n const id = ctx.connector.id;\n const checks: HealthCheck[] = [\n {\n name: `${this.name}: config.toml exists`,\n check: () =>\n existsSync(path)\n ? { status: \"OK\", detail: path }\n : { status: \"FAIL\", detail: `not found: ${path}` },\n },\n {\n name: `${this.name}: mcp_servers.${id} registered`,\n check: () => {\n // Only assert what the connector declares: a server-less connector\n // never writes an [mcp_servers.<id>] table, so its absence is healthy.\n if (!ctx.connector.server) {\n return { status: \"OK\", detail: \"no MCP server declared\" };\n }\n const bucket = this.readToml(path)[\"mcp_servers\"];\n const present =\n typeof bucket === \"object\" &&\n bucket !== null &&\n id in (bucket as Record<string, unknown>);\n return present\n ? { status: \"OK\", detail: `mcp_servers.${id}` }\n : { status: \"FAIL\", detail: `mcp_servers.${id} not found in ${path}` };\n },\n },\n ];\n\n for (const cmd of ctx.connector.commands) {\n const p = this.commandPath(ctx, cmd.name);\n checks.push({\n name: `${this.name}: command ${cmd.name} present`,\n check: () =>\n existsSync(p) ? { status: \"OK\", detail: p } : { status: \"FAIL\", detail: `not found: ${p}` },\n });\n }\n for (const skill of ctx.connector.skills) {\n const p = join(this.skillDir(ctx, skill.name), \"SKILL.md\");\n checks.push({\n name: `${this.name}: skill ${skill.name} present`,\n check: () =>\n existsSync(p) ? { status: \"OK\", detail: p } : { status: \"FAIL\", detail: `not found: ${p}` },\n });\n }\n for (const agent of ctx.connector.subagents) {\n const p = this.subagentPath(ctx, agent.name);\n checks.push({\n name: `${this.name}: subagent ${agent.name} present`,\n check: () =>\n existsSync(p) ? { status: \"OK\", detail: p } : { status: \"FAIL\", detail: `not found: ${p}` },\n });\n }\n return checks;\n }\n\n // ── Content surfaces: commands / skills / subagents ──────────────────────\n // Pure native-file writers under <scope>/.grok — idempotent via\n // writeContentFile, reversible via removeContentFile. All three roots are\n // scope-symmetric (Grok scans the same layout at user, repo and cwd tiers).\n\n private commandPath(ctx: InstallContext, name: string): string {\n return join(this.getConfigDir(ctx), \"commands\", `${name}.md`);\n }\n private skillDir(ctx: InstallContext, name: string): string {\n return join(this.getConfigDir(ctx), \"skills\", name);\n }\n private subagentPath(ctx: InstallContext, name: string): string {\n return join(this.getConfigDir(ctx), \"agents\", `${name}.md`);\n }\n\n // ── Commands (flat markdown; filename stem = slash-command name) ──────────\n\n override installCommands(ctx: InstallContext): ChangeRecord[] {\n const { connector } = ctx;\n if (connector.platforms[this.id]?.commands === false) {\n return [{ platform: this.id, action: \"skip\", detail: \"commands disabled for grok-build\" }];\n }\n if (connector.commands.length === 0) {\n return [{ platform: this.id, action: \"skip\", detail: \"connector declares no commands\" }];\n }\n return connector.commands.map((cmd) =>\n this.writeContentFile(\n this.commandPath(ctx, cmd.name),\n // Grok's command markdown is the Claude legacy layout: description +\n // argument-hint frontmatter. It has no allowed-tools/model keys on a\n // COMMAND (those are skill/agent frontmatter fields), so both are dropped.\n renderCommandMd(cmd, { includeToolsAndModel: false }),\n ctx.dryRun,\n ),\n );\n }\n\n override uninstallCommands(ctx: InstallContext): ChangeRecord[] {\n const { connector } = ctx;\n if (connector.commands.length === 0) {\n return [{ platform: this.id, action: \"skip\", detail: \"connector declares no commands\" }];\n }\n return connector.commands.map((cmd) =>\n this.removeContentFile(this.commandPath(ctx, cmd.name), ctx.dryRun),\n );\n }\n\n // ── Skills (Anthropic-format SKILL.md) ───────────────────────────────────\n\n override installSkills(ctx: InstallContext): ChangeRecord[] {\n const { connector } = ctx;\n if (connector.platforms[this.id]?.skills === false) {\n return [{ platform: this.id, action: \"skip\", detail: \"skills disabled for grok-build\" }];\n }\n if (connector.skills.length === 0) {\n return [{ platform: this.id, action: \"skip\", detail: \"connector declares no skills\" }];\n }\n const changes: ChangeRecord[] = [];\n for (const skill of connector.skills) {\n const dir = this.skillDir(ctx, skill.name);\n changes.push(this.writeContentFile(join(dir, \"SKILL.md\"), renderSkillMd(skill), ctx.dryRun));\n // Bundle resource files beside SKILL.md. Defense-in-depth: refuse any key\n // that escapes the skill dir (config-time validation already rejects these).\n for (const [rel, contents] of Object.entries(skill.resources ?? {})) {\n const target = this.resolveWithin(dir, rel);\n if (target === null) {\n changes.push({\n platform: this.id,\n action: \"warn\",\n detail: `skill resource \"${rel}\" escapes the skill dir; skipped`,\n });\n continue;\n }\n changes.push(this.writeContentFile(target, contents, ctx.dryRun));\n }\n }\n return changes;\n }\n\n override uninstallSkills(ctx: InstallContext): ChangeRecord[] {\n const { connector } = ctx;\n if (connector.skills.length === 0) {\n return [{ platform: this.id, action: \"skip\", detail: \"connector declares no skills\" }];\n }\n const changes: ChangeRecord[] = [];\n for (const skill of connector.skills) {\n const dir = this.skillDir(ctx, skill.name);\n changes.push(this.removeContentFile(join(dir, \"SKILL.md\"), ctx.dryRun));\n for (const rel of Object.keys(skill.resources ?? {})) {\n const target = this.resolveWithin(dir, rel);\n if (target === null) continue; // never delete outside the skill dir\n changes.push(this.removeContentFile(target, ctx.dryRun));\n }\n // Only remove the dir when WE own its full contents.\n changes.push(this.removeDirIfEmpty(dir, ctx.dryRun));\n }\n return changes;\n }\n\n // ── Subagents (md + frontmatter: name, description, tools, model) ─────────\n\n override installSubagents(ctx: InstallContext): ChangeRecord[] {\n const { connector } = ctx;\n if (connector.platforms[this.id]?.subagents === false) {\n return [{ platform: this.id, action: \"skip\", detail: \"subagents disabled for grok-build\" }];\n }\n if (connector.subagents.length === 0) {\n return [{ platform: this.id, action: \"skip\", detail: \"connector declares no subagents\" }];\n }\n return connector.subagents.map((agent) =>\n this.writeContentFile(\n this.subagentPath(ctx, agent.name),\n this.renderSubagent(agent),\n ctx.dryRun,\n ),\n );\n }\n\n override uninstallSubagents(ctx: InstallContext): ChangeRecord[] {\n const { connector } = ctx;\n if (connector.subagents.length === 0) {\n return [{ platform: this.id, action: \"skip\", detail: \"connector declares no subagents\" }];\n }\n return connector.subagents.map((agent) =>\n this.removeContentFile(this.subagentPath(ctx, agent.name), ctx.dryRun),\n );\n }\n\n /**\n * Grok agent definitions are md + YAML frontmatter whose documented keys —\n * name, description, tools, model — are exactly the shared renderer's shape\n * (16-subagents.md shows `name`, `description`, `tools` in its frontmatter\n * example). `extra` remains the escape hatch for Grok-only keys such as\n * `mcpInheritance`.\n */\n private renderSubagent(agent: SubagentDef): string {\n return renderSubagentMd(agent);\n }\n\n // ── Runtime dispatch ─────────────────────────────────────────────────────\n\n parseEvent(event: HookEventName, raw: unknown): NormalizedEvent {\n const input = (raw ?? {}) as GrokBuildHookInput;\n // camelCase is the authoritative envelope spelling; the snake_case twins are\n // the additive aliases to_hook_json injects.\n const toolName = input.toolName ?? input.tool_name ?? \"\";\n const toolInput = input.toolInput ?? input.tool_input ?? {};\n const base = {\n hostPlatform: this.id,\n connectorId: \"\",\n sessionId: input.sessionId ?? input.session_id ?? `pid-${process.ppid}`,\n // `cwd` is the session's working directory; `workspaceRoot` is the repo\n // root. Prefer cwd (matches every other adapter's projectDir semantics).\n projectDir: input.cwd ?? input.workspaceRoot ?? process.cwd(),\n raw,\n };\n\n switch (event) {\n case \"PreToolUse\":\n return { ...base, toolName, toolInput };\n case \"PostToolUse\":\n return {\n ...base,\n toolName,\n toolInput,\n // Upstream field is `toolResult` (aliased to `tool_response`).\n toolOutput: coerceToolResult(input.toolResult ?? input.tool_response),\n // Grok's PostToolUse payload has NO error flag: a dispatch failure or\n // an MCP error result fires PostToolUseFailure instead. Never invent one.\n isError: false,\n };\n case \"SessionStart\":\n return { ...base, source: normalizeSessionSource(input.source) };\n case \"SessionEnd\":\n return { ...base, reason: input.reason };\n case \"UserPromptSubmit\":\n return { ...base, prompt: input.prompt ?? \"\" };\n case \"PreCompact\":\n case \"PostCompact\":\n // FALSE FRIEND: the compaction payload field is `source`, not `trigger`\n // (event.rs PreCompact/PostCompact { source: String }), even though the\n // prose calls the value \"the compaction trigger\" (manual|auto).\n return { ...base, trigger: input.source === \"manual\" ? \"manual\" : \"auto\" };\n case \"Stop\":\n return { ...base, stopHookActive: input.stopHookActive ?? false };\n case \"Notification\":\n // `message` is optional upstream; `notificationType` is always present\n // and is what the matcher tests, so it is the fallback.\n return { ...base, message: input.message ?? input.notificationType ?? \"\" };\n case \"PostToolUseFailure\":\n return {\n ...base,\n toolName,\n toolInput,\n error: input.error ?? \"\",\n ...(typeof (input.toolUseId ?? input.tool_use_id) === \"string\"\n ? { toolUseId: (input.toolUseId ?? input.tool_use_id) as string }\n : {}),\n ...(typeof (input.isInterrupt ?? input.is_interrupt) === \"boolean\"\n ? { isInterrupt: (input.isInterrupt ?? input.is_interrupt) as boolean }\n : {}),\n ...(typeof (input.durationMs ?? input.duration_ms) === \"number\"\n ? { durationMs: (input.durationMs ?? input.duration_ms) as number }\n : {}),\n };\n case \"SubagentStart\":\n return {\n ...base,\n ...(typeof input.subagentId === \"string\" ? { agentId: input.subagentId } : {}),\n ...(typeof input.subagentType === \"string\" ? { agentType: input.subagentType } : {}),\n };\n case \"SubagentStop\":\n return {\n ...base,\n ...(typeof input.subagentId === \"string\" ? { agentId: input.subagentId } : {}),\n ...(typeof input.subagentType === \"string\" ? { agentType: input.subagentType } : {}),\n ...(typeof input.lastAssistantMessage === \"string\"\n ? { lastAssistantMessage: input.lastAssistantMessage }\n : {}),\n ...(typeof input.stopHookActive === \"boolean\"\n ? { stopHookActive: input.stopHookActive }\n : {}),\n };\n case \"PermissionRequest\":\n // No Grok analog — never fired natively (its `PermissionDenied` is a\n // passive post-denial event). Parsed defensively so a manual\n // `hook grok-build PermissionRequest` invocation normalizes rather than\n // throwing.\n return { ...base, toolName, toolInput };\n }\n }\n\n formatReply(event: HookEventName, response: HookResponse): HookReply {\n // Exit code 0 throughout: Grok honors a stdout `deny` decision regardless of\n // the exit code, and a non-zero exit DROPS updatedInput / additionalContext /\n // the output replacement. Structured stdout is therefore strictly better than\n // the exit-2 channel for every reply we emit.\n\n if (response.decision === \"deny\") {\n // PreToolUse: the canonical decision key is\n // hookSpecificOutput.permissionDecision (it wins over a top-level\n // `decision`), with permissionDecisionReason as the message.\n if (event === \"PreToolUse\") {\n return {\n exitCode: 0,\n stdout: JSON.stringify({\n hookSpecificOutput: {\n hookEventName: \"PreToolUse\",\n permissionDecision: \"deny\",\n permissionDecisionReason: response.reason ?? \"Blocked by hook\",\n },\n }),\n };\n }\n // UserPromptSubmit / Stop / SubagentStop / PostToolUse all use the\n // top-level block protocol. On Stop / SubagentStop this keeps the agent\n // working with `reason` as its next instruction; on UserPromptSubmit it\n // rejects the prompt; on PostToolUse it delivers `reason` to the model\n // beside the (already produced) tool result.\n if (\n event === \"UserPromptSubmit\" ||\n event === \"Stop\" ||\n event === \"SubagentStop\" ||\n event === \"PostToolUse\"\n ) {\n return {\n exitCode: 0,\n stdout: JSON.stringify({\n decision: \"block\",\n reason: response.reason ?? \"Blocked by hook\",\n }),\n };\n }\n // PostToolUseFailure is feedback-only: a deny degrades to context carrying\n // the reason (the documented capability is additionalContext alone).\n if (event === \"PostToolUseFailure\") {\n return {\n exitCode: 0,\n stdout: JSON.stringify({\n hookSpecificOutput: {\n hookEventName: \"PostToolUseFailure\",\n additionalContext: response.reason ?? \"Blocked by hook\",\n },\n }),\n };\n }\n // Passive events (SessionStart/End, Notification, Pre/PostCompact,\n // SubagentStart) ignore stdout entirely — fail open.\n return { exitCode: 0 };\n }\n\n // \"ask\" is NATIVE on Grok: the call reaches the permission prompt, which\n // names the hook and shows the reason, and no always-approve/auto/saved-grant\n // path can bypass it. Only PreToolUse has a permission gate to route to.\n if (response.decision === \"ask\" && event === \"PreToolUse\") {\n return {\n exitCode: 0,\n stdout: JSON.stringify({\n hookSpecificOutput: {\n hookEventName: \"PreToolUse\",\n permissionDecision: \"ask\",\n permissionDecisionReason: response.reason ?? \"Confirmation required by hook\",\n },\n }),\n };\n }\n\n if (response.decision === \"modify\") {\n // PreToolUse input rewrite. Unlike Codex, Grok needs NO paired allow:\n // \"Omitting `decision` while returning `updatedInput` allows the call and\n // applies the rewrite\" — and emitting a bare allow would be wrong anyway,\n // since a Grok `allow` means only \"not blocked\".\n if (event === \"PreToolUse\" && response.updatedInput) {\n return {\n exitCode: 0,\n stdout: JSON.stringify({\n hookSpecificOutput: {\n hookEventName: \"PreToolUse\",\n updatedInput: response.updatedInput,\n },\n }),\n };\n }\n // PostToolUse output rewrite: `updatedToolOutput` is the universal key and\n // replaces only the MODEL's copy of the result (the scrollback, transcript\n // and telemetry keep the original).\n if (event === \"PostToolUse\" && response.updatedOutput !== undefined) {\n return {\n exitCode: 0,\n stdout: JSON.stringify({\n hookSpecificOutput: {\n hookEventName: \"PostToolUse\",\n updatedToolOutput: response.updatedOutput,\n },\n }),\n };\n }\n return { exitCode: 0 };\n }\n\n // Context injection. Honored on the tool events and on the Stop gates\n // (non-error feedback that keeps the agent working). NOT honored on\n // SessionStart / Notification / Pre|PostCompact / SubagentStart, whose stdout\n // Grok ignores, nor on an allowing UserPromptSubmit, whose stdout is\n // discarded — those fall through to a bare exit-0 rather than emitting a\n // payload the host would silently drop.\n if (\n response.additionalContext &&\n (event === \"PreToolUse\" ||\n event === \"PostToolUse\" ||\n event === \"PostToolUseFailure\" ||\n event === \"Stop\" ||\n event === \"SubagentStop\")\n ) {\n return {\n exitCode: 0,\n stdout: JSON.stringify({\n hookSpecificOutput: {\n hookEventName: event,\n additionalContext: response.additionalContext,\n },\n }),\n };\n }\n\n // \"allow\" / unsupported-here → passthrough.\n return { exitCode: 0 };\n }\n\n // ── Internal helpers ─────────────────────────────────────────────────────\n\n /** Resolve the per-platform server override into an effective ServerDef. */\n private effectiveServer(ctx: InstallContext): ServerDef | undefined {\n const override = ctx.connector.platforms[this.id]?.server;\n if (override === false) return undefined;\n const base = ctx.connector.server;\n if (!base) return undefined;\n return override ? { ...base, ...override } : base;\n }\n\n /**\n * Render the `[mcp_servers.<id>]` table. TOML has NO interpolation, so every\n * `${env:VAR}` resolves to a literal at install time. Honors the telemetry\n * serve-wrapper (stdio only — a remote server cannot be intercepted).\n */\n private renderMcpEntry(ctx: InstallContext, server: ServerDef): GrokBuildMcpEntry {\n // Remote (http/sse): Grok infers the transport from `url`; `headers` is the\n // documented auth-carrying table. installServer's guard means this branch is\n // exactly the http/sse+url case.\n if (server.transport === \"http\" || server.transport === \"sse\") {\n const remote: GrokBuildMcpEntry = { url: resolveEnvRefsDeep(server.url ?? \"\") };\n const headers: Record<string, string> = {};\n if (server.auth?.type === \"bearerEnv\" && server.auth.bearerEnvVar) {\n // Grok has no bearer_token_env_var key (that is a Codex-ism). The token\n // rides the standard Authorization header, emitted in GROK'S OWN\n // `${VAR}` syntax rather than as a resolved literal: 07-mcp-servers.md\n // §Example Configurations documents `headers = { \"Authorization\" =\n // \"Bearer ${INTERNAL_MCP_TOKEN}\" }` and states Grok expands `url`,\n // `command`, `args` and the values in `env`/`headers` at load time. So\n // the secret stays out of the config file — which matters most in\n // project scope, where .grok/config.toml is meant to be committed.\n headers[\"Authorization\"] = `Bearer \\${${server.auth.bearerEnvVar}}`;\n }\n for (const [k, v] of Object.entries(resolveEnvRefsDeep(server.headers ?? {}))) {\n headers[k] = String(v);\n }\n if (Object.keys(headers).length > 0) remote.headers = headers;\n if (server.enabled === false) remote.enabled = false;\n return remote;\n }\n\n let command = server.command as string;\n let args = [...(server.args ?? [])];\n\n ({ command, args } = buildWrappedStdio(ctx, server, this.id, command, args));\n\n // Resolve env-refs to literals (TOML cannot interpolate).\n command = resolveEnvRefsDeep(command);\n args = resolveEnvRefsDeep(args);\n\n const entry: GrokBuildMcpEntry = { command };\n if (args.length > 0) entry.args = args;\n\n if (server.env && Object.keys(server.env).length > 0) {\n const env: Record<string, string> = {};\n for (const [k, v] of Object.entries(resolveEnvRefsDeep(server.env))) {\n env[k] = String(v);\n }\n entry.env = env;\n }\n if (server.enabled === false) entry.enabled = false;\n return entry;\n }\n\n /**\n * Does this hooks-file entry belong to this connector for `event`? EVENT-\n * SPECIFIC + path-normalized exact-command match, so an entry under one event\n * key is never matched while iterating another.\n */\n private isOurEntry(\n ctx: InstallContext,\n event: GrokBuildHookEventName,\n entry: GrokBuildHookEntry,\n ): boolean {\n if (!entry || typeof entry !== \"object\" || !Array.isArray(entry.hooks)) return false;\n const ours = buildHomeBinHookCommand(ctx.homeBinPath, \"grok-build\", event, ctx.connector.id);\n const needle = ours.replace(/\\\\/g, \"/\");\n return entry.hooks.some((h) => (h.command ?? \"\").replace(/\\\\/g, \"/\") === needle);\n }\n}\n\nexport const adapter = new GrokBuildAdapter();\nexport default adapter;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+GA,SAAS,YAAY,cAAc,qBAAqB;AACxD,SAAS,SAAS,YAAY;AAE9B,OAAO,UAAU;AAgHjB,IAAM,yBAAyB;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAiBA,IAAM,uBACJ;AAQF,IAAM,mBAA+C,oBAAI,IAAI,CAAC,mBAAmB,CAAC;AAGlF,IAAM,iBAAiB;AAQvB,SAAS,iBAAiB,OAAoC;AAC5D,MAAI,UAAU,UAAa,UAAU,KAAM,QAAO;AAClD,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,MAAI;AACF,WAAO,KAAK,UAAU,KAAK;AAAA,EAC7B,QAAQ;AACN,WAAO,OAAO,KAAK;AAAA,EACrB;AACF;AAMO,IAAM,mBAAN,cAA+B,YAAY;AAAA,EACvC,KAAiB;AAAA,EACjB,OAAO;AAAA,EACP,WAAyB;AAAA,EAEzB,eAAqC;AAAA,IAC5C,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,kBAAkB;AAAA,IAClB,MAAM;AAAA,IACN,cAAc;AAAA;AAAA;AAAA;AAAA,IAId,oBAAoB;AAAA,IACpB,eAAe;AAAA,IACf,cAAc;AAAA,IACd,aAAa;AAAA;AAAA;AAAA;AAAA,IAIb,eAAe;AAAA;AAAA;AAAA,IAGf,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMjB,yBAAyB;AAAA;AAAA;AAAA,IAGzB,YAAY,CAAC,SAAS,QAAQ,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA,IAKnC,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,IAChB,mBAAmB;AAAA;AAAA,IAEnB,gBAAgB;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,gBAAgB,YAAsC;AACpD,UAAM,UAAU,KAAK,cAAc;AACnC,UAAM,UAAU,KAAK,YAAY,OAAO;AACxC,UAAM,UAAU,KAAK,SAAS,aAAa;AAC3C,UAAM,UAAU,KAAK,SAAS,aAAa;AAG3C,UAAM,cACJ,WAAW,KAAK,SAAS,oBAAoB,CAAC,KAAK,CAAC,WAAW,OAAO;AAExE,UAAM,gBAAgB,WAAW,OAAO,KAAM,WAAW,OAAO,KAAK,CAAC;AACtE,UAAM,gBAAgB,WAAW,OAAO,KAAK,WAAW,OAAO;AAC/D,UAAM,YAAY,iBAAiB;AACnC,UAAM,QAAQ,iBAAiB,CAAC,gBAAgB,YAAY;AAC5D,UAAM,aAAa,UAAU,YAAY,UAAU;AAEnD,WAAO;AAAA,MACL,IAAI,KAAK;AAAA,MACT,MAAM,KAAK;AAAA,MACX;AAAA,MACA,UAAU,KAAK;AAAA,MACf,cAAc,KAAK;AAAA,MACnB;AAAA,MACA;AAAA,MACA,QAAQ,YACJ,gCAAgC,KAAK,MACrC,cACE,GAAG,OAAO,4DACV,0BAA0B,OAAO,OAAO,OAAO;AAAA,MACrD,YAAY,YAAY,SAAS;AAAA,IACnC;AAAA,EACF;AAAA;AAAA,EAIS,aAAa,KAA6B;AACjD,QAAI,IAAI,UAAU,UAAW,QAAO,KAAK,IAAI,YAAY,OAAO;AAChE,WAAO,KAAK,cAAc;AAAA,EAC5B;AAAA,EAES,oBAAoB,KAA6B;AACxD,WAAO,KAAK,KAAK,aAAa,GAAG,GAAG,aAAa;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOS,kBAAkB,KAA6B;AACtD,WAAO,KAAK,KAAK,aAAa,GAAG,GAAG,SAAS,cAAc;AAAA,EAC7D;AAAA;AAAA,EAGQ,gBAAwB;AAC9B,WAAO,oBAAoB;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOmB,cAAc,KAAqC;AACpE,QAAI,KAAK,eAAe,GAAG,GAAG,KAAM,QAAO,MAAM,cAAc,GAAG;AAClE,QAAI,IAAI,UAAU,WAAW;AAC3B,aAAO;AAAA,QACL;AAAA,UACE,MAAM,KAAK,IAAI,YAAY,WAAW;AAAA,UACtC,QAAQ;AAAA,QACV;AAAA,MACF;AAAA,IACF;AACA,QAAI,IAAI,UAAU,QAAQ;AACxB,aAAO;AAAA,QACL;AAAA,UACE,MAAM,KAAK,KAAK,cAAc,GAAG,SAAS,oBAAoB;AAAA,UAC9D,QAAQ;AAAA,QACV;AAAA,MACF;AAAA,IACF;AACA,WAAO,CAAC;AAAA,EACV;AAAA;AAAA,EAIQ,SAAS,MAAuC;AACtD,QAAI,CAAC,WAAW,IAAI,EAAG,QAAO,CAAC;AAC/B,QAAI;AACF,aAAO,KAAK,MAAM,aAAa,MAAM,MAAM,CAAC;AAAA,IAC9C,QAAQ;AACN,aAAO,CAAC;AAAA,IACV;AAAA,EACF;AAAA,EAEQ,UAAU,MAAc,MAA+B,QAAuB;AACpF,QAAI,OAAQ;AACZ,cAAU,QAAQ,IAAI,CAAC;AAEvB,kBAAc,MAAM,KAAK,UAAU,IAAa,GAAG,MAAM;AAAA,EAC3D;AAAA;AAAA;AAAA,EAIQ,qBAAqC;AAC3C,WAAO;AAAA,MACL,OAAO,CAAC,SAAS,KAAK,SAAS,IAAI;AAAA,MACnC,WAAW,CAAC,MAAM,MAAM,WAAW,KAAK,UAAU,MAAM,MAAM,MAAM;AAAA,MACpE,yBAAyB,MAAM;AAAA,IACjC;AAAA,EACF;AAAA;AAAA,EAIS,cAAc,KAAqC;AAC1D,UAAM,EAAE,WAAW,OAAO,IAAI;AAC9B,UAAM,SAAS,KAAK,gBAAgB,GAAG;AACvC,UAAM,OAAO,KAAK,oBAAoB,GAAG;AAEzC,QAAI,CAAC,QAAQ;AACX,aAAO,CAAC,EAAE,UAAU,KAAK,IAAI,QAAQ,QAAQ,MAAM,QAAQ,qBAAqB,CAAC;AAAA,IACnF;AACA,UAAM,UAAU,OAAO,cAAc,WAAW,CAAC,CAAC,OAAO;AACzD,UAAM,YAAY,OAAO,cAAc,UAAU,OAAO,cAAc,UAAU,CAAC,CAAC,OAAO;AACzF,QAAI,CAAC,WAAW,CAAC,UAAU;AACzB,aAAO;AAAA,QACL;AAAA,UACE,UAAU,KAAK;AAAA,UACf,QAAQ;AAAA,UACR;AAAA,UACA,QAAQ,cAAc,OAAO,SAAS;AAAA,QACxC;AAAA,MACF;AAAA,IACF;AAEA,UAAM,UAAU,KAAK,mBAAmB,IAAI;AAC5C,QAAI,QAAS,QAAO,CAAC,OAAO;AAE5B,WAAO;AAAA,MACL,kBAAkB;AAAA,QAChB,OAAO,KAAK,mBAAmB;AAAA,QAC/B,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,UAAU,KAAK;AAAA,QACf,YAAY;AAAA,QACZ,SAAS,UAAU;AAAA,QACnB,OAAO,KAAK,eAAe,KAAK,MAAM;AAAA,QACtC;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAES,gBAAgB,KAAqC;AAC5D,UAAM,EAAE,WAAW,OAAO,IAAI;AAC9B,UAAM,OAAO,KAAK,oBAAoB,GAAG;AACzC,UAAM,UAAU,KAAK,mBAAmB,IAAI;AAC5C,QAAI,QAAS,QAAO,CAAC,OAAO;AAE5B,WAAO;AAAA,MACL,oBAAoB;AAAA,QAClB,OAAO,KAAK,mBAAmB;AAAA,QAC/B,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,UAAU,KAAK;AAAA,QACf,YAAY;AAAA,QACZ,SAAS,UAAU;AAAA,QACnB;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA,EAIS,aAAa,KAAqC;AACzD,UAAM,OAAO,KAAK,kBAAkB,GAAG;AACvC,UAAM,WAAW,IAAI,UAAU,UAAU,KAAK,EAAE,GAAG,UAAU;AAC7D,UAAM,WAAW,WAAW,CAAC,IAAI,IAAI,UAAU;AAE/C,QAAI,SAAS,WAAW,GAAG;AACzB,aAAO,CAAC,EAAE,UAAU,KAAK,IAAI,QAAQ,QAAQ,MAAM,QAAQ,oBAAoB,CAAC;AAAA,IAClF;AAIA,UAAM,YAAY,CAAC,MAChB,uBAA6C,SAAS,CAAC;AAC1D,UAAM,UAAU;AAAA,MACd,GAAG,SACA,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,EAC3B,IAAI,CAAC,WAAW,EAAE,OAAwB,SAAS,GAAG,EAAE;AAAA,MAC3D,GAAG,SAAS,OAAO,SAAS,EAAE,IAAI,CAAC,WAAW,EAAE,OAAwB,SAAS,GAAG,EAAE;AAAA,IACxF;AACA,WAAO,KAAK,kBAAkB,KAAK,MAAM,SAAS,KAAK,eAAe,GAAG,CAAC;AAAA,EAC5E;AAAA,EAES,eAAe,KAAqC;AAC3D,WAAO,KAAK,kBAAkB,KAAK,KAAK,kBAAkB,GAAG,GAAG,KAAK,eAAe,GAAG,CAAC;AAAA,EAC1F;AAAA;AAAA,EAGQ,eAAe,MAA+D;AACpF,WAAO;AAAA,MACL,iBAAiB;AAAA,MACjB,UAAU,CAAC,MACR,uBAA6C,SAAS,CAAC,IAAI,IAAI;AAAA,MAClE,oBAAoB,CAAC,MAAM,GAAG,CAAC;AAAA,MAC/B,gBAAgB,CAAC,MAAO,iBAAiB,IAAI,CAAkB,IAAI,SAAS;AAAA,MAC5E,aAAa,CAAC,OAAO,UAAU,YAAY;AACzC,cAAM,QAA4B,EAAE,OAAO,CAAC,EAAE,MAAM,WAAW,QAAQ,CAAC,EAAE;AAI1E,cAAM,UAAU,UAAU,eAAe,uBAAuB;AAChE,eAAO;AAAA,MACT;AAAA,MACA,kBAAkB,CAAC,OAAO,YACxB,MAAM,QAAQ,MAAM,KAAK,KACzB,MAAM,MAAM;AAAA,QACV,CAAC,OAAO,EAAE,WAAW,IAAI,QAAQ,OAAO,GAAG,MAAM,QAAQ,QAAQ,OAAO,GAAG;AAAA,MAC7E;AAAA,MACF,oBAAoB,CAAC,GAAG,UAAU,CAAC,UACjC,KAAK,WAAW,GAAG,OAAiC,KAAK;AAAA,MAC3D,YAAY,CAAC,MAAM,SAAS,CAAC;AAAA,MAC7B,cAAc,CAAC,GAAG,OAAO,SAAS,CAAC;AAAA,MACnC,cAAc,MAAM,cAAc;AAAA,MAClC,eAAe;AAAA,MACf,iBAAiB;AAAA,IACnB;AAAA,EACF;AAAA;AAAA,EAIS,gBAAgB,KAA6C;AACpE,UAAM,OAAO,KAAK,oBAAoB,GAAG;AACzC,UAAM,KAAK,IAAI,UAAU;AACzB,UAAM,SAAwB;AAAA,MAC5B;AAAA,QACE,MAAM,GAAG,KAAK,IAAI;AAAA,QAClB,OAAO,MACL,WAAW,IAAI,IACX,EAAE,QAAQ,MAAM,QAAQ,KAAK,IAC7B,EAAE,QAAQ,QAAQ,QAAQ,cAAc,IAAI,GAAG;AAAA,MACvD;AAAA,MACA;AAAA,QACE,MAAM,GAAG,KAAK,IAAI,iBAAiB,EAAE;AAAA,QACrC,OAAO,MAAM;AAGX,cAAI,CAAC,IAAI,UAAU,QAAQ;AACzB,mBAAO,EAAE,QAAQ,MAAM,QAAQ,yBAAyB;AAAA,UAC1D;AACA,gBAAM,SAAS,KAAK,SAAS,IAAI,EAAE,aAAa;AAChD,gBAAM,UACJ,OAAO,WAAW,YAClB,WAAW,QACX,MAAO;AACT,iBAAO,UACH,EAAE,QAAQ,MAAM,QAAQ,eAAe,EAAE,GAAG,IAC5C,EAAE,QAAQ,QAAQ,QAAQ,eAAe,EAAE,iBAAiB,IAAI,GAAG;AAAA,QACzE;AAAA,MACF;AAAA,IACF;AAEA,eAAW,OAAO,IAAI,UAAU,UAAU;AACxC,YAAM,IAAI,KAAK,YAAY,KAAK,IAAI,IAAI;AACxC,aAAO,KAAK;AAAA,QACV,MAAM,GAAG,KAAK,IAAI,aAAa,IAAI,IAAI;AAAA,QACvC,OAAO,MACL,WAAW,CAAC,IAAI,EAAE,QAAQ,MAAM,QAAQ,EAAE,IAAI,EAAE,QAAQ,QAAQ,QAAQ,cAAc,CAAC,GAAG;AAAA,MAC9F,CAAC;AAAA,IACH;AACA,eAAW,SAAS,IAAI,UAAU,QAAQ;AACxC,YAAM,IAAI,KAAK,KAAK,SAAS,KAAK,MAAM,IAAI,GAAG,UAAU;AACzD,aAAO,KAAK;AAAA,QACV,MAAM,GAAG,KAAK,IAAI,WAAW,MAAM,IAAI;AAAA,QACvC,OAAO,MACL,WAAW,CAAC,IAAI,EAAE,QAAQ,MAAM,QAAQ,EAAE,IAAI,EAAE,QAAQ,QAAQ,QAAQ,cAAc,CAAC,GAAG;AAAA,MAC9F,CAAC;AAAA,IACH;AACA,eAAW,SAAS,IAAI,UAAU,WAAW;AAC3C,YAAM,IAAI,KAAK,aAAa,KAAK,MAAM,IAAI;AAC3C,aAAO,KAAK;AAAA,QACV,MAAM,GAAG,KAAK,IAAI,cAAc,MAAM,IAAI;AAAA,QAC1C,OAAO,MACL,WAAW,CAAC,IAAI,EAAE,QAAQ,MAAM,QAAQ,EAAE,IAAI,EAAE,QAAQ,QAAQ,QAAQ,cAAc,CAAC,GAAG;AAAA,MAC9F,CAAC;AAAA,IACH;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,YAAY,KAAqB,MAAsB;AAC7D,WAAO,KAAK,KAAK,aAAa,GAAG,GAAG,YAAY,GAAG,IAAI,KAAK;AAAA,EAC9D;AAAA,EACQ,SAAS,KAAqB,MAAsB;AAC1D,WAAO,KAAK,KAAK,aAAa,GAAG,GAAG,UAAU,IAAI;AAAA,EACpD;AAAA,EACQ,aAAa,KAAqB,MAAsB;AAC9D,WAAO,KAAK,KAAK,aAAa,GAAG,GAAG,UAAU,GAAG,IAAI,KAAK;AAAA,EAC5D;AAAA;AAAA,EAIS,gBAAgB,KAAqC;AAC5D,UAAM,EAAE,UAAU,IAAI;AACtB,QAAI,UAAU,UAAU,KAAK,EAAE,GAAG,aAAa,OAAO;AACpD,aAAO,CAAC,EAAE,UAAU,KAAK,IAAI,QAAQ,QAAQ,QAAQ,mCAAmC,CAAC;AAAA,IAC3F;AACA,QAAI,UAAU,SAAS,WAAW,GAAG;AACnC,aAAO,CAAC,EAAE,UAAU,KAAK,IAAI,QAAQ,QAAQ,QAAQ,iCAAiC,CAAC;AAAA,IACzF;AACA,WAAO,UAAU,SAAS;AAAA,MAAI,CAAC,QAC7B,KAAK;AAAA,QACH,KAAK,YAAY,KAAK,IAAI,IAAI;AAAA;AAAA;AAAA;AAAA,QAI9B,gBAAgB,KAAK,EAAE,sBAAsB,MAAM,CAAC;AAAA,QACpD,IAAI;AAAA,MACN;AAAA,IACF;AAAA,EACF;AAAA,EAES,kBAAkB,KAAqC;AAC9D,UAAM,EAAE,UAAU,IAAI;AACtB,QAAI,UAAU,SAAS,WAAW,GAAG;AACnC,aAAO,CAAC,EAAE,UAAU,KAAK,IAAI,QAAQ,QAAQ,QAAQ,iCAAiC,CAAC;AAAA,IACzF;AACA,WAAO,UAAU,SAAS;AAAA,MAAI,CAAC,QAC7B,KAAK,kBAAkB,KAAK,YAAY,KAAK,IAAI,IAAI,GAAG,IAAI,MAAM;AAAA,IACpE;AAAA,EACF;AAAA;AAAA,EAIS,cAAc,KAAqC;AAC1D,UAAM,EAAE,UAAU,IAAI;AACtB,QAAI,UAAU,UAAU,KAAK,EAAE,GAAG,WAAW,OAAO;AAClD,aAAO,CAAC,EAAE,UAAU,KAAK,IAAI,QAAQ,QAAQ,QAAQ,iCAAiC,CAAC;AAAA,IACzF;AACA,QAAI,UAAU,OAAO,WAAW,GAAG;AACjC,aAAO,CAAC,EAAE,UAAU,KAAK,IAAI,QAAQ,QAAQ,QAAQ,+BAA+B,CAAC;AAAA,IACvF;AACA,UAAM,UAA0B,CAAC;AACjC,eAAW,SAAS,UAAU,QAAQ;AACpC,YAAM,MAAM,KAAK,SAAS,KAAK,MAAM,IAAI;AACzC,cAAQ,KAAK,KAAK,iBAAiB,KAAK,KAAK,UAAU,GAAG,cAAc,KAAK,GAAG,IAAI,MAAM,CAAC;AAG3F,iBAAW,CAAC,KAAK,QAAQ,KAAK,OAAO,QAAQ,MAAM,aAAa,CAAC,CAAC,GAAG;AACnE,cAAM,SAAS,KAAK,cAAc,KAAK,GAAG;AAC1C,YAAI,WAAW,MAAM;AACnB,kBAAQ,KAAK;AAAA,YACX,UAAU,KAAK;AAAA,YACf,QAAQ;AAAA,YACR,QAAQ,mBAAmB,GAAG;AAAA,UAChC,CAAC;AACD;AAAA,QACF;AACA,gBAAQ,KAAK,KAAK,iBAAiB,QAAQ,UAAU,IAAI,MAAM,CAAC;AAAA,MAClE;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAES,gBAAgB,KAAqC;AAC5D,UAAM,EAAE,UAAU,IAAI;AACtB,QAAI,UAAU,OAAO,WAAW,GAAG;AACjC,aAAO,CAAC,EAAE,UAAU,KAAK,IAAI,QAAQ,QAAQ,QAAQ,+BAA+B,CAAC;AAAA,IACvF;AACA,UAAM,UAA0B,CAAC;AACjC,eAAW,SAAS,UAAU,QAAQ;AACpC,YAAM,MAAM,KAAK,SAAS,KAAK,MAAM,IAAI;AACzC,cAAQ,KAAK,KAAK,kBAAkB,KAAK,KAAK,UAAU,GAAG,IAAI,MAAM,CAAC;AACtE,iBAAW,OAAO,OAAO,KAAK,MAAM,aAAa,CAAC,CAAC,GAAG;AACpD,cAAM,SAAS,KAAK,cAAc,KAAK,GAAG;AAC1C,YAAI,WAAW,KAAM;AACrB,gBAAQ,KAAK,KAAK,kBAAkB,QAAQ,IAAI,MAAM,CAAC;AAAA,MACzD;AAEA,cAAQ,KAAK,KAAK,iBAAiB,KAAK,IAAI,MAAM,CAAC;AAAA,IACrD;AACA,WAAO;AAAA,EACT;AAAA;AAAA,EAIS,iBAAiB,KAAqC;AAC7D,UAAM,EAAE,UAAU,IAAI;AACtB,QAAI,UAAU,UAAU,KAAK,EAAE,GAAG,cAAc,OAAO;AACrD,aAAO,CAAC,EAAE,UAAU,KAAK,IAAI,QAAQ,QAAQ,QAAQ,oCAAoC,CAAC;AAAA,IAC5F;AACA,QAAI,UAAU,UAAU,WAAW,GAAG;AACpC,aAAO,CAAC,EAAE,UAAU,KAAK,IAAI,QAAQ,QAAQ,QAAQ,kCAAkC,CAAC;AAAA,IAC1F;AACA,WAAO,UAAU,UAAU;AAAA,MAAI,CAAC,UAC9B,KAAK;AAAA,QACH,KAAK,aAAa,KAAK,MAAM,IAAI;AAAA,QACjC,KAAK,eAAe,KAAK;AAAA,QACzB,IAAI;AAAA,MACN;AAAA,IACF;AAAA,EACF;AAAA,EAES,mBAAmB,KAAqC;AAC/D,UAAM,EAAE,UAAU,IAAI;AACtB,QAAI,UAAU,UAAU,WAAW,GAAG;AACpC,aAAO,CAAC,EAAE,UAAU,KAAK,IAAI,QAAQ,QAAQ,QAAQ,kCAAkC,CAAC;AAAA,IAC1F;AACA,WAAO,UAAU,UAAU;AAAA,MAAI,CAAC,UAC9B,KAAK,kBAAkB,KAAK,aAAa,KAAK,MAAM,IAAI,GAAG,IAAI,MAAM;AAAA,IACvE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,eAAe,OAA4B;AACjD,WAAO,iBAAiB,KAAK;AAAA,EAC/B;AAAA;AAAA,EAIA,WAAW,OAAsB,KAA+B;AAC9D,UAAM,QAAS,OAAO,CAAC;AAGvB,UAAM,WAAW,MAAM,YAAY,MAAM,aAAa;AACtD,UAAM,YAAY,MAAM,aAAa,MAAM,cAAc,CAAC;AAC1D,UAAM,OAAO;AAAA,MACX,cAAc,KAAK;AAAA,MACnB,aAAa;AAAA,MACb,WAAW,MAAM,aAAa,MAAM,cAAc,OAAO,QAAQ,IAAI;AAAA;AAAA;AAAA,MAGrE,YAAY,MAAM,OAAO,MAAM,iBAAiB,QAAQ,IAAI;AAAA,MAC5D;AAAA,IACF;AAEA,YAAQ,OAAO;AAAA,MACb,KAAK;AACH,eAAO,EAAE,GAAG,MAAM,UAAU,UAAU;AAAA,MACxC,KAAK;AACH,eAAO;AAAA,UACL,GAAG;AAAA,UACH;AAAA,UACA;AAAA;AAAA,UAEA,YAAY,iBAAiB,MAAM,cAAc,MAAM,aAAa;AAAA;AAAA;AAAA,UAGpE,SAAS;AAAA,QACX;AAAA,MACF,KAAK;AACH,eAAO,EAAE,GAAG,MAAM,QAAQ,uBAAuB,MAAM,MAAM,EAAE;AAAA,MACjE,KAAK;AACH,eAAO,EAAE,GAAG,MAAM,QAAQ,MAAM,OAAO;AAAA,MACzC,KAAK;AACH,eAAO,EAAE,GAAG,MAAM,QAAQ,MAAM,UAAU,GAAG;AAAA,MAC/C,KAAK;AAAA,MACL,KAAK;AAIH,eAAO,EAAE,GAAG,MAAM,SAAS,MAAM,WAAW,WAAW,WAAW,OAAO;AAAA,MAC3E,KAAK;AACH,eAAO,EAAE,GAAG,MAAM,gBAAgB,MAAM,kBAAkB,MAAM;AAAA,MAClE,KAAK;AAGH,eAAO,EAAE,GAAG,MAAM,SAAS,MAAM,WAAW,MAAM,oBAAoB,GAAG;AAAA,MAC3E,KAAK;AACH,eAAO;AAAA,UACL,GAAG;AAAA,UACH;AAAA,UACA;AAAA,UACA,OAAO,MAAM,SAAS;AAAA,UACtB,GAAI,QAAQ,MAAM,aAAa,MAAM,iBAAiB,WAClD,EAAE,WAAY,MAAM,aAAa,MAAM,YAAuB,IAC9D,CAAC;AAAA,UACL,GAAI,QAAQ,MAAM,eAAe,MAAM,kBAAkB,YACrD,EAAE,aAAc,MAAM,eAAe,MAAM,aAAyB,IACpE,CAAC;AAAA,UACL,GAAI,QAAQ,MAAM,cAAc,MAAM,iBAAiB,WACnD,EAAE,YAAa,MAAM,cAAc,MAAM,YAAuB,IAChE,CAAC;AAAA,QACP;AAAA,MACF,KAAK;AACH,eAAO;AAAA,UACL,GAAG;AAAA,UACH,GAAI,OAAO,MAAM,eAAe,WAAW,EAAE,SAAS,MAAM,WAAW,IAAI,CAAC;AAAA,UAC5E,GAAI,OAAO,MAAM,iBAAiB,WAAW,EAAE,WAAW,MAAM,aAAa,IAAI,CAAC;AAAA,QACpF;AAAA,MACF,KAAK;AACH,eAAO;AAAA,UACL,GAAG;AAAA,UACH,GAAI,OAAO,MAAM,eAAe,WAAW,EAAE,SAAS,MAAM,WAAW,IAAI,CAAC;AAAA,UAC5E,GAAI,OAAO,MAAM,iBAAiB,WAAW,EAAE,WAAW,MAAM,aAAa,IAAI,CAAC;AAAA,UAClF,GAAI,OAAO,MAAM,yBAAyB,WACtC,EAAE,sBAAsB,MAAM,qBAAqB,IACnD,CAAC;AAAA,UACL,GAAI,OAAO,MAAM,mBAAmB,YAChC,EAAE,gBAAgB,MAAM,eAAe,IACvC,CAAC;AAAA,QACP;AAAA,MACF,KAAK;AAKH,eAAO,EAAE,GAAG,MAAM,UAAU,UAAU;AAAA,IAC1C;AAAA,EACF;AAAA,EAEA,YAAY,OAAsB,UAAmC;AAMnE,QAAI,SAAS,aAAa,QAAQ;AAIhC,UAAI,UAAU,cAAc;AAC1B,eAAO;AAAA,UACL,UAAU;AAAA,UACV,QAAQ,KAAK,UAAU;AAAA,YACrB,oBAAoB;AAAA,cAClB,eAAe;AAAA,cACf,oBAAoB;AAAA,cACpB,0BAA0B,SAAS,UAAU;AAAA,YAC/C;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF;AAMA,UACE,UAAU,sBACV,UAAU,UACV,UAAU,kBACV,UAAU,eACV;AACA,eAAO;AAAA,UACL,UAAU;AAAA,UACV,QAAQ,KAAK,UAAU;AAAA,YACrB,UAAU;AAAA,YACV,QAAQ,SAAS,UAAU;AAAA,UAC7B,CAAC;AAAA,QACH;AAAA,MACF;AAGA,UAAI,UAAU,sBAAsB;AAClC,eAAO;AAAA,UACL,UAAU;AAAA,UACV,QAAQ,KAAK,UAAU;AAAA,YACrB,oBAAoB;AAAA,cAClB,eAAe;AAAA,cACf,mBAAmB,SAAS,UAAU;AAAA,YACxC;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF;AAGA,aAAO,EAAE,UAAU,EAAE;AAAA,IACvB;AAKA,QAAI,SAAS,aAAa,SAAS,UAAU,cAAc;AACzD,aAAO;AAAA,QACL,UAAU;AAAA,QACV,QAAQ,KAAK,UAAU;AAAA,UACrB,oBAAoB;AAAA,YAClB,eAAe;AAAA,YACf,oBAAoB;AAAA,YACpB,0BAA0B,SAAS,UAAU;AAAA,UAC/C;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAEA,QAAI,SAAS,aAAa,UAAU;AAKlC,UAAI,UAAU,gBAAgB,SAAS,cAAc;AACnD,eAAO;AAAA,UACL,UAAU;AAAA,UACV,QAAQ,KAAK,UAAU;AAAA,YACrB,oBAAoB;AAAA,cAClB,eAAe;AAAA,cACf,cAAc,SAAS;AAAA,YACzB;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF;AAIA,UAAI,UAAU,iBAAiB,SAAS,kBAAkB,QAAW;AACnE,eAAO;AAAA,UACL,UAAU;AAAA,UACV,QAAQ,KAAK,UAAU;AAAA,YACrB,oBAAoB;AAAA,cAClB,eAAe;AAAA,cACf,mBAAmB,SAAS;AAAA,YAC9B;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF;AACA,aAAO,EAAE,UAAU,EAAE;AAAA,IACvB;AAQA,QACE,SAAS,sBACR,UAAU,gBACT,UAAU,iBACV,UAAU,wBACV,UAAU,UACV,UAAU,iBACZ;AACA,aAAO;AAAA,QACL,UAAU;AAAA,QACV,QAAQ,KAAK,UAAU;AAAA,UACrB,oBAAoB;AAAA,YAClB,eAAe;AAAA,YACf,mBAAmB,SAAS;AAAA,UAC9B;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAGA,WAAO,EAAE,UAAU,EAAE;AAAA,EACvB;AAAA;AAAA;AAAA,EAKQ,gBAAgB,KAA4C;AAClE,UAAM,WAAW,IAAI,UAAU,UAAU,KAAK,EAAE,GAAG;AACnD,QAAI,aAAa,MAAO,QAAO;AAC/B,UAAM,OAAO,IAAI,UAAU;AAC3B,QAAI,CAAC,KAAM,QAAO;AAClB,WAAO,WAAW,EAAE,GAAG,MAAM,GAAG,SAAS,IAAI;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,eAAe,KAAqB,QAAsC;AAIhF,QAAI,OAAO,cAAc,UAAU,OAAO,cAAc,OAAO;AAC7D,YAAM,SAA4B,EAAE,KAAK,mBAAmB,OAAO,OAAO,EAAE,EAAE;AAC9E,YAAM,UAAkC,CAAC;AACzC,UAAI,OAAO,MAAM,SAAS,eAAe,OAAO,KAAK,cAAc;AASjE,gBAAQ,eAAe,IAAI,aAAa,OAAO,KAAK,YAAY;AAAA,MAClE;AACA,iBAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,mBAAmB,OAAO,WAAW,CAAC,CAAC,CAAC,GAAG;AAC7E,gBAAQ,CAAC,IAAI,OAAO,CAAC;AAAA,MACvB;AACA,UAAI,OAAO,KAAK,OAAO,EAAE,SAAS,EAAG,QAAO,UAAU;AACtD,UAAI,OAAO,YAAY,MAAO,QAAO,UAAU;AAC/C,aAAO;AAAA,IACT;AAEA,QAAI,UAAU,OAAO;AACrB,QAAI,OAAO,CAAC,GAAI,OAAO,QAAQ,CAAC,CAAE;AAElC,KAAC,EAAE,SAAS,KAAK,IAAI,kBAAkB,KAAK,QAAQ,KAAK,IAAI,SAAS,IAAI;AAG1E,cAAU,mBAAmB,OAAO;AACpC,WAAO,mBAAmB,IAAI;AAE9B,UAAM,QAA2B,EAAE,QAAQ;AAC3C,QAAI,KAAK,SAAS,EAAG,OAAM,OAAO;AAElC,QAAI,OAAO,OAAO,OAAO,KAAK,OAAO,GAAG,EAAE,SAAS,GAAG;AACpD,YAAM,MAA8B,CAAC;AACrC,iBAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,mBAAmB,OAAO,GAAG,CAAC,GAAG;AACnE,YAAI,CAAC,IAAI,OAAO,CAAC;AAAA,MACnB;AACA,YAAM,MAAM;AAAA,IACd;AACA,QAAI,OAAO,YAAY,MAAO,OAAM,UAAU;AAC9C,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,WACN,KACA,OACA,OACS;AACT,QAAI,CAAC,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,MAAM,KAAK,EAAG,QAAO;AAC/E,UAAM,OAAO,wBAAwB,IAAI,aAAa,cAAc,OAAO,IAAI,UAAU,EAAE;AAC3F,UAAM,SAAS,KAAK,QAAQ,OAAO,GAAG;AACtC,WAAO,MAAM,MAAM,KAAK,CAAC,OAAO,EAAE,WAAW,IAAI,QAAQ,OAAO,GAAG,MAAM,MAAM;AAAA,EACjF;AACF;AAEO,IAAM,UAAU,IAAI,iBAAiB;AAC5C,IAAO,qBAAQ;","names":[]}
|
|
@@ -76,7 +76,8 @@ var GrokCliAdapter = class extends BaseAdapter {
|
|
|
76
76
|
detectInstalled(_projectDir) {
|
|
77
77
|
const userDir = join(homedir(), ".grok");
|
|
78
78
|
const userSettings = join(userDir, "user-settings.json");
|
|
79
|
-
const
|
|
79
|
+
const siblingOnly = existsSync(join(userDir, "config.toml")) && !existsSync(userSettings);
|
|
80
|
+
const installed = existsSync(userSettings) || existsSync(userDir) && !siblingOnly;
|
|
80
81
|
return {
|
|
81
82
|
id: this.id,
|
|
82
83
|
name: this.name,
|
|
@@ -86,7 +87,7 @@ var GrokCliAdapter = class extends BaseAdapter {
|
|
|
86
87
|
// MCP + hooks both live in user-settings.json (user scope only).
|
|
87
88
|
configPath: userSettings,
|
|
88
89
|
scope: "user",
|
|
89
|
-
reason: installed ? `found Grok CLI config at ${userSettings}` : `no Grok CLI config at ${userDir}`,
|
|
90
|
+
reason: installed ? `found Grok CLI config at ${userSettings}` : siblingOnly ? `${userDir} holds only Grok Build's config.toml` : `no Grok CLI config at ${userDir}`,
|
|
90
91
|
confidence: installed ? "high" : "low"
|
|
91
92
|
};
|
|
92
93
|
}
|
|
@@ -479,4 +480,4 @@ export {
|
|
|
479
480
|
adapter,
|
|
480
481
|
grok_cli_default as default
|
|
481
482
|
};
|
|
482
|
-
//# sourceMappingURL=grok-cli-
|
|
483
|
+
//# sourceMappingURL=grok-cli-UUNPOUYY.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/adapters/grok-cli/index.ts"],"sourcesContent":["/**\n * adapters/grok-cli — Grok CLI (the community superagent-ai/grok-cli, npm\n * `grok-dev`, bin `grok`, MIT) platform adapter for agent-connector.\n *\n * Disambiguation: id is `grok-cli` (NOT `grok`) to keep it distinct from xAI's\n * separate \"Grok Build\" product. This adapter targets the OPEN-SOURCE community\n * CLI only — byte-confirmed against its source on 2026-06-21:\n * - package.json → name \"grok-dev\", bin { \"grok\": \"dist/index.js\" }, MIT.\n * - src/utils/settings.ts → USER settings at ~/.grok/user-settings.json\n * (USER_SETTINGS_PATH = join(homedir(), \".grok\", \"user-settings.json\")).\n *\n * Grok CLI is a **json-stdio** host. Its native surfaces are USER-SCOPE ONLY and\n * BOTH live in the SAME file (~/.grok/user-settings.json):\n *\n * 1. MCP servers — under the NESTED key `mcp.servers`, which is a JSON **ARRAY**\n * of McpServerConfig objects (NOT a top-level `mcpServers` keyed object map —\n * the README's casual \"(mcpServers)\" wording is misleading; the source reads\n * `loadUserSettings().mcp?.servers`). Each entry:\n * { id, label, enabled, transport: \"stdio\"|\"http\"|\"sse\",\n * url?, headers?, command?, args?, env?, cwd? }\n * (src/utils/settings.ts `McpServerConfig`). We key entries on `id` =\n * connector id (mirrors continue's array-by-name merge, but JSON not YAML).\n * Project `.grok/settings.json` holds ONLY { model, sandboxMode, sandbox,\n * lsp } — NO mcp, NO hooks — so this adapter is user-scope.\n *\n * 2. Hooks — under the top-level `hooks` key (Claude NESTED-rule shape:\n * { hooks: { <Event>: [ { matcher?, hooks:[{ type:\"command\", command,\n * timeout? }] } ] } }), loaded from user-settings.json ONLY (project-level\n * hooks are DELIBERATELY excluded by Grok for security — a committed repo\n * file must not execute unsandboxed host commands). So `hooks` is wired\n * through the SAME shared object-map hook-merge engine droid/claude use.\n *\n * Supported hook events (byte-confirmed src/hooks/types.ts HOOK_EVENTS): the\n * Grok set is a SUPERSET of our canonical names plus host-specific ones. We wire\n * the canonical events Grok fires (PascalCase, 1:1): PreToolUse, PostToolUse,\n * PostToolUseFailure, UserPromptSubmit, SessionStart, SessionEnd, Stop,\n * SubagentStart, SubagentStop, PreCompact, PostCompact, Notification. Grok also\n * fires StopFailure, TaskCreated, TaskCompleted, InstructionsLoaded, CwdChanged\n * (no canonical analog — they ride the nativeHooks passthrough) and has no\n * PermissionRequest event (warn/skip at install).\n *\n * Stdin wire field names DIFFER from Claude's in two false-friend spots\n * (byte-confirmed src/hooks/types.ts): UserPromptSubmit carries `user_prompt`\n * (NOT `prompt`), and PostToolUse carries `tool_output` (NOT `tool_response`).\n * PostToolUseFailure/StopFailure carry `error` (string); SubagentStart/Stop carry\n * `agent_type` + `description`; SessionStart carries `source`; PreCompact/\n * PostCompact carry `trigger`; Notification carries `message`. `session_id` is\n * optional; `cwd` is always present.\n *\n * Reply protocol (byte-confirmed src/hooks/executor.ts aggregateHookResults):\n * stdout is parsed as JSON when it starts with `{`. A hook BLOCKS via either\n * exit code 2 OR a stdout `{ \"decision\": \"block\" }`; `{ \"decision\": \"approve\" }`\n * explicitly approves; `additionalContext` is injected as context; `continue:\n * false` + `stopReason` prevents continuation. We emit exit 0 + a structured\n * stdout object (so the JSON is always parsed): deny → {decision:\"block\",reason};\n * context → {additionalContext}. Grok has no \"ask\"/\"modify\" reply path — those\n * degrade to a plain exit-0 passthrough (canModifyArgs/Output stay false).\n *\n * Env handling: Grok documents no native ${VAR} server interpolation, so env/\n * header/url refs resolve to literals at install time via resolveEnvRefsDeep\n * (the safe default matching continue/droid).\n */\n\nimport { existsSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nimport { BaseAdapter, type HookMergeDescriptor } from \"../base.js\";\nimport type { Adapter, HookReply, InstallContext, NormalizedEvent } from \"../spi.js\";\nimport type {\n ChangeRecord,\n DetectedPlatform,\n HealthCheck,\n HookEventName,\n HookParadigm,\n HookResponse,\n NotificationEvent,\n PlatformCapabilities,\n PlatformId,\n PostCompactEvent,\n PostToolUseEvent,\n PostToolUseFailureEvent,\n PreCompactEvent,\n PreToolUseEvent,\n ServerDef,\n SessionEndEvent,\n SessionStartEvent,\n StopEvent,\n SubagentStartEvent,\n SubagentStopEvent,\n Transport,\n UserPromptSubmitEvent,\n} from \"../../core/types.js\";\nimport { resolveEnvRefsDeep } from \"../../core/interpolate.js\";\nimport { buildWrappedStdio, isHomeBinHookCommand } from \"../../core/spawn.js\";\nimport { normalizeSessionSource } from \"../claude-code/wire.js\";\n\nconst HOST: PlatformId = \"grok-cli\";\n\n/**\n * Canonical events Grok fires (PascalCase, 1:1 with our names). PermissionRequest\n * is absent from Grok's HOOK_EVENTS, so it warn/skips at install. The host-only\n * events (StopFailure, TaskCreated, TaskCompleted, InstructionsLoaded, CwdChanged)\n * have no canonical analog and ride the nativeHooks passthrough.\n */\nconst SUPPORTED_EVENTS: ReadonlySet<HookEventName> = new Set<HookEventName>([\n \"PreToolUse\",\n \"PostToolUse\",\n \"PostToolUseFailure\",\n \"UserPromptSubmit\",\n \"SessionStart\",\n \"SessionEnd\",\n \"Stop\",\n \"SubagentStart\",\n \"SubagentStop\",\n \"PreCompact\",\n \"PostCompact\",\n \"Notification\",\n]);\n\n/**\n * Native MCP server entry shape (src/utils/settings.ts `McpServerConfig`). The\n * array lives at `mcp.servers`. `id`/`label`/`enabled`/`transport` are required;\n * stdio carries command/args/env/cwd, remote carries url/headers.\n */\ninterface GrokMcpServer {\n id: string;\n label: string;\n enabled: boolean;\n transport: Transport;\n url?: string;\n headers?: Record<string, string>;\n command?: string;\n args?: string[];\n env?: Record<string, string>;\n cwd?: string;\n}\n\n/** The shape of user-settings.json (only the parts this adapter touches). */\ninterface GrokUserSettings {\n mcp?: { servers?: GrokMcpServer[] };\n hooks?: Record<string, GrokHookEntry[]>;\n [key: string]: unknown;\n}\n\n/** A single Grok native hook registration entry (Claude-shaped, nested). */\ninterface GrokHookEntry {\n matcher?: string;\n hooks: Array<{ type: \"command\"; command: string; timeout?: number }>;\n}\n\n/** Raw Grok CLI hook stdin payload (snake_case; field names per src/hooks/types.ts). */\ninterface GrokWireInput {\n hook_event_name?: string;\n session_id?: string;\n cwd?: string;\n tool_name?: string;\n tool_input?: Record<string, unknown>;\n /** PostToolUse — NOTE Grok sends `tool_output` (NOT Claude's `tool_response`). */\n tool_output?: unknown;\n /** PostToolUseFailure / StopFailure — the captured error message (string). */\n error?: unknown;\n /** UserPromptSubmit — NOTE Grok sends `user_prompt` (NOT Claude's `prompt`). */\n user_prompt?: unknown;\n /** SessionStart — startup | resume | clear. */\n source?: string;\n /** PreCompact / PostCompact — auto | manual. */\n trigger?: \"auto\" | \"manual\";\n /** Notification — the user-facing message. */\n message?: unknown;\n /** SubagentStart / SubagentStop / TaskCreated / TaskCompleted. */\n agent_type?: unknown;\n description?: unknown;\n /** Injected by the entrypoint so the runtime knows which connector to dispatch. */\n connector?: unknown;\n}\n\nexport class GrokCliAdapter extends BaseAdapter implements Adapter {\n readonly id: PlatformId = HOST;\n readonly name = \"Grok CLI\";\n readonly paradigm: HookParadigm = \"json-stdio\";\n\n readonly capabilities: PlatformCapabilities = {\n // Memory surface: Grok reads AGENTS.md (\"merged from git root down to your\n // cwd; AGENTS.override.md wins per directory\" — README). The BaseAdapter\n // AGENTS.md-first default handles it.\n supportsMemory: true,\n preToolUse: true,\n postToolUse: true,\n postToolUseFailure: true,\n userPromptSubmit: true,\n sessionStart: true,\n sessionEnd: true,\n stop: true,\n notification: true,\n preCompact: true,\n // Grok fires PostCompact (its HOOK_EVENTS lists it beside PreCompact).\n postCompact: true,\n // Grok fires SubagentStart AND SubagentStop (both in HOOK_EVENTS).\n subagentStart: true,\n subagentStop: true,\n // No PermissionRequest event in Grok's HOOK_EVENTS → warn/skip at install.\n // Grok's reply protocol is block/approve/context only — it cannot rewrite\n // tool args or already-emitted output.\n canModifyArgs: false,\n canModifyOutput: false,\n // Grok injects `additionalContext` from a hook's stdout JSON.\n canInjectSessionContext: true,\n // Grok's settings.json hook keys are free-form event names (its HOOK_EVENTS\n // superset includes StopFailure/TaskCreated/TaskCompleted/InstructionsLoaded/\n // CwdChanged with no canonical analog), so any host event declared under\n // platforms[\"grok-cli\"].nativeHooks installs verbatim.\n supportsNativeHooks: true,\n // MCP entry supports stdio + remote (http / sse) per McpServerConfig.transport.\n transports: [\"stdio\", \"http\", \"sse\"],\n };\n\n // ── Detection ────────────────────────────────────────────────────────────\n\n detectInstalled(_projectDir: string): DetectedPlatform {\n const userDir = join(homedir(), \".grok\");\n const userSettings = join(userDir, \"user-settings.json\");\n // SIBLING BOW-OUT: xAI's Grok Build (adapter id `grok-build`) is an\n // UNRELATED product that also defaults to ~/.grok, so the bare directory no\n // longer proves this community CLI is installed. Each adapter owns an\n // exclusive marker file — grok-cli `user-settings.json`, Grok Build\n // `config.toml` — and claims the shared dir only when the sibling's marker\n // is not the sole occupant. Without this, a Grok-Build-only machine would\n // report Grok CLI as installed and install into a config it never reads.\n const siblingOnly = existsSync(join(userDir, \"config.toml\")) && !existsSync(userSettings);\n const installed = existsSync(userSettings) || (existsSync(userDir) && !siblingOnly);\n return {\n id: this.id,\n name: this.name,\n installed,\n paradigm: this.paradigm,\n capabilities: this.capabilities,\n // MCP + hooks both live in user-settings.json (user scope only).\n configPath: userSettings,\n scope: \"user\",\n reason: installed\n ? `found Grok CLI config at ${userSettings}`\n : siblingOnly\n ? `${userDir} holds only Grok Build's config.toml`\n : `no Grok CLI config at ${userDir}`,\n confidence: installed ? \"high\" : \"low\",\n };\n }\n\n // ── Native paths ───────────────────────────────────────────────────────────\n // BOTH MCP servers (mcp.servers array) and hooks (top-level hooks map) live in\n // the SAME user-settings.json. Project .grok/settings.json holds neither, so\n // every scope resolves to the user file.\n\n getConfigDir(_ctx: InstallContext): string {\n return join(homedir(), \".grok\");\n }\n\n getServerConfigPath(ctx: InstallContext): string {\n return join(this.getConfigDir(ctx), \"user-settings.json\");\n }\n\n getHookConfigPath(ctx: InstallContext): string {\n return join(this.getConfigDir(ctx), \"user-settings.json\");\n }\n\n // ── MCP server install / uninstall (JSON — nested mcp.servers ARRAY) ───────\n\n installServer(ctx: InstallContext): ChangeRecord[] {\n const { connector, dryRun } = ctx;\n const path = this.getServerConfigPath(ctx);\n const override = connector.platforms[HOST]?.server;\n if (!connector.server || override === false) {\n return [\n {\n platform: this.id,\n action: \"skip\",\n path,\n detail: connector.server\n ? \"server registration disabled for grok-cli\"\n : \"connector declares no MCP server\",\n },\n ];\n }\n\n const symlink = this.symlinkPathWarning(path);\n if (symlink) return [symlink];\n\n // Shallow-merge any per-platform server override into the base ServerDef.\n const server: ServerDef =\n override && typeof override === \"object\"\n ? { ...connector.server, ...override }\n : connector.server;\n const entry = this.renderServerEntry(ctx, server);\n\n // OVERWRITE GUARD: never round-trip a present-but-unparseable file into `{}`.\n if (this.isPresentButUnparseable(path)) {\n return [\n {\n platform: this.id,\n action: \"warn\",\n path,\n detail: `existing ${path} is not parseable; left untouched (back it up / fix it, then re-run)`,\n },\n ];\n }\n const cfg = this.readJson<GrokUserSettings>(path) ?? {};\n\n // NEVER clobber a malformed mcp.servers: if `mcp` exists but is not an object,\n // or `mcp.servers` exists but is not an array, WARN + write nothing (leave the\n // user's hand-edited value) rather than silently replacing it.\n const existingMcp = cfg.mcp;\n if (existingMcp !== undefined && (typeof existingMcp !== \"object\" || Array.isArray(existingMcp))) {\n return [{ platform: this.id, action: \"warn\", path, detail: \"mcp is not an object — left untouched (manual fix needed)\" }];\n }\n const existingServers = existingMcp?.servers;\n if (existingServers !== undefined && !Array.isArray(existingServers)) {\n return [{ platform: this.id, action: \"warn\", path, detail: \"mcp.servers is not an array — left untouched (manual fix needed)\" }];\n }\n\n const list: GrokMcpServer[] = Array.isArray(existingServers) ? [...existingServers] : [];\n const idx = list.findIndex((e) => e?.id === connector.id);\n\n let action: ChangeRecord[\"action\"];\n if (idx < 0) {\n list.push(entry);\n action = \"create\";\n } else if (JSON.stringify(list[idx]) === JSON.stringify(entry)) {\n action = \"skip\";\n } else {\n list[idx] = entry;\n action = \"update\";\n }\n\n if (action !== \"skip\") {\n cfg.mcp = { ...(existingMcp ?? {}), servers: list };\n this.writeJson(path, cfg, dryRun);\n }\n return [{ platform: this.id, action, path, detail: `mcp.servers[id=${connector.id}]` }];\n }\n\n uninstallServer(ctx: InstallContext): ChangeRecord[] {\n const { connector, dryRun } = ctx;\n const path = this.getServerConfigPath(ctx);\n const symlink = this.symlinkPathWarning(path);\n if (symlink) return [symlink];\n\n const cfg = this.readJson<GrokUserSettings>(path);\n const rawList = cfg?.mcp?.servers;\n if (!cfg || !Array.isArray(rawList)) {\n return [{ platform: this.id, action: \"skip\", path, detail: `mcp.servers[id=${connector.id}] absent` }];\n }\n\n const list = rawList as GrokMcpServer[];\n const kept = list.filter((e) => e?.id !== connector.id);\n if (kept.length === list.length) {\n return [{ platform: this.id, action: \"skip\", path, detail: `mcp.servers[id=${connector.id}] absent` }];\n }\n\n cfg.mcp = { ...cfg.mcp, servers: kept };\n this.writeJson(path, cfg, dryRun);\n return [{ platform: this.id, action: \"remove\", path, detail: `mcp.servers[id=${connector.id}]` }];\n }\n\n /** Render a normalized ServerDef into Grok's native McpServerConfig entry. */\n private renderServerEntry(ctx: InstallContext, server: ServerDef): GrokMcpServer {\n const transport: Transport = server.transport;\n const enabled = server.enabled !== false;\n const id = ctx.connector.id;\n // `label` is a required display field; reuse the connector displayName.\n const label = ctx.connector.displayName?.trim() || id;\n\n if (transport === \"stdio\") {\n let command = server.command ?? \"\";\n let args = [...(server.args ?? [])];\n\n // Transparent telemetry wrapping: route the real command through\n // `<homeBin> serve --connector <id> -- <command> <args...>`.\n ({ command, args } = buildWrappedStdio(ctx, server, this.id, command, args));\n\n const entry: GrokMcpServer = {\n id,\n label,\n enabled,\n transport: \"stdio\",\n command: resolveEnvRefsDeep(command),\n };\n if (args.length > 0) entry.args = resolveEnvRefsDeep(args);\n const env = this.renderEnv(server.env);\n if (env) entry.env = env;\n if (typeof server.cwd === \"string\" && server.cwd.length > 0) {\n entry.cwd = resolveEnvRefsDeep(server.cwd);\n }\n return entry;\n }\n\n // Remote (http / sse) — Grok registers a URL (+ optional headers). `ws` has no\n // Grok analog; fall back to http (the closest remote shape Grok validates).\n const entry: GrokMcpServer = {\n id,\n label,\n enabled,\n transport: transport === \"sse\" ? \"sse\" : \"http\",\n url: resolveEnvRefsDeep(server.url ?? \"\"),\n };\n const headers = this.renderEnv(server.headers);\n if (headers) entry.headers = headers;\n return entry;\n }\n\n /**\n * Render env/header values. Grok documents no native ${VAR} server\n * interpolation, so resolve `${env:VAR}` references to literals at install\n * time (the safe path; matches continue/droid).\n */\n private renderEnv(\n env: Record<string, string> | undefined,\n ): Record<string, string> | undefined {\n if (!env || Object.keys(env).length === 0) return undefined;\n return resolveEnvRefsDeep({ ...env });\n }\n\n // ── Hook install / uninstall (top-level hooks, Claude nested-rule shape) ───\n\n installHooks(ctx: InstallContext): ChangeRecord[] {\n const { connector } = ctx;\n const override = connector.platforms[HOST];\n\n // `hooks: false` disables only the NORMALIZED hooks; nativeHooks is a\n // sibling grok-cli-scoped declaration that installs regardless.\n const normalizedEvents = override?.hooks === false ? [] : connector.hookEvents;\n const nativeHooks = override?.nativeHooks ?? {};\n const nativeEvents = Object.keys(nativeHooks);\n\n if (normalizedEvents.length === 0 && nativeEvents.length === 0) {\n return [\n {\n platform: this.id,\n action: \"skip\",\n detail:\n override?.hooks === false\n ? \"hooks disabled for grok-cli\"\n : \"connector declares no hooks\",\n },\n ];\n }\n\n const pending = normalizedEvents.map((event) => ({\n event: event as string,\n matcher: connector.hooks[event]?.matcher ?? \"\",\n }));\n const native = nativeEvents.map((event) => ({\n event,\n matcher: nativeHooks[event]?.matcher ?? \"\",\n }));\n\n return this.upsertHookEntries(\n ctx,\n this.getHookConfigPath(ctx),\n pending,\n this.hookDescriptor(ctx),\n native,\n );\n }\n\n uninstallHooks(ctx: InstallContext): ChangeRecord[] {\n return this.removeHookEntries(ctx, this.getHookConfigPath(ctx), this.hookDescriptor(ctx));\n }\n\n /**\n * Grok's hook-merge descriptor (NESTED shape `{ matcher?, hooks: [...] }`).\n * Connector-generic ownership (any of our home-bin commands in the inner\n * `hooks`), matching droid:\n * - mapEvent drops events outside SUPPORTED_EVENTS (Grok has no\n * PermissionRequest); supported events map 1:1 (PascalCase identical);\n * - the native pass installs free-form host-only event keys verbatim;\n * - uninstall = inner-strip ONLY (ownsEntryForRemove never-true).\n */\n private hookDescriptor(ctx: InstallContext): HookMergeDescriptor<GrokHookEntry> {\n const stripInner = (c: InstallContext) => (entry: GrokHookEntry) => {\n const innerBefore = entry.hooks?.length ?? 0;\n const inner = (entry.hooks ?? []).filter((h) => !this.isOurCommand(h.command, c));\n return {\n next: inner.length > 0 ? { matcher: entry.matcher ?? \"\", hooks: inner } : null,\n removed: innerBefore - inner.length,\n };\n };\n return {\n mapEvent: (e) => (SUPPORTED_EVENTS.has(e as HookEventName) ? e : undefined),\n unmappedWarnDetail: (e) => `${e} has no Grok CLI hook equivalent — skipped`,\n renderEntry: (_event, matcher, command) => ({\n matcher,\n hooks: [{ type: \"command\", command }],\n }),\n entryOwnsCommand: (entry, _command) =>\n (entry.hooks ?? []).some((h) => this.isOurCommand(h.command, ctx)),\n nativeOwnsCommand: (entry, command) =>\n (entry.hooks ?? []).some((h) => h.command === command),\n ownsEntryForRemove: () => () => false,\n stripInner,\n skipDetail: (event) => `hooks.${event} already registered`,\n removeDetail: (event, removed) => `hooks.${event} (${removed})`,\n nativeSkipDetail: (event) => `hooks.${event} already registered (native)`,\n nativeMutateDetail: (event) => `hooks.${event} (native)`,\n absentDetail: \"no hooks section present\",\n noMatchDetail: \"no matching hook entries\",\n };\n }\n\n /** True when a hook command references our home binary AND this connector id. */\n private isOurCommand(command: string | undefined, ctx: InstallContext): boolean {\n return isHomeBinHookCommand(command, ctx.homeBinPath, ctx.connector.id);\n }\n\n // ── Diagnostics ──────────────────────────────────────────────────────────\n\n override getHealthChecks(ctx: InstallContext): readonly HealthCheck[] {\n const path = this.getServerConfigPath(ctx);\n const connectorId = ctx.connector.id;\n const homeBin = ctx.homeBinPath;\n const hookEvents = ctx.connector.hookEvents;\n return [\n {\n name: `${this.name}: user-settings.json present`,\n check: () =>\n existsSync(path)\n ? { status: \"OK\", detail: path }\n : { status: \"FAIL\", detail: `not found: ${path}` },\n },\n {\n name: `${this.name}: server entry registered`,\n check: () => {\n if (!ctx.connector.server) {\n return { status: \"OK\", detail: \"no MCP server declared\" };\n }\n const cfg = this.readJson<GrokUserSettings>(path);\n const list = cfg?.mcp?.servers;\n if (!cfg || !Array.isArray(list)) {\n return { status: \"FAIL\", detail: `no mcp.servers array in ${path}` };\n }\n return list.some((e) => e?.id === connectorId)\n ? { status: \"OK\", detail: `mcp.servers[id=${connectorId}] present` }\n : { status: \"FAIL\", detail: `no mcp.servers[id=${connectorId}] in ${path}` };\n },\n },\n {\n name: `${this.name}: hook command registered`,\n check: () => {\n if (hookEvents.length === 0) {\n return { status: \"OK\", detail: \"no hooks declared\" };\n }\n const cfg = this.readJson<GrokUserSettings>(path);\n const hooks = cfg?.hooks ?? {};\n const registered = Object.values(hooks).some((entries) =>\n (entries ?? []).some((e) =>\n (e.hooks ?? []).some((h) => isHomeBinHookCommand(h.command, homeBin, connectorId)),\n ),\n );\n return registered\n ? { status: \"OK\", detail: \"hook command present\" }\n : { status: \"FAIL\", detail: `no hook for ${connectorId} in ${path}` };\n },\n },\n ];\n }\n\n // ── Runtime: parse Grok stdin JSON → normalized event ──────────────────────\n\n parseEvent(event: HookEventName, raw: unknown): NormalizedEvent {\n const input = (raw ?? {}) as GrokWireInput;\n const connectorId = typeof input.connector === \"string\" ? input.connector : \"\";\n const sessionId = typeof input.session_id === \"string\" ? input.session_id : \"\";\n const projectDir = typeof input.cwd === \"string\" ? input.cwd : undefined;\n\n const base = {\n hostPlatform: HOST,\n connectorId,\n sessionId,\n raw,\n ...(projectDir !== undefined ? { projectDir } : {}),\n } as const;\n\n switch (event) {\n case \"PreToolUse\": {\n const ev: PreToolUseEvent = {\n ...base,\n toolName: typeof input.tool_name === \"string\" ? input.tool_name : \"\",\n toolInput: input.tool_input ?? {},\n };\n return ev;\n }\n case \"PostToolUse\": {\n // Grok sends `tool_output` (NOT Claude's `tool_response`).\n const ev: PostToolUseEvent = {\n ...base,\n toolName: typeof input.tool_name === \"string\" ? input.tool_name : \"\",\n toolInput: input.tool_input ?? {},\n ...(toolOutputToString(input.tool_output) !== undefined\n ? { toolOutput: toolOutputToString(input.tool_output) }\n : {}),\n };\n return ev;\n }\n case \"PostToolUseFailure\": {\n const ev: PostToolUseFailureEvent = {\n ...base,\n toolName: typeof input.tool_name === \"string\" ? input.tool_name : \"\",\n toolInput: input.tool_input ?? {},\n error: typeof input.error === \"string\" ? input.error : \"\",\n };\n return ev;\n }\n case \"UserPromptSubmit\": {\n // Grok sends `user_prompt` (NOT Claude's `prompt`).\n const ev: UserPromptSubmitEvent = {\n ...base,\n prompt: typeof input.user_prompt === \"string\" ? input.user_prompt : \"\",\n };\n return ev;\n }\n case \"SessionStart\": {\n const ev: SessionStartEvent = {\n ...base,\n source: normalizeSessionSource(input.source),\n };\n return ev;\n }\n case \"SessionEnd\": {\n const ev: SessionEndEvent = { ...base };\n return ev;\n }\n case \"Stop\": {\n const ev: StopEvent = { ...base };\n return ev;\n }\n case \"Notification\": {\n const ev: NotificationEvent = {\n ...base,\n message: typeof input.message === \"string\" ? input.message : \"\",\n };\n return ev;\n }\n case \"PreCompact\": {\n const ev: PreCompactEvent = {\n ...base,\n ...(input.trigger === \"auto\" || input.trigger === \"manual\"\n ? { trigger: input.trigger }\n : {}),\n };\n return ev;\n }\n case \"PostCompact\": {\n const ev: PostCompactEvent = {\n ...base,\n ...(input.trigger === \"auto\" || input.trigger === \"manual\"\n ? { trigger: input.trigger }\n : {}),\n };\n return ev;\n }\n case \"SubagentStart\": {\n const ev: SubagentStartEvent = {\n ...base,\n ...(typeof input.agent_type === \"string\" ? { agentType: input.agent_type } : {}),\n };\n return ev;\n }\n case \"SubagentStop\": {\n const ev: SubagentStopEvent = {\n ...base,\n ...(typeof input.agent_type === \"string\" ? { agentType: input.agent_type } : {}),\n };\n return ev;\n }\n default: {\n // Grok never delivers PermissionRequest (no native equivalent — see\n // SUPPORTED_EVENTS). Surface a dispatch of one loudly rather than\n // silently mis-parse.\n throw new Error(`unsupported grok-cli hook event: ${String(event)}`);\n }\n }\n }\n\n // ── Runtime: normalized response → Grok native hook reply ──────────────────\n // Grok parses stdout as JSON when it starts with `{` and aggregates:\n // decision:\"block\" (or exit 2) → block; decision:\"approve\" → approve;\n // additionalContext → injected context; continue:false + stopReason → halt.\n // We emit exit 0 + a structured stdout object so the JSON is always parsed.\n\n formatReply(_event: HookEventName, response: HookResponse): HookReply {\n const decision = response.decision ?? \"allow\";\n\n // deny → block the action with a reason (decision:\"block\").\n if (decision === \"deny\") {\n return this.stdout({ decision: \"block\", reason: response.reason ?? \"Blocked by hook\" });\n }\n\n // context → inject soft guidance (Grok honors additionalContext).\n if (decision === \"context\" && response.additionalContext) {\n return this.stdout({ additionalContext: response.additionalContext });\n }\n\n // allow / modify (unsupported) / ask (no Grok analog) / void → passthrough.\n return { exitCode: 0 };\n }\n\n private stdout(payload: unknown): HookReply {\n return { exitCode: 0, stdout: JSON.stringify(payload) };\n }\n}\n\n/** Coerce a Grok PostToolUse `tool_output` into a string for the normalized event. */\nfunction toolOutputToString(value: unknown): string | undefined {\n if (value == null) return undefined;\n if (typeof value === \"string\") return value;\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n\nexport const adapter = new GrokCliAdapter();\nexport default adapter;\n"],"mappings":"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","names":["entry"]}
|
|
@@ -1,22 +1,22 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
fail
|
|
4
|
-
} from "./chunk-
|
|
5
|
-
import "./chunk-
|
|
4
|
+
} from "./chunk-SA6CSOH5.js";
|
|
5
|
+
import "./chunk-4YOYR3T5.js";
|
|
6
6
|
import "./chunk-OP4KBXUO.js";
|
|
7
7
|
import "./chunk-GDIAHWNY.js";
|
|
8
|
-
import "./chunk-
|
|
8
|
+
import "./chunk-KY2VQGD7.js";
|
|
9
9
|
import {
|
|
10
10
|
isNativeHookDeclared,
|
|
11
11
|
runHook,
|
|
12
12
|
runNativeHook
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-CZOXXS77.js";
|
|
14
14
|
import "./chunk-IVAWP6HH.js";
|
|
15
15
|
import "./chunk-KHO5WNTP.js";
|
|
16
16
|
import "./chunk-4NFDNY3C.js";
|
|
17
|
-
import "./chunk-
|
|
18
|
-
import "./chunk-
|
|
19
|
-
import "./chunk-
|
|
17
|
+
import "./chunk-R4FABNAL.js";
|
|
18
|
+
import "./chunk-6FRAVOVF.js";
|
|
19
|
+
import "./chunk-XJSVJD5T.js";
|
|
20
20
|
import "./chunk-NBYKLUF6.js";
|
|
21
21
|
import "./chunk-QSY74NAP.js";
|
|
22
22
|
import "./chunk-UMQ6NBQR.js";
|
|
@@ -94,4 +94,4 @@ export {
|
|
|
94
94
|
HOOK_EVENTS,
|
|
95
95
|
run
|
|
96
96
|
};
|
|
97
|
-
//# sourceMappingURL=hook-
|
|
97
|
+
//# sourceMappingURL=hook-M3KQSEO3.js.map
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
export { C as ConnectorConfigError, d as defineAction, a as defineCommand, b as defineConfigPatch, c as defineConnector, e as defineHook, f as defineMemory, g as defineNativeHook, h as defineSkill, i as defineStatusline, j as defineSubagent } from './define-connector-
|
|
2
|
-
import { S as ServerDef, M as McpPackageIdentity, R as ResolvedMcpPackageIdentity } from './types-
|
|
3
|
-
export { A as ActionDef, a as ActionResult, b as AuthSpec, C as ChangeRecord, c as ConnectorConfig, D as DetectedPlatform, d as DiagnosticResult, E as EventPayloadMap, H as HookDefinition, e as HookEventName, f as HookParadigm, g as HookResponse, h as HooksConfig, i as HostCtx, I as InstallResult, j as InstallScope, k as MemoryDef, N as NativeHookDef, l as NativeHookEvent, m as NotificationEvent, P as PermissionRequestEvent, n as PlatformCapabilities, o as PlatformId, p as PlatformMemoryOverride, q as PlatformOverride, r as PostToolUseEvent, s as PostToolUseFailureEvent, t as PreCompactEvent, u as PreToolUseEvent, v as ResolvedConnector, w as SessionEndEvent, x as SessionStartEvent, y as StatuslineContext, z as StatuslineDef, B as StopEvent, F as SubagentStartEvent, G as SubagentStopEvent, T as TelemetryAccessor, J as TelemetryConfig, K as TelemetryUsageSummary, L as ToolFilter, O as Transport, U as UserPromptSubmitEvent } from './types-
|
|
1
|
+
export { C as ConnectorConfigError, d as defineAction, a as defineCommand, b as defineConfigPatch, c as defineConnector, e as defineHook, f as defineMemory, g as defineNativeHook, h as defineSkill, i as defineStatusline, j as defineSubagent } from './define-connector-iosc34CA.js';
|
|
2
|
+
import { S as ServerDef, M as McpPackageIdentity, R as ResolvedMcpPackageIdentity } from './types-CAKApZpX.js';
|
|
3
|
+
export { A as ActionDef, a as ActionResult, b as AuthSpec, C as ChangeRecord, c as ConnectorConfig, D as DetectedPlatform, d as DiagnosticResult, E as EventPayloadMap, H as HookDefinition, e as HookEventName, f as HookParadigm, g as HookResponse, h as HooksConfig, i as HostCtx, I as InstallResult, j as InstallScope, k as MemoryDef, N as NativeHookDef, l as NativeHookEvent, m as NotificationEvent, P as PermissionRequestEvent, n as PlatformCapabilities, o as PlatformId, p as PlatformMemoryOverride, q as PlatformOverride, r as PostToolUseEvent, s as PostToolUseFailureEvent, t as PreCompactEvent, u as PreToolUseEvent, v as ResolvedConnector, w as SessionEndEvent, x as SessionStartEvent, y as StatuslineContext, z as StatuslineDef, B as StopEvent, F as SubagentStartEvent, G as SubagentStopEvent, T as TelemetryAccessor, J as TelemetryConfig, K as TelemetryUsageSummary, L as ToolFilter, O as Transport, U as UserPromptSubmitEvent } from './types-CAKApZpX.js';
|
|
4
4
|
|
|
5
5
|
/** Derive the host-facing MCP server key from a package name. */
|
|
6
6
|
declare function deriveHostAliasFromPackageName(packageName: string): string | undefined;
|
package/dist/index.js
CHANGED
|
@@ -15,8 +15,8 @@ import {
|
|
|
15
15
|
deriveHostAliasFromPackageName,
|
|
16
16
|
inferNpmPackageFromServer,
|
|
17
17
|
resolveMcpPackageIdentity
|
|
18
|
-
} from "./chunk-
|
|
19
|
-
import "./chunk-
|
|
18
|
+
} from "./chunk-6FRAVOVF.js";
|
|
19
|
+
import "./chunk-XJSVJD5T.js";
|
|
20
20
|
import "./chunk-NBYKLUF6.js";
|
|
21
21
|
import "./chunk-UMQ6NBQR.js";
|
|
22
22
|
import "./chunk-GZGLCCEE.js";
|
|
@@ -3,10 +3,10 @@ import {
|
|
|
3
3
|
installConnector,
|
|
4
4
|
installViaMarketplace,
|
|
5
5
|
parseInstallMethod
|
|
6
|
-
} from "./chunk-
|
|
7
|
-
import "./chunk-
|
|
8
|
-
import "./chunk-
|
|
9
|
-
import "./chunk-
|
|
6
|
+
} from "./chunk-XSR3GF55.js";
|
|
7
|
+
import "./chunk-JUBEM3OR.js";
|
|
8
|
+
import "./chunk-CWUPIT72.js";
|
|
9
|
+
import "./chunk-KOFCNA5T.js";
|
|
10
10
|
import "./chunk-XY3N2U6L.js";
|
|
11
11
|
import "./chunk-OPXAP3AC.js";
|
|
12
12
|
import {
|
|
@@ -17,16 +17,16 @@ import {
|
|
|
17
17
|
parseTargets,
|
|
18
18
|
print,
|
|
19
19
|
renderInstallResult
|
|
20
|
-
} from "./chunk-
|
|
20
|
+
} from "./chunk-SA6CSOH5.js";
|
|
21
21
|
import "./chunk-GDIAHWNY.js";
|
|
22
|
-
import "./chunk-
|
|
22
|
+
import "./chunk-KY2VQGD7.js";
|
|
23
23
|
import "./chunk-KHO5WNTP.js";
|
|
24
24
|
import {
|
|
25
25
|
findConnectorConfig,
|
|
26
26
|
loadConnectorFromPath
|
|
27
|
-
} from "./chunk-
|
|
28
|
-
import "./chunk-
|
|
29
|
-
import "./chunk-
|
|
27
|
+
} from "./chunk-R4FABNAL.js";
|
|
28
|
+
import "./chunk-6FRAVOVF.js";
|
|
29
|
+
import "./chunk-XJSVJD5T.js";
|
|
30
30
|
import "./chunk-NBYKLUF6.js";
|
|
31
31
|
import "./chunk-H53QZQJI.js";
|
|
32
32
|
import "./chunk-BEFVJ2OE.js";
|
|
@@ -543,4 +543,4 @@ async function run(argv) {
|
|
|
543
543
|
export {
|
|
544
544
|
run
|
|
545
545
|
};
|
|
546
|
-
//# sourceMappingURL=install-
|
|
546
|
+
//# sourceMappingURL=install-4X4JDKGY.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/usage/readers/kilo.ts"],"sourcesContent":["/**\n * usage/readers/kilo — Kilo Code (VS Code extension) task-log reader.\n *\n * Faithful port of tokscale sessions/kilocode.rs, which is a one-line wrapper\n * around the shared `parse_roo_kilo_file(path, \"kilocode\")` Cline-fork task-log\n * parser — the format is identical across those forks, differing only in the VS\n * Code extension id (`kilocode.kilo-code`) and the source label. This is the\n * Kilo VS Code extension usage (distinct from the kilo-cli SQLite reader,\n * platformId \"kilo-cli\", which lands separately).\n *\n * Kilo Code (kilocode.kilo-code) persists per-task logs under its VS Code\n * globalStorage:\n * <vscodeUserDir>/globalStorage/kilocode.kilo-code/tasks/<taskId>/\n * ui_messages.json (the UI message stream — token source)\n * api_conversation_history.json (sibling — model/agent source)\n * The Rust scanner additionally discovers a remote-host server path under\n * ~/.vscode-server/data/User/globalStorage/kilocode.kilo-code/tasks, so we scan\n * both the desktop and server tasks roots that exist.\n *\n * kilo is NOT in paths.ts hostRoots (that per-platform table targets CLIs with\n * ~/.<tool> roots, not VS Code extension globalStorage), so this reader resolves\n * the cross-OS VS Code \"User\" dir itself:\n * - macOS → ~/Library/Application Support/Code/User\n * - Windows → %APPDATA%/Code/User (else ~/AppData/Roaming/Code/User)\n * - Linux → ~/.config/Code/User\n * An AGENT_CONNECTOR_KILO_DIR override (verbatim, non-empty, ~-expanded, resolved\n * against CWD when relative) points directly at a single `tasks` parent when set,\n * matching the env convention in paths.ts hostRoots.\n *\n * Tokens (ui_messages.json): the file is a JSON ARRAY of entries; only entries\n * with type==\"say\" AND say==\"api_req_started\" carry usage. Each such entry's\n * `text` field is a JSON-in-string payload:\n * tokensIn → input\n * tokensOut → output\n * cacheReads → cacheRead\n * cacheWrites → cacheWrite\n * cost (f64) → cost\n * apiProtocol → providerId (preserved verbatim, e.g. \"azure/openai\")\n * reasoning is ALWAYS 0 (Kilo Code does not report it). A malformed text payload,\n * a missing text, or an unparseable `ts` skips just that entry.\n *\n * model / agent (api_conversation_history.json): scan every\n * <environment_details>…</environment_details> block for <model>, <slug>, <name>\n * tags; the LAST <model> wins (default \"unknown\"); agent prefers <slug> then\n * <name> (optional). When the sibling file is absent/unreadable: model \"unknown\",\n * no agent — exactly the Rust read_task_metadata fallback.\n *\n * session id is the taskId — the parent directory name of ui_messages.json\n * (port of extract_session_id), defaulting to \"unknown\". provider from\n * apiProtocol (trimmed, default \"unknown\"). No project attribution (Kilo Code's\n * logs carry no cwd). No dedup — one row per api_req_started event (file\n * isolation is the implicit unique context). Confidence is \"host-reported\"\n * (real host-logged token counts; the design rates this medium qualitatively).\n *\n * Fail-open: no root → []; unreadable/malformed file, entry, or payload → skipped\n * (never throws). Read-only.\n */\n\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { homedir, platform as osPlatform } from \"node:os\";\nimport { basename, dirname, isAbsolute, join, resolve } from \"node:path\";\n\nimport type { UsageReader, UsageRecord } from \"../types.js\";\nimport { emptyTokens } from \"../aggregate.js\";\nimport { readJsonFile } from \"../jsonl.js\";\nimport { expandHome, walkFiles } from \"../paths.js\";\n\nconst PLATFORM_ID = \"kilo\" as const;\nconst DEFAULT_MODEL = \"unknown\";\nconst DEFAULT_PROVIDER = \"unknown\";\nconst DEFAULT_SESSION = \"unknown\";\n\n/** Kilo Code extension id → its VS Code globalStorage folder. */\nconst KILO_EXTENSION_ID = \"kilocode.kilo-code\";\n\n// ─────────────────────────────────────────────────────────────────────────\n// Storage-root resolution (cross-OS vscodeUserDir + the\n// AGENT_CONNECTOR_<PLATFORM>_DIR env convention in paths.ts hostRoots, plus the\n// remote .vscode-server server path the Rust scanner adds for KiloCode)\n// ─────────────────────────────────────────────────────────────────────────\n\n/** Resolve the cross-OS VS Code per-user \"User\" dir (the globalStorage parent). */\nfunction vscodeUserDir(): string {\n const home = homedir();\n switch (osPlatform()) {\n case \"darwin\":\n return join(home, \"Library\", \"Application Support\", \"Code\", \"User\");\n case \"win32\": {\n const appData = process.env.APPDATA ?? join(home, \"AppData\", \"Roaming\");\n return join(appData, \"Code\", \"User\");\n }\n default:\n return join(home, \".config\", \"Code\", \"User\");\n }\n}\n\n/**\n * The `tasks` roots holding per-task subdirectories. An\n * AGENT_CONNECTOR_KILO_DIR override (verbatim, non-empty, ~-expanded, resolved\n * against CWD when relative) short-circuits to that single root. Otherwise we\n * return the desktop globalStorage tasks dir and the remote-host\n * ~/.vscode-server tasks dir (the two roots the Rust scanner discovers for\n * KiloCode); the caller scans whichever exist.\n */\nfunction tasksRoots(): string[] {\n const raw = process.env.AGENT_CONNECTOR_KILO_DIR;\n if (raw != null && raw.trim() !== \"\") {\n const expanded = expandHome(raw.trim());\n return [isAbsolute(expanded) ? expanded : resolve(expanded)];\n }\n const home = homedir();\n return [\n join(vscodeUserDir(), \"globalStorage\", KILO_EXTENSION_ID, \"tasks\"),\n join(home, \".vscode-server\", \"data\", \"User\", \"globalStorage\", KILO_EXTENSION_ID, \"tasks\"),\n ];\n}\n\n// ─────────────────────────────────────────────────────────────────────────\n// Value coercion (ports of utils.rs extract_i64 / extract_f64 / parse_timestamp_str)\n// ─────────────────────────────────────────────────────────────────────────\n\n/** Port of extract_i64: number / numeric-string → integer, else undefined. */\nfunction extractI64(v: unknown): number | undefined {\n if (typeof v === \"number\") {\n if (!Number.isFinite(v)) return undefined;\n return Math.trunc(v);\n }\n if (typeof v === \"string\") {\n const trimmed = v.trim();\n if (!/^[+-]?\\d+$/.test(trimmed)) return undefined; // Rust parses as i64 (integer-only)\n const n = Number(trimmed);\n return Number.isFinite(n) ? Math.trunc(n) : undefined;\n }\n return undefined;\n}\n\n/** A non-negative integer from a payload field (0 on absence/garbage, clamped ≥ 0). */\nfunction tokenField(v: unknown): number {\n const n = extractI64(v);\n return n === undefined ? 0 : Math.max(0, n);\n}\n\n/** Port of extract_f64: number / numeric-string → f64, else undefined. */\nfunction extractF64(v: unknown): number | undefined {\n if (typeof v === \"number\") return Number.isFinite(v) ? v : undefined;\n if (typeof v === \"string\") {\n const n = Number(v.trim());\n return Number.isFinite(n) ? n : undefined;\n }\n return undefined;\n}\n\n/**\n * Port of utils.rs parse_timestamp_str / parse_entry_timestamp: an RFC3339 string\n * → epoch ms; an integer (string or number) → ms (×1000 when below the 1e12 ms\n * threshold); rejects ≤ 0. Returns null when unusable so the entry is skipped.\n */\nfunction parseEntryTimestamp(v: unknown): number | null {\n let s: string;\n if (typeof v === \"string\") s = v;\n else if (typeof v === \"number\" && Number.isFinite(v)) s = String(Math.trunc(v));\n else return null;\n\n return parseTimestampStr(s);\n}\n\nfunction parseTimestampStr(value: string): number | null {\n const ms = Date.parse(value);\n if (!Number.isNaN(ms)) return ms; // RFC3339 / any Date-parseable form\n\n if (/^[+-]?\\d+$/.test(value.trim())) {\n const numeric = Number(value.trim());\n if (!Number.isFinite(numeric) || numeric <= 0) return null;\n return numeric >= 1_000_000_000_000 ? numeric : numeric * 1000;\n }\n return null;\n}\n\n// ─────────────────────────────────────────────────────────────────────────\n// session id (port of extract_session_id)\n// ─────────────────────────────────────────────────────────────────────────\n\n/** Session id = the parent directory (taskId) of ui_messages.json, else \"unknown\". */\nfunction extractSessionId(path: string): string {\n const parent = basename(dirname(path));\n return parent !== \"\" ? parent : DEFAULT_SESSION;\n}\n\n// ─────────────────────────────────────────────────────────────────────────\n// model / agent (ports of read_task_metadata / extract_model_and_agent / extract_tag_value)\n// ─────────────────────────────────────────────────────────────────────────\n\ninterface TaskMetadata {\n model: string;\n agent?: string;\n}\n\n/** Read the sibling api_conversation_history.json for model/agent (fail-open). */\nfunction readTaskMetadata(uiMessagesPath: string): TaskMetadata {\n const historyPath = join(dirname(uiMessagesPath), \"api_conversation_history.json\");\n let content: string;\n try {\n content = readFileSync(historyPath, \"utf8\");\n } catch {\n return { model: DEFAULT_MODEL }; // missing/unreadable → (\"unknown\", None)\n }\n return extractModelAndAgent(content);\n}\n\n/**\n * Scan every <environment_details>…</environment_details> block, extracting\n * <model>, <slug>, <name>. The LAST non-empty value of each tag wins (port of the\n * Rust last_* accumulation). model defaults to \"unknown\"; agent prefers slug then\n * name (and is omitted when neither is present).\n */\nfunction extractModelAndAgent(content: string): TaskMetadata {\n const ENV_START = \"<environment_details>\";\n const ENV_END = \"</environment_details>\";\n\n let offset = 0;\n let lastModel: string | undefined;\n let lastSlug: string | undefined;\n let lastName: string | undefined;\n\n for (;;) {\n const startRel = content.indexOf(ENV_START, offset);\n if (startRel < 0) break;\n const startIdx = startRel + ENV_START.length;\n\n const endRel = content.indexOf(ENV_END, startIdx);\n if (endRel < 0) break;\n\n const block = content.slice(startIdx, endRel);\n\n const model = extractTagValue(block, \"model\");\n if (model !== undefined) lastModel = model;\n const slug = extractTagValue(block, \"slug\");\n if (slug !== undefined) lastSlug = slug;\n const name = extractTagValue(block, \"name\");\n if (name !== undefined) lastName = name;\n\n offset = endRel + ENV_END.length;\n }\n\n const agent = lastSlug ?? lastName;\n const result: TaskMetadata = { model: lastModel ?? DEFAULT_MODEL };\n if (agent !== undefined) result.agent = agent;\n return result;\n}\n\n/** First <tag>…</tag> value in `block`, trimmed; undefined when absent or empty. */\nfunction extractTagValue(block: string, tag: string): string | undefined {\n const open = `<${tag}>`;\n const close = `</${tag}>`;\n\n const openIdx = block.indexOf(open);\n if (openIdx < 0) return undefined;\n const start = openIdx + open.length;\n const endRel = block.indexOf(close, start);\n if (endRel < 0) return undefined;\n\n const value = block.slice(start, endRel).trim();\n return value === \"\" ? undefined : value;\n}\n\n// ─────────────────────────────────────────────────────────────────────────\n// api_req_started payload (port of parse_api_req_started_payload + provider_from_api_protocol)\n// ─────────────────────────────────────────────────────────────────────────\n\ninterface ApiReqStartedPayload {\n cost: number;\n tokensIn: number;\n tokensOut: number;\n cacheReads: number;\n cacheWrites: number;\n apiProtocol?: string;\n}\n\n/** Parse the JSON-in-string `text` payload of an api_req_started entry. */\nfunction parseApiReqStartedPayload(text: string): ApiReqStartedPayload | undefined {\n let value: unknown;\n try {\n value = JSON.parse(text);\n } catch {\n return undefined;\n }\n if (typeof value !== \"object\" || value === null) return undefined;\n const obj = value as Record<string, unknown>;\n\n // cost: extract_f64(.cost).unwrap_or(0.0).max(0.0)\n const cost = Math.max(0, extractF64(obj[\"cost\"]) ?? 0);\n const apiProtocolRaw = typeof obj[\"apiProtocol\"] === \"string\" ? (obj[\"apiProtocol\"] as string) : undefined;\n\n const payload: ApiReqStartedPayload = {\n cost,\n tokensIn: tokenField(obj[\"tokensIn\"]),\n tokensOut: tokenField(obj[\"tokensOut\"]),\n cacheReads: tokenField(obj[\"cacheReads\"]),\n cacheWrites: tokenField(obj[\"cacheWrites\"]),\n };\n if (apiProtocolRaw !== undefined) payload.apiProtocol = apiProtocolRaw;\n return payload;\n}\n\n/** Provider from apiProtocol: trimmed, non-empty, else \"unknown\" (verbatim — no inference). */\nfunction providerFromApiProtocol(apiProtocol: string | undefined): string {\n if (apiProtocol === undefined) return DEFAULT_PROVIDER;\n const trimmed = apiProtocol.trim();\n return trimmed === \"\" ? DEFAULT_PROVIDER : trimmed;\n}\n\n// ─────────────────────────────────────────────────────────────────────────\n// File parse (port of parse_roo_kilo_file with source \"kilocode\")\n// ─────────────────────────────────────────────────────────────────────────\n\n/** The fields we read off a ui_messages.json entry (all optional / unknown). */\ninterface UiMessageEntry {\n type?: unknown;\n say?: unknown;\n text?: unknown;\n ts?: unknown;\n}\n\n/** Parse one task's ui_messages.json into usage records. */\nfunction parseKiloFile(path: string): UsageRecord[] {\n const data = readJsonFile(path);\n if (!Array.isArray(data)) return []; // malformed / non-array → no rows\n\n const sessionId = extractSessionId(path);\n const { model, agent } = readTaskMetadata(path);\n\n const out: UsageRecord[] = [];\n for (const raw of data) {\n if (typeof raw !== \"object\" || raw === null) continue;\n const entry = raw as UiMessageEntry;\n\n if (entry.type !== \"say\" || entry.say !== \"api_req_started\") continue;\n\n if (typeof entry.text !== \"string\") continue; // None => skip\n const ts = parseEntryTimestamp(entry.ts);\n if (ts === null) continue; // unparseable ts => skip\n\n const payload = parseApiReqStartedPayload(entry.text);\n if (payload === undefined) continue; // malformed payload => skip\n\n const providerId = providerFromApiProtocol(payload.apiProtocol);\n\n const tokens = emptyTokens();\n tokens.input = payload.tokensIn;\n tokens.output = payload.tokensOut;\n tokens.cacheRead = payload.cacheReads;\n tokens.cacheWrite = payload.cacheWrites;\n // reasoning stays 0 (Kilo Code does not report it).\n\n const record: UsageRecord = {\n platformId: PLATFORM_ID,\n modelId: model,\n providerId,\n sessionId,\n tokens,\n ts,\n messageCount: 1,\n confidence: \"host-reported\",\n };\n if (payload.cost > 0) record.cost = payload.cost;\n if (agent !== undefined) record.agent = agent;\n out.push(record);\n }\n\n return out;\n}\n\n// ─────────────────────────────────────────────────────────────────────────\n// Reader singleton\n// ─────────────────────────────────────────────────────────────────────────\n\n/** The Kilo Code (VS Code extension) usage reader singleton. */\nconst kiloReader: UsageReader = {\n platformId: PLATFORM_ID,\n kind: \"local\",\n async read({ sinceMs }: { sinceMs?: number }): Promise<UsageRecord[]> {\n const roots = tasksRoots().filter((root) => existsSync(root));\n if (roots.length === 0) return []; // no tasks dir → fail-open\n\n const records: UsageRecord[] = [];\n for (const root of roots) {\n // <root>/<taskId>/ui_messages.json\n const files = walkFiles(root, (name, abs) => {\n return name === \"ui_messages.json\" && /[\\\\/]ui_messages\\.json$/.test(abs);\n });\n\n for (const file of files) {\n let rows: UsageRecord[];\n try {\n rows = parseKiloFile(file);\n } catch {\n continue; // fail-open per file\n }\n for (const row of rows) {\n if (sinceMs !== undefined && row.ts < sinceMs) continue;\n records.push(row);\n }\n }\n }\n return records;\n },\n};\n\nexport default kiloReader;\n"],"mappings":"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","names":[]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
xdgConfigHome
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-KOFCNA5T.js";
|
|
5
5
|
import {
|
|
6
6
|
renderBridgePrelude
|
|
7
7
|
} from "./chunk-FBJQGRET.js";
|
|
@@ -842,4 +842,4 @@ export {
|
|
|
842
842
|
adapter,
|
|
843
843
|
kilo_default as default
|
|
844
844
|
};
|
|
845
|
-
//# sourceMappingURL=kilo-
|
|
845
|
+
//# sourceMappingURL=kilo-N5T6KXAG.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
xdgConfigHome
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-KOFCNA5T.js";
|
|
5
5
|
import {
|
|
6
6
|
renderBridgePrelude
|
|
7
7
|
} from "./chunk-FBJQGRET.js";
|
|
@@ -795,4 +795,4 @@ export {
|
|
|
795
795
|
adapter,
|
|
796
796
|
kilo_cli_default as default
|
|
797
797
|
};
|
|
798
|
-
//# sourceMappingURL=kilo-cli-
|
|
798
|
+
//# sourceMappingURL=kilo-cli-JOAEWYI4.js.map
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import {
|
|
3
3
|
formatHostLeaderboard,
|
|
4
4
|
hostLeaderboard
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-IVJUPNLD.js";
|
|
6
6
|
import {
|
|
7
7
|
SCOPE_FILTER_VALUES,
|
|
8
8
|
formatHostNativeTurns,
|
|
@@ -15,7 +15,7 @@ import "./chunk-XD7MY6HB.js";
|
|
|
15
15
|
import {
|
|
16
16
|
fail,
|
|
17
17
|
print
|
|
18
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-SA6CSOH5.js";
|
|
19
19
|
import "./chunk-IVAWP6HH.js";
|
|
20
20
|
import "./chunk-GZGLCCEE.js";
|
|
21
21
|
|
|
@@ -134,4 +134,4 @@ export {
|
|
|
134
134
|
parseSince,
|
|
135
135
|
run
|
|
136
136
|
};
|
|
137
|
-
//# sourceMappingURL=leaderboard-
|
|
137
|
+
//# sourceMappingURL=leaderboard-Q4YZ3LI7.js.map
|