aemeathcli 1.0.9 → 1.0.11

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 (208) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +609 -608
  3. package/dist/App-YAHJUWCX.js +4274 -0
  4. package/dist/App-YAHJUWCX.js.map +1 -0
  5. package/dist/agent-store/architect.md +32 -0
  6. package/dist/agent-store/debugger.md +32 -0
  7. package/dist/agent-store/developer.md +29 -0
  8. package/dist/agent-store/documenter.md +30 -0
  9. package/dist/agent-store/researcher.md +31 -0
  10. package/dist/agent-store/reviewer.md +28 -0
  11. package/dist/agent-store/supervisor.md +37 -0
  12. package/dist/agent-store/tester.md +30 -0
  13. package/dist/api-key-fallback-UN3TJEOO.js +11 -0
  14. package/dist/{api-key-fallback-YQQBOQIL.js.map → api-key-fallback-UN3TJEOO.js.map} +1 -1
  15. package/dist/auth-status-EIM5A5KL.js +13 -0
  16. package/dist/auth-status-EIM5A5KL.js.map +1 -0
  17. package/dist/{chunk-UY2SYSEZ.js → chunk-25UNNEHN.js} +32 -103
  18. package/dist/chunk-25UNNEHN.js.map +1 -0
  19. package/dist/{chunk-CYQNBB25.js → chunk-2GKOK6T7.js} +28 -5
  20. package/dist/chunk-2GKOK6T7.js.map +1 -0
  21. package/dist/{chunk-MFBHNWGV.js → chunk-2LF7ALGR.js} +12 -20
  22. package/dist/chunk-2LF7ALGR.js.map +1 -0
  23. package/dist/{chunk-H66O5Z2V.js → chunk-2NWNIKBK.js} +42 -7
  24. package/dist/chunk-2NWNIKBK.js.map +1 -0
  25. package/dist/chunk-3TSPZRGM.js +26 -0
  26. package/dist/chunk-3TSPZRGM.js.map +1 -0
  27. package/dist/{chunk-ZGOHARPV.js → chunk-473JN6M5.js} +2 -2
  28. package/dist/chunk-473JN6M5.js.map +1 -0
  29. package/dist/{chunk-IYW62KKR.js → chunk-5XFSV6PF.js} +66 -23
  30. package/dist/chunk-5XFSV6PF.js.map +1 -0
  31. package/dist/{chunk-HCIHOHLX.js → chunk-62HSGYQD.js} +2 -2
  32. package/dist/chunk-62HSGYQD.js.map +1 -0
  33. package/dist/{chunk-I5PZ4JTS.js → chunk-6GUD7QIM.js} +4 -4
  34. package/dist/chunk-6GUD7QIM.js.map +1 -0
  35. package/dist/{chunk-4IJD72YB.js → chunk-AQ23TYSQ.js} +7 -7
  36. package/dist/chunk-AQ23TYSQ.js.map +1 -0
  37. package/dist/{chunk-NBR3GHMT.js → chunk-BY4DAKUU.js} +39 -7
  38. package/dist/chunk-BY4DAKUU.js.map +1 -0
  39. package/dist/chunk-CC7MGWYY.js +12 -0
  40. package/dist/chunk-CC7MGWYY.js.map +1 -0
  41. package/dist/chunk-CTFZTARK.js +155 -0
  42. package/dist/chunk-CTFZTARK.js.map +1 -0
  43. package/dist/chunk-FIC7AK4Q.js +232 -0
  44. package/dist/chunk-FIC7AK4Q.js.map +1 -0
  45. package/dist/chunk-GU33WKPG.js +140 -0
  46. package/dist/chunk-GU33WKPG.js.map +1 -0
  47. package/dist/{chunk-VUG4IZ7J.js → chunk-H2SYKIMI.js} +10 -10
  48. package/dist/chunk-H2SYKIMI.js.map +1 -0
  49. package/dist/{chunk-JAXXTYID.js → chunk-HEKFAKVH.js} +2 -2
  50. package/dist/chunk-HEKFAKVH.js.map +1 -0
  51. package/dist/chunk-IARA5XYP.js +186 -0
  52. package/dist/chunk-IARA5XYP.js.map +1 -0
  53. package/dist/{chunk-HMJRPNPZ.js → chunk-LCYH4T6N.js} +95 -23
  54. package/dist/chunk-LCYH4T6N.js.map +1 -0
  55. package/dist/{chunk-CARHU3DO.js → chunk-LDVY5ELP.js} +66 -18
  56. package/dist/chunk-LDVY5ELP.js.map +1 -0
  57. package/dist/chunk-OCJPQFOR.js +88 -0
  58. package/dist/chunk-OCJPQFOR.js.map +1 -0
  59. package/dist/chunk-ODBY7S4X.js +141 -0
  60. package/dist/chunk-ODBY7S4X.js.map +1 -0
  61. package/dist/{chunk-DAHGLHNR.js → chunk-ONQ4WCUI.js} +7 -142
  62. package/dist/chunk-ONQ4WCUI.js.map +1 -0
  63. package/dist/{chunk-WPP3PEDE.js → chunk-P5TKZM3T.js} +32 -107
  64. package/dist/chunk-P5TKZM3T.js.map +1 -0
  65. package/dist/{chunk-ASGRGXYK.js → chunk-P66WDACW.js} +23 -22
  66. package/dist/chunk-P66WDACW.js.map +1 -0
  67. package/dist/{chunk-LSOYPSAT.js → chunk-QCRK4QEL.js} +4 -4
  68. package/dist/chunk-QCRK4QEL.js.map +1 -0
  69. package/dist/{chunk-YL5XFHR3.js → chunk-ROJPFPJ7.js} +2 -2
  70. package/dist/chunk-ROJPFPJ7.js.map +1 -0
  71. package/dist/chunk-RP2TAL3J.js +71 -0
  72. package/dist/chunk-RP2TAL3J.js.map +1 -0
  73. package/dist/{chunk-6PDJ45T4.js → chunk-RYOB3TLZ.js} +51 -26
  74. package/dist/chunk-RYOB3TLZ.js.map +1 -0
  75. package/dist/{chunk-Y5XVD2CD.js → chunk-SOQFMNQC.js} +110 -83
  76. package/dist/chunk-SOQFMNQC.js.map +1 -0
  77. package/dist/{chunk-TEVZS4FA.js → chunk-TDFTX32B.js} +16 -9
  78. package/dist/chunk-TDFTX32B.js.map +1 -0
  79. package/dist/chunk-VBLLDY4R.js +38 -0
  80. package/dist/chunk-VBLLDY4R.js.map +1 -0
  81. package/dist/{chunk-CGEV3ARR.js → chunk-VJNQJALF.js} +4 -4
  82. package/dist/chunk-VJNQJALF.js.map +1 -0
  83. package/dist/chunk-WAYSJMPS.js +26 -0
  84. package/dist/chunk-WAYSJMPS.js.map +1 -0
  85. package/dist/chunk-WC72BRHR.js +241 -0
  86. package/dist/chunk-WC72BRHR.js.map +1 -0
  87. package/dist/{chunk-MXZSI3AY.js → chunk-YPFOE2QJ.js} +43 -11
  88. package/dist/chunk-YPFOE2QJ.js.map +1 -0
  89. package/dist/claude-adapter-6P4SJH7P.js +7 -0
  90. package/dist/{claude-adapter-QMLFMSP3.js.map → claude-adapter-6P4SJH7P.js.map} +1 -1
  91. package/dist/{claude-login-5WELXPKT.js → claude-login-IS5WTBMP.js} +10 -10
  92. package/dist/claude-login-IS5WTBMP.js.map +1 -0
  93. package/dist/cli.js +371 -172
  94. package/dist/cli.js.map +1 -1
  95. package/dist/{codex-login-DDJBCT43.js → codex-login-GMPF64MR.js} +18 -17
  96. package/dist/codex-login-GMPF64MR.js.map +1 -0
  97. package/dist/config-store-POB6I37G.js +7 -0
  98. package/dist/{config-store-W6FBCQAQ.js.map → config-store-POB6I37G.js.map} +1 -1
  99. package/dist/conversation-store-PRBHWQMJ.js +4 -0
  100. package/dist/conversation-store-PRBHWQMJ.js.map +1 -0
  101. package/dist/detect-providers-C4SVQHFF.js +4 -0
  102. package/dist/detect-providers-C4SVQHFF.js.map +1 -0
  103. package/dist/executor-RUX7VK3T.js +4 -0
  104. package/dist/{executor-6RIKIGXK.js.map → executor-RUX7VK3T.js.map} +1 -1
  105. package/dist/first-run-GDEVRFPO.js +230 -0
  106. package/dist/first-run-GDEVRFPO.js.map +1 -0
  107. package/dist/gemini-adapter-MV3U4QFH.js +7 -0
  108. package/dist/{gemini-adapter-6JIHZ7WI.js.map → gemini-adapter-MV3U4QFH.js.map} +1 -1
  109. package/dist/{gemini-login-YEPK6GGW.js → gemini-login-KE224MSW.js} +13 -14
  110. package/dist/gemini-login-KE224MSW.js.map +1 -0
  111. package/dist/index.d.ts +47 -17
  112. package/dist/index.js +86 -471
  113. package/dist/index.js.map +1 -1
  114. package/dist/input-history-MIOO3FIW.js +57 -0
  115. package/dist/input-history-MIOO3FIW.js.map +1 -0
  116. package/dist/kimi-adapter-UODMNX6K.js +6 -0
  117. package/dist/{kimi-adapter-JN4HFFHU.js.map → kimi-adapter-UODMNX6K.js.map} +1 -1
  118. package/dist/{kimi-login-ZR74MIY4.js → kimi-login-DNT5YBKX.js} +18 -17
  119. package/dist/kimi-login-DNT5YBKX.js.map +1 -0
  120. package/dist/logger-PLPDWACQ.js +3 -0
  121. package/dist/logger-PLPDWACQ.js.map +1 -0
  122. package/dist/model-discovery-O64ZWPX5.js +6 -0
  123. package/dist/model-discovery-O64ZWPX5.js.map +1 -0
  124. package/dist/native-cli-adapters-JMZX2C2C.js +8 -0
  125. package/dist/{native-cli-adapters-OLW3XX57.js.map → native-cli-adapters-JMZX2C2C.js.map} +1 -1
  126. package/dist/ollama-adapter-GE67BNSS.js +5 -0
  127. package/dist/{ollama-adapter-OJQ3FKWK.js.map → ollama-adapter-GE67BNSS.js.map} +1 -1
  128. package/dist/openai-adapter-SHPLK77L.js +7 -0
  129. package/dist/{openai-adapter-XU46EN7B.js.map → openai-adapter-SHPLK77L.js.map} +1 -1
  130. package/dist/pathResolver-A6IXQQFE.js +3 -0
  131. package/dist/pathResolver-A6IXQQFE.js.map +1 -0
  132. package/dist/profile-loader-TNAXBLDX.js +162 -0
  133. package/dist/profile-loader-TNAXBLDX.js.map +1 -0
  134. package/dist/registry-3NHVCXCZ.js +6 -0
  135. package/dist/{registry-H7B3AHPQ.js.map → registry-3NHVCXCZ.js.map} +1 -1
  136. package/dist/registry-7CQ3NCAD.js +5 -0
  137. package/dist/{registry-OYWYT7WL.js.map → registry-7CQ3NCAD.js.map} +1 -1
  138. package/dist/server-manager-DES23IBQ.js +5 -0
  139. package/dist/{server-manager-PTGBHCLS.js.map → server-manager-DES23IBQ.js.map} +1 -1
  140. package/dist/session-manager-EHD7GWM2.js +12 -0
  141. package/dist/{session-manager-NYB2RKMS.js.map → session-manager-EHD7GWM2.js.map} +1 -1
  142. package/dist/skills/built-in/code-review/SKILL.md +85 -0
  143. package/dist/skills/built-in/commit/SKILL.md +83 -0
  144. package/dist/skills/built-in/debug/SKILL.md +119 -0
  145. package/dist/skills/built-in/plan/SKILL.md +123 -0
  146. package/dist/skills/built-in/refactor/SKILL.md +132 -0
  147. package/dist/skills/built-in/test/SKILL.md +128 -0
  148. package/dist/sqlite-store-7ZIVOUNI.js +5 -0
  149. package/dist/sqlite-store-7ZIVOUNI.js.map +1 -0
  150. package/dist/team-manager-6DCNLGTC.js +11 -0
  151. package/dist/{team-manager-HC4XGCFY.js.map → team-manager-6DCNLGTC.js.map} +1 -1
  152. package/dist/team-state-R2D7DT5M.js +3 -0
  153. package/dist/team-state-R2D7DT5M.js.map +1 -0
  154. package/dist/tmux-manager-WBKHUHDT.js +6 -0
  155. package/dist/{tmux-manager-GPYZ3WQH.js.map → tmux-manager-WBKHUHDT.js.map} +1 -1
  156. package/dist/tools-I6XCTEZY.js +6 -0
  157. package/dist/{tools-TSMXMHIF.js.map → tools-I6XCTEZY.js.map} +1 -1
  158. package/package.json +93 -89
  159. package/dist/App-TE3JJKOW.js +0 -2789
  160. package/dist/App-TE3JJKOW.js.map +0 -1
  161. package/dist/api-key-fallback-YQQBOQIL.js +0 -11
  162. package/dist/chunk-4IJD72YB.js.map +0 -1
  163. package/dist/chunk-6PDJ45T4.js.map +0 -1
  164. package/dist/chunk-ASGRGXYK.js.map +0 -1
  165. package/dist/chunk-CARHU3DO.js.map +0 -1
  166. package/dist/chunk-CGEV3ARR.js.map +0 -1
  167. package/dist/chunk-CS5X3BWX.js +0 -27
  168. package/dist/chunk-CS5X3BWX.js.map +0 -1
  169. package/dist/chunk-CYQNBB25.js.map +0 -1
  170. package/dist/chunk-DAHGLHNR.js.map +0 -1
  171. package/dist/chunk-H66O5Z2V.js.map +0 -1
  172. package/dist/chunk-HCIHOHLX.js.map +0 -1
  173. package/dist/chunk-HMJRPNPZ.js.map +0 -1
  174. package/dist/chunk-I5PZ4JTS.js.map +0 -1
  175. package/dist/chunk-IYW62KKR.js.map +0 -1
  176. package/dist/chunk-JAXXTYID.js.map +0 -1
  177. package/dist/chunk-LSOYPSAT.js.map +0 -1
  178. package/dist/chunk-MFBHNWGV.js.map +0 -1
  179. package/dist/chunk-MXZSI3AY.js.map +0 -1
  180. package/dist/chunk-NBR3GHMT.js.map +0 -1
  181. package/dist/chunk-TEVZS4FA.js.map +0 -1
  182. package/dist/chunk-UY2SYSEZ.js.map +0 -1
  183. package/dist/chunk-VUG4IZ7J.js.map +0 -1
  184. package/dist/chunk-WAHVZH7V.js +0 -260
  185. package/dist/chunk-WAHVZH7V.js.map +0 -1
  186. package/dist/chunk-WPP3PEDE.js.map +0 -1
  187. package/dist/chunk-Y5XVD2CD.js.map +0 -1
  188. package/dist/chunk-YL5XFHR3.js.map +0 -1
  189. package/dist/chunk-ZGOHARPV.js.map +0 -1
  190. package/dist/claude-adapter-QMLFMSP3.js +0 -6
  191. package/dist/claude-login-5WELXPKT.js.map +0 -1
  192. package/dist/codex-login-DDJBCT43.js.map +0 -1
  193. package/dist/config-store-W6FBCQAQ.js +0 -6
  194. package/dist/executor-6RIKIGXK.js +0 -4
  195. package/dist/gemini-adapter-6JIHZ7WI.js +0 -6
  196. package/dist/gemini-login-YEPK6GGW.js.map +0 -1
  197. package/dist/kimi-adapter-JN4HFFHU.js +0 -6
  198. package/dist/kimi-login-ZR74MIY4.js.map +0 -1
  199. package/dist/native-cli-adapters-OLW3XX57.js +0 -6
  200. package/dist/ollama-adapter-OJQ3FKWK.js +0 -6
  201. package/dist/openai-adapter-XU46EN7B.js +0 -6
  202. package/dist/registry-H7B3AHPQ.js +0 -5
  203. package/dist/registry-OYWYT7WL.js +0 -6
  204. package/dist/server-manager-PTGBHCLS.js +0 -5
  205. package/dist/session-manager-NYB2RKMS.js +0 -12
  206. package/dist/team-manager-HC4XGCFY.js +0 -11
  207. package/dist/tmux-manager-GPYZ3WQH.js +0 -6
  208. package/dist/tools-TSMXMHIF.js +0 -6
