aemeathcli 1.0.10 → 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.
Files changed (184) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +66 -54
  3. package/dist/App-JQ622M66.js +4431 -0
  4. package/dist/App-JQ622M66.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-RJLPM3KH.js +11 -0
  14. package/dist/{api-key-fallback-YQQBOQIL.js.map → api-key-fallback-RJLPM3KH.js.map} +1 -1
  15. package/dist/auth-status-JQJOKUPF.js +13 -0
  16. package/dist/auth-status-JQJOKUPF.js.map +1 -0
  17. package/dist/{chunk-RWCNNAL7.js → chunk-2KMA5RBC.js} +25 -48
  18. package/dist/chunk-2KMA5RBC.js.map +1 -0
  19. package/dist/{chunk-CYQNBB25.js → chunk-2Y7TR6BS.js} +28 -5
  20. package/dist/chunk-2Y7TR6BS.js.map +1 -0
  21. package/dist/{chunk-DAHGLHNR.js → chunk-2ZYK5IJG.js} +6 -141
  22. package/dist/chunk-2ZYK5IJG.js.map +1 -0
  23. package/dist/chunk-36RXCZOV.js +88 -0
  24. package/dist/chunk-36RXCZOV.js.map +1 -0
  25. package/dist/{chunk-DMBPX3RG.js → chunk-7EBLXPL4.js} +9 -9
  26. package/dist/{chunk-DMBPX3RG.js.map → chunk-7EBLXPL4.js.map} +1 -1
  27. package/dist/chunk-BIMQL4AG.js +186 -0
  28. package/dist/chunk-BIMQL4AG.js.map +1 -0
  29. package/dist/{chunk-NBR3GHMT.js → chunk-D275MCIH.js} +39 -7
  30. package/dist/chunk-D275MCIH.js.map +1 -0
  31. package/dist/{chunk-Y5XVD2CD.js → chunk-FFS4T7BZ.js} +109 -82
  32. package/dist/chunk-FFS4T7BZ.js.map +1 -0
  33. package/dist/{chunk-CARHU3DO.js → chunk-GXAJGP2T.js} +64 -16
  34. package/dist/chunk-GXAJGP2T.js.map +1 -0
  35. package/dist/{chunk-I5PZ4JTS.js → chunk-HESQLCLU.js} +4 -4
  36. package/dist/{chunk-I5PZ4JTS.js.map → chunk-HESQLCLU.js.map} +1 -1
  37. package/dist/{chunk-JAXXTYID.js → chunk-IR5HLBMH.js} +2 -2
  38. package/dist/{chunk-JAXXTYID.js.map → chunk-IR5HLBMH.js.map} +1 -1
  39. package/dist/{chunk-MFBHNWGV.js → chunk-K2FCMRXH.js} +11 -19
  40. package/dist/chunk-K2FCMRXH.js.map +1 -0
  41. package/dist/{chunk-H66O5Z2V.js → chunk-KIC7UI5U.js} +41 -6
  42. package/dist/chunk-KIC7UI5U.js.map +1 -0
  43. package/dist/{chunk-MXZSI3AY.js → chunk-KMOAJRDE.js} +42 -10
  44. package/dist/chunk-KMOAJRDE.js.map +1 -0
  45. package/dist/chunk-LQBALETG.js +71 -0
  46. package/dist/chunk-LQBALETG.js.map +1 -0
  47. package/dist/chunk-M3FPQSRU.js +12 -0
  48. package/dist/chunk-M3FPQSRU.js.map +1 -0
  49. package/dist/chunk-NQEUK763.js +26 -0
  50. package/dist/chunk-NQEUK763.js.map +1 -0
  51. package/dist/chunk-OPWAFS6Y.js +38 -0
  52. package/dist/chunk-OPWAFS6Y.js.map +1 -0
  53. package/dist/{chunk-6PDJ45T4.js → chunk-PS4WEFW6.js} +50 -25
  54. package/dist/chunk-PS4WEFW6.js.map +1 -0
  55. package/dist/{chunk-HMJRPNPZ.js → chunk-QK7TKNHV.js} +93 -21
  56. package/dist/chunk-QK7TKNHV.js.map +1 -0
  57. package/dist/{chunk-LSOYPSAT.js → chunk-RADJSEG5.js} +4 -4
  58. package/dist/chunk-RADJSEG5.js.map +1 -0
  59. package/dist/{chunk-4IJD72YB.js → chunk-SNWPI6XJ.js} +7 -7
  60. package/dist/chunk-SNWPI6XJ.js.map +1 -0
  61. package/dist/{chunk-TEVZS4FA.js → chunk-UM7MSLOV.js} +16 -9
  62. package/dist/chunk-UM7MSLOV.js.map +1 -0
  63. package/dist/chunk-VNZ3YTQD.js +232 -0
  64. package/dist/chunk-VNZ3YTQD.js.map +1 -0
  65. package/dist/{chunk-IYW62KKR.js → chunk-WXIN65UG.js} +66 -23
  66. package/dist/chunk-WXIN65UG.js.map +1 -0
  67. package/dist/chunk-XEXWX7C7.js +241 -0
  68. package/dist/chunk-XEXWX7C7.js.map +1 -0
  69. package/dist/{chunk-CGEV3ARR.js → chunk-YCCYXDW7.js} +3 -3
  70. package/dist/chunk-YCCYXDW7.js.map +1 -0
  71. package/dist/chunk-YPQ2MLAV.js +140 -0
  72. package/dist/chunk-YPQ2MLAV.js.map +1 -0
  73. package/dist/chunk-ZCOVMVK4.js +26 -0
  74. package/dist/chunk-ZCOVMVK4.js.map +1 -0
  75. package/dist/{claude-login-5WELXPKT.js → claude-login-AIFIWTYF.js} +9 -9
  76. package/dist/{claude-login-5WELXPKT.js.map → claude-login-AIFIWTYF.js.map} +1 -1
  77. package/dist/cli.js +370 -171
  78. package/dist/cli.js.map +1 -1
  79. package/dist/{codex-login-GZIFXUWD.js → codex-login-LW5X7GAM.js} +10 -10
  80. package/dist/codex-login-LW5X7GAM.js.map +1 -0
  81. package/dist/config-store-NF56VHFU.js +7 -0
  82. package/dist/{config-store-W6FBCQAQ.js.map → config-store-NF56VHFU.js.map} +1 -1
  83. package/dist/conversation-store-7GRDQZD2.js +4 -0
  84. package/dist/conversation-store-7GRDQZD2.js.map +1 -0
  85. package/dist/detect-providers-QICJ5U3R.js +4 -0
  86. package/dist/detect-providers-QICJ5U3R.js.map +1 -0
  87. package/dist/executor-FTABX2AW.js +4 -0
  88. package/dist/{executor-6RIKIGXK.js.map → executor-FTABX2AW.js.map} +1 -1
  89. package/dist/first-run-ADROZVYF.js +230 -0
  90. package/dist/first-run-ADROZVYF.js.map +1 -0
  91. package/dist/{gemini-login-AZGL3CE7.js → gemini-login-TST454MX.js} +9 -9
  92. package/dist/{gemini-login-AZGL3CE7.js.map → gemini-login-TST454MX.js.map} +1 -1
  93. package/dist/index.d.ts +46 -70
  94. package/dist/index.js +79 -468
  95. package/dist/index.js.map +1 -1
  96. package/dist/input-history-BEICE7PT.js +57 -0
  97. package/dist/input-history-BEICE7PT.js.map +1 -0
  98. package/dist/kimi-adapter-7FYOAKOI.js +6 -0
  99. package/dist/{kimi-adapter-JN4HFFHU.js.map → kimi-adapter-7FYOAKOI.js.map} +1 -1
  100. package/dist/{kimi-login-6LUWB7P6.js → kimi-login-3IGVOBJI.js} +9 -9
  101. package/dist/{kimi-login-6LUWB7P6.js.map → kimi-login-3IGVOBJI.js.map} +1 -1
  102. package/dist/logger-KGHUQ4VE.js +3 -0
  103. package/dist/logger-KGHUQ4VE.js.map +1 -0
  104. package/dist/model-discovery-AAJDHRFO.js +6 -0
  105. package/dist/model-discovery-AAJDHRFO.js.map +1 -0
  106. package/dist/native-cli-adapters-CLONTZOA.js +8 -0
  107. package/dist/{native-cli-adapters-OLW3XX57.js.map → native-cli-adapters-CLONTZOA.js.map} +1 -1
  108. package/dist/ollama-adapter-2N5OQIEV.js +5 -0
  109. package/dist/{ollama-adapter-OJQ3FKWK.js.map → ollama-adapter-2N5OQIEV.js.map} +1 -1
  110. package/dist/pathResolver-UVAB2FCW.js +3 -0
  111. package/dist/pathResolver-UVAB2FCW.js.map +1 -0
  112. package/dist/profile-loader-EMLV4J7S.js +162 -0
  113. package/dist/profile-loader-EMLV4J7S.js.map +1 -0
  114. package/dist/registry-LRURZVUL.js +5 -0
  115. package/dist/{registry-AZ2LOHHJ.js.map → registry-LRURZVUL.js.map} +1 -1
  116. package/dist/registry-MVNSXCEF.js +6 -0
  117. package/dist/{registry-H7B3AHPQ.js.map → registry-MVNSXCEF.js.map} +1 -1
  118. package/dist/server-manager-THGZBBZB.js +5 -0
  119. package/dist/{server-manager-PTGBHCLS.js.map → server-manager-THGZBBZB.js.map} +1 -1
  120. package/dist/session-manager-X3DXT53M.js +12 -0
  121. package/dist/{session-manager-XOMDMC77.js.map → session-manager-X3DXT53M.js.map} +1 -1
  122. package/dist/skills/built-in/code-review/SKILL.md +85 -0
  123. package/dist/skills/built-in/commit/SKILL.md +83 -0
  124. package/dist/skills/built-in/debug/SKILL.md +119 -0
  125. package/dist/skills/built-in/plan/SKILL.md +123 -0
  126. package/dist/skills/built-in/refactor/SKILL.md +132 -0
  127. package/dist/skills/built-in/test/SKILL.md +128 -0
  128. package/dist/sqlite-store-7OECRTXM.js +5 -0
  129. package/dist/sqlite-store-7OECRTXM.js.map +1 -0
  130. package/dist/team-manager-2VSMALAA.js +11 -0
  131. package/dist/{team-manager-HC4XGCFY.js.map → team-manager-2VSMALAA.js.map} +1 -1
  132. package/dist/team-state-HZNVMQHT.js +3 -0
  133. package/dist/team-state-HZNVMQHT.js.map +1 -0
  134. package/dist/tmux-manager-57QCUVHU.js +6 -0
  135. package/dist/{tmux-manager-GPYZ3WQH.js.map → tmux-manager-57QCUVHU.js.map} +1 -1
  136. package/dist/tools-KWFSYT56.js +6 -0
  137. package/dist/{tools-TSMXMHIF.js.map → tools-KWFSYT56.js.map} +1 -1
  138. package/package.json +11 -11
  139. package/dist/App-FKRSMFMB.js +0 -2789
  140. package/dist/App-FKRSMFMB.js.map +0 -1
  141. package/dist/api-key-fallback-YQQBOQIL.js +0 -11
  142. package/dist/chunk-4IJD72YB.js.map +0 -1
  143. package/dist/chunk-6PDJ45T4.js.map +0 -1
  144. package/dist/chunk-CARHU3DO.js.map +0 -1
  145. package/dist/chunk-CGEV3ARR.js.map +0 -1
  146. package/dist/chunk-CS5X3BWX.js +0 -27
  147. package/dist/chunk-CS5X3BWX.js.map +0 -1
  148. package/dist/chunk-CYQNBB25.js.map +0 -1
  149. package/dist/chunk-DAHGLHNR.js.map +0 -1
  150. package/dist/chunk-H66O5Z2V.js.map +0 -1
  151. package/dist/chunk-HMJRPNPZ.js.map +0 -1
  152. package/dist/chunk-IYW62KKR.js.map +0 -1
  153. package/dist/chunk-LSOYPSAT.js.map +0 -1
  154. package/dist/chunk-MFBHNWGV.js.map +0 -1
  155. package/dist/chunk-MXZSI3AY.js.map +0 -1
  156. package/dist/chunk-NBR3GHMT.js.map +0 -1
  157. package/dist/chunk-RWCNNAL7.js.map +0 -1
  158. package/dist/chunk-TEVZS4FA.js.map +0 -1
  159. package/dist/chunk-UY2SYSEZ.js +0 -211
  160. package/dist/chunk-UY2SYSEZ.js.map +0 -1
  161. package/dist/chunk-WAHVZH7V.js +0 -260
  162. package/dist/chunk-WAHVZH7V.js.map +0 -1
  163. package/dist/chunk-WPP3PEDE.js +0 -234
  164. package/dist/chunk-WPP3PEDE.js.map +0 -1
  165. package/dist/chunk-Y5XVD2CD.js.map +0 -1
  166. package/dist/claude-adapter-QMLFMSP3.js +0 -6
  167. package/dist/claude-adapter-QMLFMSP3.js.map +0 -1
  168. package/dist/codex-login-GZIFXUWD.js.map +0 -1
  169. package/dist/config-store-W6FBCQAQ.js +0 -6
  170. package/dist/executor-6RIKIGXK.js +0 -4
  171. package/dist/gemini-adapter-6JIHZ7WI.js +0 -6
  172. package/dist/gemini-adapter-6JIHZ7WI.js.map +0 -1
  173. package/dist/kimi-adapter-JN4HFFHU.js +0 -6
  174. package/dist/native-cli-adapters-OLW3XX57.js +0 -6
  175. package/dist/ollama-adapter-OJQ3FKWK.js +0 -6
  176. package/dist/openai-adapter-XU46EN7B.js +0 -6
  177. package/dist/openai-adapter-XU46EN7B.js.map +0 -1
  178. package/dist/registry-AZ2LOHHJ.js +0 -6
  179. package/dist/registry-H7B3AHPQ.js +0 -5
  180. package/dist/server-manager-PTGBHCLS.js +0 -5
  181. package/dist/session-manager-XOMDMC77.js +0 -12
  182. package/dist/team-manager-HC4XGCFY.js +0 -11
  183. package/dist/tmux-manager-GPYZ3WQH.js +0 -6
  184. package/dist/tools-TSMXMHIF.js +0 -6
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/auth/api-key-fallback.ts"],"names":[],"mappings":"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","file":"chunk-I5PZ4JTS.js","sourcesContent":["/**\n * API Key Fallback — store/retrieve/validate API keys per provider\n * Per PRD section 13.5 — optional fallback for CI/headless environments\n */\n\nimport type { ProviderName, ICredential } from \"../types/index.js\";\nimport { CredentialStore } from \"./credential-store.js\";\nimport { logger } from \"../utils/index.js\";\n\n// ── Environment Variable Mapping ─────────────────────────────────────────\n\nconst ENV_KEY_MAP: Readonly<Record<ProviderName, string | undefined>> = {\n anthropic: \"ANTHROPIC_API_KEY\",\n openai: \"OPENAI_API_KEY\",\n google: \"GOOGLE_API_KEY\",\n kimi: \"MOONSHOT_API_KEY\",\n ollama: undefined,\n} as const;\n\n// ── CLI-Friendly Provider Names ──────────────────────────────────────────\n\nconst CLI_PROVIDER_MAP: Readonly<Record<string, ProviderName>> = {\n claude: \"anthropic\",\n anthropic: \"anthropic\",\n openai: \"openai\",\n codex: \"openai\",\n google: \"google\",\n gemini: \"google\",\n kimi: \"kimi\",\n moonshot: \"kimi\",\n} as const;\n\n// ── API Key Validation Patterns ──────────────────────────────────────────\n\nconst KEY_PATTERNS: Readonly<Record<ProviderName, RegExp | undefined>> = {\n anthropic: /^sk-ant-api\\d{2}-[A-Za-z0-9_-]{20,}$/,\n openai: /^sk-[A-Za-z0-9_-]{20,}$/,\n google: /^AIza[A-Za-z0-9_-]{30,}$/,\n kimi: /^sk-[A-Za-z0-9_-]{20,}$/,\n ollama: undefined,\n} as const;\n\nconst API_KEY_CREDENTIAL_PREFIX = \"apikey:\";\n\n// ── Public Helpers ───────────────────────────────────────────────────────\n\nexport function resolveProviderName(alias: string): ProviderName | undefined {\n const normalized = alias.toLowerCase().trim();\n return CLI_PROVIDER_MAP[normalized];\n}\n\nexport function getEnvKeyName(provider: ProviderName): string | undefined {\n return ENV_KEY_MAP[provider];\n}\n\n// ── ApiKeyFallback Class ─────────────────────────────────────────────────\n\nexport class ApiKeyFallback {\n private readonly store: CredentialStore;\n\n constructor(store?: CredentialStore) {\n this.store = store ?? new CredentialStore();\n }\n\n /**\n * Validate an API key format for a given provider.\n */\n validateKeyFormat(provider: ProviderName, key: string): boolean {\n const pattern = KEY_PATTERNS[provider];\n if (pattern === undefined) {\n return key.length > 0;\n }\n return pattern.test(key);\n }\n\n /**\n * Store an API key for a provider via the credential store.\n */\n async setKey(provider: ProviderName, key: string): Promise<void> {\n if (!this.validateKeyFormat(provider, key)) {\n logger.warn({ provider }, \"API key format does not match expected pattern — storing anyway\");\n }\n\n const credential: ICredential = {\n provider,\n method: \"api_key\",\n token: `${API_KEY_CREDENTIAL_PREFIX}${key}`,\n };\n\n await this.store.set(provider, credential);\n logger.info({ provider }, \"API key stored\");\n }\n\n /**\n * Retrieve a stored API key credential for a provider.\n * Only returns credentials stored via setKey (not native login tokens).\n */\n async getCredential(provider: ProviderName): Promise<ICredential | undefined> {\n const stored = await this.store.get(provider);\n if (stored === undefined) return undefined;\n\n if (stored.method !== \"api_key\") return undefined;\n\n // Strip the internal prefix\n if (stored.token?.startsWith(API_KEY_CREDENTIAL_PREFIX)) {\n return {\n ...stored,\n token: stored.token.slice(API_KEY_CREDENTIAL_PREFIX.length),\n };\n }\n\n return stored;\n }\n\n /**\n * Get an API key from environment variables.\n */\n getFromEnvironment(provider: ProviderName): ICredential | undefined {\n const envKey = ENV_KEY_MAP[provider];\n if (envKey === undefined) return undefined;\n\n const value = process.env[envKey];\n if (value === undefined || value.length === 0) return undefined;\n\n return {\n provider,\n method: \"env_variable\",\n token: value,\n };\n }\n\n /**\n * Delete a stored API key for a provider.\n */\n async deleteKey(provider: ProviderName): Promise<void> {\n const stored = await this.store.get(provider);\n if (stored !== undefined && stored.method === \"api_key\") {\n await this.store.delete(provider);\n logger.info({ provider }, \"API key deleted\");\n }\n }\n\n /**\n * Check if an API key is available (stored or env) for a provider.\n */\n async hasKey(provider: ProviderName): Promise<boolean> {\n const stored = await this.getCredential(provider);\n if (stored !== undefined) return true;\n return this.getFromEnvironment(provider) !== undefined;\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/auth/api-key-fallback.ts"],"names":[],"mappings":"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","file":"chunk-HESQLCLU.js","sourcesContent":["/**\n * API Key Fallback — store/retrieve/validate API keys per provider\n * Per PRD section 13.5 — optional fallback for CI/headless environments\n */\n\nimport type { ProviderName, ICredential } from \"../types/index.js\";\nimport { CredentialStore } from \"./credential-store.js\";\nimport { logger } from \"../utils/index.js\";\n\n// ── Environment Variable Mapping ─────────────────────────────────────────\n\nconst ENV_KEY_MAP: Readonly<Record<ProviderName, string | undefined>> = {\n anthropic: \"ANTHROPIC_API_KEY\",\n openai: \"OPENAI_API_KEY\",\n google: \"GOOGLE_API_KEY\",\n kimi: \"MOONSHOT_API_KEY\",\n ollama: undefined,\n} as const;\n\n// ── CLI-Friendly Provider Names ──────────────────────────────────────────\n\nconst CLI_PROVIDER_MAP: Readonly<Record<string, ProviderName>> = {\n claude: \"anthropic\",\n anthropic: \"anthropic\",\n openai: \"openai\",\n codex: \"openai\",\n google: \"google\",\n gemini: \"google\",\n kimi: \"kimi\",\n moonshot: \"kimi\",\n} as const;\n\n// ── API Key Validation Patterns ──────────────────────────────────────────\n\nconst KEY_PATTERNS: Readonly<Record<ProviderName, RegExp | undefined>> = {\n anthropic: /^sk-ant-api\\d{2}-[A-Za-z0-9_-]{20,}$/,\n openai: /^sk-[A-Za-z0-9_-]{20,}$/,\n google: /^AIza[A-Za-z0-9_-]{30,}$/,\n kimi: /^sk-[A-Za-z0-9_-]{20,}$/,\n ollama: undefined,\n} as const;\n\nconst API_KEY_CREDENTIAL_PREFIX = \"apikey:\";\n\n// ── Public Helpers ───────────────────────────────────────────────────────\n\nexport function resolveProviderName(alias: string): ProviderName | undefined {\n const normalized = alias.toLowerCase().trim();\n return CLI_PROVIDER_MAP[normalized];\n}\n\nexport function getEnvKeyName(provider: ProviderName): string | undefined {\n return ENV_KEY_MAP[provider];\n}\n\n// ── ApiKeyFallback Class ─────────────────────────────────────────────────\n\nexport class ApiKeyFallback {\n private readonly store: CredentialStore;\n\n constructor(store?: CredentialStore) {\n this.store = store ?? new CredentialStore();\n }\n\n /**\n * Validate an API key format for a given provider.\n */\n validateKeyFormat(provider: ProviderName, key: string): boolean {\n const pattern = KEY_PATTERNS[provider];\n if (pattern === undefined) {\n return key.length > 0;\n }\n return pattern.test(key);\n }\n\n /**\n * Store an API key for a provider via the credential store.\n */\n async setKey(provider: ProviderName, key: string): Promise<void> {\n if (!this.validateKeyFormat(provider, key)) {\n logger.warn({ provider }, \"API key format does not match expected pattern — storing anyway\");\n }\n\n const credential: ICredential = {\n provider,\n method: \"api_key\",\n token: `${API_KEY_CREDENTIAL_PREFIX}${key}`,\n };\n\n await this.store.set(provider, credential);\n logger.info({ provider }, \"API key stored\");\n }\n\n /**\n * Retrieve a stored API key credential for a provider.\n * Only returns credentials stored via setKey (not native login tokens).\n */\n async getCredential(provider: ProviderName): Promise<ICredential | undefined> {\n const stored = await this.store.get(provider);\n if (stored === undefined) return undefined;\n\n if (stored.method !== \"api_key\") return undefined;\n\n // Strip the internal prefix\n if (stored.token?.startsWith(API_KEY_CREDENTIAL_PREFIX)) {\n return {\n ...stored,\n token: stored.token.slice(API_KEY_CREDENTIAL_PREFIX.length),\n };\n }\n\n return stored;\n }\n\n /**\n * Get an API key from environment variables.\n */\n getFromEnvironment(provider: ProviderName): ICredential | undefined {\n const envKey = ENV_KEY_MAP[provider];\n if (envKey === undefined) return undefined;\n\n const value = process.env[envKey];\n if (value === undefined || value.length === 0) return undefined;\n\n return {\n provider,\n method: \"env_variable\",\n token: value,\n };\n }\n\n /**\n * Delete a stored API key for a provider.\n */\n async deleteKey(provider: ProviderName): Promise<void> {\n const stored = await this.store.get(provider);\n if (stored !== undefined && stored.method === \"api_key\") {\n await this.store.delete(provider);\n logger.info({ provider }, \"API key deleted\");\n }\n }\n\n /**\n * Check if an API key is available (stored or env) for a provider.\n */\n async hasKey(provider: ProviderName): Promise<boolean> {\n const stored = await this.getCredential(provider);\n if (stored !== undefined) return true;\n return this.getFromEnvironment(provider) !== undefined;\n }\n}\n"]}
@@ -47,5 +47,5 @@ var logger = pino({
47
47
  });
