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/types/model.ts"],"names":[],"mappings":"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","file":"chunk-62HSGYQD.js","sourcesContent":["/**\r\n * Model-related types per PRD sections 7.1-7.5\r\n */\r\n\r\n// ── Provider Identifiers ─────────────────────────────────────────────────\r\n\r\nexport type ProviderName = \"anthropic\" | \"openai\" | \"google\" | \"kimi\" | \"ollama\";\r\n\r\n// ── Model Roles (PRD section 7.2) ───────────────────────────────────────\r\n\r\nexport type ModelRole =\r\n | \"planning\"\r\n | \"coding\"\r\n | \"review\"\r\n | \"testing\"\r\n | \"bugfix\"\r\n | \"documentation\";\r\n\r\n// ── Provider-specific Thinking / Reasoning Configuration ─────────────────\r\n\r\nexport interface IThinkingOption {\r\n readonly value: string;\r\n readonly label: string;\r\n readonly description: string;\r\n}\r\n\r\nexport interface IProviderThinkingConfig {\r\n readonly method: string;\r\n readonly options: readonly IThinkingOption[];\r\n readonly defaultValue: string;\r\n}\r\n\r\n/**\r\n * Provider-specific thinking configurations.\r\n *\r\n * Anthropic → Extended Thinking (budget_tokens: 1024–model max)\r\n * OpenAI → Reasoning Effort (low | medium | high)\r\n * Google 2.5 → Thinking Budget (0–24576, -1 = dynamic)\r\n * Google 3 → Thinking Level (minimal | low | medium | high)\r\n * Kimi → Thinking Mode (enabled | disabled)\r\n */\r\nexport const PROVIDER_THINKING_CONFIGS: Readonly<Record<string, IProviderThinkingConfig>> = {\r\n anthropic: {\r\n method: \"extended_thinking\",\r\n options: [\r\n { value: \"off\", label: \"Off\", description: \"No extended thinking\" },\r\n { value: \"low\", label: \"Low (1K tokens)\", description: \"budget_tokens: 1024\" },\r\n { value: \"medium\", label: \"Medium (8K tokens)\", description: \"budget_tokens: 8192\" },\r\n { value: \"high\", label: \"High (16K tokens)\", description: \"budget_tokens: 16384\" },\r\n { value: \"max\", label: \"Max (model limit)\", description: \"budget_tokens: max_output_tokens\" },\r\n ],\r\n defaultValue: \"medium\",\r\n },\r\n openai: {\r\n method: \"reasoning_effort\",\r\n options: [\r\n { value: \"low\", label: \"Low\", description: \"Fewer reasoning tokens, faster\" },\r\n { value: \"medium\", label: \"Medium\", description: \"Balanced reasoning (default)\" },\r\n { value: \"high\", label: \"High\", description: \"Thorough reasoning, more tokens\" },\r\n ],\r\n defaultValue: \"medium\",\r\n },\r\n \"google:gemini-2.5\": {\r\n method: \"thinking_budget\",\r\n options: [\r\n { value: \"off\", label: \"Off\", description: \"Disable thinking (budget: 0)\" },\r\n { value: \"dynamic\", label: \"Dynamic\", description: \"Auto-adjust based on complexity (budget: -1)\" },\r\n { value: \"low\", label: \"Low (4K tokens)\", description: \"thinkingBudget: 4096\" },\r\n { value: \"medium\", label: \"Medium (12K tokens)\", description: \"thinkingBudget: 12288\" },\r\n { value: \"high\", label: \"High (24K tokens)\", description: \"thinkingBudget: 24576\" },\r\n ],\r\n defaultValue: \"dynamic\",\r\n },\r\n \"google:gemini-3\": {\r\n method: \"thinking_level\",\r\n options: [\r\n { value: \"minimal\", label: \"Minimal\", description: \"Minimal thinking\" },\r\n { value: \"low\", label: \"Low\", description: \"Light thinking\" },\r\n { value: \"medium\", label: \"Medium\", description: \"Balanced thinking\" },\r\n { value: \"high\", label: \"High\", description: \"Deep thinking\" },\r\n ],\r\n defaultValue: \"medium\",\r\n },\r\n kimi: {\r\n method: \"thinking_mode\",\r\n options: [\r\n { value: \"enabled\", label: \"Enabled\", description: \"Include reasoning traces\" },\r\n { value: \"disabled\", label: \"Disabled\", description: \"Direct responses only\" },\r\n ],\r\n defaultValue: \"enabled\",\r\n },\r\n};\r\n\r\n/**\r\n * Look up the thinking configuration for a specific model.\r\n * Handles Google's model-family split (Gemini 2.5 vs Gemini 3).\r\n */\r\nexport function getThinkingConfigForModel(modelId: string): IProviderThinkingConfig | undefined {\r\n const modelInfo = SUPPORTED_MODELS[modelId];\r\n if (modelInfo === undefined) return undefined;\r\n\r\n if (modelInfo.provider === \"google\") {\r\n if (modelId.startsWith(\"gemini-3\")) {\r\n return PROVIDER_THINKING_CONFIGS[\"google:gemini-3\"];\r\n }\r\n return PROVIDER_THINKING_CONFIGS[\"google:gemini-2.5\"];\r\n }\r\n\r\n return PROVIDER_THINKING_CONFIGS[modelInfo.provider];\r\n}\r\n\r\n// ── Model Information ────────────────────────────────────────────────────\r\n\r\nexport interface IModelInfo {\r\n readonly id: string;\r\n readonly name: string;\r\n readonly provider: ProviderName;\r\n readonly contextWindow: number;\r\n readonly maxOutputTokens: number;\r\n readonly inputPricePerMToken: number;\r\n readonly outputPricePerMToken: number;\r\n readonly supportsStreaming: boolean;\r\n readonly supportsToolCalling: boolean;\r\n readonly supportedRoles: readonly ModelRole[];\r\n readonly description?: string | undefined;\r\n}\r\n\r\n// ── Model Display Entry (for /model selection UI) ────────────────────────\r\n\r\nexport interface IModelDisplayEntry {\r\n readonly id: string;\r\n readonly label: string;\r\n readonly description: string;\r\n readonly isDefault?: boolean | undefined;\r\n}\r\n\r\n// ── Role Configuration (PRD section 7.2) ─────────────────────────────────\r\n\r\nexport interface IRoleConfig {\r\n readonly primary: string;\r\n readonly fallback: readonly string[];\r\n}\r\n\r\n// ── Model Router Resolution (PRD section 7.2) ────────────────────────────\r\n\r\nexport type ModelResolutionSource =\r\n | \"user_override\"\r\n | \"role_config\"\r\n | \"fallback_chain\"\r\n | \"system_default\";\r\n\r\nexport interface IModelResolution {\r\n readonly modelId: string;\r\n readonly provider: ProviderName;\r\n readonly source: ModelResolutionSource;\r\n readonly role?: ModelRole | undefined;\r\n}\r\n\r\n// ── Token Usage ──────────────────────────────────────────────────────────\r\n\r\nexport interface ITokenUsage {\r\n readonly inputTokens: number;\r\n readonly outputTokens: number;\r\n readonly totalTokens: number;\r\n readonly costUsd: number;\r\n}\r\n\r\n// ── Supported Models Registry (PRD section 7.3) ─────────────────────────\r\n\r\nexport const SUPPORTED_MODELS: Record<string, IModelInfo> = {\r\n // ── Anthropic / Claude ─────────────────────────────────────────────────\r\n \"claude-opus-4-6\": {\r\n id: \"claude-opus-4-6\",\r\n name: \"Claude Opus 4.6\",\r\n provider: \"anthropic\",\r\n contextWindow: 200_000,\r\n maxOutputTokens: 32_000,\r\n inputPricePerMToken: 15,\r\n outputPricePerMToken: 75,\r\n supportsStreaming: true,\r\n supportsToolCalling: true,\r\n supportedRoles: [\"planning\", \"review\", \"bugfix\", \"coding\"],\r\n description: \"Most capable for complex work\",\r\n },\r\n \"claude-opus-4-6-1m\": {\r\n id: \"claude-opus-4-6-1m\",\r\n name: \"Claude Opus 4.6 (1M context)\",\r\n provider: \"anthropic\",\r\n contextWindow: 1_000_000,\r\n maxOutputTokens: 32_000,\r\n inputPricePerMToken: 10,\r\n outputPricePerMToken: 37.5,\r\n supportsStreaming: true,\r\n supportsToolCalling: true,\r\n supportedRoles: [\"planning\", \"review\", \"bugfix\", \"coding\"],\r\n description: \"Opus 4.6 with 1M context\",\r\n },\r\n \"claude-sonnet-4-6\": {\r\n id: \"claude-sonnet-4-6\",\r\n name: \"Claude Sonnet 4.6\",\r\n provider: \"anthropic\",\r\n contextWindow: 200_000,\r\n maxOutputTokens: 16_000,\r\n inputPricePerMToken: 3,\r\n outputPricePerMToken: 15,\r\n supportsStreaming: true,\r\n supportsToolCalling: true,\r\n supportedRoles: [\"coding\", \"bugfix\", \"documentation\", \"review\"],\r\n description: \"Best for everyday tasks\",\r\n },\r\n \"claude-sonnet-4-6-1m\": {\r\n id: \"claude-sonnet-4-6-1m\",\r\n name: \"Claude Sonnet 4.6 (1M context)\",\r\n provider: \"anthropic\",\r\n contextWindow: 1_000_000,\r\n maxOutputTokens: 16_000,\r\n inputPricePerMToken: 6,\r\n outputPricePerMToken: 22.5,\r\n supportsStreaming: true,\r\n supportsToolCalling: true,\r\n supportedRoles: [\"coding\", \"bugfix\", \"documentation\", \"review\"],\r\n description: \"Sonnet 4.6 with 1M context\",\r\n },\r\n \"claude-haiku-4-5\": {\r\n id: \"claude-haiku-4-5\",\r\n name: \"Claude Haiku 4.5\",\r\n provider: \"anthropic\",\r\n contextWindow: 200_000,\r\n maxOutputTokens: 8_192,\r\n inputPricePerMToken: 0.8,\r\n outputPricePerMToken: 4,\r\n supportsStreaming: true,\r\n supportsToolCalling: true,\r\n supportedRoles: [\"testing\", \"documentation\"],\r\n description: \"Fastest for quick answers\",\r\n },\r\n\r\n // ── OpenAI / Codex ─────────────────────────────────────────────────────\r\n \"gpt-5.3-codex\": {\r\n id: \"gpt-5.3-codex\",\r\n name: \"GPT-5.3 Codex\",\r\n provider: \"openai\",\r\n contextWindow: 256_000,\r\n maxOutputTokens: 32_000,\r\n inputPricePerMToken: 2.5,\r\n outputPricePerMToken: 10,\r\n supportsStreaming: true,\r\n supportsToolCalling: true,\r\n supportedRoles: [\"planning\", \"coding\", \"review\", \"bugfix\"],\r\n description: \"Latest frontier agentic coding model\",\r\n },\r\n \"gpt-5.3-codex-spark\": {\r\n id: \"gpt-5.3-codex-spark\",\r\n name: \"GPT-5.3 Codex Spark\",\r\n provider: \"openai\",\r\n contextWindow: 256_000,\r\n maxOutputTokens: 16_384,\r\n inputPricePerMToken: 0.15,\r\n outputPricePerMToken: 0.6,\r\n supportsStreaming: true,\r\n supportsToolCalling: true,\r\n supportedRoles: [\"coding\", \"testing\", \"documentation\"],\r\n description: \"Ultra-fast coding model\",\r\n },\r\n \"gpt-5.2-codex\": {\r\n id: \"gpt-5.2-codex\",\r\n name: \"GPT-5.2 Codex\",\r\n provider: \"openai\",\r\n contextWindow: 256_000,\r\n maxOutputTokens: 32_000,\r\n inputPricePerMToken: 2.5,\r\n outputPricePerMToken: 10,\r\n supportsStreaming: true,\r\n supportsToolCalling: true,\r\n supportedRoles: [\"planning\", \"coding\", \"review\", \"bugfix\"],\r\n description: \"Frontier agentic coding model\",\r\n },\r\n \"gpt-5.1-codex-max\": {\r\n id: \"gpt-5.1-codex-max\",\r\n name: \"GPT-5.1 Codex Max\",\r\n provider: \"openai\",\r\n contextWindow: 256_000,\r\n maxOutputTokens: 100_000,\r\n inputPricePerMToken: 10,\r\n outputPricePerMToken: 40,\r\n supportsStreaming: true,\r\n supportsToolCalling: true,\r\n supportedRoles: [\"planning\", \"review\", \"coding\"],\r\n description: \"Codex-optimized flagship for deep and fast reasoning\",\r\n },\r\n \"gpt-5.2\": {\r\n id: \"gpt-5.2\",\r\n name: \"GPT-5.2\",\r\n provider: \"openai\",\r\n contextWindow: 256_000,\r\n maxOutputTokens: 32_000,\r\n inputPricePerMToken: 2.5,\r\n outputPricePerMToken: 10,\r\n supportsStreaming: true,\r\n supportsToolCalling: true,\r\n supportedRoles: [\"planning\", \"coding\", \"review\", \"bugfix\"],\r\n description: \"Latest frontier model with improvements across knowledge, reasoning and coding\",\r\n },\r\n \"gpt-5.1-codex-mini\": {\r\n id: \"gpt-5.1-codex-mini\",\r\n name: \"GPT-5.1 Codex Mini\",\r\n provider: \"openai\",\r\n contextWindow: 256_000,\r\n maxOutputTokens: 16_384,\r\n inputPricePerMToken: 0.15,\r\n outputPricePerMToken: 0.6,\r\n supportsStreaming: true,\r\n supportsToolCalling: true,\r\n supportedRoles: [\"testing\", \"documentation\", \"coding\"],\r\n description: \"Optimized for codex. Cheaper, faster, but less capable\",\r\n },\r\n\r\n // ── Google / Gemini ────────────────────────────────────────────────────\r\n \"gemini-3-pro-preview\": {\r\n id: \"gemini-3-pro-preview\",\r\n name: \"Gemini 3 Pro Preview\",\r\n provider: \"google\",\r\n contextWindow: 2_000_000,\r\n maxOutputTokens: 65_536,\r\n inputPricePerMToken: 1.25,\r\n outputPricePerMToken: 10,\r\n supportsStreaming: true,\r\n supportsToolCalling: true,\r\n supportedRoles: [\"planning\", \"review\", \"coding\"],\r\n description: \"Next-gen Gemini Pro preview\",\r\n },\r\n \"gemini-3-flash-preview\": {\r\n id: \"gemini-3-flash-preview\",\r\n name: \"Gemini 3 Flash Preview\",\r\n provider: \"google\",\r\n contextWindow: 2_000_000,\r\n maxOutputTokens: 65_536,\r\n inputPricePerMToken: 0.15,\r\n outputPricePerMToken: 0.6,\r\n supportsStreaming: true,\r\n supportsToolCalling: true,\r\n supportedRoles: [\"coding\", \"testing\", \"documentation\"],\r\n description: \"Next-gen Gemini Flash preview\",\r\n },\r\n \"gemini-2.5-pro\": {\r\n id: \"gemini-2.5-pro\",\r\n name: \"Gemini 2.5 Pro\",\r\n provider: \"google\",\r\n contextWindow: 2_000_000,\r\n maxOutputTokens: 65_536,\r\n inputPricePerMToken: 1.25,\r\n outputPricePerMToken: 10,\r\n supportsStreaming: true,\r\n supportsToolCalling: true,\r\n supportedRoles: [\"planning\", \"review\", \"coding\"],\r\n description: \"Gemini 2.5 Pro stable\",\r\n },\r\n \"gemini-2.5-flash\": {\r\n id: \"gemini-2.5-flash\",\r\n name: \"Gemini 2.5 Flash\",\r\n provider: \"google\",\r\n contextWindow: 2_000_000,\r\n maxOutputTokens: 65_536,\r\n inputPricePerMToken: 0.15,\r\n outputPricePerMToken: 0.6,\r\n supportsStreaming: true,\r\n supportsToolCalling: true,\r\n supportedRoles: [\"testing\", \"documentation\", \"coding\"],\r\n description: \"Gemini 2.5 Flash stable\",\r\n },\r\n \"gemini-2.5-flash-lite\": {\r\n id: \"gemini-2.5-flash-lite\",\r\n name: \"Gemini 2.5 Flash Lite\",\r\n provider: \"google\",\r\n contextWindow: 1_000_000,\r\n maxOutputTokens: 32_768,\r\n inputPricePerMToken: 0.075,\r\n outputPricePerMToken: 0.3,\r\n supportsStreaming: true,\r\n supportsToolCalling: true,\r\n supportedRoles: [\"testing\", \"documentation\"],\r\n description: \"Gemini 2.5 Flash Lite\",\r\n },\r\n\r\n // ── Moonshot / Kimi ────────────────────────────────────────────────────\r\n \"kimi-for-coding\": {\r\n id: \"kimi-for-coding\",\r\n name: \"Kimi Code\",\r\n provider: \"kimi\",\r\n contextWindow: 128_000,\r\n maxOutputTokens: 8_192,\r\n inputPricePerMToken: 0.5,\r\n outputPricePerMToken: 2,\r\n supportsStreaming: true,\r\n supportsToolCalling: true,\r\n supportedRoles: [\"coding\", \"bugfix\"],\r\n description: \"Kimi for coding\",\r\n },\r\n};\r\n\r\n// ── Ordered Model Lists Per Provider (for /model selection UI) ───────────\r\n\r\nexport const PROVIDER_MODEL_ORDER: Readonly<Record<string, readonly IModelDisplayEntry[]>> = {\r\n anthropic: [\r\n { id: \"claude-opus-4-6\", label: \"Default (recommended)\", description: \"Opus 4.6 · Most capable for complex work\", isDefault: true },\r\n { id: \"claude-opus-4-6-1m\", label: \"Opus (1M context)\", description: \"Opus 4.6 with 1M context · Billed as extra usage · $10/$37.50 per Mtok\" },\r\n { id: \"claude-sonnet-4-6\", label: \"Sonnet\", description: \"Sonnet 4.6 · Best for everyday tasks\" },\r\n { id: \"claude-sonnet-4-6-1m\", label: \"Sonnet (1M context)\", description: \"Sonnet 4.6 with 1M context · Billed as extra usage · $6/$22.50 per Mtok\" },\r\n { id: \"claude-haiku-4-5\", label: \"Haiku\", description: \"Haiku 4.5 · Fastest for quick answers\" },\r\n ],\r\n openai: [\r\n { id: \"gpt-5.3-codex\", label: \"gpt-5.3-codex\", description: \"Latest frontier agentic coding model\", isDefault: true },\r\n { id: \"gpt-5.3-codex-spark\", label: \"gpt-5.3-codex-spark\", description: \"Ultra-fast coding model\" },\r\n { id: \"gpt-5.2-codex\", label: \"gpt-5.2-codex\", description: \"Frontier agentic coding model\" },\r\n { id: \"gpt-5.1-codex-max\", label: \"gpt-5.1-codex-max\", description: \"Codex-optimized flagship for deep and fast reasoning\" },\r\n { id: \"gpt-5.2\", label: \"gpt-5.2\", description: \"Latest frontier model with improvements across knowledge, reasoning and coding\" },\r\n { id: \"gpt-5.1-codex-mini\", label: \"gpt-5.1-codex-mini\", description: \"Optimized for codex. Cheaper, faster, but less capable\" },\r\n ],\r\n google: [\r\n { id: \"gemini-3-pro-preview\", label: \"gemini-3-pro-preview\", description: \"Next-gen Gemini Pro preview\", isDefault: true },\r\n { id: \"gemini-3-flash-preview\", label: \"gemini-3-flash-preview\", description: \"Next-gen Gemini Flash preview\" },\r\n { id: \"gemini-2.5-pro\", label: \"gemini-2.5-pro\", description: \"Gemini 2.5 Pro stable\" },\r\n { id: \"gemini-2.5-flash\", label: \"gemini-2.5-flash\", description: \"Gemini 2.5 Flash stable\" },\r\n { id: \"gemini-2.5-flash-lite\", label: \"gemini-2.5-flash-lite\", description: \"Gemini 2.5 Flash Lite\" },\r\n ],\r\n kimi: [\r\n { id: \"kimi-for-coding\", label: \"kimi-for-coding (Kimi Code)\", description: \"Kimi for coding\", isDefault: true },\r\n ],\r\n};\r\n\r\nexport const DEFAULT_MODEL_ID = \"claude-sonnet-4-6\";\r\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { CredentialStore } from './chunk-
|
|
2
|
-
import { logger } from './chunk-
|
|
1
|
+
import { CredentialStore } from './chunk-AQ23TYSQ.js';
|
|
2
|
+
import { logger } from './chunk-HEKFAKVH.js';
|
|
3
3
|
|
|
4
4
|
// src/auth/api-key-fallback.ts
|
|
5
5
|
var ENV_KEY_MAP = {
|
|
@@ -115,5 +115,5 @@ var ApiKeyFallback = class {
|
|
|
115
115
|
};
|
|
116
116
|
|
|
117
117
|
export { ApiKeyFallback, getEnvKeyName, resolveProviderName };
|
|
118
|
-
//# sourceMappingURL=chunk-
|
|
119
|
-
//# sourceMappingURL=chunk-
|
|
118
|
+
//# sourceMappingURL=chunk-6GUD7QIM.js.map
|
|
119
|
+
//# sourceMappingURL=chunk-6GUD7QIM.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/auth/api-key-fallback.ts"],"names":[],"mappings":"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","file":"chunk-6GUD7QIM.js","sourcesContent":["/**\r\n * API Key Fallback — store/retrieve/validate API keys per provider\r\n * Per PRD section 13.5 — optional fallback for CI/headless environments\r\n */\r\n\r\nimport type { ProviderName, ICredential } from \"../types/index.js\";\r\nimport { CredentialStore } from \"./credential-store.js\";\r\nimport { logger } from \"../utils/index.js\";\r\n\r\n// ── Environment Variable Mapping ─────────────────────────────────────────\r\n\r\nconst ENV_KEY_MAP: Readonly<Record<ProviderName, string | undefined>> = {\r\n anthropic: \"ANTHROPIC_API_KEY\",\r\n openai: \"OPENAI_API_KEY\",\r\n google: \"GOOGLE_API_KEY\",\r\n kimi: \"MOONSHOT_API_KEY\",\r\n ollama: undefined,\r\n} as const;\r\n\r\n// ── CLI-Friendly Provider Names ──────────────────────────────────────────\r\n\r\nconst CLI_PROVIDER_MAP: Readonly<Record<string, ProviderName>> = {\r\n claude: \"anthropic\",\r\n anthropic: \"anthropic\",\r\n openai: \"openai\",\r\n codex: \"openai\",\r\n google: \"google\",\r\n gemini: \"google\",\r\n kimi: \"kimi\",\r\n moonshot: \"kimi\",\r\n} as const;\r\n\r\n// ── API Key Validation Patterns ──────────────────────────────────────────\r\n\r\nconst KEY_PATTERNS: Readonly<Record<ProviderName, RegExp | undefined>> = {\r\n anthropic: /^sk-ant-api\\d{2}-[A-Za-z0-9_-]{20,}$/,\r\n openai: /^sk-[A-Za-z0-9_-]{20,}$/,\r\n google: /^AIza[A-Za-z0-9_-]{30,}$/,\r\n kimi: /^sk-[A-Za-z0-9_-]{20,}$/,\r\n ollama: undefined,\r\n} as const;\r\n\r\nconst API_KEY_CREDENTIAL_PREFIX = \"apikey:\";\r\n\r\n// ── Public Helpers ───────────────────────────────────────────────────────\r\n\r\nexport function resolveProviderName(alias: string): ProviderName | undefined {\r\n const normalized = alias.toLowerCase().trim();\r\n return CLI_PROVIDER_MAP[normalized];\r\n}\r\n\r\nexport function getEnvKeyName(provider: ProviderName): string | undefined {\r\n return ENV_KEY_MAP[provider];\r\n}\r\n\r\n// ── ApiKeyFallback Class ─────────────────────────────────────────────────\r\n\r\nexport class ApiKeyFallback {\r\n private readonly store: CredentialStore;\r\n\r\n constructor(store?: CredentialStore) {\r\n this.store = store ?? new CredentialStore();\r\n }\r\n\r\n /**\r\n * Validate an API key format for a given provider.\r\n */\r\n validateKeyFormat(provider: ProviderName, key: string): boolean {\r\n const pattern = KEY_PATTERNS[provider];\r\n if (pattern === undefined) {\r\n return key.length > 0;\r\n }\r\n return pattern.test(key);\r\n }\r\n\r\n /**\r\n * Store an API key for a provider via the credential store.\r\n */\r\n async setKey(provider: ProviderName, key: string): Promise<void> {\r\n if (!this.validateKeyFormat(provider, key)) {\r\n logger.warn({ provider }, \"API key format does not match expected pattern — storing anyway\");\r\n }\r\n\r\n const credential: ICredential = {\r\n provider,\r\n method: \"api_key\",\r\n token: `${API_KEY_CREDENTIAL_PREFIX}${key}`,\r\n };\r\n\r\n await this.store.set(provider, credential);\r\n logger.info({ provider }, \"API key stored\");\r\n }\r\n\r\n /**\r\n * Retrieve a stored API key credential for a provider.\r\n * Only returns credentials stored via setKey (not native login tokens).\r\n */\r\n async getCredential(provider: ProviderName): Promise<ICredential | undefined> {\r\n const stored = await this.store.get(provider);\r\n if (stored === undefined) return undefined;\r\n\r\n if (stored.method !== \"api_key\") return undefined;\r\n\r\n // Strip the internal prefix\r\n if (stored.token?.startsWith(API_KEY_CREDENTIAL_PREFIX)) {\r\n return {\r\n ...stored,\r\n token: stored.token.slice(API_KEY_CREDENTIAL_PREFIX.length),\r\n };\r\n }\r\n\r\n return stored;\r\n }\r\n\r\n /**\r\n * Get an API key from environment variables.\r\n */\r\n getFromEnvironment(provider: ProviderName): ICredential | undefined {\r\n const envKey = ENV_KEY_MAP[provider];\r\n if (envKey === undefined) return undefined;\r\n\r\n const value = process.env[envKey];\r\n if (value === undefined || value.length === 0) return undefined;\r\n\r\n return {\r\n provider,\r\n method: \"env_variable\",\r\n token: value,\r\n };\r\n }\r\n\r\n /**\r\n * Delete a stored API key for a provider.\r\n */\r\n async deleteKey(provider: ProviderName): Promise<void> {\r\n const stored = await this.store.get(provider);\r\n if (stored !== undefined && stored.method === \"api_key\") {\r\n await this.store.delete(provider);\r\n logger.info({ provider }, \"API key deleted\");\r\n }\r\n }\r\n\r\n /**\r\n * Check if an API key is available (stored or env) for a provider.\r\n */\r\n async hasKey(provider: ProviderName): Promise<boolean> {\r\n const stored = await this.getCredential(provider);\r\n if (stored !== undefined) return true;\r\n return this.getFromEnvironment(provider) !== undefined;\r\n }\r\n}\r\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { logger } from './chunk-HEKFAKVH.js';
|
|
2
|
+
import { getCredentialsPath, ensureSecureDirectory, getAemeathHome } from './chunk-BY4DAKUU.js';
|
|
3
3
|
import { scryptSync, randomBytes, createCipheriv, createDecipheriv } from 'crypto';
|
|
4
4
|
import { existsSync, chmodSync, writeFileSync, readFileSync } from 'fs';
|
|
5
5
|
|
|
@@ -26,7 +26,7 @@ var CredentialStore = class {
|
|
|
26
26
|
await keytar.setPassword(service, provider, data);
|
|
27
27
|
logger.info({ provider }, "Credential stored in OS keychain");
|
|
28
28
|
return;
|
|
29
|
-
} catch
|
|
29
|
+
} catch {
|
|
30
30
|
logger.warn({ provider }, "OS keychain store failed, using encrypted fallback");
|
|
31
31
|
}
|
|
32
32
|
}
|
|
@@ -124,8 +124,8 @@ var CredentialStore = class {
|
|
|
124
124
|
try {
|
|
125
125
|
const content = this.decryptFile(credPath);
|
|
126
126
|
const store = JSON.parse(content);
|
|
127
|
-
|
|
128
|
-
this.encryptFile(credPath, JSON.stringify(
|
|
127
|
+
const { [provider]: _deletedCredential, ...remainingStore } = store;
|
|
128
|
+
this.encryptFile(credPath, JSON.stringify(remainingStore));
|
|
129
129
|
} catch {
|
|
130
130
|
}
|
|
131
131
|
}
|
|
@@ -180,5 +180,5 @@ var CredentialStore = class {
|
|
|
180
180
|
};
|
|
181
181
|
|
|
182
182
|
export { CredentialStore };
|
|
183
|
-
//# sourceMappingURL=chunk-
|
|
184
|
-
//# sourceMappingURL=chunk-
|
|
183
|
+
//# sourceMappingURL=chunk-AQ23TYSQ.js.map
|
|
184
|
+
//# sourceMappingURL=chunk-AQ23TYSQ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/auth/credential-store.ts"],"names":[],"mappings":"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","file":"chunk-AQ23TYSQ.js","sourcesContent":["/**\r\n * Credential storage per PRD section 13.6\r\n * Primary: OS keychain via node-keytar\r\n * Fallback: AES-256-GCM encrypted file\r\n */\r\n\r\nimport { createCipheriv, createDecipheriv, randomBytes, scryptSync } from \"node:crypto\";\r\nimport { readFileSync, writeFileSync, existsSync, chmodSync } from \"node:fs\";\r\nimport type * as Keytar from \"keytar\";\r\nimport type { ProviderName, ICredential } from \"../types/index.js\";\r\nimport { getCredentialsPath, ensureSecureDirectory, getAemeathHome } from \"../utils/index.js\";\r\nimport { logger } from \"../utils/index.js\";\r\n\r\nconst SERVICE_PREFIX = \"com.aemeathcli\";\r\nconst ALGORITHM = \"aes-256-gcm\";\r\nconst KEY_LENGTH = 32;\r\nconst IV_LENGTH = 16;\r\nconst TAG_LENGTH = 16;\r\nconst SALT_LENGTH = 32;\r\n\r\nfunction getServiceName(provider: ProviderName): string {\r\n return `${SERVICE_PREFIX}.${provider}`;\r\n}\r\n\r\nexport class CredentialStore {\r\n private keytarAvailable: boolean | undefined;\r\n\r\n /**\r\n * Store a credential for a provider.\r\n */\r\n async set(provider: ProviderName, credential: ICredential): Promise<void> {\r\n const data = JSON.stringify(credential);\r\n const service = getServiceName(provider);\r\n\r\n if (await this.isKeytarAvailable()) {\r\n try {\r\n const keytar = await this.getKeytar();\r\n await keytar.setPassword(service, provider, data);\r\n logger.info({ provider }, \"Credential stored in OS keychain\");\r\n return;\r\n } catch {\r\n logger.warn({ provider }, \"OS keychain store failed, using encrypted fallback\");\r\n }\r\n }\r\n\r\n // Fallback: encrypted file\r\n this.storeEncrypted(provider, data);\r\n }\r\n\r\n /**\r\n * Get a credential for a provider.\r\n */\r\n async get(provider: ProviderName): Promise<ICredential | undefined> {\r\n const service = getServiceName(provider);\r\n\r\n if (await this.isKeytarAvailable()) {\r\n try {\r\n const keytar = await this.getKeytar();\r\n const data = await keytar.getPassword(service, provider);\r\n if (data) {\r\n return JSON.parse(data) as ICredential;\r\n }\r\n } catch {\r\n // Try fallback\r\n }\r\n }\r\n\r\n // Fallback: encrypted file\r\n return this.loadEncrypted(provider);\r\n }\r\n\r\n /**\r\n * Delete a credential for a provider.\r\n */\r\n async delete(provider: ProviderName): Promise<void> {\r\n const service = getServiceName(provider);\r\n\r\n if (await this.isKeytarAvailable()) {\r\n try {\r\n const keytar = await this.getKeytar();\r\n await keytar.deletePassword(service, provider);\r\n } catch {\r\n // Ignore\r\n }\r\n }\r\n\r\n // Also clean fallback\r\n this.deleteEncrypted(provider);\r\n }\r\n\r\n /**\r\n * Check if a credential exists for a provider.\r\n */\r\n async has(provider: ProviderName): Promise<boolean> {\r\n const credential = await this.get(provider);\r\n return credential !== undefined;\r\n }\r\n\r\n // ── Encrypted File Fallback ────────────────────────────────────────────\r\n\r\n private getEncryptionKey(salt: Buffer): Buffer {\r\n // Derive key from machine-specific data + random salt using scrypt with high cost\r\n const machineId = process.env[\"USER\"] ?? process.env[\"USERNAME\"] ?? \"aemeathcli\";\r\n const homedir = process.env[\"HOME\"] ?? process.env[\"USERPROFILE\"] ?? \"/\";\r\n const password = `aemeathcli-${machineId}-${homedir}`;\r\n return scryptSync(password, salt, KEY_LENGTH, {\r\n N: 32768,\r\n r: 8,\r\n p: 1,\r\n maxmem: 64 * 1024 * 1024,\r\n });\r\n }\r\n\r\n private storeEncrypted(provider: ProviderName, data: string): void {\r\n const credPath = getCredentialsPath();\r\n ensureSecureDirectory(getAemeathHome());\r\n\r\n let store: Record<string, string> = {};\r\n if (existsSync(credPath)) {\r\n try {\r\n const existing = this.decryptFile(credPath);\r\n store = JSON.parse(existing) as Record<string, string>;\r\n } catch {\r\n store = {};\r\n }\r\n }\r\n\r\n store[provider] = data;\r\n this.encryptFile(credPath, JSON.stringify(store));\r\n chmodSync(credPath, 0o600);\r\n logger.info({ provider }, \"Credential stored in encrypted fallback\");\r\n }\r\n\r\n private loadEncrypted(provider: ProviderName): ICredential | undefined {\r\n const credPath = getCredentialsPath();\r\n if (!existsSync(credPath)) {\r\n return undefined;\r\n }\r\n\r\n try {\r\n const content = this.decryptFile(credPath);\r\n const store = JSON.parse(content) as Record<string, string>;\r\n const data = store[provider];\r\n if (data) {\r\n return JSON.parse(data) as ICredential;\r\n }\r\n } catch {\r\n return undefined;\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n private deleteEncrypted(provider: ProviderName): void {\r\n const credPath = getCredentialsPath();\r\n if (!existsSync(credPath)) {\r\n return;\r\n }\r\n\r\n try {\r\n const content = this.decryptFile(credPath);\r\n const store = JSON.parse(content) as Record<string, string>;\r\n const { [provider]: _deletedCredential, ...remainingStore } = store;\r\n this.encryptFile(credPath, JSON.stringify(remainingStore));\r\n } catch {\r\n // Ignore\r\n }\r\n }\r\n\r\n private encryptFile(filePath: string, plaintext: string): void {\r\n const salt = randomBytes(SALT_LENGTH);\r\n const key = this.getEncryptionKey(salt);\r\n const iv = randomBytes(IV_LENGTH);\r\n const cipher = createCipheriv(ALGORITHM, key, iv);\r\n const encrypted = Buffer.concat([cipher.update(plaintext, \"utf-8\"), cipher.final()]);\r\n const tag = cipher.getAuthTag();\r\n\r\n // Format: salt(32) + iv(16) + tag(16) + encrypted\r\n const output = Buffer.concat([salt, iv, tag, encrypted]);\r\n writeFileSync(filePath, output);\r\n }\r\n\r\n private decryptFile(filePath: string): string {\r\n const fileContent = readFileSync(filePath);\r\n\r\n // Handle legacy format without salt (iv(16) + tag(16) + encrypted)\r\n const hasStoredSalt = fileContent.length > SALT_LENGTH + IV_LENGTH + TAG_LENGTH;\r\n let salt: Buffer;\r\n let dataOffset: number;\r\n\r\n if (hasStoredSalt) {\r\n salt = fileContent.subarray(0, SALT_LENGTH);\r\n dataOffset = SALT_LENGTH;\r\n } else {\r\n // Legacy fallback: derive salt from username (for backward compatibility)\r\n const machineId = process.env[\"USER\"] ?? process.env[\"USERNAME\"] ?? \"aemeathcli\";\r\n salt = Buffer.from(`aemeathcli-${machineId}`.padEnd(SALT_LENGTH, \"\\0\").slice(0, SALT_LENGTH));\r\n dataOffset = 0;\r\n }\r\n\r\n const key = this.getEncryptionKey(salt);\r\n const iv = fileContent.subarray(dataOffset, dataOffset + IV_LENGTH);\r\n const tag = fileContent.subarray(dataOffset + IV_LENGTH, dataOffset + IV_LENGTH + TAG_LENGTH);\r\n const encrypted = fileContent.subarray(dataOffset + IV_LENGTH + TAG_LENGTH);\r\n\r\n const decipher = createDecipheriv(ALGORITHM, key, iv);\r\n decipher.setAuthTag(tag);\r\n const decrypted = Buffer.concat([decipher.update(encrypted), decipher.final()]);\r\n\r\n return decrypted.toString(\"utf-8\");\r\n }\r\n\r\n // ── Keytar Detection ───────────────────────────────────────────────────\r\n\r\n private async isKeytarAvailable(): Promise<boolean> {\r\n if (this.keytarAvailable !== undefined) {\r\n return this.keytarAvailable;\r\n }\r\n\r\n try {\r\n await import(\"keytar\");\r\n this.keytarAvailable = true;\r\n } catch {\r\n this.keytarAvailable = false;\r\n }\r\n\r\n return this.keytarAvailable;\r\n }\r\n\r\n private async getKeytar(): Promise<typeof Keytar> {\r\n return import(\"keytar\");\r\n }\r\n}\r\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { homedir } from 'os';
|
|
2
|
-
import { join } from 'path';
|
|
1
|
+
import { homedir, tmpdir } from 'os';
|
|
2
|
+
import { join, dirname } from 'path';
|
|
3
3
|
import { existsSync, mkdirSync } from 'fs';
|
|
4
4
|
|
|
5
5
|
// src/utils/pathResolver.ts
|
|
@@ -25,9 +25,15 @@ function getLogDir() {
|
|
|
25
25
|
function getCredentialsPath() {
|
|
26
26
|
return join(getAemeathHome(), "credentials.enc");
|
|
27
27
|
}
|
|
28
|
+
function getMCPConfigPath() {
|
|
29
|
+
return join(getAemeathHome(), "mcp.json");
|
|
30
|
+
}
|
|
28
31
|
function getUserSkillsDir() {
|
|
29
32
|
return join(getAemeathHome(), "skills");
|
|
30
33
|
}
|
|
34
|
+
function getUniversalUserSkillsDir() {
|
|
35
|
+
return join(homedir(), ".agents", "skills");
|
|
36
|
+
}
|
|
31
37
|
function getTeamsDir() {
|
|
32
38
|
return join(getAemeathHome(), "teams");
|
|
33
39
|
}
|
|
@@ -43,9 +49,19 @@ function getProjectConfigPath(projectRoot) {
|
|
|
43
49
|
function getProjectSkillsDir(projectRoot) {
|
|
44
50
|
return join(getProjectConfigDir(projectRoot), "skills");
|
|
45
51
|
}
|
|
52
|
+
function getUniversalProjectSkillsDir(projectRoot) {
|
|
53
|
+
return join(projectRoot, ".agents", "skills");
|
|
54
|
+
}
|
|
55
|
+
function getProjectMCPConfigPath(projectRoot) {
|
|
56
|
+
return join(getProjectConfigDir(projectRoot), "mcp.json");
|
|
57
|
+
}
|
|
58
|
+
function getProjectAgentsPath(projectRoot) {
|
|
59
|
+
return join(getProjectConfigDir(projectRoot), "AGENTS.md");
|
|
60
|
+
}
|
|
46
61
|
function getIPCSocketDir() {
|
|
47
|
-
const
|
|
48
|
-
|
|
62
|
+
const tmp = process.env["TMPDIR"] ?? tmpdir();
|
|
63
|
+
const uid = process.platform === "win32" ? process.env["USERNAME"] ?? "user" : String(process.getuid?.() ?? "user");
|
|
64
|
+
return join(tmp, `aemeathcli-${uid}`);
|
|
49
65
|
}
|
|
50
66
|
function getIPCSocketPath(sessionId) {
|
|
51
67
|
return join(getIPCSocketDir(), `${sessionId}.sock`);
|
|
@@ -66,7 +82,23 @@ function initializeDirectories() {
|
|
|
66
82
|
ensureDirectory(getTeamsDir());
|
|
67
83
|
ensureDirectory(getTasksDir());
|
|
68
84
|
}
|
|
85
|
+
function findProjectRoot(startDir) {
|
|
86
|
+
let currentDir = startDir ?? process.cwd();
|
|
87
|
+
while (currentDir !== dirname(currentDir)) {
|
|
88
|
+
if (existsSync(join(currentDir, ".git"))) {
|
|
89
|
+
return currentDir;
|
|
90
|
+
}
|
|
91
|
+
if (existsSync(join(currentDir, ".aemeathcli"))) {
|
|
92
|
+
return currentDir;
|
|
93
|
+
}
|
|
94
|
+
if (existsSync(join(currentDir, "package.json"))) {
|
|
95
|
+
return currentDir;
|
|
96
|
+
}
|
|
97
|
+
currentDir = dirname(currentDir);
|
|
98
|
+
}
|
|
99
|
+
return process.cwd();
|
|
100
|
+
}
|
|
69
101
|
|
|
70
|
-
export { ensureDirectory, ensureSecureDirectory, getAemeathHome, getConfigPath, getCredentialsPath, getDatabaseDir, getDatabasePath, getIPCSocketDir, getIPCSocketPath, getProjectConfigPath, getProjectSkillsDir, getTasksDir, getTeamsDir, getUserSkillsDir, initializeDirectories };
|
|
71
|
-
//# sourceMappingURL=chunk-
|
|
72
|
-
//# sourceMappingURL=chunk-
|
|
102
|
+
export { ensureDirectory, ensureSecureDirectory, findProjectRoot, getAemeathHome, getConfigDir, getConfigPath, getCredentialsPath, getDatabaseDir, getDatabasePath, getIPCSocketDir, getIPCSocketPath, getLogDir, getMCPConfigPath, getProjectAgentsPath, getProjectConfigDir, getProjectConfigPath, getProjectMCPConfigPath, getProjectSkillsDir, getTasksDir, getTeamsDir, getUniversalProjectSkillsDir, getUniversalUserSkillsDir, getUserSkillsDir, initializeDirectories };
|
|
103
|
+
//# sourceMappingURL=chunk-BY4DAKUU.js.map
|
|
104
|
+
//# sourceMappingURL=chunk-BY4DAKUU.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/pathResolver.ts"],"names":[],"mappings":"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","file":"chunk-BY4DAKUU.js","sourcesContent":["/**\r\n * Safe path handling per PRD section 15.7 item 5\r\n * NO hardcoded paths — use path.join(), os.homedir(), XDG Base Directory\r\n */\r\n\r\nimport { homedir, tmpdir } from \"node:os\";\r\nimport { join, dirname } from \"node:path\";\r\nimport { existsSync, mkdirSync } from \"node:fs\";\r\n\r\n// ── XDG-inspired directory layout ────────────────────────────────────────\r\n\r\nconst AEMEATHCLI_HOME = join(homedir(), \".aemeathcli\");\r\n\r\nexport function getAemeathHome(): string {\r\n return process.env[\"AEMEATHCLI_HOME\"] ?? AEMEATHCLI_HOME;\r\n}\r\n\r\nexport function getConfigDir(): string {\r\n return getAemeathHome();\r\n}\r\n\r\nexport function getConfigPath(): string {\r\n return join(getConfigDir(), \"config.json\");\r\n}\r\n\r\nexport function getDatabaseDir(): string {\r\n return join(getAemeathHome(), \"db\");\r\n}\r\n\r\nexport function getDatabasePath(): string {\r\n return join(getDatabaseDir(), \"aemeathcli.db\");\r\n}\r\n\r\nexport function getLogDir(): string {\r\n return join(getAemeathHome(), \"logs\");\r\n}\r\n\r\nexport function getCredentialsPath(): string {\r\n return join(getAemeathHome(), \"credentials.enc\");\r\n}\r\n\r\nexport function getMCPConfigPath(): string {\r\n return join(getAemeathHome(), \"mcp.json\");\r\n}\r\n\r\nexport function getUserSkillsDir(): string {\r\n return join(getAemeathHome(), \"skills\");\r\n}\r\n\r\n/** Universal user-level skills directory: ~/.agents/skills/ */\r\nexport function getUniversalUserSkillsDir(): string {\r\n return join(homedir(), \".agents\", \"skills\");\r\n}\r\n\r\nexport function getTeamsDir(): string {\r\n return join(getAemeathHome(), \"teams\");\r\n}\r\n\r\nexport function getTasksDir(): string {\r\n return join(getAemeathHome(), \"tasks\");\r\n}\r\n\r\n// ── Project-level paths ──────────────────────────────────────────────────\r\n\r\nexport function getProjectConfigDir(projectRoot: string): string {\r\n return join(projectRoot, \".aemeathcli\");\r\n}\r\n\r\nexport function getProjectConfigPath(projectRoot: string): string {\r\n return join(getProjectConfigDir(projectRoot), \"config.json\");\r\n}\r\n\r\nexport function getProjectSkillsDir(projectRoot: string): string {\r\n return join(getProjectConfigDir(projectRoot), \"skills\");\r\n}\r\n\r\n/** Universal project-level skills directory: <projectRoot>/.agents/skills/ */\r\nexport function getUniversalProjectSkillsDir(projectRoot: string): string {\r\n return join(projectRoot, \".agents\", \"skills\");\r\n}\r\n\r\nexport function getProjectMCPConfigPath(projectRoot: string): string {\r\n return join(getProjectConfigDir(projectRoot), \"mcp.json\");\r\n}\r\n\r\nexport function getProjectAgentsPath(projectRoot: string): string {\r\n return join(getProjectConfigDir(projectRoot), \"AGENTS.md\");\r\n}\r\n\r\n// ── Socket paths (PRD section 14.5) ──────────────────────────────────────\r\n\r\nexport function getIPCSocketDir(): string {\r\n const tmp = process.env[\"TMPDIR\"] ?? tmpdir();\r\n const uid = process.platform === \"win32\"\r\n ? (process.env[\"USERNAME\"] ?? \"user\")\r\n : String(process.getuid?.() ?? \"user\");\r\n return join(tmp, `aemeathcli-${uid}`);\r\n}\r\n\r\nexport function getIPCSocketPath(sessionId: string): string {\r\n return join(getIPCSocketDir(), `${sessionId}.sock`);\r\n}\r\n\r\n// ── Directory Initialization ─────────────────────────────────────────────\r\n\r\nexport function ensureDirectory(dirPath: string, mode?: number): void {\r\n if (!existsSync(dirPath)) {\r\n mkdirSync(dirPath, { recursive: true, mode: mode ?? 0o755 });\r\n }\r\n}\r\n\r\nexport function ensureSecureDirectory(dirPath: string): void {\r\n ensureDirectory(dirPath, 0o700);\r\n}\r\n\r\nexport function initializeDirectories(): void {\r\n ensureSecureDirectory(getAemeathHome());\r\n ensureDirectory(getDatabaseDir());\r\n ensureSecureDirectory(getLogDir());\r\n ensureDirectory(getUserSkillsDir());\r\n ensureDirectory(getTeamsDir());\r\n ensureDirectory(getTasksDir());\r\n}\r\n\r\n// ── Project Root Detection ───────────────────────────────────────────────\r\n\r\nexport function findProjectRoot(startDir?: string): string {\r\n let currentDir = startDir ?? process.cwd();\r\n\r\n while (currentDir !== dirname(currentDir)) {\r\n if (existsSync(join(currentDir, \".git\"))) {\r\n return currentDir;\r\n }\r\n if (existsSync(join(currentDir, \".aemeathcli\"))) {\r\n return currentDir;\r\n }\r\n if (existsSync(join(currentDir, \"package.json\"))) {\r\n return currentDir;\r\n }\r\n currentDir = dirname(currentDir);\r\n }\r\n\r\n // Fallback to cwd\r\n return process.cwd();\r\n}\r\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/orchestrator/constants.ts"],"names":[],"mappings":";AAcO,IAAM,aAAA,GAA4C;AAAA,EACvD,aAAA;AAAA,EAAe,OAAA;AAAA,EAAS,YAAA;AAAA,EAAc,UAAA;AAAA,EAAY;AACpD","file":"chunk-CC7MGWYY.js","sourcesContent":["/**\r\n * Orchestrator constants — shared across all orchestrator modules.\r\n */\r\n\r\nimport type { ProviderName } from \"../types/index.js\";\r\n\r\n// ── Terminal Status ─────────────────────────────────────────────────────\r\n\r\nexport type TerminalStatus = \"idle\" | \"processing\" | \"completed\" | \"waiting_user_answer\" | \"error\";\r\n\r\n// ── CLI Provider Types ──────────────────────────────────────────────────\r\n\r\nexport type CliProviderType = \"claude-code\" | \"codex\" | \"gemini-cli\" | \"kimi-cli\" | \"ollama\";\r\n\r\nexport const CLI_PROVIDERS: readonly CliProviderType[] = [\r\n \"claude-code\", \"codex\", \"gemini-cli\", \"kimi-cli\", \"ollama\",\r\n] as const;\r\n\r\nexport const DEFAULT_CLI_PROVIDER: CliProviderType = \"claude-code\";\r\n\r\n// ── Provider CLI → SDK Mapping ──────────────────────────────────────────\r\n\r\nexport const SDK_FOR_CLI: Record<CliProviderType, ProviderName> = {\r\n \"claude-code\": \"anthropic\",\r\n \"codex\": \"openai\",\r\n \"gemini-cli\": \"google\",\r\n \"kimi-cli\": \"kimi\",\r\n \"ollama\": \"ollama\",\r\n};\r\n\r\n// ── Timeouts & Limits ───────────────────────────────────────────────────\r\n\r\nexport const MAX_BUFFER_BYTES = 5 * 1024 * 1024; // 5MB per PTY session\r\nexport const TAIL_BUFFER_LINES = 200; // Lines kept in tail buffer\r\nexport const MAX_WORKERS_PER_SESSION = 10; // Max concurrent workers\r\nexport const MAX_ORCHESTRATOR_STEPS = 30; // Max supervisor tool-call rounds\r\nexport const MAX_HANDOFF_DEPTH = 5; // Max nested handoffs\r\nexport const MAX_OUTPUT_EXTRACT_BYTES = 100 * 1024; // 100KB tool result truncation\r\n\r\nexport const PROVIDER_INIT_TIMEOUT_MS = 30_000; // 30s provider startup\r\nexport const HANDOFF_TIMEOUT_MS = 600_000; // 10min default handoff\r\nexport const SHELL_READY_TIMEOUT_MS = 10_000; // 10s shell boot\r\nexport const STATUS_POLL_INTERVAL_MS = 2_000; // 2s status check interval\r\nexport const INBOX_POLL_INTERVAL_MS = 5_000; // 5s inbox delivery check\r\nexport const WINDOWS_KILL_TIMEOUT_MS = 5_000; // 5s force-kill on Windows\r\nexport const EXIT_DRAIN_DELAY_MS = 200; // 200ms onExit drain\r\n\r\n// ── Data Models ─────────────────────────────────────────────────────────\r\n\r\nexport interface TerminalRecord {\r\n id: string;\r\n sessionId: string;\r\n pid?: number | undefined;\r\n provider: CliProviderType;\r\n agentProfile?: string | undefined;\r\n status: TerminalStatus;\r\n createdAt: Date;\r\n}\r\n\r\nexport interface SessionRecord {\r\n sessionId: string;\r\n pid?: number | undefined;\r\n workerCount: number;\r\n providers: CliProviderType[];\r\n createdAt: Date;\r\n}\r\n\r\nexport interface InboxMessage {\r\n id: number;\r\n sender: string;\r\n receiver: string;\r\n content: string;\r\n status: \"pending\" | \"delivered\" | \"failed\";\r\n createdAt: Date;\r\n deliveredAt?: Date | undefined;\r\n}\r\n\r\nexport interface AgentProfile {\r\n name: string;\r\n description: string;\r\n provider?: CliProviderType | undefined;\r\n systemPrompt: string;\r\n}\r\n\r\nexport interface WorkerInfo {\r\n terminalId: string;\r\n provider: CliProviderType;\r\n status: TerminalStatus;\r\n}\r\n\r\nexport interface SpawnOptions {\r\n provider: CliProviderType;\r\n agentProfile?: string | undefined;\r\n workingDirectory?: string | undefined;\r\n model?: string | undefined;\r\n}\r\n"]}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import { buildModelMessages, buildAiSdkTools, extractAiSdkToolCalls, buildTokenUsage, mapAiSdkFinishReason } from './chunk-ODBY7S4X.js';
|
|
2
|
+
import { ModelNotFoundError, AuthenticationError, RateLimitError } from './chunk-473JN6M5.js';
|
|
3
|
+
import { SUPPORTED_MODELS } from './chunk-62HSGYQD.js';
|
|
4
|
+
import { logger } from './chunk-HEKFAKVH.js';
|
|
5
|
+
import { generateText, streamText } from 'ai';
|
|
6
|
+
import { createAnthropic } from '@ai-sdk/anthropic';
|
|
7
|
+
|
|
8
|
+
var PROVIDER_NAME = "anthropic";
|
|
9
|
+
var CLAUDE_MODELS = [
|
|
10
|
+
"claude-opus-4-6",
|
|
11
|
+
"claude-opus-4-6-1m",
|
|
12
|
+
"claude-sonnet-4-6",
|
|
13
|
+
"claude-sonnet-4-6-1m",
|
|
14
|
+
"claude-haiku-4-5"
|
|
15
|
+
];
|
|
16
|
+
var CHARS_PER_TOKEN_ESTIMATE = 4;
|
|
17
|
+
function mapRole(role) {
|
|
18
|
+
switch (role) {
|
|
19
|
+
case "user":
|
|
20
|
+
return "user";
|
|
21
|
+
case "assistant":
|
|
22
|
+
return "assistant";
|
|
23
|
+
case "system":
|
|
24
|
+
return "system";
|
|
25
|
+
case "tool":
|
|
26
|
+
return "tool";
|
|
27
|
+
default:
|
|
28
|
+
return "user";
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
function classifyError(error, model) {
|
|
32
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
33
|
+
const lower = message.toLowerCase();
|
|
34
|
+
if (lower.includes("401") || lower.includes("unauthorized") || lower.includes("invalid api key")) {
|
|
35
|
+
throw new AuthenticationError(PROVIDER_NAME, message);
|
|
36
|
+
}
|
|
37
|
+
if (lower.includes("429") || lower.includes("rate limit") || lower.includes("too many requests")) {
|
|
38
|
+
const match = /(\d+)\s*s/i.exec(message);
|
|
39
|
+
const retryMs = match?.[1] !== void 0 ? parseInt(match[1], 10) * 1e3 : 6e4;
|
|
40
|
+
throw new RateLimitError(PROVIDER_NAME, retryMs);
|
|
41
|
+
}
|
|
42
|
+
if (lower.includes("model") && lower.includes("not found")) {
|
|
43
|
+
throw new ModelNotFoundError(model);
|
|
44
|
+
}
|
|
45
|
+
throw error instanceof Error ? error : new Error(message);
|
|
46
|
+
}
|
|
47
|
+
var ClaudeAdapter = class {
|
|
48
|
+
name = PROVIDER_NAME;
|
|
49
|
+
supportedModels = CLAUDE_MODELS;
|
|
50
|
+
supportsToolCalling = true;
|
|
51
|
+
anthropic;
|
|
52
|
+
constructor(options) {
|
|
53
|
+
const apiKey = options?.apiKey ?? process.env["ANTHROPIC_API_KEY"];
|
|
54
|
+
this.anthropic = createAnthropic({
|
|
55
|
+
...apiKey !== void 0 ? { apiKey } : {},
|
|
56
|
+
...options?.baseUrl !== void 0 ? { baseURL: options.baseUrl } : {}
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
async chat(request) {
|
|
60
|
+
const modelInfo = this.getModelInfo(request.model);
|
|
61
|
+
const messages = buildModelMessages(request.messages, { mapRole });
|
|
62
|
+
const tools = buildAiSdkTools(request.tools);
|
|
63
|
+
try {
|
|
64
|
+
const result = await generateText({
|
|
65
|
+
model: this.anthropic(request.model),
|
|
66
|
+
messages,
|
|
67
|
+
...request.system !== void 0 ? { system: request.system } : {},
|
|
68
|
+
...tools !== void 0 ? { tools } : {},
|
|
69
|
+
maxOutputTokens: request.maxTokens ?? modelInfo.maxOutputTokens,
|
|
70
|
+
...request.temperature !== void 0 ? { temperature: request.temperature } : {}
|
|
71
|
+
});
|
|
72
|
+
const toolCalls = extractAiSdkToolCalls(result.toolCalls);
|
|
73
|
+
const usage = buildTokenUsage(modelInfo, result.usage);
|
|
74
|
+
const responseMessage = {
|
|
75
|
+
id: result.response.id,
|
|
76
|
+
role: "assistant",
|
|
77
|
+
content: result.text,
|
|
78
|
+
model: request.model,
|
|
79
|
+
provider: PROVIDER_NAME,
|
|
80
|
+
toolCalls: toolCalls.length > 0 ? toolCalls : void 0,
|
|
81
|
+
tokenUsage: usage,
|
|
82
|
+
createdAt: /* @__PURE__ */ new Date()
|
|
83
|
+
};
|
|
84
|
+
return {
|
|
85
|
+
id: result.response.id,
|
|
86
|
+
model: request.model,
|
|
87
|
+
provider: PROVIDER_NAME,
|
|
88
|
+
message: responseMessage,
|
|
89
|
+
usage,
|
|
90
|
+
finishReason: mapAiSdkFinishReason(result.finishReason, {
|
|
91
|
+
stop: ["end-turn"],
|
|
92
|
+
maxTokens: ["max-tokens"]
|
|
93
|
+
})
|
|
94
|
+
};
|
|
95
|
+
} catch (error) {
|
|
96
|
+
classifyError(error, request.model);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
async *stream(request) {
|
|
100
|
+
const modelInfo = this.getModelInfo(request.model);
|
|
101
|
+
const messages = buildModelMessages(request.messages, { mapRole });
|
|
102
|
+
const tools = buildAiSdkTools(request.tools);
|
|
103
|
+
try {
|
|
104
|
+
const result = streamText({
|
|
105
|
+
model: this.anthropic(request.model),
|
|
106
|
+
messages,
|
|
107
|
+
...request.system !== void 0 ? { system: request.system } : {},
|
|
108
|
+
...tools !== void 0 ? { tools } : {},
|
|
109
|
+
maxOutputTokens: request.maxTokens ?? modelInfo.maxOutputTokens,
|
|
110
|
+
...request.temperature !== void 0 ? { temperature: request.temperature } : {}
|
|
111
|
+
});
|
|
112
|
+
for await (const part of result.fullStream) {
|
|
113
|
+
if (part.type === "text-delta") {
|
|
114
|
+
yield { type: "text", content: part.text };
|
|
115
|
+
} else if (part.type === "tool-call") {
|
|
116
|
+
const [toolCall] = extractAiSdkToolCalls([{
|
|
117
|
+
toolCallId: part.toolCallId,
|
|
118
|
+
toolName: part.toolName,
|
|
119
|
+
input: part.input
|
|
120
|
+
}]);
|
|
121
|
+
if (toolCall === void 0) {
|
|
122
|
+
continue;
|
|
123
|
+
}
|
|
124
|
+
yield { type: "tool_call", toolCall };
|
|
125
|
+
} else if (part.type === "finish") {
|
|
126
|
+
const usage = buildTokenUsage(modelInfo, part.totalUsage);
|
|
127
|
+
yield { type: "usage", usage };
|
|
128
|
+
} else if (part.type === "error") {
|
|
129
|
+
const errMsg = part.error instanceof Error ? part.error.message : String(part.error);
|
|
130
|
+
yield { type: "error", error: errMsg };
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
yield { type: "done" };
|
|
134
|
+
} catch (error) {
|
|
135
|
+
const errMsg = error instanceof Error ? error.message : String(error);
|
|
136
|
+
logger.error({ error: errMsg, model: request.model }, "Claude stream error");
|
|
137
|
+
yield { type: "error", error: errMsg };
|
|
138
|
+
yield { type: "done" };
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
countTokens(text, _model) {
|
|
142
|
+
return Promise.resolve(Math.ceil(text.length / CHARS_PER_TOKEN_ESTIMATE));
|
|
143
|
+
}
|
|
144
|
+
getModelInfo(model) {
|
|
145
|
+
const info = SUPPORTED_MODELS[model];
|
|
146
|
+
if (info === void 0 || info.provider !== PROVIDER_NAME) {
|
|
147
|
+
throw new ModelNotFoundError(model);
|
|
148
|
+
}
|
|
149
|
+
return info;
|
|
150
|
+
}
|
|
151
|
+
};
|
|
152
|
+
|
|
153
|
+
export { ClaudeAdapter };
|
|
154
|
+
//# sourceMappingURL=chunk-CTFZTARK.js.map
|
|
155
|
+
//# sourceMappingURL=chunk-CTFZTARK.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/providers/claude-adapter.ts"],"names":[],"mappings":"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","file":"chunk-CTFZTARK.js","sourcesContent":["/**\r\n * Claude (Anthropic) adapter via Vercel AI SDK per PRD section 7.1\r\n * Supports Claude Opus 4.6, Sonnet 4.6, Haiku 4.5\r\n */\r\n\r\nimport { generateText, streamText } from \"ai\";\r\nimport { createAnthropic } from \"@ai-sdk/anthropic\";\r\nimport { logger } from \"../utils/logger.js\";\r\nimport {\r\n AuthenticationError,\r\n RateLimitError,\r\n ModelNotFoundError,\r\n} from \"../types/errors.js\";\r\nimport { SUPPORTED_MODELS } from \"../types/model.js\";\r\nimport type { IModelInfo, ProviderName } from \"../types/model.js\";\r\nimport type {\r\n IChatRequest,\r\n IChatResponse,\r\n IChatMessage,\r\n IStreamChunk,\r\n} from \"../types/message.js\";\r\nimport {\r\n buildAiSdkTools,\r\n buildModelMessages,\r\n buildTokenUsage,\r\n extractAiSdkToolCalls,\r\n mapAiSdkFinishReason,\r\n} from \"./ai-sdk-shared.js\";\r\nimport type { IModelProvider, IProviderOptions } from \"./types.js\";\r\n\r\nconst PROVIDER_NAME: ProviderName = \"anthropic\";\r\n\r\nconst CLAUDE_MODELS: readonly string[] = [\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\nconst CHARS_PER_TOKEN_ESTIMATE = 4;\r\n\r\nfunction mapRole(role: IChatMessage[\"role\"]): \"user\" | \"assistant\" | \"system\" | \"tool\" {\r\n switch (role) {\r\n case \"user\":\r\n return \"user\";\r\n case \"assistant\":\r\n return \"assistant\";\r\n case \"system\":\r\n return \"system\";\r\n case \"tool\":\r\n return \"tool\";\r\n default:\r\n return \"user\";\r\n }\r\n}\r\n\r\nfunction classifyError(error: unknown, model: string): never {\r\n const message = error instanceof Error ? error.message : String(error);\r\n const lower = message.toLowerCase();\r\n\r\n if (lower.includes(\"401\") || lower.includes(\"unauthorized\") || lower.includes(\"invalid api key\")) {\r\n throw new AuthenticationError(PROVIDER_NAME, message);\r\n }\r\n if (lower.includes(\"429\") || lower.includes(\"rate limit\") || lower.includes(\"too many requests\")) {\r\n const match = /(\\d+)\\s*s/i.exec(message);\r\n const retryMs = match?.[1] !== undefined ? parseInt(match[1], 10) * 1000 : 60_000;\r\n throw new RateLimitError(PROVIDER_NAME, retryMs);\r\n }\r\n if (lower.includes(\"model\") && lower.includes(\"not found\")) {\r\n throw new ModelNotFoundError(model);\r\n }\r\n\r\n throw error instanceof Error ? error : new Error(message);\r\n}\r\n\r\nexport class ClaudeAdapter implements IModelProvider {\r\n readonly name = PROVIDER_NAME;\r\n readonly supportedModels = CLAUDE_MODELS;\r\n readonly supportsToolCalling = true;\r\n\r\n private readonly anthropic: ReturnType<typeof createAnthropic>;\r\n\r\n constructor(options?: IProviderOptions) {\r\n const apiKey = options?.apiKey ?? process.env[\"ANTHROPIC_API_KEY\"];\r\n this.anthropic = createAnthropic({\r\n ...(apiKey !== undefined ? { apiKey } : {}),\r\n ...(options?.baseUrl !== undefined ? { baseURL: options.baseUrl } : {}),\r\n });\r\n }\r\n\r\n async chat(request: IChatRequest): Promise<IChatResponse> {\r\n const modelInfo = this.getModelInfo(request.model);\r\n const messages = buildModelMessages(request.messages, { mapRole });\r\n const tools = buildAiSdkTools(request.tools);\r\n\r\n try {\r\n const result = await generateText({\r\n model: this.anthropic(request.model),\r\n messages,\r\n ...(request.system !== undefined ? { system: request.system } : {}),\r\n ...(tools !== undefined ? { tools } : {}),\r\n maxOutputTokens: request.maxTokens ?? modelInfo.maxOutputTokens,\r\n ...(request.temperature !== undefined ? { temperature: request.temperature } : {}),\r\n });\r\n\r\n const toolCalls = extractAiSdkToolCalls(result.toolCalls);\r\n const usage = buildTokenUsage(modelInfo, result.usage);\r\n\r\n const responseMessage: IChatMessage = {\r\n id: result.response.id,\r\n role: \"assistant\",\r\n content: result.text,\r\n model: request.model,\r\n provider: PROVIDER_NAME,\r\n toolCalls: toolCalls.length > 0 ? toolCalls : undefined,\r\n tokenUsage: usage,\r\n createdAt: new Date(),\r\n };\r\n\r\n return {\r\n id: result.response.id,\r\n model: request.model,\r\n provider: PROVIDER_NAME,\r\n message: responseMessage,\r\n usage,\r\n finishReason: mapAiSdkFinishReason(result.finishReason, {\r\n stop: [\"end-turn\"],\r\n maxTokens: [\"max-tokens\"],\r\n }),\r\n };\r\n } catch (error: unknown) {\r\n classifyError(error, request.model);\r\n }\r\n }\r\n\r\n async *stream(request: IChatRequest): AsyncIterable<IStreamChunk> {\r\n const modelInfo = this.getModelInfo(request.model);\r\n const messages = buildModelMessages(request.messages, { mapRole });\r\n const tools = buildAiSdkTools(request.tools);\r\n\r\n try {\r\n const result = streamText({\r\n model: this.anthropic(request.model),\r\n messages,\r\n ...(request.system !== undefined ? { system: request.system } : {}),\r\n ...(tools !== undefined ? { tools } : {}),\r\n maxOutputTokens: request.maxTokens ?? modelInfo.maxOutputTokens,\r\n ...(request.temperature !== undefined ? { temperature: request.temperature } : {}),\r\n });\r\n\r\n for await (const part of result.fullStream) {\r\n if (part.type === \"text-delta\") {\r\n yield { type: \"text\", content: part.text };\r\n } else if (part.type === \"tool-call\") {\r\n const [toolCall] = extractAiSdkToolCalls([{\r\n toolCallId: part.toolCallId,\r\n toolName: part.toolName,\r\n input: part.input,\r\n }]);\r\n if (toolCall === undefined) {\r\n continue;\r\n }\r\n yield { type: \"tool_call\", toolCall };\r\n } else if (part.type === \"finish\") {\r\n const usage = buildTokenUsage(modelInfo, part.totalUsage);\r\n yield { type: \"usage\", usage };\r\n } else if (part.type === \"error\") {\r\n const errMsg = part.error instanceof Error ? part.error.message : String(part.error);\r\n yield { type: \"error\", error: errMsg };\r\n }\r\n }\r\n\r\n yield { type: \"done\" };\r\n } catch (error: unknown) {\r\n const errMsg = error instanceof Error ? error.message : String(error);\r\n logger.error({ error: errMsg, model: request.model }, \"Claude stream error\");\r\n yield { type: \"error\", error: errMsg };\r\n yield { type: \"done\" };\r\n }\r\n }\r\n\r\n countTokens(text: string, _model: string): Promise<number> {\r\n return Promise.resolve(Math.ceil(text.length / CHARS_PER_TOKEN_ESTIMATE));\r\n }\r\n\r\n getModelInfo(model: string): IModelInfo {\r\n const info = SUPPORTED_MODELS[model];\r\n if (info === undefined || info.provider !== PROVIDER_NAME) {\r\n throw new ModelNotFoundError(model);\r\n }\r\n return info;\r\n }\r\n}\r\n"]}
|