@ken-jo/agent-connector 0.4.79 → 0.4.91

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.
Files changed (110) hide show
  1. package/README.md +3 -3
  2. package/dist/{action-OHGFVKMC.js → action-L44DXFHT.js} +9 -9
  3. package/dist/antigravity-cli-JO6GUTV7.js +436 -0
  4. package/dist/antigravity-cli-JO6GUTV7.js.map +1 -0
  5. package/dist/{chunk-X457NOFE.js → chunk-25CPWJA7.js} +91 -11
  6. package/dist/chunk-25CPWJA7.js.map +1 -0
  7. package/dist/{chunk-VKRGQLY4.js → chunk-7HUUINPB.js} +18 -18
  8. package/dist/{chunk-LKAVD4HP.js → chunk-BLTVZACS.js} +8 -8
  9. package/dist/{chunk-PZHB5TVA.js → chunk-G4CEELKO.js} +2 -2
  10. package/dist/{chunk-VD4EG6SG.js → chunk-KIRCPLM4.js} +5 -5
  11. package/dist/{chunk-ZXX5DVSE.js → chunk-LAIITCMW.js} +6 -6
  12. package/dist/{chunk-UYZ53KWS.js → chunk-LF76VPGQ.js} +5 -5
  13. package/dist/{chunk-IRUYJD23.js → chunk-NLE2J5P4.js} +1 -1
  14. package/dist/{chunk-7NXEHZAK.js → chunk-NWLRJNXM.js} +2 -2
  15. package/dist/{chunk-YJP3KGLM.js → chunk-QARPXSIV.js} +4 -4
  16. package/dist/{chunk-AMK2K6XZ.js → chunk-R6LML2YS.js} +2 -2
  17. package/dist/{chunk-S4E6QQEM.js → chunk-ZMLVR4J7.js} +7 -2
  18. package/dist/chunk-ZMLVR4J7.js.map +1 -0
  19. package/dist/{claude-code-T6ZRCMA7.js → claude-code-WS4NAGZT.js} +4 -4
  20. package/dist/cli/sdk.js +4 -4
  21. package/dist/cli.js +1 -1
  22. package/dist/codebuddy-RBEZGXBG.js +643 -0
  23. package/dist/codebuddy-RBEZGXBG.js.map +1 -0
  24. package/dist/{codex-RHKQKNNG.js → codex-ZZ434GYR.js} +4 -4
  25. package/dist/{detect-ALAKE54S.js → detect-3S46RUMK.js} +4 -4
  26. package/dist/devin-PRJY2TTD.js +510 -0
  27. package/dist/devin-PRJY2TTD.js.map +1 -0
  28. package/dist/{doctor-UNF7FCF4.js → doctor-3CUBPQKU.js} +14 -14
  29. package/dist/grok-cli-5QD235UB.js +482 -0
  30. package/dist/grok-cli-5QD235UB.js.map +1 -0
  31. package/dist/{hook-GM2IDA3C.js → hook-P6EKDINW.js} +9 -9
  32. package/dist/index.d.ts +2 -2
  33. package/dist/index.js +2 -2
  34. package/dist/{install-7O4XWH7T.js → install-7DMK53SB.js} +10 -10
  35. package/dist/{introspect-5o5ick0_.d.ts → introspect-DYOIX8Ov.d.ts} +1 -1
  36. package/dist/{jetbrains-copilot-4IOT3I2Y.js → jetbrains-copilot-T2EPKROP.js} +9 -3
  37. package/dist/jetbrains-copilot-T2EPKROP.js.map +1 -0
  38. package/dist/junie-SQ4SDLGK.js +227 -0
  39. package/dist/junie-SQ4SDLGK.js.map +1 -0
  40. package/dist/{kilo-TAHOPT2Q.js → kilo-OU2ZLZKB.js} +4 -4
  41. package/dist/{kilo-cli-X4NPJWGX.js → kilo-cli-NMWGYF4F.js} +4 -4
  42. package/dist/{kiro-YZ4TTZGD.js → kiro-4IN5IH46.js} +77 -2
  43. package/dist/kiro-4IN5IH46.js.map +1 -0
  44. package/dist/{leaderboard-DVW4WYJ6.js → leaderboard-LF5SP6X2.js} +4 -4
  45. package/dist/mistral-vibe-TRQDHAWV.js +300 -0
  46. package/dist/mistral-vibe-TRQDHAWV.js.map +1 -0
  47. package/dist/open-interpreter-4PKL56AA.js +264 -0
  48. package/dist/open-interpreter-4PKL56AA.js.map +1 -0
  49. package/dist/openhands-5LNH3BKB.js +384 -0
  50. package/dist/openhands-5LNH3BKB.js.map +1 -0
  51. package/dist/{package-H5V3AZHR.js → package-2EAIYSJ4.js} +7 -7
  52. package/dist/{pi-I7BLL4EI.js → pi-BUADR5MJ.js} +139 -2
  53. package/dist/pi-BUADR5MJ.js.map +1 -0
  54. package/dist/{qwen-code-JG7AF442.js → qwen-code-TUJNHKNI.js} +4 -4
  55. package/dist/runtime/index.d.ts +1 -1
  56. package/dist/runtime/index.js +7 -7
  57. package/dist/sdk/index.d.ts +3 -3
  58. package/dist/sdk/index.js +3 -3
  59. package/dist/sdk/test.d.ts +2 -2
  60. package/dist/sdk/test.js +7 -7
  61. package/dist/{serve-WMO2TUW3.js → serve-K62FW3V7.js} +9 -9
  62. package/dist/{status-WRLBTBRE.js → status-E5MCFZM6.js} +7 -7
  63. package/dist/{statusline-EUD4DMIP.js → statusline-LIPF2KVP.js} +8 -8
  64. package/dist/{telemetry-U3LGMR3D.js → telemetry-4OC56NTM.js} +5 -5
  65. package/dist/{types-D6RWGXm1.d.ts → types-C4qMgbJn.d.ts} +10 -9
  66. package/dist/{uninstall-TWPUEJEC.js → uninstall-2YYKN5DX.js} +10 -10
  67. package/dist/{upgrade-EM6Y7QLH.js → upgrade-55AFPJEF.js} +10 -10
  68. package/dist/{usage-3HQDTXGY.js → usage-3PB3WZSL.js} +3 -3
  69. package/dist/{usage-event-DWIGKO7V.js → usage-event-KD5FW6W4.js} +8 -8
  70. package/dist/{zed-LLOAUXSA.js → zed-ZF2OQ75O.js} +119 -3
  71. package/dist/zed-ZF2OQ75O.js.map +1 -0
  72. package/package.json +1 -1
  73. package/dist/antigravity-cli-KODEKUTM.js +0 -87
  74. package/dist/antigravity-cli-KODEKUTM.js.map +0 -1
  75. package/dist/chunk-S4E6QQEM.js.map +0 -1
  76. package/dist/chunk-X457NOFE.js.map +0 -1
  77. package/dist/jetbrains-copilot-4IOT3I2Y.js.map +0 -1
  78. package/dist/kiro-YZ4TTZGD.js.map +0 -1
  79. package/dist/pi-I7BLL4EI.js.map +0 -1
  80. package/dist/zed-LLOAUXSA.js.map +0 -1
  81. /package/dist/{action-OHGFVKMC.js.map → action-L44DXFHT.js.map} +0 -0
  82. /package/dist/{chunk-VKRGQLY4.js.map → chunk-7HUUINPB.js.map} +0 -0
  83. /package/dist/{chunk-LKAVD4HP.js.map → chunk-BLTVZACS.js.map} +0 -0
  84. /package/dist/{chunk-PZHB5TVA.js.map → chunk-G4CEELKO.js.map} +0 -0
  85. /package/dist/{chunk-VD4EG6SG.js.map → chunk-KIRCPLM4.js.map} +0 -0
  86. /package/dist/{chunk-ZXX5DVSE.js.map → chunk-LAIITCMW.js.map} +0 -0
  87. /package/dist/{chunk-UYZ53KWS.js.map → chunk-LF76VPGQ.js.map} +0 -0
  88. /package/dist/{chunk-IRUYJD23.js.map → chunk-NLE2J5P4.js.map} +0 -0
  89. /package/dist/{chunk-7NXEHZAK.js.map → chunk-NWLRJNXM.js.map} +0 -0
  90. /package/dist/{chunk-YJP3KGLM.js.map → chunk-QARPXSIV.js.map} +0 -0
  91. /package/dist/{chunk-AMK2K6XZ.js.map → chunk-R6LML2YS.js.map} +0 -0
  92. /package/dist/{claude-code-T6ZRCMA7.js.map → claude-code-WS4NAGZT.js.map} +0 -0
  93. /package/dist/{codex-RHKQKNNG.js.map → codex-ZZ434GYR.js.map} +0 -0
  94. /package/dist/{detect-ALAKE54S.js.map → detect-3S46RUMK.js.map} +0 -0
  95. /package/dist/{doctor-UNF7FCF4.js.map → doctor-3CUBPQKU.js.map} +0 -0
  96. /package/dist/{hook-GM2IDA3C.js.map → hook-P6EKDINW.js.map} +0 -0
  97. /package/dist/{install-7O4XWH7T.js.map → install-7DMK53SB.js.map} +0 -0
  98. /package/dist/{kilo-TAHOPT2Q.js.map → kilo-OU2ZLZKB.js.map} +0 -0
  99. /package/dist/{kilo-cli-X4NPJWGX.js.map → kilo-cli-NMWGYF4F.js.map} +0 -0
  100. /package/dist/{leaderboard-DVW4WYJ6.js.map → leaderboard-LF5SP6X2.js.map} +0 -0
  101. /package/dist/{package-H5V3AZHR.js.map → package-2EAIYSJ4.js.map} +0 -0
  102. /package/dist/{qwen-code-JG7AF442.js.map → qwen-code-TUJNHKNI.js.map} +0 -0
  103. /package/dist/{serve-WMO2TUW3.js.map → serve-K62FW3V7.js.map} +0 -0
  104. /package/dist/{status-WRLBTBRE.js.map → status-E5MCFZM6.js.map} +0 -0
  105. /package/dist/{statusline-EUD4DMIP.js.map → statusline-LIPF2KVP.js.map} +0 -0
  106. /package/dist/{telemetry-U3LGMR3D.js.map → telemetry-4OC56NTM.js.map} +0 -0
  107. /package/dist/{uninstall-TWPUEJEC.js.map → uninstall-2YYKN5DX.js.map} +0 -0
  108. /package/dist/{upgrade-EM6Y7QLH.js.map → upgrade-55AFPJEF.js.map} +0 -0
  109. /package/dist/{usage-3HQDTXGY.js.map → usage-3PB3WZSL.js.map} +0 -0
  110. /package/dist/{usage-event-DWIGKO7V.js.map → usage-event-KD5FW6W4.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/adapters/mistral-vibe/index.ts"],"sourcesContent":["/**\n * adapters/mistral-vibe — Mistral Vibe (Mistral's coding-agent CLI) adapter.\n *\n * Mistral Vibe is an **mcp-only** host: it registers MCP servers but exposes no\n * user-installable lifecycle-hook surface AC can wire today. Its native config\n * is TOML, with a two-level lookup order (project precedes user):\n * 1. <projectDir>/.vibe/config.toml (PROJECT — takes precedence)\n * 2. ~/.vibe/config.toml (USER)\n *\n * MCP shape — byte-confirmed from the OFFICIAL repo README\n * (github.com/mistralai/mistral-vibe) + docs (docs.mistral.ai/vibe/code/cli/\n * configuration + /mcp-servers): the root key `mcp_servers` is a TOML\n * ARRAY-OF-TABLES (`[[mcp_servers]]`), NOT codex's table-keyed\n * `[mcp_servers.<name>]`. Each entry carries a REQUIRED short-alias `name` field\n * — AC writes the CONNECTOR ID there and keys ownership on it (the array-by-name\n * merge the `continue` adapter uses for YAML, applied over TOML):\n *\n * [[mcp_servers]]\n * name = \"fetch_server\"\n * transport = \"stdio\"\n * command = \"uvx\"\n * args = [\"mcp-server-fetch\"]\n * env = { \"DEBUG\" = \"1\", \"LOG_LEVEL\" = \"info\" }\n *\n * [[mcp_servers]]\n * name = \"my_http_server\"\n * transport = \"http\"\n * url = \"http://localhost:8000\"\n * headers = { \"Authorization\" = \"Bearer my_token\" }\n * api_key_env = \"MY_API_KEY_ENV_VAR\"\n *\n * Per-entry fields:\n * - name (required short alias — the connector id)\n * - transport (\"stdio\" | \"http\" | \"streamable-http\")\n * - stdio → command / args / env\n * - http/sse → url / headers / api_key_env / api_key_header / api_key_format\n * - optional startup_timeout_sec / tool_timeout_sec\n *\n * TOML has NO native interpolation token, so every `${env:VAR}` is resolved to a\n * literal at install time (the safe path matching codex/droid). The stdio entry\n * is routed through the telemetry serve-wrapper (`<homeBin> serve --connector\n * <id> -- <command> <args...>`); remote transports are registered but never\n * wrapped (they cannot be intercepted).\n *\n * HOOKS: HONEST CEILING — Mistral Vibe ships only an experimental, unstable hook\n * surface (no byte-confirmed format/event-name contract), so AC wires NO hooks\n * here. The capability flags stay unset and the host is reported mcp-only (the\n * generic installHooks reports \"hooks unavailable\"). When a first-party hook\n * contract is byte-confirmed this becomes a normal capability addition.\n */\n\nimport { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\n\nimport TOML from \"@iarna/toml\";\n\nimport type {\n ChangeRecord,\n DetectedPlatform,\n HealthCheck,\n HookParadigm,\n PlatformCapabilities,\n PlatformId,\n ServerDef,\n Transport,\n} from \"../../core/types.js\";\nimport { ensureDir } from \"../../core/paths.js\";\nimport { resolveEnvRefsDeep } from \"../../core/interpolate.js\";\nimport { buildWrappedStdio } from \"../../core/spawn.js\";\nimport { BaseAdapter } from \"../base.js\";\nimport type { Adapter, InstallContext } from \"../spi.js\";\n\nconst HOST: PlatformId = \"mistral-vibe\";\n/** Root key under which Mistral Vibe stores MCP servers — a TOML ARRAY-OF-TABLES. */\nconst MCP_ROOT_KEY = \"mcp_servers\";\n\n/**\n * Native Mistral Vibe MCP server entry shapes. `name` is the required short\n * alias (we key ownership on it). A stdio entry carries an explicit\n * `transport: \"stdio\"` + command/args/env; a remote entry carries the chosen\n * transport + url/headers. NO api_key_* / *_timeout_sec unless declared.\n */\ninterface VibeStdioServer {\n name: string;\n transport: \"stdio\";\n command: string;\n args?: string[];\n env?: Record<string, string>;\n}\ninterface VibeRemoteServer {\n name: string;\n transport: \"http\" | \"streamable-http\";\n url: string;\n headers?: Record<string, string>;\n}\ntype VibeServer = VibeStdioServer | VibeRemoteServer;\n\nexport class MistralVibeAdapter extends BaseAdapter implements Adapter {\n readonly id: PlatformId = HOST;\n readonly name = \"Mistral Vibe\";\n readonly paradigm: HookParadigm = \"mcp-only\";\n\n readonly capabilities: PlatformCapabilities = {\n // mcp-only: no hook layer wired (experimental host hooks are not\n // byte-confirmed — see header HONEST CEILING). No memory/content surfaces\n // wired either; only the MCP server is installed. Every hook capability is\n // false.\n preToolUse: false,\n postToolUse: false,\n preCompact: false,\n sessionStart: false,\n sessionEnd: false,\n userPromptSubmit: false,\n stop: false,\n notification: false,\n canModifyArgs: false,\n canModifyOutput: false,\n canInjectSessionContext: false,\n // Mistral Vibe registers stdio + remote (http / streamable-http) MCP\n // servers. The framework's `http` transport maps to Vibe's \"http\"; `sse`\n // maps to Vibe's \"streamable-http\" (its closest remote form).\n transports: [\"stdio\", \"http\", \"sse\"],\n };\n\n // ── Detection ────────────────────────────────────────────────────────────\n\n detectInstalled(projectDir: string): DetectedPlatform {\n const userDir = this.userConfigDir();\n const userCfg = join(userDir, \"config.toml\");\n const projDir = join(projectDir, \".vibe\");\n const projCfg = join(projDir, \"config.toml\");\n\n const userInstalled = existsSync(userDir) || existsSync(userCfg);\n const projInstalled = existsSync(projDir) || existsSync(projCfg);\n const installed = userInstalled || projInstalled;\n // Project config.toml takes precedence in Vibe's lookup order, so a\n // project-only install reports project scope.\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 Mistral Vibe config (${scope}) at ${configPath}`\n : `no .vibe config at ${userDir} or ${projDir}`,\n confidence: installed ? \"high\" : \"low\",\n };\n }\n\n // ── Native paths ─────────────────────────────────────────────────────────\n\n /** ~/.vibe (user) or <projectDir>/.vibe (project). */\n override getConfigDir(ctx: InstallContext): string {\n return ctx.scope === \"project\"\n ? join(ctx.projectDir, \".vibe\")\n : this.userConfigDir();\n }\n\n /** MCP config: config.toml under the per-scope .vibe dir. */\n override getServerConfigPath(ctx: InstallContext): string {\n return join(this.getConfigDir(ctx), \"config.toml\");\n }\n\n /**\n * Mistral Vibe has no AC-wired hook file (mcp-only — see header). The hook\n * \"config path\" is the same config.toml so the generic doctor/backup behave\n * sensibly (mirrors warp/zed).\n */\n override getHookConfigPath(ctx: InstallContext): string {\n return this.getServerConfigPath(ctx);\n }\n\n /** ~/.vibe — homedir() covers %USERPROFILE% on Windows. */\n private userConfigDir(): string {\n return join(homedir(), \".vibe\");\n }\n\n // ── TOML config IO ─────────────────────────────────────────────────────────\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 // ── MCP server install / uninstall (TOML — ARRAY-OF-TABLES, by `name`) ──────\n\n override installServer(ctx: InstallContext): ChangeRecord[] {\n const { connector, dryRun } = ctx;\n const path = this.getServerConfigPath(ctx);\n const server = this.effectiveServer(ctx);\n\n if (!server) {\n return [\n {\n platform: this.id,\n action: \"skip\",\n path,\n detail: connector.server\n ? \"server registration disabled for mistral-vibe\"\n : \"connector declares no MCP server\",\n },\n ];\n }\n\n const symlink = this.symlinkPathWarning(path);\n if (symlink) return [symlink];\n\n const entry = this.renderServerEntry(ctx, server);\n\n // Merge into existing TOML, preserving every other config key + sibling\n // mcp_servers entry. mcp_servers is a TOML ARRAY-OF-TABLES; we key on `name`.\n const cfg = this.readToml(path);\n // NEVER clobber a malformed `mcp_servers`: if it exists and is not an array,\n // skip-and-warn (symmetric with uninstallServer) rather than silently\n // replacing the user's hand-written value.\n const existingRoot = cfg[MCP_ROOT_KEY];\n if (existingRoot !== undefined && !Array.isArray(existingRoot)) {\n return [\n {\n platform: this.id,\n action: \"skip\",\n path,\n detail: `${MCP_ROOT_KEY} is not a TOML array — left untouched (manual fix needed)`,\n },\n ];\n }\n\n const list = Array.isArray(existingRoot) ? (existingRoot as VibeServer[]) : [];\n const idx = list.findIndex((e) => this.entryName(e) === 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_ROOT_KEY] = list;\n this.writeToml(path, cfg, dryRun);\n }\n return [{ platform: this.id, action, path, detail: `${MCP_ROOT_KEY}[name=${connector.id}]` }];\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 const cfg = this.readToml(path);\n const rawList = cfg[MCP_ROOT_KEY];\n if (!Array.isArray(rawList)) {\n return [\n {\n platform: this.id,\n action: \"skip\",\n path,\n detail: `${MCP_ROOT_KEY}[name=${connector.id}] absent`,\n },\n ];\n }\n\n const list = rawList as VibeServer[];\n const kept = list.filter((e) => this.entryName(e) !== connector.id);\n if (kept.length === list.length) {\n return [\n {\n platform: this.id,\n action: \"skip\",\n path,\n detail: `${MCP_ROOT_KEY}[name=${connector.id}] absent`,\n },\n ];\n }\n\n cfg[MCP_ROOT_KEY] = kept;\n this.writeToml(path, cfg, dryRun);\n return [\n { platform: this.id, action: \"remove\", path, detail: `${MCP_ROOT_KEY}[name=${connector.id}]` },\n ];\n }\n\n /**\n * Render a normalized ServerDef into Mistral Vibe's native mcp_servers entry.\n * TOML has no native ${env:VAR} token — resolve every reference to a literal at\n * install time (the safe path, matching codex/droid). Honors the telemetry\n * serve-wrapper for stdio.\n */\n private renderServerEntry(ctx: InstallContext, server: ServerDef): VibeServer {\n const transport: Transport = server.transport;\n\n if (transport === \"stdio\") {\n let command = server.command ?? \"\";\n let args = [...(server.args ?? [])];\n\n ({ command, args } = buildWrappedStdio(ctx, server, this.id, command, args));\n\n command = resolveEnvRefsDeep(command);\n args = resolveEnvRefsDeep(args);\n\n const entry: VibeStdioServer = {\n name: ctx.connector.id,\n transport: \"stdio\",\n command,\n };\n if (args.length > 0) entry.args = args;\n const env = this.renderEnv(server.env);\n if (env) entry.env = env;\n return entry;\n }\n\n // Remote (sse / http / ws) — Vibe registers an explicit transport + url. The\n // framework's `http` transport maps to Vibe's \"http\"; `sse` maps to\n // \"streamable-http\" (ws has no Vibe analog → also \"streamable-http\", the\n // closest documented remote form).\n const vibeTransport: VibeRemoteServer[\"transport\"] =\n transport === \"http\" ? \"http\" : \"streamable-http\";\n const entry: VibeRemoteServer = {\n name: ctx.connector.id,\n transport: vibeTransport,\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. Resolve `${env:VAR}` references to literals at\n * install time (TOML cannot interpolate).\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 const out: Record<string, string> = {};\n for (const [k, v] of Object.entries(resolveEnvRefsDeep({ ...env }))) {\n out[k] = String(v);\n }\n return out;\n }\n\n // ── Hooks (unavailable — Mistral Vibe is mcp-only) ───────────────────────\n // HONEST CEILING: Vibe ships only an experimental hook surface with no\n // byte-confirmed format/event-name contract, so AC wires no hooks here.\n\n installHooks(_ctx: InstallContext): ChangeRecord[] {\n return [\n {\n platform: this.id,\n action: \"skip\",\n detail: \"hooks unavailable (Mistral Vibe is mcp-only)\",\n },\n ];\n }\n\n uninstallHooks(_ctx: InstallContext): ChangeRecord[] {\n return [\n {\n platform: this.id,\n action: \"skip\",\n detail: \"hooks unavailable (Mistral Vibe is mcp-only)\",\n },\n ];\n }\n\n // ── Diagnostics ──────────────────────────────────────────────────────────\n\n override getHealthChecks(ctx: InstallContext): readonly HealthCheck[] {\n const path = this.getServerConfigPath(ctx);\n const id = ctx.connector.id;\n return [\n {\n name: `${this.name}: config.toml present`,\n check: () =>\n existsSync(path)\n ? { status: \"OK\", detail: path }\n : { status: \"FAIL\", detail: `not found: ${path}` },\n },\n {\n name: `${this.name}: ${MCP_ROOT_KEY}[name=${id}] registered`,\n check: () => {\n if (!ctx.connector.server) return { status: \"OK\", detail: \"no MCP server declared\" };\n const cfg = this.readToml(path);\n const list = cfg[MCP_ROOT_KEY];\n const present =\n Array.isArray(list) &&\n (list as VibeServer[]).some((e) => this.entryName(e) === id);\n return present\n ? { status: \"OK\", detail: `${MCP_ROOT_KEY}[name=${id}]` }\n : { status: \"FAIL\", detail: `${MCP_ROOT_KEY}[name=${id}] not found in ${path}` };\n },\n },\n ];\n }\n\n // ── Internal helpers ──────────────────────────────────────────────────────\n\n /** The `name` of an array entry, or undefined when it is not a named object. */\n private entryName(entry: unknown): string | undefined {\n if (!entry || typeof entry !== \"object\" || Array.isArray(entry)) return undefined;\n const name = (entry as { name?: unknown }).name;\n return typeof name === \"string\" ? name : undefined;\n }\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 && typeof override === \"object\" ? { ...base, ...override } : base;\n }\n}\n\nexport const adapter = new MistralVibeAdapter();\nexport default adapter;\n"],"mappings":";;;;;;;;;;;;;;;;AAmDA,SAAS,YAAY,cAAc,qBAAqB;AACxD,SAAS,eAAe;AACxB,SAAS,SAAS,YAAY;AAE9B,OAAO,UAAU;AAkBjB,IAAM,OAAmB;AAEzB,IAAM,eAAe;AAuBd,IAAM,qBAAN,cAAiC,YAA+B;AAAA,EAC5D,KAAiB;AAAA,EACjB,OAAO;AAAA,EACP,WAAyB;AAAA,EAEzB,eAAqC;AAAA;AAAA;AAAA;AAAA;AAAA,IAK5C,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,kBAAkB;AAAA,IAClB,MAAM;AAAA,IACN,cAAc;AAAA,IACd,eAAe;AAAA,IACf,iBAAiB;AAAA,IACjB,yBAAyB;AAAA;AAAA;AAAA;AAAA,IAIzB,YAAY,CAAC,SAAS,QAAQ,KAAK;AAAA,EACrC;AAAA;AAAA,EAIA,gBAAgB,YAAsC;AACpD,UAAM,UAAU,KAAK,cAAc;AACnC,UAAM,UAAU,KAAK,SAAS,aAAa;AAC3C,UAAM,UAAU,KAAK,YAAY,OAAO;AACxC,UAAM,UAAU,KAAK,SAAS,aAAa;AAE3C,UAAM,gBAAgB,WAAW,OAAO,KAAK,WAAW,OAAO;AAC/D,UAAM,gBAAgB,WAAW,OAAO,KAAK,WAAW,OAAO;AAC/D,UAAM,YAAY,iBAAiB;AAGnC,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,8BAA8B,KAAK,QAAQ,UAAU,KACrD,sBAAsB,OAAO,OAAO,OAAO;AAAA,MAC/C,YAAY,YAAY,SAAS;AAAA,IACnC;AAAA,EACF;AAAA;AAAA;AAAA,EAKS,aAAa,KAA6B;AACjD,WAAO,IAAI,UAAU,YACjB,KAAK,IAAI,YAAY,OAAO,IAC5B,KAAK,cAAc;AAAA,EACzB;AAAA;AAAA,EAGS,oBAAoB,KAA6B;AACxD,WAAO,KAAK,KAAK,aAAa,GAAG,GAAG,aAAa;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOS,kBAAkB,KAA6B;AACtD,WAAO,KAAK,oBAAoB,GAAG;AAAA,EACrC;AAAA;AAAA,EAGQ,gBAAwB;AAC9B,WAAO,KAAK,QAAQ,GAAG,OAAO;AAAA,EAChC;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,EAIS,cAAc,KAAqC;AAC1D,UAAM,EAAE,WAAW,OAAO,IAAI;AAC9B,UAAM,OAAO,KAAK,oBAAoB,GAAG;AACzC,UAAM,SAAS,KAAK,gBAAgB,GAAG;AAEvC,QAAI,CAAC,QAAQ;AACX,aAAO;AAAA,QACL;AAAA,UACE,UAAU,KAAK;AAAA,UACf,QAAQ;AAAA,UACR;AAAA,UACA,QAAQ,UAAU,SACd,kDACA;AAAA,QACN;AAAA,MACF;AAAA,IACF;AAEA,UAAM,UAAU,KAAK,mBAAmB,IAAI;AAC5C,QAAI,QAAS,QAAO,CAAC,OAAO;AAE5B,UAAM,QAAQ,KAAK,kBAAkB,KAAK,MAAM;AAIhD,UAAM,MAAM,KAAK,SAAS,IAAI;AAI9B,UAAM,eAAe,IAAI,YAAY;AACrC,QAAI,iBAAiB,UAAa,CAAC,MAAM,QAAQ,YAAY,GAAG;AAC9D,aAAO;AAAA,QACL;AAAA,UACE,UAAU,KAAK;AAAA,UACf,QAAQ;AAAA,UACR;AAAA,UACA,QAAQ,GAAG,YAAY;AAAA,QACzB;AAAA,MACF;AAAA,IACF;AAEA,UAAM,OAAO,MAAM,QAAQ,YAAY,IAAK,eAAgC,CAAC;AAC7E,UAAM,MAAM,KAAK,UAAU,CAAC,MAAM,KAAK,UAAU,CAAC,MAAM,UAAU,EAAE;AAEpE,QAAI;AACJ,QAAI,MAAM,GAAG;AACX,WAAK,KAAK,KAAK;AACf,eAAS;AAAA,IACX,WAAW,KAAK,UAAU,KAAK,GAAG,CAAC,MAAM,KAAK,UAAU,KAAK,GAAG;AAC9D,eAAS;AAAA,IACX,OAAO;AACL,WAAK,GAAG,IAAI;AACZ,eAAS;AAAA,IACX;AAEA,QAAI,WAAW,QAAQ;AACrB,UAAI,YAAY,IAAI;AACpB,WAAK,UAAU,MAAM,KAAK,MAAM;AAAA,IAClC;AACA,WAAO,CAAC,EAAE,UAAU,KAAK,IAAI,QAAQ,MAAM,QAAQ,GAAG,YAAY,SAAS,UAAU,EAAE,IAAI,CAAC;AAAA,EAC9F;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,UAAM,MAAM,KAAK,SAAS,IAAI;AAC9B,UAAM,UAAU,IAAI,YAAY;AAChC,QAAI,CAAC,MAAM,QAAQ,OAAO,GAAG;AAC3B,aAAO;AAAA,QACL;AAAA,UACE,UAAU,KAAK;AAAA,UACf,QAAQ;AAAA,UACR;AAAA,UACA,QAAQ,GAAG,YAAY,SAAS,UAAU,EAAE;AAAA,QAC9C;AAAA,MACF;AAAA,IACF;AAEA,UAAM,OAAO;AACb,UAAM,OAAO,KAAK,OAAO,CAAC,MAAM,KAAK,UAAU,CAAC,MAAM,UAAU,EAAE;AAClE,QAAI,KAAK,WAAW,KAAK,QAAQ;AAC/B,aAAO;AAAA,QACL;AAAA,UACE,UAAU,KAAK;AAAA,UACf,QAAQ;AAAA,UACR;AAAA,UACA,QAAQ,GAAG,YAAY,SAAS,UAAU,EAAE;AAAA,QAC9C;AAAA,MACF;AAAA,IACF;AAEA,QAAI,YAAY,IAAI;AACpB,SAAK,UAAU,MAAM,KAAK,MAAM;AAChC,WAAO;AAAA,MACL,EAAE,UAAU,KAAK,IAAI,QAAQ,UAAU,MAAM,QAAQ,GAAG,YAAY,SAAS,UAAU,EAAE,IAAI;AAAA,IAC/F;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,kBAAkB,KAAqB,QAA+B;AAC5E,UAAM,YAAuB,OAAO;AAEpC,QAAI,cAAc,SAAS;AACzB,UAAI,UAAU,OAAO,WAAW;AAChC,UAAI,OAAO,CAAC,GAAI,OAAO,QAAQ,CAAC,CAAE;AAElC,OAAC,EAAE,SAAS,KAAK,IAAI,kBAAkB,KAAK,QAAQ,KAAK,IAAI,SAAS,IAAI;AAE1E,gBAAU,mBAAmB,OAAO;AACpC,aAAO,mBAAmB,IAAI;AAE9B,YAAMA,SAAyB;AAAA,QAC7B,MAAM,IAAI,UAAU;AAAA,QACpB,WAAW;AAAA,QACX;AAAA,MACF;AACA,UAAI,KAAK,SAAS,EAAG,CAAAA,OAAM,OAAO;AAClC,YAAM,MAAM,KAAK,UAAU,OAAO,GAAG;AACrC,UAAI,IAAK,CAAAA,OAAM,MAAM;AACrB,aAAOA;AAAA,IACT;AAMA,UAAM,gBACJ,cAAc,SAAS,SAAS;AAClC,UAAM,QAA0B;AAAA,MAC9B,MAAM,IAAI,UAAU;AAAA,MACpB,WAAW;AAAA,MACX,KAAK,mBAAmB,OAAO,OAAO,EAAE;AAAA,IAC1C;AACA,UAAM,UAAU,KAAK,UAAU,OAAO,OAAO;AAC7C,QAAI,QAAS,OAAM,UAAU;AAC7B,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,UACN,KACoC;AACpC,QAAI,CAAC,OAAO,OAAO,KAAK,GAAG,EAAE,WAAW,EAAG,QAAO;AAClD,UAAM,MAA8B,CAAC;AACrC,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,mBAAmB,EAAE,GAAG,IAAI,CAAC,CAAC,GAAG;AACnE,UAAI,CAAC,IAAI,OAAO,CAAC;AAAA,IACnB;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAMA,aAAa,MAAsC;AACjD,WAAO;AAAA,MACL;AAAA,QACE,UAAU,KAAK;AAAA,QACf,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,IACF;AAAA,EACF;AAAA,EAEA,eAAe,MAAsC;AACnD,WAAO;AAAA,MACL;AAAA,QACE,UAAU,KAAK;AAAA,QACf,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAIS,gBAAgB,KAA6C;AACpE,UAAM,OAAO,KAAK,oBAAoB,GAAG;AACzC,UAAM,KAAK,IAAI,UAAU;AACzB,WAAO;AAAA,MACL;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,KAAK,YAAY,SAAS,EAAE;AAAA,QAC9C,OAAO,MAAM;AACX,cAAI,CAAC,IAAI,UAAU,OAAQ,QAAO,EAAE,QAAQ,MAAM,QAAQ,yBAAyB;AACnF,gBAAM,MAAM,KAAK,SAAS,IAAI;AAC9B,gBAAM,OAAO,IAAI,YAAY;AAC7B,gBAAM,UACJ,MAAM,QAAQ,IAAI,KACjB,KAAsB,KAAK,CAAC,MAAM,KAAK,UAAU,CAAC,MAAM,EAAE;AAC7D,iBAAO,UACH,EAAE,QAAQ,MAAM,QAAQ,GAAG,YAAY,SAAS,EAAE,IAAI,IACtD,EAAE,QAAQ,QAAQ,QAAQ,GAAG,YAAY,SAAS,EAAE,kBAAkB,IAAI,GAAG;AAAA,QACnF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA,EAKQ,UAAU,OAAoC;AACpD,QAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,EAAG,QAAO;AACxE,UAAM,OAAQ,MAA6B;AAC3C,WAAO,OAAO,SAAS,WAAW,OAAO;AAAA,EAC3C;AAAA;AAAA,EAGQ,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,YAAY,OAAO,aAAa,WAAW,EAAE,GAAG,MAAM,GAAG,SAAS,IAAI;AAAA,EAC/E;AACF;AAEO,IAAM,UAAU,IAAI,mBAAmB;AAC9C,IAAO,uBAAQ;","names":["entry"]}