48
48
 
49
49
  export { logger };
50
- //# sourceMappingURL=chunk-JAXXTYID.js.map
51
- //# sourceMappingURL=chunk-JAXXTYID.js.map
50
+ //# sourceMappingURL=chunk-IR5HLBMH.js.map
51
+ //# sourceMappingURL=chunk-IR5HLBMH.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/logger.ts"],"names":[],"mappings":";;;;;;AAUA,IAAM,OAAA,GAAU,IAAA,CAAK,OAAA,EAAQ,EAAG,eAAe,MAAM,CAAA;AAErD,SAAS,YAAA,GAAqB;AAC5B,EAAA,IAAI;AACF,IAAA,SAAA,CAAU,SAAS,EAAE,SAAA,EAAW,IAAA,EAAM,IAAA,EAAM,KAAO,CAAA;AAAA,EACrD,CAAA,CAAA,MAAQ;AAAA,EAER;AACF;AAGA,IAAM,YAAA,GAAe;AAAA,EACnB,OAAA;AAAA,EACA,cAAA;AAAA,EACA,QAAA;AAAA,EACA,aAAA;AAAA,EACA,cAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA,eAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,gBAAA;AAAA,EACA,UAAA;AAAA,EACA,eAAA;AAAA,EACA,gBAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF,CAAA;AAEA,YAAA,EAAa;AAEb,IAAM,SAAS,IAAA,CAAK;AAAA,EAClB,IAAA,EAAM,YAAA;AAAA,EACN,KAAA,EAAO,OAAA,CAAQ,GAAA,CAAI,sBAAsB,CAAA,IAAK,OAAA;AAAA,EAC9C,MAAA,EAAQ;AAAA,IACN,KAAA,EAAO,YAAA;AAAA,IACP,MAAA,EAAQ;AAAA,GACV;AAAA,EACA,GAAI,OAAA,CAAQ,GAAA,CAAI,UAAU,MAAM,aAAA,GAC5B;AAAA,IACE,SAAA,EAAW;AAAA,MACT,MAAA,EAAQ,WAAA;AAAA,MACR,OAAA,EAAS,EAAE,WAAA,EAAa,IAAA,CAAK,SAAS,gBAAgB,CAAA,EAAG,OAAO,IAAA;AAAK;AACvE,MAEF,EAAC;AAAA,EACL,SAAA,EAAW,KAAK,gBAAA,CAAiB;AACnC,CAAC","file":"chunk-JAXXTYID.js","sourcesContent":["/**\n * Structured logging via pino per PRD section 16.1\n * Automatic credential redaction per PRD section 14.1\n */\n\nimport pino from \"pino\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { mkdirSync } from \"node:fs\";\n\nconst LOG_DIR = join(homedir(), \".aemeathcli\", \"logs\");\n\nfunction ensureLogDir(): void {\n try {\n mkdirSync(LOG_DIR, { recursive: true, mode: 0o700 });\n } catch {\n // Log dir creation failed — fall back to stderr only\n }\n}\n\n// Redaction patterns for credentials (PRD section 14.2 REQ-CRED-04)\nconst REDACT_PATHS = [\n \"token\",\n \"refreshToken\",\n \"apiKey\",\n \"accessToken\",\n \"sessionToken\",\n \"password\",\n \"secret\",\n \"authorization\",\n \"cookie\",\n \"*.token\",\n \"*.refreshToken\",\n \"*.apiKey\",\n \"*.accessToken\",\n \"*.sessionToken\",\n \"*.password\",\n \"*.secret\",\n];\n\nensureLogDir();\n\nconst logger = pino({\n name: \"aemeathcli\",\n level: process.env[\"AEMEATHCLI_LOG_LEVEL\"] ?? \"error\",\n redact: {\n paths: REDACT_PATHS,\n censor: \"[REDACTED]\",\n },\n ...(process.env[\"NODE_ENV\"] === \"development\"\n ? {\n transport: {\n target: \"pino/file\",\n options: { destination: join(LOG_DIR, \"aemeathcli.log\"), mkdir: true },\n },\n }\n : {}),\n timestamp: pino.stdTimeFunctions.isoTime,\n});\n\nexport { logger };\n"]}
1
+ {"version":3,"sources":["../src/utils/logger.ts"],"names":[],"mappings":";;;;;;AAUA,IAAM,OAAA,GAAU,IAAA,CAAK,OAAA,EAAQ,EAAG,eAAe,MAAM,CAAA;AAErD,SAAS,YAAA,GAAqB;AAC5B,EAAA,IAAI;AACF,IAAA,SAAA,CAAU,SAAS,EAAE,SAAA,EAAW,IAAA,EAAM,IAAA,EAAM,KAAO,CAAA;AAAA,EACrD,CAAA,CAAA,MAAQ;AAAA,EAER;AACF;AAGA,IAAM,YAAA,GAAe;AAAA,EACnB,OAAA;AAAA,EACA,cAAA;AAAA,EACA,QAAA;AAAA,EACA,aAAA;AAAA,EACA,cAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA,eAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,gBAAA;AAAA,EACA,UAAA;AAAA,EACA,eAAA;AAAA,EACA,gBAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF,CAAA;AAEA,YAAA,EAAa;AAEb,IAAM,SAAS,IAAA,CAAK;AAAA,EAClB,IAAA,EAAM,YAAA;AAAA,EACN,KAAA,EAAO,OAAA,CAAQ,GAAA,CAAI,sBAAsB,CAAA,IAAK,OAAA;AAAA,EAC9C,MAAA,EAAQ;AAAA,IACN,KAAA,EAAO,YAAA;AAAA,IACP,MAAA,EAAQ;AAAA,GACV;AAAA,EACA,GAAI,OAAA,CAAQ,GAAA,CAAI,UAAU,MAAM,aAAA,GAC5B;AAAA,IACE,SAAA,EAAW;AAAA,MACT,MAAA,EAAQ,WAAA;AAAA,MACR,OAAA,EAAS,EAAE,WAAA,EAAa,IAAA,CAAK,SAAS,gBAAgB,CAAA,EAAG,OAAO,IAAA;AAAK;AACvE,MAEF,EAAC;AAAA,EACL,SAAA,EAAW,KAAK,gBAAA,CAAiB;AACnC,CAAC","file":"chunk-IR5HLBMH.js","sourcesContent":["/**\n * Structured logging via pino per PRD section 16.1\n * Automatic credential redaction per PRD section 14.1\n */\n\nimport pino from \"pino\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { mkdirSync } from \"node:fs\";\n\nconst LOG_DIR = join(homedir(), \".aemeathcli\", \"logs\");\n\nfunction ensureLogDir(): void {\n try {\n mkdirSync(LOG_DIR, { recursive: true, mode: 0o700 });\n } catch {\n // Log dir creation failed — fall back to stderr only\n }\n}\n\n// Redaction patterns for credentials (PRD section 14.2 REQ-CRED-04)\nconst REDACT_PATHS = [\n \"token\",\n \"refreshToken\",\n \"apiKey\",\n \"accessToken\",\n \"sessionToken\",\n \"password\",\n \"secret\",\n \"authorization\",\n \"cookie\",\n \"*.token\",\n \"*.refreshToken\",\n \"*.apiKey\",\n \"*.accessToken\",\n \"*.sessionToken\",\n \"*.password\",\n \"*.secret\",\n];\n\nensureLogDir();\n\nconst logger = pino({\n name: \"aemeathcli\",\n level: process.env[\"AEMEATHCLI_LOG_LEVEL\"] ?? \"error\",\n redact: {\n paths: REDACT_PATHS,\n censor: \"[REDACTED]\",\n },\n ...(process.env[\"NODE_ENV\"] === \"development\"\n ? {\n transport: {\n target: \"pino/file\",\n options: { destination: join(LOG_DIR, \"aemeathcli.log\"), mkdir: true },\n },\n }\n : {}),\n timestamp: pino.stdTimeFunctions.isoTime,\n});\n\nexport { logger };\n"]}
@@ -1,5 +1,5 @@
1
1
  import { ServerConnectionError, ToolCallError } from './chunk-ZGOHARPV.js';
