aemeathcli 1.0.11 → 1.0.12
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/LICENSE +21 -21
- package/README.md +620 -609
- package/dist/{App-YAHJUWCX.js → App-JQ622M66.js} +209 -52
- package/dist/App-JQ622M66.js.map +1 -0
- package/dist/agent-store/architect.md +32 -32
- package/dist/agent-store/debugger.md +32 -32
- package/dist/agent-store/developer.md +29 -29
- package/dist/agent-store/documenter.md +30 -30
- package/dist/agent-store/researcher.md +31 -31
- package/dist/agent-store/reviewer.md +28 -28
- package/dist/agent-store/supervisor.md +37 -37
- package/dist/agent-store/tester.md +30 -30
- package/dist/api-key-fallback-RJLPM3KH.js +11 -0
- package/dist/{api-key-fallback-UN3TJEOO.js.map → api-key-fallback-RJLPM3KH.js.map} +1 -1
- package/dist/auth-status-JQJOKUPF.js +13 -0
- package/dist/{auth-status-EIM5A5KL.js.map → auth-status-JQJOKUPF.js.map} +1 -1
- package/dist/{chunk-P66WDACW.js → chunk-2KMA5RBC.js} +18 -42
- package/dist/chunk-2KMA5RBC.js.map +1 -0
- package/dist/{chunk-2GKOK6T7.js → chunk-2Y7TR6BS.js} +2 -2
- package/dist/chunk-2Y7TR6BS.js.map +1 -0
- package/dist/{chunk-ONQ4WCUI.js → chunk-2ZYK5IJG.js} +6 -6
- package/dist/chunk-2ZYK5IJG.js.map +1 -0
- package/dist/{chunk-OCJPQFOR.js → chunk-36RXCZOV.js} +4 -4
- package/dist/chunk-36RXCZOV.js.map +1 -0
- package/dist/{chunk-H2SYKIMI.js → chunk-7EBLXPL4.js} +10 -10
- package/dist/chunk-7EBLXPL4.js.map +1 -0
- package/dist/{chunk-IARA5XYP.js → chunk-BIMQL4AG.js} +4 -4
- package/dist/chunk-BIMQL4AG.js.map +1 -0
- package/dist/{chunk-BY4DAKUU.js → chunk-D275MCIH.js} +2 -2
- package/dist/chunk-D275MCIH.js.map +1 -0
- package/dist/{chunk-SOQFMNQC.js → chunk-FFS4T7BZ.js} +5 -5
- package/dist/chunk-FFS4T7BZ.js.map +1 -0
- package/dist/{chunk-LDVY5ELP.js → chunk-GXAJGP2T.js} +5 -5
- package/dist/chunk-GXAJGP2T.js.map +1 -0
- package/dist/{chunk-62HSGYQD.js → chunk-HCIHOHLX.js} +2 -2
- package/dist/chunk-HCIHOHLX.js.map +1 -0
- package/dist/{chunk-6GUD7QIM.js → chunk-HESQLCLU.js} +4 -4
- package/dist/chunk-HESQLCLU.js.map +1 -0
- package/dist/{chunk-HEKFAKVH.js → chunk-IR5HLBMH.js} +2 -2
- package/dist/chunk-IR5HLBMH.js.map +1 -0
- package/dist/{chunk-2LF7ALGR.js → chunk-K2FCMRXH.js} +4 -4
- package/dist/chunk-K2FCMRXH.js.map +1 -0
- package/dist/{chunk-2NWNIKBK.js → chunk-KIC7UI5U.js} +4 -4
- package/dist/chunk-KIC7UI5U.js.map +1 -0
- package/dist/{chunk-YPFOE2QJ.js → chunk-KMOAJRDE.js} +5 -5
- package/dist/chunk-KMOAJRDE.js.map +1 -0
- package/dist/{chunk-RP2TAL3J.js → chunk-LQBALETG.js} +2 -2
- package/dist/chunk-LQBALETG.js.map +1 -0
- package/dist/{chunk-CC7MGWYY.js → chunk-M3FPQSRU.js} +2 -2
- package/dist/chunk-M3FPQSRU.js.map +1 -0
- package/dist/{chunk-3TSPZRGM.js → chunk-NQEUK763.js} +3 -3
- package/dist/chunk-NQEUK763.js.map +1 -0
- package/dist/{chunk-VBLLDY4R.js → chunk-OPWAFS6Y.js} +2 -2
- package/dist/chunk-OPWAFS6Y.js.map +1 -0
- package/dist/{chunk-RYOB3TLZ.js → chunk-PS4WEFW6.js} +6 -6
- package/dist/chunk-PS4WEFW6.js.map +1 -0
- package/dist/{chunk-LCYH4T6N.js → chunk-QK7TKNHV.js} +6 -6
- package/dist/chunk-QK7TKNHV.js.map +1 -0
- package/dist/{chunk-QCRK4QEL.js → chunk-RADJSEG5.js} +3 -3
- package/dist/chunk-RADJSEG5.js.map +1 -0
- package/dist/{chunk-AQ23TYSQ.js → chunk-SNWPI6XJ.js} +4 -4
- package/dist/chunk-SNWPI6XJ.js.map +1 -0
- package/dist/{chunk-TDFTX32B.js → chunk-UM7MSLOV.js} +4 -4
- package/dist/chunk-UM7MSLOV.js.map +1 -0
- package/dist/{chunk-FIC7AK4Q.js → chunk-VNZ3YTQD.js} +5 -5
- package/dist/chunk-VNZ3YTQD.js.map +1 -0
- package/dist/{chunk-5XFSV6PF.js → chunk-WXIN65UG.js} +6 -6
- package/dist/chunk-WXIN65UG.js.map +1 -0
- package/dist/{chunk-WC72BRHR.js → chunk-XEXWX7C7.js} +3 -3
- package/dist/chunk-XEXWX7C7.js.map +1 -0
- package/dist/{chunk-VJNQJALF.js → chunk-YCCYXDW7.js} +4 -4
- package/dist/chunk-YCCYXDW7.js.map +1 -0
- package/dist/{chunk-ROJPFPJ7.js → chunk-YL5XFHR3.js} +2 -2
- package/dist/chunk-YL5XFHR3.js.map +1 -0
- package/dist/{chunk-GU33WKPG.js → chunk-YPQ2MLAV.js} +5 -5
- package/dist/chunk-YPQ2MLAV.js.map +1 -0
- package/dist/{chunk-WAYSJMPS.js → chunk-ZCOVMVK4.js} +2 -2
- package/dist/chunk-ZCOVMVK4.js.map +1 -0
- package/dist/{chunk-473JN6M5.js → chunk-ZGOHARPV.js} +2 -2
- package/dist/chunk-ZGOHARPV.js.map +1 -0
- package/dist/{claude-login-IS5WTBMP.js → claude-login-AIFIWTYF.js} +10 -10
- package/dist/claude-login-AIFIWTYF.js.map +1 -0
- package/dist/cli.js +30 -30
- package/dist/cli.js.map +1 -1
- package/dist/{codex-login-GMPF64MR.js → codex-login-LW5X7GAM.js} +10 -10
- package/dist/codex-login-LW5X7GAM.js.map +1 -0
- package/dist/config-store-NF56VHFU.js +7 -0
- package/dist/{config-store-POB6I37G.js.map → config-store-NF56VHFU.js.map} +1 -1
- package/dist/conversation-store-7GRDQZD2.js +4 -0
- package/dist/{conversation-store-PRBHWQMJ.js.map → conversation-store-7GRDQZD2.js.map} +1 -1
- package/dist/detect-providers-QICJ5U3R.js +4 -0
- package/dist/{detect-providers-C4SVQHFF.js.map → detect-providers-QICJ5U3R.js.map} +1 -1
- package/dist/executor-FTABX2AW.js +4 -0
- package/dist/{executor-RUX7VK3T.js.map → executor-FTABX2AW.js.map} +1 -1
- package/dist/{first-run-GDEVRFPO.js → first-run-ADROZVYF.js} +13 -13
- package/dist/first-run-ADROZVYF.js.map +1 -0
- package/dist/{gemini-login-KE224MSW.js → gemini-login-TST454MX.js} +10 -10
- package/dist/gemini-login-TST454MX.js.map +1 -0
- package/dist/index.d.ts +2 -56
- package/dist/index.js +30 -34
- package/dist/index.js.map +1 -1
- package/dist/{input-history-MIOO3FIW.js → input-history-BEICE7PT.js} +3 -3
- package/dist/input-history-BEICE7PT.js.map +1 -0
- package/dist/kimi-adapter-7FYOAKOI.js +6 -0
- package/dist/{kimi-adapter-UODMNX6K.js.map → kimi-adapter-7FYOAKOI.js.map} +1 -1
- package/dist/{kimi-login-DNT5YBKX.js → kimi-login-3IGVOBJI.js} +10 -10
- package/dist/kimi-login-3IGVOBJI.js.map +1 -0
- package/dist/logger-KGHUQ4VE.js +3 -0
- package/dist/{logger-PLPDWACQ.js.map → logger-KGHUQ4VE.js.map} +1 -1
- package/dist/model-discovery-AAJDHRFO.js +6 -0
- package/dist/{model-discovery-O64ZWPX5.js.map → model-discovery-AAJDHRFO.js.map} +1 -1
- package/dist/native-cli-adapters-CLONTZOA.js +8 -0
- package/dist/{native-cli-adapters-JMZX2C2C.js.map → native-cli-adapters-CLONTZOA.js.map} +1 -1
- package/dist/ollama-adapter-2N5OQIEV.js +5 -0
- package/dist/{ollama-adapter-GE67BNSS.js.map → ollama-adapter-2N5OQIEV.js.map} +1 -1
- package/dist/{pathResolver-A6IXQQFE.js → pathResolver-UVAB2FCW.js} +3 -3
- package/dist/{pathResolver-A6IXQQFE.js.map → pathResolver-UVAB2FCW.js.map} +1 -1
- package/dist/{profile-loader-TNAXBLDX.js → profile-loader-EMLV4J7S.js} +4 -4
- package/dist/profile-loader-EMLV4J7S.js.map +1 -0
- package/dist/registry-LRURZVUL.js +5 -0
- package/dist/{registry-3NHVCXCZ.js.map → registry-LRURZVUL.js.map} +1 -1
- package/dist/registry-MVNSXCEF.js +6 -0
- package/dist/{registry-7CQ3NCAD.js.map → registry-MVNSXCEF.js.map} +1 -1
- package/dist/server-manager-THGZBBZB.js +5 -0
- package/dist/{server-manager-DES23IBQ.js.map → server-manager-THGZBBZB.js.map} +1 -1
- package/dist/session-manager-X3DXT53M.js +12 -0
- package/dist/{session-manager-EHD7GWM2.js.map → session-manager-X3DXT53M.js.map} +1 -1
- package/dist/skills/built-in/code-review/SKILL.md +85 -85
- package/dist/skills/built-in/commit/SKILL.md +83 -83
- package/dist/skills/built-in/debug/SKILL.md +119 -119
- package/dist/skills/built-in/plan/SKILL.md +123 -123
- package/dist/skills/built-in/refactor/SKILL.md +132 -132
- package/dist/skills/built-in/test/SKILL.md +128 -128
- package/dist/sqlite-store-7OECRTXM.js +5 -0
- package/dist/{sqlite-store-7ZIVOUNI.js.map → sqlite-store-7OECRTXM.js.map} +1 -1
- package/dist/team-manager-2VSMALAA.js +11 -0
- package/dist/{team-manager-6DCNLGTC.js.map → team-manager-2VSMALAA.js.map} +1 -1
- package/dist/team-state-HZNVMQHT.js +3 -0
- package/dist/{team-state-R2D7DT5M.js.map → team-state-HZNVMQHT.js.map} +1 -1
- package/dist/tmux-manager-57QCUVHU.js +6 -0
- package/dist/{tmux-manager-WBKHUHDT.js.map → tmux-manager-57QCUVHU.js.map} +1 -1
- package/dist/tools-KWFSYT56.js +6 -0
- package/dist/{tools-I6XCTEZY.js.map → tools-KWFSYT56.js.map} +1 -1
- package/package.json +89 -93
- package/dist/App-YAHJUWCX.js.map +0 -1
- package/dist/api-key-fallback-UN3TJEOO.js +0 -11
- package/dist/auth-status-EIM5A5KL.js +0 -13
- package/dist/chunk-25UNNEHN.js +0 -140
- package/dist/chunk-25UNNEHN.js.map +0 -1
- package/dist/chunk-2GKOK6T7.js.map +0 -1
- package/dist/chunk-2LF7ALGR.js.map +0 -1
- package/dist/chunk-2NWNIKBK.js.map +0 -1
- package/dist/chunk-3TSPZRGM.js.map +0 -1
- package/dist/chunk-473JN6M5.js.map +0 -1
- package/dist/chunk-5XFSV6PF.js.map +0 -1
- package/dist/chunk-62HSGYQD.js.map +0 -1
- package/dist/chunk-6GUD7QIM.js.map +0 -1
- package/dist/chunk-AQ23TYSQ.js.map +0 -1
- package/dist/chunk-BY4DAKUU.js.map +0 -1
- package/dist/chunk-CC7MGWYY.js.map +0 -1
- package/dist/chunk-CTFZTARK.js +0 -155
- package/dist/chunk-CTFZTARK.js.map +0 -1
- package/dist/chunk-FIC7AK4Q.js.map +0 -1
- package/dist/chunk-GU33WKPG.js.map +0 -1
- package/dist/chunk-H2SYKIMI.js.map +0 -1
- package/dist/chunk-HEKFAKVH.js.map +0 -1
- package/dist/chunk-IARA5XYP.js.map +0 -1
- package/dist/chunk-LCYH4T6N.js.map +0 -1
- package/dist/chunk-LDVY5ELP.js.map +0 -1
- package/dist/chunk-OCJPQFOR.js.map +0 -1
- package/dist/chunk-ODBY7S4X.js +0 -141
- package/dist/chunk-ODBY7S4X.js.map +0 -1
- package/dist/chunk-ONQ4WCUI.js.map +0 -1
- package/dist/chunk-P5TKZM3T.js +0 -159
- package/dist/chunk-P5TKZM3T.js.map +0 -1
- package/dist/chunk-P66WDACW.js.map +0 -1
- package/dist/chunk-QCRK4QEL.js.map +0 -1
- package/dist/chunk-ROJPFPJ7.js.map +0 -1
- package/dist/chunk-RP2TAL3J.js.map +0 -1
- package/dist/chunk-RYOB3TLZ.js.map +0 -1
- package/dist/chunk-SOQFMNQC.js.map +0 -1
- package/dist/chunk-TDFTX32B.js.map +0 -1
- package/dist/chunk-VBLLDY4R.js.map +0 -1
- package/dist/chunk-VJNQJALF.js.map +0 -1
- package/dist/chunk-WAYSJMPS.js.map +0 -1
- package/dist/chunk-WC72BRHR.js.map +0 -1
- package/dist/chunk-YPFOE2QJ.js.map +0 -1
- package/dist/claude-adapter-6P4SJH7P.js +0 -7
- package/dist/claude-adapter-6P4SJH7P.js.map +0 -1
- package/dist/claude-login-IS5WTBMP.js.map +0 -1
- package/dist/codex-login-GMPF64MR.js.map +0 -1
- package/dist/config-store-POB6I37G.js +0 -7
- package/dist/conversation-store-PRBHWQMJ.js +0 -4
- package/dist/detect-providers-C4SVQHFF.js +0 -4
- package/dist/executor-RUX7VK3T.js +0 -4
- package/dist/first-run-GDEVRFPO.js.map +0 -1
- package/dist/gemini-adapter-MV3U4QFH.js +0 -7
- package/dist/gemini-adapter-MV3U4QFH.js.map +0 -1
- package/dist/gemini-login-KE224MSW.js.map +0 -1
- package/dist/input-history-MIOO3FIW.js.map +0 -1
- package/dist/kimi-adapter-UODMNX6K.js +0 -6
- package/dist/kimi-login-DNT5YBKX.js.map +0 -1
- package/dist/logger-PLPDWACQ.js +0 -3
- package/dist/model-discovery-O64ZWPX5.js +0 -6
- package/dist/native-cli-adapters-JMZX2C2C.js +0 -8
- package/dist/ollama-adapter-GE67BNSS.js +0 -5
- package/dist/openai-adapter-SHPLK77L.js +0 -7
- package/dist/openai-adapter-SHPLK77L.js.map +0 -1
- package/dist/profile-loader-TNAXBLDX.js.map +0 -1
- package/dist/registry-3NHVCXCZ.js +0 -6
- package/dist/registry-7CQ3NCAD.js +0 -5
- package/dist/server-manager-DES23IBQ.js +0 -5
- package/dist/session-manager-EHD7GWM2.js +0 -12
- package/dist/sqlite-store-7ZIVOUNI.js +0 -5
- package/dist/team-manager-6DCNLGTC.js +0 -11
- package/dist/team-state-R2D7DT5M.js +0 -3
- package/dist/tmux-manager-WBKHUHDT.js +0 -6
- package/dist/tools-I6XCTEZY.js +0 -6
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/mcp/client.ts","../src/mcp/server-manager.ts"],"names":[],"mappings":"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","file":"chunk-K2FCMRXH.js","sourcesContent":["/**\n * MCP client per PRD section 11.1\n * Wraps @modelcontextprotocol/sdk Client with typed, transport-agnostic interface.\n * Supports stdio (local servers) and Streamable HTTP (remote servers).\n */\n\nimport { Client } from \"@modelcontextprotocol/sdk/client/index.js\";\nimport { StdioClientTransport } from \"@modelcontextprotocol/sdk/client/stdio.js\";\nimport type { Transport } from \"@modelcontextprotocol/sdk/shared/transport.js\";\nimport { logger } from \"../utils/logger.js\";\nimport { ServerConnectionError, ToolCallError } from \"../types/errors.js\";\n\n// ── Exported Types ──────────────────────────────────────────────────────\n\nexport interface IMCPToolSchema {\n readonly name: string;\n readonly description: string;\n readonly inputSchema: Readonly<Record<string, unknown>>;\n}\n\nexport interface IMCPCallResult {\n readonly content: string;\n readonly isError: boolean;\n}\n\nexport interface IMCPResource {\n readonly uri: string;\n readonly name: string;\n readonly description: string;\n readonly mimeType: string;\n}\n\n// ── Transport Configuration ─────────────────────────────────────────────\n\nexport interface IStdioTransportConfig {\n readonly type: \"stdio\";\n readonly command: string;\n readonly args: readonly string[];\n readonly env?: Readonly<Record<string, string>>;\n}\n\nexport interface IHttpTransportConfig {\n readonly type: \"streamable-http\";\n readonly url: string;\n}\n\nexport type MCPTransportConfig = IStdioTransportConfig | IHttpTransportConfig;\n\n// ── Client Options ──────────────────────────────────────────────────────\n\nexport interface IMCPClientOptions {\n readonly serverName: string;\n readonly transport: MCPTransportConfig;\n readonly connectionTimeoutMs?: number;\n}\n\n// ── Constants ───────────────────────────────────────────────────────────\n\nconst DEFAULT_TIMEOUT_MS = 30_000;\nconst CLIENT_NAME = \"aemeathcli\";\nconst CLIENT_VERSION = \"1.0.0\";\n\n// ── Content Helpers ─────────────────────────────────────────────────────\n\ninterface IContentItem {\n readonly type: string;\n readonly text?: string;\n}\n\nfunction extractText(content: unknown): string {\n if (!Array.isArray(content)) {\n return \"No output\";\n }\n const parts: string[] = [];\n for (const item of content as ReadonlyArray<IContentItem>) {\n if (item.type === \"text\" && typeof item.text === \"string\") {\n parts.push(item.text);\n }\n }\n return parts.length > 0 ? parts.join(\"\\n\") : \"No output\";\n}\n\n// ── MCPClient ───────────────────────────────────────────────────────────\n\nexport class MCPClient {\n private client: Client | undefined;\n private connected = false;\n private readonly serverName: string;\n private readonly transportConfig: MCPTransportConfig;\n private readonly connectionTimeoutMs: number;\n\n constructor(options: IMCPClientOptions) {\n this.serverName = options.serverName;\n this.transportConfig = options.transport;\n this.connectionTimeoutMs = options.connectionTimeoutMs ?? DEFAULT_TIMEOUT_MS;\n }\n\n get isConnected(): boolean {\n return this.connected;\n }\n\n get name(): string {\n return this.serverName;\n }\n\n /** Establish connection to the MCP server. */\n async connect(): Promise<void> {\n if (this.connected) {\n return;\n }\n\n logger.info({ server: this.serverName }, \"Connecting to MCP server\");\n\n try {\n this.client = new Client(\n { name: CLIENT_NAME, version: CLIENT_VERSION },\n { capabilities: { sampling: {} } },\n );\n\n await this.connectWithTimeout();\n this.connected = true;\n logger.info({ server: this.serverName }, \"Connected to MCP server\");\n } catch (error: unknown) {\n this.connected = false;\n this.client = undefined;\n const msg = error instanceof Error ? error.message : String(error);\n throw new ServerConnectionError(this.serverName, msg);\n }\n }\n\n /** Gracefully close the MCP connection. */\n async disconnect(): Promise<void> {\n if (!this.connected || !this.client) {\n return;\n }\n\n logger.info({ server: this.serverName }, \"Disconnecting from MCP server\");\n\n try {\n await this.client.close();\n } catch (error: unknown) {\n logger.warn({ server: this.serverName, error }, \"Error during MCP disconnect\");\n } finally {\n this.connected = false;\n this.client = undefined;\n }\n }\n\n /** Disconnect then reconnect to the server. */\n async reconnect(): Promise<void> {\n await this.disconnect();\n await this.connect();\n }\n\n /** List all tools exposed by this MCP server. */\n async listTools(): Promise<readonly IMCPToolSchema[]> {\n const client = this.requireConnected();\n\n try {\n const result = await client.listTools();\n return result.tools.map((tool) => ({\n name: tool.name,\n description: typeof tool.description === \"string\" ? tool.description : \"\",\n inputSchema: tool.inputSchema as Readonly<Record<string, unknown>>,\n }));\n } catch (error: unknown) {\n const msg = error instanceof Error ? error.message : String(error);\n throw new ServerConnectionError(this.serverName, `listTools failed: ${msg}`);\n }\n }\n\n /** Call a tool on this MCP server with the given arguments. */\n async callTool(\n toolName: string,\n args: Record<string, unknown>,\n ): Promise<IMCPCallResult> {\n const client = this.requireConnected();\n\n try {\n const result = await client.callTool({ name: toolName, arguments: args });\n return {\n content: extractText(result.content),\n isError: result.isError === true,\n };\n } catch (error: unknown) {\n const msg = error instanceof Error ? error.message : String(error);\n throw new ToolCallError(toolName, msg);\n }\n }\n\n /** List resources exposed by this MCP server. */\n async listResources(): Promise<readonly IMCPResource[]> {\n const client = this.requireConnected();\n\n try {\n const result = await client.listResources();\n return result.resources.map((r) => ({\n uri: r.uri,\n name: typeof r.name === \"string\" ? r.name : r.uri,\n description: \"\",\n mimeType: typeof r.mimeType === \"string\" ? r.mimeType : \"application/octet-stream\",\n }));\n } catch (error: unknown) {\n const msg = error instanceof Error ? error.message : String(error);\n throw new ServerConnectionError(\n this.serverName,\n `listResources failed: ${msg}`,\n );\n }\n }\n\n /** Read a specific resource by URI. */\n async readResource(uri: string): Promise<string> {\n const client = this.requireConnected();\n\n try {\n const result = await client.readResource({ uri });\n return extractText(result.contents);\n } catch (error: unknown) {\n const msg = error instanceof Error ? error.message : String(error);\n throw new ServerConnectionError(\n this.serverName,\n `readResource(${uri}) failed: ${msg}`,\n );\n }\n }\n\n // ── Private Helpers ─────────────────────────────────────────────────\n\n private async connectWithTimeout(): Promise<void> {\n const client = this.client;\n if (!client) {\n throw new Error(\"Client not initialised\");\n }\n\n const timeoutPromise = new Promise<never>((_resolve, reject) => {\n setTimeout(\n () => {\n reject(new Error(`Connection timed out after ${this.connectionTimeoutMs}ms`));\n },\n this.connectionTimeoutMs,\n );\n });\n\n if (this.transportConfig.type === \"stdio\") {\n const transport = new StdioClientTransport({\n command: this.transportConfig.command,\n args: [...this.transportConfig.args],\n ...(this.transportConfig.env !== undefined\n ? { env: { ...this.transportConfig.env } }\n : {}),\n });\n await Promise.race([client.connect(transport), timeoutPromise]);\n return;\n }\n\n else {\n const { StreamableHTTPClientTransport } = await import(\n \"@modelcontextprotocol/sdk/client/streamableHttp.js\"\n );\n const transport = new StreamableHTTPClientTransport(\n new URL(this.transportConfig.url),\n );\n await Promise.race([client.connect(transport as Transport), timeoutPromise]);\n return;\n }\n }\n\n private requireConnected(): Client {\n if (!this.connected || !this.client) {\n throw new ServerConnectionError(this.serverName, \"Not connected\");\n }\n return this.client;\n }\n}\n","/**\n * MCP server lifecycle manager per PRD section 11.1\n * Manages multiple MCP server connections: start, stop, health-check, restart, rate-limit.\n */\n\nimport { logger } from \"../utils/logger.js\";\nimport { ServerConnectionError } from \"../types/errors.js\";\nimport { MCPClient } from \"./client.js\";\nimport type { IMCPClientOptions, IMCPToolSchema, IStdioTransportConfig } from \"./client.js\";\nimport type { IMCPConfig, IMCPServerConfig } from \"../types/config.js\";\n\n// ── Server State ────────────────────────────────────────────────────────\n\ntype ServerStatus = \"stopped\" | \"connecting\" | \"connected\" | \"error\";\n\ninterface IServerEntry {\n readonly client: MCPClient;\n status: ServerStatus;\n lastHealthCheck: number;\n consecutiveFailures: number;\n readonly rateLimit: IRateLimitState;\n}\n\n// ── Rate Limiting ───────────────────────────────────────────────────────\n\ninterface IRateLimitState {\n callTimestamps: number[];\n maxCallsPerMinute: number;\n}\n\nexport interface IRateLimitConfig {\n readonly maxCallsPerMinute: number;\n}\n\n// ── Manager Options ─────────────────────────────────────────────────────\n\nexport interface IServerManagerOptions {\n readonly connectionTimeoutMs?: number;\n readonly healthCheckIntervalMs?: number;\n readonly maxConsecutiveFailures?: number;\n readonly defaultRateLimit?: IRateLimitConfig | undefined;\n readonly rateLimits?: Readonly<Record<string, IRateLimitConfig>> | undefined;\n}\n\n// ── Constants ───────────────────────────────────────────────────────────\n\nconst DEFAULT_HEALTH_INTERVAL_MS = 60_000;\nconst DEFAULT_MAX_FAILURES = 3;\nconst DEFAULT_MAX_CALLS_PER_MINUTE = 60;\nconst RATE_LIMIT_WINDOW_MS = 60_000;\n\n// ── MCPServerManager ────────────────────────────────────────────────────\n\nexport class MCPServerManager {\n private readonly servers = new Map<string, IServerEntry>();\n private readonly options: Required<\n Pick<IServerManagerOptions, \"connectionTimeoutMs\" | \"healthCheckIntervalMs\" | \"maxConsecutiveFailures\">\n > & Pick<IServerManagerOptions, \"defaultRateLimit\" | \"rateLimits\">;\n private healthCheckTimer: ReturnType<typeof setInterval> | undefined;\n\n constructor(options?: IServerManagerOptions) {\n this.options = {\n connectionTimeoutMs: options?.connectionTimeoutMs ?? 30_000,\n healthCheckIntervalMs: options?.healthCheckIntervalMs ?? DEFAULT_HEALTH_INTERVAL_MS,\n maxConsecutiveFailures: options?.maxConsecutiveFailures ?? DEFAULT_MAX_FAILURES,\n defaultRateLimit: options?.defaultRateLimit,\n rateLimits: options?.rateLimits,\n };\n }\n\n /** Start all servers defined in the MCP config. */\n async startAll(config: IMCPConfig): Promise<void> {\n const entries = Object.entries(config.mcpServers);\n if (entries.length === 0) {\n logger.info(\"No MCP servers configured\");\n return;\n }\n\n logger.info({ count: entries.length }, \"Starting MCP servers\");\n\n const results = await Promise.allSettled(\n entries.map(([name, serverConfig]) => this.startServer(name, serverConfig)),\n );\n\n let successCount = 0;\n for (const result of results) {\n if (result.status === \"fulfilled\") {\n successCount++;\n }\n }\n\n logger.info(\n { total: entries.length, connected: successCount },\n \"MCP server startup complete\",\n );\n\n this.startHealthChecks();\n }\n\n /** Start a single MCP server by name and config. */\n async startServer(name: string, serverConfig: IMCPServerConfig): Promise<void> {\n if (this.servers.has(name)) {\n logger.warn({ server: name }, \"MCP server already registered, stopping first\");\n await this.stopServer(name);\n }\n\n logger.info({ server: name, command: serverConfig.command }, \"Starting MCP server\");\n\n const transportConfig: IStdioTransportConfig = {\n type: \"stdio\",\n command: serverConfig.command,\n args: [...serverConfig.args],\n ...(serverConfig.env !== undefined ? { env: { ...serverConfig.env } } : {}),\n };\n\n const clientOptions: IMCPClientOptions = {\n serverName: name,\n transport: transportConfig,\n connectionTimeoutMs: this.options.connectionTimeoutMs,\n };\n\n const client = new MCPClient(clientOptions);\n const maxCalls = this.getMaxCallsPerMinute(name);\n\n const entry: IServerEntry = {\n client,\n status: \"connecting\",\n lastHealthCheck: Date.now(),\n consecutiveFailures: 0,\n rateLimit: { callTimestamps: [], maxCallsPerMinute: maxCalls },\n };\n\n this.servers.set(name, entry);\n\n try {\n await client.connect();\n entry.status = \"connected\";\n logger.info({ server: name }, \"MCP server connected\");\n } catch (error: unknown) {\n entry.status = \"error\";\n entry.consecutiveFailures = 1;\n const msg = error instanceof Error ? error.message : String(error);\n logger.error({ server: name, error: msg }, \"Failed to start MCP server\");\n throw new ServerConnectionError(name, msg);\n }\n }\n\n /** Stop a single server by name. */\n async stopServer(name: string): Promise<void> {\n const entry = this.servers.get(name);\n if (!entry) {\n return;\n }\n\n logger.info({ server: name }, \"Stopping MCP server\");\n\n try {\n await entry.client.disconnect();\n } catch (error: unknown) {\n logger.warn({ server: name, error }, \"Error stopping MCP server\");\n }\n\n entry.status = \"stopped\";\n this.servers.delete(name);\n }\n\n /** Stop all managed servers and clean up. */\n async stopAll(): Promise<void> {\n this.stopHealthChecks();\n\n const names = [...this.servers.keys()];\n logger.info({ count: names.length }, \"Stopping all MCP servers\");\n\n await Promise.allSettled(names.map((name) => this.stopServer(name)));\n }\n\n /** Get a connected client by server name. */\n getClient(name: string): MCPClient | undefined {\n const entry = this.servers.get(name);\n if (!entry || entry.status !== \"connected\") {\n return undefined;\n }\n return entry.client;\n }\n\n /** Get all connected server names. */\n getConnectedServers(): readonly string[] {\n const connected: string[] = [];\n for (const [name, entry] of this.servers) {\n if (entry.status === \"connected\") {\n connected.push(name);\n }\n }\n return connected;\n }\n\n /** Get the status of a server. */\n getServerStatus(name: string): ServerStatus | undefined {\n return this.servers.get(name)?.status;\n }\n\n /** List tools from a specific server (with rate-limit check). */\n async listServerTools(name: string): Promise<readonly IMCPToolSchema[]> {\n const entry = this.requireServer(name);\n this.checkRateLimit(entry, name);\n return entry.client.listTools();\n }\n\n /** Check rate limit before allowing a call to the given server. Throws on exceeded. */\n checkRateLimitFor(name: string): void {\n const entry = this.requireServer(name);\n this.checkRateLimit(entry, name);\n }\n\n /** Record a tool call for rate-limiting purposes. */\n recordCall(name: string): void {\n const entry = this.servers.get(name);\n if (entry) {\n entry.rateLimit.callTimestamps.push(Date.now());\n }\n }\n\n // ── Health Checking ─────────────────────────────────────────────────\n\n private startHealthChecks(): void {\n this.stopHealthChecks();\n\n this.healthCheckTimer = setInterval(() => {\n void this.runHealthChecks();\n }, this.options.healthCheckIntervalMs);\n\n // Prevent the timer from keeping the process alive\n if (typeof this.healthCheckTimer === \"object\" && \"unref\" in this.healthCheckTimer) {\n this.healthCheckTimer.unref();\n }\n }\n\n private stopHealthChecks(): void {\n if (this.healthCheckTimer !== undefined) {\n clearInterval(this.healthCheckTimer);\n this.healthCheckTimer = undefined;\n }\n }\n\n private async runHealthChecks(): Promise<void> {\n for (const [name, entry] of this.servers) {\n if (entry.status === \"stopped\") {\n continue;\n }\n\n try {\n await entry.client.listTools();\n entry.status = \"connected\";\n entry.consecutiveFailures = 0;\n entry.lastHealthCheck = Date.now();\n } catch {\n entry.consecutiveFailures++;\n entry.status = \"error\";\n logger.warn(\n { server: name, failures: entry.consecutiveFailures },\n \"MCP health check failed\",\n );\n\n if (entry.consecutiveFailures >= this.options.maxConsecutiveFailures) {\n logger.info({ server: name }, \"Attempting MCP server restart\");\n void this.restartServer(name, entry);\n }\n }\n }\n }\n\n private async restartServer(name: string, entry: IServerEntry): Promise<void> {\n try {\n await entry.client.reconnect();\n entry.status = \"connected\";\n entry.consecutiveFailures = 0;\n logger.info({ server: name }, \"MCP server restarted successfully\");\n } catch (error: unknown) {\n entry.status = \"error\";\n const msg = error instanceof Error ? error.message : String(error);\n logger.error({ server: name, error: msg }, \"MCP server restart failed\");\n }\n }\n\n // ── Rate Limiting ─────────────────────────────────────────────────\n\n private checkRateLimit(entry: IServerEntry, serverName: string): void {\n const now = Date.now();\n const windowStart = now - RATE_LIMIT_WINDOW_MS;\n\n // Prune timestamps outside the window\n entry.rateLimit.callTimestamps = entry.rateLimit.callTimestamps.filter(\n (ts) => ts > windowStart,\n );\n\n if (entry.rateLimit.callTimestamps.length >= entry.rateLimit.maxCallsPerMinute) {\n throw new ServerConnectionError(\n serverName,\n `Rate limit exceeded: ${entry.rateLimit.maxCallsPerMinute} calls/minute`,\n );\n }\n }\n\n private getMaxCallsPerMinute(serverName: string): number {\n const perServer = this.options.rateLimits?.[serverName];\n if (perServer) {\n return perServer.maxCallsPerMinute;\n }\n return this.options.defaultRateLimit?.maxCallsPerMinute ?? DEFAULT_MAX_CALLS_PER_MINUTE;\n }\n\n // ── Helpers ───────────────────────────────────────────────────────\n\n private requireServer(name: string): IServerEntry {\n const entry = this.servers.get(name);\n if (!entry || entry.status !== \"connected\") {\n throw new ServerConnectionError(name, \"Server not connected\");\n }\n return entry;\n }\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { SUPPORTED_MODELS } from './chunk-
|
|
2
|
-
import { logger } from './chunk-
|
|
1
|
+
import { SUPPORTED_MODELS } from './chunk-HCIHOHLX.js';
|
|
2
|
+
import { logger } from './chunk-IR5HLBMH.js';
|
|
3
3
|
|
|
4
4
|
// src/providers/ollama-adapter.ts
|
|
5
5
|
var PROVIDER_NAME = "ollama";
|
|
@@ -336,5 +336,5 @@ function mapFinishReason(reason) {
|
|
|
336
336
|
}
|
|
337
337
|
|
|
338
338
|
export { OllamaAdapter };
|
|
339
|
-
//# sourceMappingURL=chunk-
|
|
340
|
-
//# sourceMappingURL=chunk-
|
|
339
|
+
//# sourceMappingURL=chunk-KIC7UI5U.js.map
|
|
340
|
+
//# sourceMappingURL=chunk-KIC7UI5U.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/providers/ollama-adapter.ts"],"names":[],"mappings":"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","file":"chunk-KIC7UI5U.js","sourcesContent":["/**\n * Ollama adapter — custom HTTP for local models per PRD section 7.1\n * Uses OpenAI-compatible API format at localhost:11434.\n * Dynamic model listing from Ollama API.\n */\n\nimport { logger } from \"../utils/logger.js\";\nimport { SUPPORTED_MODELS } from \"../types/model.js\";\nimport type { IModelInfo, ProviderName, ModelRole } from \"../types/model.js\";\nimport type {\n IChatRequest,\n IChatResponse,\n IChatMessage,\n IStreamChunk,\n IToolCall,\n IToolDefinition,\n ITokenUsage,\n} from \"../types/message.js\";\nimport type { IModelProvider, IProviderOptions } from \"./types.js\";\n\nconst PROVIDER_NAME: ProviderName = \"ollama\";\nconst DEFAULT_BASE_URL = \"http://localhost:11434\";\nconst CHARS_PER_TOKEN_ESTIMATE = 4;\n\ninterface OllamaListResponse { models: Array<{ name: string; size: number }> }\ninterface OpenAIStandardMessage {\n role: \"system\" | \"user\" | \"assistant\";\n content: string | null;\n tool_calls?: readonly OllamaToolCallRef[] | undefined;\n}\ninterface OpenAIToolResultMessage {\n role: \"tool\";\n content: string;\n tool_call_id: string;\n name: string;\n}\ntype OpenAIMessage = OpenAIStandardMessage | OpenAIToolResultMessage;\ninterface OpenAITool { type: \"function\"; function: { name: string; description: string; parameters: Record<string, unknown> } }\ninterface OllamaToolCallRef { id: string; type: string; function: { name: string; arguments: string } }\ninterface OllamaChoice {\n index: number;\n message: { role: string; content: string | null; tool_calls?: readonly OllamaToolCallRef[] };\n finish_reason: string;\n}\ninterface OllamaUsage { prompt_tokens: number; completion_tokens: number; total_tokens: number }\ninterface OllamaChatResponse { id: string; choices: OllamaChoice[]; usage?: OllamaUsage }\n\nfunction convertMessages(messages: readonly IChatMessage[]): OpenAIMessage[] {\n const converted: OpenAIMessage[] = [];\n\n for (const msg of messages) {\n if (msg.role === \"assistant\" && msg.toolCalls !== undefined && msg.toolCalls.length > 0) {\n converted.push({\n role: \"assistant\" as const,\n content: msg.content.length > 0 ? msg.content : null,\n tool_calls: msg.toolCalls.map((toolCall) => ({\n id: toolCall.id,\n type: \"function\",\n function: {\n name: toolCall.name,\n arguments: JSON.stringify(toolCall.arguments),\n },\n })),\n });\n continue;\n }\n\n if (msg.role === \"tool\") {\n const toolCall = msg.toolCalls?.[0];\n if (toolCall !== undefined) {\n converted.push({\n role: \"tool\" as const,\n content: msg.content,\n tool_call_id: toolCall.id,\n name: toolCall.name,\n });\n continue;\n }\n }\n\n converted.push({\n role: msg.role as \"system\" | \"user\" | \"assistant\",\n content: msg.content,\n });\n }\n\n return converted;\n}\n\nfunction convertTools(tools: readonly IToolDefinition[] | undefined): OpenAITool[] | undefined {\n if (tools === undefined || tools.length === 0) {\n return undefined;\n }\n return tools.map((tool) => {\n const properties: Record<string, unknown> = {};\n const required: string[] = [];\n for (const param of tool.parameters) {\n properties[param.name] = { type: param.type, description: param.description };\n if (param.required) {\n required.push(param.name);\n }\n }\n return {\n type: \"function\" as const,\n function: {\n name: tool.name,\n description: tool.description,\n parameters: { type: \"object\", properties, required },\n },\n };\n });\n}\n\nfunction makeOllamaModelInfo(modelName: string): IModelInfo {\n return {\n id: modelName,\n name: modelName,\n provider: PROVIDER_NAME,\n contextWindow: 128_000,\n maxOutputTokens: 8_192,\n inputPricePerMToken: 0,\n outputPricePerMToken: 0,\n supportsStreaming: true,\n supportsToolCalling: true,\n supportedRoles: [\"coding\", \"bugfix\", \"testing\", \"documentation\"] as readonly ModelRole[],\n };\n}\n\nexport class OllamaAdapter implements IModelProvider {\n readonly name = PROVIDER_NAME;\n readonly supportsToolCalling = true;\n\n private readonly baseUrl: string;\n private cachedModels: string[] | undefined;\n\n constructor(options?: IProviderOptions) {\n this.baseUrl = options?.baseUrl ?? DEFAULT_BASE_URL;\n }\n\n get supportedModels(): readonly string[] {\n return this.cachedModels ?? [];\n }\n\n /**\n * Refresh available models from Ollama API.\n * Call once during initialization.\n */\n async refreshModels(): Promise<readonly string[]> {\n try {\n const response = await fetch(`${this.baseUrl}/api/tags`);\n if (!response.ok) {\n logger.warn({ status: response.status }, \"Failed to list Ollama models\");\n this.cachedModels = [];\n return [];\n }\n const data = (await response.json()) as OllamaListResponse;\n this.cachedModels = data.models.map((m) => m.name);\n logger.debug({ models: this.cachedModels }, \"Ollama models discovered\");\n return this.cachedModels;\n } catch (error: unknown) {\n const errMsg = error instanceof Error ? error.message : String(error);\n logger.warn({ error: errMsg }, \"Ollama not reachable\");\n this.cachedModels = [];\n return [];\n }\n }\n\n async chat(request: IChatRequest): Promise<IChatResponse> {\n this.getModelInfo(request.model);\n const messages = convertMessages(request.messages);\n const tools = convertTools(request.tools);\n\n if (request.system !== undefined) {\n messages.unshift({ role: \"system\", content: request.system });\n }\n\n const body: Record<string, unknown> = {\n model: request.model,\n messages,\n stream: false,\n };\n if (request.maxTokens !== undefined) {\n body[\"max_tokens\"] = request.maxTokens;\n }\n if (request.temperature !== undefined) {\n body[\"temperature\"] = request.temperature;\n }\n if (tools !== undefined) {\n body[\"tools\"] = tools;\n }\n\n const response = await fetch(`${this.baseUrl}/v1/chat/completions`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`Ollama API error (${response.status}): ${text}`);\n }\n\n const data = (await response.json()) as OllamaChatResponse;\n const choice = data.choices[0];\n if (choice === undefined) {\n throw new Error(\"Ollama API returned empty choices\");\n }\n\n const toolCalls = extractToolCalls(choice);\n const inputTokens = data.usage?.prompt_tokens ?? 0;\n const outputTokens = data.usage?.completion_tokens ?? 0;\n\n const usage: ITokenUsage = {\n inputTokens,\n outputTokens,\n totalTokens: inputTokens + outputTokens,\n costUsd: 0,\n };\n\n const responseMessage: IChatMessage = {\n id: data.id,\n role: \"assistant\",\n content: choice.message.content ?? \"\",\n model: request.model,\n provider: PROVIDER_NAME,\n toolCalls: toolCalls.length > 0 ? toolCalls : undefined,\n tokenUsage: usage,\n createdAt: new Date(),\n };\n\n return {\n id: data.id,\n model: request.model,\n provider: PROVIDER_NAME,\n message: responseMessage,\n usage,\n finishReason: mapFinishReason(choice.finish_reason),\n };\n }\n\n async *stream(request: IChatRequest): AsyncIterable<IStreamChunk> {\n const modelInfo = this.getModelInfo(request.model);\n const messages = convertMessages(request.messages);\n const tools = convertTools(request.tools);\n\n if (request.system !== undefined) {\n messages.unshift({ role: \"system\", content: request.system });\n }\n\n const body: Record<string, unknown> = {\n model: request.model,\n messages,\n stream: true,\n };\n if (request.maxTokens !== undefined) {\n body[\"max_tokens\"] = request.maxTokens;\n }\n if (request.temperature !== undefined) {\n body[\"temperature\"] = request.temperature;\n }\n if (tools !== undefined) {\n body[\"tools\"] = tools;\n }\n\n const response = await fetch(`${this.baseUrl}/v1/chat/completions`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const text = await response.text();\n yield { type: \"error\", error: `Ollama API error (${response.status}): ${text}` };\n yield { type: \"done\" };\n return;\n }\n\n if (response.body === null) {\n yield { type: \"error\", error: \"Ollama returned empty stream body\" };\n yield { type: \"done\" };\n return;\n }\n\n try {\n yield* this.parseSSEStream(response.body, modelInfo);\n yield { type: \"done\" };\n } catch (error: unknown) {\n const errMsg = error instanceof Error ? error.message : String(error);\n logger.error({ error: errMsg, model: request.model }, \"Ollama stream error\");\n yield { type: \"error\", error: errMsg };\n yield { type: \"done\" };\n }\n }\n\n countTokens(text: string, _model: string): Promise<number> {\n return Promise.resolve(Math.ceil(text.length / CHARS_PER_TOKEN_ESTIMATE));\n }\n\n getModelInfo(model: string): IModelInfo {\n const staticInfo = SUPPORTED_MODELS[model];\n if (staticInfo !== undefined && staticInfo.provider === PROVIDER_NAME) {\n return staticInfo;\n }\n if (this.cachedModels !== undefined && this.cachedModels.includes(model)) {\n return makeOllamaModelInfo(model);\n }\n return makeOllamaModelInfo(model);\n }\n\n async listAvailableModels(): Promise<readonly string[]> {\n const models = await this.refreshModels();\n return models;\n }\n\n private async *parseSSEStream(\n body: ReadableStream<Uint8Array>,\n _modelInfo: IModelInfo,\n ): AsyncIterable<IStreamChunk> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed === \"\" || trimmed === \"data: [DONE]\") {\n continue;\n }\n if (!trimmed.startsWith(\"data: \")) {\n continue;\n }\n\n const jsonStr = trimmed.slice(6);\n let parsed: {\n choices?: Array<{\n delta?: {\n content?: string;\n tool_calls?: Array<{\n id?: string;\n function?: { name?: string; arguments?: string };\n }>;\n };\n }>;\n usage?: OllamaUsage;\n };\n\n try {\n parsed = JSON.parse(jsonStr) as typeof parsed;\n } catch {\n continue;\n }\n\n const delta = parsed.choices?.[0]?.delta;\n if (delta?.content !== undefined && delta.content !== \"\") {\n yield { type: \"text\", content: delta.content };\n }\n\n if (delta?.tool_calls !== undefined) {\n for (const tc of delta.tool_calls) {\n if (tc.id !== undefined && tc.function?.name !== undefined) {\n let args: Record<string, unknown> = {};\n if (tc.function.arguments !== undefined) {\n try {\n args = JSON.parse(tc.function.arguments) as Record<string, unknown>;\n } catch {\n args = {};\n }\n }\n yield {\n type: \"tool_call\",\n toolCall: { id: tc.id, name: tc.function.name, arguments: args },\n };\n }\n }\n }\n\n if (parsed.usage !== undefined) {\n yield {\n type: \"usage\",\n usage: {\n inputTokens: parsed.usage.prompt_tokens,\n outputTokens: parsed.usage.completion_tokens,\n totalTokens: parsed.usage.total_tokens,\n costUsd: 0,\n },\n };\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n}\n\nfunction extractToolCalls(choice: OllamaChoice): IToolCall[] {\n if (choice.message.tool_calls === undefined || choice.message.tool_calls.length === 0) {\n return [];\n }\n return choice.message.tool_calls.map((tc) => {\n let args: Record<string, unknown> = {};\n try {\n args = JSON.parse(tc.function.arguments) as Record<string, unknown>;\n } catch {\n args = {};\n }\n return { id: tc.id, name: tc.function.name, arguments: args };\n });\n}\n\nfunction mapFinishReason(\n reason: string,\n): \"stop\" | \"tool_calls\" | \"max_tokens\" | \"error\" {\n switch (reason) {\n case \"stop\":\n return \"stop\";\n case \"tool_calls\":\n return \"tool_calls\";\n case \"length\":\n return \"max_tokens\";\n default:\n return \"stop\";\n }\n}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { ModelNotFoundError, AuthenticationError, RateLimitError } from './chunk-
|
|
2
|
-
import { SUPPORTED_MODELS } from './chunk-
|
|
3
|
-
import { logger } from './chunk-
|
|
1
|
+
import { ModelNotFoundError, AuthenticationError, RateLimitError } from './chunk-ZGOHARPV.js';
|
|
2
|
+
import { SUPPORTED_MODELS } from './chunk-HCIHOHLX.js';
|
|
3
|
+
import { logger } from './chunk-IR5HLBMH.js';
|
|
4
4
|
|
|
5
5
|
// src/providers/kimi-adapter.ts
|
|
6
6
|
var PROVIDER_NAME = "kimi";
|
|
@@ -339,5 +339,5 @@ function mapFinishReason(reason) {
|
|
|
339
339
|
}
|
|
340
340
|
|
|
341
341
|
export { KimiAdapter };
|
|
342
|
-
//# sourceMappingURL=chunk-
|
|
343
|
-
//# sourceMappingURL=chunk-
|
|
342
|
+
//# sourceMappingURL=chunk-KMOAJRDE.js.map
|
|
343
|
+
//# sourceMappingURL=chunk-KMOAJRDE.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/providers/kimi-adapter.ts"],"names":[],"mappings":"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","file":"chunk-KMOAJRDE.js","sourcesContent":["/**\n * Kimi (Moonshot) adapter — custom HTTP per PRD section 7.1\n * Uses OpenAI-compatible API format via fetch().\n * Supports Kimi Code (kimi-for-coding)\n */\n\nimport { logger } from \"../utils/logger.js\";\nimport {\n AuthenticationError,\n RateLimitError,\n ModelNotFoundError,\n} from \"../types/errors.js\";\nimport { SUPPORTED_MODELS } from \"../types/model.js\";\nimport type { IModelInfo, ProviderName } from \"../types/model.js\";\nimport type {\n IChatRequest,\n IChatResponse,\n IChatMessage,\n IStreamChunk,\n IToolCall,\n IToolDefinition,\n ITokenUsage,\n} from \"../types/message.js\";\nimport type { IModelProvider, IProviderOptions } from \"./types.js\";\n\nconst PROVIDER_NAME: ProviderName = \"kimi\";\nconst DEFAULT_BASE_URL = \"https://api.moonshot.cn/v1\";\n\nconst KIMI_MODELS: readonly string[] = [\"kimi-for-coding\"] as const;\nconst CHARS_PER_TOKEN_ESTIMATE = 4;\n\ninterface OpenAIStandardMessage {\n role: \"system\" | \"user\" | \"assistant\";\n content: string | null;\n tool_calls?: readonly OpenAIToolCallRef[] | undefined;\n}\ninterface OpenAIToolResultMessage {\n role: \"tool\";\n content: string;\n tool_call_id: string;\n name: string;\n}\ntype OpenAIMessage = OpenAIStandardMessage | OpenAIToolResultMessage;\ninterface OpenAITool { type: \"function\"; function: { name: string; description: string; parameters: Record<string, unknown> } }\ninterface OpenAIToolCallRef { id: string; type: string; function: { name: string; arguments: string } }\ninterface OpenAIChoice {\n index: number;\n message: { role: string; content: string | null; tool_calls?: readonly OpenAIToolCallRef[] };\n finish_reason: string;\n}\ninterface OpenAIUsage { prompt_tokens: number; completion_tokens: number; total_tokens: number }\ninterface OpenAIChatResponse { id: string; choices: OpenAIChoice[]; usage: OpenAIUsage }\n\nfunction convertMessages(messages: readonly IChatMessage[]): OpenAIMessage[] {\n const converted: OpenAIMessage[] = [];\n\n for (const msg of messages) {\n if (msg.role === \"assistant\" && msg.toolCalls !== undefined && msg.toolCalls.length > 0) {\n converted.push({\n role: \"assistant\" as const,\n content: msg.content.length > 0 ? msg.content : null,\n tool_calls: msg.toolCalls.map((toolCall) => ({\n id: toolCall.id,\n type: \"function\",\n function: {\n name: toolCall.name,\n arguments: JSON.stringify(toolCall.arguments),\n },\n })),\n });\n continue;\n }\n\n if (msg.role === \"tool\") {\n const toolCall = msg.toolCalls?.[0];\n if (toolCall !== undefined) {\n converted.push({\n role: \"tool\" as const,\n content: msg.content,\n tool_call_id: toolCall.id,\n name: toolCall.name,\n });\n continue;\n }\n }\n\n converted.push({\n role: msg.role as \"system\" | \"user\" | \"assistant\",\n content: msg.content,\n });\n }\n\n return converted;\n}\n\nfunction convertTools(tools: readonly IToolDefinition[] | undefined): OpenAITool[] | undefined {\n if (tools === undefined || tools.length === 0) {\n return undefined;\n }\n return tools.map((tool) => {\n const properties: Record<string, unknown> = {};\n const required: string[] = [];\n for (const param of tool.parameters) {\n const prop: Record<string, unknown> = {\n type: param.type,\n description: param.description,\n };\n if (param.enum !== undefined) {\n prop[\"enum\"] = param.enum;\n }\n properties[param.name] = prop;\n if (param.required) {\n required.push(param.name);\n }\n }\n return {\n type: \"function\" as const,\n function: {\n name: tool.name,\n description: tool.description,\n parameters: { type: \"object\", properties, required },\n },\n };\n });\n}\n\nfunction computeCost(modelInfo: IModelInfo, inputTokens: number, outputTokens: number): number {\n return (\n (inputTokens / 1_000_000) * modelInfo.inputPricePerMToken +\n (outputTokens / 1_000_000) * modelInfo.outputPricePerMToken\n );\n}\n\nasync function handleResponseError(response: Response, model: string): Promise<never> {\n const body = await response.text();\n if (response.status === 401 || response.status === 403) {\n throw new AuthenticationError(PROVIDER_NAME, body);\n }\n if (response.status === 429) {\n const retryHeader = response.headers.get(\"retry-after\");\n const retryMs = retryHeader !== null ? parseInt(retryHeader, 10) * 1000 : 60_000;\n throw new RateLimitError(PROVIDER_NAME, retryMs);\n }\n if (response.status === 404) {\n throw new ModelNotFoundError(model);\n }\n throw new Error(`Kimi API error (${response.status}): ${body}`);\n}\n\nexport class KimiAdapter implements IModelProvider {\n readonly name = PROVIDER_NAME;\n readonly supportedModels = KIMI_MODELS;\n readonly supportsToolCalling = true;\n\n private readonly baseUrl: string;\n private readonly apiKey: string;\n\n constructor(options?: IProviderOptions) {\n this.baseUrl = options?.baseUrl ?? DEFAULT_BASE_URL;\n this.apiKey = options?.apiKey ?? process.env[\"MOONSHOT_API_KEY\"] ?? \"\";\n }\n\n async chat(request: IChatRequest): Promise<IChatResponse> {\n const modelInfo = this.getModelInfo(request.model);\n const messages = convertMessages(request.messages);\n const tools = convertTools(request.tools);\n\n if (request.system !== undefined) {\n messages.unshift({ role: \"system\", content: request.system });\n }\n\n const body: Record<string, unknown> = {\n model: request.model,\n messages,\n max_tokens: request.maxTokens ?? modelInfo.maxOutputTokens,\n stream: false,\n };\n if (request.temperature !== undefined) {\n body[\"temperature\"] = request.temperature;\n }\n if (tools !== undefined) {\n body[\"tools\"] = tools;\n }\n\n const response = await fetch(`${this.baseUrl}/chat/completions`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n await handleResponseError(response, request.model);\n }\n\n const data = (await response.json()) as OpenAIChatResponse;\n const choice = data.choices[0];\n if (choice === undefined) {\n throw new Error(\"Kimi API returned empty choices\");\n }\n\n const toolCalls = extractToolCalls(choice);\n const inputTokens = data.usage.prompt_tokens;\n const outputTokens = data.usage.completion_tokens;\n\n const usage: ITokenUsage = {\n inputTokens,\n outputTokens,\n totalTokens: inputTokens + outputTokens,\n costUsd: computeCost(modelInfo, inputTokens, outputTokens),\n };\n\n const responseMessage: IChatMessage = {\n id: data.id,\n role: \"assistant\",\n content: choice.message.content ?? \"\",\n model: request.model,\n provider: PROVIDER_NAME,\n toolCalls: toolCalls.length > 0 ? toolCalls : undefined,\n tokenUsage: usage,\n createdAt: new Date(),\n };\n\n return {\n id: data.id,\n model: request.model,\n provider: PROVIDER_NAME,\n message: responseMessage,\n usage,\n finishReason: mapFinishReason(choice.finish_reason),\n };\n }\n\n async *stream(request: IChatRequest): AsyncIterable<IStreamChunk> {\n const modelInfo = this.getModelInfo(request.model);\n const messages = convertMessages(request.messages);\n const tools = convertTools(request.tools);\n\n if (request.system !== undefined) {\n messages.unshift({ role: \"system\", content: request.system });\n }\n\n const body: Record<string, unknown> = {\n model: request.model,\n messages,\n max_tokens: request.maxTokens ?? modelInfo.maxOutputTokens,\n stream: true,\n };\n if (request.temperature !== undefined) {\n body[\"temperature\"] = request.temperature;\n }\n if (tools !== undefined) {\n body[\"tools\"] = tools;\n }\n\n const response = await fetch(`${this.baseUrl}/chat/completions`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n await handleResponseError(response, request.model);\n }\n\n if (response.body === null) {\n yield { type: \"error\", error: \"Kimi API returned empty stream body\" };\n yield { type: \"done\" };\n return;\n }\n\n try {\n yield* this.parseSSEStream(response.body, modelInfo);\n yield { type: \"done\" };\n } catch (error: unknown) {\n const errMsg = error instanceof Error ? error.message : String(error);\n logger.error({ error: errMsg, model: request.model }, \"Kimi stream error\");\n yield { type: \"error\", error: errMsg };\n yield { type: \"done\" };\n }\n }\n\n countTokens(text: string, _model: string): Promise<number> {\n return Promise.resolve(Math.ceil(text.length / CHARS_PER_TOKEN_ESTIMATE));\n }\n\n getModelInfo(model: string): IModelInfo {\n const info = SUPPORTED_MODELS[model];\n if (info === undefined || info.provider !== PROVIDER_NAME) {\n throw new ModelNotFoundError(model);\n }\n return info;\n }\n\n async listAvailableModels(): Promise<readonly string[]> {\n if (!this.apiKey) return [...this.supportedModels];\n\n try {\n const response = await fetch(`${this.baseUrl}/models`, {\n headers: { Authorization: `Bearer ${this.apiKey}` },\n signal: AbortSignal.timeout(5000),\n });\n if (!response.ok) return [...this.supportedModels];\n\n const data = (await response.json()) as { data: Array<{ id: string }> };\n const models = data.data.map((m) => m.id).sort();\n return models.length > 0 ? models : [...this.supportedModels];\n } catch {\n return [...this.supportedModels];\n }\n }\n\n private async *parseSSEStream(\n body: ReadableStream<Uint8Array>,\n modelInfo: IModelInfo,\n ): AsyncIterable<IStreamChunk> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed === \"\" || trimmed === \"data: [DONE]\") {\n continue;\n }\n if (!trimmed.startsWith(\"data: \")) {\n continue;\n }\n\n const jsonStr = trimmed.slice(6);\n let parsed: {\n choices?: Array<{\n delta?: {\n content?: string;\n tool_calls?: Array<{\n id?: string;\n function?: { name?: string; arguments?: string };\n }>;\n };\n }>;\n usage?: OpenAIUsage;\n };\n\n try {\n parsed = JSON.parse(jsonStr) as typeof parsed;\n } catch {\n continue;\n }\n\n const delta = parsed.choices?.[0]?.delta;\n if (delta?.content !== undefined && delta.content !== \"\") {\n yield { type: \"text\", content: delta.content };\n }\n\n if (delta?.tool_calls !== undefined) {\n for (const tc of delta.tool_calls) {\n if (tc.id !== undefined && tc.function?.name !== undefined) {\n let args: Record<string, unknown> = {};\n if (tc.function.arguments !== undefined) {\n try {\n args = JSON.parse(tc.function.arguments) as Record<string, unknown>;\n } catch {\n args = {};\n }\n }\n const toolCall: IToolCall = {\n id: tc.id,\n name: tc.function.name,\n arguments: args,\n };\n yield { type: \"tool_call\", toolCall };\n }\n }\n }\n\n if (parsed.usage !== undefined) {\n const inTok = parsed.usage.prompt_tokens;\n const outTok = parsed.usage.completion_tokens;\n yield {\n type: \"usage\",\n usage: {\n inputTokens: inTok,\n outputTokens: outTok,\n totalTokens: inTok + outTok,\n costUsd: computeCost(modelInfo, inTok, outTok),\n },\n };\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n}\n\nfunction extractToolCalls(choice: OpenAIChoice): IToolCall[] {\n if (choice.message.tool_calls === undefined || choice.message.tool_calls.length === 0) {\n return [];\n }\n return choice.message.tool_calls.map((tc) => {\n let args: Record<string, unknown> = {};\n try {\n args = JSON.parse(tc.function.arguments) as Record<string, unknown>;\n } catch {\n args = {};\n }\n return {\n id: tc.id,\n name: tc.function.name,\n arguments: args,\n };\n });\n}\n\nfunction mapFinishReason(\n reason: string,\n): \"stop\" | \"tool_calls\" | \"max_tokens\" | \"error\" {\n switch (reason) {\n case \"stop\":\n return \"stop\";\n case \"tool_calls\":\n return \"tool_calls\";\n case \"length\":\n return \"max_tokens\";\n default:\n return \"stop\";\n }\n}\n"]}
|
|
@@ -67,5 +67,5 @@ function getCliProviderForModelProvider(provider) {
|
|
|
67
67
|
}
|
|
68
68
|
|
|
69
69
|
export { CLI_PROVIDER_ORDER, getCliProviderEntry, getCliProviderForModelProvider };
|
|
70
|
-
//# sourceMappingURL=chunk-
|
|
71
|
-
//# sourceMappingURL=chunk-
|
|
70
|
+
//# sourceMappingURL=chunk-LQBALETG.js.map
|
|
71
|
+
//# sourceMappingURL=chunk-LQBALETG.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/orchestrator/utils/provider-catalog.ts"],"names":[],"mappings":";AAgBO,IAAM,oBAAA,GAAmF;AAAA,EAC9F,aAAA,EAAe;AAAA,IACb,IAAA,EAAM,aAAA;AAAA,IACN,QAAA,EAAU,WAAA;AAAA,IACV,MAAA,EAAQ,QAAA;AAAA,IACR,KAAA,EAAO,aAAA;AAAA,IACP,WAAA,EAAa,4BAAA;AAAA,IACb,aAAA,EAAe,QAAA;AAAA,IACf,SAAA,EAAW,KAAA;AAAA,IACX,cAAc,MAAM;AAAA,GACtB;AAAA,EACA,KAAA,EAAO;AAAA,IACL,IAAA,EAAM,OAAA;AAAA,IACN,QAAA,EAAU,QAAA;AAAA,IACV,MAAA,EAAQ,OAAA;AAAA,IACR,KAAA,EAAO,OAAA;AAAA,IACP,WAAA,EAAa,yBAAA;AAAA,IACb,aAAA,EAAe,OAAA;AAAA,IACf,SAAA,EAAW,KAAA;AAAA,IACX,cAAc,MAAM;AAAA,GACtB;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,IAAA,EAAM,YAAA;AAAA,IACN,QAAA,EAAU,QAAA;AAAA,IACV,MAAA,EAAQ,QAAA;AAAA,IACR,KAAA,EAAO,YAAA;AAAA,IACP,WAAA,EAAa,yBAAA;AAAA,IACb,aAAA,EAAe,QAAA;AAAA,IACf,SAAA,EAAW,KAAA;AAAA,IACX,cAAc,MAAM;AAAA,GACtB;AAAA,EACA,UAAA,EAAY;AAAA,IACV,IAAA,EAAM,UAAA;AAAA,IACN,QAAA,EAAU,MAAA;AAAA,IACV,MAAA,EAAQ,MAAA;AAAA,IACR,KAAA,EAAO,UAAA;AAAA,IACP,WAAA,EAAa,2BAAA;AAAA,IACb,aAAA,EAAe,MAAA;AAAA,IACf,SAAA,EAAW,KAAA;AAAA,IACX,cAAc,MAAM;AAAA,GACtB;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,IAAA,EAAM,QAAA;AAAA,IACN,QAAA,EAAU,QAAA;AAAA,IACV,MAAA,EAAQ,QAAA;AAAA,IACR,KAAA,EAAO,QAAA;AAAA,IACP,WAAA,EAAa,qBAAA;AAAA,IACb,SAAA,EAAW,IAAA;AAAA,IACX,YAAA,EAAc,CAAC,KAAA,KAAmB,CAAA,WAAA,EAAc,SAAS,QAAQ,CAAA;AAAA;AAErE,CAAA;AAEO,IAAM,kBAAA,GAAiD;AAAA,EAC5D,aAAA;AAAA,EACA,OAAA;AAAA,EACA,YAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF;AAEO,SAAS,oBAAoB,QAAA,EAAoD;AACtF,EAAA,OAAO,qBAAqB,QAAQ,CAAA;AACtC;AAMO,SAAS,+BAA+B,QAAA,EAAqD;AAClG,EAAA,OAAO,kBAAA,CAAmB,IAAA;AAAA,IACxB,CAAC,WAAA,KAAgB,oBAAA,CAAqB,WAAW,EAAE,QAAA,KAAa;AAAA,GAClE;AACF","file":"chunk-LQBALETG.js","sourcesContent":["import type { ProviderName } from \"../../types/model.js\";\nimport type { CliProviderType } from \"../constants.js\";\n\nexport type LoginProvider = \"claude\" | \"codex\" | \"gemini\" | \"kimi\";\n\nexport interface CliProviderCatalogEntry {\n readonly type: CliProviderType;\n readonly provider: ProviderName;\n readonly binary: string;\n readonly label: string;\n readonly description: string;\n readonly loginProvider?: LoginProvider | undefined;\n readonly localOnly: boolean;\n readonly startCommand: (model?: string) => string;\n}\n\nexport const CLI_PROVIDER_CATALOG: Readonly<Record<CliProviderType, CliProviderCatalogEntry>> = {\n \"claude-code\": {\n type: \"claude-code\",\n provider: \"anthropic\",\n binary: \"claude\",\n label: \"Claude Code\",\n description: \"Anthropic native CLI agent\",\n loginProvider: \"claude\",\n localOnly: false,\n startCommand: () => \"claude --dangerously-skip-permissions\",\n },\n codex: {\n type: \"codex\",\n provider: \"openai\",\n binary: \"codex\",\n label: \"Codex\",\n description: \"OpenAI native CLI agent\",\n loginProvider: \"codex\",\n localOnly: false,\n startCommand: () => \"codex --full-auto\",\n },\n \"gemini-cli\": {\n type: \"gemini-cli\",\n provider: \"google\",\n binary: \"gemini\",\n label: \"Gemini CLI\",\n description: \"Google native CLI agent\",\n loginProvider: \"gemini\",\n localOnly: false,\n startCommand: () => \"gemini\",\n },\n \"kimi-cli\": {\n type: \"kimi-cli\",\n provider: \"kimi\",\n binary: \"kimi\",\n label: \"Kimi CLI\",\n description: \"Moonshot native CLI agent\",\n loginProvider: \"kimi\",\n localOnly: false,\n startCommand: () => \"kimi\",\n },\n ollama: {\n type: \"ollama\",\n provider: \"ollama\",\n binary: \"ollama\",\n label: \"Ollama\",\n description: \"Local agent runtime\",\n localOnly: true,\n startCommand: (model?: string) => `ollama run ${model ?? \"llama3\"}`,\n },\n};\n\nexport const CLI_PROVIDER_ORDER: readonly CliProviderType[] = [\n \"claude-code\",\n \"codex\",\n \"gemini-cli\",\n \"kimi-cli\",\n \"ollama\",\n] as const;\n\nexport function getCliProviderEntry(provider: CliProviderType): CliProviderCatalogEntry {\n return CLI_PROVIDER_CATALOG[provider];\n}\n\nexport function getCliProviderLabel(provider: CliProviderType): string {\n return getCliProviderEntry(provider).label;\n}\n\nexport function getCliProviderForModelProvider(provider: ProviderName): CliProviderType | undefined {\n return CLI_PROVIDER_ORDER.find(\n (cliProvider) => CLI_PROVIDER_CATALOG[cliProvider].provider === provider,\n );\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/orchestrator/constants.ts"],"names":[],"mappings":";AAcO,IAAM,aAAA,GAA4C;AAAA,EACvD,aAAA;AAAA,EAAe,OAAA;AAAA,EAAS,YAAA;AAAA,EAAc,UAAA;AAAA,EAAY;AACpD","file":"chunk-M3FPQSRU.js","sourcesContent":["/**\n * Orchestrator constants — shared across all orchestrator modules.\n */\n\nimport type { ProviderName } from \"../types/index.js\";\n\n// ── Terminal Status ─────────────────────────────────────────────────────\n\nexport type TerminalStatus = \"idle\" | \"processing\" | \"completed\" | \"waiting_user_answer\" | \"error\";\n\n// ── CLI Provider Types ──────────────────────────────────────────────────\n\nexport type CliProviderType = \"claude-code\" | \"codex\" | \"gemini-cli\" | \"kimi-cli\" | \"ollama\";\n\nexport const CLI_PROVIDERS: readonly CliProviderType[] = [\n \"claude-code\", \"codex\", \"gemini-cli\", \"kimi-cli\", \"ollama\",\n] as const;\n\nexport const DEFAULT_CLI_PROVIDER: CliProviderType = \"claude-code\";\n\n// ── Provider CLI → SDK Mapping ──────────────────────────────────────────\n\nexport const SDK_FOR_CLI: Record<CliProviderType, ProviderName> = {\n \"claude-code\": \"anthropic\",\n \"codex\": \"openai\",\n \"gemini-cli\": \"google\",\n \"kimi-cli\": \"kimi\",\n \"ollama\": \"ollama\",\n};\n\n// ── Timeouts & Limits ───────────────────────────────────────────────────\n\nexport const MAX_BUFFER_BYTES = 5 * 1024 * 1024; // 5MB per PTY session\nexport const TAIL_BUFFER_LINES = 200; // Lines kept in tail buffer\nexport const MAX_WORKERS_PER_SESSION = 10; // Max concurrent workers\nexport const MAX_ORCHESTRATOR_STEPS = 30; // Max supervisor tool-call rounds\nexport const MAX_HANDOFF_DEPTH = 5; // Max nested handoffs\nexport const MAX_OUTPUT_EXTRACT_BYTES = 100 * 1024; // 100KB tool result truncation\n\nexport const PROVIDER_INIT_TIMEOUT_MS = 30_000; // 30s provider startup\nexport const HANDOFF_TIMEOUT_MS = 600_000; // 10min default handoff\nexport const SHELL_READY_TIMEOUT_MS = 10_000; // 10s shell boot\nexport const STATUS_POLL_INTERVAL_MS = 2_000; // 2s status check interval\nexport const INBOX_POLL_INTERVAL_MS = 5_000; // 5s inbox delivery check\nexport const WINDOWS_KILL_TIMEOUT_MS = 5_000; // 5s force-kill on Windows\nexport const EXIT_DRAIN_DELAY_MS = 200; // 200ms onExit drain\n\n// ── Data Models ─────────────────────────────────────────────────────────\n\nexport interface TerminalRecord {\n id: string;\n sessionId: string;\n pid?: number | undefined;\n provider: CliProviderType;\n agentProfile?: string | undefined;\n status: TerminalStatus;\n createdAt: Date;\n}\n\nexport interface SessionRecord {\n sessionId: string;\n pid?: number | undefined;\n workerCount: number;\n providers: CliProviderType[];\n createdAt: Date;\n}\n\nexport interface InboxMessage {\n id: number;\n sender: string;\n receiver: string;\n content: string;\n status: \"pending\" | \"delivered\" | \"failed\";\n createdAt: Date;\n deliveredAt?: Date | undefined;\n}\n\nexport interface AgentProfile {\n name: string;\n description: string;\n provider?: CliProviderType | undefined;\n systemPrompt: string;\n}\n\nexport interface WorkerInfo {\n terminalId: string;\n provider: CliProviderType;\n status: TerminalStatus;\n}\n\nexport interface SpawnOptions {\n provider: CliProviderType;\n agentProfile?: string | undefined;\n workingDirectory?: string | undefined;\n model?: string | undefined;\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { CLI_PROVIDER_ORDER, getCliProviderEntry } from './chunk-
|
|
1
|
+
import { CLI_PROVIDER_ORDER, getCliProviderEntry } from './chunk-LQBALETG.js';
|
|
2
2
|
import { spawnSync } from 'child_process';
|
|
3
3
|
|
|
4
4
|
function detectInstalledProviders() {
|
|
@@ -22,5 +22,5 @@ function detectInstalledProviders() {
|
|
|
22
22
|
}
|
|
23
23
|
|
|
24
24
|
export { detectInstalledProviders };
|
|
25
|
-
//# sourceMappingURL=chunk-
|
|
26
|
-
//# sourceMappingURL=chunk-
|
|
25
|
+
//# sourceMappingURL=chunk-NQEUK763.js.map
|
|
26
|
+
//# sourceMappingURL=chunk-NQEUK763.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/orchestrator/utils/detect-providers.ts"],"names":[],"mappings":";;;AAsBO,SAAS,wBAAA,GAA8C;AAC5D,EAAA,MAAM,YAA+B,EAAC;AAEtC,EAAA,KAAA,MAAW,YAAY,kBAAA,EAAoB;AACzC,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,GAAQ,oBAAoB,QAAQ,CAAA;AAC1C,MAAA,MAAM,IAAA,GAAO,CAAC,WAAW,CAAA;AACzB,MAAA,MAAM,MAAA,GAAS,SAAA,CAAU,KAAA,CAAM,MAAA,EAAQ,IAAA,EAAM;AAAA,QAC3C,KAAA,EAAO,QAAA;AAAA,QACP,OAAA,EAAS,GAAA;AAAA,QACT,KAAA,EAAO,QAAQ,QAAA,KAAa;AAAA,OAC7B,CAAA;AACD,MAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,QAAA,SAAA,CAAU,KAAK,QAAQ,CAAA;AAAA,MACzB;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAEA,EAAA,OAAO,SAAA;AACT","file":"chunk-NQEUK763.js","sourcesContent":["/**\n * Cross-platform CLI provider detection utility.\n *\n * Probes the system PATH for known AI CLI tools by running\n * `<tool> --version` with a 5-second timeout. Returns a list\n * of provider types that are available on the current machine.\n *\n * @see IMPLEMENT_PLAN.md Section 10\n */\n\nimport { spawnSync } from \"node:child_process\";\nimport type { CliProviderType } from \"../constants.js\";\nimport { CLI_PROVIDER_ORDER, getCliProviderEntry } from \"./provider-catalog.js\";\n\n/**\n * Detect which CLI AI providers are installed on the system.\n *\n * Each provider is checked by running its version command. Only\n * providers that exit with status 0 are included in the result.\n *\n * @returns Array of installed CLI provider types.\n */\nexport function detectInstalledProviders(): CliProviderType[] {\n const available: CliProviderType[] = [];\n\n for (const provider of CLI_PROVIDER_ORDER) {\n try {\n const entry = getCliProviderEntry(provider);\n const args = [\"--version\"];\n const result = spawnSync(entry.binary, args, {\n stdio: \"ignore\",\n timeout: 5000,\n shell: process.platform === \"win32\",\n });\n if (result.status === 0) {\n available.push(provider);\n }\n } catch {\n // Not installed — skip\n }\n }\n\n return available;\n}\n"]}
|
|
@@ -34,5 +34,5 @@ function redactSecrets(text) {
|
|
|
34
34
|
}
|
|
35
35
|
|
|
36
36
|
export { isCommandBlocked, isPathAllowed, redactSecrets, validatePath };
|
|
37
|
-
//# sourceMappingURL=chunk-
|
|
38
|
-
//# sourceMappingURL=chunk-
|
|
37
|
+
//# sourceMappingURL=chunk-OPWAFS6Y.js.map
|
|
38
|
+
//# sourceMappingURL=chunk-OPWAFS6Y.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/sanitizer.ts"],"names":[],"mappings":";;;AAoBO,SAAS,YAAA,CAAa,UAAkB,WAAA,EAA6B;AAC1E,EAAA,MAAM,cAAA,GAAiB,SAAA,CAAU,OAAA,CAAQ,WAAW,CAAC,CAAA;AACrD,EAAA,MAAM,cAAA,GAAiB,SAAA,CAAU,OAAA,CAAQ,cAAA,EAAgB,QAAQ,CAAC,CAAA;AAElE,EAAA,IAAI,CAAC,SAAA,CAAU,cAAA,EAAgB,cAAc,CAAA,EAAG;AAC9C,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,0BAAA,EAA6B,QAAQ,CAAA,iCAAA,EAAoC,WAAW,CAAA,CAAA;AAAA,KACtF;AAAA,EACF;AAEA,EAAA,OAAO,cAAA;AACT;AAKO,SAAS,aAAA,CACd,QAAA,EACA,YAAA,EACA,WAAA,EACS;AACT,EAAA,MAAM,cAAA,GAAiB,SAAA,CAAU,OAAA,CAAQ,WAAW,CAAC,CAAA;AACrD,EAAA,MAAM,QAAA,GAAW,SAAA,CAAU,OAAA,CAAQ,cAAA,EAAgB,QAAQ,CAAC,CAAA;AAC5D,EAAA,OAAO,YAAA,CAAa,IAAA,CAAK,CAAC,OAAA,KAAY;AACpC,IAAA,MAAM,eAAA,GAAkB,SAAA,CAAU,OAAA,CAAQ,cAAA,EAAgB,OAAO,CAAC,CAAA;AAClE,IAAA,OAAO,SAAA,CAAU,iBAAiB,QAAQ,CAAA;AAAA,EAC5C,CAAC,CAAA;AACH;AAEA,SAAS,SAAA,CAAU,UAAkB,aAAA,EAAgC;AACnE,EAAA,MAAM,GAAA,GAAM,QAAA,CAAS,QAAA,EAAU,aAAa,CAAA;AAC5C,EAAA,OAAO,GAAA,KAAQ,MAAO,CAAC,GAAA,CAAI,WAAW,IAAI,CAAA,IAAK,CAAC,UAAA,CAAW,GAAG,CAAA;AAChE;AAMO,SAAS,gBAAA,CACd,SACA,eAAA,EACS;AACT,EAAA,MAAM,iBAAA,GAAoB,OAAA,CAAQ,IAAA,EAAK,CAAE,WAAA,EAAY;AACrD,EAAA,OAAO,eAAA,CAAgB,IAAA;AAAA,IAAK,CAAC,OAAA,KAC3B,iBAAA,CAAkB,QAAA,CAAS,OAAA,CAAQ,aAAa;AAAA,GAClD;AACF;AAKO,SAAS,cAAc,IAAA,EAAsB;AAClD,EAAA,OAAO,KACJ,OAAA,CAAQ,gBAAA,EAAkB,sBAAsB,CAAA,CAChD,OAAA,CAAQ,wBAAwB,eAAe,CAAA,CAC/C,QAAQ,wBAAA,EAA0B,gBAAgB,EAClD,OAAA,CAAQ,sBAAA,EAAwB,gBAAgB,CAAA,CAChD,OAAA,CAAQ,8BAA8B,mBAAmB,CAAA;AAC9D","file":"chunk-OPWAFS6Y.js","sourcesContent":["/**\n * Input/output sanitization per PRD section 14.2\n * Zero trust for AI output — treat all model-generated content as untrusted\n */\n\nimport { isAbsolute, normalize, relative, resolve } from \"node:path\";\n\n/**\n * Sanitize shell command arguments to prevent injection.\n * PRD REQ: NO shell injection (section 14.1, 15.7 item 10)\n */\nexport function sanitizeShellArg(arg: string): string {\n // Escape single quotes by replacing them with escaped version\n return `'${arg.replace(/'/g, \"'\\\\''\")}'`;\n}\n\n/**\n * Validate a file path is within the allowed project root.\n * Prevents directory traversal attacks (PRD section 14.1).\n */\nexport function validatePath(filePath: string, projectRoot: string): string {\n const normalizedRoot = normalize(resolve(projectRoot));\n const normalizedPath = normalize(resolve(normalizedRoot, filePath));\n\n if (!isSubPath(normalizedRoot, normalizedPath)) {\n throw new Error(\n `Path traversal detected: \"${filePath}\" resolves outside project root \"${projectRoot}\"`,\n );\n }\n\n return normalizedPath;\n}\n\n/**\n * Check if a path is safe (within allowed paths).\n */\nexport function isPathAllowed(\n filePath: string,\n allowedPaths: readonly string[],\n projectRoot: string,\n): boolean {\n const normalizedRoot = normalize(resolve(projectRoot));\n const resolved = normalize(resolve(normalizedRoot, filePath));\n return allowedPaths.some((allowed) => {\n const resolvedAllowed = normalize(resolve(normalizedRoot, allowed));\n return isSubPath(resolvedAllowed, resolved);\n });\n}\n\nfunction isSubPath(basePath: string, candidatePath: string): boolean {\n const rel = relative(basePath, candidatePath);\n return rel === \"\" || (!rel.startsWith(\"..\") && !isAbsolute(rel));\n}\n\n/**\n * Check if a shell command is on the blocked list.\n * PRD section 14.4: Dangerous commands always require confirmation.\n */\nexport function isCommandBlocked(\n command: string,\n blockedCommands: readonly string[],\n): boolean {\n const normalizedCommand = command.trim().toLowerCase();\n return blockedCommands.some((blocked) =>\n normalizedCommand.includes(blocked.toLowerCase()),\n );\n}\n\n/**\n * Redact potential secrets from text for logging.\n */\nexport function redactSecrets(text: string): string {\n return text\n .replace(/sk-ant-api\\S+/g, \"sk-ant-api[REDACTED]\")\n .replace(/sk-[a-zA-Z0-9]{20,}/g, \"sk-[REDACTED]\")\n .replace(/AIza[a-zA-Z0-9_-]{35}/g, \"AIza[REDACTED]\")\n .replace(/ghp_[a-zA-Z0-9]{36}/g, \"ghp_[REDACTED]\")\n .replace(/Bearer\\s+[a-zA-Z0-9._-]+/gi, \"Bearer [REDACTED]\");\n}\n\n/**\n * Sanitize user input for safe inclusion in prompts.\n */\nexport function sanitizePromptInput(input: string): string {\n // Strip null bytes\n return input.replace(/\\0/g, \"\");\n}\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { getModelInfo } from './chunk-
|
|
2
|
-
import { ModelNotFoundError, AuthenticationError } from './chunk-
|
|
3
|
-
import { SUPPORTED_MODELS } from './chunk-
|
|
4
|
-
import { logger } from './chunk-
|
|
1
|
+
import { getModelInfo } from './chunk-VNZ3YTQD.js';
|
|
2
|
+
import { ModelNotFoundError, AuthenticationError } from './chunk-ZGOHARPV.js';
|
|
3
|
+
import { SUPPORTED_MODELS } from './chunk-HCIHOHLX.js';
|
|
4
|
+
import { logger } from './chunk-IR5HLBMH.js';
|
|
5
5
|
import { randomUUID } from 'crypto';
|
|
6
6
|
import { execa } from 'execa';
|
|
7
7
|
|
|
@@ -346,5 +346,5 @@ function logNativeAdapterSelection(provider) {
|
|
|
346
346
|
}
|
|
347
347
|
|
|
348
348
|
export { ClaudeNativeCLIAdapter, CodexNativeCLIAdapter, GeminiNativeCLIAdapter, KimiNativeCLIAdapter, logNativeAdapterSelection };
|
|
349
|
-
//# sourceMappingURL=chunk-
|
|
350
|
-
//# sourceMappingURL=chunk-
|
|
349
|
+
//# sourceMappingURL=chunk-PS4WEFW6.js.map
|
|
350
|
+
//# sourceMappingURL=chunk-PS4WEFW6.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/providers/native-cli-adapters.ts"],"names":[],"mappings":"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","file":"chunk-PS4WEFW6.js","sourcesContent":["/**\n * Native CLI-backed provider adapters.\n * Uses official provider CLIs in non-interactive mode when credentials come from native login.\n */\n\nimport { randomUUID } from \"node:crypto\";\nimport { execa } from \"execa\";\nimport {\n AuthenticationError,\n ModelNotFoundError,\n} from \"../types/errors.js\";\nimport { SUPPORTED_MODELS } from \"../types/model.js\";\nimport { getModelInfo as getDynamicModelInfo } from \"./model-discovery.js\";\nimport { logger } from \"../utils/logger.js\";\nimport type { IModelInfo, ProviderName } from \"../types/model.js\";\nimport type {\n IChatMessage,\n IChatRequest,\n IChatResponse,\n IStreamChunk,\n ITokenUsage,\n} from \"../types/message.js\";\nimport type { IModelProvider } from \"./types.js\";\n\ninterface ICLIResult {\n readonly text: string;\n readonly inputTokens?: number | undefined;\n readonly outputTokens?: number | undefined;\n readonly finishReason?: IChatResponse[\"finishReason\"] | undefined;\n}\n\nconst CHARS_PER_TOKEN_ESTIMATE = 4;\n\n/**\n * Resolve CLI timeout from environment. Default is 0 (no timeout) so that\n * long-running agent tasks are never prematurely killed.\n * Set AEMEATHCLI_NATIVE_CLI_TIMEOUT_MS to a positive integer to enforce a limit.\n */\nfunction resolveCliTimeoutMs(): number {\n const raw = process.env[\"AEMEATHCLI_NATIVE_CLI_TIMEOUT_MS\"];\n if (raw === undefined) {\n return 0;\n }\n\n const parsed = Number.parseInt(raw, 10);\n if (!Number.isFinite(parsed) || parsed <= 0) {\n return 0;\n }\n\n return parsed;\n}\n\nconst CLI_TIMEOUT_MS = resolveCliTimeoutMs();\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction asString(value: unknown): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction asNumber(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n}\n\nfunction toJsonLines(output: string): unknown[] {\n const lines = output\n .split(/\\r?\\n/u)\n .map((line) => line.trim())\n .filter((line) => line.length > 0 && line.startsWith(\"{\"));\n\n const parsed: unknown[] = [];\n for (const line of lines) {\n try {\n parsed.push(JSON.parse(line) as unknown);\n } catch {\n // Ignore non-JSON lines\n }\n }\n return parsed;\n}\n\nfunction buildPrompt(request: IChatRequest): string {\n // Extract only the user message text — system prompt is passed separately\n // via the provider's native --system-prompt flag.\n const latestUser = [...request.messages]\n .reverse()\n .find((message) => message.role === \"user\");\n const fallbackLast = request.messages.length > 0\n ? request.messages[request.messages.length - 1]\n : undefined;\n\n return latestUser?.content ?? fallbackLast?.content ?? \"\";\n}\n\nfunction computeCost(modelInfo: IModelInfo, inputTokens: number, outputTokens: number): number {\n return (\n (inputTokens / 1_000_000) * modelInfo.inputPricePerMToken +\n (outputTokens / 1_000_000) * modelInfo.outputPricePerMToken\n );\n}\n\nfunction classifyCliError(provider: ProviderName, error: unknown): Error {\n const message = error instanceof Error ? error.message : String(error);\n const lower = message.toLowerCase();\n\n if (\n lower.includes(\"login\")\n || lower.includes(\"credential\")\n || lower.includes(\"authentication\")\n || lower.includes(\"unauthorized\")\n || lower.includes(\"forbidden\")\n || lower.includes(\"api key\")\n || lower.includes(\"token\")\n ) {\n return new AuthenticationError(provider, message);\n }\n\n return error instanceof Error ? error : new Error(message);\n}\n\nabstract class BaseNativeCLIAdapter implements IModelProvider {\n abstract readonly name: ProviderName;\n abstract readonly supportedModels: readonly string[];\n readonly supportsToolCalling = false;\n\n protected abstract runCLI(model: string, prompt: string, systemPrompt?: string): Promise<ICLIResult>;\n\n async chat(request: IChatRequest): Promise<IChatResponse> {\n const modelInfo = this.getModelInfo(request.model);\n const prompt = buildPrompt(request);\n\n try {\n const result = await this.runCLI(request.model, prompt, request.system);\n\n const inputTokens = result.inputTokens ?? Math.ceil(prompt.length / CHARS_PER_TOKEN_ESTIMATE);\n const outputTokens = result.outputTokens ?? Math.ceil(result.text.length / CHARS_PER_TOKEN_ESTIMATE);\n\n const usage: ITokenUsage = {\n inputTokens,\n outputTokens,\n totalTokens: inputTokens + outputTokens,\n costUsd: computeCost(modelInfo, inputTokens, outputTokens),\n };\n\n const responseMessage: IChatMessage = {\n id: randomUUID(),\n role: \"assistant\",\n content: result.text,\n model: request.model,\n provider: this.name,\n tokenUsage: usage,\n createdAt: new Date(),\n };\n\n return {\n id: randomUUID(),\n model: request.model,\n provider: this.name,\n message: responseMessage,\n usage,\n finishReason: result.finishReason ?? \"stop\",\n };\n } catch (error: unknown) {\n throw classifyCliError(this.name, error);\n }\n }\n\n async *stream(request: IChatRequest): AsyncIterable<IStreamChunk> {\n try {\n const response = await this.chat(request);\n if (response.message.content.length > 0) {\n yield { type: \"text\", content: response.message.content };\n }\n yield { type: \"usage\", usage: response.usage };\n yield { type: \"done\" };\n } catch (error: unknown) {\n // Execa errors can include raw stdout/stderr in the message.\n // Truncate to prevent raw CLI protocol output from leaking through.\n const rawMsg = error instanceof Error ? error.message : String(error);\n const truncated = rawMsg.length > 500 ? rawMsg.slice(0, 500) + \"...\" : rawMsg;\n yield { type: \"error\", error: truncated };\n yield { type: \"done\" };\n }\n }\n\n countTokens(text: string, _model: string): Promise<number> {\n return Promise.resolve(Math.ceil(text.length / CHARS_PER_TOKEN_ESTIMATE));\n }\n\n getModelInfo(model: string): IModelInfo {\n // Check hardcoded registry first, then dynamic discovery\n const info = SUPPORTED_MODELS[model] ?? getDynamicModelInfo(model);\n if (info === undefined || info.provider !== this.name) {\n throw new ModelNotFoundError(model);\n }\n return info;\n }\n\n listAvailableModels(): Promise<readonly string[]> {\n return Promise.resolve([...this.supportedModels]);\n }\n}\n\nexport class ClaudeNativeCLIAdapter extends BaseNativeCLIAdapter {\n readonly name: ProviderName = \"anthropic\";\n readonly supportedModels = [\n \"claude-opus-4-6\",\n \"claude-opus-4-6-1m\",\n \"claude-sonnet-4-6\",\n \"claude-sonnet-4-6-1m\",\n \"claude-haiku-4-5\",\n ] as const;\n\n /** Map internal model IDs to valid Claude CLI model IDs. */\n private toCLIModelId(model: string): string {\n // The Claude CLI doesn't recognize the \"-1m\" context suffix.\n // Strip it — the API handles context window sizing automatically.\n return model.replace(/-1m$/, \"\");\n }\n\n protected async runCLI(model: string, prompt: string, systemPrompt?: string): Promise<ICLIResult> {\n const cliModel = this.toCLIModelId(model);\n const args = [\n \"-p\",\n \"--output-format\", \"json\",\n \"--model\", cliModel,\n // Skip project CLAUDE.md to avoid loading huge project instructions\n // that make Claude think it's Claude Code doing a codebase audit\n \"--setting-sources\", \"user\",\n ];\n\n if (systemPrompt && systemPrompt.length > 0) {\n args.push(\"--system-prompt\", systemPrompt);\n }\n\n args.push(prompt);\n\n const { stdout } = await execa(\n \"claude\",\n args,\n {\n timeout: CLI_TIMEOUT_MS,\n stdin: \"ignore\",\n env: { ...process.env, NO_COLOR: \"1\" },\n },\n );\n\n const lines = toJsonLines(stdout);\n const lastJson = lines.length > 0 ? lines[lines.length - 1] : undefined;\n\n if (!isRecord(lastJson)) {\n throw new Error(\"Claude CLI returned no JSON result\");\n }\n\n const text = asString(lastJson[\"result\"]) ?? \"\";\n const usage = isRecord(lastJson[\"usage\"]) ? lastJson[\"usage\"] : undefined;\n const inputTokens = usage ? asNumber(usage[\"input_tokens\"]) : undefined;\n const outputTokens = usage ? asNumber(usage[\"output_tokens\"]) : undefined;\n\n return {\n text,\n inputTokens,\n outputTokens,\n finishReason: \"stop\",\n };\n }\n}\n\nexport class CodexNativeCLIAdapter extends BaseNativeCLIAdapter {\n readonly name: ProviderName = \"openai\";\n readonly supportedModels = [\n \"gpt-5.3-codex\",\n \"gpt-5.3-codex-spark\",\n \"gpt-5.2-codex\",\n \"gpt-5.1-codex-max\",\n \"gpt-5.2\",\n \"gpt-5.1-codex-mini\",\n ] as const;\n\n protected async runCLI(model: string, prompt: string, systemPrompt?: string): Promise<ICLIResult> {\n // Allow agent panes to set a writable sandbox so codex can write to the\n // shared board directory. Default to \"read-only\" for normal usage.\n const sandbox = process.env[\"AEMEATHCLI_CODEX_SANDBOX\"] ?? \"read-only\";\n // Prepend system prompt for Codex (no native --system-prompt flag)\n const fullPrompt = systemPrompt ? `${systemPrompt}\\n\\n${prompt}` : prompt;\n const { stdout } = await execa(\n \"codex\",\n [\n \"exec\",\n \"--skip-git-repo-check\",\n ...(sandbox !== \"none\" ? [\"--sandbox\", sandbox] : []),\n \"--json\",\n \"--model\",\n model,\n fullPrompt,\n ],\n {\n timeout: CLI_TIMEOUT_MS,\n stdin: \"ignore\",\n env: { ...process.env, NO_COLOR: \"1\" },\n },\n );\n\n const lines = toJsonLines(stdout);\n const textParts: string[] = [];\n let inputTokens: number | undefined;\n let outputTokens: number | undefined;\n\n for (const line of lines) {\n if (!isRecord(line)) continue;\n const type = asString(line[\"type\"]);\n\n if (type === \"item.completed\") {\n const item = isRecord(line[\"item\"]) ? line[\"item\"] : undefined;\n if (item && asString(item[\"type\"]) === \"agent_message\") {\n const text = asString(item[\"text\"]);\n if (text && text.length > 0) {\n textParts.push(text);\n }\n }\n }\n\n if (type === \"turn.completed\") {\n const usage = isRecord(line[\"usage\"]) ? line[\"usage\"] : undefined;\n if (usage) {\n inputTokens = asNumber(usage[\"input_tokens\"]) ?? inputTokens;\n outputTokens = asNumber(usage[\"output_tokens\"]) ?? outputTokens;\n }\n }\n }\n\n return {\n text: textParts.join(\"\\n\").trim(),\n inputTokens,\n outputTokens,\n finishReason: \"stop\",\n };\n }\n}\n\nexport class GeminiNativeCLIAdapter extends BaseNativeCLIAdapter {\n readonly name: ProviderName = \"google\";\n readonly supportedModels = [\n \"gemini-3-pro-preview\",\n \"gemini-3-flash-preview\",\n \"gemini-2.5-pro\",\n \"gemini-2.5-flash\",\n \"gemini-2.5-flash-lite\",\n ] as const;\n\n protected async runCLI(model: string, prompt: string, systemPrompt?: string): Promise<ICLIResult> {\n // Prepend system prompt for Gemini (no native --system-prompt flag)\n const fullPrompt = systemPrompt ? `${systemPrompt}\\n\\n${prompt}` : prompt;\n const { stdout } = await execa(\n \"gemini\",\n [\n \"-p\",\n fullPrompt,\n \"--model\",\n model,\n \"--output-format\",\n \"stream-json\",\n \"--approval-mode\",\n \"yolo\",\n ],\n {\n timeout: CLI_TIMEOUT_MS,\n stdin: \"ignore\",\n env: { ...process.env, NO_COLOR: \"1\" },\n },\n );\n\n const lines = toJsonLines(stdout);\n let text = \"\";\n let inputTokens: number | undefined;\n let outputTokens: number | undefined;\n\n for (const line of lines) {\n if (!isRecord(line)) continue;\n const type = asString(line[\"type\"]);\n\n if (type === \"message\" && asString(line[\"role\"]) === \"assistant\") {\n const content = asString(line[\"content\"]);\n if (content !== undefined) {\n const delta = line[\"delta\"] === true;\n text = delta ? `${text}${content}` : content;\n }\n }\n\n if (type === \"result\") {\n const stats = isRecord(line[\"stats\"]) ? line[\"stats\"] : undefined;\n if (stats) {\n inputTokens = asNumber(stats[\"input_tokens\"]) ?? inputTokens;\n outputTokens = asNumber(stats[\"output_tokens\"]) ?? outputTokens;\n }\n }\n }\n\n return {\n text: text.trim(),\n inputTokens,\n outputTokens,\n finishReason: \"stop\",\n };\n }\n}\n\nexport class KimiNativeCLIAdapter extends BaseNativeCLIAdapter {\n readonly name: ProviderName = \"kimi\";\n readonly supportedModels = [\"kimi-for-coding\"] as const;\n\n protected async runCLI(_model: string, prompt: string, systemPrompt?: string): Promise<ICLIResult> {\n const fullPrompt = systemPrompt ? `${systemPrompt}\\n\\n${prompt}` : prompt;\n const { stdout } = await execa(\n \"kimi\",\n [\"--print\", \"--output-format\", \"stream-json\", \"-p\", fullPrompt],\n {\n timeout: CLI_TIMEOUT_MS,\n stdin: \"ignore\",\n env: { ...process.env, NO_COLOR: \"1\" },\n },\n );\n\n const lines = toJsonLines(stdout);\n let text = \"\";\n\n for (const line of lines) {\n if (!isRecord(line)) continue;\n if (asString(line[\"role\"]) !== \"assistant\") continue;\n\n const content = line[\"content\"];\n if (!Array.isArray(content)) continue;\n\n const textParts: string[] = [];\n for (const part of content) {\n if (!isRecord(part)) continue;\n if (asString(part[\"type\"]) === \"text\") {\n const piece = asString(part[\"text\"]);\n if (piece) textParts.push(piece);\n }\n }\n\n if (textParts.length > 0) {\n text = textParts.join(\"\");\n }\n }\n\n return {\n text: text.trim(),\n finishReason: \"stop\",\n };\n }\n}\n\nexport function logNativeAdapterSelection(provider: ProviderName): void {\n logger.info({ provider }, \"Using native CLI adapter\");\n}\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { getEventBus } from './chunk-
|
|
2
|
-
import { AgentSpawnError } from './chunk-
|
|
3
|
-
import { logger } from './chunk-
|
|
4
|
-
import { getIPCSocketPath, getTasksDir, ensureDirectory, getTeamsDir } from './chunk-
|
|
1
|
+
import { getEventBus } from './chunk-YL5XFHR3.js';
|
|
2
|
+
import { AgentSpawnError } from './chunk-ZGOHARPV.js';
|
|
3
|
+
import { logger } from './chunk-IR5HLBMH.js';
|
|
4
|
+
import { getIPCSocketPath, getTasksDir, ensureDirectory, getTeamsDir } from './chunk-D275MCIH.js';
|
|
5
5
|
import { join } from 'path';
|
|
6
6
|
import { writeFileSync, renameSync, unlinkSync, existsSync, readFileSync, readdirSync, rmSync } from 'fs';
|
|
7
7
|
import { randomUUID } from 'crypto';
|
|
@@ -1099,5 +1099,5 @@ var TeamManager = class {
|
|
|
1099
1099
|
};
|
|
1100
1100
|
|
|
1101
1101
|
export { AgentProcess, MessageBus, PlanApproval, TaskStore, TeamManager };
|
|
1102
|
-
//# sourceMappingURL=chunk-
|
|
1103
|
-
//# sourceMappingURL=chunk-
|
|
1102
|
+
//# sourceMappingURL=chunk-QK7TKNHV.js.map
|
|
1103
|
+
//# sourceMappingURL=chunk-QK7TKNHV.js.map
|