aemeathcli 1.0.10 → 1.0.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (208) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +609 -608
  3. package/dist/App-YAHJUWCX.js +4274 -0
  4. package/dist/App-YAHJUWCX.js.map +1 -0
  5. package/dist/agent-store/architect.md +32 -0
  6. package/dist/agent-store/debugger.md +32 -0
  7. package/dist/agent-store/developer.md +29 -0
  8. package/dist/agent-store/documenter.md +30 -0
  9. package/dist/agent-store/researcher.md +31 -0
  10. package/dist/agent-store/reviewer.md +28 -0
  11. package/dist/agent-store/supervisor.md +37 -0
  12. package/dist/agent-store/tester.md +30 -0
  13. package/dist/api-key-fallback-UN3TJEOO.js +11 -0
  14. package/dist/{api-key-fallback-YQQBOQIL.js.map → api-key-fallback-UN3TJEOO.js.map} +1 -1
  15. package/dist/auth-status-EIM5A5KL.js +13 -0
  16. package/dist/auth-status-EIM5A5KL.js.map +1 -0
  17. package/dist/{chunk-UY2SYSEZ.js → chunk-25UNNEHN.js} +32 -103
  18. package/dist/chunk-25UNNEHN.js.map +1 -0
  19. package/dist/{chunk-CYQNBB25.js → chunk-2GKOK6T7.js} +28 -5
  20. package/dist/chunk-2GKOK6T7.js.map +1 -0
  21. package/dist/{chunk-MFBHNWGV.js → chunk-2LF7ALGR.js} +12 -20
  22. package/dist/chunk-2LF7ALGR.js.map +1 -0
  23. package/dist/{chunk-H66O5Z2V.js → chunk-2NWNIKBK.js} +42 -7
  24. package/dist/chunk-2NWNIKBK.js.map +1 -0
  25. package/dist/chunk-3TSPZRGM.js +26 -0
  26. package/dist/chunk-3TSPZRGM.js.map +1 -0
  27. package/dist/{chunk-ZGOHARPV.js → chunk-473JN6M5.js} +2 -2
  28. package/dist/chunk-473JN6M5.js.map +1 -0
  29. package/dist/{chunk-IYW62KKR.js → chunk-5XFSV6PF.js} +66 -23
  30. package/dist/chunk-5XFSV6PF.js.map +1 -0
  31. package/dist/{chunk-HCIHOHLX.js → chunk-62HSGYQD.js} +2 -2
  32. package/dist/chunk-62HSGYQD.js.map +1 -0
  33. package/dist/{chunk-I5PZ4JTS.js → chunk-6GUD7QIM.js} +4 -4
  34. package/dist/chunk-6GUD7QIM.js.map +1 -0
  35. package/dist/{chunk-4IJD72YB.js → chunk-AQ23TYSQ.js} +7 -7
  36. package/dist/chunk-AQ23TYSQ.js.map +1 -0
  37. package/dist/{chunk-NBR3GHMT.js → chunk-BY4DAKUU.js} +39 -7
  38. package/dist/chunk-BY4DAKUU.js.map +1 -0
  39. package/dist/chunk-CC7MGWYY.js +12 -0
  40. package/dist/chunk-CC7MGWYY.js.map +1 -0
  41. package/dist/chunk-CTFZTARK.js +155 -0
  42. package/dist/chunk-CTFZTARK.js.map +1 -0
  43. package/dist/chunk-FIC7AK4Q.js +232 -0
  44. package/dist/chunk-FIC7AK4Q.js.map +1 -0
  45. package/dist/chunk-GU33WKPG.js +140 -0
  46. package/dist/chunk-GU33WKPG.js.map +1 -0
  47. package/dist/{chunk-DMBPX3RG.js → chunk-H2SYKIMI.js} +10 -10
  48. package/dist/chunk-H2SYKIMI.js.map +1 -0
  49. package/dist/{chunk-JAXXTYID.js → chunk-HEKFAKVH.js} +2 -2
  50. package/dist/chunk-HEKFAKVH.js.map +1 -0
  51. package/dist/chunk-IARA5XYP.js +186 -0
  52. package/dist/chunk-IARA5XYP.js.map +1 -0
  53. package/dist/{chunk-HMJRPNPZ.js → chunk-LCYH4T6N.js} +95 -23
  54. package/dist/chunk-LCYH4T6N.js.map +1 -0
  55. package/dist/{chunk-CARHU3DO.js → chunk-LDVY5ELP.js} +66 -18
  56. package/dist/chunk-LDVY5ELP.js.map +1 -0
  57. package/dist/chunk-OCJPQFOR.js +88 -0
  58. package/dist/chunk-OCJPQFOR.js.map +1 -0
  59. package/dist/chunk-ODBY7S4X.js +141 -0
  60. package/dist/chunk-ODBY7S4X.js.map +1 -0
  61. package/dist/{chunk-DAHGLHNR.js → chunk-ONQ4WCUI.js} +7 -142
  62. package/dist/chunk-ONQ4WCUI.js.map +1 -0
  63. package/dist/{chunk-WPP3PEDE.js → chunk-P5TKZM3T.js} +32 -107
  64. package/dist/chunk-P5TKZM3T.js.map +1 -0
  65. package/dist/{chunk-RWCNNAL7.js → chunk-P66WDACW.js} +23 -22
  66. package/dist/chunk-P66WDACW.js.map +1 -0
  67. package/dist/{chunk-LSOYPSAT.js → chunk-QCRK4QEL.js} +4 -4
  68. package/dist/chunk-QCRK4QEL.js.map +1 -0
  69. package/dist/{chunk-YL5XFHR3.js → chunk-ROJPFPJ7.js} +2 -2
  70. package/dist/chunk-ROJPFPJ7.js.map +1 -0
  71. package/dist/chunk-RP2TAL3J.js +71 -0
  72. package/dist/chunk-RP2TAL3J.js.map +1 -0
  73. package/dist/{chunk-6PDJ45T4.js → chunk-RYOB3TLZ.js} +51 -26
  74. package/dist/chunk-RYOB3TLZ.js.map +1 -0
  75. package/dist/{chunk-Y5XVD2CD.js → chunk-SOQFMNQC.js} +110 -83
  76. package/dist/chunk-SOQFMNQC.js.map +1 -0
  77. package/dist/{chunk-TEVZS4FA.js → chunk-TDFTX32B.js} +16 -9
  78. package/dist/chunk-TDFTX32B.js.map +1 -0
  79. package/dist/chunk-VBLLDY4R.js +38 -0
  80. package/dist/chunk-VBLLDY4R.js.map +1 -0
  81. package/dist/{chunk-CGEV3ARR.js → chunk-VJNQJALF.js} +4 -4
  82. package/dist/chunk-VJNQJALF.js.map +1 -0
  83. package/dist/chunk-WAYSJMPS.js +26 -0
  84. package/dist/chunk-WAYSJMPS.js.map +1 -0
  85. package/dist/chunk-WC72BRHR.js +241 -0
  86. package/dist/chunk-WC72BRHR.js.map +1 -0
  87. package/dist/{chunk-MXZSI3AY.js → chunk-YPFOE2QJ.js} +43 -11
  88. package/dist/chunk-YPFOE2QJ.js.map +1 -0
  89. package/dist/claude-adapter-6P4SJH7P.js +7 -0
  90. package/dist/{claude-adapter-QMLFMSP3.js.map → claude-adapter-6P4SJH7P.js.map} +1 -1
  91. package/dist/{claude-login-5WELXPKT.js → claude-login-IS5WTBMP.js} +10 -10
  92. package/dist/claude-login-IS5WTBMP.js.map +1 -0
  93. package/dist/cli.js +371 -172
  94. package/dist/cli.js.map +1 -1
  95. package/dist/{codex-login-GZIFXUWD.js → codex-login-GMPF64MR.js} +11 -11
  96. package/dist/codex-login-GMPF64MR.js.map +1 -0
  97. package/dist/config-store-POB6I37G.js +7 -0
  98. package/dist/{config-store-W6FBCQAQ.js.map → config-store-POB6I37G.js.map} +1 -1
  99. package/dist/conversation-store-PRBHWQMJ.js +4 -0
  100. package/dist/conversation-store-PRBHWQMJ.js.map +1 -0
  101. package/dist/detect-providers-C4SVQHFF.js +4 -0
  102. package/dist/detect-providers-C4SVQHFF.js.map +1 -0
  103. package/dist/executor-RUX7VK3T.js +4 -0
  104. package/dist/{executor-6RIKIGXK.js.map → executor-RUX7VK3T.js.map} +1 -1
  105. package/dist/first-run-GDEVRFPO.js +230 -0
  106. package/dist/first-run-GDEVRFPO.js.map +1 -0
  107. package/dist/gemini-adapter-MV3U4QFH.js +7 -0
  108. package/dist/{gemini-adapter-6JIHZ7WI.js.map → gemini-adapter-MV3U4QFH.js.map} +1 -1
  109. package/dist/{gemini-login-AZGL3CE7.js → gemini-login-KE224MSW.js} +10 -10
  110. package/dist/gemini-login-KE224MSW.js.map +1 -0
  111. package/dist/index.d.ts +47 -17
  112. package/dist/index.js +86 -471
  113. package/dist/index.js.map +1 -1
  114. package/dist/input-history-MIOO3FIW.js +57 -0
  115. package/dist/input-history-MIOO3FIW.js.map +1 -0
  116. package/dist/kimi-adapter-UODMNX6K.js +6 -0
  117. package/dist/{kimi-adapter-JN4HFFHU.js.map → kimi-adapter-UODMNX6K.js.map} +1 -1
  118. package/dist/{kimi-login-6LUWB7P6.js → kimi-login-DNT5YBKX.js} +10 -10
  119. package/dist/kimi-login-DNT5YBKX.js.map +1 -0
  120. package/dist/logger-PLPDWACQ.js +3 -0
  121. package/dist/logger-PLPDWACQ.js.map +1 -0
  122. package/dist/model-discovery-O64ZWPX5.js +6 -0
  123. package/dist/model-discovery-O64ZWPX5.js.map +1 -0
  124. package/dist/native-cli-adapters-JMZX2C2C.js +8 -0
  125. package/dist/{native-cli-adapters-OLW3XX57.js.map → native-cli-adapters-JMZX2C2C.js.map} +1 -1
  126. package/dist/ollama-adapter-GE67BNSS.js +5 -0
  127. package/dist/{ollama-adapter-OJQ3FKWK.js.map → ollama-adapter-GE67BNSS.js.map} +1 -1
  128. package/dist/openai-adapter-SHPLK77L.js +7 -0
  129. package/dist/{openai-adapter-XU46EN7B.js.map → openai-adapter-SHPLK77L.js.map} +1 -1
  130. package/dist/pathResolver-A6IXQQFE.js +3 -0
  131. package/dist/pathResolver-A6IXQQFE.js.map +1 -0
  132. package/dist/profile-loader-TNAXBLDX.js +162 -0
  133. package/dist/profile-loader-TNAXBLDX.js.map +1 -0
  134. package/dist/registry-3NHVCXCZ.js +6 -0
  135. package/dist/{registry-AZ2LOHHJ.js.map → registry-3NHVCXCZ.js.map} +1 -1
  136. package/dist/registry-7CQ3NCAD.js +5 -0
  137. package/dist/{registry-H7B3AHPQ.js.map → registry-7CQ3NCAD.js.map} +1 -1
  138. package/dist/server-manager-DES23IBQ.js +5 -0
  139. package/dist/{server-manager-PTGBHCLS.js.map → server-manager-DES23IBQ.js.map} +1 -1
  140. package/dist/session-manager-EHD7GWM2.js +12 -0
  141. package/dist/{session-manager-XOMDMC77.js.map → session-manager-EHD7GWM2.js.map} +1 -1
  142. package/dist/skills/built-in/code-review/SKILL.md +85 -0
  143. package/dist/skills/built-in/commit/SKILL.md +83 -0
  144. package/dist/skills/built-in/debug/SKILL.md +119 -0
  145. package/dist/skills/built-in/plan/SKILL.md +123 -0
  146. package/dist/skills/built-in/refactor/SKILL.md +132 -0
  147. package/dist/skills/built-in/test/SKILL.md +128 -0
  148. package/dist/sqlite-store-7ZIVOUNI.js +5 -0
  149. package/dist/sqlite-store-7ZIVOUNI.js.map +1 -0
  150. package/dist/team-manager-6DCNLGTC.js +11 -0
  151. package/dist/{team-manager-HC4XGCFY.js.map → team-manager-6DCNLGTC.js.map} +1 -1
  152. package/dist/team-state-R2D7DT5M.js +3 -0
  153. package/dist/team-state-R2D7DT5M.js.map +1 -0
  154. package/dist/tmux-manager-WBKHUHDT.js +6 -0
  155. package/dist/{tmux-manager-GPYZ3WQH.js.map → tmux-manager-WBKHUHDT.js.map} +1 -1
  156. package/dist/tools-I6XCTEZY.js +6 -0
  157. package/dist/{tools-TSMXMHIF.js.map → tools-I6XCTEZY.js.map} +1 -1
  158. package/package.json +93 -89
  159. package/dist/App-FKRSMFMB.js +0 -2789
  160. package/dist/App-FKRSMFMB.js.map +0 -1
  161. package/dist/api-key-fallback-YQQBOQIL.js +0 -11
  162. package/dist/chunk-4IJD72YB.js.map +0 -1
  163. package/dist/chunk-6PDJ45T4.js.map +0 -1
  164. package/dist/chunk-CARHU3DO.js.map +0 -1
  165. package/dist/chunk-CGEV3ARR.js.map +0 -1
  166. package/dist/chunk-CS5X3BWX.js +0 -27
  167. package/dist/chunk-CS5X3BWX.js.map +0 -1
  168. package/dist/chunk-CYQNBB25.js.map +0 -1
  169. package/dist/chunk-DAHGLHNR.js.map +0 -1
  170. package/dist/chunk-DMBPX3RG.js.map +0 -1
  171. package/dist/chunk-H66O5Z2V.js.map +0 -1
  172. package/dist/chunk-HCIHOHLX.js.map +0 -1
  173. package/dist/chunk-HMJRPNPZ.js.map +0 -1
  174. package/dist/chunk-I5PZ4JTS.js.map +0 -1
  175. package/dist/chunk-IYW62KKR.js.map +0 -1
  176. package/dist/chunk-JAXXTYID.js.map +0 -1
  177. package/dist/chunk-LSOYPSAT.js.map +0 -1
  178. package/dist/chunk-MFBHNWGV.js.map +0 -1
  179. package/dist/chunk-MXZSI3AY.js.map +0 -1
  180. package/dist/chunk-NBR3GHMT.js.map +0 -1
  181. package/dist/chunk-RWCNNAL7.js.map +0 -1
  182. package/dist/chunk-TEVZS4FA.js.map +0 -1
  183. package/dist/chunk-UY2SYSEZ.js.map +0 -1
  184. package/dist/chunk-WAHVZH7V.js +0 -260
  185. package/dist/chunk-WAHVZH7V.js.map +0 -1
  186. package/dist/chunk-WPP3PEDE.js.map +0 -1
  187. package/dist/chunk-Y5XVD2CD.js.map +0 -1
  188. package/dist/chunk-YL5XFHR3.js.map +0 -1
  189. package/dist/chunk-ZGOHARPV.js.map +0 -1
  190. package/dist/claude-adapter-QMLFMSP3.js +0 -6
  191. package/dist/claude-login-5WELXPKT.js.map +0 -1
  192. package/dist/codex-login-GZIFXUWD.js.map +0 -1
  193. package/dist/config-store-W6FBCQAQ.js +0 -6
  194. package/dist/executor-6RIKIGXK.js +0 -4
  195. package/dist/gemini-adapter-6JIHZ7WI.js +0 -6
  196. package/dist/gemini-login-AZGL3CE7.js.map +0 -1
  197. package/dist/kimi-adapter-JN4HFFHU.js +0 -6
  198. package/dist/kimi-login-6LUWB7P6.js.map +0 -1
  199. package/dist/native-cli-adapters-OLW3XX57.js +0 -6
  200. package/dist/ollama-adapter-OJQ3FKWK.js +0 -6
  201. package/dist/openai-adapter-XU46EN7B.js +0 -6
  202. package/dist/registry-AZ2LOHHJ.js +0 -6
  203. package/dist/registry-H7B3AHPQ.js +0 -5
  204. package/dist/server-manager-PTGBHCLS.js +0 -5
  205. package/dist/session-manager-XOMDMC77.js +0 -12
  206. package/dist/team-manager-HC4XGCFY.js +0 -11
  207. package/dist/tmux-manager-GPYZ3WQH.js +0 -6
  208. package/dist/tools-TSMXMHIF.js +0 -6
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/providers/registry.ts"],"names":["provider"],"mappings":"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","file":"chunk-P66WDACW.js","sourcesContent":["/**\r\n * Provider registry per PRD section 7.1\r\n * Central registry for provider adapters — register, resolve, list.\r\n */\r\n\r\nimport { logger } from \"../utils/logger.js\";\r\nimport { ModelNotFoundError } from \"../types/errors.js\";\r\nimport { SUPPORTED_MODELS } from \"../types/model.js\";\r\nimport type { IModelInfo } from \"../types/model.js\";\r\nimport type { IModelProvider, IProviderRegistryOptions } from \"./types.js\";\r\n\r\n/**\r\n * Singleton registry that maps provider names and model IDs to provider adapters.\r\n */\r\nexport class ProviderRegistry {\r\n private readonly providers = new Map<string, IModelProvider>();\r\n private readonly modelToProvider = new Map<string, string>();\r\n\r\n /**\r\n * Register a provider adapter.\r\n * Automatically indexes all supported models to this provider.\r\n */\r\n register(provider: IModelProvider): void {\r\n this.providers.set(provider.name, provider);\r\n\r\n for (const modelId of provider.supportedModels) {\r\n this.modelToProvider.set(modelId, provider.name);\r\n }\r\n\r\n logger.debug(\r\n { provider: provider.name, models: provider.supportedModels },\r\n \"Provider registered\",\r\n );\r\n }\r\n\r\n /**\r\n * Get a provider adapter by its name (e.g. \"anthropic\", \"openai\").\r\n */\r\n getByName(name: string): IModelProvider | undefined {\r\n return this.providers.get(name);\r\n }\r\n\r\n /**\r\n * Get the provider adapter that supports a given model ID.\r\n * @throws ModelNotFoundError if no provider serves this model.\r\n */\r\n getForModel(modelId: string): IModelProvider {\r\n const providerName = this.modelToProvider.get(modelId);\r\n if (providerName === undefined) {\r\n throw new ModelNotFoundError(modelId);\r\n }\r\n\r\n const provider = this.providers.get(providerName);\r\n if (provider === undefined) {\r\n throw new ModelNotFoundError(modelId);\r\n }\r\n\r\n return provider;\r\n }\r\n\r\n /**\r\n * Resolve a model string to its provider.\r\n * Supports both model IDs (\"claude-sonnet-4-6\") and provider-prefixed\r\n * forms (\"anthropic:claude-sonnet-4-6\").\r\n */\r\n resolve(modelString: string): { provider: IModelProvider; modelId: string } {\r\n const colonIndex = modelString.indexOf(\":\");\r\n if (colonIndex !== -1) {\r\n const providerName = modelString.slice(0, colonIndex);\r\n const modelId = modelString.slice(colonIndex + 1);\r\n const provider = this.providers.get(providerName);\r\n if (provider === undefined) {\r\n throw new ModelNotFoundError(modelString);\r\n }\r\n return { provider, modelId };\r\n }\r\n\r\n const provider = this.getForModel(modelString);\r\n return { provider, modelId: modelString };\r\n }\r\n\r\n /**\r\n * List all registered model IDs across all providers.\r\n */\r\n listModels(): readonly IModelInfo[] {\r\n const models: IModelInfo[] = [];\r\n\r\n for (const provider of this.providers.values()) {\r\n for (const modelId of provider.supportedModels) {\r\n const info = SUPPORTED_MODELS[modelId];\r\n if (info !== undefined) {\r\n models.push(info);\r\n }\r\n }\r\n }\r\n\r\n return models;\r\n }\r\n\r\n /**\r\n * List all registered provider names.\r\n */\r\n listProviders(): readonly string[] {\r\n return [...this.providers.keys()];\r\n }\r\n\r\n /**\r\n * Check if a model ID is supported by any registered provider.\r\n */\r\n hasModel(modelId: string): boolean {\r\n return this.modelToProvider.has(modelId);\r\n }\r\n\r\n /**\r\n * Check if a provider is registered.\r\n */\r\n hasProvider(name: string): boolean {\r\n return this.providers.has(name);\r\n }\r\n\r\n /**\r\n * List available models from all providers.\r\n * Uses dynamic API listing where supported, falls back to static models.\r\n */\r\n async listAllAvailableModels(): Promise<Map<string, readonly string[]>> {\r\n const entries = [...this.providers.entries()];\r\n const fetched = await Promise.all(\r\n entries.map(async ([name, provider]): Promise<[string, readonly string[]]> => {\r\n if (typeof provider.listAvailableModels === \"function\") {\r\n try {\r\n return [name, await provider.listAvailableModels()];\r\n } catch {\r\n return [name, [...provider.supportedModels]];\r\n }\r\n }\r\n return [name, [...provider.supportedModels]];\r\n }),\r\n );\r\n\r\n const result = new Map<string, readonly string[]>();\r\n fetched.sort(([a], [b]) => a.localeCompare(b));\r\n for (const [name, models] of fetched) {\r\n result.set(name, models);\r\n }\r\n\r\n return result;\r\n }\r\n}\r\n\r\n/**\r\n * Create a pre-populated registry with all available providers.\r\n * Resolves credentials via SessionManager (CLI delegation, API keys, env vars).\r\n */\r\nexport async function createDefaultRegistry(\r\n options: IProviderRegistryOptions = {},\r\n): Promise<ProviderRegistry> {\r\n const registry = new ProviderRegistry();\r\n\r\n const { SessionManager } = await import(\"../auth/session-manager.js\");\r\n const session = new SessionManager();\r\n const { execa } = await import(\"execa\");\r\n\r\n // When AEMEATHCLI_PREFER_SDK=1 (set for agent child processes), prefer\r\n // SDK-based adapters over native CLI adapters. Native CLI adapters shell\r\n // out to external binaries whose raw JSON output can interfere with IPC\r\n // streaming. Falls back to native only when no API key is available.\r\n const preferSdk = options.preferSdk ?? process.env[\"AEMEATHCLI_PREFER_SDK\"] === \"1\";\r\n\r\n const cliAvailability = new Map<string, boolean>();\r\n const hasCli = async (command: string): Promise<boolean> => {\r\n const cached = cliAvailability.get(command);\r\n if (cached !== undefined) {\r\n return cached;\r\n }\r\n\r\n const pathLookupCommand = process.platform === \"win32\" ? \"where\" : \"which\";\r\n\r\n try {\r\n await execa(pathLookupCommand, [command], { timeout: 3000 });\r\n cliAvailability.set(command, true);\r\n return true;\r\n } catch {\r\n cliAvailability.set(command, false);\r\n return false;\r\n }\r\n };\r\n\r\n /** Determine whether to use a native CLI adapter for a provider. */\r\n const shouldUseNative = async (\r\n credential: { method: string; token?: string | undefined } | undefined,\r\n cliCommand: string,\r\n envKeyName: string,\r\n ): Promise<boolean> => {\r\n const hasApiKey =\r\n credential?.method === \"api_key\"\r\n || credential?.method === \"env_variable\"\r\n || process.env[envKeyName] !== undefined;\r\n\r\n // When preferSdk is set, prefer SDK adapters whenever an API key or\r\n // environment credential is available, even if a native CLI login exists.\r\n if (preferSdk && hasApiKey) {\r\n return false;\r\n }\r\n\r\n // Native login credentials (OAuth sessions) must always use the native CLI\r\n // adapter. The stored token is an OAuth session token, NOT an API key — SDK\r\n // adapters will reject it with \"invalid x-api-key\" / \"API key not valid\".\r\n if (credential?.method === \"native_login\") {\r\n return await hasCli(cliCommand);\r\n }\r\n\r\n // When preferSdk is set, only use native if SDK has no way to authenticate.\r\n if (preferSdk) {\r\n // No API key available — fall back to native if CLI exists.\r\n return await hasCli(cliCommand);\r\n }\r\n\r\n // Default behavior: prefer native when CLI is available and no explicit credential.\r\n return credential === undefined && await hasCli(cliCommand);\r\n };\r\n\r\n const providerLoaders: ReadonlyArray<{\r\n name: string;\r\n load: () => Promise<IModelProvider>;\r\n }> = [\r\n {\r\n name: \"anthropic\",\r\n load: async () => {\r\n const { ClaudeAdapter } = await import(\"./claude-adapter.js\");\r\n const credential = await session.getActiveCredential(\"anthropic\").catch(() => undefined);\r\n const useNative = await shouldUseNative(credential, \"claude\", \"ANTHROPIC_API_KEY\");\r\n\r\n if (useNative) {\r\n const { ClaudeNativeCLIAdapter, logNativeAdapterSelection } = await import(\r\n \"./native-cli-adapters.js\"\r\n );\r\n logNativeAdapterSelection(\"anthropic\");\r\n return new ClaudeNativeCLIAdapter();\r\n }\r\n\r\n return new ClaudeAdapter(\r\n credential?.token !== undefined ? { apiKey: credential.token } : undefined,\r\n );\r\n },\r\n },\r\n {\r\n name: \"openai\",\r\n load: async () => {\r\n const { OpenAIAdapter } = await import(\"./openai-adapter.js\");\r\n const credential = await session.getActiveCredential(\"openai\").catch(() => undefined);\r\n const useNative = await shouldUseNative(credential, \"codex\", \"OPENAI_API_KEY\");\r\n\r\n if (useNative) {\r\n const { CodexNativeCLIAdapter, logNativeAdapterSelection } = await import(\r\n \"./native-cli-adapters.js\"\r\n );\r\n logNativeAdapterSelection(\"openai\");\r\n return new CodexNativeCLIAdapter();\r\n }\r\n\r\n return new OpenAIAdapter(\r\n credential?.token !== undefined ? { apiKey: credential.token } : undefined,\r\n );\r\n },\r\n },\r\n {\r\n name: \"google\",\r\n load: async () => {\r\n const { GeminiAdapter } = await import(\"./gemini-adapter.js\");\r\n const credential = await session.getActiveCredential(\"google\").catch(() => undefined);\r\n const useNative = await shouldUseNative(credential, \"gemini\", \"GOOGLE_API_KEY\");\r\n\r\n if (useNative) {\r\n const { GeminiNativeCLIAdapter, logNativeAdapterSelection } = await import(\r\n \"./native-cli-adapters.js\"\r\n );\r\n logNativeAdapterSelection(\"google\");\r\n return new GeminiNativeCLIAdapter();\r\n }\r\n\r\n return new GeminiAdapter(\r\n credential?.token !== undefined ? { apiKey: credential.token } : undefined,\r\n );\r\n },\r\n },\r\n {\r\n name: \"kimi\",\r\n load: async () => {\r\n const { KimiAdapter } = await import(\"./kimi-adapter.js\");\r\n const credential = await session.getActiveCredential(\"kimi\").catch(() => undefined);\r\n const useNative = await shouldUseNative(credential, \"kimi\", \"MOONSHOT_API_KEY\");\r\n\r\n if (useNative) {\r\n const { KimiNativeCLIAdapter, logNativeAdapterSelection } = await import(\r\n \"./native-cli-adapters.js\"\r\n );\r\n logNativeAdapterSelection(\"kimi\");\r\n return new KimiNativeCLIAdapter();\r\n }\r\n\r\n return new KimiAdapter(\r\n credential?.token !== undefined ? { apiKey: credential.token } : undefined,\r\n );\r\n },\r\n },\r\n ];\r\n\r\n // Initialize all providers in parallel (including Ollama)\r\n const ollamaTask = (async () => {\r\n try {\r\n const { OllamaAdapter } = await import(\"./ollama-adapter.js\");\r\n const ollama = new OllamaAdapter();\r\n await ollama.refreshModels();\r\n registry.register(ollama);\r\n } catch {\r\n // Ollama not available\r\n }\r\n })();\r\n\r\n await Promise.all([\r\n ...providerLoaders.map(async (config) => {\r\n try {\r\n const adapter = await config.load();\r\n registry.register(adapter);\r\n } catch {\r\n // Skip provider if adapter fails to initialize\r\n }\r\n }),\r\n ollamaTask,\r\n ]);\r\n\r\n return registry;\r\n}\r\n"]}
@@ -1,4 +1,4 @@
1
- import { logger } from './chunk-JAXXTYID.js';
1
+ import { logger } from './chunk-HEKFAKVH.js';
2
2
 