2
- import { logger } from './chunk-JAXXTYID.js';
2
+ import { logger } from './chunk-IR5HLBMH.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-K2FCMRXH.js.map
408
+ //# sourceMappingURL=chunk-K2FCMRXH.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-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,12 +1,46 @@
1
1
  import { SUPPORTED_MODELS } from './chunk-HCIHOHLX.js';
2
- import { logger } from './chunk-JAXXTYID.js';
2
+ import { logger } from './chunk-IR5HLBMH.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-KIC7UI5U.js.map
340
+ //# sourceMappingURL=chunk-KIC7UI5U.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/providers/ollama-adapter.ts"],"names":[],"mappings":";;;;AAoBA,IAAM,aAAA,GAA8B,QAAA;AACpC,IAAM,gBAAA,GAAmB,wBAAA;AACzB,IAAM,wBAAA,GAA2B,CAAA;AAyBjC,SAAS,gBAAgB,QAAA,EAAoD;AAC3E,EAAA,MAAM,YAA6B,EAAC;AAEpC,EAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,IAAA,IAAI,GAAA,CAAI,SAAS,WAAA,IAAe,GAAA,CAAI,cAAc,MAAA,IAAa,GAAA,CAAI,SAAA,CAAU,MAAA,GAAS,CAAA,EAAG;AACvF,MAAA,SAAA,CAAU,IAAA,CAAK;AAAA,QACb,IAAA,EAAM,WAAA;AAAA,QACN,SAAS,GAAA,CAAI,OAAA,CAAQ,MAAA,GAAS,CAAA,GAAI,IAAI,OAAA,GAAU,IAAA;AAAA,QAChD,UAAA,EAAY,GAAA,CAAI,SAAA,CAAU,GAAA,CAAI,CAAC,QAAA,MAAc;AAAA,UAC3C,IAAI,QAAA,CAAS,EAAA;AAAA,UACb,IAAA,EAAM,UAAA;AAAA,UACN,QAAA,EAAU;AAAA,YACR,MAAM,QAAA,CAAS,IAAA;AAAA,YACf,SAAA,EAAW,IAAA,CAAK,SAAA,CAAU,QAAA,CAAS,SAAS;AAAA;AAC9C,SACF,CAAE;AAAA,OACH,CAAA;AACD,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,GAAA,CAAI,SAAS,MAAA,EAAQ;AACvB,MAAA,MAAM,QAAA,GAAW,GAAA,CAAI,SAAA,GAAY,CAAC,CAAA;AAClC,MAAA,IAAI,aAAa,MAAA,EAAW;AAC1B,QAAA,SAAA,CAAU,IAAA,CAAK;AAAA,UACb,IAAA,EAAM,MAAA;AAAA,UACN,SAAS,GAAA,CAAI,OAAA;AAAA,UACb,cAAc,QAAA,CAAS,EAAA;AAAA,UACvB,MAAM,QAAA,CAAS;AAAA,SAChB,CAAA;AACD,QAAA;AAAA,MACF;AAAA,IACF;AAEA,IAAA,SAAA,CAAU,IAAA,CAAK;AAAA,MACb,MAAM,GAAA,CAAI,IAAA;AAAA,MACV,SAAS,GAAA,CAAI;AAAA,KACd,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,SAAA;AACT;AAEA,SAAS,aAAa,KAAA,EAAyE;AAC7F,EAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG;AAC7C,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS;AACzB,IAAA,MAAM,aAAsC,EAAC;AAC7C,IAAA,MAAM,WAAqB,EAAC;AAC5B,IAAA,KAAA,MAAW,KAAA,IAAS,KAAK,UAAA,EAAY;AACnC,MAAA,UAAA,CAAW,KAAA,CAAM,IAAI,CAAA,GAAI,EAAE,MAAM,KAAA,CAAM,IAAA,EAAM,WAAA,EAAa,KAAA,CAAM,WAAA,EAAY;AAC5E,MAAA,IAAI,MAAM,QAAA,EAAU;AAClB,QAAA,QAAA,CAAS,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,MAC1B;AAAA,IACF;AACA,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,UAAA;AAAA,MACN,QAAA,EAAU;AAAA,QACR,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,aAAa,IAAA,CAAK,WAAA;AAAA,QAClB,UAAA,EAAY,EAAE,IAAA,EAAM,QAAA,EAAU,YAAY,QAAA;AAAS;AACrD,KACF;AAAA,EACF,CAAC,CAAA;AACH;AAEA,SAAS,oBAAoB,SAAA,EAA+B;AAC1D,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,SAAA;AAAA,IACJ,IAAA,EAAM,SAAA;AAAA,IACN,QAAA,EAAU,aAAA;AAAA,IACV,aAAA,EAAe,KAAA;AAAA,IACf,eAAA,EAAiB,IAAA;AAAA,IACjB,mBAAA,EAAqB,CAAA;AAAA,IACrB,oBAAA,EAAsB,CAAA;AAAA,IACtB,iBAAA,EAAmB,IAAA;AAAA,IACnB,mBAAA,EAAqB,IAAA;AAAA,IACrB,cAAA,EAAgB,CAAC,QAAA,EAAU,QAAA,EAAU,WAAW,eAAe;AAAA,GACjE;AACF;AAEO,IAAM,gBAAN,MAA8C;AAAA,EAC1C,IAAA,GAAO,aAAA;AAAA,EACP,mBAAA,GAAsB,IAAA;AAAA,EAEd,OAAA;AAAA,EACT,YAAA;AAAA,EAER,YAAY,OAAA,EAA4B;AACtC,IAAA,IAAA,CAAK,OAAA,GAAU,SAAS,OAAA,IAAW,gBAAA;AAAA,EACrC;AAAA,EAEA,IAAI,eAAA,GAAqC;AACvC,IAAA,OAAO,IAAA,CAAK,gBAAgB,EAAC;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,aAAA,GAA4C;AAChD,IAAA,IAAI;AACF,MAAA,MAAM,WAAW,MAAM,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA,SAAA,CAAW,CAAA;AACvD,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAA,CAAO,KAAK,EAAE,MAAA,EAAQ,QAAA,CAAS,MAAA,IAAU,8BAA8B,CAAA;AACvE,QAAA,IAAA,CAAK,eAAe,EAAC;AACrB,QAAA,OAAO,EAAC;AAAA,MACV;AACA,MAAA,MAAM,IAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAClC,MAAA,IAAA,CAAK,eAAe,IAAA,CAAK,MAAA,CAAO,IAAI,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA;AACjD,MAAA,MAAA,CAAO,MAAM,EAAE,MAAA,EAAQ,IAAA,CAAK,YAAA,IAAgB,0BAA0B,CAAA;AACtE,MAAA,OAAO,IAAA,CAAK,YAAA;AAAA,IACd,SAAS,KAAA,EAAgB;AACvB,MAAA,MAAM,SAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACpE,MAAA,MAAA,CAAO,IAAA,CAAK,EAAE,KAAA,EAAO,MAAA,IAAU,sBAAsB,CAAA;AACrD,MAAA,IAAA,CAAK,eAAe,EAAC;AACrB,MAAA,OAAO,EAAC;AAAA,IACV;AAAA,EACF;AAAA,EAEA,MAAM,KAAK,OAAA,EAA+C;AACxD,IAAA,IAAA,CAAK,YAAA,CAAa,QAAQ,KAAK,CAAA;AAC/B,IAAA,MAAM,QAAA,GAAW,eAAA,CAAgB,OAAA,CAAQ,QAAQ,CAAA;AACjD,IAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,OAAA,CAAQ,KAAK,CAAA;AAExC,IAAA,IAAI,OAAA,CAAQ,WAAW,MAAA,EAAW;AAChC,MAAA,QAAA,CAAS,QAAQ,EAAE,IAAA,EAAM,UAAU,OAAA,EAAS,OAAA,CAAQ,QAAQ,CAAA;AAAA,IAC9D;AAEA,IAAA,MAAM,IAAA,GAAgC;AAAA,MACpC,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,QAAA;AAAA,MACA,MAAA,EAAQ;AAAA,KACV;AACA,IAAA,IAAI,OAAA,CAAQ,cAAc,MAAA,EAAW;AACnC,MAAA,IAAA,CAAK,YAAY,IAAI,OAAA,CAAQ,SAAA;AAAA,IAC/B;AACA,IAAA,IAAI,OAAA,CAAQ,gBAAgB,MAAA,EAAW;AACrC,MAAA,IAAA,CAAK,aAAa,IAAI,OAAA,CAAQ,WAAA;AAAA,IAChC;AACA,IAAA,IAAI,UAAU,MAAA,EAAW;AACvB,MAAA,IAAA,CAAK,OAAO,CAAA,GAAI,KAAA;AAAA,IAClB;AAEA,IAAA,MAAM,WAAW,MAAM,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA,oBAAA,CAAA,EAAwB;AAAA,MAClE,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,MAC9C,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI;AAAA,KAC1B,CAAA;AAED,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kBAAA,EAAqB,SAAS,MAAM,CAAA,GAAA,EAAM,IAAI,CAAA,CAAE,CAAA;AAAA,IAClE;AAEA,IAAA,MAAM,IAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAClC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAA;AAC7B,IAAA,IAAI,WAAW,MAAA,EAAW;AACxB,MAAA,MAAM,IAAI,MAAM,mCAAmC,CAAA;AAAA,IACrD;AAEA,IAAA,MAAM,SAAA,GAAY,iBAAiB,MAAM,CAAA;AACzC,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,KAAA,EAAO,aAAA,IAAiB,CAAA;AACjD,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,KAAA,EAAO,iBAAA,IAAqB,CAAA;AAEtD,IAAA,MAAM,KAAA,GAAqB;AAAA,MACzB,WAAA;AAAA,MACA,YAAA;AAAA,MACA,aAAa,WAAA,GAAc,YAAA;AAAA,MAC3B,OAAA,EAAS;AAAA,KACX;AAEA,IAAA,MAAM,eAAA,GAAgC;AAAA,MACpC,IAAI,IAAA,CAAK,EAAA;AAAA,MACT,IAAA,EAAM,WAAA;AAAA,MACN,OAAA,EAAS,MAAA,CAAO,OAAA,CAAQ,OAAA,IAAW,EAAA;AAAA,MACnC,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,QAAA,EAAU,aAAA;AAAA,MACV,SAAA,EAAW,SAAA,CAAU,MAAA,GAAS,CAAA,GAAI,SAAA,GAAY,MAAA;AAAA,MAC9C,UAAA,EAAY,KAAA;AAAA,MACZ,SAAA,sBAAe,IAAA;AAAK,KACtB;AAEA,IAAA,OAAO;AAAA,MACL,IAAI,IAAA,CAAK,EAAA;AAAA,MACT,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,QAAA,EAAU,aAAA;AAAA,MACV,OAAA,EAAS,eAAA;AAAA,MACT,KAAA;AAAA,MACA,YAAA,EAAc,eAAA,CAAgB,MAAA,CAAO,aAAa;AAAA,KACpD;AAAA,EACF;AAAA,EAEA,OAAO,OAAO,OAAA,EAAoD;AAChE,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,YAAA,CAAa,OAAA,CAAQ,KAAK,CAAA;AACjD,IAAA,MAAM,QAAA,GAAW,eAAA,CAAgB,OAAA,CAAQ,QAAQ,CAAA;AACjD,IAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,OAAA,CAAQ,KAAK,CAAA;AAExC,IAAA,IAAI,OAAA,CAAQ,WAAW,MAAA,EAAW;AAChC,MAAA,QAAA,CAAS,QAAQ,EAAE,IAAA,EAAM,UAAU,OAAA,EAAS,OAAA,CAAQ,QAAQ,CAAA;AAAA,IAC9D;AAEA,IAAA,MAAM,IAAA,GAAgC;AAAA,MACpC,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,QAAA;AAAA,MACA,MAAA,EAAQ;AAAA,KACV;AACA,IAAA,IAAI,OAAA,CAAQ,cAAc,MAAA,EAAW;AACnC,MAAA,IAAA,CAAK,YAAY,IAAI,OAAA,CAAQ,SAAA;AAAA,IAC/B;AACA,IAAA,IAAI,OAAA,CAAQ,gBAAgB,MAAA,EAAW;AACrC,MAAA,IAAA,CAAK,aAAa,IAAI,OAAA,CAAQ,WAAA;AAAA,IAChC;AACA,IAAA,IAAI,UAAU,MAAA,EAAW;AACvB,MAAA,IAAA,CAAK,OAAO,CAAA,GAAI,KAAA;AAAA,IAClB;AAEA,IAAA,MAAM,WAAW,MAAM,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA,oBAAA,CAAA,EAAwB;AAAA,MAClE,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,MAC9C,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI;AAAA,KAC1B,CAAA;AAED,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,MAAA,MAAM,EAAE,MAAM,OAAA,EAAS,KAAA,EAAO,qBAAqB,QAAA,CAAS,MAAM,CAAA,GAAA,EAAM,IAAI,CAAA,CAAA,EAAG;AAC/E,MAAA,MAAM,EAAE,MAAM,MAAA,EAAO;AACrB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,QAAA,CAAS,SAAS,IAAA,EAAM;AAC1B,MAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,mCAAA,EAAoC;AAClE,MAAA,MAAM,EAAE,MAAM,MAAA,EAAO;AACrB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,OAAO,IAAA,CAAK,cAAA,CAAe,QAAA,CAAS,IAAA,EAAM,SAAS,CAAA;AACnD,MAAA,MAAM,EAAE,MAAM,MAAA,EAAO;AAAA,IACvB,SAAS,KAAA,EAAgB;AACvB,MAAA,MAAM,SAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACpE,MAAA,MAAA,CAAO,KAAA,CAAM,EAAE,KAAA,EAAO,MAAA,EAAQ,OAAO,OAAA,CAAQ,KAAA,IAAS,qBAAqB,CAAA;AAC3E,MAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,MAAA,EAAO;AACrC,MAAA,MAAM,EAAE,MAAM,MAAA,EAAO;AAAA,IACvB;AAAA,EACF;AAAA,EAEA,WAAA,CAAY,MAAc,MAAA,EAAiC;AACzD,IAAA,OAAO,QAAQ,OAAA,CAAQ,IAAA,CAAK,KAAK,IAAA,CAAK,MAAA,GAAS,wBAAwB,CAAC,CAAA;AAAA,EAC1E;AAAA,EAEA,aAAa,KAAA,EAA2B;AACtC,IAAA,MAAM,UAAA,GAAa,iBAAiB,KAAK,CAAA;AACzC,IAAA,IAAI,UAAA,KAAe,MAAA,IAAa,UAAA,CAAW,QAAA,KAAa,aAAA,EAAe;AACrE,MAAA,OAAO,UAAA;AAAA,IACT;AACA,IAAA,IAAI,KAAK,YAAA,KAAiB,MAAA,IAAa,KAAK,YAAA,CAAa,QAAA,CAAS,KAAK,CAAA,EAAG;AACxE,MAAA,OAAO,oBAAoB,KAAK,CAAA;AAAA,IAClC;AACA,IAAA,OAAO,oBAAoB,KAAK,CAAA;AAAA,EAClC;AAAA,EAEA,MAAM,mBAAA,GAAkD;AACtD,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,aAAA,EAAc;AACxC,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,OAAe,cAAA,CACb,IAAA,EACA,UAAA,EAC6B;AAC7B,IAAA,MAAM,MAAA,GAAS,KAAK,SAAA,EAAU;AAC9B,IAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAChC,IAAA,IAAI,MAAA,GAAS,EAAA;AAEb,IAAA,IAAI;AACF,MAAA,WAAS;AACP,QAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,OAAO,IAAA,EAAK;AAC1C,QAAA,IAAI,IAAA,EAAM;AACR,UAAA;AAAA,QACF;AAEA,QAAA,MAAA,IAAU,QAAQ,MAAA,CAAO,KAAA,EAAO,EAAE,MAAA,EAAQ,MAAM,CAAA;AAChD,QAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA;AAC/B,QAAA,MAAA,GAAS,KAAA,CAAM,KAAI,IAAK,EAAA;AAExB,QAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,UAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAC1B,UAAA,IAAI,OAAA,KAAY,EAAA,IAAM,OAAA,KAAY,cAAA,EAAgB;AAChD,YAAA;AAAA,UACF;AACA,UAAA,IAAI,CAAC,OAAA,CAAQ,UAAA,CAAW,QAAQ,CAAA,EAAG;AACjC,YAAA;AAAA,UACF;AAEA,UAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,KAAA,CAAM,CAAC,CAAA;AAC/B,UAAA,IAAI,MAAA;AAaJ,UAAA,IAAI;AACF,YAAA,MAAA,GAAS,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,UAC7B,CAAA,CAAA,MAAQ;AACN,YAAA;AAAA,UACF;AAEA,UAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,OAAA,GAAU,CAAC,CAAA,EAAG,KAAA;AACnC,UAAA,IAAI,KAAA,EAAO,OAAA,KAAY,KAAA,CAAA,IAAa,KAAA,CAAM,YAAY,EAAA,EAAI;AACxD,YAAA,MAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,MAAM,OAAA,EAAQ;AAAA,UAC/C;AAEA,UAAA,IAAI,KAAA,EAAO,eAAe,KAAA,CAAA,EAAW;AACnC,YAAA,KAAA,MAAW,EAAA,IAAM,MAAM,UAAA,EAAY;AACjC,cAAA,IAAI,GAAG,EAAA,KAAO,KAAA,CAAA,IAAa,EAAA,CAAG,QAAA,EAAU,SAAS,KAAA,CAAA,EAAW;AAC1D,gBAAA,IAAI,OAAgC,EAAC;AACrC,gBAAA,IAAI,EAAA,CAAG,QAAA,CAAS,SAAA,KAAc,KAAA,CAAA,EAAW;AACvC,kBAAA,IAAI;AACF,oBAAA,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,EAAA,CAAG,QAAA,CAAS,SAAS,CAAA;AAAA,kBACzC,CAAA,CAAA,MAAQ;AACN,oBAAA,IAAA,GAAO,EAAC;AAAA,kBACV;AAAA,gBACF;AACA,gBAAA,MAAM;AAAA,kBACJ,IAAA,EAAM,WAAA;AAAA,kBACN,QAAA,EAAU,EAAE,EAAA,EAAI,EAAA,CAAG,EAAA,EAAI,MAAM,EAAA,CAAG,QAAA,CAAS,IAAA,EAAM,SAAA,EAAW,IAAA;AAAK,iBACjE;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAEA,UAAA,IAAI,MAAA,CAAO,UAAU,KAAA,CAAA,EAAW;AAC9B,YAAA,MAAM;AAAA,cACJ,IAAA,EAAM,OAAA;AAAA,cACN,KAAA,EAAO;AAAA,gBACL,WAAA,EAAa,OAAO,KAAA,CAAM,aAAA;AAAA,gBAC1B,YAAA,EAAc,OAAO,KAAA,CAAM,iBAAA;AAAA,gBAC3B,WAAA,EAAa,OAAO,KAAA,CAAM,YAAA;AAAA,gBAC1B,OAAA,EAAS;AAAA;AACX,aACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAA,SAAE;AACA,MAAA,MAAA,CAAO,WAAA,EAAY;AAAA,IACrB;AAAA,EACF;AACF;AAEA,SAAS,iBAAiB,MAAA,EAAmC;AAC3D,EAAA,IAAI,MAAA,CAAO,QAAQ,UAAA,KAAe,MAAA,IAAa,OAAO,OAAA,CAAQ,UAAA,CAAW,WAAW,CAAA,EAAG;AACrF,IAAA,OAAO,EAAC;AAAA,EACV;AACA,EAAA,OAAO,MAAA,CAAO,OAAA,CAAQ,UAAA,CAAW,GAAA,CAAI,CAAC,EAAA,KAAO;AAC3C,IAAA,IAAI,OAAgC,EAAC;AACrC,IAAA,IAAI;AACF,MAAA,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,EAAA,CAAG,QAAA,CAAS,SAAS,CAAA;AAAA,IACzC,CAAA,CAAA,MAAQ;AACN,MAAA,IAAA,GAAO,EAAC;AAAA,IACV;AACA,IAAA,OAAO,EAAE,IAAI,EAAA,CAAG,EAAA,EAAI,MAAM,EAAA,CAAG,QAAA,CAAS,IAAA,EAAM,SAAA,EAAW,IAAA,EAAK;AAAA,EAC9D,CAAC,CAAA;AACH;AAEA,SAAS,gBACP,MAAA,EACgD;AAChD,EAAA,QAAQ,MAAA;AAAQ,IACd,KAAK,MAAA;AACH,MAAA,OAAO,MAAA;AAAA,IACT,KAAK,YAAA;AACH,MAAA,OAAO,YAAA;AAAA,IACT,KAAK,QAAA;AACH,MAAA,OAAO,YAAA;AAAA,IACT;AACE,MAAA,OAAO,MAAA;AAAA;AAEb","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 { SUPPORTED_MODELS } from './chunk-HCIHOHLX.js';
2
1
  import { ModelNotFoundError, AuthenticationError, RateLimitError } from './chunk-ZGOHARPV.js';