@@ -1,5 +1,5 @@
1
- import { ServerConnectionError, ToolCallError } from './chunk-ZGOHARPV.js';
2
- import { logger } from './chunk-JAXXTYID.js';
1
+ import { ServerConnectionError, ToolCallError } from './chunk-473JN6M5.js';
2
+ import { logger } from './chunk-HEKFAKVH.js';
3
3
  import { Client } from '@modelcontextprotocol/sdk/client/index.js';
4
4
  import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
5
5
 
@@ -83,8 +83,8 @@ var MCPClient = class {
83
83
  const result = await client.listTools();
84
84
  return result.tools.map((tool) => ({
85
85
  name: tool.name,
86
- description: tool.description ?? "",
87
- inputSchema: tool.inputSchema ?? {}
86
+ description: typeof tool.description === "string" ? tool.description : "",
87
+ inputSchema: tool.inputSchema
88
88
  }));
89
89
  } catch (error) {
90
90
  const msg = error instanceof Error ? error.message : String(error);
@@ -112,9 +112,9 @@ var MCPClient = class {
112
112
  const result = await client.listResources();
113
113
  return result.resources.map((r) => ({
114
114
  uri: r.uri,
115
- name: r.name ?? r.uri,
115
+ name: typeof r.name === "string" ? r.name : r.uri,
116
116
  description: "",
117
- mimeType: r.mimeType ?? "application/octet-stream"
117
+ mimeType: typeof r.mimeType === "string" ? r.mimeType : "application/octet-stream"
118
118
  }));
119
119
  } catch (error) {
120
120
  const msg = error instanceof Error ? error.message : String(error);
@@ -146,11 +146,9 @@ var MCPClient = class {
146
146
  }
147
147
  const timeoutPromise = new Promise((_resolve, reject) => {
148
148
  setTimeout(
149
- () => reject(
150
- new Error(
151
- `Connection timed out after ${this.connectionTimeoutMs}ms`
152
- )
153
- ),
149
+ () => {
150
+ reject(new Error(`Connection timed out after ${this.connectionTimeoutMs}ms`));
151
+ },
154
152
  this.connectionTimeoutMs
155
153
  );
156
154
  });
@@ -162,8 +160,7 @@ var MCPClient = class {
162
160
  });
163
161
  await Promise.race([client.connect(transport), timeoutPromise]);
164
162
  return;
165
- }
166
- if (this.transportConfig.type === "streamable-http") {
163
+ } else {
167
164
  const { StreamableHTTPClientTransport } = await import('@modelcontextprotocol/sdk/client/streamableHttp.js');
168
165
  const transport = new StreamableHTTPClientTransport(
169
166
  new URL(this.transportConfig.url)
@@ -171,11 +168,6 @@ var MCPClient = class {
171
168
  await Promise.race([client.connect(transport), timeoutPromise]);
172
169
  return;
173
170
  }
174
- const _exhaustive = this.transportConfig;
175
- throw new ServerConnectionError(
176
- this.serverName,
177
- `Unknown transport type: ${JSON.stringify(_exhaustive)}`
178
- );
179
171
  }
180
172
  requireConnected() {
181
173
  if (!this.connected || !this.client) {
@@ -412,5 +404,5 @@ var MCPServerManager = class {
412
404
  };
413
405
 
414
406
  export { MCPClient, MCPServerManager };
415
- //# sourceMappingURL=chunk-MFBHNWGV.js.map
416
- //# sourceMappingURL=chunk-MFBHNWGV.js.map
407
+ //# sourceMappingURL=chunk-2LF7ALGR.js.map
408
+ //# sourceMappingURL=chunk-2LF7ALGR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/mcp/client.ts","../src/mcp/server-manager.ts"],"names":[],"mappings":"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","file":"chunk-2LF7ALGR.js","sourcesContent":["/**\r\n * MCP client per PRD section 11.1\r\n * Wraps @modelcontextprotocol/sdk Client with typed, transport-agnostic interface.\r\n * Supports stdio (local servers) and Streamable HTTP (remote servers).\r\n */\r\n\r\nimport { Client } from \"@modelcontextprotocol/sdk/client/index.js\";\r\nimport { StdioClientTransport } from \"@modelcontextprotocol/sdk/client/stdio.js\";\r\nimport type { Transport } from \"@modelcontextprotocol/sdk/shared/transport.js\";\r\nimport { logger } from \"../utils/logger.js\";\r\nimport { ServerConnectionError, ToolCallError } from \"../types/errors.js\";\r\n\r\n// ── Exported Types ──────────────────────────────────────────────────────\r\n\r\nexport interface IMCPToolSchema {\r\n readonly name: string;\r\n readonly description: string;\r\n readonly inputSchema: Readonly<Record<string, unknown>>;\r\n}\r\n\r\nexport interface IMCPCallResult {\r\n readonly content: string;\r\n readonly isError: boolean;\r\n}\r\n\r\nexport interface IMCPResource {\r\n readonly uri: string;\r\n readonly name: string;\r\n readonly description: string;\r\n readonly mimeType: string;\r\n}\r\n\r\n// ── Transport Configuration ─────────────────────────────────────────────\r\n\r\nexport interface IStdioTransportConfig {\r\n readonly type: \"stdio\";\r\n readonly command: string;\r\n readonly args: readonly string[];\r\n readonly env?: Readonly<Record<string, string>>;\r\n}\r\n\r\nexport interface IHttpTransportConfig {\r\n readonly type: \"streamable-http\";\r\n readonly url: string;\r\n}\r\n\r\nexport type MCPTransportConfig = IStdioTransportConfig | IHttpTransportConfig;\r\n\r\n// ── Client Options ──────────────────────────────────────────────────────\r\n\r\nexport interface IMCPClientOptions {\r\n readonly serverName: string;\r\n readonly transport: MCPTransportConfig;\r\n readonly connectionTimeoutMs?: number;\r\n}\r\n\r\n// ── Constants ───────────────────────────────────────────────────────────\r\n\r\nconst DEFAULT_TIMEOUT_MS = 30_000;\r\nconst CLIENT_NAME = \"aemeathcli\";\r\nconst CLIENT_VERSION = \"1.0.0\";\r\n\r\n// ── Content Helpers ─────────────────────────────────────────────────────\r\n\r\ninterface IContentItem {\r\n readonly type: string;\r\n readonly text?: string;\r\n}\r\n\r\nfunction extractText(content: unknown): string {\r\n if (!Array.isArray(content)) {\r\n return \"No output\";\r\n }\r\n const parts: string[] = [];\r\n for (const item of content as ReadonlyArray<IContentItem>) {\r\n if (item.type === \"text\" && typeof item.text === \"string\") {\r\n parts.push(item.text);\r\n }\r\n }\r\n return parts.length > 0 ? parts.join(\"\\n\") : \"No output\";\r\n}\r\n\r\n// ── MCPClient ───────────────────────────────────────────────────────────\r\n\r\nexport class MCPClient {\r\n private client: Client | undefined;\r\n private connected = false;\r\n private readonly serverName: string;\r\n private readonly transportConfig: MCPTransportConfig;\r\n private readonly connectionTimeoutMs: number;\r\n\r\n constructor(options: IMCPClientOptions) {\r\n this.serverName = options.serverName;\r\n this.transportConfig = options.transport;\r\n this.connectionTimeoutMs = options.connectionTimeoutMs ?? DEFAULT_TIMEOUT_MS;\r\n }\r\n\r\n get isConnected(): boolean {\r\n return this.connected;\r\n }\r\n\r\n get name(): string {\r\n return this.serverName;\r\n }\r\n\r\n /** Establish connection to the MCP server. */\r\n async connect(): Promise<void> {\r\n if (this.connected) {\r\n return;\r\n }\r\n\r\n logger.info({ server: this.serverName }, \"Connecting to MCP server\");\r\n\r\n try {\r\n this.client = new Client(\r\n { name: CLIENT_NAME, version: CLIENT_VERSION },\r\n { capabilities: { sampling: {} } },\r\n );\r\n\r\n await this.connectWithTimeout();\r\n this.connected = true;\r\n logger.info({ server: this.serverName }, \"Connected to MCP server\");\r\n } catch (error: unknown) {\r\n this.connected = false;\r\n this.client = undefined;\r\n const msg = error instanceof Error ? error.message : String(error);\r\n throw new ServerConnectionError(this.serverName, msg);\r\n }\r\n }\r\n\r\n /** Gracefully close the MCP connection. */\r\n async disconnect(): Promise<void> {\r\n if (!this.connected || !this.client) {\r\n return;\r\n }\r\n\r\n logger.info({ server: this.serverName }, \"Disconnecting from MCP server\");\r\n\r\n try {\r\n await this.client.close();\r\n } catch (error: unknown) {\r\n logger.warn({ server: this.serverName, error }, \"Error during MCP disconnect\");\r\n } finally {\r\n this.connected = false;\r\n this.client = undefined;\r\n }\r\n }\r\n\r\n /** Disconnect then reconnect to the server. */\r\n async reconnect(): Promise<void> {\r\n await this.disconnect();\r\n await this.connect();\r\n }\r\n\r\n /** List all tools exposed by this MCP server. */\r\n async listTools(): Promise<readonly IMCPToolSchema[]> {\r\n const client = this.requireConnected();\r\n\r\n try {\r\n const result = await client.listTools();\r\n return result.tools.map((tool) => ({\r\n name: tool.name,\r\n description: typeof tool.description === \"string\" ? tool.description : \"\",\r\n inputSchema: tool.inputSchema as Readonly<Record<string, unknown>>,\r\n }));\r\n } catch (error: unknown) {\r\n const msg = error instanceof Error ? error.message : String(error);\r\n throw new ServerConnectionError(this.serverName, `listTools failed: ${msg}`);\r\n }\r\n }\r\n\r\n /** Call a tool on this MCP server with the given arguments. */\r\n async callTool(\r\n toolName: string,\r\n args: Record<string, unknown>,\r\n ): Promise<IMCPCallResult> {\r\n const client = this.requireConnected();\r\n\r\n try {\r\n const result = await client.callTool({ name: toolName, arguments: args });\r\n return {\r\n content: extractText(result.content),\r\n isError: result.isError === true,\r\n };\r\n } catch (error: unknown) {\r\n const msg = error instanceof Error ? error.message : String(error);\r\n throw new ToolCallError(toolName, msg);\r\n }\r\n }\r\n\r\n /** List resources exposed by this MCP server. */\r\n async listResources(): Promise<readonly IMCPResource[]> {\r\n const client = this.requireConnected();\r\n\r\n try {\r\n const result = await client.listResources();\r\n return result.resources.map((r) => ({\r\n uri: r.uri,\r\n name: typeof r.name === \"string\" ? r.name : r.uri,\r\n description: \"\",\r\n mimeType: typeof r.mimeType === \"string\" ? r.mimeType : \"application/octet-stream\",\r\n }));\r\n } catch (error: unknown) {\r\n const msg = error instanceof Error ? error.message : String(error);\r\n throw new ServerConnectionError(\r\n this.serverName,\r\n `listResources failed: ${msg}`,\r\n );\r\n }\r\n }\r\n\r\n /** Read a specific resource by URI. */\r\n async readResource(uri: string): Promise<string> {\r\n const client = this.requireConnected();\r\n\r\n try {\r\n const result = await client.readResource({ uri });\r\n return extractText(result.contents);\r\n } catch (error: unknown) {\r\n const msg = error instanceof Error ? error.message : String(error);\r\n throw new ServerConnectionError(\r\n this.serverName,\r\n `readResource(${uri}) failed: ${msg}`,\r\n );\r\n }\r\n }\r\n\r\n // ── Private Helpers ─────────────────────────────────────────────────\r\n\r\n private async connectWithTimeout(): Promise<void> {\r\n const client = this.client;\r\n if (!client) {\r\n throw new Error(\"Client not initialised\");\r\n }\r\n\r\n const timeoutPromise = new Promise<never>((_resolve, reject) => {\r\n setTimeout(\r\n () => {\r\n reject(new Error(`Connection timed out after ${this.connectionTimeoutMs}ms`));\r\n },\r\n this.connectionTimeoutMs,\r\n );\r\n });\r\n\r\n if (this.transportConfig.type === \"stdio\") {\r\n const transport = new StdioClientTransport({\r\n command: this.transportConfig.command,\r\n args: [...this.transportConfig.args],\r\n ...(this.transportConfig.env !== undefined\r\n ? { env: { ...this.transportConfig.env } }\r\n : {}),\r\n });\r\n await Promise.race([client.connect(transport), timeoutPromise]);\r\n return;\r\n }\r\n\r\n else {\r\n const { StreamableHTTPClientTransport } = await import(\r\n \"@modelcontextprotocol/sdk/client/streamableHttp.js\"\r\n );\r\n const transport = new StreamableHTTPClientTransport(\r\n new URL(this.transportConfig.url),\r\n );\r\n await Promise.race([client.connect(transport as Transport), timeoutPromise]);\r\n return;\r\n }\r\n }\r\n\r\n private requireConnected(): Client {\r\n if (!this.connected || !this.client) {\r\n throw new ServerConnectionError(this.serverName, \"Not connected\");\r\n }\r\n return this.client;\r\n }\r\n}\r\n","/**\r\n * MCP server lifecycle manager per PRD section 11.1\r\n * Manages multiple MCP server connections: start, stop, health-check, restart, rate-limit.\r\n */\r\n\r\nimport { logger } from \"../utils/logger.js\";\r\nimport { ServerConnectionError } from \"../types/errors.js\";\r\nimport { MCPClient } from \"./client.js\";\r\nimport type { IMCPClientOptions, IMCPToolSchema, IStdioTransportConfig } from \"./client.js\";\r\nimport type { IMCPConfig, IMCPServerConfig } from \"../types/config.js\";\r\n\r\n// ── Server State ────────────────────────────────────────────────────────\r\n\r\ntype ServerStatus = \"stopped\" | \"connecting\" | \"connected\" | \"error\";\r\n\r\ninterface IServerEntry {\r\n readonly client: MCPClient;\r\n status: ServerStatus;\r\n lastHealthCheck: number;\r\n consecutiveFailures: number;\r\n readonly rateLimit: IRateLimitState;\r\n}\r\n\r\n// ── Rate Limiting ───────────────────────────────────────────────────────\r\n\r\ninterface IRateLimitState {\r\n callTimestamps: number[];\r\n maxCallsPerMinute: number;\r\n}\r\n\r\nexport interface IRateLimitConfig {\r\n readonly maxCallsPerMinute: number;\r\n}\r\n\r\n// ── Manager Options ─────────────────────────────────────────────────────\r\n\r\nexport interface IServerManagerOptions {\r\n readonly connectionTimeoutMs?: number;\r\n readonly healthCheckIntervalMs?: number;\r\n readonly maxConsecutiveFailures?: number;\r\n readonly defaultRateLimit?: IRateLimitConfig | undefined;\r\n readonly rateLimits?: Readonly<Record<string, IRateLimitConfig>> | undefined;\r\n}\r\n\r\n// ── Constants ───────────────────────────────────────────────────────────\r\n\r\nconst DEFAULT_HEALTH_INTERVAL_MS = 60_000;\r\nconst DEFAULT_MAX_FAILURES = 3;\r\nconst DEFAULT_MAX_CALLS_PER_MINUTE = 60;\r\nconst RATE_LIMIT_WINDOW_MS = 60_000;\r\n\r\n// ── MCPServerManager ────────────────────────────────────────────────────\r\n\r\nexport class MCPServerManager {\r\n private readonly servers = new Map<string, IServerEntry>();\r\n private readonly options: Required<\r\n Pick<IServerManagerOptions, \"connectionTimeoutMs\" | \"healthCheckIntervalMs\" | \"maxConsecutiveFailures\">\r\n > & Pick<IServerManagerOptions, \"defaultRateLimit\" | \"rateLimits\">;\r\n private healthCheckTimer: ReturnType<typeof setInterval> | undefined;\r\n\r\n constructor(options?: IServerManagerOptions) {\r\n this.options = {\r\n connectionTimeoutMs: options?.connectionTimeoutMs ?? 30_000,\r\n healthCheckIntervalMs: options?.healthCheckIntervalMs ?? DEFAULT_HEALTH_INTERVAL_MS,\r\n maxConsecutiveFailures: options?.maxConsecutiveFailures ?? DEFAULT_MAX_FAILURES,\r\n defaultRateLimit: options?.defaultRateLimit,\r\n rateLimits: options?.rateLimits,\r\n };\r\n }\r\n\r\n /** Start all servers defined in the MCP config. */\r\n async startAll(config: IMCPConfig): Promise<void> {\r\n const entries = Object.entries(config.mcpServers);\r\n if (entries.length === 0) {\r\n logger.info(\"No MCP servers configured\");\r\n return;\r\n }\r\n\r\n logger.info({ count: entries.length }, \"Starting MCP servers\");\r\n\r\n const results = await Promise.allSettled(\r\n entries.map(([name, serverConfig]) => this.startServer(name, serverConfig)),\r\n );\r\n\r\n let successCount = 0;\r\n for (const result of results) {\r\n if (result.status === \"fulfilled\") {\r\n successCount++;\r\n }\r\n }\r\n\r\n logger.info(\r\n { total: entries.length, connected: successCount },\r\n \"MCP server startup complete\",\r\n );\r\n\r\n this.startHealthChecks();\r\n }\r\n\r\n /** Start a single MCP server by name and config. */\r\n async startServer(name: string, serverConfig: IMCPServerConfig): Promise<void> {\r\n if (this.servers.has(name)) {\r\n logger.warn({ server: name }, \"MCP server already registered, stopping first\");\r\n await this.stopServer(name);\r\n }\r\n\r\n logger.info({ server: name, command: serverConfig.command }, \"Starting MCP server\");\r\n\r\n const transportConfig: IStdioTransportConfig = {\r\n type: \"stdio\",\r\n command: serverConfig.command,\r\n args: [...serverConfig.args],\r\n ...(serverConfig.env !== undefined ? { env: { ...serverConfig.env } } : {}),\r\n };\r\n\r\n const clientOptions: IMCPClientOptions = {\r\n serverName: name,\r\n transport: transportConfig,\r\n connectionTimeoutMs: this.options.connectionTimeoutMs,\r\n };\r\n\r\n const client = new MCPClient(clientOptions);\r\n const maxCalls = this.getMaxCallsPerMinute(name);\r\n\r\n const entry: IServerEntry = {\r\n client,\r\n status: \"connecting\",\r\n lastHealthCheck: Date.now(),\r\n consecutiveFailures: 0,\r\n rateLimit: { callTimestamps: [], maxCallsPerMinute: maxCalls },\r\n };\r\n\r\n this.servers.set(name, entry);\r\n\r\n try {\r\n await client.connect();\r\n entry.status = \"connected\";\r\n logger.info({ server: name }, \"MCP server connected\");\r\n } catch (error: unknown) {\r\n entry.status = \"error\";\r\n entry.consecutiveFailures = 1;\r\n const msg = error instanceof Error ? error.message : String(error);\r\n logger.error({ server: name, error: msg }, \"Failed to start MCP server\");\r\n throw new ServerConnectionError(name, msg);\r\n }\r\n }\r\n\r\n /** Stop a single server by name. */\r\n async stopServer(name: string): Promise<void> {\r\n const entry = this.servers.get(name);\r\n if (!entry) {\r\n return;\r\n }\r\n\r\n logger.info({ server: name }, \"Stopping MCP server\");\r\n\r\n try {\r\n await entry.client.disconnect();\r\n } catch (error: unknown) {\r\n logger.warn({ server: name, error }, \"Error stopping MCP server\");\r\n }\r\n\r\n entry.status = \"stopped\";\r\n this.servers.delete(name);\r\n }\r\n\r\n /** Stop all managed servers and clean up. */\r\n async stopAll(): Promise<void> {\r\n this.stopHealthChecks();\r\n\r\n const names = [...this.servers.keys()];\r\n logger.info({ count: names.length }, \"Stopping all MCP servers\");\r\n\r\n await Promise.allSettled(names.map((name) => this.stopServer(name)));\r\n }\r\n\r\n /** Get a connected client by server name. */\r\n getClient(name: string): MCPClient | undefined {\r\n const entry = this.servers.get(name);\r\n if (!entry || entry.status !== \"connected\") {\r\n return undefined;\r\n }\r\n return entry.client;\r\n }\r\n\r\n /** Get all connected server names. */\r\n getConnectedServers(): readonly string[] {\r\n const connected: string[] = [];\r\n for (const [name, entry] of this.servers) {\r\n if (entry.status === \"connected\") {\r\n connected.push(name);\r\n }\r\n }\r\n return connected;\r\n }\r\n\r\n /** Get the status of a server. */\r\n getServerStatus(name: string): ServerStatus | undefined {\r\n return this.servers.get(name)?.status;\r\n }\r\n\r\n /** List tools from a specific server (with rate-limit check). */\r\n async listServerTools(name: string): Promise<readonly IMCPToolSchema[]> {\r\n const entry = this.requireServer(name);\r\n this.checkRateLimit(entry, name);\r\n return entry.client.listTools();\r\n }\r\n\r\n /** Check rate limit before allowing a call to the given server. Throws on exceeded. */\r\n checkRateLimitFor(name: string): void {\r\n const entry = this.requireServer(name);\r\n this.checkRateLimit(entry, name);\r\n }\r\n\r\n /** Record a tool call for rate-limiting purposes. */\r\n recordCall(name: string): void {\r\n const entry = this.servers.get(name);\r\n if (entry) {\r\n entry.rateLimit.callTimestamps.push(Date.now());\r\n }\r\n }\r\n\r\n // ── Health Checking ─────────────────────────────────────────────────\r\n\r\n private startHealthChecks(): void {\r\n this.stopHealthChecks();\r\n\r\n this.healthCheckTimer = setInterval(() => {\r\n void this.runHealthChecks();\r\n }, this.options.healthCheckIntervalMs);\r\n\r\n // Prevent the timer from keeping the process alive\r\n if (typeof this.healthCheckTimer === \"object\" && \"unref\" in this.healthCheckTimer) {\r\n this.healthCheckTimer.unref();\r\n }\r\n }\r\n\r\n private stopHealthChecks(): void {\r\n if (this.healthCheckTimer !== undefined) {\r\n clearInterval(this.healthCheckTimer);\r\n this.healthCheckTimer = undefined;\r\n }\r\n }\r\n\r\n private async runHealthChecks(): Promise<void> {\r\n for (const [name, entry] of this.servers) {\r\n if (entry.status === \"stopped\") {\r\n continue;\r\n }\r\n\r\n try {\r\n await entry.client.listTools();\r\n entry.status = \"connected\";\r\n entry.consecutiveFailures = 0;\r\n entry.lastHealthCheck = Date.now();\r\n } catch {\r\n entry.consecutiveFailures++;\r\n entry.status = \"error\";\r\n logger.warn(\r\n { server: name, failures: entry.consecutiveFailures },\r\n \"MCP health check failed\",\r\n );\r\n\r\n if (entry.consecutiveFailures >= this.options.maxConsecutiveFailures) {\r\n logger.info({ server: name }, \"Attempting MCP server restart\");\r\n void this.restartServer(name, entry);\r\n }\r\n }\r\n }\r\n }\r\n\r\n private async restartServer(name: string, entry: IServerEntry): Promise<void> {\r\n try {\r\n await entry.client.reconnect();\r\n entry.status = \"connected\";\r\n entry.consecutiveFailures = 0;\r\n logger.info({ server: name }, \"MCP server restarted successfully\");\r\n } catch (error: unknown) {\r\n entry.status = \"error\";\r\n const msg = error instanceof Error ? error.message : String(error);\r\n logger.error({ server: name, error: msg }, \"MCP server restart failed\");\r\n }\r\n }\r\n\r\n // ── Rate Limiting ─────────────────────────────────────────────────\r\n\r\n private checkRateLimit(entry: IServerEntry, serverName: string): void {\r\n const now = Date.now();\r\n const windowStart = now - RATE_LIMIT_WINDOW_MS;\r\n\r\n // Prune timestamps outside the window\r\n entry.rateLimit.callTimestamps = entry.rateLimit.callTimestamps.filter(\r\n (ts) => ts > windowStart,\r\n );\r\n\r\n if (entry.rateLimit.callTimestamps.length >= entry.rateLimit.maxCallsPerMinute) {\r\n throw new ServerConnectionError(\r\n serverName,\r\n `Rate limit exceeded: ${entry.rateLimit.maxCallsPerMinute} calls/minute`,\r\n );\r\n }\r\n }\r\n\r\n private getMaxCallsPerMinute(serverName: string): number {\r\n const perServer = this.options.rateLimits?.[serverName];\r\n if (perServer) {\r\n return perServer.maxCallsPerMinute;\r\n }\r\n return this.options.defaultRateLimit?.maxCallsPerMinute ?? DEFAULT_MAX_CALLS_PER_MINUTE;\r\n }\r\n\r\n // ── Helpers ───────────────────────────────────────────────────────\r\n\r\n private requireServer(name: string): IServerEntry {\r\n const entry = this.servers.get(name);\r\n if (!entry || entry.status !== \"connected\") {\r\n throw new ServerConnectionError(name, \"Server not connected\");\r\n }\r\n return entry;\r\n }\r\n}\r\n"]}
@@ -1,12 +1,46 @@
1
- import { SUPPORTED_MODELS } from './chunk-HCIHOHLX.js';
2
- import { logger } from './chunk-JAXXTYID.js';
1
+ import { SUPPORTED_MODELS } from './chunk-62HSGYQD.js';
2
+ import { logger } from './chunk-HEKFAKVH.js';
3
3
 
4
4
  // src/providers/ollama-adapter.ts
5
5
  var PROVIDER_NAME = "ollama";
6
6
  var DEFAULT_BASE_URL = "http://localhost:11434";
7
7
  var CHARS_PER_TOKEN_ESTIMATE = 4;
8
8
  function convertMessages(messages) {
9
- return messages.map((msg) => ({ role: msg.role, content: msg.content }));
9
+ const converted = [];
10
+ for (const msg of messages) {
11
+ if (msg.role === "assistant" && msg.toolCalls !== void 0 && msg.toolCalls.length > 0) {
12
+ converted.push({
13
+ role: "assistant",
14
+ content: msg.content.length > 0 ? msg.content : null,
15
+ tool_calls: msg.toolCalls.map((toolCall) => ({
16
+ id: toolCall.id,
17
+ type: "function",
18
+ function: {
19
+ name: toolCall.name,
20
+ arguments: JSON.stringify(toolCall.arguments)
21
+ }
22
+ }))
23
+ });
24
+ continue;
25
+ }
26
+ if (msg.role === "tool") {
27
+ const toolCall = msg.toolCalls?.[0];
28
+ if (toolCall !== void 0) {
29
+ converted.push({
30
+ role: "tool",
31
+ content: msg.content,
32
+ tool_call_id: toolCall.id,
33
+ name: toolCall.name
34
+ });
35
+ continue;
36
+ }
37
+ }
38
+ converted.push({
39
+ role: msg.role,
40
+ content: msg.content
41
+ });
42
+ }
43
+ return converted;
10
44
  }
11
45
  function convertTools(tools) {
12
46
  if (tools === void 0 || tools.length === 0) {
@@ -47,6 +81,7 @@ function makeOllamaModelInfo(modelName) {
47
81
  }
48
82
  var OllamaAdapter = class {
49
83
  name = PROVIDER_NAME;
84
+ supportsToolCalling = true;
50
85
  baseUrl;
51
86
  cachedModels;
52
87
  constructor(options) {
@@ -188,8 +223,8 @@ var OllamaAdapter = class {
188
223
  yield { type: "done" };
189
224
  }
190
225
  }
191
- async countTokens(text, _model) {
192
- return Math.ceil(text.length / CHARS_PER_TOKEN_ESTIMATE);
226
+ countTokens(text, _model) {
227
+ return Promise.resolve(Math.ceil(text.length / CHARS_PER_TOKEN_ESTIMATE));
193
228
  }
194
229
  getModelInfo(model) {
195
230
  const staticInfo = SUPPORTED_MODELS[model];
@@ -301,5 +336,5 @@ function mapFinishReason(reason) {
301
336
  }
302
337
 
303
338
  export { OllamaAdapter };
304
- //# sourceMappingURL=chunk-H66O5Z2V.js.map
305
- //# sourceMappingURL=chunk-H66O5Z2V.js.map
339
+ //# sourceMappingURL=chunk-2NWNIKBK.js.map
340
+ //# sourceMappingURL=chunk-2NWNIKBK.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/providers/ollama-adapter.ts"],"names":[],"mappings":"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","file":"chunk-2NWNIKBK.js","sourcesContent":["/**\r\n * Ollama adapter — custom HTTP for local models per PRD section 7.1\r\n * Uses OpenAI-compatible API format at localhost:11434.\r\n * Dynamic model listing from Ollama API.\r\n */\r\n\r\nimport { logger } from \"../utils/logger.js\";\r\nimport { SUPPORTED_MODELS } from \"../types/model.js\";\r\nimport type { IModelInfo, ProviderName, ModelRole } from \"../types/model.js\";\r\nimport type {\r\n IChatRequest,\r\n IChatResponse,\r\n IChatMessage,\r\n IStreamChunk,\r\n IToolCall,\r\n IToolDefinition,\r\n ITokenUsage,\r\n} from \"../types/message.js\";\r\nimport type { IModelProvider, IProviderOptions } from \"./types.js\";\r\n\r\nconst PROVIDER_NAME: ProviderName = \"ollama\";\r\nconst DEFAULT_BASE_URL = \"http://localhost:11434\";\r\nconst CHARS_PER_TOKEN_ESTIMATE = 4;\r\n\r\ninterface OllamaListResponse { models: Array<{ name: string; size: number }> }\r\ninterface OpenAIStandardMessage {\r\n role: \"system\" | \"user\" | \"assistant\";\r\n content: string | null;\r\n tool_calls?: readonly OllamaToolCallRef[] | undefined;\r\n}\r\ninterface OpenAIToolResultMessage {\r\n role: \"tool\";\r\n content: string;\r\n tool_call_id: string;\r\n name: string;\r\n}\r\ntype OpenAIMessage = OpenAIStandardMessage | OpenAIToolResultMessage;\r\ninterface OpenAITool { type: \"function\"; function: { name: string; description: string; parameters: Record<string, unknown> } }\r\ninterface OllamaToolCallRef { id: string; type: string; function: { name: string; arguments: string } }\r\ninterface OllamaChoice {\r\n index: number;\r\n message: { role: string; content: string | null; tool_calls?: readonly OllamaToolCallRef[] };\r\n finish_reason: string;\r\n}\r\ninterface OllamaUsage { prompt_tokens: number; completion_tokens: number; total_tokens: number }\r\ninterface OllamaChatResponse { id: string; choices: OllamaChoice[]; usage?: OllamaUsage }\r\n\r\nfunction convertMessages(messages: readonly IChatMessage[]): OpenAIMessage[] {\r\n const converted: OpenAIMessage[] = [];\r\n\r\n for (const msg of messages) {\r\n if (msg.role === \"assistant\" && msg.toolCalls !== undefined && msg.toolCalls.length > 0) {\r\n converted.push({\r\n role: \"assistant\" as const,\r\n content: msg.content.length > 0 ? msg.content : null,\r\n tool_calls: msg.toolCalls.map((toolCall) => ({\r\n id: toolCall.id,\r\n type: \"function\",\r\n function: {\r\n name: toolCall.name,\r\n arguments: JSON.stringify(toolCall.arguments),\r\n },\r\n })),\r\n });\r\n continue;\r\n }\r\n\r\n if (msg.role === \"tool\") {\r\n const toolCall = msg.toolCalls?.[0];\r\n if (toolCall !== undefined) {\r\n converted.push({\r\n role: \"tool\" as const,\r\n content: msg.content,\r\n tool_call_id: toolCall.id,\r\n name: toolCall.name,\r\n });\r\n continue;\r\n }\r\n }\r\n\r\n converted.push({\r\n role: msg.role as \"system\" | \"user\" | \"assistant\",\r\n content: msg.content,\r\n });\r\n }\r\n\r\n return converted;\r\n}\r\n\r\nfunction convertTools(tools: readonly IToolDefinition[] | undefined): OpenAITool[] | undefined {\r\n if (tools === undefined || tools.length === 0) {\r\n return undefined;\r\n }\r\n return tools.map((tool) => {\r\n const properties: Record<string, unknown> = {};\r\n const required: string[] = [];\r\n for (const param of tool.parameters) {\r\n properties[param.name] = { type: param.type, description: param.description };\r\n if (param.required) {\r\n required.push(param.name);\r\n }\r\n }\r\n return {\r\n type: \"function\" as const,\r\n function: {\r\n name: tool.name,\r\n description: tool.description,\r\n parameters: { type: \"object\", properties, required },\r\n },\r\n };\r\n });\r\n}\r\n\r\nfunction makeOllamaModelInfo(modelName: string): IModelInfo {\r\n return {\r\n id: modelName,\r\n name: modelName,\r\n provider: PROVIDER_NAME,\r\n contextWindow: 128_000,\r\n maxOutputTokens: 8_192,\r\n inputPricePerMToken: 0,\r\n outputPricePerMToken: 0,\r\n supportsStreaming: true,\r\n supportsToolCalling: true,\r\n supportedRoles: [\"coding\", \"bugfix\", \"testing\", \"documentation\"] as readonly ModelRole[],\r\n };\r\n}\r\n\r\nexport class OllamaAdapter implements IModelProvider {\r\n readonly name = PROVIDER_NAME;\r\n readonly supportsToolCalling = true;\r\n\r\n private readonly baseUrl: string;\r\n private cachedModels: string[] | undefined;\r\n\r\n constructor(options?: IProviderOptions) {\r\n this.baseUrl = options?.baseUrl ?? DEFAULT_BASE_URL;\r\n }\r\n\r\n get supportedModels(): readonly string[] {\r\n return this.cachedModels ?? [];\r\n }\r\n\r\n /**\r\n * Refresh available models from Ollama API.\r\n * Call once during initialization.\r\n */\r\n async refreshModels(): Promise<readonly string[]> {\r\n try {\r\n const response = await fetch(`${this.baseUrl}/api/tags`);\r\n if (!response.ok) {\r\n logger.warn({ status: response.status }, \"Failed to list Ollama models\");\r\n this.cachedModels = [];\r\n return [];\r\n }\r\n const data = (await response.json()) as OllamaListResponse;\r\n this.cachedModels = data.models.map((m) => m.name);\r\n logger.debug({ models: this.cachedModels }, \"Ollama models discovered\");\r\n return this.cachedModels;\r\n } catch (error: unknown) {\r\n const errMsg = error instanceof Error ? error.message : String(error);\r\n logger.warn({ error: errMsg }, \"Ollama not reachable\");\r\n this.cachedModels = [];\r\n return [];\r\n }\r\n }\r\n\r\n async chat(request: IChatRequest): Promise<IChatResponse> {\r\n this.getModelInfo(request.model);\r\n const messages = convertMessages(request.messages);\r\n const tools = convertTools(request.tools);\r\n\r\n if (request.system !== undefined) {\r\n messages.unshift({ role: \"system\", content: request.system });\r\n }\r\n\r\n const body: Record<string, unknown> = {\r\n model: request.model,\r\n messages,\r\n stream: false,\r\n };\r\n if (request.maxTokens !== undefined) {\r\n body[\"max_tokens\"] = request.maxTokens;\r\n }\r\n if (request.temperature !== undefined) {\r\n body[\"temperature\"] = request.temperature;\r\n }\r\n if (tools !== undefined) {\r\n body[\"tools\"] = tools;\r\n }\r\n\r\n const response = await fetch(`${this.baseUrl}/v1/chat/completions`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify(body),\r\n });\r\n\r\n if (!response.ok) {\r\n const text = await response.text();\r\n throw new Error(`Ollama API error (${response.status}): ${text}`);\r\n }\r\n\r\n const data = (await response.json()) as OllamaChatResponse;\r\n const choice = data.choices[0];\r\n if (choice === undefined) {\r\n throw new Error(\"Ollama API returned empty choices\");\r\n }\r\n\r\n const toolCalls = extractToolCalls(choice);\r\n const inputTokens = data.usage?.prompt_tokens ?? 0;\r\n const outputTokens = data.usage?.completion_tokens ?? 0;\r\n\r\n const usage: ITokenUsage = {\r\n inputTokens,\r\n outputTokens,\r\n totalTokens: inputTokens + outputTokens,\r\n costUsd: 0,\r\n };\r\n\r\n const responseMessage: IChatMessage = {\r\n id: data.id,\r\n role: \"assistant\",\r\n content: choice.message.content ?? \"\",\r\n model: request.model,\r\n provider: PROVIDER_NAME,\r\n toolCalls: toolCalls.length > 0 ? toolCalls : undefined,\r\n tokenUsage: usage,\r\n createdAt: new Date(),\r\n };\r\n\r\n return {\r\n id: data.id,\r\n model: request.model,\r\n provider: PROVIDER_NAME,\r\n message: responseMessage,\r\n usage,\r\n finishReason: mapFinishReason(choice.finish_reason),\r\n };\r\n }\r\n\r\n async *stream(request: IChatRequest): AsyncIterable<IStreamChunk> {\r\n const modelInfo = this.getModelInfo(request.model);\r\n const messages = convertMessages(request.messages);\r\n const tools = convertTools(request.tools);\r\n\r\n if (request.system !== undefined) {\r\n messages.unshift({ role: \"system\", content: request.system });\r\n }\r\n\r\n const body: Record<string, unknown> = {\r\n model: request.model,\r\n messages,\r\n stream: true,\r\n };\r\n if (request.maxTokens !== undefined) {\r\n body[\"max_tokens\"] = request.maxTokens;\r\n }\r\n if (request.temperature !== undefined) {\r\n body[\"temperature\"] = request.temperature;\r\n }\r\n if (tools !== undefined) {\r\n body[\"tools\"] = tools;\r\n }\r\n\r\n const response = await fetch(`${this.baseUrl}/v1/chat/completions`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify(body),\r\n });\r\n\r\n if (!response.ok) {\r\n const text = await response.text();\r\n yield { type: \"error\", error: `Ollama API error (${response.status}): ${text}` };\r\n yield { type: \"done\" };\r\n return;\r\n }\r\n\r\n if (response.body === null) {\r\n yield { type: \"error\", error: \"Ollama returned empty stream body\" };\r\n yield { type: \"done\" };\r\n return;\r\n }\r\n\r\n try {\r\n yield* this.parseSSEStream(response.body, modelInfo);\r\n yield { type: \"done\" };\r\n } catch (error: unknown) {\r\n const errMsg = error instanceof Error ? error.message : String(error);\r\n logger.error({ error: errMsg, model: request.model }, \"Ollama stream error\");\r\n yield { type: \"error\", error: errMsg };\r\n yield { type: \"done\" };\r\n }\r\n }\r\n\r\n countTokens(text: string, _model: string): Promise<number> {\r\n return Promise.resolve(Math.ceil(text.length / CHARS_PER_TOKEN_ESTIMATE));\r\n }\r\n\r\n getModelInfo(model: string): IModelInfo {\r\n const staticInfo = SUPPORTED_MODELS[model];\r\n if (staticInfo !== undefined && staticInfo.provider === PROVIDER_NAME) {\r\n return staticInfo;\r\n }\r\n if (this.cachedModels !== undefined && this.cachedModels.includes(model)) {\r\n return makeOllamaModelInfo(model);\r\n }\r\n return makeOllamaModelInfo(model);\r\n }\r\n\r\n async listAvailableModels(): Promise<readonly string[]> {\r\n const models = await this.refreshModels();\r\n return models;\r\n }\r\n\r\n private async *parseSSEStream(\r\n body: ReadableStream<Uint8Array>,\r\n _modelInfo: IModelInfo,\r\n ): AsyncIterable<IStreamChunk> {\r\n const reader = body.getReader();\r\n const decoder = new TextDecoder();\r\n let buffer = \"\";\r\n\r\n try {\r\n for (;;) {\r\n const { done, value } = await reader.read();\r\n if (done) {\r\n break;\r\n }\r\n\r\n buffer += decoder.decode(value, { stream: true });\r\n const lines = buffer.split(\"\\n\");\r\n buffer = lines.pop() ?? \"\";\r\n\r\n for (const line of lines) {\r\n const trimmed = line.trim();\r\n if (trimmed === \"\" || trimmed === \"data: [DONE]\") {\r\n continue;\r\n }\r\n if (!trimmed.startsWith(\"data: \")) {\r\n continue;\r\n }\r\n\r\n const jsonStr = trimmed.slice(6);\r\n let parsed: {\r\n choices?: Array<{\r\n delta?: {\r\n content?: string;\r\n tool_calls?: Array<{\r\n id?: string;\r\n function?: { name?: string; arguments?: string };\r\n }>;\r\n };\r\n }>;\r\n usage?: OllamaUsage;\r\n };\r\n\r\n try {\r\n parsed = JSON.parse(jsonStr) as typeof parsed;\r\n } catch {\r\n continue;\r\n }\r\n\r\n const delta = parsed.choices?.[0]?.delta;\r\n if (delta?.content !== undefined && delta.content !== \"\") {\r\n yield { type: \"text\", content: delta.content };\r\n }\r\n\r\n if (delta?.tool_calls !== undefined) {\r\n for (const tc of delta.tool_calls) {\r\n if (tc.id !== undefined && tc.function?.name !== undefined) {\r\n let args: Record<string, unknown> = {};\r\n if (tc.function.arguments !== undefined) {\r\n try {\r\n args = JSON.parse(tc.function.arguments) as Record<string, unknown>;\r\n } catch {\r\n args = {};\r\n }\r\n }\r\n yield {\r\n type: \"tool_call\",\r\n toolCall: { id: tc.id, name: tc.function.name, arguments: args },\r\n };\r\n }\r\n }\r\n }\r\n\r\n if (parsed.usage !== undefined) {\r\n yield {\r\n type: \"usage\",\r\n usage: {\r\n inputTokens: parsed.usage.prompt_tokens,\r\n outputTokens: parsed.usage.completion_tokens,\r\n totalTokens: parsed.usage.total_tokens,\r\n costUsd: 0,\r\n },\r\n };\r\n }\r\n }\r\n }\r\n } finally {\r\n reader.releaseLock();\r\n }\r\n }\r\n}\r\n\r\nfunction extractToolCalls(choice: OllamaChoice): IToolCall[] {\r\n if (choice.message.tool_calls === undefined || choice.message.tool_calls.length === 0) {\r\n return [];\r\n }\r\n return choice.message.tool_calls.map((tc) => {\r\n let args: Record<string, unknown> = {};\r\n try {\r\n args = JSON.parse(tc.function.arguments) as Record<string, unknown>;\r\n } catch {\r\n args = {};\r\n }\r\n return { id: tc.id, name: tc.function.name, arguments: args };\r\n });\r\n}\r\n\r\nfunction mapFinishReason(\r\n reason: string,\r\n): \"stop\" | \"tool_calls\" | \"max_tokens\" | \"error\" {\r\n switch (reason) {\r\n case \"stop\":\r\n return \"stop\";\r\n case \"tool_calls\":\r\n return \"tool_calls\";\r\n case \"length\":\r\n return \"max_tokens\";\r\n default:\r\n return \"stop\";\r\n }\r\n}\r\n"]}
@@ -0,0 +1,26 @@
1
+ import { CLI_PROVIDER_ORDER, getCliProviderEntry } from './chunk-RP2TAL3J.js';
2
+ import { spawnSync } from 'child_process';
3
+
4
+ function detectInstalledProviders() {
5
+ const available = [];
6
+ for (const provider of CLI_PROVIDER_ORDER) {
7
+ try {
8
+ const entry = getCliProviderEntry(provider);
9
+ const args = ["--version"];
10
+ const result = spawnSync(entry.binary, args, {
11
+ stdio: "ignore",
12
+ timeout: 5e3,
13
+ shell: process.platform === "win32"
14
+ });
15
+ if (result.status === 0) {
16
+ available.push(provider);
17
+ }
18
+ } catch {
19
+ }
20
+ }
21
+ return available;
22
+ }
23
+
24
+ export { detectInstalledProviders };
25
+ //# sourceMappingURL=chunk-3TSPZRGM.js.map
26
+ //# sourceMappingURL=chunk-3TSPZRGM.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-3TSPZRGM.js","sourcesContent":["/**\r\n * Cross-platform CLI provider detection utility.\r\n *\r\n * Probes the system PATH for known AI CLI tools by running\r\n * `<tool> --version` with a 5-second timeout. Returns a list\r\n * of provider types that are available on the current machine.\r\n *\r\n * @see IMPLEMENT_PLAN.md Section 10\r\n */\r\n\r\nimport { spawnSync } from \"node:child_process\";\r\nimport type { CliProviderType } from \"../constants.js\";\r\nimport { CLI_PROVIDER_ORDER, getCliProviderEntry } from \"./provider-catalog.js\";\r\n\r\n/**\r\n * Detect which CLI AI providers are installed on the system.\r\n *\r\n * Each provider is checked by running its version command. Only\r\n * providers that exit with status 0 are included in the result.\r\n *\r\n * @returns Array of installed CLI provider types.\r\n */\r\nexport function detectInstalledProviders(): CliProviderType[] {\r\n const available: CliProviderType[] = [];\r\n\r\n for (const provider of CLI_PROVIDER_ORDER) {\r\n try {\r\n const entry = getCliProviderEntry(provider);\r\n const args = [\"--version\"];\r\n const result = spawnSync(entry.binary, args, {\r\n stdio: \"ignore\",\r\n timeout: 5000,\r\n shell: process.platform === \"win32\",\r\n });\r\n if (result.status === 0) {\r\n available.push(provider);\r\n }\r\n } catch {\r\n // Not installed — skip\r\n }\r\n }\r\n\r\n return available;\r\n}\r\n"]}
@@ -118,5 +118,5 @@ var ToolCallError = class extends AemeathError {
118
118
  };
119
119
 
120
120
  export { AemeathError, AgentSpawnError, AuthenticationError, ContextOverflowError, ExecutionTimeoutError, FileNotFoundError, IPCError, InvalidConfigError, MissingConfigError, ModelNotFoundError, PermissionDeniedError, RateLimitError, ServerConnectionError, ToolCallError };
121
- //# sourceMappingURL=chunk-ZGOHARPV.js.map
122
- //# sourceMappingURL=chunk-ZGOHARPV.js.map
121
+ //# sourceMappingURL=chunk-473JN6M5.js.map
122
+ //# sourceMappingURL=chunk-473JN6M5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/types/errors.ts"],"names":[],"mappings":"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","file":"chunk-473JN6M5.js","sourcesContent":["/**\r\n * AemeathCLI Typed Error Hierarchy\r\n * Per PRD section 15.5: Every error includes code, user message, diagnostic, recovery action\r\n */\r\n\r\nexport interface IErrorContext {\r\n readonly code: string;\r\n readonly userMessage: string;\r\n readonly diagnosticMessage?: string | undefined;\r\n readonly suggestedRecovery?: string | undefined;\r\n}\r\n\r\nexport abstract class AemeathError extends Error {\r\n abstract readonly code: string;\r\n abstract readonly userMessage: string;\r\n diagnosticMessage?: string | undefined;\r\n suggestedRecovery?: string | undefined;\r\n\r\n constructor(message: string, context?: Partial<IErrorContext>) {\r\n super(message);\r\n this.name = this.constructor.name;\r\n this.diagnosticMessage = context?.diagnosticMessage;\r\n this.suggestedRecovery = context?.suggestedRecovery;\r\n }\r\n}\r\n\r\n// ── Provider Errors ──────────────────────────────────────────────────────\r\n\r\nexport class AuthenticationError extends AemeathError {\r\n readonly code = \"AEMEATH_PROVIDER_AUTH_001\" as const;\r\n readonly userMessage: string;\r\n\r\n constructor(provider: string, message?: string) {\r\n super(message ?? `Authentication failed for provider: ${provider}`);\r\n this.userMessage = `Authentication failed for ${provider}. Please re-login with: aemeathcli auth login ${provider}`;\r\n }\r\n}\r\n\r\nexport class RateLimitError extends AemeathError {\r\n readonly code = \"AEMEATH_PROVIDER_RATE_001\" as const;\r\n readonly userMessage: string;\r\n readonly retryAfterMs: number;\r\n\r\n constructor(provider: string, retryAfterMs: number) {\r\n super(`Rate limited by ${provider}`);\r\n this.retryAfterMs = retryAfterMs;\r\n this.userMessage = `Rate limited by ${provider}. Retry in ${Math.ceil(retryAfterMs / 1000)}s.`;\r\n this.suggestedRecovery = \"Wait and retry, or switch to a different provider.\";\r\n }\r\n}\r\n\r\nexport class ContextOverflowError extends AemeathError {\r\n readonly code = \"AEMEATH_PROVIDER_CTX_001\" as const;\r\n readonly userMessage: string;\r\n\r\n constructor(model: string, maxTokens: number, currentTokens: number) {\r\n super(`Context overflow for ${model}: ${currentTokens}/${maxTokens}`);\r\n this.userMessage = `Context window exceeded for ${model}. Use /compact to compress context.`;\r\n }\r\n}\r\n\r\nexport class ModelNotFoundError extends AemeathError {\r\n readonly code = \"AEMEATH_PROVIDER_MODEL_001\" as const;\r\n readonly userMessage: string;\r\n\r\n constructor(model: string) {\r\n super(`Model not found: ${model}`);\r\n this.userMessage = `Model \"${model}\" not found. Use /model list to see available models.`;\r\n }\r\n}\r\n\r\n// ── Config Errors ────────────────────────────────────────────────────────\r\n\r\nexport class MissingConfigError extends AemeathError {\r\n readonly code = \"AEMEATH_CONFIG_MISS_001\" as const;\r\n readonly userMessage: string;\r\n\r\n constructor(key: string) {\r\n super(`Missing configuration: ${key}`);\r\n this.userMessage = `Missing configuration \"${key}\". Run aemeathcli config to set up.`;\r\n }\r\n}\r\n\r\nexport class InvalidConfigError extends AemeathError {\r\n readonly code = \"AEMEATH_CONFIG_INVALID_001\" as const;\r\n readonly userMessage: string;\r\n\r\n constructor(key: string, reason: string) {\r\n super(`Invalid configuration for ${key}: ${reason}`);\r\n this.userMessage = `Invalid configuration \"${key}\": ${reason}`;\r\n }\r\n}\r\n\r\n// ── Tool Errors ──────────────────────────────────────────────────────────\r\n\r\nexport class FileNotFoundError extends AemeathError {\r\n readonly code = \"AEMEATH_TOOL_FILE_001\" as const;\r\n readonly userMessage: string;\r\n\r\n constructor(filePath: string) {\r\n super(`File not found: ${filePath}`);\r\n this.userMessage = `File not found: ${filePath}`;\r\n }\r\n}\r\n\r\nexport class PermissionDeniedError extends AemeathError {\r\n readonly code = \"AEMEATH_TOOL_PERM_001\" as const;\r\n readonly userMessage: string;\r\n\r\n constructor(operation: string, resource: string) {\r\n super(`Permission denied: ${operation} on ${resource}`);\r\n this.userMessage = `Permission denied for ${operation} on ${resource}. Check your permission mode.`;\r\n }\r\n}\r\n\r\nexport class ExecutionTimeoutError extends AemeathError {\r\n readonly code = \"AEMEATH_TOOL_TIMEOUT_001\" as const;\r\n readonly userMessage: string;\r\n\r\n constructor(command: string, timeoutMs: number) {\r\n super(`Execution timeout: ${command} after ${timeoutMs}ms`);\r\n this.userMessage = `Command timed out after ${Math.ceil(timeoutMs / 1000)}s.`;\r\n }\r\n}\r\n\r\n// ── Team Errors ──────────────────────────────────────────────────────────\r\n\r\nexport class AgentSpawnError extends AemeathError {\r\n readonly code = \"AEMEATH_TEAM_SPAWN_001\" as const;\r\n readonly userMessage: string;\r\n\r\n constructor(agentName: string, reason: string) {\r\n super(`Failed to spawn agent ${agentName}: ${reason}`);\r\n this.userMessage = `Failed to start agent \"${agentName}\": ${reason}`;\r\n }\r\n}\r\n\r\nexport class IPCError extends AemeathError {\r\n readonly code = \"AEMEATH_TEAM_IPC_001\" as const;\r\n readonly userMessage: string;\r\n\r\n constructor(message: string) {\r\n super(`IPC error: ${message}`);\r\n this.userMessage = `Inter-agent communication error: ${message}`;\r\n }\r\n}\r\n\r\n// ── MCP Errors ───────────────────────────────────────────────────────────\r\n\r\nexport class ServerConnectionError extends AemeathError {\r\n readonly code = \"AEMEATH_MCP_CONN_001\" as const;\r\n readonly userMessage: string;\r\n\r\n constructor(serverName: string, reason: string) {\r\n super(`MCP server connection failed: ${serverName} - ${reason}`);\r\n this.userMessage = `Cannot connect to MCP server \"${serverName}\": ${reason}`;\r\n }\r\n}\r\n\r\nexport class ToolCallError extends AemeathError {\r\n readonly code = \"AEMEATH_MCP_TOOL_001\" as const;\r\n readonly userMessage: string;\r\n\r\n constructor(toolName: string, reason: string) {\r\n super(`MCP tool call failed: ${toolName} - ${reason}`);\r\n this.userMessage = `Tool \"${toolName}\" failed: ${reason}`;\r\n }\r\n}\r\n\r\n// ── Discriminated Error Union ────────────────────────────────────────────\r\n\r\nexport type ProviderError =\r\n | AuthenticationError\r\n | RateLimitError\r\n | ContextOverflowError\r\n | ModelNotFoundError;\r\n\r\nexport type ConfigError =\r\n | MissingConfigError\r\n | InvalidConfigError;\r\n\r\nexport type ToolError =\r\n | FileNotFoundError\r\n | PermissionDeniedError\r\n | ExecutionTimeoutError;\r\n\r\nexport type TeamError =\r\n | AgentSpawnError\r\n | IPCError;\r\n\r\nexport type MCPError =\r\n | ServerConnectionError\r\n | ToolCallError;\r\n\r\nexport type AnyAemeathError =\r\n | ProviderError\r\n | ConfigError\r\n | ToolError\r\n | TeamError\r\n | MCPError;\r\n"]}
@@ -1,6 +1,7 @@
1
- import { DEFAULT_CONFIG } from './chunk-CYQNBB25.js';
2
- import { getConfigPath, getProjectConfigPath, ensureDirectory } from './chunk-NBR3GHMT.js';
3
- import { logger } from './chunk-JAXXTYID.js';
1
+ import { CLI_PROVIDERS } from './chunk-CC7MGWYY.js';
2
+ import { DEFAULT_CONFIG } from './chunk-2GKOK6T7.js';
3
+ import { logger } from './chunk-HEKFAKVH.js';
4
+ import { getConfigPath, getProjectConfigPath, ensureDirectory } from './chunk-BY4DAKUU.js';
4
5
  import { existsSync, readFileSync, writeFileSync, unwatchFile, watchFile } from 'fs';
5
6
  import { dirname } from 'path';
6
7
  import { z } from 'zod';
@@ -8,44 +9,51 @@ import { z } from 'zod';
8
9
  var ProviderConfigSchema = z.object({
9
10
  enabled: z.boolean(),
10
11
  baseUrl: z.string().optional()
11
- });
12
+ }).strict();
12
13
  var PermissionConfigSchema = z.object({
13
14
  mode: z.enum(["strict", "standard", "permissive"]),
14
15
  allowedPaths: z.array(z.string()),
15
16
  blockedCommands: z.array(z.string())
16
- });
17
+ }).strict();
17
18
  var SplitPanelConfigSchema = z.object({
18
19
  enabled: z.boolean(),
19
20
  backend: z.enum(["tmux", "iterm2"]),
20
- defaultLayout: z.enum(["auto", "horizontal", "vertical", "grid"]),
21
+ defaultLayout: z.enum(["auto", "horizontal", "vertical", "grid", "hub-spoke"]),
21
22
  maxPanes: z.number().int().min(1).max(16)
22
- });
23
+ }).strict();
24
+ var CLI_PROVIDER_ENUM_VALUES = [...CLI_PROVIDERS];
25
+ var SwarmConfigSchema = z.object({
26
+ onboardingComplete: z.boolean(),
27
+ detectedProviders: z.array(z.enum(CLI_PROVIDER_ENUM_VALUES)),
28
+ primaryMasterProvider: z.enum(CLI_PROVIDER_ENUM_VALUES).optional(),
29
+ fallbackMasterProviders: z.array(z.enum(CLI_PROVIDER_ENUM_VALUES))
30
+ }).strict();
23
31
  var CostConfigSchema = z.object({
24
32
  budgetWarning: z.number().nonnegative(),
25
33
  budgetHardStop: z.number().nonnegative(),
26
34
  currency: z.string()
27
- });
35
+ }).strict();
28
36
  var TelemetryConfigSchema = z.object({
29
37
  enabled: z.boolean(),
30
38
  anonymized: z.boolean()
31
- });
39
+ }).strict();
32
40
  var RoleConfigSchema = z.object({
33
41
  primary: z.string(),
34
42
  fallback: z.array(z.string())
35
- });
43
+ }).strict();
36
44
  var OAuthProviderConfigSchema = z.object({
37
45
  clientId: z.string(),
38
46
  clientSecret: z.string().optional(),
39
47
  authorizeUrl: z.string().optional(),
40
48
  tokenUrl: z.string().optional(),
41
49
  scope: z.string().optional()
42
- });
50
+ }).strict();
43
51
  var OAuthConfigSchema = z.object({
44
52
  anthropic: OAuthProviderConfigSchema.optional(),
45
53
  openai: OAuthProviderConfigSchema.optional(),
46
54
  google: OAuthProviderConfigSchema.optional(),
47
55
  kimi: OAuthProviderConfigSchema.optional()
48
- });
56
+ }).strict();
49
57
  var GlobalConfigSchema = z.object({
50
58
  version: z.string(),
51
59
  defaultModel: z.string(),
@@ -53,10 +61,14 @@ var GlobalConfigSchema = z.object({
53
61
  providers: z.record(z.string(), ProviderConfigSchema).optional(),
54
62
  permissions: PermissionConfigSchema.optional(),
55
63
  splitPanel: SplitPanelConfigSchema.optional(),
64
+ swarm: SwarmConfigSchema.optional(),
56
65
  cost: CostConfigSchema.optional(),
57
66
  telemetry: TelemetryConfigSchema.optional(),
58
67
  oauth: OAuthConfigSchema.optional()
59
- });
68
+ }).strict();
69
+ function formatValidationError(error) {
70
+ return error.issues.map((issue) => `${issue.path.join(".") || "<root>"}: ${issue.message}`).join("; ");
71
+ }
60
72
  var ConfigStore = class {
61
73
  globalConfig = DEFAULT_CONFIG;
62
74
  projectConfig;
@@ -77,8 +89,17 @@ var ConfigStore = class {
77
89
  this.rebuildMergedConfig();
78
90
  return this.mergedConfig;
79
91
  }
80
- const raw = readFileSync(resolvedPath, "utf-8");
81
- const parsed = JSON.parse(raw);
92
+ let parsed;
93
+ try {
94
+ const raw = readFileSync(resolvedPath, "utf-8");
95
+ parsed = JSON.parse(raw);
96
+ } catch (error) {
97
+ const message = error instanceof Error ? error.message : String(error);
98
+ logger.warn({ error: message, path: resolvedPath }, "Global config parse failed, using defaults");
99
+ this.globalConfig = DEFAULT_CONFIG;
100
+ this.rebuildMergedConfig();
101
+ return this.mergedConfig;
102
+ }
82
103
  const validated = GlobalConfigSchema.safeParse(parsed);
83
104
  if (!validated.success) {
84
105
  logger.warn(
@@ -105,8 +126,17 @@ var ConfigStore = class {
105
126
  this.rebuildMergedConfig();
106
127
  return this.mergedConfig;
107
128
  }
108
- const raw = readFileSync(resolvedPath, "utf-8");
109
- const parsed = JSON.parse(raw);
129
+ let parsed;
130
+ try {
131
+ const raw = readFileSync(resolvedPath, "utf-8");
132
+ parsed = JSON.parse(raw);
133
+ } catch (error) {
134
+ const message = error instanceof Error ? error.message : String(error);
135
+ logger.warn({ error: message, path: resolvedPath }, "Project config parse failed, ignoring");
136
+ this.projectConfig = void 0;
137
+ this.rebuildMergedConfig();
138
+ return this.mergedConfig;
139
+ }
110
140
  const validated = GlobalConfigSchema.partial().safeParse(parsed);
111
141
  if (!validated.success) {
112
142
  logger.warn(
@@ -125,21 +155,29 @@ var ConfigStore = class {
125
155
  saveGlobal(config, configPath) {
126
156
  const resolvedPath = configPath ?? getConfigPath();
127
157
  const configToSave = config ?? this.globalConfig;
158
+ const validated = GlobalConfigSchema.safeParse(configToSave);
159
+ if (!validated.success) {
160
+ throw new Error(`Invalid global config: ${formatValidationError(validated.error)}`);
161
+ }
128
162
  ensureDirectory(dirname(resolvedPath));
129
- const json = JSON.stringify(configToSave, null, 2);
163
+ const json = JSON.stringify(validated.data, null, 2);
130
164
  writeFileSync(resolvedPath, json, { encoding: "utf-8", mode: 384 });
131
165
  logger.info({ path: resolvedPath }, "Global config saved");
132
166
  if (config) {
133
- this.globalConfig = config;
167
+ this.globalConfig = this.applyDefaults(validated.data);
134
168
  this.rebuildMergedConfig();
135
169
  }
136
170
  }
137
171
  saveProject(projectRoot, config) {
138
172
  const resolvedPath = getProjectConfigPath(projectRoot);
173
+ const validated = GlobalConfigSchema.partial().safeParse(config);
174
+ if (!validated.success) {
175
+ throw new Error(`Invalid project config: ${formatValidationError(validated.error)}`);
176
+ }
139
177
  ensureDirectory(dirname(resolvedPath));
140
- const json = JSON.stringify(config, null, 2);
178
+ const json = JSON.stringify(validated.data, null, 2);
141
179
  writeFileSync(resolvedPath, json, { encoding: "utf-8", mode: 384 });
142
- this.projectConfig = config;
180
+ this.projectConfig = validated.data;
143
181
  this.rebuildMergedConfig();
144
182
  logger.info({ path: resolvedPath }, "Project config saved");
145
183
  }
@@ -209,6 +247,10 @@ var ConfigStore = class {
209
247
  ...this.globalConfig.splitPanel,
210
248
  ...this.projectConfig.splitPanel ?? {}
211
249
  },
250
+ swarm: {
251
+ ...this.globalConfig.swarm,
252
+ ...this.projectConfig.swarm ?? {}
253
+ },
212
254
  cost: {
213
255
  ...this.globalConfig.cost,
214
256
  ...this.projectConfig.cost ?? {}
@@ -243,6 +285,7 @@ var ConfigStore = class {
243
285
  },
244
286
  permissions: partial.permissions ? partial.permissions : DEFAULT_CONFIG.permissions,
245
287
  splitPanel: partial.splitPanel ? partial.splitPanel : DEFAULT_CONFIG.splitPanel,
288
+ swarm: partial.swarm ? partial.swarm : DEFAULT_CONFIG.swarm,
246
289
  cost: partial.cost ? partial.cost : DEFAULT_CONFIG.cost,
247
290
  telemetry: partial.telemetry ? partial.telemetry : DEFAULT_CONFIG.telemetry,
248
291
  oauth: partial.oauth ? partial.oauth : void 0
@@ -251,5 +294,5 @@ var ConfigStore = class {
251
294
  };
252
295
 
253
296
  export { ConfigStore };
254
- //# sourceMappingURL=chunk-IYW62KKR.js.map
255
- //# sourceMappingURL=chunk-IYW62KKR.js.map
297
+ //# sourceMappingURL=chunk-5XFSV6PF.js.map
298
+ //# sourceMappingURL=chunk-5XFSV6PF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/storage/config-store.ts"],"names":[],"mappings":";;;;;;;;AAuBA,IAAM,oBAAA,GAAuB,EAAE,MAAA,CAAO;AAAA,EACpC,OAAA,EAAS,EAAE,OAAA,EAAQ;AAAA,EACnB,OAAA,EAAS,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AACtB,CAAC,EAAE,MAAA,EAAO;AAEV,IAAM,sBAAA,GAAyB,EAAE,MAAA,CAAO;AAAA,EACtC,MAAM,CAAA,CAAE,IAAA,CAAK,CAAC,QAAA,EAAU,UAAA,EAAY,YAAY,CAAC,CAAA;AAAA,EACjD,YAAA,EAAc,CAAA,CAAE,KAAA,CAAM,CAAA,CAAE,QAAQ,CAAA;AAAA,EAChC,eAAA,EAAiB,CAAA,CAAE,KAAA,CAAM,CAAA,CAAE,QAAQ;AACrC,CAAC,EAAE,MAAA,EAAO;AAEV,IAAM,sBAAA,GAAyB,EAAE,MAAA,CAAO;AAAA,EACtC,OAAA,EAAS,EAAE,OAAA,EAAQ;AAAA,EACnB,SAAS,CAAA,CAAE,IAAA,CAAK,CAAC,MAAA,EAAQ,QAAQ,CAAC,CAAA;AAAA,EAClC,aAAA,EAAe,EAAE,IAAA,CAAK,CAAC,QAAQ,YAAA,EAAc,UAAA,EAAY,MAAA,EAAQ,WAAW,CAAC,CAAA;AAAA,EAC7E,QAAA,EAAU,CAAA,CAAE,MAAA,EAAO,CAAE,GAAA,GAAM,GAAA,CAAI,CAAC,CAAA,CAAE,GAAA,CAAI,EAAE;AAC1C,CAAC,EAAE,MAAA,EAAO;AAEV,IAAM,wBAAA,GAA2B,CAAC,GAAG,aAAa,CAAA;AAKlD,IAAM,iBAAA,GAAoB,EAAE,MAAA,CAAO;AAAA,EACjC,kBAAA,EAAoB,EAAE,OAAA,EAAQ;AAAA,EAC9B,mBAAmB,CAAA,CAAE,KAAA,CAAM,CAAA,CAAE,IAAA,CAAK,wBAAwB,CAAC,CAAA;AAAA,EAC3D,qBAAA,EAAuB,CAAA,CAAE,IAAA,CAAK,wBAAwB,EAAE,QAAA,EAAS;AAAA,EACjE,yBAAyB,CAAA,CAAE,KAAA,CAAM,CAAA,CAAE,IAAA,CAAK,wBAAwB,CAAC;AACnE,CAAC,EAAE,MAAA,EAAO;AAEV,IAAM,gBAAA,GAAmB,EAAE,MAAA,CAAO;AAAA,EAChC,aAAA,EAAe,CAAA,CAAE,MAAA,EAAO,CAAE,WAAA,EAAY;AAAA,EACtC,cAAA,EAAgB,CAAA,CAAE,MAAA,EAAO,CAAE,WAAA,EAAY;AAAA,EACvC,QAAA,EAAU,EAAE,MAAA;AACd,CAAC,EAAE,MAAA,EAAO;AAEV,IAAM,qBAAA,GAAwB,EAAE,MAAA,CAAO;AAAA,EACrC,OAAA,EAAS,EAAE,OAAA,EAAQ;AAAA,EACnB,UAAA,EAAY,EAAE,OAAA;AAChB,CAAC,EAAE,MAAA,EAAO;AAEV,IAAM,gBAAA,GAAmB,EAAE,MAAA,CAAO;AAAA,EAChC,OAAA,EAAS,EAAE,MAAA,EAAO;AAAA,EAClB,QAAA,EAAU,CAAA,CAAE,KAAA,CAAM,CAAA,CAAE,QAAQ;AAC9B,CAAC,EAAE,MAAA,EAAO;AAEV,IAAM,yBAAA,GAA4B,EAAE,MAAA,CAAO;AAAA,EACzC,QAAA,EAAU,EAAE,MAAA,EAAO;AAAA,EACnB,YAAA,EAAc,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAClC,YAAA,EAAc,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAClC,QAAA,EAAU,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC9B,KAAA,EAAO,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AACpB,CAAC,EAAE,MAAA,EAAO;AAEV,IAAM,iBAAA,GAAoB,EAAE,MAAA,CAAO;AAAA,EACjC,SAAA,EAAW,0BAA0B,QAAA,EAAS;AAAA,EAC9C,MAAA,EAAQ,0BAA0B,QAAA,EAAS;AAAA,EAC3C,MAAA,EAAQ,0BAA0B,QAAA,EAAS;AAAA,EAC3C,IAAA,EAAM,0BAA0B,QAAA;AAClC,CAAC,EAAE,MAAA,EAAO;AAEV,IAAM,kBAAA,GAAqB,EAAE,MAAA,CAAO;AAAA,EAClC,OAAA,EAAS,EAAE,MAAA,EAAO;AAAA,EAClB,YAAA,EAAc,EAAE,MAAA,EAAO;AAAA,EACvB,KAAA,EAAO,EAAE,MAAA,CAAO,CAAA,CAAE,QAAO,EAAG,gBAAgB,EAAE,QAAA,EAAS;AAAA,EACvD,SAAA,EAAW,EAAE,MAAA,CAAO,CAAA,CAAE,QAAO,EAAG,oBAAoB,EAAE,QAAA,EAAS;AAAA,EAC/D,WAAA,EAAa,uBAAuB,QAAA,EAAS;AAAA,EAC7C,UAAA,EAAY,uBAAuB,QAAA,EAAS;AAAA,EAC5C,KAAA,EAAO,kBAAkB,QAAA,EAAS;AAAA,EAClC,IAAA,EAAM,iBAAiB,QAAA,EAAS;AAAA,EAChC,SAAA,EAAW,sBAAsB,QAAA,EAAS;AAAA,EAC1C,KAAA,EAAO,kBAAkB,QAAA;AAC3B,CAAC,EAAE,MAAA,EAAO;AAEV,SAAS,sBAAsB,KAAA,EAA2B;AACxD,EAAA,OAAO,MAAM,MAAA,CACV,GAAA,CAAI,CAAC,KAAA,KAAU,CAAA,EAAG,MAAM,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA,IAAK,QAAQ,CAAA,EAAA,EAAK,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA,CACtE,KAAK,IAAI,CAAA;AACd;AAIO,IAAM,cAAN,MAAkB;AAAA,EACf,YAAA,GAA8B,cAAA;AAAA,EAC9B,aAAA;AAAA,EACA,YAAA,GAA8B,cAAA;AAAA,EAC9B,WAAqD,EAAC;AAAA,EACtD,kBAA0C,EAAC;AAAA,EAEnD,IAAI,MAAA,GAAwB;AAC1B,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,EACd;AAAA,EAEA,WAAW,UAAA,EAAoC;AAC7C,IAAA,MAAM,YAAA,GAAe,cAAc,aAAA,EAAc;AAEjD,IAAA,IAAI,CAAC,UAAA,CAAW,YAAY,CAAA,EAAG;AAC7B,MAAA,MAAA,CAAO,IAAA;AAAA,QACL,EAAE,MAAM,YAAA,EAAa;AAAA,QACrB;AAAA,OACF;AACA,MAAA,IAAA,CAAK,YAAA,GAAe,cAAA;AACpB,MAAA,IAAA,CAAK,mBAAA,EAAoB;AACzB,MAAA,OAAO,IAAA,CAAK,YAAA;AAAA,IACd;AAEA,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,YAAA,CAAa,YAAA,EAAc,OAAO,CAAA;AAC9C,MAAA,MAAA,GAAS,IAAA,CAAK,MAAM,GAAG,CAAA;AAAA,IACzB,SAAS,KAAA,EAAgB;AACvB,MAAA,MAAM,UAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACrE,MAAA,MAAA,CAAO,KAAK,EAAE,KAAA,EAAO,SAAS,IAAA,EAAM,YAAA,IAAgB,4CAA4C,CAAA;AAChG,MAAA,IAAA,CAAK,YAAA,GAAe,cAAA;AACpB,MAAA,IAAA,CAAK,mBAAA,EAAoB;AACzB,MAAA,OAAO,IAAA,CAAK,YAAA;AAAA,IACd;AACA,IAAA,MAAM,SAAA,GAAY,kBAAA,CAAmB,SAAA,CAAU,MAAM,CAAA;AAErD,IAAA,IAAI,CAAC,UAAU,OAAA,EAAS;AACtB,MAAA,MAAA,CAAO,IAAA;AAAA,QACL,EAAE,MAAA,EAAQ,SAAA,CAAU,KAAA,CAAM,MAAA,EAAO;AAAA,QACjC;AAAA,OACF;AACA,MAAA,IAAA,CAAK,YAAA,GAAe,cAAA;AACpB,MAAA,IAAA,CAAK,mBAAA,EAAoB;AACzB,MAAA,OAAO,IAAA,CAAK,YAAA;AAAA,IACd;AAEA,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA,CAAK,aAAA,CAAc,SAAA,CAAU,IAAI,CAAA;AACrD,IAAA,IAAA,CAAK,mBAAA,EAAoB;AAEzB,IAAA,MAAA,CAAO,IAAA,CAAK,EAAE,IAAA,EAAM,YAAA,IAAgB,sBAAsB,CAAA;AAC1D,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,EACd;AAAA,EAEA,YAAY,WAAA,EAAoC;AAC9C,IAAA,MAAM,YAAA,GAAe,qBAAqB,WAAW,CAAA;AAErD,IAAA,IAAI,CAAC,UAAA,CAAW,YAAY,CAAA,EAAG;AAC7B,MAAA,MAAA,CAAO,KAAA;AAAA,QACL,EAAE,MAAM,YAAA,EAAa;AAAA,QACrB;AAAA,OACF;AACA,MAAA,IAAA,CAAK,aAAA,GAAgB,MAAA;AACrB,MAAA,IAAA,CAAK,mBAAA,EAAoB;AACzB,MAAA,OAAO,IAAA,CAAK,YAAA;AAAA,IACd;AAEA,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,YAAA,CAAa,YAAA,EAAc,OAAO,CAAA;AAC9C,MAAA,MAAA,GAAS,IAAA,CAAK,MAAM,GAAG,CAAA;AAAA,IACzB,SAAS,KAAA,EAAgB;AACvB,MAAA,MAAM,UAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACrE,MAAA,MAAA,CAAO,KAAK,EAAE,KAAA,EAAO,SAAS,IAAA,EAAM,YAAA,IAAgB,uCAAuC,CAAA;AAC3F,MAAA,IAAA,CAAK,aAAA,GAAgB,MAAA;AACrB,MAAA,IAAA,CAAK,mBAAA,EAAoB;AACzB,MAAA,OAAO,IAAA,CAAK,YAAA;AAAA,IACd;AACA,IAAA,MAAM,SAAA,GAAY,kBAAA,CAAmB,OAAA,EAAQ,CAAE,UAAU,MAAM,CAAA;AAE/D,IAAA,IAAI,CAAC,UAAU,OAAA,EAAS;AACtB,MAAA,MAAA,CAAO,IAAA;AAAA,QACL,EAAE,MAAA,EAAQ,SAAA,CAAU,KAAA,CAAM,MAAA,EAAO;AAAA,QACjC;AAAA,OACF;AACA,MAAA,IAAA,CAAK,aAAA,GAAgB,MAAA;AACrB,MAAA,IAAA,CAAK,mBAAA,EAAoB;AACzB,MAAA,OAAO,IAAA,CAAK,YAAA;AAAA,IACd;AAEA,IAAA,IAAA,CAAK,gBAAgB,SAAA,CAAU,IAAA;AAC/B,IAAA,IAAA,CAAK,mBAAA,EAAoB;AAEzB,IAAA,MAAA,CAAO,IAAA,CAAK,EAAE,IAAA,EAAM,YAAA,IAAgB,uBAAuB,CAAA;AAC3D,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,EACd;AAAA,EAEA,UAAA,CACE,QACA,UAAA,EACM;AACN,IAAA,MAAM,YAAA,GAAe,cAAc,aAAA,EAAc;AACjD,IAAA,MAAM,YAAA,GAAe,UAAU,IAAA,CAAK,YAAA;AACpC,IAAA,MAAM,SAAA,GAAY,kBAAA,CAAmB,SAAA,CAAU,YAAY,CAAA;AAE3D,IAAA,IAAI,CAAC,UAAU,OAAA,EAAS;AACtB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uBAAA,EAA0B,sBAAsB,SAAA,CAAU,KAAK,CAAC,CAAA,CAAE,CAAA;AAAA,IACpF;AAEA,IAAA,eAAA,CAAgB,OAAA,CAAQ,YAAY,CAAC,CAAA;AACrC,IAAA,MAAM,OAAO,IAAA,CAAK,SAAA,CAAU,SAAA,CAAU,IAAA,EAAM,MAAM,CAAC,CAAA;AACnD,IAAA,aAAA,CAAc,cAAc,IAAA,EAAM,EAAE,UAAU,OAAA,EAAS,IAAA,EAAM,KAAO,CAAA;AAEpE,IAAA,MAAA,CAAO,IAAA,CAAK,EAAE,IAAA,EAAM,YAAA,IAAgB,qBAAqB,CAAA;AAEzD,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,IAAA,CAAK,YAAA,GAAe,IAAA,CAAK,aAAA,CAAc,SAAA,CAAU,IAAI,CAAA;AACrD,MAAA,IAAA,CAAK,mBAAA,EAAoB;AAAA,IAC3B;AAAA,EACF;AAAA,EAEA,WAAA,CACE,aACA,MAAA,EACM;AACN,IAAA,MAAM,YAAA,GAAe,qBAAqB,WAAW,CAAA;AACrD,IAAA,MAAM,SAAA,GAAY,kBAAA,CAAmB,OAAA,EAAQ,CAAE,UAAU,MAAM,CAAA;AAE/D,IAAA,IAAI,CAAC,UAAU,OAAA,EAAS;AACtB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,wBAAA,EAA2B,sBAAsB,SAAA,CAAU,KAAK,CAAC,CAAA,CAAE,CAAA;AAAA,IACrF;AAEA,IAAA,eAAA,CAAgB,OAAA,CAAQ,YAAY,CAAC,CAAA;AACrC,IAAA,MAAM,OAAO,IAAA,CAAK,SAAA,CAAU,SAAA,CAAU,IAAA,EAAM,MAAM,CAAC,CAAA;AACnD,IAAA,aAAA,CAAc,cAAc,IAAA,EAAM,EAAE,UAAU,OAAA,EAAS,IAAA,EAAM,KAAO,CAAA;AAEpE,IAAA,IAAA,CAAK,gBAAgB,SAAA,CAAU,IAAA;AAC/B,IAAA,IAAA,CAAK,mBAAA,EAAoB;AAEzB,IAAA,MAAA,CAAO,IAAA,CAAK,EAAE,IAAA,EAAM,YAAA,IAAgB,sBAAsB,CAAA;AAAA,EAC5D;AAAA,EAEA,YAAY,UAAA,EAA2B;AACrC,IAAA,MAAM,YAAA,GAAe,cAAc,aAAA,EAAc;AACjD,IAAA,IAAA,CAAK,eAAA,CAAgB,cAAc,MAAM;AACvC,MAAA,IAAA,CAAK,WAAW,YAAY,CAAA;AAAA,IAC9B,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,aAAa,WAAA,EAA2B;AACtC,IAAA,MAAM,YAAA,GAAe,qBAAqB,WAAW,CAAA;AACrD,IAAA,IAAA,CAAK,eAAA,CAAgB,cAAc,MAAM;AACvC,MAAA,IAAA,CAAK,YAAY,WAAW,CAAA;AAAA,IAC9B,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,SAAS,QAAA,EAAsC;AAC7C,IAAA,IAAA,CAAK,eAAA,CAAgB,KAAK,QAAQ,CAAA;AAAA,EACpC;AAAA,EAEA,YAAA,GAAqB;AACnB,IAAA,KAAA,MAAW,OAAA,IAAW,KAAK,QAAA,EAAU;AACnC,MAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,QAAA,WAAA,CAAY,QAAQ,IAAI,CAAA;AACxB,QAAA,OAAA,CAAQ,MAAA,GAAS,KAAA;AAAA,MACnB;AAAA,IACF;AACA,IAAA,IAAA,CAAK,WAAW,EAAC;AAAA,EACnB;AAAA,EAEQ,eAAA,CAAgB,UAAkB,QAAA,EAA4B;AACpE,IAAA,IAAI,CAAC,UAAA,CAAW,QAAQ,CAAA,EAAG;AACzB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,KAAA,GAAQ,EAAE,IAAA,EAAM,QAAA,EAAU,QAAQ,IAAA,EAAK;AAC7C,IAAA,IAAA,CAAK,QAAA,CAAS,KAAK,KAAK,CAAA;AAExB,IAAA,SAAA,CAAU,QAAA,EAAU,EAAE,QAAA,EAAU,GAAA,IAAQ,MAAM;AAC5C,MAAA,IAAI,CAAC,MAAM,MAAA,EAAQ;AACjB,QAAA;AAAA,MACF;AACA,MAAA,MAAA,CAAO,IAAA,CAAK,EAAE,IAAA,EAAM,QAAA,IAAY,gCAAgC,CAAA;AAChE,MAAA,IAAI;AACF,QAAA,QAAA,EAAS;AAAA,MACX,SAAS,KAAA,EAAgB;AACvB,QAAA,MAAM,UACJ,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACvD,QAAA,MAAA,CAAO,KAAA,CAAM,EAAE,KAAA,EAAO,OAAA,IAAW,yBAAyB,CAAA;AAAA,MAC5D;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA,EAEQ,mBAAA,GAA4B;AAClC,IAAA,IAAI,CAAC,KAAK,aAAA,EAAe;AACvB,MAAA,IAAA,CAAK,YAAA,GAAe,EAAE,GAAG,IAAA,CAAK,YAAA,EAAa;AAAA,IAC7C,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,YAAA,GAAe;AAAA,QAClB,GAAG,IAAA,CAAK,YAAA;AAAA,QACR,GAAG,IAAA,CAAK,aAAA;AAAA,QACR,KAAA,EAAO;AAAA,UACL,GAAG,KAAK,YAAA,CAAa,KAAA;AAAA,UACrB,GAAI,IAAA,CAAK,aAAA,CAAc,KAAA,IAAS;AAAC,SACnC;AAAA,QACA,SAAA,EAAW;AAAA,UACT,GAAG,KAAK,YAAA,CAAa,SAAA;AAAA,UACrB,GAAI,IAAA,CAAK,aAAA,CAAc,SAAA,IAAa;AAAC,SACvC;AAAA,QACA,WAAA,EAAa;AAAA,UACX,GAAG,KAAK,YAAA,CAAa,WAAA;AAAA,UACrB,GAAI,IAAA,CAAK,aAAA,CAAc,WAAA,IAAe;AAAC,SACzC;AAAA,QACA,UAAA,EAAY;AAAA,UACV,GAAG,KAAK,YAAA,CAAa,UAAA;AAAA,UACrB,GAAI,IAAA,CAAK,aAAA,CAAc,UAAA,IAAc;AAAC,SACxC;AAAA,QACA,KAAA,EAAO;AAAA,UACL,GAAG,KAAK,YAAA,CAAa,KAAA;AAAA,UACrB,GAAI,IAAA,CAAK,aAAA,CAAc,KAAA,IAAS;AAAC,SACnC;AAAA,QACA,IAAA,EAAM;AAAA,UACJ,GAAG,KAAK,YAAA,CAAa,IAAA;AAAA,UACrB,GAAI,IAAA,CAAK,aAAA,CAAc,IAAA,IAAQ;AAAC,SAClC;AAAA,QACA,SAAA,EAAW;AAAA,UACT,GAAG,KAAK,YAAA,CAAa,SAAA;AAAA,UACrB,GAAI,IAAA,CAAK,aAAA,CAAc,SAAA,IAAa;AAAC,SACvC;AAAA,QACA,KAAA,EAAO,IAAA,CAAK,aAAA,CAAc,KAAA,IAAS,KAAK,YAAA,CAAa;AAAA,OACvD;AAAA,IACF;AAEA,IAAA,KAAA,MAAW,EAAA,IAAM,KAAK,eAAA,EAAiB;AACrC,MAAA,IAAI;AACF,QAAA,EAAA,CAAG,KAAK,YAAY,CAAA;AAAA,MACtB,SAAS,KAAA,EAAgB;AACvB,QAAA,MAAM,UACJ,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACvD,QAAA,MAAA,CAAO,KAAA,CAAM,EAAE,KAAA,EAAO,OAAA,IAAW,+BAA+B,CAAA;AAAA,MAClE;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,cACN,OAAA,EACe;AACf,IAAA,OAAO;AAAA,MACL,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,cAAc,OAAA,CAAQ,YAAA;AAAA,MACtB,KAAA,EAAO;AAAA,QACL,GAAG,cAAA,CAAe,KAAA;AAAA,QAClB,GAAI,OAAA,CAAQ;AAAA,OACd;AAAA,MACA,SAAA,EAAW;AAAA,QACT,GAAG,cAAA,CAAe,SAAA;AAAA,QAClB,GAAI,OAAA,CAAQ;AAAA,OACd;AAAA,MACA,WAAA,EAAa,OAAA,CAAQ,WAAA,GAChB,OAAA,CAAQ,cACT,cAAA,CAAe,WAAA;AAAA,MACnB,UAAA,EAAY,OAAA,CAAQ,UAAA,GACf,OAAA,CAAQ,aACT,cAAA,CAAe,UAAA;AAAA,MACnB,KAAA,EAAO,OAAA,CAAQ,KAAA,GACV,OAAA,CAAQ,QACT,cAAA,CAAe,KAAA;AAAA,MACnB,IAAA,EAAM,OAAA,CAAQ,IAAA,GACT,OAAA,CAAQ,OACT,cAAA,CAAe,IAAA;AAAA,MACnB,SAAA,EAAW,OAAA,CAAQ,SAAA,GACd,OAAA,CAAQ,YACT,cAAA,CAAe,SAAA;AAAA,MACnB,KAAA,EAAO,OAAA,CAAQ,KAAA,GACV,OAAA,CAAQ,KAAA,GACT;AAAA,KACN;AAAA,EACF;AACF","file":"chunk-5XFSV6PF.js","sourcesContent":["/**\r\n * Configuration store — PRD sections 17.2, 17.3\r\n * Loads/saves global and project config with Zod validation.\r\n * Merges project config over global config.\r\n * Watches for config file changes.\r\n */\r\n\r\nimport { readFileSync, writeFileSync, watchFile, unwatchFile } from \"node:fs\";\r\nimport { existsSync } from \"node:fs\";\r\nimport { dirname } from \"node:path\";\r\nimport { z } from \"zod\";\r\nimport { logger } from \"../utils/logger.js\";\r\nimport {\r\n getConfigPath,\r\n getProjectConfigPath,\r\n ensureDirectory,\r\n} from \"../utils/pathResolver.js\";\r\nimport { DEFAULT_CONFIG } from \"../types/config.js\";\r\nimport type { IGlobalConfig } from \"../types/config.js\";\r\nimport { CLI_PROVIDERS, type CliProviderType } from \"../orchestrator/constants.js\";\r\n\r\n// ── Zod Schemas ─────────────────────────────────────────────────────────\r\n\r\nconst ProviderConfigSchema = z.object({\r\n enabled: z.boolean(),\r\n baseUrl: z.string().optional(),\r\n}).strict();\r\n\r\nconst PermissionConfigSchema = z.object({\r\n mode: z.enum([\"strict\", \"standard\", \"permissive\"]),\r\n allowedPaths: z.array(z.string()),\r\n blockedCommands: z.array(z.string()),\r\n}).strict();\r\n\r\nconst SplitPanelConfigSchema = z.object({\r\n enabled: z.boolean(),\r\n backend: z.enum([\"tmux\", \"iterm2\"]),\r\n defaultLayout: z.enum([\"auto\", \"horizontal\", \"vertical\", \"grid\", \"hub-spoke\"]),\r\n maxPanes: z.number().int().min(1).max(16),\r\n}).strict();\r\n\r\nconst CLI_PROVIDER_ENUM_VALUES = [...CLI_PROVIDERS] as [\r\n CliProviderType,\r\n ...CliProviderType[],\r\n];\r\n\r\nconst SwarmConfigSchema = z.object({\r\n onboardingComplete: z.boolean(),\r\n detectedProviders: z.array(z.enum(CLI_PROVIDER_ENUM_VALUES)),\r\n primaryMasterProvider: z.enum(CLI_PROVIDER_ENUM_VALUES).optional(),\r\n fallbackMasterProviders: z.array(z.enum(CLI_PROVIDER_ENUM_VALUES)),\r\n}).strict();\r\n\r\nconst CostConfigSchema = z.object({\r\n budgetWarning: z.number().nonnegative(),\r\n budgetHardStop: z.number().nonnegative(),\r\n currency: z.string(),\r\n}).strict();\r\n\r\nconst TelemetryConfigSchema = z.object({\r\n enabled: z.boolean(),\r\n anonymized: z.boolean(),\r\n}).strict();\r\n\r\nconst RoleConfigSchema = z.object({\r\n primary: z.string(),\r\n fallback: z.array(z.string()),\r\n}).strict();\r\n\r\nconst OAuthProviderConfigSchema = z.object({\r\n clientId: z.string(),\r\n clientSecret: z.string().optional(),\r\n authorizeUrl: z.string().optional(),\r\n tokenUrl: z.string().optional(),\r\n scope: z.string().optional(),\r\n}).strict();\r\n\r\nconst OAuthConfigSchema = z.object({\r\n anthropic: OAuthProviderConfigSchema.optional(),\r\n openai: OAuthProviderConfigSchema.optional(),\r\n google: OAuthProviderConfigSchema.optional(),\r\n kimi: OAuthProviderConfigSchema.optional(),\r\n}).strict();\r\n\r\nconst GlobalConfigSchema = z.object({\r\n version: z.string(),\r\n defaultModel: z.string(),\r\n roles: z.record(z.string(), RoleConfigSchema).optional(),\r\n providers: z.record(z.string(), ProviderConfigSchema).optional(),\r\n permissions: PermissionConfigSchema.optional(),\r\n splitPanel: SplitPanelConfigSchema.optional(),\r\n swarm: SwarmConfigSchema.optional(),\r\n cost: CostConfigSchema.optional(),\r\n telemetry: TelemetryConfigSchema.optional(),\r\n oauth: OAuthConfigSchema.optional(),\r\n}).strict();\r\n\r\nfunction formatValidationError(error: z.ZodError): string {\r\n return error.issues\r\n .map((issue) => `${issue.path.join(\".\") || \"<root>\"}: ${issue.message}`)\r\n .join(\"; \");\r\n}\r\n\r\ntype ConfigChangeCallback = (config: IGlobalConfig) => void;\r\n\r\nexport class ConfigStore {\r\n private globalConfig: IGlobalConfig = DEFAULT_CONFIG;\r\n private projectConfig: Partial<IGlobalConfig> | undefined;\r\n private mergedConfig: IGlobalConfig = DEFAULT_CONFIG;\r\n private watchers: Array<{ path: string; active: boolean }> = [];\r\n private changeCallbacks: ConfigChangeCallback[] = [];\r\n\r\n get config(): IGlobalConfig {\r\n return this.mergedConfig;\r\n }\r\n\r\n loadGlobal(configPath?: string): IGlobalConfig {\r\n const resolvedPath = configPath ?? getConfigPath();\r\n\r\n if (!existsSync(resolvedPath)) {\r\n logger.info(\r\n { path: resolvedPath },\r\n \"Global config not found, using defaults\",\r\n );\r\n this.globalConfig = DEFAULT_CONFIG;\r\n this.rebuildMergedConfig();\r\n return this.mergedConfig;\r\n }\r\n\r\n let parsed: unknown;\r\n try {\r\n const raw = readFileSync(resolvedPath, \"utf-8\");\r\n parsed = JSON.parse(raw);\r\n } catch (error: unknown) {\r\n const message = error instanceof Error ? error.message : String(error);\r\n logger.warn({ error: message, path: resolvedPath }, \"Global config parse failed, using defaults\");\r\n this.globalConfig = DEFAULT_CONFIG;\r\n this.rebuildMergedConfig();\r\n return this.mergedConfig;\r\n }\r\n const validated = GlobalConfigSchema.safeParse(parsed);\r\n\r\n if (!validated.success) {\r\n logger.warn(\r\n { errors: validated.error.issues },\r\n \"Global config validation failed, using defaults\",\r\n );\r\n this.globalConfig = DEFAULT_CONFIG;\r\n this.rebuildMergedConfig();\r\n return this.mergedConfig;\r\n }\r\n\r\n this.globalConfig = this.applyDefaults(validated.data);\r\n this.rebuildMergedConfig();\r\n\r\n logger.info({ path: resolvedPath }, \"Global config loaded\");\r\n return this.mergedConfig;\r\n }\r\n\r\n loadProject(projectRoot: string): IGlobalConfig {\r\n const resolvedPath = getProjectConfigPath(projectRoot);\r\n\r\n if (!existsSync(resolvedPath)) {\r\n logger.debug(\r\n { path: resolvedPath },\r\n \"Project config not found, using global only\",\r\n );\r\n this.projectConfig = undefined;\r\n this.rebuildMergedConfig();\r\n return this.mergedConfig;\r\n }\r\n\r\n let parsed: unknown;\r\n try {\r\n const raw = readFileSync(resolvedPath, \"utf-8\");\r\n parsed = JSON.parse(raw);\r\n } catch (error: unknown) {\r\n const message = error instanceof Error ? error.message : String(error);\r\n logger.warn({ error: message, path: resolvedPath }, \"Project config parse failed, ignoring\");\r\n this.projectConfig = undefined;\r\n this.rebuildMergedConfig();\r\n return this.mergedConfig;\r\n }\r\n const validated = GlobalConfigSchema.partial().safeParse(parsed);\r\n\r\n if (!validated.success) {\r\n logger.warn(\r\n { errors: validated.error.issues },\r\n \"Project config validation failed, ignoring\",\r\n );\r\n this.projectConfig = undefined;\r\n this.rebuildMergedConfig();\r\n return this.mergedConfig;\r\n }\r\n\r\n this.projectConfig = validated.data as Partial<IGlobalConfig>;\r\n this.rebuildMergedConfig();\r\n\r\n logger.info({ path: resolvedPath }, \"Project config loaded\");\r\n return this.mergedConfig;\r\n }\r\n\r\n saveGlobal(\r\n config?: IGlobalConfig,\r\n configPath?: string,\r\n ): void {\r\n const resolvedPath = configPath ?? getConfigPath();\r\n const configToSave = config ?? this.globalConfig;\r\n const validated = GlobalConfigSchema.safeParse(configToSave);\r\n\r\n if (!validated.success) {\r\n throw new Error(`Invalid global config: ${formatValidationError(validated.error)}`);\r\n }\r\n\r\n ensureDirectory(dirname(resolvedPath));\r\n const json = JSON.stringify(validated.data, null, 2);\r\n writeFileSync(resolvedPath, json, { encoding: \"utf-8\", mode: 0o600 });\r\n\r\n logger.info({ path: resolvedPath }, \"Global config saved\");\r\n\r\n if (config) {\r\n this.globalConfig = this.applyDefaults(validated.data);\r\n this.rebuildMergedConfig();\r\n }\r\n }\r\n\r\n saveProject(\r\n projectRoot: string,\r\n config: Partial<IGlobalConfig>,\r\n ): void {\r\n const resolvedPath = getProjectConfigPath(projectRoot);\r\n const validated = GlobalConfigSchema.partial().safeParse(config);\r\n\r\n if (!validated.success) {\r\n throw new Error(`Invalid project config: ${formatValidationError(validated.error)}`);\r\n }\r\n\r\n ensureDirectory(dirname(resolvedPath));\r\n const json = JSON.stringify(validated.data, null, 2);\r\n writeFileSync(resolvedPath, json, { encoding: \"utf-8\", mode: 0o600 });\r\n\r\n this.projectConfig = validated.data as Partial<IGlobalConfig>;\r\n this.rebuildMergedConfig();\r\n\r\n logger.info({ path: resolvedPath }, \"Project config saved\");\r\n }\r\n\r\n watchGlobal(configPath?: string): void {\r\n const resolvedPath = configPath ?? getConfigPath();\r\n this.watchConfigFile(resolvedPath, () => {\r\n this.loadGlobal(resolvedPath);\r\n });\r\n }\r\n\r\n watchProject(projectRoot: string): void {\r\n const resolvedPath = getProjectConfigPath(projectRoot);\r\n this.watchConfigFile(resolvedPath, () => {\r\n this.loadProject(projectRoot);\r\n });\r\n }\r\n\r\n onChange(callback: ConfigChangeCallback): void {\r\n this.changeCallbacks.push(callback);\r\n }\r\n\r\n stopWatching(): void {\r\n for (const watcher of this.watchers) {\r\n if (watcher.active) {\r\n unwatchFile(watcher.path);\r\n watcher.active = false;\r\n }\r\n }\r\n this.watchers = [];\r\n }\r\n\r\n private watchConfigFile(filePath: string, onUpdate: () => void): void {\r\n if (!existsSync(filePath)) {\r\n return;\r\n }\r\n\r\n const entry = { path: filePath, active: true };\r\n this.watchers.push(entry);\r\n\r\n watchFile(filePath, { interval: 2000 }, () => {\r\n if (!entry.active) {\r\n return;\r\n }\r\n logger.info({ path: filePath }, \"Config file changed, reloading\");\r\n try {\r\n onUpdate();\r\n } catch (error: unknown) {\r\n const message =\r\n error instanceof Error ? error.message : String(error);\r\n logger.error({ error: message }, \"Failed to reload config\");\r\n }\r\n });\r\n }\r\n\r\n private rebuildMergedConfig(): void {\r\n if (!this.projectConfig) {\r\n this.mergedConfig = { ...this.globalConfig };\r\n } else {\r\n this.mergedConfig = {\r\n ...this.globalConfig,\r\n ...this.projectConfig,\r\n roles: {\r\n ...this.globalConfig.roles,\r\n ...(this.projectConfig.roles ?? {}),\r\n },\r\n providers: {\r\n ...this.globalConfig.providers,\r\n ...(this.projectConfig.providers ?? {}),\r\n },\r\n permissions: {\r\n ...this.globalConfig.permissions,\r\n ...(this.projectConfig.permissions ?? {}),\r\n },\r\n splitPanel: {\r\n ...this.globalConfig.splitPanel,\r\n ...(this.projectConfig.splitPanel ?? {}),\r\n },\r\n swarm: {\r\n ...this.globalConfig.swarm,\r\n ...(this.projectConfig.swarm ?? {}),\r\n },\r\n cost: {\r\n ...this.globalConfig.cost,\r\n ...(this.projectConfig.cost ?? {}),\r\n },\r\n telemetry: {\r\n ...this.globalConfig.telemetry,\r\n ...(this.projectConfig.telemetry ?? {}),\r\n },\r\n oauth: this.projectConfig.oauth ?? this.globalConfig.oauth,\r\n };\r\n }\r\n\r\n for (const cb of this.changeCallbacks) {\r\n try {\r\n cb(this.mergedConfig);\r\n } catch (error: unknown) {\r\n const message =\r\n error instanceof Error ? error.message : String(error);\r\n logger.error({ error: message }, \"Config change callback failed\");\r\n }\r\n }\r\n }\r\n\r\n private applyDefaults(\r\n partial: z.infer<typeof GlobalConfigSchema>,\r\n ): IGlobalConfig {\r\n return {\r\n version: partial.version,\r\n defaultModel: partial.defaultModel,\r\n roles: {\r\n ...DEFAULT_CONFIG.roles,\r\n ...(partial.roles as IGlobalConfig[\"roles\"] | undefined),\r\n },\r\n providers: {\r\n ...DEFAULT_CONFIG.providers,\r\n ...(partial.providers as IGlobalConfig[\"providers\"] | undefined),\r\n },\r\n permissions: partial.permissions\r\n ? (partial.permissions as IGlobalConfig[\"permissions\"])\r\n : DEFAULT_CONFIG.permissions,\r\n splitPanel: partial.splitPanel\r\n ? (partial.splitPanel as IGlobalConfig[\"splitPanel\"])\r\n : DEFAULT_CONFIG.splitPanel,\r\n swarm: partial.swarm\r\n ? (partial.swarm as IGlobalConfig[\"swarm\"])\r\n : DEFAULT_CONFIG.swarm,\r\n cost: partial.cost\r\n ? (partial.cost as IGlobalConfig[\"cost\"])\r\n : DEFAULT_CONFIG.cost,\r\n telemetry: partial.telemetry\r\n ? (partial.telemetry as IGlobalConfig[\"telemetry\"])\r\n : DEFAULT_CONFIG.telemetry,\r\n oauth: partial.oauth\r\n ? (partial.oauth as IGlobalConfig[\"oauth\"])\r\n : undefined,\r\n };\r\n }\r\n}\r\n"]}
@@ -318,5 +318,5 @@ var PROVIDER_MODEL_ORDER = {
318
318
  var DEFAULT_MODEL_ID = "claude-sonnet-4-6";
319
319
 
320
320
  export { DEFAULT_MODEL_ID, PROVIDER_MODEL_ORDER, SUPPORTED_MODELS, getThinkingConfigForModel };
321
- //# sourceMappingURL=chunk-HCIHOHLX.js.map
322
- //# sourceMappingURL=chunk-HCIHOHLX.js.map
321
+ //# sourceMappingURL=chunk-62HSGYQD.js.map
322
+ //# sourceMappingURL=chunk-62HSGYQD.js.map