3
3
  // src/skills/executor.ts
4
4
  var SkillExecutor = class {
@@ -113,7 +113,7 @@ var SkillExecutor = class {
113
113
  }
114
114
  }
115
115
  const minContext = requirements["min-context"];
116
- if (minContext !== void 0 && minContext !== null) {
116
+ if (minContext !== void 0) {
117
117
  if (capabilities.contextWindow < minContext) {
118
118
  warnings.push(
119
119
  `Skill "${definition.frontmatter.name}" requires ${minContext} context tokens, but current model has ${capabilities.contextWindow}`
@@ -179,5 +179,5 @@ var SkillExecutor = class {
179
179
  };
180
180
 
181
181
  export { SkillExecutor };
182
- //# sourceMappingURL=chunk-LSOYPSAT.js.map
183
- //# sourceMappingURL=chunk-LSOYPSAT.js.map
182
+ //# sourceMappingURL=chunk-QCRK4QEL.js.map
183
+ //# sourceMappingURL=chunk-QCRK4QEL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/skills/executor.ts"],"names":[],"mappings":";;;AAiCO,IAAM,gBAAN,MAAoB;AAAA,EACR,QAAA;AAAA,EACT,WAAA,GAAmC,IAAA;AAAA,EACnC,gBAAA,GAA6C,IAAA;AAAA,EAErD,YAAY,QAAA,EAAyB;AACnC,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAA,CACJ,IAAA,EACA,iBAAA,EACiC;AACjC,IAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,QAAA,CAAS,UAAU,IAAI,CAAA;AACrD,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,YAAA,EAAc,CAAA,OAAA,EAAU,IAAI,CAAA,WAAA,CAAA,EAAc;AAAA,IACrE;AAEA,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,UAAA,EAAY,iBAAiB,CAAA;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAA,CACJ,OAAA,EACA,iBAAA,EACiC;AACjC,IAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,QAAA,CAAS,aAAa,OAAO,CAAA;AAC3D,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,YAAA,EAAc,+BAA+B,OAAO,CAAA,CAAA;AAAA,OACtD;AAAA,IACF;AAEA,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,UAAA,EAAY,iBAAiB,CAAA;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,GAAmB;AACjB,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,MAAA,MAAA,CAAO,MAAM,+BAA+B,CAAA;AAC5C,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,WAAA,CAAY,UAAA,CAAW,WAAA,CAAY,IAAA;AAC1D,IAAA,IAAA,CAAK,gBAAA,GAAmB,KAAK,WAAA,CAAY,oBAAA;AACzC,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AAEnB,IAAA,MAAA,CAAO,IAAA,CAAK,EAAE,KAAA,EAAO,SAAA,IAAa,mBAAmB,CAAA;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA,EAKA,cAAA,GAAsC;AACpC,IAAA,OAAO,IAAA,CAAK,WAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,GAAoB;AAClB,IAAA,OAAO,KAAK,WAAA,KAAgB,IAAA;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,qBAAA,GAAuC;AACrC,IAAA,OAAO,IAAA,CAAK,WAAA,EAAa,UAAA,CAAW,IAAA,IAAQ,IAAA;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAA,GAAoC;AAClC,IAAA,OAAO,IAAA,CAAK,WAAA,EAAa,UAAA,CAAW,WAAA,CAAY,IAAA,IAAQ,IAAA;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,eAAA,GAA4C;AAC1C,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,OAAO,IAAA,CAAK,WAAA,CAAY,UAAA,CAAW,WAAA,CAAY,eAAe,CAAA,IAAK,IAAA;AAAA,IACrE;AACA,IAAA,OAAO,IAAA,CAAK,gBAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,QAAA,EAA2B;AACvC,IAAA,MAAM,OAAA,GAAU,KAAK,eAAA,EAAgB;AACrC,IAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AACrB,IAAA,OAAO,OAAA,CAAQ,SAAS,QAAQ,CAAA;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAKA,oBAAoB,KAAA,EAAuC;AACzD,IAAA,IAAA,CAAK,gBAAA,GAAmB,KAAA;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,sBAAA,CACE,YACA,YAAA,EACsD;AACtD,IAAA,MAAM,WAAqB,EAAC;AAC5B,IAAA,MAAM,YAAA,GAAe,UAAA,CAAW,WAAA,CAAY,oBAAoB,CAAA;AAEhE,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,OAAO,EAAE,UAAA,EAAY,IAAA,EAAM,QAAA,EAAU,EAAC,EAAE;AAAA,IAC1C;AAEA,IAAA,MAAM,aAAA,GAAgB,aAAa,gBAAgB,CAAA;AACnD,IAAA,IAAI,aAAA,IAAiB,aAAa,WAAA,EAAa;AAC7C,MAAA,IAAI,YAAA,CAAa,gBAAgB,aAAA,EAAe;AAC9C,QAAA,QAAA,CAAS,IAAA;AAAA,UACP,CAAA,OAAA,EAAU,WAAW,WAAA,CAAY,IAAI,mBAAmB,aAAa,CAAA,oBAAA,EAC/C,aAAa,WAAW,CAAA,CAAA;AAAA,SAChD;AAAA,MACF;AAAA,IACF;AAEA,IAAA,MAAM,UAAA,GAAa,aAAa,aAAa,CAAA;AAC7C,IAAA,IAAI,eAAe,MAAA,EAAW;AAC5B,MAAA,IAAI,YAAA,CAAa,gBAAgB,UAAA,EAAY;AAC3C,QAAA,QAAA,CAAS,IAAA;AAAA,UACP,CAAA,OAAA,EAAU,WAAW,WAAA,CAAY,IAAI,cAAc,UAAU,CAAA,uCAAA,EAClC,aAAa,aAAa,CAAA;AAAA,SACvD;AACA,QAAA,OAAO,EAAE,UAAA,EAAY,KAAA,EAAO,QAAA,EAAS;AAAA,MACvC;AAAA,IACF;AAEA,IAAA,OAAO,EAAE,UAAA,EAAY,IAAA,EAAM,QAAA,EAAS;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,QAAA,CACN,YACA,iBAAA,EACwB;AACxB,IAAA,MAAM,cAAwB,EAAC;AAG/B,IAAA,IAAI,iBAAA,EAAmB;AACrB,MAAA,MAAM,EAAE,UAAA,EAAY,QAAA,EAAS,GAAI,IAAA,CAAK,sBAAA;AAAA,QACpC,UAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,WAAA,CAAY,IAAA,CAAK,GAAG,QAAQ,CAAA;AAE5B,MAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,QAAA,MAAA,CAAO,KAAK,EAAE,KAAA,EAAO,WAAW,WAAA,CAAY,IAAA,IAAQ,OAAO,CAAA;AAAA,MAC7D;AAEA,MAAA,IAAI,CAAC,UAAA,EAAY;AACf,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EAAO,UAAA;AAAA,UACP,YAAA,EAAc,CAAA,wCAAA,EAA2C,QAAA,CAAS,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,UAC5E,QAAA,EAAU;AAAA,SACZ;AAAA,MACF;AAAA,IACF;AAGA,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,MAAA,CAAO,IAAA;AAAA,QACL;AAAA,UACE,OAAA,EAAS,IAAA,CAAK,WAAA,CAAY,UAAA,CAAW,WAAA,CAAY,IAAA;AAAA,UACjD,IAAA,EAAM,WAAW,WAAA,CAAY;AAAA,SAC/B;AAAA,QACA;AAAA,OACF;AACA,MAAA,IAAA,CAAK,UAAA,EAAW;AAAA,IAClB;AAEA,IAAA,IAAA,CAAK,WAAA,GAAc;AAAA,MACjB,UAAA;AAAA,MACA,WAAA,sBAAiB,IAAA,EAAK;AAAA,MACtB,sBAAsB,IAAA,CAAK;AAAA,KAC7B;AAEA,IAAA,MAAA,CAAO,IAAA;AAAA,MACL;AAAA,QACE,KAAA,EAAO,WAAW,WAAA,CAAY,IAAA;AAAA,QAC9B,OAAA,EAAS,WAAW,WAAA,CAAY,OAAA;AAAA,QAChC,YAAA,EAAc,UAAA,CAAW,WAAA,CAAY,eAAe;AAAA,OACtD;AAAA,MACA;AAAA,KACF;AAEA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,IAAA;AAAA,MACT,KAAA,EAAO,UAAA;AAAA,MACP,GAAI,YAAY,MAAA,GAAS,CAAA,GAAI,EAAE,QAAA,EAAU,WAAA,KAAgB;AAAC,KAC5D;AAAA,EACF;AACF","file":"chunk-QCRK4QEL.js","sourcesContent":["/**\r\n * SkillExecutor — Manages skill activation, context injection, and tool restriction.\r\n * Per PRD section 10.3: Load full SKILL.md content into context on activation,\r\n * restrict tools, and unload on deactivation.\r\n */\r\n\r\nimport { logger } from \"../utils/logger.js\";\r\nimport type { ISkillDefinition } from \"../types/config.js\";\r\nimport type { ModelRole } from \"../types/model.js\";\r\nimport type { SkillRegistry } from \"./registry.js\";\r\n\r\n// ── Types ───────────────────────────────────────────────────────────────\r\n\r\nexport interface IActiveSkill {\r\n readonly definition: ISkillDefinition;\r\n readonly activatedAt: Date;\r\n readonly previousAllowedTools: readonly string[] | null;\r\n}\r\n\r\nexport interface ISkillActivationResult {\r\n readonly success: boolean;\r\n readonly skill?: ISkillDefinition;\r\n readonly errorMessage?: string;\r\n readonly warnings?: readonly string[];\r\n}\r\n\r\nexport interface IModelCapabilities {\r\n readonly contextWindow: number;\r\n readonly currentRole?: ModelRole;\r\n}\r\n\r\n// ── SkillExecutor Class ─────────────────────────────────────────────────\r\n\r\nexport class SkillExecutor {\r\n private readonly registry: SkillRegistry;\r\n private activeSkill: IActiveSkill | null = null;\r\n private baseAllowedTools: readonly string[] | null = null;\r\n\r\n constructor(registry: SkillRegistry) {\r\n this.registry = registry;\r\n }\r\n\r\n /**\r\n * Activate a skill by name.\r\n */\r\n async activateByName(\r\n name: string,\r\n modelCapabilities?: IModelCapabilities,\r\n ): Promise<ISkillActivationResult> {\r\n const definition = await this.registry.getByName(name);\r\n if (!definition) {\r\n return { success: false, errorMessage: `Skill \"${name}\" not found` };\r\n }\r\n\r\n return this.activate(definition, modelCapabilities);\r\n }\r\n\r\n /**\r\n * Activate a skill by trigger string (e.g. \"$review\" or \"review\").\r\n */\r\n async activateByTrigger(\r\n trigger: string,\r\n modelCapabilities?: IModelCapabilities,\r\n ): Promise<ISkillActivationResult> {\r\n const definition = await this.registry.getByTrigger(trigger);\r\n if (!definition) {\r\n return {\r\n success: false,\r\n errorMessage: `No skill found for trigger \"${trigger}\"`,\r\n };\r\n }\r\n\r\n return this.activate(definition, modelCapabilities);\r\n }\r\n\r\n /**\r\n * Deactivate the currently active skill, restoring previous tool set.\r\n */\r\n deactivate(): void {\r\n if (!this.activeSkill) {\r\n logger.debug(\"No active skill to deactivate\");\r\n return;\r\n }\r\n\r\n const skillName = this.activeSkill.definition.frontmatter.name;\r\n this.baseAllowedTools = this.activeSkill.previousAllowedTools;\r\n this.activeSkill = null;\r\n\r\n logger.info({ skill: skillName }, \"Skill deactivated\");\r\n }\r\n\r\n /**\r\n * Get the currently active skill, or null if none.\r\n */\r\n getActiveSkill(): IActiveSkill | null {\r\n return this.activeSkill;\r\n }\r\n\r\n /**\r\n * Check if any skill is currently active.\r\n */\r\n isActive(): boolean {\r\n return this.activeSkill !== null;\r\n }\r\n\r\n /**\r\n * Get the active skill's body content for context injection.\r\n * Returns null if no skill is active.\r\n */\r\n getActiveSkillContent(): string | null {\r\n return this.activeSkill?.definition.body ?? null;\r\n }\r\n\r\n /**\r\n * Get the name of the currently active skill, or null.\r\n */\r\n getActiveSkillName(): string | null {\r\n return this.activeSkill?.definition.frontmatter.name ?? null;\r\n }\r\n\r\n /**\r\n * Get the allowed tool list under the current state.\r\n * When a skill is active with allowed-tools, only those tools are permitted.\r\n * Returns null when no restrictions are in effect.\r\n */\r\n getAllowedTools(): readonly string[] | null {\r\n if (this.activeSkill) {\r\n return this.activeSkill.definition.frontmatter[\"allowed-tools\"] ?? null;\r\n }\r\n return this.baseAllowedTools;\r\n }\r\n\r\n /**\r\n * Check if a specific tool is allowed under the current skill restrictions.\r\n */\r\n isToolAllowed(toolName: string): boolean {\r\n const allowed = this.getAllowedTools();\r\n if (!allowed) return true;\r\n return allowed.includes(toolName);\r\n }\r\n\r\n /**\r\n * Set the base allowed tools (used when no skill is active).\r\n */\r\n setBaseAllowedTools(tools: readonly string[] | null): void {\r\n this.baseAllowedTools = tools;\r\n }\r\n\r\n /**\r\n * Validate model requirements for a skill definition.\r\n * Returns compatibility status and any warnings.\r\n */\r\n checkModelRequirements(\r\n definition: ISkillDefinition,\r\n capabilities: IModelCapabilities,\r\n ): { compatible: boolean; warnings: readonly string[] } {\r\n const warnings: string[] = [];\r\n const requirements = definition.frontmatter[\"model-requirements\"];\r\n\r\n if (!requirements) {\r\n return { compatible: true, warnings: [] };\r\n }\r\n\r\n const preferredRole = requirements[\"preferred-role\"];\r\n if (preferredRole && capabilities.currentRole) {\r\n if (capabilities.currentRole !== preferredRole) {\r\n warnings.push(\r\n `Skill \"${definition.frontmatter.name}\" prefers role \"${preferredRole}\", ` +\r\n `current role is \"${capabilities.currentRole}\"`,\r\n );\r\n }\r\n }\r\n\r\n const minContext = requirements[\"min-context\"];\r\n if (minContext !== undefined) {\r\n if (capabilities.contextWindow < minContext) {\r\n warnings.push(\r\n `Skill \"${definition.frontmatter.name}\" requires ${minContext} context tokens, ` +\r\n `but current model has ${capabilities.contextWindow}`,\r\n );\r\n return { compatible: false, warnings };\r\n }\r\n }\r\n\r\n return { compatible: true, warnings };\r\n }\r\n\r\n // ── Private ───────────────────────────────────────────────────────────\r\n\r\n /**\r\n * Core activation logic. Deactivates any current skill first.\r\n */\r\n private activate(\r\n definition: ISkillDefinition,\r\n modelCapabilities?: IModelCapabilities,\r\n ): ISkillActivationResult {\r\n const allWarnings: string[] = [];\r\n\r\n // Validate model requirements if capabilities are provided\r\n if (modelCapabilities) {\r\n const { compatible, warnings } = this.checkModelRequirements(\r\n definition,\r\n modelCapabilities,\r\n );\r\n allWarnings.push(...warnings);\r\n\r\n for (const warning of warnings) {\r\n logger.warn({ skill: definition.frontmatter.name }, warning);\r\n }\r\n\r\n if (!compatible) {\r\n return {\r\n success: false,\r\n skill: definition,\r\n errorMessage: `Model does not meet skill requirements: ${warnings.join(\"; \")}`,\r\n warnings: allWarnings,\r\n };\r\n }\r\n }\r\n\r\n // Deactivate current skill if one is active\r\n if (this.activeSkill) {\r\n logger.info(\r\n {\r\n current: this.activeSkill.definition.frontmatter.name,\r\n next: definition.frontmatter.name,\r\n },\r\n \"Switching active skill\",\r\n );\r\n this.deactivate();\r\n }\r\n\r\n this.activeSkill = {\r\n definition,\r\n activatedAt: new Date(),\r\n previousAllowedTools: this.baseAllowedTools,\r\n };\r\n\r\n logger.info(\r\n {\r\n skill: definition.frontmatter.name,\r\n version: definition.frontmatter.version,\r\n allowedTools: definition.frontmatter[\"allowed-tools\"],\r\n },\r\n \"Skill activated\",\r\n );\r\n\r\n return {\r\n success: true,\r\n skill: definition,\r\n ...(allWarnings.length > 0 ? { warnings: allWarnings } : {}),\r\n };\r\n }\r\n}\r\n"]}
@@ -52,5 +52,5 @@ function getEventBus() {
52
52
  }
53
53
 
54
54
  export { getEventBus };
55
- //# sourceMappingURL=chunk-YL5XFHR3.js.map
56
- //# sourceMappingURL=chunk-YL5XFHR3.js.map
55
+ //# sourceMappingURL=chunk-ROJPFPJ7.js.map
56
+ //# sourceMappingURL=chunk-ROJPFPJ7.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/event-bus.ts"],"names":[],"mappings":";AAwCO,IAAM,WAAN,MAAe;AAAA,EACH,SAAA,uBAAgB,GAAA,EAA+B;AAAA,EAEhE,EAAA,CAAwB,OAAU,OAAA,EAAiD;AACjF,IAAA,MAAM,WAAW,IAAA,CAAK,SAAA,CAAU,IAAI,KAAK,CAAA,wBAAS,GAAA,EAAI;AACtD,IAAA,QAAA,CAAS,IAAI,OAAuB,CAAA;AACpC,IAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAA,EAAO,QAAQ,CAAA;AAGlC,IAAA,OAAO,MAAM;AACX,MAAA,QAAA,CAAS,OAAO,OAAuB,CAAA;AACvC,MAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACvB,QAAA,IAAA,CAAK,SAAA,CAAU,OAAO,KAAK,CAAA;AAAA,MAC7B;AAAA,IACF,CAAA;AAAA,EACF;AAAA,EAEA,IAAA,CAA0B,OAAU,OAAA,EAAiD;AACnF,IAAA,MAAM,cAAA,GAA6C,CAAC,IAAA,KAAS;AAC3D,MAAA,WAAA,EAAY;AACZ,MAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,IACd,CAAA;AACA,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,EAAA,CAAG,KAAA,EAAO,cAAc,CAAA;AACjD,IAAA,OAAO,WAAA;AAAA,EACT;AAAA,EAEA,IAAA,CAA0B,OAAU,IAAA,EAA0B;AAC5D,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAK,CAAA;AACzC,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA;AAAA,IACF;AACA,IAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,MAAA,IAAI;AACF,QAAC,QAAuC,IAAI,CAAA;AAAA,MAC9C,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AAAA,EAEA,mBAAmB,KAAA,EAAyB;AAC1C,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,IAAA,CAAK,SAAA,CAAU,OAAO,KAAK,CAAA;AAAA,IAC7B,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,UAAU,KAAA,EAAM;AAAA,IACvB;AAAA,EACF;AAAA,EAEA,cAAc,KAAA,EAA0B;AACtC,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAK,GAAG,IAAA,IAAQ,CAAA;AAAA,EAC5C;AACF,CAAA;AAGA,IAAI,cAAA;AAEG,SAAS,WAAA,GAAwB;AACtC,EAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,IAAA,cAAA,GAAiB,IAAI,QAAA,EAAS;AAAA,EAChC;AACA,EAAA,OAAO,cAAA;AACT","file":"chunk-ROJPFPJ7.js","sourcesContent":["/**\r\n * Typed event emitter per PRD section 6.1\r\n * Core IPC backbone for the orchestration layer.\r\n */\r\n\r\ntype EventHandler<T = unknown> = (data: T) => void;\r\n\r\ninterface IEventMap {\r\n \"model:request\": { model: string; role?: string };\r\n \"model:response\": { model: string; tokens: number; cost: number };\r\n \"model:stream:chunk\": { model: string; content: string };\r\n \"model:stream:done\": { model: string; totalTokens: number };\r\n \"model:error\": { model: string; error: Error };\r\n \"tool:call\": { name: string; args: Record<string, unknown> };\r\n \"tool:result\": { name: string; isError: boolean; content: string };\r\n \"team:created\": { teamName: string; agentCount: number };\r\n \"team:deleted\": { teamName: string };\r\n \"agent:spawned\": { agentName: string; model: string };\r\n \"agent:status\": { agentName: string; status: string };\r\n \"agent:message\": { from: string; to: string; content: string };\r\n \"task:created\": { taskId: string; subject: string };\r\n \"task:updated\": { taskId: string; status: string };\r\n \"task:completed\": { taskId: string };\r\n \"cost:updated\": { total: number; provider: string; delta: number };\r\n \"cost:warning\": { current: number; limit: number };\r\n \"cost:exceeded\": { current: number; limit: number };\r\n \"pane:created\": { paneId: string; agentName: string };\r\n \"pane:closed\": { paneId: string };\r\n \"skill:activated\": { skillName: string };\r\n \"skill:deactivated\": { skillName: string };\r\n \"mcp:server:started\": { serverName: string };\r\n \"mcp:server:stopped\": { serverName: string };\r\n \"mcp:server:error\": { serverName: string; error: string };\r\n \"config:changed\": { key: string };\r\n \"auth:login\": { provider: string; email?: string };\r\n \"auth:logout\": { provider: string };\r\n}\r\n\r\ntype EventName = keyof IEventMap;\r\n\r\nexport class EventBus {\r\n private readonly listeners = new Map<string, Set<EventHandler>>();\r\n\r\n on<K extends EventName>(event: K, handler: EventHandler<IEventMap[K]>): () => void {\r\n const handlers = this.listeners.get(event) ?? new Set();\r\n handlers.add(handler as EventHandler);\r\n this.listeners.set(event, handlers);\r\n\r\n // Return unsubscribe function\r\n return () => {\r\n handlers.delete(handler as EventHandler);\r\n if (handlers.size === 0) {\r\n this.listeners.delete(event);\r\n }\r\n };\r\n }\r\n\r\n once<K extends EventName>(event: K, handler: EventHandler<IEventMap[K]>): () => void {\r\n const wrappedHandler: EventHandler<IEventMap[K]> = (data) => {\r\n unsubscribe();\r\n handler(data);\r\n };\r\n const unsubscribe = this.on(event, wrappedHandler);\r\n return unsubscribe;\r\n }\r\n\r\n emit<K extends EventName>(event: K, data: IEventMap[K]): void {\r\n const handlers = this.listeners.get(event);\r\n if (!handlers) {\r\n return;\r\n }\r\n for (const handler of handlers) {\r\n try {\r\n (handler as EventHandler<IEventMap[K]>)(data);\r\n } catch {\r\n // Event handlers should not throw; silently catch to avoid cascading\r\n }\r\n }\r\n }\r\n\r\n removeAllListeners(event?: EventName): void {\r\n if (event) {\r\n this.listeners.delete(event);\r\n } else {\r\n this.listeners.clear();\r\n }\r\n }\r\n\r\n listenerCount(event: EventName): number {\r\n return this.listeners.get(event)?.size ?? 0;\r\n }\r\n}\r\n\r\n// Singleton event bus for the application\r\nlet globalEventBus: EventBus | undefined;\r\n\r\nexport function getEventBus(): EventBus {\r\n if (!globalEventBus) {\r\n globalEventBus = new EventBus();\r\n }\r\n return globalEventBus;\r\n}\r\n\r\nexport type { IEventMap, EventName };\r\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-RP2TAL3J.js.map
71
+ //# sourceMappingURL=chunk-RP2TAL3J.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-RP2TAL3J.js","sourcesContent":["import type { ProviderName } from \"../../types/model.js\";\r\nimport type { CliProviderType } from \"../constants.js\";\r\n\r\nexport type LoginProvider = \"claude\" | \"codex\" | \"gemini\" | \"kimi\";\r\n\r\nexport interface CliProviderCatalogEntry {\r\n readonly type: CliProviderType;\r\n readonly provider: ProviderName;\r\n readonly binary: string;\r\n readonly label: string;\r\n readonly description: string;\r\n readonly loginProvider?: LoginProvider | undefined;\r\n readonly localOnly: boolean;\r\n readonly startCommand: (model?: string) => string;\r\n}\r\n\r\nexport const CLI_PROVIDER_CATALOG: Readonly<Record<CliProviderType, CliProviderCatalogEntry>> = {\r\n \"claude-code\": {\r\n type: \"claude-code\",\r\n provider: \"anthropic\",\r\n binary: \"claude\",\r\n label: \"Claude Code\",\r\n description: \"Anthropic native CLI agent\",\r\n loginProvider: \"claude\",\r\n localOnly: false,\r\n startCommand: () => \"claude --dangerously-skip-permissions\",\r\n },\r\n codex: {\r\n type: \"codex\",\r\n provider: \"openai\",\r\n binary: \"codex\",\r\n label: \"Codex\",\r\n description: \"OpenAI native CLI agent\",\r\n loginProvider: \"codex\",\r\n localOnly: false,\r\n startCommand: () => \"codex --full-auto\",\r\n },\r\n \"gemini-cli\": {\r\n type: \"gemini-cli\",\r\n provider: \"google\",\r\n binary: \"gemini\",\r\n label: \"Gemini CLI\",\r\n description: \"Google native CLI agent\",\r\n loginProvider: \"gemini\",\r\n localOnly: false,\r\n startCommand: () => \"gemini\",\r\n },\r\n \"kimi-cli\": {\r\n type: \"kimi-cli\",\r\n provider: \"kimi\",\r\n binary: \"kimi\",\r\n label: \"Kimi CLI\",\r\n description: \"Moonshot native CLI agent\",\r\n loginProvider: \"kimi\",\r\n localOnly: false,\r\n startCommand: () => \"kimi\",\r\n },\r\n ollama: {\r\n type: \"ollama\",\r\n provider: \"ollama\",\r\n binary: \"ollama\",\r\n label: \"Ollama\",\r\n description: \"Local agent runtime\",\r\n localOnly: true,\r\n startCommand: (model?: string) => `ollama run ${model ?? \"llama3\"}`,\r\n },\r\n};\r\n\r\nexport const CLI_PROVIDER_ORDER: readonly CliProviderType[] = [\r\n \"claude-code\",\r\n \"codex\",\r\n \"gemini-cli\",\r\n \"kimi-cli\",\r\n \"ollama\",\r\n] as const;\r\n\r\nexport function getCliProviderEntry(provider: CliProviderType): CliProviderCatalogEntry {\r\n return CLI_PROVIDER_CATALOG[provider];\r\n}\r\n\r\nexport function getCliProviderLabel(provider: CliProviderType): string {\r\n return getCliProviderEntry(provider).label;\r\n}\r\n\r\nexport function getCliProviderForModelProvider(provider: ProviderName): CliProviderType | undefined {\r\n return CLI_PROVIDER_ORDER.find(\r\n (cliProvider) => CLI_PROVIDER_CATALOG[cliProvider].provider === provider,\r\n );\r\n}\r\n"]}
@@ -1,6 +1,7 @@
1
- import { SUPPORTED_MODELS } from './chunk-HCIHOHLX.js';
2
- import { ModelNotFoundError, AuthenticationError } from './chunk-ZGOHARPV.js';
3
- import { logger } from './chunk-JAXXTYID.js';
1
+ import { getModelInfo } from './chunk-FIC7AK4Q.js';
2
+ import { ModelNotFoundError, AuthenticationError } from './chunk-473JN6M5.js';
3
+ import { SUPPORTED_MODELS } from './chunk-62HSGYQD.js';
4
+ import { logger } from './chunk-HEKFAKVH.js';
4
5
  import { randomUUID } from 'crypto';
5
6
  import { execa } from 'execa';
6
7
 
@@ -40,13 +41,7 @@ function toJsonLines(output) {
40
41
  function buildPrompt(request) {
41
42
  const latestUser = [...request.messages].reverse().find((message) => message.role === "user");
42
43
  const fallbackLast = request.messages.length > 0 ? request.messages[request.messages.length - 1] : void 0;
43
- const latestPrompt = latestUser?.content ?? fallbackLast?.content ?? "";
44
- if (request.system !== void 0 && request.system.length > 0) {
45
- return `${request.system}
46
-
47
- ${latestPrompt}`.trim();
48
- }
49
- return latestPrompt;
44
+ return latestUser?.content ?? fallbackLast?.content ?? "";
50
45
  }
51
46
  function computeCost(modelInfo, inputTokens, outputTokens) {
52
47
  return inputTokens / 1e6 * modelInfo.inputPricePerMToken + outputTokens / 1e6 * modelInfo.outputPricePerMToken;
@@ -60,11 +55,12 @@ function classifyCliError(provider, error) {
60
55
  return error instanceof Error ? error : new Error(message);
61
56
  }
62
57
  var BaseNativeCLIAdapter = class {
58
+ supportsToolCalling = false;
63
59
  async chat(request) {
64
60
  const modelInfo = this.getModelInfo(request.model);
65
61
  const prompt = buildPrompt(request);
66
62
  try {
67
- const result = await this.runCLI(request.model, prompt);
63
+ const result = await this.runCLI(request.model, prompt, request.system);
68
64
  const inputTokens = result.inputTokens ?? Math.ceil(prompt.length / CHARS_PER_TOKEN_ESTIMATE);
69
65
  const outputTokens = result.outputTokens ?? Math.ceil(result.text.length / CHARS_PER_TOKEN_ESTIMATE);
70
66
  const usage = {
@@ -109,18 +105,18 @@ var BaseNativeCLIAdapter = class {
109
105
  yield { type: "done" };
110
106
  }
111
107
  }
112
- async countTokens(text, _model) {
113
- return Math.ceil(text.length / CHARS_PER_TOKEN_ESTIMATE);
108
+ countTokens(text, _model) {
109
+ return Promise.resolve(Math.ceil(text.length / CHARS_PER_TOKEN_ESTIMATE));
114
110
  }
115
111
  getModelInfo(model) {
116
- const info = SUPPORTED_MODELS[model];
112
+ const info = SUPPORTED_MODELS[model] ?? getModelInfo(model);
117
113
  if (info === void 0 || info.provider !== this.name) {
118
114
  throw new ModelNotFoundError(model);
119
115
  }
120
116
  return info;
121
117
  }
122
- async listAvailableModels() {
123
- return [...this.supportedModels];
118
+ listAvailableModels() {
119
+ return Promise.resolve([...this.supportedModels]);
124
120
  }
125
121
  };
126
122
  var ClaudeNativeCLIAdapter = class extends BaseNativeCLIAdapter {
@@ -132,10 +128,30 @@ var ClaudeNativeCLIAdapter = class extends BaseNativeCLIAdapter {
132
128
  "claude-sonnet-4-6-1m",
133
129
  "claude-haiku-4-5"
134
130
  ];
135
- async runCLI(model, prompt) {
131
+ /** Map internal model IDs to valid Claude CLI model IDs. */
132
+ toCLIModelId(model) {
133
+ return model.replace(/-1m$/, "");
134
+ }
135
+ async runCLI(model, prompt, systemPrompt) {
136
+ const cliModel = this.toCLIModelId(model);
137
+ const args = [
138
+ "-p",
139
+ "--output-format",
140
+ "json",
141
+ "--model",
142
+ cliModel,
143
+ // Skip project CLAUDE.md to avoid loading huge project instructions
144
+ // that make Claude think it's Claude Code doing a codebase audit
145
+ "--setting-sources",
146
+ "user"
147
+ ];
148
+ if (systemPrompt && systemPrompt.length > 0) {
149
+ args.push("--system-prompt", systemPrompt);
150
+ }
151
+ args.push(prompt);
136
152
  const { stdout } = await execa(
137
153
  "claude",
138
- ["-p", "--output-format", "json", "--model", model, prompt],
154
+ args,
139
155
  {
140
156
  timeout: CLI_TIMEOUT_MS,
141
157
  stdin: "ignore",
@@ -169,8 +185,11 @@ var CodexNativeCLIAdapter = class extends BaseNativeCLIAdapter {
169
185
  "gpt-5.2",
170
186
  "gpt-5.1-codex-mini"
171
187
  ];
172
- async runCLI(model, prompt) {
188
+ async runCLI(model, prompt, systemPrompt) {
173
189
  const sandbox = process.env["AEMEATHCLI_CODEX_SANDBOX"] ?? "read-only";
190
+ const fullPrompt = systemPrompt ? `${systemPrompt}
191
+
192
+ ${prompt}` : prompt;
174
193
  const { stdout } = await execa(
175
194
  "codex",
176
195
  [
@@ -180,7 +199,7 @@ var CodexNativeCLIAdapter = class extends BaseNativeCLIAdapter {
180
199
  "--json",
181
200
  "--model",
182
201
  model,
183
- prompt
202
+ fullPrompt
184
203
  ],
185
204
  {
186
205
  timeout: CLI_TIMEOUT_MS,
@@ -229,12 +248,15 @@ var GeminiNativeCLIAdapter = class extends BaseNativeCLIAdapter {
229
248
  "gemini-2.5-flash",
230
249
  "gemini-2.5-flash-lite"
231
250
  ];
232
- async runCLI(model, prompt) {
251
+ async runCLI(model, prompt, systemPrompt) {
252
+ const fullPrompt = systemPrompt ? `${systemPrompt}
253
+
254
+ ${prompt}` : prompt;
233
255
  const { stdout } = await execa(
234
256
  "gemini",
235
257
  [
236
258
  "-p",
237
- prompt,
259
+ fullPrompt,
238
260
  "--model",
239
261
  model,
240
262
  "--output-format",
@@ -281,10 +303,13 @@ var GeminiNativeCLIAdapter = class extends BaseNativeCLIAdapter {
281
303
  var KimiNativeCLIAdapter = class extends BaseNativeCLIAdapter {
282
304
  name = "kimi";
283
305
  supportedModels = ["kimi-for-coding"];
284
- async runCLI(_model, prompt) {
306
+ async runCLI(_model, prompt, systemPrompt) {
307
+ const fullPrompt = systemPrompt ? `${systemPrompt}
308
+
309
+ ${prompt}` : prompt;
285
310
  const { stdout } = await execa(
286
311
  "kimi",
287
- ["--print", "--output-format", "stream-json", "-p", prompt],
312
+ ["--print", "--output-format", "stream-json", "-p", fullPrompt],
288
313
  {
289
314
  timeout: CLI_TIMEOUT_MS,
290
315
  stdin: "ignore",
@@ -321,5 +346,5 @@ function logNativeAdapterSelection(provider) {
321
346
  }
322
347
 
323
348
  export { ClaudeNativeCLIAdapter, CodexNativeCLIAdapter, GeminiNativeCLIAdapter, KimiNativeCLIAdapter, logNativeAdapterSelection };
324
- //# sourceMappingURL=chunk-6PDJ45T4.js.map
325
- //# sourceMappingURL=chunk-6PDJ45T4.js.map
349
+ //# sourceMappingURL=chunk-RYOB3TLZ.js.map
350
+ //# sourceMappingURL=chunk-RYOB3TLZ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/providers/native-cli-adapters.ts"],"names":[],"mappings":"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","file":"chunk-RYOB3TLZ.js","sourcesContent":["/**\r\n * Native CLI-backed provider adapters.\r\n * Uses official provider CLIs in non-interactive mode when credentials come from native login.\r\n */\r\n\r\nimport { randomUUID } from \"node:crypto\";\r\nimport { execa } from \"execa\";\r\nimport {\r\n AuthenticationError,\r\n ModelNotFoundError,\r\n} from \"../types/errors.js\";\r\nimport { SUPPORTED_MODELS } from \"../types/model.js\";\r\nimport { getModelInfo as getDynamicModelInfo } from \"./model-discovery.js\";\r\nimport { logger } from \"../utils/logger.js\";\r\nimport type { IModelInfo, ProviderName } from \"../types/model.js\";\r\nimport type {\r\n IChatMessage,\r\n IChatRequest,\r\n IChatResponse,\r\n IStreamChunk,\r\n ITokenUsage,\r\n} from \"../types/message.js\";\r\nimport type { IModelProvider } from \"./types.js\";\r\n\r\ninterface ICLIResult {\r\n readonly text: string;\r\n readonly inputTokens?: number | undefined;\r\n readonly outputTokens?: number | undefined;\r\n readonly finishReason?: IChatResponse[\"finishReason\"] | undefined;\r\n}\r\n\r\nconst CHARS_PER_TOKEN_ESTIMATE = 4;\r\n\r\n/**\r\n * Resolve CLI timeout from environment. Default is 0 (no timeout) so that\r\n * long-running agent tasks are never prematurely killed.\r\n * Set AEMEATHCLI_NATIVE_CLI_TIMEOUT_MS to a positive integer to enforce a limit.\r\n */\r\nfunction resolveCliTimeoutMs(): number {\r\n const raw = process.env[\"AEMEATHCLI_NATIVE_CLI_TIMEOUT_MS\"];\r\n if (raw === undefined) {\r\n return 0;\r\n }\r\n\r\n const parsed = Number.parseInt(raw, 10);\r\n if (!Number.isFinite(parsed) || parsed <= 0) {\r\n return 0;\r\n }\r\n\r\n return parsed;\r\n}\r\n\r\nconst CLI_TIMEOUT_MS = resolveCliTimeoutMs();\r\n\r\nfunction isRecord(value: unknown): value is Record<string, unknown> {\r\n return typeof value === \"object\" && value !== null;\r\n}\r\n\r\nfunction asString(value: unknown): string | undefined {\r\n return typeof value === \"string\" ? value : undefined;\r\n}\r\n\r\nfunction asNumber(value: unknown): number | undefined {\r\n return typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\r\n}\r\n\r\nfunction toJsonLines(output: string): unknown[] {\r\n const lines = output\r\n .split(/\\r?\\n/u)\r\n .map((line) => line.trim())\r\n .filter((line) => line.length > 0 && line.startsWith(\"{\"));\r\n\r\n const parsed: unknown[] = [];\r\n for (const line of lines) {\r\n try {\r\n parsed.push(JSON.parse(line) as unknown);\r\n } catch {\r\n // Ignore non-JSON lines\r\n }\r\n }\r\n return parsed;\r\n}\r\n\r\nfunction buildPrompt(request: IChatRequest): string {\r\n // Extract only the user message text — system prompt is passed separately\r\n // via the provider's native --system-prompt flag.\r\n const latestUser = [...request.messages]\r\n .reverse()\r\n .find((message) => message.role === \"user\");\r\n const fallbackLast = request.messages.length > 0\r\n ? request.messages[request.messages.length - 1]\r\n : undefined;\r\n\r\n return latestUser?.content ?? fallbackLast?.content ?? \"\";\r\n}\r\n\r\nfunction computeCost(modelInfo: IModelInfo, inputTokens: number, outputTokens: number): number {\r\n return (\r\n (inputTokens / 1_000_000) * modelInfo.inputPricePerMToken +\r\n (outputTokens / 1_000_000) * modelInfo.outputPricePerMToken\r\n );\r\n}\r\n\r\nfunction classifyCliError(provider: ProviderName, error: unknown): Error {\r\n const message = error instanceof Error ? error.message : String(error);\r\n const lower = message.toLowerCase();\r\n\r\n if (\r\n lower.includes(\"login\")\r\n || lower.includes(\"credential\")\r\n || lower.includes(\"authentication\")\r\n || lower.includes(\"unauthorized\")\r\n || lower.includes(\"forbidden\")\r\n || lower.includes(\"api key\")\r\n || lower.includes(\"token\")\r\n ) {\r\n return new AuthenticationError(provider, message);\r\n }\r\n\r\n return error instanceof Error ? error : new Error(message);\r\n}\r\n\r\nabstract class BaseNativeCLIAdapter implements IModelProvider {\r\n abstract readonly name: ProviderName;\r\n abstract readonly supportedModels: readonly string[];\r\n readonly supportsToolCalling = false;\r\n\r\n protected abstract runCLI(model: string, prompt: string, systemPrompt?: string): Promise<ICLIResult>;\r\n\r\n async chat(request: IChatRequest): Promise<IChatResponse> {\r\n const modelInfo = this.getModelInfo(request.model);\r\n const prompt = buildPrompt(request);\r\n\r\n try {\r\n const result = await this.runCLI(request.model, prompt, request.system);\r\n\r\n const inputTokens = result.inputTokens ?? Math.ceil(prompt.length / CHARS_PER_TOKEN_ESTIMATE);\r\n const outputTokens = result.outputTokens ?? Math.ceil(result.text.length / CHARS_PER_TOKEN_ESTIMATE);\r\n\r\n const usage: ITokenUsage = {\r\n inputTokens,\r\n outputTokens,\r\n totalTokens: inputTokens + outputTokens,\r\n costUsd: computeCost(modelInfo, inputTokens, outputTokens),\r\n };\r\n\r\n const responseMessage: IChatMessage = {\r\n id: randomUUID(),\r\n role: \"assistant\",\r\n content: result.text,\r\n model: request.model,\r\n provider: this.name,\r\n tokenUsage: usage,\r\n createdAt: new Date(),\r\n };\r\n\r\n return {\r\n id: randomUUID(),\r\n model: request.model,\r\n provider: this.name,\r\n message: responseMessage,\r\n usage,\r\n finishReason: result.finishReason ?? \"stop\",\r\n };\r\n } catch (error: unknown) {\r\n throw classifyCliError(this.name, error);\r\n }\r\n }\r\n\r\n async *stream(request: IChatRequest): AsyncIterable<IStreamChunk> {\r\n try {\r\n const response = await this.chat(request);\r\n if (response.message.content.length > 0) {\r\n yield { type: \"text\", content: response.message.content };\r\n }\r\n yield { type: \"usage\", usage: response.usage };\r\n yield { type: \"done\" };\r\n } catch (error: unknown) {\r\n // Execa errors can include raw stdout/stderr in the message.\r\n // Truncate to prevent raw CLI protocol output from leaking through.\r\n const rawMsg = error instanceof Error ? error.message : String(error);\r\n const truncated = rawMsg.length > 500 ? rawMsg.slice(0, 500) + \"...\" : rawMsg;\r\n yield { type: \"error\", error: truncated };\r\n yield { type: \"done\" };\r\n }\r\n }\r\n\r\n countTokens(text: string, _model: string): Promise<number> {\r\n return Promise.resolve(Math.ceil(text.length / CHARS_PER_TOKEN_ESTIMATE));\r\n }\r\n\r\n getModelInfo(model: string): IModelInfo {\r\n // Check hardcoded registry first, then dynamic discovery\r\n const info = SUPPORTED_MODELS[model] ?? getDynamicModelInfo(model);\r\n if (info === undefined || info.provider !== this.name) {\r\n throw new ModelNotFoundError(model);\r\n }\r\n return info;\r\n }\r\n\r\n listAvailableModels(): Promise<readonly string[]> {\r\n return Promise.resolve([...this.supportedModels]);\r\n }\r\n}\r\n\r\nexport class ClaudeNativeCLIAdapter extends BaseNativeCLIAdapter {\r\n readonly name: ProviderName = \"anthropic\";\r\n readonly supportedModels = [\r\n \"claude-opus-4-6\",\r\n \"claude-opus-4-6-1m\",\r\n \"claude-sonnet-4-6\",\r\n \"claude-sonnet-4-6-1m\",\r\n \"claude-haiku-4-5\",\r\n ] as const;\r\n\r\n /** Map internal model IDs to valid Claude CLI model IDs. */\r\n private toCLIModelId(model: string): string {\r\n // The Claude CLI doesn't recognize the \"-1m\" context suffix.\r\n // Strip it — the API handles context window sizing automatically.\r\n return model.replace(/-1m$/, \"\");\r\n }\r\n\r\n protected async runCLI(model: string, prompt: string, systemPrompt?: string): Promise<ICLIResult> {\r\n const cliModel = this.toCLIModelId(model);\r\n const args = [\r\n \"-p\",\r\n \"--output-format\", \"json\",\r\n \"--model\", cliModel,\r\n // Skip project CLAUDE.md to avoid loading huge project instructions\r\n // that make Claude think it's Claude Code doing a codebase audit\r\n \"--setting-sources\", \"user\",\r\n ];\r\n\r\n if (systemPrompt && systemPrompt.length > 0) {\r\n args.push(\"--system-prompt\", systemPrompt);\r\n }\r\n\r\n args.push(prompt);\r\n\r\n const { stdout } = await execa(\r\n \"claude\",\r\n args,\r\n {\r\n timeout: CLI_TIMEOUT_MS,\r\n stdin: \"ignore\",\r\n env: { ...process.env, NO_COLOR: \"1\" },\r\n },\r\n );\r\n\r\n const lines = toJsonLines(stdout);\r\n const lastJson = lines.length > 0 ? lines[lines.length - 1] : undefined;\r\n\r\n if (!isRecord(lastJson)) {\r\n throw new Error(\"Claude CLI returned no JSON result\");\r\n }\r\n\r\n const text = asString(lastJson[\"result\"]) ?? \"\";\r\n const usage = isRecord(lastJson[\"usage\"]) ? lastJson[\"usage\"] : undefined;\r\n const inputTokens = usage ? asNumber(usage[\"input_tokens\"]) : undefined;\r\n const outputTokens = usage ? asNumber(usage[\"output_tokens\"]) : undefined;\r\n\r\n return {\r\n text,\r\n inputTokens,\r\n outputTokens,\r\n finishReason: \"stop\",\r\n };\r\n }\r\n}\r\n\r\nexport class CodexNativeCLIAdapter extends BaseNativeCLIAdapter {\r\n readonly name: ProviderName = \"openai\";\r\n readonly supportedModels = [\r\n \"gpt-5.3-codex\",\r\n \"gpt-5.3-codex-spark\",\r\n \"gpt-5.2-codex\",\r\n \"gpt-5.1-codex-max\",\r\n \"gpt-5.2\",\r\n \"gpt-5.1-codex-mini\",\r\n ] as const;\r\n\r\n protected async runCLI(model: string, prompt: string, systemPrompt?: string): Promise<ICLIResult> {\r\n // Allow agent panes to set a writable sandbox so codex can write to the\r\n // shared board directory. Default to \"read-only\" for normal usage.\r\n const sandbox = process.env[\"AEMEATHCLI_CODEX_SANDBOX\"] ?? \"read-only\";\r\n // Prepend system prompt for Codex (no native --system-prompt flag)\r\n const fullPrompt = systemPrompt ? `${systemPrompt}\\n\\n${prompt}` : prompt;\r\n const { stdout } = await execa(\r\n \"codex\",\r\n [\r\n \"exec\",\r\n \"--skip-git-repo-check\",\r\n ...(sandbox !== \"none\" ? [\"--sandbox\", sandbox] : []),\r\n \"--json\",\r\n \"--model\",\r\n model,\r\n fullPrompt,\r\n ],\r\n {\r\n timeout: CLI_TIMEOUT_MS,\r\n stdin: \"ignore\",\r\n env: { ...process.env, NO_COLOR: \"1\" },\r\n },\r\n );\r\n\r\n const lines = toJsonLines(stdout);\r\n const textParts: string[] = [];\r\n let inputTokens: number | undefined;\r\n let outputTokens: number | undefined;\r\n\r\n for (const line of lines) {\r\n if (!isRecord(line)) continue;\r\n const type = asString(line[\"type\"]);\r\n\r\n if (type === \"item.completed\") {\r\n const item = isRecord(line[\"item\"]) ? line[\"item\"] : undefined;\r\n if (item && asString(item[\"type\"]) === \"agent_message\") {\r\n const text = asString(item[\"text\"]);\r\n if (text && text.length > 0) {\r\n textParts.push(text);\r\n }\r\n }\r\n }\r\n\r\n if (type === \"turn.completed\") {\r\n const usage = isRecord(line[\"usage\"]) ? line[\"usage\"] : undefined;\r\n if (usage) {\r\n inputTokens = asNumber(usage[\"input_tokens\"]) ?? inputTokens;\r\n outputTokens = asNumber(usage[\"output_tokens\"]) ?? outputTokens;\r\n }\r\n }\r\n }\r\n\r\n return {\r\n text: textParts.join(\"\\n\").trim(),\r\n inputTokens,\r\n outputTokens,\r\n finishReason: \"stop\",\r\n };\r\n }\r\n}\r\n\r\nexport class GeminiNativeCLIAdapter extends BaseNativeCLIAdapter {\r\n readonly name: ProviderName = \"google\";\r\n readonly supportedModels = [\r\n \"gemini-3-pro-preview\",\r\n \"gemini-3-flash-preview\",\r\n \"gemini-2.5-pro\",\r\n \"gemini-2.5-flash\",\r\n \"gemini-2.5-flash-lite\",\r\n ] as const;\r\n\r\n protected async runCLI(model: string, prompt: string, systemPrompt?: string): Promise<ICLIResult> {\r\n // Prepend system prompt for Gemini (no native --system-prompt flag)\r\n const fullPrompt = systemPrompt ? `${systemPrompt}\\n\\n${prompt}` : prompt;\r\n const { stdout } = await execa(\r\n \"gemini\",\r\n [\r\n \"-p\",\r\n fullPrompt,\r\n \"--model\",\r\n model,\r\n \"--output-format\",\r\n \"stream-json\",\r\n \"--approval-mode\",\r\n \"yolo\",\r\n ],\r\n {\r\n timeout: CLI_TIMEOUT_MS,\r\n stdin: \"ignore\",\r\n env: { ...process.env, NO_COLOR: \"1\" },\r\n },\r\n );\r\n\r\n const lines = toJsonLines(stdout);\r\n let text = \"\";\r\n let inputTokens: number | undefined;\r\n let outputTokens: number | undefined;\r\n\r\n for (const line of lines) {\r\n if (!isRecord(line)) continue;\r\n const type = asString(line[\"type\"]);\r\n\r\n if (type === \"message\" && asString(line[\"role\"]) === \"assistant\") {\r\n const content = asString(line[\"content\"]);\r\n if (content !== undefined) {\r\n const delta = line[\"delta\"] === true;\r\n text = delta ? `${text}${content}` : content;\r\n }\r\n }\r\n\r\n if (type === \"result\") {\r\n const stats = isRecord(line[\"stats\"]) ? line[\"stats\"] : undefined;\r\n if (stats) {\r\n inputTokens = asNumber(stats[\"input_tokens\"]) ?? inputTokens;\r\n outputTokens = asNumber(stats[\"output_tokens\"]) ?? outputTokens;\r\n }\r\n }\r\n }\r\n\r\n return {\r\n text: text.trim(),\r\n inputTokens,\r\n outputTokens,\r\n finishReason: \"stop\",\r\n };\r\n }\r\n}\r\n\r\nexport class KimiNativeCLIAdapter extends BaseNativeCLIAdapter {\r\n readonly name: ProviderName = \"kimi\";\r\n readonly supportedModels = [\"kimi-for-coding\"] as const;\r\n\r\n protected async runCLI(_model: string, prompt: string, systemPrompt?: string): Promise<ICLIResult> {\r\n const fullPrompt = systemPrompt ? `${systemPrompt}\\n\\n${prompt}` : prompt;\r\n const { stdout } = await execa(\r\n \"kimi\",\r\n [\"--print\", \"--output-format\", \"stream-json\", \"-p\", fullPrompt],\r\n {\r\n timeout: CLI_TIMEOUT_MS,\r\n stdin: \"ignore\",\r\n env: { ...process.env, NO_COLOR: \"1\" },\r\n },\r\n );\r\n\r\n const lines = toJsonLines(stdout);\r\n let text = \"\";\r\n\r\n for (const line of lines) {\r\n if (!isRecord(line)) continue;\r\n if (asString(line[\"role\"]) !== \"assistant\") continue;\r\n\r\n const content = line[\"content\"];\r\n if (!Array.isArray(content)) continue;\r\n\r\n const textParts: string[] = [];\r\n for (const part of content) {\r\n if (!isRecord(part)) continue;\r\n if (asString(part[\"type\"]) === \"text\") {\r\n const piece = asString(part[\"text\"]);\r\n if (piece) textParts.push(piece);\r\n }\r\n }\r\n\r\n if (textParts.length > 0) {\r\n text = textParts.join(\"\");\r\n }\r\n }\r\n\r\n return {\r\n text: text.trim(),\r\n finishReason: \"stop\",\r\n };\r\n }\r\n}\r\n\r\nexport function logNativeAdapterSelection(provider: ProviderName): void {\r\n logger.info({ provider }, \"Using native CLI adapter\");\r\n}\r\n"]}