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.
- package/LICENSE +21 -0
- package/README.md +609 -608
- package/dist/App-YAHJUWCX.js +4274 -0
- package/dist/App-YAHJUWCX.js.map +1 -0
- package/dist/agent-store/architect.md +32 -0
- package/dist/agent-store/debugger.md +32 -0
- package/dist/agent-store/developer.md +29 -0
- package/dist/agent-store/documenter.md +30 -0
- package/dist/agent-store/researcher.md +31 -0
- package/dist/agent-store/reviewer.md +28 -0
- package/dist/agent-store/supervisor.md +37 -0
- package/dist/agent-store/tester.md +30 -0
- package/dist/api-key-fallback-UN3TJEOO.js +11 -0
- package/dist/{api-key-fallback-YQQBOQIL.js.map → api-key-fallback-UN3TJEOO.js.map} +1 -1
- package/dist/auth-status-EIM5A5KL.js +13 -0
- package/dist/auth-status-EIM5A5KL.js.map +1 -0
- package/dist/{chunk-UY2SYSEZ.js → chunk-25UNNEHN.js} +32 -103
- package/dist/chunk-25UNNEHN.js.map +1 -0
- package/dist/{chunk-CYQNBB25.js → chunk-2GKOK6T7.js} +28 -5
- package/dist/chunk-2GKOK6T7.js.map +1 -0
- package/dist/{chunk-MFBHNWGV.js → chunk-2LF7ALGR.js} +12 -20
- package/dist/chunk-2LF7ALGR.js.map +1 -0
- package/dist/{chunk-H66O5Z2V.js → chunk-2NWNIKBK.js} +42 -7
- package/dist/chunk-2NWNIKBK.js.map +1 -0
- package/dist/chunk-3TSPZRGM.js +26 -0
- package/dist/chunk-3TSPZRGM.js.map +1 -0
- package/dist/{chunk-ZGOHARPV.js → chunk-473JN6M5.js} +2 -2
- package/dist/chunk-473JN6M5.js.map +1 -0
- package/dist/{chunk-IYW62KKR.js → chunk-5XFSV6PF.js} +66 -23
- package/dist/chunk-5XFSV6PF.js.map +1 -0
- package/dist/{chunk-HCIHOHLX.js → chunk-62HSGYQD.js} +2 -2
- package/dist/chunk-62HSGYQD.js.map +1 -0
- package/dist/{chunk-I5PZ4JTS.js → chunk-6GUD7QIM.js} +4 -4
- package/dist/chunk-6GUD7QIM.js.map +1 -0
- package/dist/{chunk-4IJD72YB.js → chunk-AQ23TYSQ.js} +7 -7
- package/dist/chunk-AQ23TYSQ.js.map +1 -0
- package/dist/{chunk-NBR3GHMT.js → chunk-BY4DAKUU.js} +39 -7
- package/dist/chunk-BY4DAKUU.js.map +1 -0
- package/dist/chunk-CC7MGWYY.js +12 -0
- package/dist/chunk-CC7MGWYY.js.map +1 -0
- package/dist/chunk-CTFZTARK.js +155 -0
- package/dist/chunk-CTFZTARK.js.map +1 -0
- package/dist/chunk-FIC7AK4Q.js +232 -0
- package/dist/chunk-FIC7AK4Q.js.map +1 -0
- package/dist/chunk-GU33WKPG.js +140 -0
- package/dist/chunk-GU33WKPG.js.map +1 -0
- package/dist/{chunk-DMBPX3RG.js → chunk-H2SYKIMI.js} +10 -10
- package/dist/chunk-H2SYKIMI.js.map +1 -0
- package/dist/{chunk-JAXXTYID.js → chunk-HEKFAKVH.js} +2 -2
- package/dist/chunk-HEKFAKVH.js.map +1 -0
- package/dist/chunk-IARA5XYP.js +186 -0
- package/dist/chunk-IARA5XYP.js.map +1 -0
- package/dist/{chunk-HMJRPNPZ.js → chunk-LCYH4T6N.js} +95 -23
- package/dist/chunk-LCYH4T6N.js.map +1 -0
- package/dist/{chunk-CARHU3DO.js → chunk-LDVY5ELP.js} +66 -18
- package/dist/chunk-LDVY5ELP.js.map +1 -0
- package/dist/chunk-OCJPQFOR.js +88 -0
- package/dist/chunk-OCJPQFOR.js.map +1 -0
- package/dist/chunk-ODBY7S4X.js +141 -0
- package/dist/chunk-ODBY7S4X.js.map +1 -0
- package/dist/{chunk-DAHGLHNR.js → chunk-ONQ4WCUI.js} +7 -142
- package/dist/chunk-ONQ4WCUI.js.map +1 -0
- package/dist/{chunk-WPP3PEDE.js → chunk-P5TKZM3T.js} +32 -107
- package/dist/chunk-P5TKZM3T.js.map +1 -0
- package/dist/{chunk-RWCNNAL7.js → chunk-P66WDACW.js} +23 -22
- package/dist/chunk-P66WDACW.js.map +1 -0
- package/dist/{chunk-LSOYPSAT.js → chunk-QCRK4QEL.js} +4 -4
- package/dist/chunk-QCRK4QEL.js.map +1 -0
- package/dist/{chunk-YL5XFHR3.js → chunk-ROJPFPJ7.js} +2 -2
- package/dist/chunk-ROJPFPJ7.js.map +1 -0
- package/dist/chunk-RP2TAL3J.js +71 -0
- package/dist/chunk-RP2TAL3J.js.map +1 -0
- package/dist/{chunk-6PDJ45T4.js → chunk-RYOB3TLZ.js} +51 -26
- package/dist/chunk-RYOB3TLZ.js.map +1 -0
- package/dist/{chunk-Y5XVD2CD.js → chunk-SOQFMNQC.js} +110 -83
- package/dist/chunk-SOQFMNQC.js.map +1 -0
- package/dist/{chunk-TEVZS4FA.js → chunk-TDFTX32B.js} +16 -9
- package/dist/chunk-TDFTX32B.js.map +1 -0
- package/dist/chunk-VBLLDY4R.js +38 -0
- package/dist/chunk-VBLLDY4R.js.map +1 -0
- package/dist/{chunk-CGEV3ARR.js → chunk-VJNQJALF.js} +4 -4
- package/dist/chunk-VJNQJALF.js.map +1 -0
- package/dist/chunk-WAYSJMPS.js +26 -0
- package/dist/chunk-WAYSJMPS.js.map +1 -0
- package/dist/chunk-WC72BRHR.js +241 -0
- package/dist/chunk-WC72BRHR.js.map +1 -0
- package/dist/{chunk-MXZSI3AY.js → chunk-YPFOE2QJ.js} +43 -11
- package/dist/chunk-YPFOE2QJ.js.map +1 -0
- package/dist/claude-adapter-6P4SJH7P.js +7 -0
- package/dist/{claude-adapter-QMLFMSP3.js.map → claude-adapter-6P4SJH7P.js.map} +1 -1
- package/dist/{claude-login-5WELXPKT.js → claude-login-IS5WTBMP.js} +10 -10
- package/dist/claude-login-IS5WTBMP.js.map +1 -0
- package/dist/cli.js +371 -172
- package/dist/cli.js.map +1 -1
- package/dist/{codex-login-GZIFXUWD.js → codex-login-GMPF64MR.js} +11 -11
- package/dist/codex-login-GMPF64MR.js.map +1 -0
- package/dist/config-store-POB6I37G.js +7 -0
- package/dist/{config-store-W6FBCQAQ.js.map → config-store-POB6I37G.js.map} +1 -1
- package/dist/conversation-store-PRBHWQMJ.js +4 -0
- package/dist/conversation-store-PRBHWQMJ.js.map +1 -0
- package/dist/detect-providers-C4SVQHFF.js +4 -0
- package/dist/detect-providers-C4SVQHFF.js.map +1 -0
- package/dist/executor-RUX7VK3T.js +4 -0
- package/dist/{executor-6RIKIGXK.js.map → executor-RUX7VK3T.js.map} +1 -1
- package/dist/first-run-GDEVRFPO.js +230 -0
- package/dist/first-run-GDEVRFPO.js.map +1 -0
- package/dist/gemini-adapter-MV3U4QFH.js +7 -0
- package/dist/{gemini-adapter-6JIHZ7WI.js.map → gemini-adapter-MV3U4QFH.js.map} +1 -1
- package/dist/{gemini-login-AZGL3CE7.js → gemini-login-KE224MSW.js} +10 -10
- package/dist/gemini-login-KE224MSW.js.map +1 -0
- package/dist/index.d.ts +47 -17
- package/dist/index.js +86 -471
- package/dist/index.js.map +1 -1
- package/dist/input-history-MIOO3FIW.js +57 -0
- package/dist/input-history-MIOO3FIW.js.map +1 -0
- package/dist/kimi-adapter-UODMNX6K.js +6 -0
- package/dist/{kimi-adapter-JN4HFFHU.js.map → kimi-adapter-UODMNX6K.js.map} +1 -1
- package/dist/{kimi-login-6LUWB7P6.js → kimi-login-DNT5YBKX.js} +10 -10
- package/dist/kimi-login-DNT5YBKX.js.map +1 -0
- package/dist/logger-PLPDWACQ.js +3 -0
- package/dist/logger-PLPDWACQ.js.map +1 -0
- package/dist/model-discovery-O64ZWPX5.js +6 -0
- package/dist/model-discovery-O64ZWPX5.js.map +1 -0
- package/dist/native-cli-adapters-JMZX2C2C.js +8 -0
- package/dist/{native-cli-adapters-OLW3XX57.js.map → native-cli-adapters-JMZX2C2C.js.map} +1 -1
- package/dist/ollama-adapter-GE67BNSS.js +5 -0
- package/dist/{ollama-adapter-OJQ3FKWK.js.map → ollama-adapter-GE67BNSS.js.map} +1 -1
- package/dist/openai-adapter-SHPLK77L.js +7 -0
- package/dist/{openai-adapter-XU46EN7B.js.map → openai-adapter-SHPLK77L.js.map} +1 -1
- package/dist/pathResolver-A6IXQQFE.js +3 -0
- package/dist/pathResolver-A6IXQQFE.js.map +1 -0
- package/dist/profile-loader-TNAXBLDX.js +162 -0
- package/dist/profile-loader-TNAXBLDX.js.map +1 -0
- package/dist/registry-3NHVCXCZ.js +6 -0
- package/dist/{registry-AZ2LOHHJ.js.map → registry-3NHVCXCZ.js.map} +1 -1
- package/dist/registry-7CQ3NCAD.js +5 -0
- package/dist/{registry-H7B3AHPQ.js.map → registry-7CQ3NCAD.js.map} +1 -1
- package/dist/server-manager-DES23IBQ.js +5 -0
- package/dist/{server-manager-PTGBHCLS.js.map → server-manager-DES23IBQ.js.map} +1 -1
- package/dist/session-manager-EHD7GWM2.js +12 -0
- package/dist/{session-manager-XOMDMC77.js.map → session-manager-EHD7GWM2.js.map} +1 -1
- package/dist/skills/built-in/code-review/SKILL.md +85 -0
- package/dist/skills/built-in/commit/SKILL.md +83 -0
- package/dist/skills/built-in/debug/SKILL.md +119 -0
- package/dist/skills/built-in/plan/SKILL.md +123 -0
- package/dist/skills/built-in/refactor/SKILL.md +132 -0
- package/dist/skills/built-in/test/SKILL.md +128 -0
- package/dist/sqlite-store-7ZIVOUNI.js +5 -0
- package/dist/sqlite-store-7ZIVOUNI.js.map +1 -0
- package/dist/team-manager-6DCNLGTC.js +11 -0
- package/dist/{team-manager-HC4XGCFY.js.map → team-manager-6DCNLGTC.js.map} +1 -1
- package/dist/team-state-R2D7DT5M.js +3 -0
- package/dist/team-state-R2D7DT5M.js.map +1 -0
- package/dist/tmux-manager-WBKHUHDT.js +6 -0
- package/dist/{tmux-manager-GPYZ3WQH.js.map → tmux-manager-WBKHUHDT.js.map} +1 -1
- package/dist/tools-I6XCTEZY.js +6 -0
- package/dist/{tools-TSMXMHIF.js.map → tools-I6XCTEZY.js.map} +1 -1
- package/package.json +93 -89
- package/dist/App-FKRSMFMB.js +0 -2789
- package/dist/App-FKRSMFMB.js.map +0 -1
- package/dist/api-key-fallback-YQQBOQIL.js +0 -11
- package/dist/chunk-4IJD72YB.js.map +0 -1
- package/dist/chunk-6PDJ45T4.js.map +0 -1
- package/dist/chunk-CARHU3DO.js.map +0 -1
- package/dist/chunk-CGEV3ARR.js.map +0 -1
- package/dist/chunk-CS5X3BWX.js +0 -27
- package/dist/chunk-CS5X3BWX.js.map +0 -1
- package/dist/chunk-CYQNBB25.js.map +0 -1
- package/dist/chunk-DAHGLHNR.js.map +0 -1
- package/dist/chunk-DMBPX3RG.js.map +0 -1
- package/dist/chunk-H66O5Z2V.js.map +0 -1
- package/dist/chunk-HCIHOHLX.js.map +0 -1
- package/dist/chunk-HMJRPNPZ.js.map +0 -1
- package/dist/chunk-I5PZ4JTS.js.map +0 -1
- package/dist/chunk-IYW62KKR.js.map +0 -1
- package/dist/chunk-JAXXTYID.js.map +0 -1
- package/dist/chunk-LSOYPSAT.js.map +0 -1
- package/dist/chunk-MFBHNWGV.js.map +0 -1
- package/dist/chunk-MXZSI3AY.js.map +0 -1
- package/dist/chunk-NBR3GHMT.js.map +0 -1
- package/dist/chunk-RWCNNAL7.js.map +0 -1
- package/dist/chunk-TEVZS4FA.js.map +0 -1
- package/dist/chunk-UY2SYSEZ.js.map +0 -1
- package/dist/chunk-WAHVZH7V.js +0 -260
- package/dist/chunk-WAHVZH7V.js.map +0 -1
- package/dist/chunk-WPP3PEDE.js.map +0 -1
- package/dist/chunk-Y5XVD2CD.js.map +0 -1
- package/dist/chunk-YL5XFHR3.js.map +0 -1
- package/dist/chunk-ZGOHARPV.js.map +0 -1
- package/dist/claude-adapter-QMLFMSP3.js +0 -6
- package/dist/claude-login-5WELXPKT.js.map +0 -1
- package/dist/codex-login-GZIFXUWD.js.map +0 -1
- package/dist/config-store-W6FBCQAQ.js +0 -6
- package/dist/executor-6RIKIGXK.js +0 -4
- package/dist/gemini-adapter-6JIHZ7WI.js +0 -6
- package/dist/gemini-login-AZGL3CE7.js.map +0 -1
- package/dist/kimi-adapter-JN4HFFHU.js +0 -6
- package/dist/kimi-login-6LUWB7P6.js.map +0 -1
- package/dist/native-cli-adapters-OLW3XX57.js +0 -6
- package/dist/ollama-adapter-OJQ3FKWK.js +0 -6
- package/dist/openai-adapter-XU46EN7B.js +0 -6
- package/dist/registry-AZ2LOHHJ.js +0 -6
- package/dist/registry-H7B3AHPQ.js +0 -5
- package/dist/server-manager-PTGBHCLS.js +0 -5
- package/dist/session-manager-XOMDMC77.js +0 -12
- package/dist/team-manager-HC4XGCFY.js +0 -11
- package/dist/tmux-manager-GPYZ3WQH.js +0 -6
- 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-
|
|
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
|
|
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-
|
|
183
|
-
//# sourceMappingURL=chunk-
|
|
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":"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","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"]}
|
|
@@ -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 {
|
|
2
|
-
import { ModelNotFoundError, AuthenticationError } from './chunk-
|
|
3
|
-
import {
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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",
|
|
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-
|
|
325
|
-
//# sourceMappingURL=chunk-
|
|
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"]}
|