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
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/auth/credential-store.ts"],"names":[],"mappings":"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","file":"chunk-4IJD72YB.js","sourcesContent":["/**\n * Credential storage per PRD section 13.6\n * Primary: OS keychain via node-keytar\n * Fallback: AES-256-GCM encrypted file\n */\n\nimport { createCipheriv, createDecipheriv, randomBytes, scryptSync } from \"node:crypto\";\nimport { readFileSync, writeFileSync, existsSync, chmodSync } from \"node:fs\";\nimport type { ProviderName, ICredential } from \"../types/index.js\";\nimport { getCredentialsPath, ensureSecureDirectory, getAemeathHome } from \"../utils/index.js\";\nimport { logger } from \"../utils/index.js\";\n\nconst SERVICE_PREFIX = \"com.aemeathcli\";\nconst ALGORITHM = \"aes-256-gcm\";\nconst KEY_LENGTH = 32;\nconst IV_LENGTH = 16;\nconst TAG_LENGTH = 16;\nconst SALT_LENGTH = 32;\n\nfunction getServiceName(provider: ProviderName): string {\n return `${SERVICE_PREFIX}.${provider}`;\n}\n\nexport class CredentialStore {\n private keytarAvailable: boolean | undefined;\n\n /**\n * Store a credential for a provider.\n */\n async set(provider: ProviderName, credential: ICredential): Promise<void> {\n const data = JSON.stringify(credential);\n const service = getServiceName(provider);\n\n if (await this.isKeytarAvailable()) {\n try {\n const keytar = await this.getKeytar();\n await keytar.setPassword(service, provider, data);\n logger.info({ provider }, \"Credential stored in OS keychain\");\n return;\n } catch (error: unknown) {\n logger.warn({ provider }, \"OS keychain store failed, using encrypted fallback\");\n }\n }\n\n // Fallback: encrypted file\n this.storeEncrypted(provider, data);\n }\n\n /**\n * Get a credential for a provider.\n */\n async get(provider: ProviderName): Promise<ICredential | undefined> {\n const service = getServiceName(provider);\n\n if (await this.isKeytarAvailable()) {\n try {\n const keytar = await this.getKeytar();\n const data = await keytar.getPassword(service, provider);\n if (data) {\n return JSON.parse(data) as ICredential;\n }\n } catch {\n // Try fallback\n }\n }\n\n // Fallback: encrypted file\n return this.loadEncrypted(provider);\n }\n\n /**\n * Delete a credential for a provider.\n */\n async delete(provider: ProviderName): Promise<void> {\n const service = getServiceName(provider);\n\n if (await this.isKeytarAvailable()) {\n try {\n const keytar = await this.getKeytar();\n await keytar.deletePassword(service, provider);\n } catch {\n // Ignore\n }\n }\n\n // Also clean fallback\n this.deleteEncrypted(provider);\n }\n\n /**\n * Check if a credential exists for a provider.\n */\n async has(provider: ProviderName): Promise<boolean> {\n const credential = await this.get(provider);\n return credential !== undefined;\n }\n\n // ── Encrypted File Fallback ────────────────────────────────────────────\n\n private getEncryptionKey(salt: Buffer): Buffer {\n // Derive key from machine-specific data + random salt using scrypt with high cost\n const machineId = process.env[\"USER\"] ?? process.env[\"USERNAME\"] ?? \"aemeathcli\";\n const homedir = process.env[\"HOME\"] ?? process.env[\"USERPROFILE\"] ?? \"/\";\n const password = `aemeathcli-${machineId}-${homedir}`;\n return scryptSync(password, salt, KEY_LENGTH, {\n N: 32768,\n r: 8,\n p: 1,\n maxmem: 64 * 1024 * 1024,\n });\n }\n\n private storeEncrypted(provider: ProviderName, data: string): void {\n const credPath = getCredentialsPath();\n ensureSecureDirectory(getAemeathHome());\n\n let store: Record<string, string> = {};\n if (existsSync(credPath)) {\n try {\n const existing = this.decryptFile(credPath);\n store = JSON.parse(existing) as Record<string, string>;\n } catch {\n store = {};\n }\n }\n\n store[provider] = data;\n this.encryptFile(credPath, JSON.stringify(store));\n chmodSync(credPath, 0o600);\n logger.info({ provider }, \"Credential stored in encrypted fallback\");\n }\n\n private loadEncrypted(provider: ProviderName): ICredential | undefined {\n const credPath = getCredentialsPath();\n if (!existsSync(credPath)) {\n return undefined;\n }\n\n try {\n const content = this.decryptFile(credPath);\n const store = JSON.parse(content) as Record<string, string>;\n const data = store[provider];\n if (data) {\n return JSON.parse(data) as ICredential;\n }\n } catch {\n return undefined;\n }\n\n return undefined;\n }\n\n private deleteEncrypted(provider: ProviderName): void {\n const credPath = getCredentialsPath();\n if (!existsSync(credPath)) {\n return;\n }\n\n try {\n const content = this.decryptFile(credPath);\n const store = JSON.parse(content) as Record<string, string>;\n delete store[provider];\n this.encryptFile(credPath, JSON.stringify(store));\n } catch {\n // Ignore\n }\n }\n\n private encryptFile(filePath: string, plaintext: string): void {\n const salt = randomBytes(SALT_LENGTH);\n const key = this.getEncryptionKey(salt);\n const iv = randomBytes(IV_LENGTH);\n const cipher = createCipheriv(ALGORITHM, key, iv);\n const encrypted = Buffer.concat([cipher.update(plaintext, \"utf-8\"), cipher.final()]);\n const tag = cipher.getAuthTag();\n\n // Format: salt(32) + iv(16) + tag(16) + encrypted\n const output = Buffer.concat([salt, iv, tag, encrypted]);\n writeFileSync(filePath, output);\n }\n\n private decryptFile(filePath: string): string {\n const fileContent = readFileSync(filePath);\n\n // Handle legacy format without salt (iv(16) + tag(16) + encrypted)\n const hasStoredSalt = fileContent.length > SALT_LENGTH + IV_LENGTH + TAG_LENGTH;\n let salt: Buffer;\n let dataOffset: number;\n\n if (hasStoredSalt) {\n salt = fileContent.subarray(0, SALT_LENGTH);\n dataOffset = SALT_LENGTH;\n } else {\n // Legacy fallback: derive salt from username (for backward compatibility)\n const machineId = process.env[\"USER\"] ?? process.env[\"USERNAME\"] ?? \"aemeathcli\";\n salt = Buffer.from(`aemeathcli-${machineId}`.padEnd(SALT_LENGTH, \"\\0\").slice(0, SALT_LENGTH));\n dataOffset = 0;\n }\n\n const key = this.getEncryptionKey(salt);\n const iv = fileContent.subarray(dataOffset, dataOffset + IV_LENGTH);\n const tag = fileContent.subarray(dataOffset + IV_LENGTH, dataOffset + IV_LENGTH + TAG_LENGTH);\n const encrypted = fileContent.subarray(dataOffset + IV_LENGTH + TAG_LENGTH);\n\n const decipher = createDecipheriv(ALGORITHM, key, iv);\n decipher.setAuthTag(tag);\n const decrypted = Buffer.concat([decipher.update(encrypted), decipher.final()]);\n\n return decrypted.toString(\"utf-8\");\n }\n\n // ── Keytar Detection ───────────────────────────────────────────────────\n\n private async isKeytarAvailable(): Promise<boolean> {\n if (this.keytarAvailable !== undefined) {\n return this.keytarAvailable;\n }\n\n try {\n await import(\"keytar\");\n this.keytarAvailable = true;\n } catch {\n this.keytarAvailable = false;\n }\n\n return this.keytarAvailable;\n }\n\n private async getKeytar(): Promise<typeof import(\"keytar\")> {\n return import(\"keytar\");\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/providers/native-cli-adapters.ts"],"names":[],"mappings":"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","file":"chunk-6PDJ45T4.js","sourcesContent":["/**\n * Native CLI-backed provider adapters.\n * Uses official provider CLIs in non-interactive mode when credentials come from native login.\n */\n\nimport { randomUUID } from \"node:crypto\";\nimport { execa } from \"execa\";\nimport {\n AuthenticationError,\n ModelNotFoundError,\n} from \"../types/errors.js\";\nimport { SUPPORTED_MODELS } from \"../types/model.js\";\nimport { logger } from \"../utils/logger.js\";\nimport type { IModelInfo, ProviderName } from \"../types/model.js\";\nimport type {\n IChatMessage,\n IChatRequest,\n IChatResponse,\n IStreamChunk,\n ITokenUsage,\n} from \"../types/message.js\";\nimport type { IModelProvider } from \"./types.js\";\n\ninterface ICLIResult {\n readonly text: string;\n readonly inputTokens?: number | undefined;\n readonly outputTokens?: number | undefined;\n readonly finishReason?: IChatResponse[\"finishReason\"] | undefined;\n}\n\nconst CHARS_PER_TOKEN_ESTIMATE = 4;\n\n/**\n * Resolve CLI timeout from environment. Default is 0 (no timeout) so that\n * long-running agent tasks are never prematurely killed.\n * Set AEMEATHCLI_NATIVE_CLI_TIMEOUT_MS to a positive integer to enforce a limit.\n */\nfunction resolveCliTimeoutMs(): number {\n const raw = process.env[\"AEMEATHCLI_NATIVE_CLI_TIMEOUT_MS\"];\n if (raw === undefined) {\n return 0;\n }\n\n const parsed = Number.parseInt(raw, 10);\n if (!Number.isFinite(parsed) || parsed <= 0) {\n return 0;\n }\n\n return parsed;\n}\n\nconst CLI_TIMEOUT_MS = resolveCliTimeoutMs();\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction asString(value: unknown): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction asNumber(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n}\n\nfunction toJsonLines(output: string): unknown[] {\n const lines = output\n .split(/\\r?\\n/u)\n .map((line) => line.trim())\n .filter((line) => line.length > 0 && line.startsWith(\"{\"));\n\n const parsed: unknown[] = [];\n for (const line of lines) {\n try {\n parsed.push(JSON.parse(line) as unknown);\n } catch {\n // Ignore non-JSON lines\n }\n }\n return parsed;\n}\n\nfunction buildPrompt(request: IChatRequest): string {\n const latestUser = [...request.messages]\n .reverse()\n .find((message) => message.role === \"user\");\n const fallbackLast = request.messages.length > 0\n ? request.messages[request.messages.length - 1]\n : undefined;\n\n const latestPrompt = latestUser?.content ?? fallbackLast?.content ?? \"\";\n if (request.system !== undefined && request.system.length > 0) {\n return `${request.system}\\n\\n${latestPrompt}`.trim();\n }\n return latestPrompt;\n}\n\nfunction computeCost(modelInfo: IModelInfo, inputTokens: number, outputTokens: number): number {\n return (\n (inputTokens / 1_000_000) * modelInfo.inputPricePerMToken +\n (outputTokens / 1_000_000) * modelInfo.outputPricePerMToken\n );\n}\n\nfunction classifyCliError(provider: ProviderName, error: unknown): Error {\n const message = error instanceof Error ? error.message : String(error);\n const lower = message.toLowerCase();\n\n if (\n lower.includes(\"login\")\n || lower.includes(\"credential\")\n || lower.includes(\"authentication\")\n || lower.includes(\"unauthorized\")\n || lower.includes(\"forbidden\")\n || lower.includes(\"api key\")\n || lower.includes(\"token\")\n ) {\n return new AuthenticationError(provider, message);\n }\n\n return error instanceof Error ? error : new Error(message);\n}\n\nabstract class BaseNativeCLIAdapter implements IModelProvider {\n abstract readonly name: ProviderName;\n abstract readonly supportedModels: readonly string[];\n\n protected abstract runCLI(model: string, prompt: string): Promise<ICLIResult>;\n\n async chat(request: IChatRequest): Promise<IChatResponse> {\n const modelInfo = this.getModelInfo(request.model);\n const prompt = buildPrompt(request);\n\n try {\n const result = await this.runCLI(request.model, prompt);\n\n const inputTokens = result.inputTokens ?? Math.ceil(prompt.length / CHARS_PER_TOKEN_ESTIMATE);\n const outputTokens = result.outputTokens ?? Math.ceil(result.text.length / CHARS_PER_TOKEN_ESTIMATE);\n\n const usage: ITokenUsage = {\n inputTokens,\n outputTokens,\n totalTokens: inputTokens + outputTokens,\n costUsd: computeCost(modelInfo, inputTokens, outputTokens),\n };\n\n const responseMessage: IChatMessage = {\n id: randomUUID(),\n role: \"assistant\",\n content: result.text,\n model: request.model,\n provider: this.name,\n tokenUsage: usage,\n createdAt: new Date(),\n };\n\n return {\n id: randomUUID(),\n model: request.model,\n provider: this.name,\n message: responseMessage,\n usage,\n finishReason: result.finishReason ?? \"stop\",\n };\n } catch (error: unknown) {\n throw classifyCliError(this.name, error);\n }\n }\n\n async *stream(request: IChatRequest): AsyncIterable<IStreamChunk> {\n try {\n const response = await this.chat(request);\n if (response.message.content.length > 0) {\n yield { type: \"text\", content: response.message.content };\n }\n yield { type: \"usage\", usage: response.usage };\n yield { type: \"done\" };\n } catch (error: unknown) {\n // Execa errors can include raw stdout/stderr in the message.\n // Truncate to prevent raw CLI protocol output from leaking through.\n const rawMsg = error instanceof Error ? error.message : String(error);\n const truncated = rawMsg.length > 500 ? rawMsg.slice(0, 500) + \"...\" : rawMsg;\n yield { type: \"error\", error: truncated };\n yield { type: \"done\" };\n }\n }\n\n async countTokens(text: string, _model: string): Promise<number> {\n return Math.ceil(text.length / CHARS_PER_TOKEN_ESTIMATE);\n }\n\n getModelInfo(model: string): IModelInfo {\n const info = SUPPORTED_MODELS[model];\n if (info === undefined || info.provider !== this.name) {\n throw new ModelNotFoundError(model);\n }\n return info;\n }\n\n async listAvailableModels(): Promise<readonly string[]> {\n return [...this.supportedModels];\n }\n}\n\nexport class ClaudeNativeCLIAdapter extends BaseNativeCLIAdapter {\n readonly name: ProviderName = \"anthropic\";\n readonly supportedModels = [\n \"claude-opus-4-6\",\n \"claude-opus-4-6-1m\",\n \"claude-sonnet-4-6\",\n \"claude-sonnet-4-6-1m\",\n \"claude-haiku-4-5\",\n ] as const;\n\n protected async runCLI(model: string, prompt: string): Promise<ICLIResult> {\n const { stdout } = await execa(\n \"claude\",\n [\"-p\", \"--output-format\", \"json\", \"--model\", model, prompt],\n {\n timeout: CLI_TIMEOUT_MS,\n stdin: \"ignore\",\n env: { ...process.env, NO_COLOR: \"1\" },\n },\n );\n\n const lines = toJsonLines(stdout);\n const lastJson = lines.length > 0 ? lines[lines.length - 1] : undefined;\n\n if (!isRecord(lastJson)) {\n throw new Error(\"Claude CLI returned no JSON result\");\n }\n\n const text = asString(lastJson[\"result\"]) ?? \"\";\n const usage = isRecord(lastJson[\"usage\"]) ? lastJson[\"usage\"] : undefined;\n const inputTokens = usage ? asNumber(usage[\"input_tokens\"]) : undefined;\n const outputTokens = usage ? asNumber(usage[\"output_tokens\"]) : undefined;\n\n return {\n text,\n inputTokens,\n outputTokens,\n finishReason: \"stop\",\n };\n }\n}\n\nexport class CodexNativeCLIAdapter extends BaseNativeCLIAdapter {\n readonly name: ProviderName = \"openai\";\n readonly supportedModels = [\n \"gpt-5.3-codex\",\n \"gpt-5.3-codex-spark\",\n \"gpt-5.2-codex\",\n \"gpt-5.1-codex-max\",\n \"gpt-5.2\",\n \"gpt-5.1-codex-mini\",\n ] as const;\n\n protected async runCLI(model: string, prompt: string): Promise<ICLIResult> {\n // Allow agent panes to set a writable sandbox so codex can write to the\n // shared board directory. Default to \"read-only\" for normal usage.\n const sandbox = process.env[\"AEMEATHCLI_CODEX_SANDBOX\"] ?? \"read-only\";\n const { stdout } = await execa(\n \"codex\",\n [\n \"exec\",\n \"--skip-git-repo-check\",\n ...(sandbox !== \"none\" ? [\"--sandbox\", sandbox] : []),\n \"--json\",\n \"--model\",\n model,\n prompt,\n ],\n {\n timeout: CLI_TIMEOUT_MS,\n stdin: \"ignore\",\n env: { ...process.env, NO_COLOR: \"1\" },\n },\n );\n\n const lines = toJsonLines(stdout);\n const textParts: string[] = [];\n let inputTokens: number | undefined;\n let outputTokens: number | undefined;\n\n for (const line of lines) {\n if (!isRecord(line)) continue;\n const type = asString(line[\"type\"]);\n\n if (type === \"item.completed\") {\n const item = isRecord(line[\"item\"]) ? line[\"item\"] : undefined;\n if (item && asString(item[\"type\"]) === \"agent_message\") {\n const text = asString(item[\"text\"]);\n if (text && text.length > 0) {\n textParts.push(text);\n }\n }\n }\n\n if (type === \"turn.completed\") {\n const usage = isRecord(line[\"usage\"]) ? line[\"usage\"] : undefined;\n if (usage) {\n inputTokens = asNumber(usage[\"input_tokens\"]) ?? inputTokens;\n outputTokens = asNumber(usage[\"output_tokens\"]) ?? outputTokens;\n }\n }\n }\n\n return {\n text: textParts.join(\"\\n\").trim(),\n inputTokens,\n outputTokens,\n finishReason: \"stop\",\n };\n }\n}\n\nexport class GeminiNativeCLIAdapter extends BaseNativeCLIAdapter {\n readonly name: ProviderName = \"google\";\n readonly supportedModels = [\n \"gemini-3-pro-preview\",\n \"gemini-3-flash-preview\",\n \"gemini-2.5-pro\",\n \"gemini-2.5-flash\",\n \"gemini-2.5-flash-lite\",\n ] as const;\n\n protected async runCLI(model: string, prompt: string): Promise<ICLIResult> {\n const { stdout } = await execa(\n \"gemini\",\n [\n \"-p\",\n prompt,\n \"--model\",\n model,\n \"--output-format\",\n \"stream-json\",\n \"--approval-mode\",\n \"yolo\",\n ],\n {\n timeout: CLI_TIMEOUT_MS,\n stdin: \"ignore\",\n env: { ...process.env, NO_COLOR: \"1\" },\n },\n );\n\n const lines = toJsonLines(stdout);\n let text = \"\";\n let inputTokens: number | undefined;\n let outputTokens: number | undefined;\n\n for (const line of lines) {\n if (!isRecord(line)) continue;\n const type = asString(line[\"type\"]);\n\n if (type === \"message\" && asString(line[\"role\"]) === \"assistant\") {\n const content = asString(line[\"content\"]);\n if (content !== undefined) {\n const delta = line[\"delta\"] === true;\n text = delta ? `${text}${content}` : content;\n }\n }\n\n if (type === \"result\") {\n const stats = isRecord(line[\"stats\"]) ? line[\"stats\"] : undefined;\n if (stats) {\n inputTokens = asNumber(stats[\"input_tokens\"]) ?? inputTokens;\n outputTokens = asNumber(stats[\"output_tokens\"]) ?? outputTokens;\n }\n }\n }\n\n return {\n text: text.trim(),\n inputTokens,\n outputTokens,\n finishReason: \"stop\",\n };\n }\n}\n\nexport class KimiNativeCLIAdapter extends BaseNativeCLIAdapter {\n readonly name: ProviderName = \"kimi\";\n readonly supportedModels = [\"kimi-for-coding\"] as const;\n\n protected async runCLI(_model: string, prompt: string): Promise<ICLIResult> {\n const { stdout } = await execa(\n \"kimi\",\n [\"--print\", \"--output-format\", \"stream-json\", \"-p\", prompt],\n {\n timeout: CLI_TIMEOUT_MS,\n stdin: \"ignore\",\n env: { ...process.env, NO_COLOR: \"1\" },\n },\n );\n\n const lines = toJsonLines(stdout);\n let text = \"\";\n\n for (const line of lines) {\n if (!isRecord(line)) continue;\n if (asString(line[\"role\"]) !== \"assistant\") continue;\n\n const content = line[\"content\"];\n if (!Array.isArray(content)) continue;\n\n const textParts: string[] = [];\n for (const part of content) {\n if (!isRecord(part)) continue;\n if (asString(part[\"type\"]) === \"text\") {\n const piece = asString(part[\"text\"]);\n if (piece) textParts.push(piece);\n }\n }\n\n if (textParts.length > 0) {\n text = textParts.join(\"\");\n }\n }\n\n return {\n text: text.trim(),\n finishReason: \"stop\",\n };\n }\n}\n\nexport function logNativeAdapterSelection(provider: ProviderName): void {\n logger.info({ provider }, \"Using native CLI adapter\");\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/panes/layout-engine.ts","../src/panes/tmux-manager.ts"],"names":["firstPane","bottomPanes"],"mappings":"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","file":"chunk-CARHU3DO.js","sourcesContent":["/**\n * Layout engine for split-panel auto-layout computation per PRD section 9.2.\n * Computes pane positions based on agent count and terminal dimensions.\n */\n\nimport type { PaneLayout, IPaneConfig, ILayoutConfig } from \"../types/team.js\";\nimport { logger } from \"../utils/logger.js\";\n\n// ── Layout Geometry ─────────────────────────────────────────────────────\n\nexport interface IPaneGeometry {\n readonly paneId: string;\n readonly row: number;\n readonly col: number;\n readonly widthPercent: number;\n readonly heightPercent: number;\n readonly splitDirection: \"horizontal\" | \"vertical\" | \"none\";\n}\n\nexport interface IComputedLayout {\n readonly panes: readonly IPaneGeometry[];\n readonly rows: number;\n readonly cols: number;\n readonly terminalWidth: number;\n readonly terminalHeight: number;\n}\n\ninterface ITerminalSize {\n readonly columns: number;\n readonly rows: number;\n}\n\n// ── Constants ───────────────────────────────────────────────────────────\n\nconst MIN_PANE_WIDTH = 40;\nconst MIN_PANE_HEIGHT = 10;\nconst DEFAULT_TERMINAL_WIDTH = 120;\nconst DEFAULT_TERMINAL_HEIGHT = 40;\nconst MAX_GRID_COLUMNS = 3;\n\n// ── Layout Engine ───────────────────────────────────────────────────────\n\nexport class LayoutEngine {\n private readonly terminalSize: ITerminalSize;\n\n constructor(terminalSize?: Partial<ITerminalSize>) {\n this.terminalSize = {\n columns: terminalSize?.columns ?? this.detectTerminalWidth(),\n rows: terminalSize?.rows ?? this.detectTerminalHeight(),\n };\n logger.debug(\n { terminalSize: this.terminalSize },\n \"LayoutEngine initialized\",\n );\n }\n\n /**\n * Compute the full layout for a set of pane configs.\n */\n computeLayout(config: ILayoutConfig): IComputedLayout {\n const paneCount = config.panes.length;\n if (paneCount === 0) {\n return {\n panes: [],\n rows: 0,\n cols: 0,\n terminalWidth: this.terminalSize.columns,\n terminalHeight: this.terminalSize.rows,\n };\n }\n\n const effectiveCount = Math.max(\n 1,\n Math.min(paneCount, config.maxPanes, this.getMaxPanes()),\n );\n const layout = config.layout === \"auto\"\n ? this.resolveAutoLayout(effectiveCount)\n : config.layout;\n\n const geometries = this.computeGeometries(\n config.panes.slice(0, effectiveCount),\n layout,\n effectiveCount,\n );\n\n const { gridRows, gridCols } = this.getGridDimensions(effectiveCount, layout);\n\n logger.info(\n { layout, paneCount: effectiveCount, gridRows, gridCols },\n \"Layout computed\",\n );\n\n return {\n panes: geometries,\n rows: gridRows,\n cols: gridCols,\n terminalWidth: this.terminalSize.columns,\n terminalHeight: this.terminalSize.rows,\n };\n }\n\n /**\n * Determine the best auto-layout for a given pane count (PRD section 9.2).\n */\n resolveAutoLayout(paneCount: number): Exclude<PaneLayout, \"auto\"> {\n if (paneCount <= 1) return \"horizontal\";\n if (paneCount === 2) return \"horizontal\";\n if (paneCount <= 4) return \"grid\";\n return \"grid\";\n }\n\n /**\n * Get the maximum number of panes the terminal can support.\n */\n getMaxPanes(): number {\n const maxByWidth = Math.floor(this.terminalSize.columns / MIN_PANE_WIDTH);\n const maxByHeight = Math.floor(this.terminalSize.rows / MIN_PANE_HEIGHT);\n return Math.max(1, maxByWidth * maxByHeight);\n }\n\n /**\n * Check if the terminal is large enough for the requested pane count.\n */\n canFitPanes(paneCount: number): boolean {\n return paneCount <= this.getMaxPanes();\n }\n\n /**\n * Get the grid dimensions for a given pane count and layout type.\n */\n private getGridDimensions(\n paneCount: number,\n layout: Exclude<PaneLayout, \"auto\">,\n ): { gridRows: number; gridCols: number } {\n switch (layout) {\n case \"horizontal\":\n return { gridRows: 1, gridCols: paneCount };\n case \"vertical\":\n return { gridRows: paneCount, gridCols: 1 };\n case \"grid\":\n return this.computeGridSize(paneCount);\n }\n }\n\n /**\n * Compute grid rows and columns for a given pane count.\n * PRD section 9.2:\n * 2 agents → horizontal split (50/50) → 1x2\n * 3 agents → 1 top + 2 bottom → 2 rows\n * 4 agents → 2x2 grid\n * 5+ agents → leader top + grid bottom\n */\n private computeGridSize(paneCount: number): { gridRows: number; gridCols: number } {\n if (paneCount <= 1) return { gridRows: 1, gridCols: 1 };\n if (paneCount === 2) return { gridRows: 1, gridCols: 2 };\n if (paneCount <= 4) return { gridRows: 2, gridCols: 2 };\n\n const bottomPaneCount = paneCount - 1;\n const gridCols = Math.min(bottomPaneCount, MAX_GRID_COLUMNS);\n const gridRows = 1 + Math.ceil(bottomPaneCount / gridCols);\n return { gridRows, gridCols };\n }\n\n /**\n * Compute per-pane geometries based on layout type.\n */\n private computeGeometries(\n panes: readonly IPaneConfig[],\n layout: Exclude<PaneLayout, \"auto\">,\n paneCount: number,\n ): IPaneGeometry[] {\n switch (layout) {\n case \"horizontal\":\n return this.computeHorizontalLayout(panes);\n case \"vertical\":\n return this.computeVerticalLayout(panes);\n case \"grid\":\n return this.computeGridLayout(panes, paneCount);\n }\n }\n\n /**\n * Horizontal split: all panes side by side.\n */\n private computeHorizontalLayout(panes: readonly IPaneConfig[]): IPaneGeometry[] {\n const widthPercent = Math.floor(100 / panes.length);\n return panes.map((pane, index) => ({\n paneId: pane.paneId,\n row: 0,\n col: index,\n widthPercent: index === panes.length - 1\n ? 100 - widthPercent * (panes.length - 1)\n : widthPercent,\n heightPercent: 100,\n splitDirection: index === 0 ? \"none\" as const : \"horizontal\" as const,\n }));\n }\n\n /**\n * Vertical split: all panes stacked.\n */\n private computeVerticalLayout(panes: readonly IPaneConfig[]): IPaneGeometry[] {\n const heightPercent = Math.floor(100 / panes.length);\n return panes.map((pane, index) => ({\n paneId: pane.paneId,\n row: index,\n col: 0,\n widthPercent: 100,\n heightPercent: index === panes.length - 1\n ? 100 - heightPercent * (panes.length - 1)\n : heightPercent,\n splitDirection: index === 0 ? \"none\" as const : \"vertical\" as const,\n }));\n }\n\n /**\n * Grid layout per PRD section 9.2 rules:\n * 3 agents → leader spans top, 2 on bottom\n * 4 agents → 2x2 even grid\n * 5+ agents → leader spans top, rest in grid below\n */\n private computeGridLayout(\n panes: readonly IPaneConfig[],\n paneCount: number,\n ): IPaneGeometry[] {\n const geometries: IPaneGeometry[] = [];\n\n if (paneCount <= 2) {\n return this.computeHorizontalLayout(panes);\n }\n\n if (paneCount === 3) {\n // 1 top (leader, full width) + 2 bottom\n const firstPane = panes[0];\n if (firstPane) {\n geometries.push({\n paneId: firstPane.paneId,\n row: 0,\n col: 0,\n widthPercent: 100,\n heightPercent: 50,\n splitDirection: \"none\",\n });\n }\n const bottomPanes = panes.slice(1);\n for (let i = 0; i < bottomPanes.length; i++) {\n const pane = bottomPanes[i];\n if (pane) {\n geometries.push({\n paneId: pane.paneId,\n row: 1,\n col: i,\n widthPercent: 50,\n heightPercent: 50,\n splitDirection: i === 0 ? \"vertical\" : \"horizontal\",\n });\n }\n }\n return geometries;\n }\n\n if (paneCount === 4) {\n // 2x2 even grid\n const { gridCols } = this.computeGridSize(4);\n for (let i = 0; i < panes.length; i++) {\n const pane = panes[i];\n if (pane) {\n const row = Math.floor(i / gridCols);\n const col = i % gridCols;\n geometries.push({\n paneId: pane.paneId,\n row,\n col,\n widthPercent: 50,\n heightPercent: 50,\n splitDirection: this.determineSplitDirection(i, row, col),\n });\n }\n }\n return geometries;\n }\n\n // 5+ agents: leader top + grid bottom\n const firstPane = panes[0];\n if (firstPane) {\n geometries.push({\n paneId: firstPane.paneId,\n row: 0,\n col: 0,\n widthPercent: 100,\n heightPercent: 40,\n splitDirection: \"none\",\n });\n }\n\n const bottomPanes = panes.slice(1);\n const bottomCols = Math.min(bottomPanes.length, MAX_GRID_COLUMNS);\n const bottomRows = Math.ceil(bottomPanes.length / bottomCols);\n const cellWidth = Math.floor(100 / bottomCols);\n const cellHeight = Math.floor(60 / bottomRows);\n\n for (let i = 0; i < bottomPanes.length; i++) {\n const pane = bottomPanes[i];\n if (pane) {\n const row = Math.floor(i / bottomCols) + 1;\n const col = i % bottomCols;\n const isLastInRow = col === bottomCols - 1 || i === bottomPanes.length - 1;\n geometries.push({\n paneId: pane.paneId,\n row,\n col,\n widthPercent: isLastInRow ? 100 - cellWidth * col : cellWidth,\n heightPercent: cellHeight,\n splitDirection: this.determineSplitDirection(i + 1, row, col),\n });\n }\n }\n\n return geometries;\n }\n\n /**\n * Determine split direction based on position in grid.\n */\n private determineSplitDirection(\n index: number,\n row: number,\n col: number,\n ): \"horizontal\" | \"vertical\" | \"none\" {\n if (index === 0) return \"none\";\n if (col === 0) return \"vertical\";\n return \"horizontal\";\n }\n\n /**\n * Detect terminal width from environment.\n */\n private detectTerminalWidth(): number {\n const columns = process.stdout.columns;\n return Number.isFinite(columns) && columns > 0 ? columns : DEFAULT_TERMINAL_WIDTH;\n }\n\n /**\n * Detect terminal height from environment.\n */\n private detectTerminalHeight(): number {\n const rows = process.stdout.rows;\n return Number.isFinite(rows) && rows > 0 ? rows : DEFAULT_TERMINAL_HEIGHT;\n }\n}\n","/**\n * TmuxManager — Programmatic tmux control per PRD section 9.2.\n * Creates sessions, splits panes, sends commands, manages lifecycle.\n */\n\nimport { execa } from \"execa\";\nimport type { ILayoutConfig, IPaneConfig } from \"../types/team.js\";\nimport type { IComputedLayout, IPaneGeometry } from \"./layout-engine.js\";\nimport { LayoutEngine } from \"./layout-engine.js\";\nimport { getEventBus } from \"../core/event-bus.js\";\nimport { logger } from \"../utils/logger.js\";\nimport { AgentSpawnError } from \"../types/errors.js\";\n\n// ── Types ───────────────────────────────────────────────────────────────\n\nexport interface ITmuxPaneInfo {\n readonly paneId: string;\n readonly tmuxPaneId: string;\n readonly agentName: string;\n readonly title: string;\n}\n\ninterface ITmuxManagerOptions {\n readonly sessionPrefix?: string;\n}\n\n// ── Constants ───────────────────────────────────────────────────────────\n\nconst DEFAULT_SESSION_PREFIX = \"aemeathcli\";\nconst TMUX_BINARY = \"tmux\";\n\n// ── TmuxManager ─────────────────────────────────────────────────────────\n\nexport class TmuxManager {\n private readonly sessionPrefix: string;\n private readonly layoutEngine: LayoutEngine;\n private readonly panes = new Map<string, ITmuxPaneInfo>();\n private sessionName: string | undefined;\n private disposed = false;\n\n constructor(options?: ITmuxManagerOptions) {\n this.sessionPrefix = options?.sessionPrefix ?? DEFAULT_SESSION_PREFIX;\n this.layoutEngine = new LayoutEngine();\n }\n\n /**\n * Check if tmux is available on this system.\n */\n async isAvailable(): Promise<boolean> {\n try {\n const result = await execa(\"which\", [TMUX_BINARY]);\n return result.exitCode === 0;\n } catch {\n logger.warn(\"tmux binary not found on PATH\");\n return false;\n }\n }\n\n /**\n * Create a new tmux session for a team.\n */\n async createSession(teamName: string): Promise<string> {\n this.assertNotDisposed();\n\n if (!(await this.isAvailable())) {\n throw new AgentSpawnError(\n teamName,\n \"tmux is not installed. Install tmux or use single-pane mode.\",\n );\n }\n\n this.sessionName = `${this.sessionPrefix}-${teamName}`;\n\n // Kill any existing session with the same name\n await this.killSessionSilent(this.sessionName);\n\n try {\n await execa(TMUX_BINARY, [\n \"new-session\",\n \"-d\",\n \"-s\", this.sessionName,\n \"-x\", String(process.stdout.columns ?? 120),\n \"-y\", String(process.stdout.rows ?? 40),\n ]);\n logger.info({ sessionName: this.sessionName }, \"tmux session created\");\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n throw new AgentSpawnError(teamName, `Failed to create tmux session: ${message}`);\n }\n\n return this.sessionName;\n }\n\n /**\n * Create split panes based on a layout configuration.\n */\n async createPanes(layoutConfig: ILayoutConfig): Promise<IComputedLayout> {\n this.assertNotDisposed();\n this.assertSession();\n\n const computed = this.layoutEngine.computeLayout(layoutConfig);\n\n // First pane is already the initial pane in the session\n const firstGeometry = computed.panes[0];\n const firstConfig = layoutConfig.panes[0];\n if (firstGeometry && firstConfig) {\n const tmuxPaneId = await this.getFirstPaneId();\n const info: ITmuxPaneInfo = {\n paneId: firstConfig.paneId,\n tmuxPaneId,\n agentName: firstConfig.agentName,\n title: firstConfig.title,\n };\n this.panes.set(firstConfig.paneId, info);\n await this.setPaneTitle(tmuxPaneId, firstConfig.title);\n getEventBus().emit(\"pane:created\", {\n paneId: firstConfig.paneId,\n agentName: firstConfig.agentName,\n });\n }\n\n // Create remaining panes via splits\n for (let i = 1; i < computed.panes.length; i++) {\n const geometry = computed.panes[i];\n const config = layoutConfig.panes[i];\n if (!geometry || !config) continue;\n\n const tmuxPaneId = await this.splitPane(geometry);\n const info: ITmuxPaneInfo = {\n paneId: config.paneId,\n tmuxPaneId,\n agentName: config.agentName,\n title: config.title,\n };\n this.panes.set(config.paneId, info);\n await this.setPaneTitle(tmuxPaneId, config.title);\n getEventBus().emit(\"pane:created\", {\n paneId: config.paneId,\n agentName: config.agentName,\n });\n }\n\n // Equalize layout after all splits\n await this.equalizeLayout();\n\n logger.info(\n { paneCount: this.panes.size, session: this.sessionName },\n \"All panes created\",\n );\n\n return computed;\n }\n\n /**\n * Send a command string to a specific pane.\n */\n async sendCommand(paneId: string, command: string): Promise<void> {\n this.assertNotDisposed();\n this.assertSession();\n\n const info = this.panes.get(paneId);\n if (!info) {\n logger.warn({ paneId }, \"Pane not found, cannot send command\");\n return;\n }\n\n // tmux pane IDs (%N) are globally unique — use them directly.\n // The format \"session:%N\" is invalid because tmux interprets\n // the part after \":\" as a window name, not a pane ID.\n await execa(TMUX_BINARY, [\n \"send-keys\",\n \"-t\", info.tmuxPaneId,\n command,\n \"Enter\",\n ]);\n\n logger.debug({ paneId, command: command.slice(0, 80) }, \"Command sent to pane\");\n }\n\n /**\n * Resize a pane by tmux pane target.\n */\n async resizePane(\n paneId: string,\n dimensions: { width?: number; height?: number },\n ): Promise<void> {\n this.assertNotDisposed();\n this.assertSession();\n\n const info = this.panes.get(paneId);\n if (!info) return;\n\n const target = info.tmuxPaneId;\n\n if (dimensions.width !== undefined) {\n await execa(TMUX_BINARY, [\"resize-pane\", \"-t\", target, \"-x\", String(dimensions.width)]);\n }\n if (dimensions.height !== undefined) {\n await execa(TMUX_BINARY, [\"resize-pane\", \"-t\", target, \"-y\", String(dimensions.height)]);\n }\n }\n\n /**\n * Set the title for a tmux pane.\n */\n private async setPaneTitle(tmuxPaneId: string, title: string): Promise<void> {\n if (!this.sessionName) return;\n try {\n await execa(TMUX_BINARY, [\n \"select-pane\",\n \"-t\", tmuxPaneId,\n \"-T\", title,\n ]);\n } catch {\n logger.debug({ tmuxPaneId, title }, \"Failed to set pane title (non-fatal)\");\n }\n }\n\n /**\n * Kill a specific pane.\n */\n async killPane(paneId: string): Promise<void> {\n this.assertNotDisposed();\n\n const info = this.panes.get(paneId);\n if (!info || !this.sessionName) return;\n\n try {\n await execa(TMUX_BINARY, [\n \"kill-pane\",\n \"-t\", info.tmuxPaneId,\n ]);\n this.panes.delete(paneId);\n getEventBus().emit(\"pane:closed\", { paneId });\n logger.debug({ paneId }, \"Pane killed\");\n } catch {\n logger.debug({ paneId }, \"Failed to kill pane (may already be closed)\");\n }\n }\n\n /**\n * Attach to the tmux session (gives control to the user).\n */\n async attachSession(): Promise<void> {\n this.assertNotDisposed();\n this.assertSession();\n\n await execa(TMUX_BINARY, [\"attach-session\", \"-t\", this.sessionName!], {\n stdio: \"inherit\",\n });\n }\n\n /**\n * Check if the session still exists.\n */\n async isSessionAlive(): Promise<boolean> {\n if (!this.sessionName) return false;\n try {\n await execa(TMUX_BINARY, [\"has-session\", \"-t\", this.sessionName]);\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Destroy the entire tmux session and all panes.\n */\n async destroy(): Promise<void> {\n if (this.disposed) return;\n this.disposed = true;\n\n if (this.sessionName) {\n await this.killSessionSilent(this.sessionName);\n\n for (const paneId of this.panes.keys()) {\n getEventBus().emit(\"pane:closed\", { paneId });\n }\n this.panes.clear();\n\n logger.info({ sessionName: this.sessionName }, \"tmux session destroyed\");\n this.sessionName = undefined;\n }\n }\n\n /**\n * Get the current session name.\n */\n getSessionName(): string | undefined {\n return this.sessionName;\n }\n\n /**\n * Get all tracked pane info.\n */\n getPanes(): ReadonlyMap<string, ITmuxPaneInfo> {\n return this.panes;\n }\n\n // ── Private Helpers ─────────────────────────────────────────────────\n\n private async splitPane(geometry: IPaneGeometry): Promise<string> {\n const splitFlag = geometry.splitDirection === \"horizontal\" ? \"-h\" : \"-v\";\n\n const result = await execa(TMUX_BINARY, [\n \"split-window\",\n splitFlag,\n \"-t\", this.sessionName!,\n \"-P\",\n \"-F\", \"#{pane_id}\",\n ]);\n\n const tmuxPaneId = result.stdout.trim();\n logger.debug(\n { tmuxPaneId, direction: geometry.splitDirection },\n \"Pane split created\",\n );\n return tmuxPaneId;\n }\n\n private async getFirstPaneId(): Promise<string> {\n const result = await execa(TMUX_BINARY, [\n \"list-panes\",\n \"-t\", this.sessionName!,\n \"-F\", \"#{pane_id}\",\n ]);\n const firstLine = result.stdout.trim().split(\"\\n\")[0];\n return firstLine ?? \"%0\";\n }\n\n private async equalizeLayout(): Promise<void> {\n if (!this.sessionName) return;\n try {\n await execa(TMUX_BINARY, [\n \"select-layout\",\n \"-t\", this.sessionName,\n \"tiled\",\n ]);\n } catch {\n logger.debug(\"Failed to equalize layout (non-fatal)\");\n }\n }\n\n private async killSessionSilent(sessionName: string): Promise<void> {\n try {\n await execa(TMUX_BINARY, [\"kill-session\", \"-t\", sessionName]);\n } catch {\n // Session may not exist — ignore\n }\n }\n\n private assertNotDisposed(): void {\n if (this.disposed) {\n throw new AgentSpawnError(\"tmux\", \"TmuxManager has been disposed\");\n }\n }\n\n private assertSession(): void {\n if (!this.sessionName) {\n throw new AgentSpawnError(\"tmux\", \"No active tmux session. Call createSession() first.\");\n }\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/tokenCounter.ts","../src/utils/retry.ts"],"names":[],"mappings":"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","file":"chunk-CGEV3ARR.js","sourcesContent":["/**\n * Multi-provider token estimation per PRD section 7.5\n * Uses a universal approximation since we don't bundle tokenizers for each provider.\n */\n\nimport type { ProviderName, ITokenUsage, IModelInfo } from \"../types/index.js\";\nimport { SUPPORTED_MODELS } from \"../types/index.js\";\n\n/**\n * Approximate token count using the ~4 chars per token heuristic.\n * For production cost tracking, we rely on provider-reported usage in API responses.\n */\nexport function estimateTokenCount(text: string): number {\n return Math.ceil(text.length / 4);\n}\n\n/**\n * Calculate cost in USD based on token usage and model pricing.\n */\nexport function calculateCost(\n modelId: string,\n inputTokens: number,\n outputTokens: number,\n): number {\n const modelInfo = SUPPORTED_MODELS[modelId];\n if (!modelInfo) {\n return 0;\n }\n\n const inputCost = (inputTokens / 1_000_000) * modelInfo.inputPricePerMToken;\n const outputCost = (outputTokens / 1_000_000) * modelInfo.outputPricePerMToken;\n\n return Math.round((inputCost + outputCost) * 1_000_000) / 1_000_000;\n}\n\n/**\n * Create a token usage record with cost calculation.\n */\nexport function createTokenUsage(\n modelId: string,\n inputTokens: number,\n outputTokens: number,\n): ITokenUsage {\n return {\n inputTokens,\n outputTokens,\n totalTokens: inputTokens + outputTokens,\n costUsd: calculateCost(modelId, inputTokens, outputTokens),\n };\n}\n\n/**\n * Format cost for display (e.g., \"$0.04\").\n */\nexport function formatCost(costUsd: number): string {\n if (costUsd < 0.01) {\n return `$${costUsd.toFixed(4)}`;\n }\n return `$${costUsd.toFixed(2)}`;\n}\n\n/**\n * Format token count for display (e.g., \"12.3K\").\n */\nexport function formatTokenCount(count: number): string {\n if (count < 1_000) {\n return String(count);\n }\n if (count < 1_000_000) {\n return `${(count / 1_000).toFixed(1)}K`;\n }\n return `${(count / 1_000_000).toFixed(1)}M`;\n}\n","/**\n * Retry with exponential backoff per PRD section 20.2\n * Provider failover: If primary model fails, auto-fallback to configured backup.\n */\n\nimport { logger } from \"./logger.js\";\n\nexport interface IRetryOptions {\n readonly maxRetries: number;\n readonly baseDelayMs: number;\n readonly maxDelayMs: number;\n readonly shouldRetry?: (error: unknown, attempt: number) => boolean;\n}\n\nconst DEFAULT_RETRY_OPTIONS: IRetryOptions = {\n maxRetries: 3,\n baseDelayMs: 1_000,\n maxDelayMs: 30_000,\n};\n\n/**\n * Execute a function with exponential backoff retry.\n */\nexport async function withRetry<T>(\n fn: () => Promise<T>,\n options?: Partial<IRetryOptions>,\n): Promise<T> {\n const opts = { ...DEFAULT_RETRY_OPTIONS, ...options };\n let lastError: unknown;\n\n for (let attempt = 0; attempt <= opts.maxRetries; attempt++) {\n try {\n return await fn();\n } catch (error: unknown) {\n lastError = error;\n\n if (attempt === opts.maxRetries) {\n break;\n }\n\n if (opts.shouldRetry && !opts.shouldRetry(error, attempt)) {\n break;\n }\n\n const delay = Math.min(\n opts.baseDelayMs * Math.pow(2, attempt) + Math.random() * 1_000,\n opts.maxDelayMs,\n );\n\n logger.warn(\n { attempt: attempt + 1, maxRetries: opts.maxRetries, delayMs: delay },\n \"Retrying after error\",\n );\n\n await sleep(delay);\n }\n }\n\n throw lastError;\n}\n\n/**\n * Sleep for a specified duration.\n */\nexport function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Check if an error indicates a rate limit (should retry after delay).\n */\nexport function isRateLimitError(error: unknown): boolean {\n if (error instanceof Error) {\n const message = error.message.toLowerCase();\n return message.includes(\"rate limit\") || message.includes(\"429\") || message.includes(\"too many requests\");\n }\n return false;\n}\n\n/**\n * Check if an error is transient (network issues, timeouts).\n */\nexport function isTransientError(error: unknown): boolean {\n if (error instanceof Error) {\n const message = error.message.toLowerCase();\n return (\n message.includes(\"timeout\") ||\n message.includes(\"econnreset\") ||\n message.includes(\"econnrefused\") ||\n message.includes(\"socket hang up\") ||\n message.includes(\"503\") ||\n message.includes(\"502\")\n );\n }\n return false;\n}\n"]}
|
package/dist/chunk-CS5X3BWX.js
DELETED
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import { resolve, normalize } from 'path';
|
|
2
|
-
|
|
3
|
-
// src/utils/sanitizer.ts
|
|
4
|
-
function validatePath(filePath, projectRoot) {
|
|
5
|
-
const resolved = resolve(projectRoot, filePath);
|
|
6
|
-
const normalizedRoot = normalize(projectRoot);
|
|
7
|
-
const normalizedPath = normalize(resolved);
|
|
8
|
-
if (!normalizedPath.startsWith(normalizedRoot)) {
|
|
9
|
-
throw new Error(
|
|
10
|
-
`Path traversal detected: "${filePath}" resolves outside project root "${projectRoot}"`
|
|
11
|
-
);
|
|
12
|
-
}
|
|
13
|
-
return normalizedPath;
|
|
14
|
-
}
|
|
15
|
-
function isCommandBlocked(command, blockedCommands) {
|
|
16
|
-
const normalizedCommand = command.trim().toLowerCase();
|
|
17
|
-
return blockedCommands.some(
|
|
18
|
-
(blocked) => normalizedCommand.includes(blocked.toLowerCase())
|
|
19
|
-
);
|
|
20
|
-
}
|
|
21
|
-
function redactSecrets(text) {
|
|
22
|
-
return text.replace(/sk-ant-api\S+/g, "sk-ant-api[REDACTED]").replace(/sk-[a-zA-Z0-9]{20,}/g, "sk-[REDACTED]").replace(/AIza[a-zA-Z0-9_-]{35}/g, "AIza[REDACTED]").replace(/ghp_[a-zA-Z0-9]{36}/g, "ghp_[REDACTED]").replace(/Bearer\s+[a-zA-Z0-9._-]+/gi, "Bearer [REDACTED]");
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
export { isCommandBlocked, redactSecrets, validatePath };
|
|
26
|
-
//# sourceMappingURL=chunk-CS5X3BWX.js.map
|
|
27
|
-
//# sourceMappingURL=chunk-CS5X3BWX.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/sanitizer.ts"],"names":[],"mappings":";;;AAoBO,SAAS,YAAA,CAAa,UAAkB,WAAA,EAA6B;AAC1E,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,WAAA,EAAa,QAAQ,CAAA;AAC9C,EAAA,MAAM,cAAA,GAAiB,UAAU,WAAW,CAAA;AAC5C,EAAA,MAAM,cAAA,GAAiB,UAAU,QAAQ,CAAA;AAEzC,EAAA,IAAI,CAAC,cAAA,CAAe,UAAA,CAAW,cAAc,CAAA,EAAG;AAC9C,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,0BAAA,EAA6B,QAAQ,CAAA,iCAAA,EAAoC,WAAW,CAAA,CAAA;AAAA,KACtF;AAAA,EACF;AAEA,EAAA,OAAO,cAAA;AACT;AAqBO,SAAS,gBAAA,CACd,SACA,eAAA,EACS;AACT,EAAA,MAAM,iBAAA,GAAoB,OAAA,CAAQ,IAAA,EAAK,CAAE,WAAA,EAAY;AACrD,EAAA,OAAO,eAAA,CAAgB,IAAA;AAAA,IAAK,CAAC,OAAA,KAC3B,iBAAA,CAAkB,QAAA,CAAS,OAAA,CAAQ,aAAa;AAAA,GAClD;AACF;AAKO,SAAS,cAAc,IAAA,EAAsB;AAClD,EAAA,OAAO,KACJ,OAAA,CAAQ,gBAAA,EAAkB,sBAAsB,CAAA,CAChD,OAAA,CAAQ,wBAAwB,eAAe,CAAA,CAC/C,QAAQ,wBAAA,EAA0B,gBAAgB,EAClD,OAAA,CAAQ,sBAAA,EAAwB,gBAAgB,CAAA,CAChD,OAAA,CAAQ,8BAA8B,mBAAmB,CAAA;AAC9D","file":"chunk-CS5X3BWX.js","sourcesContent":["/**\n * Input/output sanitization per PRD section 14.2\n * Zero trust for AI output — treat all model-generated content as untrusted\n */\n\nimport { resolve, normalize, relative, isAbsolute } from \"node:path\";\n\n/**\n * Sanitize shell command arguments to prevent injection.\n * PRD REQ: NO shell injection (section 14.1, 15.7 item 10)\n */\nexport function sanitizeShellArg(arg: string): string {\n // Escape single quotes by replacing them with escaped version\n return `'${arg.replace(/'/g, \"'\\\\''\")}'`;\n}\n\n/**\n * Validate a file path is within the allowed project root.\n * Prevents directory traversal attacks (PRD section 14.1).\n */\nexport function validatePath(filePath: string, projectRoot: string): string {\n const resolved = resolve(projectRoot, filePath);\n const normalizedRoot = normalize(projectRoot);\n const normalizedPath = normalize(resolved);\n\n if (!normalizedPath.startsWith(normalizedRoot)) {\n throw new Error(\n `Path traversal detected: \"${filePath}\" resolves outside project root \"${projectRoot}\"`,\n );\n }\n\n return normalizedPath;\n}\n\n/**\n * Check if a path is safe (within allowed paths).\n */\nexport function isPathAllowed(\n filePath: string,\n allowedPaths: readonly string[],\n projectRoot: string,\n): boolean {\n const resolved = resolve(projectRoot, filePath);\n return allowedPaths.some((allowed) => {\n const resolvedAllowed = resolve(projectRoot, allowed);\n return resolved.startsWith(resolvedAllowed);\n });\n}\n\n/**\n * Check if a shell command is on the blocked list.\n * PRD section 14.4: Dangerous commands always require confirmation.\n */\nexport function isCommandBlocked(\n command: string,\n blockedCommands: readonly string[],\n): boolean {\n const normalizedCommand = command.trim().toLowerCase();\n return blockedCommands.some((blocked) =>\n normalizedCommand.includes(blocked.toLowerCase()),\n );\n}\n\n/**\n * Redact potential secrets from text for logging.\n */\nexport function redactSecrets(text: string): string {\n return text\n .replace(/sk-ant-api\\S+/g, \"sk-ant-api[REDACTED]\")\n .replace(/sk-[a-zA-Z0-9]{20,}/g, \"sk-[REDACTED]\")\n .replace(/AIza[a-zA-Z0-9_-]{35}/g, \"AIza[REDACTED]\")\n .replace(/ghp_[a-zA-Z0-9]{36}/g, \"ghp_[REDACTED]\")\n .replace(/Bearer\\s+[a-zA-Z0-9._-]+/gi, \"Bearer [REDACTED]\");\n}\n\n/**\n * Sanitize user input for safe inclusion in prompts.\n */\nexport function sanitizePromptInput(input: string): string {\n // Strip null bytes\n return input.replace(/\\0/g, \"\");\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types/config.ts"],"names":[],"mappings":";AAgIO,IAAM,cAAA,GAAgC;AAAA,EAC3C,OAAA,EAAS,OAAA;AAAA,EACT,YAAA,EAAc,mBAAA;AAAA,EACd,KAAA,EAAO;AAAA,IACL,QAAA,EAAU,EAAE,OAAA,EAAS,iBAAA,EAAmB,UAAU,CAAC,SAAA,EAAW,gBAAgB,CAAA,EAAE;AAAA,IAChF,MAAA,EAAQ,EAAE,OAAA,EAAS,mBAAA,EAAqB,UAAU,CAAC,SAAA,EAAW,kBAAkB,CAAA,EAAE;AAAA,IAClF,QAAQ,EAAE,OAAA,EAAS,mBAAmB,QAAA,EAAU,CAAC,gBAAgB,CAAA,EAAE;AAAA,IACnE,SAAS,EAAE,OAAA,EAAS,oBAAoB,QAAA,EAAU,CAAC,kBAAkB,CAAA,EAAE;AAAA,IACvE,QAAQ,EAAE,OAAA,EAAS,qBAAqB,QAAA,EAAU,CAAC,SAAS,CAAA,EAAE;AAAA,IAC9D,eAAe,EAAE,OAAA,EAAS,oBAAoB,QAAA,EAAU,CAAC,kBAAkB,CAAA;AAAE,GAC/E;AAAA,EACA,SAAA,EAAW;AAAA,IACT,SAAA,EAAW,EAAE,OAAA,EAAS,IAAA,EAAK;AAAA,IAC3B,MAAA,EAAQ,EAAE,OAAA,EAAS,IAAA,EAAK;AAAA,IACxB,MAAA,EAAQ,EAAE,OAAA,EAAS,IAAA,EAAK;AAAA,IACxB,IAAA,EAAM,EAAE,OAAA,EAAS,KAAA,EAAM;AAAA,IACvB,MAAA,EAAQ,EAAE,OAAA,EAAS,KAAA,EAAO,SAAS,wBAAA;AAAyB,GAC9D;AAAA,EACA,WAAA,EAAa;AAAA,IACX,IAAA,EAAM,UAAA;AAAA,IACN,YAAA,EAAc,CAAC,IAAI,CAAA;AAAA,IACnB,eAAA,EAAiB,CAAC,UAAA,EAAY,kBAAkB;AAAA,GAClD;AAAA,EACA,UAAA,EAAY;AAAA,IACV,OAAA,EAAS,IAAA;AAAA,IACT,OAAA,EAAS,MAAA;AAAA,IACT,aAAA,EAAe,MAAA;AAAA,IACf,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,aAAA,EAAe,CAAA;AAAA,IACf,cAAA,EAAgB,EAAA;AAAA,IAChB,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,SAAA,EAAW;AAAA,IACT,OAAA,EAAS,KAAA;AAAA,IACT,UAAA,EAAY;AAAA;AAEhB","file":"chunk-CYQNBB25.js","sourcesContent":["/**\n * Configuration types per PRD section 17.3\n */\n\nimport type { ProviderName, ModelRole, IRoleConfig } from \"./model.js\";\nimport type { PermissionMode } from \"./tool.js\";\nimport type { PaneLayout } from \"./team.js\";\n\n// ── Provider Configuration ───────────────────────────────────────────────\n\nexport interface IProviderConfig {\n readonly enabled: boolean;\n readonly baseUrl?: string | undefined;\n}\n\n// ── Permission Configuration ─────────────────────────────────────────────\n\nexport interface IPermissionConfig {\n readonly mode: PermissionMode;\n readonly allowedPaths: readonly string[];\n readonly blockedCommands: readonly string[];\n}\n\n// ── Split Panel Configuration ────────────────────────────────────────────\n\nexport type PaneBackend = \"tmux\" | \"iterm2\";\n\nexport interface ISplitPanelConfig {\n readonly enabled: boolean;\n readonly backend: PaneBackend;\n readonly defaultLayout: PaneLayout;\n readonly maxPanes: number;\n}\n\n// ── Cost Configuration ───────────────────────────────────────────────────\n\nexport interface ICostConfig {\n readonly budgetWarning: number;\n readonly budgetHardStop: number;\n readonly currency: string;\n}\n\n// ── Telemetry Configuration ──────────────────────────────────────────────\n\nexport interface ITelemetryConfig {\n readonly enabled: boolean;\n readonly anonymized: boolean;\n}\n\n// ── OAuth Provider Configuration ─────────────────────────────────────────\n\nexport interface IOAuthProviderConfig {\n readonly clientId: string;\n readonly clientSecret?: string | undefined;\n readonly authorizeUrl?: string | undefined;\n readonly tokenUrl?: string | undefined;\n readonly scope?: string | undefined;\n}\n\nexport interface IOAuthConfig {\n readonly anthropic?: IOAuthProviderConfig | undefined;\n readonly openai?: IOAuthProviderConfig | undefined;\n readonly google?: IOAuthProviderConfig | undefined;\n readonly kimi?: IOAuthProviderConfig | undefined;\n}\n\n// ── Global Configuration (PRD section 17.3) ──────────────────────────────\n\nexport interface IGlobalConfig {\n readonly version: string;\n readonly defaultModel: string;\n readonly roles: Partial<Record<ModelRole, IRoleConfig>>;\n readonly providers: Partial<Record<ProviderName, IProviderConfig>>;\n readonly permissions: IPermissionConfig;\n readonly splitPanel: ISplitPanelConfig;\n readonly cost: ICostConfig;\n readonly telemetry: ITelemetryConfig;\n readonly oauth?: IOAuthConfig | undefined;\n}\n\n// ── MCP Server Configuration (PRD section 11.2) ─────────────────────────\n\nexport interface IMCPServerConfig {\n readonly command: string;\n readonly args: readonly string[];\n readonly env?: Readonly<Record<string, string>> | undefined;\n}\n\nexport interface IMCPConfig {\n readonly mcpServers: Readonly<Record<string, IMCPServerConfig>>;\n}\n\n// ── Skill Configuration (PRD section 10.2) ───────────────────────────────\n\nexport interface ISkillFrontmatter {\n readonly name: string;\n readonly description: string;\n readonly version: string;\n readonly \"allowed-tools\"?: readonly string[] | undefined;\n readonly triggers: readonly string[];\n readonly \"model-requirements\"?: {\n readonly \"preferred-role\"?: ModelRole | undefined;\n readonly \"min-context\"?: number | undefined;\n } | undefined;\n}\n\nexport interface ISkillDefinition {\n readonly frontmatter: ISkillFrontmatter;\n readonly body: string;\n readonly filePath: string;\n}\n\n// ── Auth Credential Types (PRD section 13) ───────────────────────────────\n\nexport type AuthMethod = \"native_login\" | \"api_key\" | \"env_variable\" | \"credential_helper\";\n\nexport interface ICredential {\n readonly provider: ProviderName;\n readonly method: AuthMethod;\n readonly token?: string | undefined;\n readonly refreshToken?: string | undefined;\n readonly expiresAt?: Date | undefined;\n readonly email?: string | undefined;\n readonly plan?: string | undefined;\n}\n\n// ── Default Configuration ────────────────────────────────────────────────\n\nexport const DEFAULT_CONFIG: IGlobalConfig = {\n version: \"1.0.0\",\n defaultModel: \"claude-sonnet-4-6\",\n roles: {\n planning: { primary: \"claude-opus-4-6\", fallback: [\"gpt-5.2\", \"gemini-2.5-pro\"] },\n coding: { primary: \"claude-sonnet-4-6\", fallback: [\"gpt-5.2\", \"gemini-2.5-flash\"] },\n review: { primary: \"claude-opus-4-6\", fallback: [\"gemini-2.5-pro\"] },\n testing: { primary: \"claude-haiku-4-5\", fallback: [\"gemini-2.5-flash\"] },\n bugfix: { primary: \"claude-sonnet-4-6\", fallback: [\"gpt-5.2\"] },\n documentation: { primary: \"gemini-2.5-flash\", fallback: [\"claude-haiku-4-5\"] },\n },\n providers: {\n anthropic: { enabled: true },\n openai: { enabled: true },\n google: { enabled: true },\n kimi: { enabled: false },\n ollama: { enabled: false, baseUrl: \"http://localhost:11434\" },\n },\n permissions: {\n mode: \"standard\",\n allowedPaths: [\"./\"],\n blockedCommands: [\"rm -rf /\", \"git push --force\"],\n },\n splitPanel: {\n enabled: true,\n backend: \"tmux\",\n defaultLayout: \"auto\",\n maxPanes: 6,\n },\n cost: {\n budgetWarning: 5.0,\n budgetHardStop: 20.0,\n currency: \"USD\",\n },\n telemetry: {\n enabled: false,\n anonymized: true,\n },\n};\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/model-router.ts","../src/core/context-manager.ts","../src/core/cost-tracker.ts","../src/core/permission-manager.ts","../src/core/task-orchestrator.ts"],"names":[],"mappings":";;;;;;;;AAwBO,IAAM,cAAN,MAAkB;AAAA,EACN,MAAA;AAAA,EACT,YAAA;AAAA,EAER,YAAY,MAAA,EAA4B;AACtC,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,OAAA,EAAmC;AACjD,IAAA,IAAI,YAAY,MAAA,EAAW;AACzB,MAAA,IAAA,CAAK,cAAc,OAAO,CAAA;AAAA,IAC5B;AACA,IAAA,IAAA,CAAK,YAAA,GAAe,OAAA;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,IAAA,EAAoC;AAE1C,IAAA,IAAI,KAAK,YAAA,EAAc;AACrB,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,YAAA,CAAa,IAAA,CAAK,YAAY,CAAA;AAChD,MAAA,OAAO;AAAA,QACL,SAAS,IAAA,CAAK,YAAA;AAAA,QACd,UAAU,IAAA,CAAK,QAAA;AAAA,QACf,MAAA,EAAQ,eAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAGA,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA;AACzC,MAAA,IAAI,UAAA,EAAY;AAEd,QAAA,IAAI,IAAA,CAAK,gBAAA,CAAiB,UAAA,CAAW,OAAO,CAAA,EAAG;AAC7C,UAAA,MAAM,IAAA,GAAO,IAAA,CAAK,YAAA,CAAa,UAAA,CAAW,OAAO,CAAA;AACjD,UAAA,OAAO;AAAA,YACL,SAAS,UAAA,CAAW,OAAA;AAAA,YACpB,UAAU,IAAA,CAAK,QAAA;AAAA,YACf,MAAA,EAAQ,aAAA;AAAA,YACR;AAAA,WACF;AAAA,QACF;AAGA,QAAA,KAAA,MAAW,aAAA,IAAiB,WAAW,QAAA,EAAU;AAC/C,UAAA,IAAI,IAAA,CAAK,gBAAA,CAAiB,aAAa,CAAA,EAAG;AACxC,YAAA,MAAM,IAAA,GAAO,IAAA,CAAK,YAAA,CAAa,aAAa,CAAA;AAC5C,YAAA,MAAA,CAAO,IAAA;AAAA,cACL,EAAE,IAAA,EAAM,OAAA,EAAS,UAAA,CAAW,OAAA,EAAS,UAAU,aAAA,EAAc;AAAA,cAC7D;AAAA,aACF;AACA,YAAA,OAAO;AAAA,cACL,OAAA,EAAS,aAAA;AAAA,cACT,UAAU,IAAA,CAAK,QAAA;AAAA,cACf,MAAA,EAAQ,gBAAA;AAAA,cACR;AAAA,aACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,IAAA,MAAM,YAAA,GAAe,KAAK,MAAA,CAAO,YAAA;AACjC,IAAA,IAAI,IAAA,CAAK,gBAAA,CAAiB,YAAY,CAAA,EAAG;AACvC,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,YAAA,CAAa,YAAY,CAAA;AAC3C,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,YAAA;AAAA,QACT,UAAU,IAAA,CAAK,QAAA;AAAA,QACf,MAAA,EAAQ,gBAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAGA,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,kBAAA,EAAmB,CAAE,CAAC,CAAA;AAChD,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,OAAO;AAAA,QACL,SAAS,YAAA,CAAa,EAAA;AAAA,QACtB,UAAU,YAAA,CAAa,QAAA;AAAA,QACvB,MAAA,EAAQ,gBAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAEA,IAAA,MAAM,IAAI,mBAAmB,YAAY,CAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB,OAAA,EAA0B;AACzC,IAAA,MAAM,IAAA,GAAO,iBAAiB,OAAO,CAAA;AACrC,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,gBAAA,CAAiB,QAAA,CAAS,KAAK,QAAQ,CAAA;AAAA,EAC5D;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,OAAA,EAA6B;AACxC,IAAA,MAAM,IAAA,GAAO,iBAAiB,OAAO,CAAA;AACrC,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,MAAM,IAAI,mBAAmB,OAAO,CAAA;AAAA,IACtC;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAA,GAA4C;AAC1C,IAAA,OAAO,MAAA,CAAO,MAAA,CAAO,gBAAgB,CAAA,CAAE,MAAA;AAAA,MAAO,CAAC,KAAA,KAC7C,IAAA,CAAK,OAAO,gBAAA,CAAiB,QAAA,CAAS,MAAM,QAAQ;AAAA,KACtD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB,IAAA,EAAwC;AACvD,IAAA,OAAO,IAAA,CAAK,oBAAmB,CAAE,MAAA;AAAA,MAAO,CAAC,KAAA,KACvC,KAAA,CAAM,cAAA,CAAe,SAAS,IAAI;AAAA,KACpC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,cAAc,OAAA,EAAuB;AAC3C,IAAA,IAAI,CAAC,gBAAA,CAAiB,OAAO,CAAA,EAAG;AAC9B,MAAA,MAAM,IAAI,mBAAmB,OAAO,CAAA;AAAA,IACtC;AAAA,EACF;AACF;AAKO,SAAS,kBAAkB,MAAA,EAAoC;AACpE,EAAA,MAAM,gBAAA,GAAmB,OAAO,OAAA,CAAQ,MAAA,CAAO,SAAS,CAAA,CACrD,MAAA,CAAO,CAAC,GAAG,cAAc,CAAA,KAAM,cAAA,EAAgB,OAAO,CAAA,CACtD,GAAA,CAAI,CAAC,CAAC,IAAI,MAAM,IAAoB,CAAA;AAEvC,EAAA,OAAO,IAAI,WAAA,CAAY;AAAA,IACrB,cAAc,MAAA,CAAO,YAAA;AAAA,IACrB,OAAO,MAAA,CAAO,KAAA;AAAA,IACd;AAAA,GACD,CAAA;AACH;;;ACxKA,IAAM,oBAAA,GAAuB,IAAA;AAC7B,IAAM,qBAAA,GAAwB,GAAA;AAQvB,IAAM,iBAAN,MAAqB;AAAA,EACT,SAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA,uBAAkB,GAAA,EAA+B;AAAA,EAC1D,iBAAA,GAAoB,CAAA;AAAA,EAE5B,YAAY,SAAA,EAAuB;AACjC,IAAA,IAAA,CAAK,YAAY,SAAA,CAAU,aAAA;AAC3B,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,YAAY,oBAAoB,CAAA;AAAA,EACtE;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAA,GAA6B;AAC3B,IAAA,OAAO,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,YAAA,GAAe,IAAA,CAAK,oBAAoB,qBAAqB,CAAA;AAAA,EACvF;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,GAA8E;AAC5E,IAAA,OAAO;AAAA,MACL,MAAM,IAAA,CAAK,iBAAA;AAAA,MACX,QAAQ,IAAA,CAAK,YAAA;AAAA,MACb,KAAK,IAAA,CAAK,SAAA;AAAA,MACV,YAAY,IAAA,CAAK,KAAA,CAAO,KAAK,iBAAA,GAAoB,IAAA,CAAK,eAAgB,GAAG;AAAA,KAC3E;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAA,CAAa,UAAmC,YAAA,EAAuC;AACrF,IAAA,MAAM,YAAA,GAAe,YAAA,GAAe,kBAAA,CAAmB,YAAY,CAAA,GAAI,CAAA;AACvE,IAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,YAAA,GAAe,YAAA,GAAe,qBAAA;AAE3D,IAAA,IAAI,mBAAmB,CAAA,EAAG;AACxB,MAAA,MAAA,CAAO,KAAK,4CAA4C,CAAA;AACxD,MAAA,OAAO,EAAC;AAAA,IACV;AAGA,IAAA,MAAM,SAAyB,EAAC;AAChC,IAAA,IAAI,UAAA,GAAa,CAAA;AAEjB,IAAA,KAAA,IAAS,IAAI,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AAC7C,MAAA,MAAM,GAAA,GAAM,SAAS,CAAC,CAAA;AACtB,MAAA,IAAI,CAAC,GAAA,EAAK;AACR,QAAA;AAAA,MACF;AACA,MAAA,MAAM,SAAA,GAAY,kBAAA,CAAmB,GAAA,CAAI,OAAO,CAAA;AAEhD,MAAA,IAAI,UAAA,GAAa,YAAY,eAAA,EAAiB;AAC5C,QAAA;AAAA,MACF;AAEA,MAAA,MAAA,CAAO,QAAQ,GAAG,CAAA;AAClB,MAAA,UAAA,IAAc,SAAA;AAAA,IAChB;AAEA,IAAA,IAAA,CAAK,oBAAoB,UAAA,GAAa,YAAA;AAEtC,IAAA,IAAI,MAAA,CAAO,MAAA,GAAS,QAAA,CAAS,MAAA,EAAQ;AACnC,MAAA,MAAA,CAAO,IAAA;AAAA,QACL;AAAA,UACE,UAAU,QAAA,CAAS,MAAA;AAAA,UACnB,SAAS,MAAA,CAAO,MAAA;AAAA,UAChB,eAAA,EAAiB,QAAA,CAAS,MAAA,GAAS,MAAA,CAAO;AAAA,SAC5C;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,cAAA,CAAe,UAAkB,OAAA,EAAuB;AACtD,IAAA,MAAM,UAAA,GAAa,mBAAmB,OAAO,CAAA;AAC7C,IAAA,IAAA,CAAK,WAAA,CAAY,IAAI,QAAA,EAAU;AAAA,MAC7B,QAAA;AAAA,MACA,UAAA;AAAA,MACA,cAAA,EAAgB,KAAK,GAAA;AAAI,KAC1B,CAAA;AACD,IAAA,IAAA,CAAK,iBAAA,IAAqB,UAAA;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,QAAA,EAAwB;AAChC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,QAAQ,CAAA;AAC3C,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,KAAA,CAAM,cAAA,GAAiB,KAAK,GAAA,EAAI;AAAA,IAClC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB,QAAA,EAAwB;AACxC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,QAAQ,CAAA;AAC3C,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,IAAA,CAAK,qBAAqB,KAAA,CAAM,UAAA;AAChC,MAAA,IAAA,CAAK,WAAA,CAAY,OAAO,QAAQ,CAAA;AAAA,IAClC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,YAAA,EAAgC;AACvC,IAAA,MAAM,UAAoB,EAAC;AAC3B,IAAA,MAAM,SAAS,CAAC,GAAG,KAAK,WAAA,CAAY,OAAA,EAAS,CAAA,CAAE,IAAA;AAAA,MAC7C,CAAC,GAAG,CAAC,CAAA,EAAG,GAAG,CAAC,CAAA,KAAM,CAAA,CAAE,cAAA,GAAiB,CAAA,CAAE;AAAA,KACzC;AAEA,IAAA,IAAI,WAAA,GAAc,CAAA;AAClB,IAAA,KAAA,MAAW,CAAC,QAAA,EAAU,KAAK,CAAA,IAAK,MAAA,EAAQ;AACtC,MAAA,IAAI,eAAe,YAAA,EAAc;AAC/B,QAAA;AAAA,MACF;AACA,MAAA,IAAA,CAAK,kBAAkB,QAAQ,CAAA;AAC/B,MAAA,WAAA,IAAe,KAAA,CAAM,UAAA;AACrB,MAAA,OAAA,CAAQ,KAAK,QAAQ,CAAA;AAAA,IACvB;AAEA,IAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,MAAA,MAAA,CAAO,IAAA;AAAA,QACL,EAAE,SAAS,WAAA,EAAY;AAAA,QACvB;AAAA,OACF;AAAA,IACF;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,eAAA,GAAgD;AAC9C,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,WAAA,CAAY,QAAQ,CAAA;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,YAAY,KAAA,EAAM;AACvB,IAAA,IAAA,CAAK,iBAAA,GAAoB,CAAA;AAAA,EAC3B;AACF;;;ACrJO,IAAM,cAAN,MAAkB;AAAA,EACN,UAAwB,EAAC;AAAA,EACzB,YAAA;AAAA,EACT,cAAA,GAAiB,KAAA;AAAA,EAEzB,YAAY,YAAA,EAA2B;AACrC,IAAA,IAAA,CAAK,YAAA,GAAe,YAAA;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAA,CACE,QAAA,EACA,KAAA,EACA,WAAA,EACA,cACA,IAAA,EACa;AACb,IAAA,MAAM,KAAA,GAAQ,gBAAA,CAAiB,KAAA,EAAO,WAAA,EAAa,YAAY,CAAA;AAE/D,IAAA,MAAM,KAAA,GAAoB;AAAA,MACxB,QAAA;AAAA,MACA,KAAA;AAAA,MACA,IAAA;AAAA,MACA,KAAA;AAAA,MACA,SAAA,sBAAe,IAAA;AAAK,KACtB;AAEA,IAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,KAAK,CAAA;AAEvB,IAAA,MAAM,KAAA,GAAQ,KAAK,eAAA,EAAgB;AACnC,IAAA,MAAM,WAAW,WAAA,EAAY;AAE7B,IAAA,QAAA,CAAS,KAAK,cAAA,EAAgB;AAAA,MAC5B,KAAA;AAAA,MACA,QAAA;AAAA,MACA,OAAO,KAAA,CAAM;AAAA,KACd,CAAA;AAGD,IAAA,IAAI,SAAS,IAAA,CAAK,YAAA,CAAa,aAAA,IAAiB,CAAC,KAAK,cAAA,EAAgB;AACpE,MAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AACtB,MAAA,QAAA,CAAS,KAAK,cAAA,EAAgB;AAAA,QAC5B,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,KAAK,YAAA,CAAa;AAAA,OAC1B,CAAA;AACD,MAAA,MAAA,CAAO,IAAA;AAAA,QACL,EAAE,OAAA,EAAS,UAAA,CAAW,KAAK,CAAA,EAAG,SAAS,UAAA,CAAW,IAAA,CAAK,YAAA,CAAa,aAAa,CAAA,EAAE;AAAA,QACnF;AAAA,OACF;AAAA,IACF;AAGA,IAAA,IAAI,KAAA,IAAS,IAAA,CAAK,YAAA,CAAa,cAAA,EAAgB;AAC7C,MAAA,QAAA,CAAS,KAAK,eAAA,EAAiB;AAAA,QAC7B,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,KAAK,YAAA,CAAa;AAAA,OAC1B,CAAA;AACD,MAAA,MAAA,CAAO,KAAA;AAAA,QACL,EAAE,OAAA,EAAS,UAAA,CAAW,KAAK,CAAA,EAAG,OAAO,UAAA,CAAW,IAAA,CAAK,YAAA,CAAa,cAAc,CAAA,EAAE;AAAA,QAClF;AAAA,OACF;AAAA,IACF;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,eAAA,GAA0B;AACxB,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,CAAC,GAAA,EAAK,UAAU,GAAA,GAAM,KAAA,CAAM,KAAA,CAAM,OAAA,EAAS,CAAC,CAAA;AAAA,EACzE;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAA,GAAqE;AACnE,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,CAAC,GAAA,EAAK,CAAA,KAAM,GAAA,GAAM,CAAA,CAAE,KAAA,CAAM,WAAA,EAAa,CAAC,CAAA;AAC1E,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,CAAC,GAAA,EAAK,CAAA,KAAM,GAAA,GAAM,CAAA,CAAE,KAAA,CAAM,YAAA,EAAc,CAAC,CAAA;AAC5E,IAAA,OAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,QAAQ,MAAA,EAAO;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA,EAKA,YAAA,GAA+B;AAC7B,IAAA,MAAM,aAAqC,EAAC;AAC5C,IAAA,MAAM,UAAkC,EAAC;AACzC,IAAA,MAAM,SAAiC,EAAC;AAExC,IAAA,KAAA,MAAW,KAAA,IAAS,KAAK,OAAA,EAAS;AAChC,MAAA,UAAA,CAAW,KAAA,CAAM,QAAQ,CAAA,GAAA,CAAK,UAAA,CAAW,MAAM,QAAQ,CAAA,IAAK,CAAA,IAAK,KAAA,CAAM,KAAA,CAAM,OAAA;AAC7E,MAAA,OAAA,CAAQ,KAAA,CAAM,KAAK,CAAA,GAAA,CAAK,OAAA,CAAQ,MAAM,KAAK,CAAA,IAAK,CAAA,IAAK,KAAA,CAAM,KAAA,CAAM,OAAA;AACjE,MAAA,IAAI,MAAM,IAAA,EAAM;AACd,QAAA,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA,GAAA,CAAK,MAAA,CAAO,MAAM,IAAI,CAAA,IAAK,CAAA,IAAK,KAAA,CAAM,KAAA,CAAM,OAAA;AAAA,MAC/D;AAAA,IACF;AAEA,IAAA,OAAO,EAAE,UAAA,EAAY,OAAA,EAAS,MAAA,EAAO;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAA,GAA4B;AAC1B,IAAA,OAAO,IAAA,CAAK,eAAA,EAAgB,IAAK,IAAA,CAAK,YAAA,CAAa,cAAA;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,GAAqB;AACnB,IAAA,MAAM,KAAA,GAAQ,KAAK,eAAA,EAAgB;AACnC,IAAA,MAAM,MAAA,GAAS,KAAK,gBAAA,EAAiB;AACrC,IAAA,OAAO,CAAA,EAAG,WAAW,KAAK,CAAC,KAAK,MAAA,CAAO,KAAA,CAAM,gBAAgB,CAAA,QAAA,CAAA;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,GAAoC;AAClC,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,QAAQ,MAAA,GAAS,CAAA;AACtB,IAAA,IAAA,CAAK,cAAA,GAAiB,KAAA;AAAA,EACxB;AACF;;;ACtJA,IAAM,kBAAA,GAAqB;AAAA,EACzB,QAAA;AAAA,EACA,kBAAA;AAAA,EACA,kBAAA;AAAA,EACA,gBAAA;AAAA,EACA,cAAA;AAAA,EACA,eAAA;AAAA,EACA,YAAA;AAAA,EACA,eAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAA;AAgBO,IAAM,oBAAN,MAAwB;AAAA,EACrB,IAAA;AAAA,EACS,YAAA;AAAA,EACA,eAAA;AAAA,EACA,kBAAA,uBAAyB,GAAA,EAAY;AAAA,EAEtD,WAAA,CACE,IAAA,EACA,YAAA,EACA,eAAA,EACA;AACA,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,YAAA,GAAe,YAAA;AACpB,IAAA,IAAA,CAAK,eAAA,GAAkB,eAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAA,EAAgD;AAEpD,IAAA,IAAI,QAAQ,OAAA,IAAW,IAAA,CAAK,kBAAA,CAAmB,OAAA,CAAQ,OAAO,CAAA,EAAG;AAC/D,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,MAAA,EAAQ,CAAA,6BAAA,EAAgC,OAAA,CAAQ,OAAO,CAAA,CAAA,CAAA;AAAA,QACvD,oBAAA,EAAsB;AAAA,OACxB;AAAA,IACF;AAGA,IAAA,IAAI,QAAQ,OAAA,IAAW,gBAAA,CAAiB,QAAQ,OAAA,EAAS,IAAA,CAAK,eAAe,CAAA,EAAG;AAC9E,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,MAAA,EAAQ,CAAA,8BAAA,CAAA;AAAA,QACR,oBAAA,EAAsB;AAAA,OACxB;AAAA,IACF;AAGA,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,eAAA,CAAgB,OAAO,CAAA;AAC1C,IAAA,IAAI,IAAA,CAAK,kBAAA,CAAmB,GAAA,CAAI,KAAK,CAAA,EAAG;AACtC,MAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,oBAAA,EAAsB,KAAA,EAAM;AAAA,IACtD;AAGA,IAAA,QAAQ,KAAK,IAAA;AAAM,MACjB,KAAK,YAAA;AACH,QAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,oBAAA,EAAsB,KAAA,EAAM;AAAA,MAEtD,KAAK,UAAA;AACH,QAAA,OAAO,IAAA,CAAK,kBAAkB,OAAO,CAAA;AAAA,MAEvC,KAAK,QAAA;AACH,QAAA,OAAO,IAAA,CAAK,gBAAgB,OAAO,CAAA;AAAA;AACvC,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,OAAA,EAAmC;AACzC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,eAAA,CAAgB,OAAO,CAAA;AAC1C,IAAA,IAAA,CAAK,kBAAA,CAAmB,IAAI,KAAK,CAAA;AACjC,IAAA,MAAA,CAAO,IAAA,CAAK,EAAE,SAAA,EAAW,KAAA,IAAS,4BAA4B,CAAA;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,IAAA,EAA4B;AAClC,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,mBAAmB,KAAA,EAAM;AAC9B,IAAA,MAAA,CAAO,IAAA,CAAK,EAAE,IAAA,EAAK,EAAG,yBAAyB,CAAA;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,GAA0B;AACxB,IAAA,OAAO,IAAA,CAAK,IAAA;AAAA,EACd;AAAA,EAEQ,kBAAkB,OAAA,EAAgD;AAExE,IAAA,IAAI,IAAA,CAAK,eAAA,CAAgB,OAAO,CAAA,EAAG;AACjC,MAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,oBAAA,EAAsB,KAAA,EAAM;AAAA,IACtD;AAGA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,MAAA,EAAQ,CAAA,EAAG,OAAA,CAAQ,SAAS,CAAA,mCAAA,CAAA;AAAA,MAC5B,oBAAA,EAAsB;AAAA,KACxB;AAAA,EACF;AAAA,EAEQ,gBAAgB,OAAA,EAAgD;AAEtE,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,MAAA,EAAQ,CAAA,EAAG,OAAA,CAAQ,SAAS,CAAA,iCAAA,CAAA;AAAA,MAC5B,oBAAA,EAAsB;AAAA,KACxB;AAAA,EACF;AAAA,EAEQ,gBAAgB,OAAA,EAAsC;AAC5D,IAAA,MAAM,YAAY,CAAC,MAAA,EAAQ,MAAA,EAAQ,MAAA,EAAQ,cAAc,WAAW,CAAA;AACpE,IAAA,OAAO,SAAA,CAAU,QAAA,CAAS,OAAA,CAAQ,QAAQ,CAAA;AAAA,EAC5C;AAAA,EAEQ,mBAAmB,OAAA,EAA0B;AACnD,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,WAAA,EAAY,CAAE,IAAA,EAAK;AACzC,IAAA,OAAO,mBAAmB,IAAA,CAAK,CAAC,cAAc,KAAA,CAAM,QAAA,CAAS,SAAS,CAAC,CAAA;AAAA,EACzE;AAAA,EAEQ,gBAAgB,OAAA,EAAqC;AAC3D,IAAA,OAAO,CAAA,EAAG,QAAQ,QAAQ,CAAA,CAAA,EAAI,QAAQ,SAAS,CAAA,CAAA,EAAI,OAAA,CAAQ,QAAA,IAAY,EAAE,CAAA,CAAA;AAAA,EAC3E;AACF;;;ACnJA,IAAI,UAAA,GAAa,CAAA;AAEjB,SAAS,cAAA,GAAyB;AAChC,EAAA,OAAO,OAAO,UAAA,EAAY,CAAA;AAC5B;AAEO,IAAM,mBAAN,MAAuB;AAAA,EACX,KAAA,uBAAY,GAAA,EAAmB;AAAA;AAAA;AAAA;AAAA,EAKhD,UAAA,CACE,OAAA,EACA,WAAA,EACA,OAAA,EAMO;AACP,IAAA,MAAM,KAAK,cAAA,EAAe;AAC1B,IAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AAErB,IAAA,MAAM,IAAA,GAAc;AAAA,MAClB,EAAA;AAAA,MACA,OAAA;AAAA,MACA,WAAA;AAAA,MACA,MAAA,EAAQ,SAAA;AAAA,MACR,OAAO,OAAA,EAAS,KAAA;AAAA,MAChB,OAAO,OAAA,EAAS,KAAA;AAAA,MAChB,MAAM,OAAA,EAAS,IAAA;AAAA,MACf,QAAQ,EAAC;AAAA,MACT,SAAA,EAAW,SAAS,SAAA,GAAY,CAAC,GAAG,OAAA,CAAQ,SAAS,IAAI,EAAC;AAAA,MAC1D,SAAA,EAAW,GAAA;AAAA,MACX,SAAA,EAAW;AAAA,KACb;AAEA,IAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,EAAA,EAAI,IAAI,CAAA;AAGvB,IAAA,IAAI,SAAS,SAAA,EAAW;AACtB,MAAA,KAAA,MAAW,SAAA,IAAa,QAAQ,SAAA,EAAW;AACzC,QAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,SAAS,CAAA;AACxC,QAAA,IAAI,WAAW,CAAC,OAAA,CAAQ,MAAA,CAAO,QAAA,CAAS,EAAE,CAAA,EAAG;AAC3C,UAAA,OAAA,CAAQ,MAAA,CAAO,KAAK,EAAE,CAAA;AAAA,QACxB;AAAA,MACF;AAAA,IACF;AAEA,IAAA,WAAA,GAAc,IAAA,CAAK,cAAA,EAAgB,EAAE,MAAA,EAAQ,EAAA,EAAI,SAAS,CAAA;AAC1D,IAAA,MAAA,CAAO,KAAK,EAAE,MAAA,EAAQ,EAAA,EAAI,OAAA,IAAW,cAAc,CAAA;AAEnD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,YAAA,CAAa,QAAgB,MAAA,EAA0B;AACrD,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAA;AAChC,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,SAAA,uBAAgB,IAAA,EAAK;AAE1B,IAAA,WAAA,GAAc,IAAA,CAAK,cAAA,EAAgB,EAAE,MAAA,EAAQ,QAAQ,CAAA;AAErD,IAAA,IAAI,WAAW,WAAA,EAAa;AAC1B,MAAA,WAAA,EAAY,CAAE,IAAA,CAAK,gBAAA,EAAkB,EAAE,QAAQ,CAAA;AAC/C,MAAA,IAAA,CAAK,oBAAoB,MAAM,CAAA;AAAA,IACjC;AAEA,IAAA,MAAA,CAAO,IAAA,CAAK,EAAE,MAAA,EAAQ,MAAA,IAAU,qBAAqB,CAAA;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,CAAW,MAAA,EAAgB,KAAA,EAAe,KAAA,EAAsB;AAC9D,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAA;AAChC,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAI,KAAA,EAAO;AACT,MAAC,KAA4B,KAAA,GAAQ,KAAA;AAAA,IACvC;AACA,IAAA,IAAA,CAAK,SAAA,uBAAgB,IAAA,EAAK;AAC1B,IAAA,MAAA,CAAO,KAAK,EAAE,MAAA,EAAQ,KAAA,EAAO,KAAA,IAAS,eAAe,CAAA;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,MAAA,EAAuB;AAC7B,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,MAAM,CAAA;AAClC,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,MAAM,CAAA,CAAE,CAAA;AAAA,IAC7C;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,GAAgC;AAC9B,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB,MAAA,EAAsC;AACrD,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,KAAA,CAAM,MAAA,EAAQ,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,KAAW,MAAM,CAAA;AAAA,EACnE;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,KAAA,EAAiC;AAC/C,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,KAAA,CAAM,MAAA,EAAQ,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,KAAU,KAAK,CAAA;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAA,GAAsC;AACpC,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,KAAA,CAAM,MAAA,EAAQ,CAAA,CAAE,MAAA;AAAA,MAC9B,CAAC,CAAA,KACC,CAAA,CAAE,MAAA,KAAW,SAAA,IACb,CAAC,CAAA,CAAE,KAAA,IACH,CAAA,CAAE,SAAA,CAAU,KAAA,CAAM,CAAC,SAAA,KAAc;AAC/B,QAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,SAAS,CAAA;AACxC,QAAA,OAAO,SAAS,MAAA,KAAW,WAAA;AAAA,MAC7B,CAAC;AAAA,KACL;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,GAAyB;AACvB,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,KAAA,CAAM,MAAA,EAAQ,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,KAAW,WAAW,CAAA;AAAA,EACvE;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,GAA0G;AACxG,IAAA,MAAM,QAAQ,CAAC,GAAG,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA;AACrC,IAAA,OAAO;AAAA,MACL,OAAO,KAAA,CAAM,MAAA;AAAA,MACb,SAAA,EAAW,MAAM,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,MAAA,KAAW,WAAW,CAAA,CAAE,MAAA;AAAA,MACzD,UAAA,EAAY,MAAM,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,MAAA,KAAW,aAAa,CAAA,CAAE,MAAA;AAAA,MAC5D,OAAA,EAAS,MAAM,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,MAAA,KAAW,SAAS,CAAA,CAAE,MAAA;AAAA,MACrD,OAAA,EAAS,MAAM,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,MAAA,KAAW,SAAS,CAAA,CAAE;AAAA,KACvD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,MAAA,EAAsB;AAC/B,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,MAAM,CAAA;AAClC,IAAA,IAAI,IAAA,EAAM;AAER,MAAA,KAAA,MAAW,GAAG,SAAS,CAAA,IAAK,KAAK,KAAA,EAAO;AACtC,QAAA,SAAA,CAAU,YAAY,SAAA,CAAU,SAAA,CAAU,OAAO,CAAC,EAAA,KAAO,OAAO,MAAM,CAAA;AACtE,QAAA,SAAA,CAAU,SAAS,SAAA,CAAU,MAAA,CAAO,OAAO,CAAC,EAAA,KAAO,OAAO,MAAM,CAAA;AAAA,MAClE;AACA,MAAA,IAAA,CAAK,KAAA,CAAM,OAAO,MAAM,CAAA;AAAA,IAC1B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,oBAAoB,eAAA,EAA+B;AACzD,IAAA,KAAA,MAAW,GAAG,IAAI,CAAA,IAAK,KAAK,KAAA,EAAO;AACjC,MAAA,IAAI,IAAA,CAAK,MAAA,KAAW,SAAA,IAAa,IAAA,CAAK,WAAW,SAAA,EAAW;AAC1D,QAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,CAAC,KAAA,KAAU;AACtD,UAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,KAAK,CAAA;AAChC,UAAA,OAAO,KAAK,MAAA,KAAW,WAAA;AAAA,QACzB,CAAC,CAAA;AAED,QAAA,IAAI,eAAA,IAAmB,IAAA,CAAK,MAAA,KAAW,SAAA,EAAW;AAChD,UAAA,IAAA,CAAK,MAAA,GAAS,SAAA;AACd,UAAA,IAAA,CAAK,SAAA,uBAAgB,IAAA,EAAK;AAC1B,UAAA,MAAA,CAAO,IAAA;AAAA,YACL,EAAE,MAAA,EAAQ,IAAA,CAAK,EAAA,EAAI,aAAa,eAAA,EAAgB;AAAA,YAChD;AAAA,WACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF","file":"chunk-DAHGLHNR.js","sourcesContent":["/**\n * Role-based model selection per PRD section 7.2\n * Resolution pipeline: user override → role config → fallback chain → system default\n */\n\nimport type {\n ModelRole,\n IModelResolution,\n ModelResolutionSource,\n IRoleConfig,\n IGlobalConfig,\n ProviderName,\n IModelInfo,\n} from \"../types/index.js\";\nimport { SUPPORTED_MODELS, DEFAULT_MODEL_ID, ModelNotFoundError } from \"../types/index.js\";\nimport { logger } from \"../utils/index.js\";\nimport { getEventBus } from \"./event-bus.js\";\n\nexport interface IModelRouterConfig {\n readonly defaultModel: string;\n readonly roles: Partial<Record<ModelRole, IRoleConfig>>;\n readonly enabledProviders: readonly ProviderName[];\n}\n\nexport class ModelRouter {\n private readonly config: IModelRouterConfig;\n private userOverride: string | undefined;\n\n constructor(config: IModelRouterConfig) {\n this.config = config;\n }\n\n /**\n * Set a temporary user override that takes highest priority.\n */\n setUserOverride(modelId: string | undefined): void {\n if (modelId !== undefined) {\n this.validateModel(modelId);\n }\n this.userOverride = modelId;\n }\n\n /**\n * Resolve the best model for a given role through the priority pipeline.\n */\n resolve(role?: ModelRole): IModelResolution {\n // 1. User override (explicit flag: --model claude-opus-4-6)\n if (this.userOverride) {\n const info = this.getModelInfo(this.userOverride);\n return {\n modelId: this.userOverride,\n provider: info.provider,\n source: \"user_override\",\n role,\n };\n }\n\n // 2. Role config\n if (role) {\n const roleConfig = this.config.roles[role];\n if (roleConfig) {\n // Try primary model\n if (this.isModelAvailable(roleConfig.primary)) {\n const info = this.getModelInfo(roleConfig.primary);\n return {\n modelId: roleConfig.primary,\n provider: info.provider,\n source: \"role_config\",\n role,\n };\n }\n\n // 3. Fallback chain\n for (const fallbackModel of roleConfig.fallback) {\n if (this.isModelAvailable(fallbackModel)) {\n const info = this.getModelInfo(fallbackModel);\n logger.info(\n { role, primary: roleConfig.primary, fallback: fallbackModel },\n \"Using fallback model for role\",\n );\n return {\n modelId: fallbackModel,\n provider: info.provider,\n source: \"fallback_chain\",\n role,\n };\n }\n }\n }\n }\n\n // 4. System default\n const defaultModel = this.config.defaultModel;\n if (this.isModelAvailable(defaultModel)) {\n const info = this.getModelInfo(defaultModel);\n return {\n modelId: defaultModel,\n provider: info.provider,\n source: \"system_default\",\n role,\n };\n }\n\n // Last resort: find any available model\n const anyAvailable = this.getAvailableModels()[0];\n if (anyAvailable) {\n return {\n modelId: anyAvailable.id,\n provider: anyAvailable.provider,\n source: \"system_default\",\n role,\n };\n }\n\n throw new ModelNotFoundError(defaultModel);\n }\n\n /**\n * Check if a model is available (provider is enabled and model is known).\n */\n isModelAvailable(modelId: string): boolean {\n const info = SUPPORTED_MODELS[modelId];\n if (!info) {\n return false;\n }\n return this.config.enabledProviders.includes(info.provider);\n }\n\n /**\n * Get model info by ID. Throws if not found.\n */\n getModelInfo(modelId: string): IModelInfo {\n const info = SUPPORTED_MODELS[modelId];\n if (!info) {\n throw new ModelNotFoundError(modelId);\n }\n return info;\n }\n\n /**\n * Get all available models (from enabled providers).\n */\n getAvailableModels(): readonly IModelInfo[] {\n return Object.values(SUPPORTED_MODELS).filter((model) =>\n this.config.enabledProviders.includes(model.provider),\n );\n }\n\n /**\n * List models recommended for a specific role.\n */\n getModelsForRole(role: ModelRole): readonly IModelInfo[] {\n return this.getAvailableModels().filter((model) =>\n model.supportedRoles.includes(role),\n );\n }\n\n /**\n * Validate that a model ID exists. Throws ModelNotFoundError if not.\n */\n private validateModel(modelId: string): void {\n if (!SUPPORTED_MODELS[modelId]) {\n throw new ModelNotFoundError(modelId);\n }\n }\n}\n\n/**\n * Create a ModelRouter from the global config.\n */\nexport function createModelRouter(config: IGlobalConfig): ModelRouter {\n const enabledProviders = Object.entries(config.providers)\n .filter(([, providerConfig]) => providerConfig?.enabled)\n .map(([name]) => name as ProviderName);\n\n return new ModelRouter({\n defaultModel: config.defaultModel,\n roles: config.roles,\n enabledProviders,\n });\n}\n","/**\n * Context window management per PRD section 7.4\n * - Token budgeting: 85% conversation, 15% buffer\n * - Smart truncation: prioritize recent + system prompt\n * - Compression: summarize old messages when approaching limits\n * - File context tracking with LRU eviction\n */\n\nimport type { IChatMessage, IModelInfo } from \"../types/index.js\";\nimport { estimateTokenCount } from \"../utils/index.js\";\nimport { logger } from \"../utils/index.js\";\n\nconst CONTEXT_BUDGET_RATIO = 0.85;\nconst SYSTEM_PROMPT_RESERVE = 4_000;\n\ninterface IFileContextEntry {\n readonly filePath: string;\n readonly tokenCount: number;\n lastAccessedAt: number;\n}\n\nexport class ContextManager {\n private readonly maxTokens: number;\n private readonly budgetTokens: number;\n private readonly fileContext = new Map<string, IFileContextEntry>();\n private currentTokenCount = 0;\n\n constructor(modelInfo: IModelInfo) {\n this.maxTokens = modelInfo.contextWindow;\n this.budgetTokens = Math.floor(this.maxTokens * CONTEXT_BUDGET_RATIO);\n }\n\n /**\n * Get the available token budget for new content.\n */\n getAvailableBudget(): number {\n return Math.max(0, this.budgetTokens - this.currentTokenCount - SYSTEM_PROMPT_RESERVE);\n }\n\n /**\n * Get total context usage.\n */\n getUsage(): { used: number; budget: number; max: number; percentage: number } {\n return {\n used: this.currentTokenCount,\n budget: this.budgetTokens,\n max: this.maxTokens,\n percentage: Math.round((this.currentTokenCount / this.budgetTokens) * 100),\n };\n }\n\n /**\n * Trim messages to fit within the context window.\n * Preserves system prompt and most recent messages.\n */\n trimMessages(messages: readonly IChatMessage[], systemPrompt?: string): IChatMessage[] {\n const systemTokens = systemPrompt ? estimateTokenCount(systemPrompt) : 0;\n const availableTokens = this.budgetTokens - systemTokens - SYSTEM_PROMPT_RESERVE;\n\n if (availableTokens <= 0) {\n logger.warn(\"System prompt alone exceeds context budget\");\n return [];\n }\n\n // Work backwards from most recent, accumulating tokens\n const result: IChatMessage[] = [];\n let usedTokens = 0;\n\n for (let i = messages.length - 1; i >= 0; i--) {\n const msg = messages[i];\n if (!msg) {\n continue;\n }\n const msgTokens = estimateTokenCount(msg.content);\n\n if (usedTokens + msgTokens > availableTokens) {\n break;\n }\n\n result.unshift(msg);\n usedTokens += msgTokens;\n }\n\n this.currentTokenCount = usedTokens + systemTokens;\n\n if (result.length < messages.length) {\n logger.info(\n {\n original: messages.length,\n trimmed: result.length,\n droppedMessages: messages.length - result.length,\n },\n \"Trimmed conversation to fit context window\",\n );\n }\n\n return result;\n }\n\n /**\n * Track a file being added to context.\n */\n addFileContext(filePath: string, content: string): void {\n const tokenCount = estimateTokenCount(content);\n this.fileContext.set(filePath, {\n filePath,\n tokenCount,\n lastAccessedAt: Date.now(),\n });\n this.currentTokenCount += tokenCount;\n }\n\n /**\n * Touch a file (update last accessed time).\n */\n touchFile(filePath: string): void {\n const entry = this.fileContext.get(filePath);\n if (entry) {\n entry.lastAccessedAt = Date.now();\n }\n }\n\n /**\n * Remove a file from context.\n */\n removeFileContext(filePath: string): void {\n const entry = this.fileContext.get(filePath);\n if (entry) {\n this.currentTokenCount -= entry.tokenCount;\n this.fileContext.delete(filePath);\n }\n }\n\n /**\n * Evict least-recently-used files to free space.\n */\n evictLRU(tokensNeeded: number): string[] {\n const evicted: string[] = [];\n const sorted = [...this.fileContext.entries()].sort(\n ([, a], [, b]) => a.lastAccessedAt - b.lastAccessedAt,\n );\n\n let freedTokens = 0;\n for (const [filePath, entry] of sorted) {\n if (freedTokens >= tokensNeeded) {\n break;\n }\n this.removeFileContext(filePath);\n freedTokens += entry.tokenCount;\n evicted.push(filePath);\n }\n\n if (evicted.length > 0) {\n logger.info(\n { evicted, freedTokens },\n \"Evicted files from context to free space\",\n );\n }\n\n return evicted;\n }\n\n /**\n * Get all tracked files.\n */\n getTrackedFiles(): readonly IFileContextEntry[] {\n return [...this.fileContext.values()];\n }\n\n /**\n * Reset context tracking (for model switch).\n */\n reset(): void {\n this.fileContext.clear();\n this.currentTokenCount = 0;\n }\n}\n","/**\n * Real-time cost tracking per PRD section 7.5\n * - Per-request cost calculation\n * - Session total\n * - Breakdown by provider, model, and role\n * - Configurable budget alerts\n */\n\nimport type { ProviderName, ModelRole, ITokenUsage, ICostConfig } from \"../types/index.js\";\nimport { createTokenUsage, formatCost } from \"../utils/index.js\";\nimport { logger } from \"../utils/index.js\";\nimport { getEventBus } from \"./event-bus.js\";\n\ninterface ICostEntry {\n readonly provider: ProviderName;\n readonly model: string;\n readonly role?: ModelRole | undefined;\n readonly usage: ITokenUsage;\n readonly timestamp: Date;\n}\n\ninterface ICostBreakdown {\n readonly byProvider: Record<string, number>;\n readonly byModel: Record<string, number>;\n readonly byRole: Record<string, number>;\n}\n\nexport class CostTracker {\n private readonly entries: ICostEntry[] = [];\n private readonly budgetConfig: ICostConfig;\n private warningEmitted = false;\n\n constructor(budgetConfig: ICostConfig) {\n this.budgetConfig = budgetConfig;\n }\n\n /**\n * Record a cost entry from a model response.\n */\n record(\n provider: ProviderName,\n model: string,\n inputTokens: number,\n outputTokens: number,\n role?: ModelRole,\n ): ITokenUsage {\n const usage = createTokenUsage(model, inputTokens, outputTokens);\n\n const entry: ICostEntry = {\n provider,\n model,\n role,\n usage,\n timestamp: new Date(),\n };\n\n this.entries.push(entry);\n\n const total = this.getSessionTotal();\n const eventBus = getEventBus();\n\n eventBus.emit(\"cost:updated\", {\n total,\n provider,\n delta: usage.costUsd,\n });\n\n // Budget warning\n if (total >= this.budgetConfig.budgetWarning && !this.warningEmitted) {\n this.warningEmitted = true;\n eventBus.emit(\"cost:warning\", {\n current: total,\n limit: this.budgetConfig.budgetWarning,\n });\n logger.warn(\n { current: formatCost(total), warning: formatCost(this.budgetConfig.budgetWarning) },\n \"Budget warning threshold reached\",\n );\n }\n\n // Budget hard stop\n if (total >= this.budgetConfig.budgetHardStop) {\n eventBus.emit(\"cost:exceeded\", {\n current: total,\n limit: this.budgetConfig.budgetHardStop,\n });\n logger.error(\n { current: formatCost(total), limit: formatCost(this.budgetConfig.budgetHardStop) },\n \"Budget hard stop reached\",\n );\n }\n\n return usage;\n }\n\n /**\n * Get total session cost.\n */\n getSessionTotal(): number {\n return this.entries.reduce((sum, entry) => sum + entry.usage.costUsd, 0);\n }\n\n /**\n * Get total token counts.\n */\n getSessionTokens(): { input: number; output: number; total: number } {\n const input = this.entries.reduce((sum, e) => sum + e.usage.inputTokens, 0);\n const output = this.entries.reduce((sum, e) => sum + e.usage.outputTokens, 0);\n return { input, output, total: input + output };\n }\n\n /**\n * Get cost breakdown by provider, model, and role.\n */\n getBreakdown(): ICostBreakdown {\n const byProvider: Record<string, number> = {};\n const byModel: Record<string, number> = {};\n const byRole: Record<string, number> = {};\n\n for (const entry of this.entries) {\n byProvider[entry.provider] = (byProvider[entry.provider] ?? 0) + entry.usage.costUsd;\n byModel[entry.model] = (byModel[entry.model] ?? 0) + entry.usage.costUsd;\n if (entry.role) {\n byRole[entry.role] = (byRole[entry.role] ?? 0) + entry.usage.costUsd;\n }\n }\n\n return { byProvider, byModel, byRole };\n }\n\n /**\n * Check if budget hard stop has been exceeded.\n */\n isBudgetExceeded(): boolean {\n return this.getSessionTotal() >= this.budgetConfig.budgetHardStop;\n }\n\n /**\n * Get formatted session summary.\n */\n getSummary(): string {\n const total = this.getSessionTotal();\n const tokens = this.getSessionTokens();\n return `${formatCost(total)} (${tokens.total.toLocaleString()} tokens)`;\n }\n\n /**\n * Get all cost entries (for export).\n */\n getEntries(): readonly ICostEntry[] {\n return this.entries;\n }\n\n /**\n * Reset cost tracking for a new session.\n */\n reset(): void {\n this.entries.length = 0;\n this.warningEmitted = false;\n }\n}\n","/**\n * Tool permission management per PRD section 14.4\n * Permission modes: strict, standard, permissive\n */\n\nimport type { PermissionMode, ToolCategory } from \"../types/index.js\";\nimport { logger } from \"../utils/index.js\";\nimport { isCommandBlocked } from \"../utils/index.js\";\n\n// Commands that ALWAYS require confirmation regardless of mode\nconst DANGEROUS_COMMANDS = [\n \"rm -rf\",\n \"git push --force\",\n \"git reset --hard\",\n \"git checkout .\",\n \"git clean -f\",\n \"git branch -D\",\n \"drop table\",\n \"drop database\",\n \"truncate\",\n \"format c:\",\n \"del /f /s /q\",\n] as const;\n\nexport interface IPermissionRequest {\n readonly toolName: string;\n readonly category: ToolCategory;\n readonly operation: string;\n readonly resource?: string;\n readonly command?: string;\n}\n\nexport interface IPermissionResult {\n readonly allowed: boolean;\n readonly reason?: string;\n readonly requiresUserApproval: boolean;\n}\n\nexport class PermissionManager {\n private mode: PermissionMode;\n private readonly allowedPaths: readonly string[];\n private readonly blockedCommands: readonly string[];\n private readonly approvedOperations = new Set<string>();\n\n constructor(\n mode: PermissionMode,\n allowedPaths: readonly string[],\n blockedCommands: readonly string[],\n ) {\n this.mode = mode;\n this.allowedPaths = allowedPaths;\n this.blockedCommands = blockedCommands;\n }\n\n /**\n * Check if an operation is permitted.\n */\n check(request: IPermissionRequest): IPermissionResult {\n // Always-blocked operations\n if (request.command && this.isDangerousCommand(request.command)) {\n return {\n allowed: false,\n reason: `Dangerous command detected: \"${request.command}\"`,\n requiresUserApproval: true,\n };\n }\n\n // Check against blocked commands list\n if (request.command && isCommandBlocked(request.command, this.blockedCommands)) {\n return {\n allowed: false,\n reason: `Command is on the blocked list`,\n requiresUserApproval: true,\n };\n }\n\n // Previously approved operations\n const opKey = this.getOperationKey(request);\n if (this.approvedOperations.has(opKey)) {\n return { allowed: true, requiresUserApproval: false };\n }\n\n // Mode-based permissions\n switch (this.mode) {\n case \"permissive\":\n return { allowed: true, requiresUserApproval: false };\n\n case \"standard\":\n return this.checkStandardMode(request);\n\n case \"strict\":\n return this.checkStrictMode(request);\n }\n }\n\n /**\n * Record that the user has approved an operation.\n */\n approve(request: IPermissionRequest): void {\n const opKey = this.getOperationKey(request);\n this.approvedOperations.add(opKey);\n logger.info({ operation: opKey }, \"Operation approved by user\");\n }\n\n /**\n * Update permission mode.\n */\n setMode(mode: PermissionMode): void {\n this.mode = mode;\n this.approvedOperations.clear();\n logger.info({ mode }, \"Permission mode changed\");\n }\n\n /**\n * Get current mode.\n */\n getMode(): PermissionMode {\n return this.mode;\n }\n\n private checkStandardMode(request: IPermissionRequest): IPermissionResult {\n // Read operations auto-approved in standard mode\n if (this.isReadOperation(request)) {\n return { allowed: true, requiresUserApproval: false };\n }\n\n // Write and shell operations require approval\n return {\n allowed: false,\n reason: `${request.operation} requires approval in standard mode`,\n requiresUserApproval: true,\n };\n }\n\n private checkStrictMode(request: IPermissionRequest): IPermissionResult {\n // Everything requires approval in strict mode\n return {\n allowed: false,\n reason: `${request.operation} requires approval in strict mode`,\n requiresUserApproval: true,\n };\n }\n\n private isReadOperation(request: IPermissionRequest): boolean {\n const readTools = [\"read\", \"glob\", \"grep\", \"web-search\", \"web-fetch\"];\n return readTools.includes(request.toolName);\n }\n\n private isDangerousCommand(command: string): boolean {\n const lower = command.toLowerCase().trim();\n return DANGEROUS_COMMANDS.some((dangerous) => lower.includes(dangerous));\n }\n\n private getOperationKey(request: IPermissionRequest): string {\n return `${request.toolName}:${request.operation}:${request.resource ?? \"\"}`;\n }\n}\n","/**\n * Agent team task coordination per PRD section 8\n * Manages task creation, assignment, dependency resolution, and completion tracking.\n */\n\nimport type { ITask, TaskStatus, ModelRole } from \"../types/index.js\";\nimport { logger } from \"../utils/index.js\";\nimport { getEventBus } from \"./event-bus.js\";\n\nlet nextTaskId = 1;\n\nfunction generateTaskId(): string {\n return String(nextTaskId++);\n}\n\nexport class TaskOrchestrator {\n private readonly tasks = new Map<string, ITask>();\n\n /**\n * Create a new task.\n */\n createTask(\n subject: string,\n description: string,\n options?: {\n owner?: string;\n model?: string;\n role?: ModelRole;\n blockedBy?: string[];\n },\n ): ITask {\n const id = generateTaskId();\n const now = new Date();\n\n const task: ITask = {\n id,\n subject,\n description,\n status: \"pending\",\n owner: options?.owner,\n model: options?.model,\n role: options?.role,\n blocks: [],\n blockedBy: options?.blockedBy ? [...options.blockedBy] : [],\n createdAt: now,\n updatedAt: now,\n };\n\n this.tasks.set(id, task);\n\n // Set up reverse blocking relationships\n if (options?.blockedBy) {\n for (const blockerId of options.blockedBy) {\n const blocker = this.tasks.get(blockerId);\n if (blocker && !blocker.blocks.includes(id)) {\n blocker.blocks.push(id);\n }\n }\n }\n\n getEventBus().emit(\"task:created\", { taskId: id, subject });\n logger.info({ taskId: id, subject }, \"Task created\");\n\n return task;\n }\n\n /**\n * Update task status.\n */\n updateStatus(taskId: string, status: TaskStatus): void {\n const task = this.getTask(taskId);\n task.status = status;\n task.updatedAt = new Date();\n\n getEventBus().emit(\"task:updated\", { taskId, status });\n\n if (status === \"completed\") {\n getEventBus().emit(\"task:completed\", { taskId });\n this.resolveBlockedTasks(taskId);\n }\n\n logger.info({ taskId, status }, \"Task status updated\");\n }\n\n /**\n * Assign a task to an agent.\n */\n assignTask(taskId: string, owner: string, model?: string): void {\n const task = this.getTask(taskId);\n task.owner = owner;\n if (model) {\n (task as { model?: string }).model = model;\n }\n task.updatedAt = new Date();\n logger.info({ taskId, owner, model }, \"Task assigned\");\n }\n\n /**\n * Get a task by ID. Throws if not found.\n */\n getTask(taskId: string): ITask {\n const task = this.tasks.get(taskId);\n if (!task) {\n throw new Error(`Task not found: ${taskId}`);\n }\n return task;\n }\n\n /**\n * Get all tasks.\n */\n getAllTasks(): readonly ITask[] {\n return [...this.tasks.values()];\n }\n\n /**\n * Get tasks by status.\n */\n getTasksByStatus(status: TaskStatus): readonly ITask[] {\n return [...this.tasks.values()].filter((t) => t.status === status);\n }\n\n /**\n * Get tasks assigned to an agent.\n */\n getTasksByOwner(owner: string): readonly ITask[] {\n return [...this.tasks.values()].filter((t) => t.owner === owner);\n }\n\n /**\n * Get tasks that are ready to be worked on (pending, not blocked).\n */\n getAvailableTasks(): readonly ITask[] {\n return [...this.tasks.values()].filter(\n (t) =>\n t.status === \"pending\" &&\n !t.owner &&\n t.blockedBy.every((blockerId) => {\n const blocker = this.tasks.get(blockerId);\n return blocker?.status === \"completed\";\n }),\n );\n }\n\n /**\n * Check if all tasks are completed.\n */\n isAllComplete(): boolean {\n return [...this.tasks.values()].every((t) => t.status === \"completed\");\n }\n\n /**\n * Get progress summary.\n */\n getProgress(): { total: number; completed: number; inProgress: number; pending: number; blocked: number } {\n const tasks = [...this.tasks.values()];\n return {\n total: tasks.length,\n completed: tasks.filter((t) => t.status === \"completed\").length,\n inProgress: tasks.filter((t) => t.status === \"in_progress\").length,\n pending: tasks.filter((t) => t.status === \"pending\").length,\n blocked: tasks.filter((t) => t.status === \"blocked\").length,\n };\n }\n\n /**\n * Delete a task.\n */\n deleteTask(taskId: string): void {\n const task = this.tasks.get(taskId);\n if (task) {\n // Remove from blockedBy references\n for (const [, otherTask] of this.tasks) {\n otherTask.blockedBy = otherTask.blockedBy.filter((id) => id !== taskId);\n otherTask.blocks = otherTask.blocks.filter((id) => id !== taskId);\n }\n this.tasks.delete(taskId);\n }\n }\n\n /**\n * When a task completes, check if any blocked tasks can now proceed.\n */\n private resolveBlockedTasks(completedTaskId: string): void {\n for (const [, task] of this.tasks) {\n if (task.status === \"blocked\" || task.status === \"pending\") {\n const allDepsComplete = task.blockedBy.every((depId) => {\n const dep = this.tasks.get(depId);\n return dep?.status === \"completed\";\n });\n\n if (allDepsComplete && task.status === \"blocked\") {\n task.status = \"pending\";\n task.updatedAt = new Date();\n logger.info(\n { taskId: task.id, unblockedBy: completedTaskId },\n \"Task unblocked\",\n );\n }\n }\n }\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/auth/session-manager.ts"],"names":[],"mappings":"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","file":"chunk-DMBPX3RG.js","sourcesContent":["/**\n * Multi-provider session lifecycle per PRD section 13.5\n * Resolution priority: native login (CLI delegation) > API key > env variable > credential helper\n *\n * Credentials are obtained by delegating to official CLI tools:\n * - Claude Code CLI → macOS Keychain\n * - Codex CLI → ~/.codex/auth.json\n * - Gemini CLI → ~/.gemini/oauth_creds.json\n * - Kimi CLI → ~/.kimi/credentials/kimi-code.json\n */\n\nimport type { ProviderName, ICredential, AuthMethod } from \"../types/index.js\";\nimport { AuthenticationError } from \"../types/index.js\";\nimport { CredentialStore } from \"./credential-store.js\";\nimport { ApiKeyFallback } from \"./api-key-fallback.js\";\nimport { logger } from \"../utils/index.js\";\n\nexport class SessionManager {\n private readonly credentialStore: CredentialStore;\n private readonly apiKeyFallback: ApiKeyFallback;\n\n constructor(store?: CredentialStore) {\n this.credentialStore = store ?? new CredentialStore();\n this.apiKeyFallback = new ApiKeyFallback(this.credentialStore);\n }\n\n /**\n * Get the best available credential for a provider.\n * Follows resolution priority from PRD section 13.5.\n */\n async getActiveCredential(provider: ProviderName): Promise<ICredential> {\n // 1. Native account session (delegated CLI login — stored in our credential store)\n const nativeCredential = await this.credentialStore.get(provider);\n if (nativeCredential && nativeCredential.method === \"native_login\" && !this.isExpired(nativeCredential)) {\n return nativeCredential;\n }\n\n // 1b. If expired, try re-reading from the official CLI's cached tokens\n if (nativeCredential && nativeCredential.method === \"native_login\" && this.isExpired(nativeCredential)) {\n const refreshed = await this.refreshFromCliCache(provider);\n if (refreshed) {\n return refreshed;\n }\n }\n\n // 1c. Even if no native credential stored, check CLI caches directly\n if (!nativeCredential || nativeCredential.method !== \"native_login\") {\n const fromCli = await this.refreshFromCliCache(provider);\n if (fromCli) {\n return fromCli;\n }\n }\n\n // 2. API key set via auth set-key\n const apiKeyCredential = await this.apiKeyFallback.getCredential(provider);\n if (apiKeyCredential) {\n return apiKeyCredential;\n }\n\n // 3. Environment variable\n const envCredential = this.getFromEnvironment(provider);\n if (envCredential) {\n return envCredential;\n }\n\n throw new AuthenticationError(provider, `No credentials found for ${provider}`);\n }\n\n /**\n * Check if a provider has any available credential.\n */\n async isAuthenticated(provider: ProviderName): Promise<boolean> {\n try {\n await this.getActiveCredential(provider);\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Get status info for a provider.\n */\n async getStatus(provider: ProviderName): Promise<{\n loggedIn: boolean;\n method?: AuthMethod | undefined;\n email?: string | undefined;\n plan?: string | undefined;\n }> {\n try {\n const credential = await this.getActiveCredential(provider);\n return {\n loggedIn: true,\n method: credential.method,\n ...(credential.email !== undefined ? { email: credential.email } : {}),\n ...(credential.plan !== undefined ? { plan: credential.plan } : {}),\n };\n } catch {\n return { loggedIn: false };\n }\n }\n\n /**\n * Get the API key or token string for a provider.\n */\n async getToken(provider: ProviderName): Promise<string> {\n const credential = await this.getActiveCredential(provider);\n if (!credential.token) {\n throw new AuthenticationError(provider, \"Credential has no token\");\n }\n return credential.token;\n }\n\n /**\n * Re-read tokens from the official CLI's cached storage.\n * This is the \"refresh\" mechanism — instead of doing HTTP refresh ourselves,\n * we re-read from the CLI tool's cache which may have been refreshed by the CLI.\n */\n private async refreshFromCliCache(provider: ProviderName): Promise<ICredential | undefined> {\n try {\n const loginModule = await this.loadLoginModule(provider);\n if (!loginModule) {\n return undefined;\n }\n\n // Prefer direct cached credential extraction from the provider login module.\n if (typeof loginModule.getCachedCredential === \"function\") {\n const cached = await loginModule.getCachedCredential();\n if (cached) {\n await this.credentialStore.set(provider, cached);\n if (!this.isExpired(cached) || cached.refreshToken !== undefined) {\n logger.info({ provider }, \"Loaded credentials from provider CLI cache\");\n return cached;\n }\n }\n }\n\n const status = await loginModule.getStatus();\n if (!status.loggedIn) {\n return undefined;\n }\n\n // The login module reads from the CLI's cache, check if we can get a fresh credential\n const isStillLoggedIn = await loginModule.isLoggedIn();\n if (!isStillLoggedIn) {\n return undefined;\n }\n\n // Re-read by checking the stored credential in our store\n // The login modules update the credential store when they find valid tokens\n const credential = await this.credentialStore.get(provider);\n if (credential && !this.isExpired(credential)) {\n logger.info({ provider }, \"Refreshed credentials from CLI cache\");\n return credential;\n }\n\n return undefined;\n } catch (error: unknown) {\n const msg = error instanceof Error ? error.message : String(error);\n logger.debug({ provider, error: msg }, \"Failed to refresh from CLI cache\");\n return undefined;\n }\n }\n\n private async loadLoginModule(provider: ProviderName): Promise<{\n getStatus(): Promise<{ loggedIn: boolean; email?: string | undefined; plan?: string | undefined }>;\n isLoggedIn(): Promise<boolean>;\n getCachedCredential?(): Promise<ICredential | undefined>;\n } | undefined> {\n try {\n switch (provider) {\n case \"anthropic\": {\n const mod = await import(\"./providers/claude-login.js\");\n return new mod.ClaudeLogin(this.credentialStore);\n }\n case \"openai\": {\n const mod = await import(\"./providers/codex-login.js\");\n return new mod.CodexLogin(this.credentialStore);\n }\n case \"google\": {\n const mod = await import(\"./providers/gemini-login.js\");\n return new mod.GeminiLogin(this.credentialStore);\n }\n case \"kimi\": {\n const mod = await import(\"./providers/kimi-login.js\");\n return new mod.KimiLogin(this.credentialStore);\n }\n default:\n return undefined;\n }\n } catch {\n return undefined;\n }\n }\n\n private isExpired(credential: ICredential): boolean {\n if (!credential.expiresAt) {\n return false;\n }\n return new Date() > credential.expiresAt;\n }\n\n private getFromEnvironment(provider: ProviderName): ICredential | undefined {\n const envMap: Record<ProviderName, string> = {\n anthropic: \"ANTHROPIC_API_KEY\",\n openai: \"OPENAI_API_KEY\",\n google: \"GOOGLE_API_KEY\",\n kimi: \"MOONSHOT_API_KEY\",\n ollama: \"\",\n };\n\n const envKey = envMap[provider];\n if (!envKey) {\n return undefined;\n }\n\n const token = process.env[envKey];\n if (!token) {\n return undefined;\n }\n\n return {\n provider,\n method: \"env_variable\",\n token,\n };\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/providers/ollama-adapter.ts"],"names":[],"mappings":"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","file":"chunk-H66O5Z2V.js","sourcesContent":["/**\n * Ollama adapter — custom HTTP for local models per PRD section 7.1\n * Uses OpenAI-compatible API format at localhost:11434.\n * Dynamic model listing from Ollama API.\n */\n\nimport { logger } from \"../utils/logger.js\";\nimport { ModelNotFoundError } from \"../types/errors.js\";\nimport { SUPPORTED_MODELS } from \"../types/model.js\";\nimport type { IModelInfo, ProviderName, ModelRole } from \"../types/model.js\";\nimport type {\n IChatRequest,\n IChatResponse,\n IChatMessage,\n IStreamChunk,\n IToolCall,\n IToolDefinition,\n ITokenUsage,\n} from \"../types/message.js\";\nimport type { IModelProvider, IProviderOptions } from \"./types.js\";\n\nconst PROVIDER_NAME: ProviderName = \"ollama\";\nconst DEFAULT_BASE_URL = \"http://localhost:11434\";\nconst CHARS_PER_TOKEN_ESTIMATE = 4;\n\ninterface OllamaListResponse { models: Array<{ name: string; size: number }> }\ninterface OpenAIMessage { role: string; content: string }\ninterface OpenAITool { type: \"function\"; function: { name: string; description: string; parameters: Record<string, unknown> } }\ninterface OllamaToolCallRef { id: string; type: string; function: { name: string; arguments: string } }\ninterface OllamaChoice {\n index: number;\n message: { role: string; content: string | null; tool_calls?: readonly OllamaToolCallRef[] };\n finish_reason: string;\n}\ninterface OllamaUsage { prompt_tokens: number; completion_tokens: number; total_tokens: number }\ninterface OllamaChatResponse { id: string; choices: OllamaChoice[]; usage?: OllamaUsage }\n\nfunction convertMessages(messages: readonly IChatMessage[]): OpenAIMessage[] {\n return messages.map((msg) => ({ role: msg.role, content: msg.content }));\n}\n\nfunction convertTools(tools: readonly IToolDefinition[] | undefined): OpenAITool[] | undefined {\n if (tools === undefined || tools.length === 0) {\n return undefined;\n }\n return tools.map((tool) => {\n const properties: Record<string, unknown> = {};\n const required: string[] = [];\n for (const param of tool.parameters) {\n properties[param.name] = { type: param.type, description: param.description };\n if (param.required) {\n required.push(param.name);\n }\n }\n return {\n type: \"function\" as const,\n function: {\n name: tool.name,\n description: tool.description,\n parameters: { type: \"object\", properties, required },\n },\n };\n });\n}\n\nfunction makeOllamaModelInfo(modelName: string): IModelInfo {\n return {\n id: modelName,\n name: modelName,\n provider: PROVIDER_NAME,\n contextWindow: 128_000,\n maxOutputTokens: 8_192,\n inputPricePerMToken: 0,\n outputPricePerMToken: 0,\n supportsStreaming: true,\n supportsToolCalling: true,\n supportedRoles: [\"coding\", \"bugfix\", \"testing\", \"documentation\"] as readonly ModelRole[],\n };\n}\n\nexport class OllamaAdapter implements IModelProvider {\n readonly name = PROVIDER_NAME;\n\n private readonly baseUrl: string;\n private cachedModels: string[] | undefined;\n\n constructor(options?: IProviderOptions) {\n this.baseUrl = options?.baseUrl ?? DEFAULT_BASE_URL;\n }\n\n get supportedModels(): readonly string[] {\n return this.cachedModels ?? [];\n }\n\n /**\n * Refresh available models from Ollama API.\n * Call once during initialization.\n */\n async refreshModels(): Promise<readonly string[]> {\n try {\n const response = await fetch(`${this.baseUrl}/api/tags`);\n if (!response.ok) {\n logger.warn({ status: response.status }, \"Failed to list Ollama models\");\n this.cachedModels = [];\n return [];\n }\n const data = (await response.json()) as OllamaListResponse;\n this.cachedModels = data.models.map((m) => m.name);\n logger.debug({ models: this.cachedModels }, \"Ollama models discovered\");\n return this.cachedModels;\n } catch (error: unknown) {\n const errMsg = error instanceof Error ? error.message : String(error);\n logger.warn({ error: errMsg }, \"Ollama not reachable\");\n this.cachedModels = [];\n return [];\n }\n }\n\n async chat(request: IChatRequest): Promise<IChatResponse> {\n const modelInfo = this.getModelInfo(request.model);\n const messages = convertMessages(request.messages);\n const tools = convertTools(request.tools);\n\n if (request.system !== undefined) {\n messages.unshift({ role: \"system\", content: request.system });\n }\n\n const body: Record<string, unknown> = {\n model: request.model,\n messages,\n stream: false,\n };\n if (request.maxTokens !== undefined) {\n body[\"max_tokens\"] = request.maxTokens;\n }\n if (request.temperature !== undefined) {\n body[\"temperature\"] = request.temperature;\n }\n if (tools !== undefined) {\n body[\"tools\"] = tools;\n }\n\n const response = await fetch(`${this.baseUrl}/v1/chat/completions`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`Ollama API error (${response.status}): ${text}`);\n }\n\n const data = (await response.json()) as OllamaChatResponse;\n const choice = data.choices[0];\n if (choice === undefined) {\n throw new Error(\"Ollama API returned empty choices\");\n }\n\n const toolCalls = extractToolCalls(choice);\n const inputTokens = data.usage?.prompt_tokens ?? 0;\n const outputTokens = data.usage?.completion_tokens ?? 0;\n\n const usage: ITokenUsage = {\n inputTokens,\n outputTokens,\n totalTokens: inputTokens + outputTokens,\n costUsd: 0,\n };\n\n const responseMessage: IChatMessage = {\n id: data.id,\n role: \"assistant\",\n content: choice.message.content ?? \"\",\n model: request.model,\n provider: PROVIDER_NAME,\n toolCalls: toolCalls.length > 0 ? toolCalls : undefined,\n tokenUsage: usage,\n createdAt: new Date(),\n };\n\n return {\n id: data.id,\n model: request.model,\n provider: PROVIDER_NAME,\n message: responseMessage,\n usage,\n finishReason: mapFinishReason(choice.finish_reason),\n };\n }\n\n async *stream(request: IChatRequest): AsyncIterable<IStreamChunk> {\n const modelInfo = this.getModelInfo(request.model);\n const messages = convertMessages(request.messages);\n const tools = convertTools(request.tools);\n\n if (request.system !== undefined) {\n messages.unshift({ role: \"system\", content: request.system });\n }\n\n const body: Record<string, unknown> = {\n model: request.model,\n messages,\n stream: true,\n };\n if (request.maxTokens !== undefined) {\n body[\"max_tokens\"] = request.maxTokens;\n }\n if (request.temperature !== undefined) {\n body[\"temperature\"] = request.temperature;\n }\n if (tools !== undefined) {\n body[\"tools\"] = tools;\n }\n\n const response = await fetch(`${this.baseUrl}/v1/chat/completions`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const text = await response.text();\n yield { type: \"error\", error: `Ollama API error (${response.status}): ${text}` };\n yield { type: \"done\" };\n return;\n }\n\n if (response.body === null) {\n yield { type: \"error\", error: \"Ollama returned empty stream body\" };\n yield { type: \"done\" };\n return;\n }\n\n try {\n yield* this.parseSSEStream(response.body, modelInfo);\n yield { type: \"done\" };\n } catch (error: unknown) {\n const errMsg = error instanceof Error ? error.message : String(error);\n logger.error({ error: errMsg, model: request.model }, \"Ollama stream error\");\n yield { type: \"error\", error: errMsg };\n yield { type: \"done\" };\n }\n }\n\n async countTokens(text: string, _model: string): Promise<number> {\n return Math.ceil(text.length / CHARS_PER_TOKEN_ESTIMATE);\n }\n\n getModelInfo(model: string): IModelInfo {\n const staticInfo = SUPPORTED_MODELS[model];\n if (staticInfo !== undefined && staticInfo.provider === PROVIDER_NAME) {\n return staticInfo;\n }\n if (this.cachedModels !== undefined && this.cachedModels.includes(model)) {\n return makeOllamaModelInfo(model);\n }\n return makeOllamaModelInfo(model);\n }\n\n async listAvailableModels(): Promise<readonly string[]> {\n const models = await this.refreshModels();\n return models;\n }\n\n private async *parseSSEStream(\n body: ReadableStream<Uint8Array>,\n _modelInfo: IModelInfo,\n ): AsyncIterable<IStreamChunk> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed === \"\" || trimmed === \"data: [DONE]\") {\n continue;\n }\n if (!trimmed.startsWith(\"data: \")) {\n continue;\n }\n\n const jsonStr = trimmed.slice(6);\n let parsed: {\n choices?: Array<{\n delta?: {\n content?: string;\n tool_calls?: Array<{\n id?: string;\n function?: { name?: string; arguments?: string };\n }>;\n };\n }>;\n usage?: OllamaUsage;\n };\n\n try {\n parsed = JSON.parse(jsonStr) as typeof parsed;\n } catch {\n continue;\n }\n\n const delta = parsed.choices?.[0]?.delta;\n if (delta?.content !== undefined && delta.content !== \"\") {\n yield { type: \"text\", content: delta.content };\n }\n\n if (delta?.tool_calls !== undefined) {\n for (const tc of delta.tool_calls) {\n if (tc.id !== undefined && tc.function?.name !== undefined) {\n let args: Record<string, unknown> = {};\n if (tc.function.arguments !== undefined) {\n try {\n args = JSON.parse(tc.function.arguments) as Record<string, unknown>;\n } catch {\n args = {};\n }\n }\n yield {\n type: \"tool_call\",\n toolCall: { id: tc.id, name: tc.function.name, arguments: args },\n };\n }\n }\n }\n\n if (parsed.usage !== undefined) {\n yield {\n type: \"usage\",\n usage: {\n inputTokens: parsed.usage.prompt_tokens,\n outputTokens: parsed.usage.completion_tokens,\n totalTokens: parsed.usage.total_tokens,\n costUsd: 0,\n },\n };\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n}\n\nfunction extractToolCalls(choice: OllamaChoice): IToolCall[] {\n if (choice.message.tool_calls === undefined || choice.message.tool_calls.length === 0) {\n return [];\n }\n return choice.message.tool_calls.map((tc) => {\n let args: Record<string, unknown> = {};\n try {\n args = JSON.parse(tc.function.arguments) as Record<string, unknown>;\n } catch {\n args = {};\n }\n return { id: tc.id, name: tc.function.name, arguments: args };\n });\n}\n\nfunction mapFinishReason(\n reason: string,\n): \"stop\" | \"tool_calls\" | \"max_tokens\" | \"error\" {\n switch (reason) {\n case \"stop\":\n return \"stop\";\n case \"tool_calls\":\n return \"tool_calls\";\n case \"length\":\n return \"max_tokens\";\n default:\n return \"stop\";\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types/model.ts"],"names":[],"mappings":"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","file":"chunk-HCIHOHLX.js","sourcesContent":["/**\n * Model-related types per PRD sections 7.1-7.5\n */\n\n// ── Provider Identifiers ─────────────────────────────────────────────────\n\nexport type ProviderName = \"anthropic\" | \"openai\" | \"google\" | \"kimi\" | \"ollama\";\n\n// ── Model Roles (PRD section 7.2) ───────────────────────────────────────\n\nexport type ModelRole =\n | \"planning\"\n | \"coding\"\n | \"review\"\n | \"testing\"\n | \"bugfix\"\n | \"documentation\";\n\n// ── Provider-specific Thinking / Reasoning Configuration ─────────────────\n\nexport interface IThinkingOption {\n readonly value: string;\n readonly label: string;\n readonly description: string;\n}\n\nexport interface IProviderThinkingConfig {\n readonly method: string;\n readonly options: readonly IThinkingOption[];\n readonly defaultValue: string;\n}\n\n/**\n * Provider-specific thinking configurations.\n *\n * Anthropic → Extended Thinking (budget_tokens: 1024–model max)\n * OpenAI → Reasoning Effort (low | medium | high)\n * Google 2.5 → Thinking Budget (0–24576, -1 = dynamic)\n * Google 3 → Thinking Level (minimal | low | medium | high)\n * Kimi → Thinking Mode (enabled | disabled)\n */\nexport const PROVIDER_THINKING_CONFIGS: Readonly<Record<string, IProviderThinkingConfig>> = {\n anthropic: {\n method: \"extended_thinking\",\n options: [\n { value: \"off\", label: \"Off\", description: \"No extended thinking\" },\n { value: \"low\", label: \"Low (1K tokens)\", description: \"budget_tokens: 1024\" },\n { value: \"medium\", label: \"Medium (8K tokens)\", description: \"budget_tokens: 8192\" },\n { value: \"high\", label: \"High (16K tokens)\", description: \"budget_tokens: 16384\" },\n { value: \"max\", label: \"Max (model limit)\", description: \"budget_tokens: max_output_tokens\" },\n ],\n defaultValue: \"medium\",\n },\n openai: {\n method: \"reasoning_effort\",\n options: [\n { value: \"low\", label: \"Low\", description: \"Fewer reasoning tokens, faster\" },\n { value: \"medium\", label: \"Medium\", description: \"Balanced reasoning (default)\" },\n { value: \"high\", label: \"High\", description: \"Thorough reasoning, more tokens\" },\n ],\n defaultValue: \"medium\",\n },\n \"google:gemini-2.5\": {\n method: \"thinking_budget\",\n options: [\n { value: \"off\", label: \"Off\", description: \"Disable thinking (budget: 0)\" },\n { value: \"dynamic\", label: \"Dynamic\", description: \"Auto-adjust based on complexity (budget: -1)\" },\n { value: \"low\", label: \"Low (4K tokens)\", description: \"thinkingBudget: 4096\" },\n { value: \"medium\", label: \"Medium (12K tokens)\", description: \"thinkingBudget: 12288\" },\n { value: \"high\", label: \"High (24K tokens)\", description: \"thinkingBudget: 24576\" },\n ],\n defaultValue: \"dynamic\",\n },\n \"google:gemini-3\": {\n method: \"thinking_level\",\n options: [\n { value: \"minimal\", label: \"Minimal\", description: \"Minimal thinking\" },\n { value: \"low\", label: \"Low\", description: \"Light thinking\" },\n { value: \"medium\", label: \"Medium\", description: \"Balanced thinking\" },\n { value: \"high\", label: \"High\", description: \"Deep thinking\" },\n ],\n defaultValue: \"medium\",\n },\n kimi: {\n method: \"thinking_mode\",\n options: [\n { value: \"enabled\", label: \"Enabled\", description: \"Include reasoning traces\" },\n { value: \"disabled\", label: \"Disabled\", description: \"Direct responses only\" },\n ],\n defaultValue: \"enabled\",\n },\n};\n\n/**\n * Look up the thinking configuration for a specific model.\n * Handles Google's model-family split (Gemini 2.5 vs Gemini 3).\n */\nexport function getThinkingConfigForModel(modelId: string): IProviderThinkingConfig | undefined {\n const modelInfo = SUPPORTED_MODELS[modelId];\n if (modelInfo === undefined) return undefined;\n\n if (modelInfo.provider === \"google\") {\n if (modelId.startsWith(\"gemini-3\")) {\n return PROVIDER_THINKING_CONFIGS[\"google:gemini-3\"];\n }\n return PROVIDER_THINKING_CONFIGS[\"google:gemini-2.5\"];\n }\n\n return PROVIDER_THINKING_CONFIGS[modelInfo.provider];\n}\n\n// ── Model Information ────────────────────────────────────────────────────\n\nexport interface IModelInfo {\n readonly id: string;\n readonly name: string;\n readonly provider: ProviderName;\n readonly contextWindow: number;\n readonly maxOutputTokens: number;\n readonly inputPricePerMToken: number;\n readonly outputPricePerMToken: number;\n readonly supportsStreaming: boolean;\n readonly supportsToolCalling: boolean;\n readonly supportedRoles: readonly ModelRole[];\n readonly description?: string | undefined;\n}\n\n// ── Model Display Entry (for /model selection UI) ────────────────────────\n\nexport interface IModelDisplayEntry {\n readonly id: string;\n readonly label: string;\n readonly description: string;\n readonly isDefault?: boolean | undefined;\n}\n\n// ── Role Configuration (PRD section 7.2) ─────────────────────────────────\n\nexport interface IRoleConfig {\n readonly primary: string;\n readonly fallback: readonly string[];\n}\n\n// ── Model Router Resolution (PRD section 7.2) ────────────────────────────\n\nexport type ModelResolutionSource =\n | \"user_override\"\n | \"role_config\"\n | \"fallback_chain\"\n | \"system_default\";\n\nexport interface IModelResolution {\n readonly modelId: string;\n readonly provider: ProviderName;\n readonly source: ModelResolutionSource;\n readonly role?: ModelRole | undefined;\n}\n\n// ── Token Usage ──────────────────────────────────────────────────────────\n\nexport interface ITokenUsage {\n readonly inputTokens: number;\n readonly outputTokens: number;\n readonly totalTokens: number;\n readonly costUsd: number;\n}\n\n// ── Supported Models Registry (PRD section 7.3) ─────────────────────────\n\nexport const SUPPORTED_MODELS: Record<string, IModelInfo> = {\n // ── Anthropic / Claude ─────────────────────────────────────────────────\n \"claude-opus-4-6\": {\n id: \"claude-opus-4-6\",\n name: \"Claude Opus 4.6\",\n provider: \"anthropic\",\n contextWindow: 200_000,\n maxOutputTokens: 32_000,\n inputPricePerMToken: 15,\n outputPricePerMToken: 75,\n supportsStreaming: true,\n supportsToolCalling: true,\n supportedRoles: [\"planning\", \"review\", \"bugfix\", \"coding\"],\n description: \"Most capable for complex work\",\n },\n \"claude-opus-4-6-1m\": {\n id: \"claude-opus-4-6-1m\",\n name: \"Claude Opus 4.6 (1M context)\",\n provider: \"anthropic\",\n contextWindow: 1_000_000,\n maxOutputTokens: 32_000,\n inputPricePerMToken: 10,\n outputPricePerMToken: 37.5,\n supportsStreaming: true,\n supportsToolCalling: true,\n supportedRoles: [\"planning\", \"review\", \"bugfix\", \"coding\"],\n description: \"Opus 4.6 with 1M context\",\n },\n \"claude-sonnet-4-6\": {\n id: \"claude-sonnet-4-6\",\n name: \"Claude Sonnet 4.6\",\n provider: \"anthropic\",\n contextWindow: 200_000,\n maxOutputTokens: 16_000,\n inputPricePerMToken: 3,\n outputPricePerMToken: 15,\n supportsStreaming: true,\n supportsToolCalling: true,\n supportedRoles: [\"coding\", \"bugfix\", \"documentation\", \"review\"],\n description: \"Best for everyday tasks\",\n },\n \"claude-sonnet-4-6-1m\": {\n id: \"claude-sonnet-4-6-1m\",\n name: \"Claude Sonnet 4.6 (1M context)\",\n provider: \"anthropic\",\n contextWindow: 1_000_000,\n maxOutputTokens: 16_000,\n inputPricePerMToken: 6,\n outputPricePerMToken: 22.5,\n supportsStreaming: true,\n supportsToolCalling: true,\n supportedRoles: [\"coding\", \"bugfix\", \"documentation\", \"review\"],\n description: \"Sonnet 4.6 with 1M context\",\n },\n \"claude-haiku-4-5\": {\n id: \"claude-haiku-4-5\",\n name: \"Claude Haiku 4.5\",\n provider: \"anthropic\",\n contextWindow: 200_000,\n maxOutputTokens: 8_192,\n inputPricePerMToken: 0.8,\n outputPricePerMToken: 4,\n supportsStreaming: true,\n supportsToolCalling: true,\n supportedRoles: [\"testing\", \"documentation\"],\n description: \"Fastest for quick answers\",\n },\n\n // ── OpenAI / Codex ─────────────────────────────────────────────────────\n \"gpt-5.3-codex\": {\n id: \"gpt-5.3-codex\",\n name: \"GPT-5.3 Codex\",\n provider: \"openai\",\n contextWindow: 256_000,\n maxOutputTokens: 32_000,\n inputPricePerMToken: 2.5,\n outputPricePerMToken: 10,\n supportsStreaming: true,\n supportsToolCalling: true,\n supportedRoles: [\"planning\", \"coding\", \"review\", \"bugfix\"],\n description: \"Latest frontier agentic coding model\",\n },\n \"gpt-5.3-codex-spark\": {\n id: \"gpt-5.3-codex-spark\",\n name: \"GPT-5.3 Codex Spark\",\n provider: \"openai\",\n contextWindow: 256_000,\n maxOutputTokens: 16_384,\n inputPricePerMToken: 0.15,\n outputPricePerMToken: 0.6,\n supportsStreaming: true,\n supportsToolCalling: true,\n supportedRoles: [\"coding\", \"testing\", \"documentation\"],\n description: \"Ultra-fast coding model\",\n },\n \"gpt-5.2-codex\": {\n id: \"gpt-5.2-codex\",\n name: \"GPT-5.2 Codex\",\n provider: \"openai\",\n contextWindow: 256_000,\n maxOutputTokens: 32_000,\n inputPricePerMToken: 2.5,\n outputPricePerMToken: 10,\n supportsStreaming: true,\n supportsToolCalling: true,\n supportedRoles: [\"planning\", \"coding\", \"review\", \"bugfix\"],\n description: \"Frontier agentic coding model\",\n },\n \"gpt-5.1-codex-max\": {\n id: \"gpt-5.1-codex-max\",\n name: \"GPT-5.1 Codex Max\",\n provider: \"openai\",\n contextWindow: 256_000,\n maxOutputTokens: 100_000,\n inputPricePerMToken: 10,\n outputPricePerMToken: 40,\n supportsStreaming: true,\n supportsToolCalling: true,\n supportedRoles: [\"planning\", \"review\", \"coding\"],\n description: \"Codex-optimized flagship for deep and fast reasoning\",\n },\n \"gpt-5.2\": {\n id: \"gpt-5.2\",\n name: \"GPT-5.2\",\n provider: \"openai\",\n contextWindow: 256_000,\n maxOutputTokens: 32_000,\n inputPricePerMToken: 2.5,\n outputPricePerMToken: 10,\n supportsStreaming: true,\n supportsToolCalling: true,\n supportedRoles: [\"planning\", \"coding\", \"review\", \"bugfix\"],\n description: \"Latest frontier model with improvements across knowledge, reasoning and coding\",\n },\n \"gpt-5.1-codex-mini\": {\n id: \"gpt-5.1-codex-mini\",\n name: \"GPT-5.1 Codex Mini\",\n provider: \"openai\",\n contextWindow: 256_000,\n maxOutputTokens: 16_384,\n inputPricePerMToken: 0.15,\n outputPricePerMToken: 0.6,\n supportsStreaming: true,\n supportsToolCalling: true,\n supportedRoles: [\"testing\", \"documentation\", \"coding\"],\n description: \"Optimized for codex. Cheaper, faster, but less capable\",\n },\n\n // ── Google / Gemini ────────────────────────────────────────────────────\n \"gemini-3-pro-preview\": {\n id: \"gemini-3-pro-preview\",\n name: \"Gemini 3 Pro Preview\",\n provider: \"google\",\n contextWindow: 2_000_000,\n maxOutputTokens: 65_536,\n inputPricePerMToken: 1.25,\n outputPricePerMToken: 10,\n supportsStreaming: true,\n supportsToolCalling: true,\n supportedRoles: [\"planning\", \"review\", \"coding\"],\n description: \"Next-gen Gemini Pro preview\",\n },\n \"gemini-3-flash-preview\": {\n id: \"gemini-3-flash-preview\",\n name: \"Gemini 3 Flash Preview\",\n provider: \"google\",\n contextWindow: 2_000_000,\n maxOutputTokens: 65_536,\n inputPricePerMToken: 0.15,\n outputPricePerMToken: 0.6,\n supportsStreaming: true,\n supportsToolCalling: true,\n supportedRoles: [\"coding\", \"testing\", \"documentation\"],\n description: \"Next-gen Gemini Flash preview\",\n },\n \"gemini-2.5-pro\": {\n id: \"gemini-2.5-pro\",\n name: \"Gemini 2.5 Pro\",\n provider: \"google\",\n contextWindow: 2_000_000,\n maxOutputTokens: 65_536,\n inputPricePerMToken: 1.25,\n outputPricePerMToken: 10,\n supportsStreaming: true,\n supportsToolCalling: true,\n supportedRoles: [\"planning\", \"review\", \"coding\"],\n description: \"Gemini 2.5 Pro stable\",\n },\n \"gemini-2.5-flash\": {\n id: \"gemini-2.5-flash\",\n name: \"Gemini 2.5 Flash\",\n provider: \"google\",\n contextWindow: 2_000_000,\n maxOutputTokens: 65_536,\n inputPricePerMToken: 0.15,\n outputPricePerMToken: 0.6,\n supportsStreaming: true,\n supportsToolCalling: true,\n supportedRoles: [\"testing\", \"documentation\", \"coding\"],\n description: \"Gemini 2.5 Flash stable\",\n },\n \"gemini-2.5-flash-lite\": {\n id: \"gemini-2.5-flash-lite\",\n name: \"Gemini 2.5 Flash Lite\",\n provider: \"google\",\n contextWindow: 1_000_000,\n maxOutputTokens: 32_768,\n inputPricePerMToken: 0.075,\n outputPricePerMToken: 0.3,\n supportsStreaming: true,\n supportsToolCalling: true,\n supportedRoles: [\"testing\", \"documentation\"],\n description: \"Gemini 2.5 Flash Lite\",\n },\n\n // ── Moonshot / Kimi ────────────────────────────────────────────────────\n \"kimi-for-coding\": {\n id: \"kimi-for-coding\",\n name: \"Kimi Code\",\n provider: \"kimi\",\n contextWindow: 128_000,\n maxOutputTokens: 8_192,\n inputPricePerMToken: 0.5,\n outputPricePerMToken: 2,\n supportsStreaming: true,\n supportsToolCalling: true,\n supportedRoles: [\"coding\", \"bugfix\"],\n description: \"Kimi for coding\",\n },\n};\n\n// ── Ordered Model Lists Per Provider (for /model selection UI) ───────────\n\nexport const PROVIDER_MODEL_ORDER: Readonly<Record<string, readonly IModelDisplayEntry[]>> = {\n anthropic: [\n { id: \"claude-opus-4-6\", label: \"Default (recommended)\", description: \"Opus 4.6 · Most capable for complex work\", isDefault: true },\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\" },\n { id: \"claude-sonnet-4-6\", label: \"Sonnet\", description: \"Sonnet 4.6 · Best for everyday tasks\" },\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\" },\n { id: \"claude-haiku-4-5\", label: \"Haiku\", description: \"Haiku 4.5 · Fastest for quick answers\" },\n ],\n openai: [\n { id: \"gpt-5.3-codex\", label: \"gpt-5.3-codex\", description: \"Latest frontier agentic coding model\", isDefault: true },\n { id: \"gpt-5.3-codex-spark\", label: \"gpt-5.3-codex-spark\", description: \"Ultra-fast coding model\" },\n { id: \"gpt-5.2-codex\", label: \"gpt-5.2-codex\", description: \"Frontier agentic coding model\" },\n { id: \"gpt-5.1-codex-max\", label: \"gpt-5.1-codex-max\", description: \"Codex-optimized flagship for deep and fast reasoning\" },\n { id: \"gpt-5.2\", label: \"gpt-5.2\", description: \"Latest frontier model with improvements across knowledge, reasoning and coding\" },\n { id: \"gpt-5.1-codex-mini\", label: \"gpt-5.1-codex-mini\", description: \"Optimized for codex. Cheaper, faster, but less capable\" },\n ],\n google: [\n { id: \"gemini-3-pro-preview\", label: \"gemini-3-pro-preview\", description: \"Next-gen Gemini Pro preview\", isDefault: true },\n { id: \"gemini-3-flash-preview\", label: \"gemini-3-flash-preview\", description: \"Next-gen Gemini Flash preview\" },\n { id: \"gemini-2.5-pro\", label: \"gemini-2.5-pro\", description: \"Gemini 2.5 Pro stable\" },\n { id: \"gemini-2.5-flash\", label: \"gemini-2.5-flash\", description: \"Gemini 2.5 Flash stable\" },\n { id: \"gemini-2.5-flash-lite\", label: \"gemini-2.5-flash-lite\", description: \"Gemini 2.5 Flash Lite\" },\n ],\n kimi: [\n { id: \"kimi-for-coding\", label: \"kimi-for-coding (Kimi Code)\", description: \"Kimi for coding\", isDefault: true },\n ],\n};\n\nexport const DEFAULT_MODEL_ID = \"claude-sonnet-4-6\";\n"]}
|