3
- import { logger } from './chunk-JAXXTYID.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";
@@ -8,10 +8,41 @@ var DEFAULT_BASE_URL = "https://api.moonshot.cn/v1";
8
8
  var KIMI_MODELS = ["kimi-for-coding"];
9
9
  var CHARS_PER_TOKEN_ESTIMATE = 4;
10
10
  function convertMessages(messages) {
11
- return messages.map((msg) => ({
12
- role: msg.role,
13
- content: msg.content
14
- }));
11
+ const converted = [];
12
+ for (const msg of messages) {
13
+ if (msg.role === "assistant" && msg.toolCalls !== void 0 && msg.toolCalls.length > 0) {
14
+ converted.push({
15
+ role: "assistant",
16
+ content: msg.content.length > 0 ? msg.content : null,
17
+ tool_calls: msg.toolCalls.map((toolCall) => ({
18
+ id: toolCall.id,
19
+ type: "function",
20
+ function: {
21
+ name: toolCall.name,
22
+ arguments: JSON.stringify(toolCall.arguments)
23
+ }
24
+ }))
25
+ });
26
+ continue;
27
+ }
28
+ if (msg.role === "tool") {
29
+ const toolCall = msg.toolCalls?.[0];
30
+ if (toolCall !== void 0) {
31
+ converted.push({
32
+ role: "tool",
33
+ content: msg.content,
34
+ tool_call_id: toolCall.id,
35
+ name: toolCall.name
36
+ });
37
+ continue;
38
+ }
39
+ }
40
+ converted.push({
41
+ role: msg.role,
42
+ content: msg.content
43
+ });
44
+ }
45
+ return converted;
15
46
  }