@@ -0,0 +1,264 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ resolveEnvRefsDeep
4
+ } from "./chunk-BEFVJ2OE.js";
5
+ import {
6
+ BaseAdapter,
7
+ removeFromObjectMap,
8
+ upsertInObjectMap
9
+ } from "./chunk-VVFDU4IX.js";
10
+ import {
11
+ buildWrappedStdio
12
+ } from "./chunk-HORHRHNG.js";
13
+ import "./chunk-YYNXIUR2.js";
14
+ import {
15
+ ensureDir
16
+ } from "./chunk-IXOQDZWC.js";
17
+
18
+ // src/adapters/open-interpreter/index.ts
19
+ import { existsSync, readFileSync, writeFileSync } from "fs";
20
+ import { homedir } from "os";
21
+ import { dirname, join, resolve } from "path";
22
+ import TOML from "@iarna/toml";
23
+ var HOST = "open-interpreter";
24
+ var MCP_ROOT_KEY = "mcp_servers";
25
+ var OpenInterpreterAdapter = class extends BaseAdapter {
26
+ id = HOST;
27
+ name = "Open Interpreter";
28
+ paradigm = "mcp-only";
29
+ capabilities = {
30
+ // mcp-only: every hook flag is false (no first-party-verified hook surface
31
+ // for the `interpreter` product).
32
+ preToolUse: false,
33
+ postToolUse: false,
34
+ preCompact: false,
35
+ sessionStart: false,
36
+ sessionEnd: false,
37
+ userPromptSubmit: false,
38
+ stop: false,
39
+ notification: false,
40
+ canModifyArgs: false,
41
+ canModifyOutput: false,
42
+ canInjectSessionContext: false,
43
+ // config.toml [mcp_servers] supports stdio (command) + streamable HTTP (url),
44
+ // inheriting codex's transport support.
45
+ transports: ["stdio", "http"]
46
+ };
47
+ // ── Detection ──────────────────────────────────────────────────────────
48
+ detectInstalled(_projectDir) {
49
+ const userDir = this.userConfigDir();
50
+ const userCfg = join(userDir, "config.toml");
51
+ const installed = existsSync(userDir) || existsSync(userCfg);
52
+ return {
53
+ id: this.id,
54
+ name: this.name,
55
+ installed,
56
+ paradigm: this.paradigm,
57
+ capabilities: this.capabilities,
58
+ configPath: userCfg,
59
+ scope: "user",
60
+ reason: installed ? `Found Open Interpreter config dir (${userDir})` : `No Open Interpreter config dir at ${userDir}`,
61
+ confidence: installed ? "high" : "low"
62
+ };
63
+ }
64
+ // ── Native paths ───────────────────────────────────────────────────────
65
+ // User scope only — Open Interpreter (like codex's user scope) keeps its config
66
+ // under the home dir. The home dir is $INTERPRETER_HOME (when set & non-empty)
67
+ // or ~/.openinterpreter; $CODEX_HOME is deliberately NOT consulted (the fork
68
+ // isolates the two identities — codex-rs/utils/home-dir/src/lib.rs).
69
+ getConfigDir(_ctx) {
70
+ return this.userConfigDir();
71
+ }
72
+ getServerConfigPath(ctx) {
73
+ return join(this.getConfigDir(ctx), "config.toml");
74
+ }
75
+ /** Open Interpreter has no separate hook file — alias the hook config path to
76
+ * the MCP file so the generic doctor/backup helpers behave sensibly (the
77
+ * amazon-q / windsurf idiom for mcp-only hosts). */
78
+ getHookConfigPath(ctx) {
79
+ return this.getServerConfigPath(ctx);
80
+ }
81
+ /** $INTERPRETER_HOME (tilde-expanded, then resolved) when set & non-empty,
82
+ * else ~/.openinterpreter. Byte-confirmed against codex-rs/utils/home-dir. */
83
+ userConfigDir() {
84
+ const env = process.env.INTERPRETER_HOME;
85
+ if (env && env.trim() !== "") {
86
+ if (env.startsWith("~")) return join(homedir(), env.replace(/^~[/\\]?/, ""));
87
+ return resolve(env);
88
+ }
89
+ return join(homedir(), ".openinterpreter");
90
+ }
91
+ // ── TOML config IO (config.toml is TOML, not JSON) ───────────────────────
92
+ readToml(path) {
93
+ if (!existsSync(path)) return {};
94
+ try {
95
+ return TOML.parse(readFileSync(path, "utf8"));
96
+ } catch {
97
+ return {};
98
+ }
99
+ }
100
+ writeToml(path, data, dryRun) {
101
+ if (dryRun) return;
102
+ ensureDir(dirname(path));
103
+ writeFileSync(path, TOML.stringify(data), "utf8");
104
+ }
105
+ /** An ObjectMapCodec over config.toml for the core/object-map engine.
106
+ * `isPresentButUnparseable` is `() => false`: readToml fail-softs to {} and the
107
+ * server path coerces/overwrites rather than warn-skip on an unparseable file —
108
+ * matching the codex adapter's coerce policy. */
109
+ tomlObjectMapCodec() {
110
+ return {
111
+ parse: (path) => this.readToml(path),
112
+ serialize: (path, data, dryRun) => this.writeToml(path, data, dryRun),
113
+ isPresentButUnparseable: () => false
114
+ };
115
+ }
116
+ // ── Install server (config.toml → [mcp_servers.<id>]) ───────────────────
117
+ installServer(ctx) {
118
+ const { connector, dryRun } = ctx;
119
+ const server = this.effectiveServer(ctx);
120
+ const path = this.getServerConfigPath(ctx);
121
+ if (!server) {
122
+ return [{ platform: this.id, action: "skip", path, detail: "no server declared" }];
123
+ }
124
+ const isStdio = server.transport === "stdio" && !!server.command;
125
+ const isHttp = server.transport === "http" && !!server.url;
126
+ if (!isStdio && !isHttp) {
127
+ return [
128
+ {
129
+ platform: this.id,
130
+ action: "skip",
131
+ path,
132
+ detail: `transport "${server.transport}" not registrable in config.toml (stdio + streamable-http only)`
133
+ }
134
+ ];
135
+ }
136
+ const symlink = this.symlinkPathWarning(path);
137
+ if (symlink) return [symlink];
138
+ const entry = this.renderMcpEntry(ctx, server);
139
+ return [
140
+ upsertInObjectMap({
141
+ codec: this.tomlObjectMapCodec(),
142
+ rootKey: MCP_ROOT_KEY,
143
+ policy: "coerce",
144
+ platform: this.id,
145
+ configPath: path,
146
+ entryId: connector.id,
147
+ entry,
148
+ dryRun
149
+ })
150
+ ];
151
+ }
152
+ uninstallServer(ctx) {
153
+ const { connector, dryRun } = ctx;
154
+ const path = this.getServerConfigPath(ctx);
155
+ const symlink = this.symlinkPathWarning(path);
156
+ if (symlink) return [symlink];
157
+ return [
158
+ removeFromObjectMap({
159
+ codec: this.tomlObjectMapCodec(),
160
+ rootKey: MCP_ROOT_KEY,
161
+ policy: "coerce",
162
+ platform: this.id,
163
+ configPath: path,
164
+ entryId: connector.id,
165
+ dryRun
166
+ })
167
+ ];
168
+ }
169
+ // ── Hooks (unavailable — Open Interpreter is mcp-only here) ──────────────
170
+ installHooks(_ctx) {
171
+ return [
172
+ {
173
+ platform: this.id,
174
+ action: "skip",
175
+ detail: "hooks unavailable (Open Interpreter is mcp-only)"
176
+ }
177
+ ];
178
+ }
179
+ uninstallHooks(_ctx) {
180
+ return [
181
+ {
182
+ platform: this.id,
183
+ action: "skip",
184
+ detail: "hooks unavailable (Open Interpreter is mcp-only)"
185
+ }
186
+ ];
187
+ }
188
+ // ── Health checks (default doctor renders these) ────────────────────────
189
+ getHealthChecks(ctx) {
190
+ const path = this.getServerConfigPath(ctx);
191
+ const id = ctx.connector.id;
192
+ return [
193
+ {
194
+ name: `${this.name}: config.toml exists`,
195
+ check: () => existsSync(path) ? { status: "OK", detail: path } : { status: "FAIL", detail: `not found: ${path}` }
196
+ },
197
+ {
198
+ name: `${this.name}: ${MCP_ROOT_KEY}.${id} registered`,
199
+ check: () => {
200
+ if (!ctx.connector.server) {
201
+ return { status: "OK", detail: "no MCP server declared" };
202
+ }
203
+ const cfg = this.readToml(path);
204
+ const bucket = cfg[MCP_ROOT_KEY];
205
+ const present = typeof bucket === "object" && bucket !== null && id in bucket;
206
+ return present ? { status: "OK", detail: `${MCP_ROOT_KEY}.${id}` } : { status: "FAIL", detail: `${MCP_ROOT_KEY}.${id} not found in ${path}` };
207
+ }
208
+ }
209
+ ];
210
+ }
211
+ // ── Internal helpers ────────────────────────────────────────────────────
212
+ /** Resolve the per-platform server override into an effective ServerDef. */
213
+ effectiveServer(ctx) {
214
+ const override = ctx.connector.platforms[this.id]?.server;
215
+ if (override === false) return void 0;
216
+ const base = ctx.connector.server;
217
+ if (!base) return void 0;
218
+ return override ? { ...base, ...override } : base;
219
+ }
220
+ /**
221
+ * Render the `[mcp_servers.<id>]` table. TOML has NO interpolation, so every
222
+ * `${env:VAR}` is resolved to a literal at install time. Honors the telemetry
223
+ * serve-wrapper for stdio.
224
+ */
225
+ renderMcpEntry(ctx, server) {
226
+ if (server.transport === "http") {
227
+ const remote = { url: resolveEnvRefsDeep(server.url ?? "") };
228
+ if (server.auth?.type === "bearerEnv" && server.auth.bearerEnvVar) {
229
+ remote.bearer_token_env_var = server.auth.bearerEnvVar;
230
+ }
231
+ if (server.headers && Object.keys(server.headers).length > 0) {
232
+ const headers = {};
233
+ for (const [k, v] of Object.entries(resolveEnvRefsDeep(server.headers))) {
234
+ headers[k] = String(v);
235
+ }
236
+ remote.http_headers = headers;
237
+ }
238
+ return remote;
239
+ }
240
+ let command = server.command;
241
+ let args = [...server.args ?? []];
242
+ ({ command, args } = buildWrappedStdio(ctx, server, this.id, command, args));
243
+ command = resolveEnvRefsDeep(command);
244
+ args = resolveEnvRefsDeep(args);
245
+ const entry = { command };
246
+ if (args.length > 0) entry.args = args;
247
+ if (server.env && Object.keys(server.env).length > 0) {
248
+ const env = {};
249
+ for (const [k, v] of Object.entries(resolveEnvRefsDeep(server.env))) {
250
+ env[k] = String(v);
251
+ }
252
+ entry.env = env;
253
+ }
254
+ return entry;
255
+ }
256
+ };
257
+ var adapter = new OpenInterpreterAdapter();
258
+ var open_interpreter_default = adapter;
259
+ export {
260
+ OpenInterpreterAdapter,
261
+ adapter,
262
+ open_interpreter_default as default
263
+ };
264
+ //# sourceMappingURL=open-interpreter-4PKL56AA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/adapters/open-interpreter/index.ts"],"sourcesContent":["/**\n * adapters/open-interpreter — Open Interpreter (the new Rust `interpreter` / `i`\n * CLI) platform adapter for agent-connector.\n *\n * Open Interpreter is a FORK of OpenAI's Codex. The project's own README states\n * verbatim: \"This is the new Rust version of Open Interpreter … Open Interpreter\n * is a fork of OpenAI's Codex, with a focus on emulating the agent harness that\n * gets the best performance out of low-cost models.\" (The original Python project\n * lives on as the community fork endolith/open-interpreter.) The repo at\n * github.com/openinterpreter/open-interpreter IS the codex-rs source tree.\n *\n * Because it is Codex, the native MCP config is Codex's:\n * - config file → <home>/config.toml (CONFIG_TOML_FILE = \"config.toml\";\n * codex-rs/config/src/lib.rs:33), TOML.\n * - MCP table → `[mcp_servers.<id>]` (codex-rs/config/src/mcp_edit.rs:\n * replace_mcp_servers inserts root key \"mcp_servers\"). stdio entry shape is\n * { command, args, env } and the streamable-HTTP entry is { url,\n * bearer_token_env_var?, http_headers? } (codex-rs/config/src/mcp_types.rs\n * RawMcpServerConfig). TOML has NO native interpolation, so `${env:VAR}` refs\n * resolve to LITERALS at install time (same rule as the codex adapter).\n *\n * Config HOME (byte-confirmed against codex-rs/utils/home-dir/src/lib.rs):\n * - The `interpreter` binary deliberately does NOT honor $CODEX_HOME (\"sharing\n * the Codex home leaks Codex config, update caches, and credentials into the\n * Interpreter identity\"). The ONLY honored override is $INTERPRETER_HOME, and\n * the default is ~/.openinterpreter. The install script\n * (scripts/install/install-open-interpreter.sh) confirms both: it sets\n * CODEX_COMMAND_NAME=interpreter and CODEX_HOME=\"${INTERPRETER_HOME:-$HOME/.openinterpreter}\".\n *\n * Paradigm: mcp-only. Codex's hook subsystem (codex-rs/hooks) is present in the\n * fork, but the `interpreter` PRODUCT's live hook wire contract is not first-party\n * verified here (a live authenticated run, which we cannot perform). Following the\n * project rule \"MCP-only unless hooks byte-confirmed\", this adapter registers the\n * MCP server only and reports hooks unavailable.\n *\n * Mirrors the codex adapter's TOML object-map machinery (shared @iarna/toml codec\n * + the core/object-map engine, policy \"coerce\"), trimmed to the MCP surface.\n */\n\nimport { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, join, resolve } from \"node:path\";\n\nimport TOML from \"@iarna/toml\";\n\nimport type {\n ChangeRecord,\n DetectedPlatform,\n HealthCheck,\n HookParadigm,\n PlatformCapabilities,\n PlatformId,\n ServerDef,\n} from \"../../core/types.js\";\nimport { ensureDir } from \"../../core/paths.js\";\nimport { resolveEnvRefsDeep } from \"../../core/interpolate.js\";\nimport {\n removeFromObjectMap,\n upsertInObjectMap,\n type ObjectMapCodec,\n} from \"../../core/object-map.js\";\nimport { buildWrappedStdio } from \"../../core/spawn.js\";\nimport { BaseAdapter } from \"../base.js\";\nimport type { InstallContext } from \"../spi.js\";\n\nconst HOST: PlatformId = \"open-interpreter\";\nconst MCP_ROOT_KEY = \"mcp_servers\";\n\n/** Rendered `[mcp_servers.<id>]` table — string env table, no interpolation. */\ninterface OpenInterpreterMcpEntry {\n // stdio transport\n command?: string;\n args?: string[];\n env?: Record<string, string>;\n // streamable HTTP transport (remote): transport is inferred from `url`\n // (no explicit transport key), exactly like codex.\n url?: string;\n bearer_token_env_var?: string;\n http_headers?: Record<string, string>;\n}\n\nexport class OpenInterpreterAdapter extends BaseAdapter {\n readonly id: PlatformId = HOST;\n readonly name = \"Open Interpreter\";\n readonly paradigm: HookParadigm = \"mcp-only\";\n\n readonly capabilities: PlatformCapabilities = {\n // mcp-only: every hook flag is false (no first-party-verified hook surface\n // for the `interpreter` product).\n preToolUse: false,\n postToolUse: false,\n preCompact: false,\n sessionStart: false,\n sessionEnd: false,\n userPromptSubmit: false,\n stop: false,\n notification: false,\n canModifyArgs: false,\n canModifyOutput: false,\n canInjectSessionContext: false,\n // config.toml [mcp_servers] supports stdio (command) + streamable HTTP (url),\n // inheriting codex's transport support.\n transports: [\"stdio\", \"http\"],\n };\n\n // ── Detection ──────────────────────────────────────────────────────────\n\n detectInstalled(_projectDir: string): DetectedPlatform {\n const userDir = this.userConfigDir();\n const userCfg = join(userDir, \"config.toml\");\n const installed = existsSync(userDir) || existsSync(userCfg);\n return {\n id: this.id,\n name: this.name,\n installed,\n paradigm: this.paradigm,\n capabilities: this.capabilities,\n configPath: userCfg,\n scope: \"user\",\n reason: installed\n ? `Found Open Interpreter config dir (${userDir})`\n : `No Open Interpreter config dir at ${userDir}`,\n confidence: installed ? \"high\" : \"low\",\n };\n }\n\n // ── Native paths ───────────────────────────────────────────────────────\n // User scope only — Open Interpreter (like codex's user scope) keeps its config\n // under the home dir. The home dir is $INTERPRETER_HOME (when set & non-empty)\n // or ~/.openinterpreter; $CODEX_HOME is deliberately NOT consulted (the fork\n // isolates the two identities — codex-rs/utils/home-dir/src/lib.rs).\n\n override getConfigDir(_ctx: InstallContext): string {\n return this.userConfigDir();\n }\n\n override getServerConfigPath(ctx: InstallContext): string {\n return join(this.getConfigDir(ctx), \"config.toml\");\n }\n\n /** Open Interpreter has no separate hook file — alias the hook config path to\n * the MCP file so the generic doctor/backup helpers behave sensibly (the\n * amazon-q / windsurf idiom for mcp-only hosts). */\n override getHookConfigPath(ctx: InstallContext): string {\n return this.getServerConfigPath(ctx);\n }\n\n /** $INTERPRETER_HOME (tilde-expanded, then resolved) when set & non-empty,\n * else ~/.openinterpreter. Byte-confirmed against codex-rs/utils/home-dir. */\n private userConfigDir(): string {\n const env = process.env.INTERPRETER_HOME;\n if (env && env.trim() !== \"\") {\n if (env.startsWith(\"~\")) return join(homedir(), env.replace(/^~[/\\\\]?/, \"\"));\n return resolve(env);\n }\n return join(homedir(), \".openinterpreter\");\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 /** An ObjectMapCodec over config.toml for the core/object-map engine.\n * `isPresentButUnparseable` is `() => false`: readToml fail-softs to {} and the\n * server path coerces/overwrites rather than warn-skip on an unparseable file —\n * matching the codex adapter's coerce policy. */\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 isHttp = server.transport === \"http\" && !!server.url;\n if (!isStdio && !isHttp) {\n // config.toml [mcp_servers] supports stdio (command) + streamable HTTP\n // (url). Other remote transports (sse/ws) have no analog.\n return [\n {\n platform: this.id,\n action: \"skip\",\n path,\n detail: `transport \"${server.transport}\" not registrable in config.toml (stdio + streamable-http only)`,\n },\n ];\n }\n\n const symlink = this.symlinkPathWarning(path);\n if (symlink) return [symlink];\n\n const entry = this.renderMcpEntry(ctx, server);\n\n return [\n upsertInObjectMap({\n codec: this.tomlObjectMapCodec(),\n rootKey: MCP_ROOT_KEY,\n policy: \"coerce\",\n platform: this.id,\n configPath: path,\n entryId: connector.id,\n entry,\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_ROOT_KEY,\n policy: \"coerce\",\n platform: this.id,\n configPath: path,\n entryId: connector.id,\n dryRun,\n }),\n ];\n }\n\n // ── Hooks (unavailable — Open Interpreter is mcp-only here) ──────────────\n\n override installHooks(_ctx: InstallContext): ChangeRecord[] {\n return [\n {\n platform: this.id,\n action: \"skip\",\n detail: \"hooks unavailable (Open Interpreter is mcp-only)\",\n },\n ];\n }\n\n override uninstallHooks(_ctx: InstallContext): ChangeRecord[] {\n return [\n {\n platform: this.id,\n action: \"skip\",\n detail: \"hooks unavailable (Open Interpreter is mcp-only)\",\n },\n ];\n }\n\n // ── Health checks (default doctor renders these) ────────────────────────\n\n override getHealthChecks(ctx: InstallContext): readonly HealthCheck[] {\n const path = this.getServerConfigPath(ctx);\n const id = ctx.connector.id;\n return [\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_ROOT_KEY}.${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 cfg = this.readToml(path);\n const bucket = cfg[MCP_ROOT_KEY];\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_ROOT_KEY}.${id}` }\n : { status: \"FAIL\", detail: `${MCP_ROOT_KEY}.${id} not found in ${path}` };\n },\n },\n ];\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}` is resolved to a literal at install time. Honors the telemetry\n * serve-wrapper for stdio.\n */\n private renderMcpEntry(ctx: InstallContext, server: ServerDef): OpenInterpreterMcpEntry {\n // Streamable HTTP server: transport is inferred from `url` (no explicit\n // transport key), exactly like codex. Telemetry serve-wrapping is stdio-only\n // (remote cannot be intercepted). installServer's guard only lets stdio+command\n // or http+url reach here, so this branch is exactly the streamable-HTTP case.\n if (server.transport === \"http\") {\n const remote: OpenInterpreterMcpEntry = { url: resolveEnvRefsDeep(server.url ?? \"\") };\n if (server.auth?.type === \"bearerEnv\" && server.auth.bearerEnvVar) {\n remote.bearer_token_env_var = server.auth.bearerEnvVar;\n }\n if (server.headers && Object.keys(server.headers).length > 0) {\n const headers: Record<string, string> = {};\n for (const [k, v] of Object.entries(resolveEnvRefsDeep(server.headers))) {\n headers[k] = String(v);\n }\n remote.http_headers = headers;\n }\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: OpenInterpreterMcpEntry = { 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 return entry;\n }\n}\n\nexport const adapter = new OpenInterpreterAdapter();\nexport default adapter;\n"],"mappings":"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","names":[]}