16
47
  function convertTools(tools) {
17
48
  if (tools === void 0 || tools.length === 0) {
@@ -64,6 +95,7 @@ async function handleResponseError(response, model) {
64
95
  var KimiAdapter = class {
65
96
  name = PROVIDER_NAME;
66
97
  supportedModels = KIMI_MODELS;
98
+ supportsToolCalling = true;
67
99
  baseUrl;
68
100
  apiKey;
69
101
  constructor(options) {
@@ -178,8 +210,8 @@ var KimiAdapter = class {
178
210
  yield { type: "done" };
179
211
  }
180
212
  }
181
- async countTokens(text, _model) {
182
- return Math.ceil(text.length / CHARS_PER_TOKEN_ESTIMATE);
213
+ countTokens(text, _model) {
214
+ return Promise.resolve(Math.ceil(text.length / CHARS_PER_TOKEN_ESTIMATE));
183
215
  }
184
216
  getModelInfo(model) {
185
217
  const info = SUPPORTED_MODELS[model];
@@ -307,5 +339,5 @@ function mapFinishReason(reason) {
307
339
  }
308
340
 
309
341
  export { KimiAdapter };
310
- //# sourceMappingURL=chunk-MXZSI3AY.js.map
311
- //# sourceMappingURL=chunk-MXZSI3AY.js.map
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"]}
@@ -0,0 +1,71 @@
1
+ // src/orchestrator/utils/provider-catalog.ts
2
+ var CLI_PROVIDER_CATALOG = {
3
+ "claude-code": {
4
+ type: "claude-code",
5
+ provider: "anthropic",
6
+ binary: "claude",
7
+ label: "Claude Code",
8
+ description: "Anthropic native CLI agent",
9
+ loginProvider: "claude",
10
+ localOnly: false,
11
+ startCommand: () => "claude --dangerously-skip-permissions"
12
+ },
13
+ codex: {
14
+ type: "codex",
15
+ provider: "openai",
16
+ binary: "codex",
17
+ label: "Codex",
18
+ description: "OpenAI native CLI agent",
19
+ loginProvider: "codex",
20
+ localOnly: false,
21
+ startCommand: () => "codex --full-auto"
22
+ },
23
+ "gemini-cli": {
24
+ type: "gemini-cli",
25
+ provider: "google",
26
+ binary: "gemini",
27
+ label: "Gemini CLI",
28
+ description: "Google native CLI agent",
29
+ loginProvider: "gemini",
30
+ localOnly: false,
31
+ startCommand: () => "gemini"
32
+ },
33
+ "kimi-cli": {
34
+ type: "kimi-cli",
35
+ provider: "kimi",
36
+ binary: "kimi",
37
+ label: "Kimi CLI",
38
+ description: "Moonshot native CLI agent",
39
+ loginProvider: "kimi",
40
+ localOnly: false,
41
+ startCommand: () => "kimi"
42
+ },
43
+ ollama: {
44
+ type: "ollama",
45
+ provider: "ollama",
46
+ binary: "ollama",
47
+ label: "Ollama",
48
+ description: "Local agent runtime",
49
+ localOnly: true,
50
+ startCommand: (model) => `ollama run ${model ?? "llama3"}`
51
+ }
52
+ };
53
+ var CLI_PROVIDER_ORDER = [
54
+ "claude-code",
55
+ "codex",
56
+ "gemini-cli",
57
+ "kimi-cli",
58
+ "ollama"
59
+ ];
60
+ function getCliProviderEntry(provider) {
61
+ return CLI_PROVIDER_CATALOG[provider];
62
+ }
63
+ function getCliProviderForModelProvider(provider) {
64
+ return CLI_PROVIDER_ORDER.find(
65
+ (cliProvider) => CLI_PROVIDER_CATALOG[cliProvider].provider === provider
66
+ );
67
+ }
68
+
69
+ export { CLI_PROVIDER_ORDER, getCliProviderEntry, getCliProviderForModelProvider };
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,12 @@
1
+ // src/orchestrator/constants.ts
2
+ var CLI_PROVIDERS = [
3
+ "claude-code",
4
+ "codex",
5
+ "gemini-cli",
6
+ "kimi-cli",
7
+ "ollama"
8
+ ];
9
+
10
+ export { CLI_PROVIDERS };
11
+ //# sourceMappingURL=chunk-M3FPQSRU.js.map
12
+ //# sourceMappingURL=chunk-M3FPQSRU.js.map
@@ -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"]}