aemeathcli 1.0.11 → 1.0.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (218) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +620 -609
  3. package/dist/{App-YAHJUWCX.js → App-JQ622M66.js} +209 -52
  4. package/dist/App-JQ622M66.js.map +1 -0
  5. package/dist/agent-store/architect.md +32 -32
  6. package/dist/agent-store/debugger.md +32 -32
  7. package/dist/agent-store/developer.md +29 -29
  8. package/dist/agent-store/documenter.md +30 -30
  9. package/dist/agent-store/researcher.md +31 -31
  10. package/dist/agent-store/reviewer.md +28 -28
  11. package/dist/agent-store/supervisor.md +37 -37
  12. package/dist/agent-store/tester.md +30 -30
  13. package/dist/api-key-fallback-RJLPM3KH.js +11 -0
  14. package/dist/{api-key-fallback-UN3TJEOO.js.map → api-key-fallback-RJLPM3KH.js.map} +1 -1
  15. package/dist/auth-status-JQJOKUPF.js +13 -0
  16. package/dist/{auth-status-EIM5A5KL.js.map → auth-status-JQJOKUPF.js.map} +1 -1
  17. package/dist/{chunk-P66WDACW.js → chunk-2KMA5RBC.js} +18 -42
  18. package/dist/chunk-2KMA5RBC.js.map +1 -0
  19. package/dist/{chunk-2GKOK6T7.js → chunk-2Y7TR6BS.js} +2 -2
  20. package/dist/chunk-2Y7TR6BS.js.map +1 -0
  21. package/dist/{chunk-ONQ4WCUI.js → chunk-2ZYK5IJG.js} +6 -6
  22. package/dist/chunk-2ZYK5IJG.js.map +1 -0
  23. package/dist/{chunk-OCJPQFOR.js → chunk-36RXCZOV.js} +4 -4
  24. package/dist/chunk-36RXCZOV.js.map +1 -0
  25. package/dist/{chunk-H2SYKIMI.js → chunk-7EBLXPL4.js} +10 -10
  26. package/dist/chunk-7EBLXPL4.js.map +1 -0
  27. package/dist/{chunk-IARA5XYP.js → chunk-BIMQL4AG.js} +4 -4
  28. package/dist/chunk-BIMQL4AG.js.map +1 -0
  29. package/dist/{chunk-BY4DAKUU.js → chunk-D275MCIH.js} +2 -2
  30. package/dist/chunk-D275MCIH.js.map +1 -0
  31. package/dist/{chunk-SOQFMNQC.js → chunk-FFS4T7BZ.js} +5 -5
  32. package/dist/chunk-FFS4T7BZ.js.map +1 -0
  33. package/dist/{chunk-LDVY5ELP.js → chunk-GXAJGP2T.js} +5 -5
  34. package/dist/chunk-GXAJGP2T.js.map +1 -0
  35. package/dist/{chunk-62HSGYQD.js → chunk-HCIHOHLX.js} +2 -2
  36. package/dist/chunk-HCIHOHLX.js.map +1 -0
  37. package/dist/{chunk-6GUD7QIM.js → chunk-HESQLCLU.js} +4 -4
  38. package/dist/chunk-HESQLCLU.js.map +1 -0
  39. package/dist/{chunk-HEKFAKVH.js → chunk-IR5HLBMH.js} +2 -2
  40. package/dist/chunk-IR5HLBMH.js.map +1 -0
  41. package/dist/{chunk-2LF7ALGR.js → chunk-K2FCMRXH.js} +4 -4
  42. package/dist/chunk-K2FCMRXH.js.map +1 -0
  43. package/dist/{chunk-2NWNIKBK.js → chunk-KIC7UI5U.js} +4 -4
  44. package/dist/chunk-KIC7UI5U.js.map +1 -0
  45. package/dist/{chunk-YPFOE2QJ.js → chunk-KMOAJRDE.js} +5 -5
  46. package/dist/chunk-KMOAJRDE.js.map +1 -0
  47. package/dist/{chunk-RP2TAL3J.js → chunk-LQBALETG.js} +2 -2
  48. package/dist/chunk-LQBALETG.js.map +1 -0
  49. package/dist/{chunk-CC7MGWYY.js → chunk-M3FPQSRU.js} +2 -2
  50. package/dist/chunk-M3FPQSRU.js.map +1 -0
  51. package/dist/{chunk-3TSPZRGM.js → chunk-NQEUK763.js} +3 -3
  52. package/dist/chunk-NQEUK763.js.map +1 -0
  53. package/dist/{chunk-VBLLDY4R.js → chunk-OPWAFS6Y.js} +2 -2
  54. package/dist/chunk-OPWAFS6Y.js.map +1 -0
  55. package/dist/{chunk-RYOB3TLZ.js → chunk-PS4WEFW6.js} +6 -6
  56. package/dist/chunk-PS4WEFW6.js.map +1 -0
  57. package/dist/{chunk-LCYH4T6N.js → chunk-QK7TKNHV.js} +6 -6
  58. package/dist/chunk-QK7TKNHV.js.map +1 -0
  59. package/dist/{chunk-QCRK4QEL.js → chunk-RADJSEG5.js} +3 -3
  60. package/dist/chunk-RADJSEG5.js.map +1 -0
  61. package/dist/{chunk-AQ23TYSQ.js → chunk-SNWPI6XJ.js} +4 -4
  62. package/dist/chunk-SNWPI6XJ.js.map +1 -0
  63. package/dist/{chunk-TDFTX32B.js → chunk-UM7MSLOV.js} +4 -4
  64. package/dist/chunk-UM7MSLOV.js.map +1 -0
  65. package/dist/{chunk-FIC7AK4Q.js → chunk-VNZ3YTQD.js} +5 -5
  66. package/dist/chunk-VNZ3YTQD.js.map +1 -0
  67. package/dist/{chunk-5XFSV6PF.js → chunk-WXIN65UG.js} +6 -6
  68. package/dist/chunk-WXIN65UG.js.map +1 -0
  69. package/dist/{chunk-WC72BRHR.js → chunk-XEXWX7C7.js} +3 -3
  70. package/dist/chunk-XEXWX7C7.js.map +1 -0
  71. package/dist/{chunk-VJNQJALF.js → chunk-YCCYXDW7.js} +4 -4
  72. package/dist/chunk-YCCYXDW7.js.map +1 -0
  73. package/dist/{chunk-ROJPFPJ7.js → chunk-YL5XFHR3.js} +2 -2
  74. package/dist/chunk-YL5XFHR3.js.map +1 -0
  75. package/dist/{chunk-GU33WKPG.js → chunk-YPQ2MLAV.js} +5 -5
  76. package/dist/chunk-YPQ2MLAV.js.map +1 -0
  77. package/dist/{chunk-WAYSJMPS.js → chunk-ZCOVMVK4.js} +2 -2
  78. package/dist/chunk-ZCOVMVK4.js.map +1 -0
  79. package/dist/{chunk-473JN6M5.js → chunk-ZGOHARPV.js} +2 -2
  80. package/dist/chunk-ZGOHARPV.js.map +1 -0
  81. package/dist/{claude-login-IS5WTBMP.js → claude-login-AIFIWTYF.js} +10 -10
  82. package/dist/claude-login-AIFIWTYF.js.map +1 -0
  83. package/dist/cli.js +30 -30
  84. package/dist/cli.js.map +1 -1
  85. package/dist/{codex-login-GMPF64MR.js → codex-login-LW5X7GAM.js} +10 -10
  86. package/dist/codex-login-LW5X7GAM.js.map +1 -0
  87. package/dist/config-store-NF56VHFU.js +7 -0
  88. package/dist/{config-store-POB6I37G.js.map → config-store-NF56VHFU.js.map} +1 -1
  89. package/dist/conversation-store-7GRDQZD2.js +4 -0
  90. package/dist/{conversation-store-PRBHWQMJ.js.map → conversation-store-7GRDQZD2.js.map} +1 -1
  91. package/dist/detect-providers-QICJ5U3R.js +4 -0
  92. package/dist/{detect-providers-C4SVQHFF.js.map → detect-providers-QICJ5U3R.js.map} +1 -1
  93. package/dist/executor-FTABX2AW.js +4 -0
  94. package/dist/{executor-RUX7VK3T.js.map → executor-FTABX2AW.js.map} +1 -1
  95. package/dist/{first-run-GDEVRFPO.js → first-run-ADROZVYF.js} +13 -13
  96. package/dist/first-run-ADROZVYF.js.map +1 -0
  97. package/dist/{gemini-login-KE224MSW.js → gemini-login-TST454MX.js} +10 -10
  98. package/dist/gemini-login-TST454MX.js.map +1 -0
  99. package/dist/index.d.ts +2 -56
  100. package/dist/index.js +30 -34
  101. package/dist/index.js.map +1 -1
  102. package/dist/{input-history-MIOO3FIW.js → input-history-BEICE7PT.js} +3 -3
  103. package/dist/input-history-BEICE7PT.js.map +1 -0
  104. package/dist/kimi-adapter-7FYOAKOI.js +6 -0
  105. package/dist/{kimi-adapter-UODMNX6K.js.map → kimi-adapter-7FYOAKOI.js.map} +1 -1
  106. package/dist/{kimi-login-DNT5YBKX.js → kimi-login-3IGVOBJI.js} +10 -10
  107. package/dist/kimi-login-3IGVOBJI.js.map +1 -0
  108. package/dist/logger-KGHUQ4VE.js +3 -0
  109. package/dist/{logger-PLPDWACQ.js.map → logger-KGHUQ4VE.js.map} +1 -1
  110. package/dist/model-discovery-AAJDHRFO.js +6 -0
  111. package/dist/{model-discovery-O64ZWPX5.js.map → model-discovery-AAJDHRFO.js.map} +1 -1
  112. package/dist/native-cli-adapters-CLONTZOA.js +8 -0
  113. package/dist/{native-cli-adapters-JMZX2C2C.js.map → native-cli-adapters-CLONTZOA.js.map} +1 -1
  114. package/dist/ollama-adapter-2N5OQIEV.js +5 -0
  115. package/dist/{ollama-adapter-GE67BNSS.js.map → ollama-adapter-2N5OQIEV.js.map} +1 -1
  116. package/dist/{pathResolver-A6IXQQFE.js → pathResolver-UVAB2FCW.js} +3 -3
  117. package/dist/{pathResolver-A6IXQQFE.js.map → pathResolver-UVAB2FCW.js.map} +1 -1
  118. package/dist/{profile-loader-TNAXBLDX.js → profile-loader-EMLV4J7S.js} +4 -4
  119. package/dist/profile-loader-EMLV4J7S.js.map +1 -0
  120. package/dist/registry-LRURZVUL.js +5 -0
  121. package/dist/{registry-3NHVCXCZ.js.map → registry-LRURZVUL.js.map} +1 -1
  122. package/dist/registry-MVNSXCEF.js +6 -0
  123. package/dist/{registry-7CQ3NCAD.js.map → registry-MVNSXCEF.js.map} +1 -1
  124. package/dist/server-manager-THGZBBZB.js +5 -0
  125. package/dist/{server-manager-DES23IBQ.js.map → server-manager-THGZBBZB.js.map} +1 -1
  126. package/dist/session-manager-X3DXT53M.js +12 -0
  127. package/dist/{session-manager-EHD7GWM2.js.map → session-manager-X3DXT53M.js.map} +1 -1
  128. package/dist/skills/built-in/code-review/SKILL.md +85 -85
  129. package/dist/skills/built-in/commit/SKILL.md +83 -83
  130. package/dist/skills/built-in/debug/SKILL.md +119 -119
  131. package/dist/skills/built-in/plan/SKILL.md +123 -123
  132. package/dist/skills/built-in/refactor/SKILL.md +132 -132
  133. package/dist/skills/built-in/test/SKILL.md +128 -128
  134. package/dist/sqlite-store-7OECRTXM.js +5 -0
  135. package/dist/{sqlite-store-7ZIVOUNI.js.map → sqlite-store-7OECRTXM.js.map} +1 -1
  136. package/dist/team-manager-2VSMALAA.js +11 -0
  137. package/dist/{team-manager-6DCNLGTC.js.map → team-manager-2VSMALAA.js.map} +1 -1
  138. package/dist/team-state-HZNVMQHT.js +3 -0
  139. package/dist/{team-state-R2D7DT5M.js.map → team-state-HZNVMQHT.js.map} +1 -1
  140. package/dist/tmux-manager-57QCUVHU.js +6 -0
  141. package/dist/{tmux-manager-WBKHUHDT.js.map → tmux-manager-57QCUVHU.js.map} +1 -1
  142. package/dist/tools-KWFSYT56.js +6 -0
  143. package/dist/{tools-I6XCTEZY.js.map → tools-KWFSYT56.js.map} +1 -1
  144. package/package.json +89 -93
  145. package/dist/App-YAHJUWCX.js.map +0 -1
  146. package/dist/api-key-fallback-UN3TJEOO.js +0 -11
  147. package/dist/auth-status-EIM5A5KL.js +0 -13
  148. package/dist/chunk-25UNNEHN.js +0 -140
  149. package/dist/chunk-25UNNEHN.js.map +0 -1
  150. package/dist/chunk-2GKOK6T7.js.map +0 -1
  151. package/dist/chunk-2LF7ALGR.js.map +0 -1
  152. package/dist/chunk-2NWNIKBK.js.map +0 -1
  153. package/dist/chunk-3TSPZRGM.js.map +0 -1
  154. package/dist/chunk-473JN6M5.js.map +0 -1
  155. package/dist/chunk-5XFSV6PF.js.map +0 -1
  156. package/dist/chunk-62HSGYQD.js.map +0 -1
  157. package/dist/chunk-6GUD7QIM.js.map +0 -1
  158. package/dist/chunk-AQ23TYSQ.js.map +0 -1
  159. package/dist/chunk-BY4DAKUU.js.map +0 -1
  160. package/dist/chunk-CC7MGWYY.js.map +0 -1
  161. package/dist/chunk-CTFZTARK.js +0 -155
  162. package/dist/chunk-CTFZTARK.js.map +0 -1
  163. package/dist/chunk-FIC7AK4Q.js.map +0 -1
  164. package/dist/chunk-GU33WKPG.js.map +0 -1
  165. package/dist/chunk-H2SYKIMI.js.map +0 -1
  166. package/dist/chunk-HEKFAKVH.js.map +0 -1
  167. package/dist/chunk-IARA5XYP.js.map +0 -1
  168. package/dist/chunk-LCYH4T6N.js.map +0 -1
  169. package/dist/chunk-LDVY5ELP.js.map +0 -1
  170. package/dist/chunk-OCJPQFOR.js.map +0 -1
  171. package/dist/chunk-ODBY7S4X.js +0 -141
  172. package/dist/chunk-ODBY7S4X.js.map +0 -1
  173. package/dist/chunk-ONQ4WCUI.js.map +0 -1
  174. package/dist/chunk-P5TKZM3T.js +0 -159
  175. package/dist/chunk-P5TKZM3T.js.map +0 -1
  176. package/dist/chunk-P66WDACW.js.map +0 -1
  177. package/dist/chunk-QCRK4QEL.js.map +0 -1
  178. package/dist/chunk-ROJPFPJ7.js.map +0 -1
  179. package/dist/chunk-RP2TAL3J.js.map +0 -1
  180. package/dist/chunk-RYOB3TLZ.js.map +0 -1
  181. package/dist/chunk-SOQFMNQC.js.map +0 -1
  182. package/dist/chunk-TDFTX32B.js.map +0 -1
  183. package/dist/chunk-VBLLDY4R.js.map +0 -1
  184. package/dist/chunk-VJNQJALF.js.map +0 -1
  185. package/dist/chunk-WAYSJMPS.js.map +0 -1
  186. package/dist/chunk-WC72BRHR.js.map +0 -1
  187. package/dist/chunk-YPFOE2QJ.js.map +0 -1
  188. package/dist/claude-adapter-6P4SJH7P.js +0 -7
  189. package/dist/claude-adapter-6P4SJH7P.js.map +0 -1
  190. package/dist/claude-login-IS5WTBMP.js.map +0 -1
  191. package/dist/codex-login-GMPF64MR.js.map +0 -1
  192. package/dist/config-store-POB6I37G.js +0 -7
  193. package/dist/conversation-store-PRBHWQMJ.js +0 -4
  194. package/dist/detect-providers-C4SVQHFF.js +0 -4
  195. package/dist/executor-RUX7VK3T.js +0 -4
  196. package/dist/first-run-GDEVRFPO.js.map +0 -1
  197. package/dist/gemini-adapter-MV3U4QFH.js +0 -7
  198. package/dist/gemini-adapter-MV3U4QFH.js.map +0 -1
  199. package/dist/gemini-login-KE224MSW.js.map +0 -1
  200. package/dist/input-history-MIOO3FIW.js.map +0 -1
  201. package/dist/kimi-adapter-UODMNX6K.js +0 -6
  202. package/dist/kimi-login-DNT5YBKX.js.map +0 -1
  203. package/dist/logger-PLPDWACQ.js +0 -3
  204. package/dist/model-discovery-O64ZWPX5.js +0 -6
  205. package/dist/native-cli-adapters-JMZX2C2C.js +0 -8
  206. package/dist/ollama-adapter-GE67BNSS.js +0 -5
  207. package/dist/openai-adapter-SHPLK77L.js +0 -7
  208. package/dist/openai-adapter-SHPLK77L.js.map +0 -1
  209. package/dist/profile-loader-TNAXBLDX.js.map +0 -1
  210. package/dist/registry-3NHVCXCZ.js +0 -6
  211. package/dist/registry-7CQ3NCAD.js +0 -5
  212. package/dist/server-manager-DES23IBQ.js +0 -5
  213. package/dist/session-manager-EHD7GWM2.js +0 -12
  214. package/dist/sqlite-store-7ZIVOUNI.js +0 -5
  215. package/dist/team-manager-6DCNLGTC.js +0 -11
  216. package/dist/team-state-R2D7DT5M.js +0 -3
  217. package/dist/tmux-manager-WBKHUHDT.js +0 -6
  218. package/dist/tools-I6XCTEZY.js +0 -6
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/providers/registry.ts"],"names":["provider"],"mappings":"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","file":"chunk-2KMA5RBC.js","sourcesContent":["/**\n * Provider registry per PRD section 7.1\n * Central registry for provider adapters — register, resolve, list.\n */\n\nimport { logger } from \"../utils/logger.js\";\nimport { ModelNotFoundError } from \"../types/errors.js\";\nimport { SUPPORTED_MODELS } from \"../types/model.js\";\nimport type { IModelInfo } from \"../types/model.js\";\nimport type { IModelProvider, IProviderRegistryOptions } from \"./types.js\";\n\n/**\n * Singleton registry that maps provider names and model IDs to provider adapters.\n */\nexport class ProviderRegistry {\n private readonly providers = new Map<string, IModelProvider>();\n private readonly modelToProvider = new Map<string, string>();\n\n /**\n * Register a provider adapter.\n * Automatically indexes all supported models to this provider.\n */\n register(provider: IModelProvider): void {\n this.providers.set(provider.name, provider);\n\n for (const modelId of provider.supportedModels) {\n this.modelToProvider.set(modelId, provider.name);\n }\n\n logger.debug(\n { provider: provider.name, models: provider.supportedModels },\n \"Provider registered\",\n );\n }\n\n /**\n * Get a provider adapter by its name (e.g. \"anthropic\", \"openai\").\n */\n getByName(name: string): IModelProvider | undefined {\n return this.providers.get(name);\n }\n\n /**\n * Get the provider adapter that supports a given model ID.\n * @throws ModelNotFoundError if no provider serves this model.\n */\n getForModel(modelId: string): IModelProvider {\n const providerName = this.modelToProvider.get(modelId);\n if (providerName === undefined) {\n throw new ModelNotFoundError(modelId);\n }\n\n const provider = this.providers.get(providerName);\n if (provider === undefined) {\n throw new ModelNotFoundError(modelId);\n }\n\n return provider;\n }\n\n /**\n * Resolve a model string to its provider.\n * Supports both model IDs (\"claude-sonnet-4-6\") and provider-prefixed\n * forms (\"anthropic:claude-sonnet-4-6\").\n */\n resolve(modelString: string): { provider: IModelProvider; modelId: string } {\n const colonIndex = modelString.indexOf(\":\");\n if (colonIndex !== -1) {\n const providerName = modelString.slice(0, colonIndex);\n const modelId = modelString.slice(colonIndex + 1);\n const provider = this.providers.get(providerName);\n if (provider === undefined) {\n throw new ModelNotFoundError(modelString);\n }\n return { provider, modelId };\n }\n\n const provider = this.getForModel(modelString);\n return { provider, modelId: modelString };\n }\n\n /**\n * List all registered model IDs across all providers.\n */\n listModels(): readonly IModelInfo[] {\n const models: IModelInfo[] = [];\n\n for (const provider of this.providers.values()) {\n for (const modelId of provider.supportedModels) {\n const info = SUPPORTED_MODELS[modelId];\n if (info !== undefined) {\n models.push(info);\n }\n }\n }\n\n return models;\n }\n\n /**\n * List all registered provider names.\n */\n listProviders(): readonly string[] {\n return [...this.providers.keys()];\n }\n\n /**\n * Check if a model ID is supported by any registered provider.\n */\n hasModel(modelId: string): boolean {\n return this.modelToProvider.has(modelId);\n }\n\n /**\n * Check if a provider is registered.\n */\n hasProvider(name: string): boolean {\n return this.providers.has(name);\n }\n\n /**\n * List available models from all providers.\n * Uses dynamic API listing where supported, falls back to static models.\n */\n async listAllAvailableModels(): Promise<Map<string, readonly string[]>> {\n const entries = [...this.providers.entries()];\n const fetched = await Promise.all(\n entries.map(async ([name, provider]): Promise<[string, readonly string[]]> => {\n if (typeof provider.listAvailableModels === \"function\") {\n try {\n return [name, await provider.listAvailableModels()];\n } catch {\n return [name, [...provider.supportedModels]];\n }\n }\n return [name, [...provider.supportedModels]];\n }),\n );\n\n const result = new Map<string, readonly string[]>();\n fetched.sort(([a], [b]) => a.localeCompare(b));\n for (const [name, models] of fetched) {\n result.set(name, models);\n }\n\n return result;\n }\n}\n\n/**\n * Create a pre-populated registry with all available providers.\n * Resolves credentials via SessionManager (CLI delegation, API keys, env vars).\n */\nexport async function createDefaultRegistry(\n options: IProviderRegistryOptions = {},\n): Promise<ProviderRegistry> {\n const registry = new ProviderRegistry();\n\n const { SessionManager } = await import(\"../auth/session-manager.js\");\n const session = new SessionManager();\n const { execa } = await import(\"execa\");\n\n // When AEMEATHCLI_PREFER_SDK=1 (set for agent child processes), prefer\n // SDK-based adapters over native CLI adapters. Native CLI adapters shell\n // out to external binaries whose raw JSON output can interfere with IPC\n // streaming. Falls back to native only when no API key is available.\n const preferSdk = options.preferSdk ?? process.env[\"AEMEATHCLI_PREFER_SDK\"] === \"1\";\n\n const cliAvailability = new Map<string, boolean>();\n const hasCli = async (command: string): Promise<boolean> => {\n const cached = cliAvailability.get(command);\n if (cached !== undefined) {\n return cached;\n }\n\n const pathLookupCommand = process.platform === \"win32\" ? \"where\" : \"which\";\n\n try {\n await execa(pathLookupCommand, [command], { timeout: 3000 });\n cliAvailability.set(command, true);\n return true;\n } catch {\n cliAvailability.set(command, false);\n return false;\n }\n };\n\n /** Determine whether to use a native CLI adapter for a provider. */\n const shouldUseNative = async (\n credential: { method: string; token?: string | undefined } | undefined,\n cliCommand: string,\n envKeyName: string,\n ): Promise<boolean> => {\n const hasApiKey =\n credential?.method === \"api_key\"\n || credential?.method === \"env_variable\"\n || process.env[envKeyName] !== undefined;\n\n // When preferSdk is set, prefer SDK adapters whenever an API key or\n // environment credential is available, even if a native CLI login exists.\n if (preferSdk && hasApiKey) {\n return false;\n }\n\n // Native login credentials (OAuth sessions) must always use the native CLI\n // adapter. The stored token is an OAuth session token, NOT an API key — SDK\n // adapters will reject it with \"invalid x-api-key\" / \"API key not valid\".\n if (credential?.method === \"native_login\") {\n return await hasCli(cliCommand);\n }\n\n // When preferSdk is set, only use native if SDK has no way to authenticate.\n if (preferSdk) {\n // No API key available — fall back to native if CLI exists.\n return await hasCli(cliCommand);\n }\n\n // Default behavior: prefer native when CLI is available and no explicit credential.\n return credential === undefined && await hasCli(cliCommand);\n };\n\n const providerLoaders: ReadonlyArray<{\n name: string;\n load: () => Promise<IModelProvider>;\n }> = [\n {\n name: \"anthropic\",\n load: async () => {\n const { ClaudeNativeCLIAdapter, logNativeAdapterSelection } = await import(\n \"./native-cli-adapters.js\"\n );\n logNativeAdapterSelection(\"anthropic\");\n return new ClaudeNativeCLIAdapter();\n },\n },\n {\n name: \"openai\",\n load: async () => {\n const { CodexNativeCLIAdapter, logNativeAdapterSelection } = await import(\n \"./native-cli-adapters.js\"\n );\n logNativeAdapterSelection(\"openai\");\n return new CodexNativeCLIAdapter();\n },\n },\n {\n name: \"google\",\n load: async () => {\n const { GeminiNativeCLIAdapter, logNativeAdapterSelection } = await import(\n \"./native-cli-adapters.js\"\n );\n logNativeAdapterSelection(\"google\");\n return new GeminiNativeCLIAdapter();\n },\n },\n {\n name: \"kimi\",\n load: async () => {\n const { KimiAdapter } = await import(\"./kimi-adapter.js\");\n const credential = await session.getActiveCredential(\"kimi\").catch(() => undefined);\n const useNative = await shouldUseNative(credential, \"kimi\", \"MOONSHOT_API_KEY\");\n\n if (useNative) {\n const { KimiNativeCLIAdapter, logNativeAdapterSelection } = await import(\n \"./native-cli-adapters.js\"\n );\n logNativeAdapterSelection(\"kimi\");\n return new KimiNativeCLIAdapter();\n }\n\n return new KimiAdapter(\n credential?.token !== undefined ? { apiKey: credential.token } : undefined,\n );\n },\n },\n ];\n\n // Initialize all providers in parallel (including Ollama)\n const ollamaTask = (async () => {\n try {\n const { OllamaAdapter } = await import(\"./ollama-adapter.js\");\n const ollama = new OllamaAdapter();\n await ollama.refreshModels();\n registry.register(ollama);\n } catch {\n // Ollama not available\n }\n })();\n\n await Promise.all([\n ...providerLoaders.map(async (config) => {\n try {\n const adapter = await config.load();\n registry.register(adapter);\n } catch {\n // Skip provider if adapter fails to initialize\n }\n }),\n ollamaTask,\n ]);\n\n return registry;\n}\n"]}
@@ -63,5 +63,5 @@ var DEFAULT_CONFIG = {
63
63
  };
64
64
 
65
65
  export { DEFAULT_CONFIG, PACKAGE_VERSION };
66
- //# sourceMappingURL=chunk-2GKOK6T7.js.map
67
- //# sourceMappingURL=chunk-2GKOK6T7.js.map
66
+ //# sourceMappingURL=chunk-2Y7TR6BS.js.map
67
+ //# sourceMappingURL=chunk-2Y7TR6BS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/version.ts","../src/types/config.ts"],"names":[],"mappings":";;;;AAOA,IAAM,gBAAA,GAAmB,OAAA;AAEzB,SAAS,kBAAA,GAA6B;AACpC,EAAA,IAAI;AACF,IAAA,MAAM,kBAAkB,aAAA,CAAc,IAAI,IAAI,iBAAA,EAAmB,MAAA,CAAA,IAAA,CAAY,GAAG,CAAC,CAAA;AACjF,IAAA,MAAM,GAAA,GAAM,YAAA,CAAa,eAAA,EAAiB,OAAO,CAAA;AACjD,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC7B,IAAA,OAAO,OAAO,OAAA,IAAW,gBAAA;AAAA,EAC3B,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,gBAAA;AAAA,EACT;AACF;AAEO,IAAM,kBAAkB,kBAAA;;;ACwHxB,IAAM,cAAA,GAAgC;AAAA,EAC3C,OAAA,EAAS,eAAA;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,WAAA;AAAA,IACf,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,KAAA,EAAO;AAAA,IACL,kBAAA,EAAoB,KAAA;AAAA,IACpB,mBAAmB,EAAC;AAAA,IACpB,qBAAA,EAAuB,MAAA;AAAA,IACvB,yBAAyB;AAAC,GAC5B;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-2Y7TR6BS.js","sourcesContent":["import { readFileSync } from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\n\ninterface PackageJsonShape {\n version?: string;\n}\n\nconst FALLBACK_VERSION = \"0.0.0\";\n\nfunction loadPackageVersion(): string {\n try {\n const packageJsonPath = fileURLToPath(new URL(\"../package.json\", import.meta.url));\n const raw = readFileSync(packageJsonPath, \"utf-8\");\n const parsed = JSON.parse(raw) as PackageJsonShape;\n return parsed.version ?? FALLBACK_VERSION;\n } catch {\n return FALLBACK_VERSION;\n }\n}\n\nexport const PACKAGE_VERSION = loadPackageVersion();\n","/**\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\";\nimport type { CliProviderType } from \"../orchestrator/constants.js\";\nimport { PACKAGE_VERSION } from \"../version.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\" | \"ghostty\" | \"terminal-app\";\n\nexport interface ISplitPanelConfig {\n readonly enabled: boolean;\n readonly backend: PaneBackend;\n readonly defaultLayout: PaneLayout;\n readonly maxPanes: number;\n}\n\n// ── Swarm / Orchestrator Preferences ────────────────────────────────────\n\nexport interface ISwarmConfig {\n readonly onboardingComplete: boolean;\n readonly detectedProviders: readonly CliProviderType[];\n readonly primaryMasterProvider?: CliProviderType | undefined;\n readonly fallbackMasterProviders: readonly CliProviderType[];\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 swarm: ISwarmConfig;\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: PACKAGE_VERSION,\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: \"hub-spoke\",\n maxPanes: 6,\n },\n swarm: {\n onboardingComplete: false,\n detectedProviders: [],\n primaryMasterProvider: undefined,\n fallbackMasterProviders: [],\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,7 +1,7 @@
1
- import { getEventBus } from './chunk-ROJPFPJ7.js';
2
- import { estimateTokenCount, createTokenUsage, formatCost } from './chunk-VJNQJALF.js';
3
- import { isCommandBlocked } from './chunk-VBLLDY4R.js';
4
- import { logger } from './chunk-HEKFAKVH.js';
1
+ import { getEventBus } from './chunk-YL5XFHR3.js';
2
+ import { estimateTokenCount, createTokenUsage, formatCost } from './chunk-YCCYXDW7.js';
3
+ import { isCommandBlocked } from './chunk-OPWAFS6Y.js';
4
+ import { logger } from './chunk-IR5HLBMH.js';
5
5
 
6
6
  // src/core/context-manager.ts
7
7
  var CONTEXT_BUDGET_RATIO = 0.85;
@@ -518,5 +518,5 @@ var TaskOrchestrator = class {
518
518
  };
519
519
 
520
520
  export { ContextManager, CostTracker, PermissionManager, TaskOrchestrator };
521
- //# sourceMappingURL=chunk-ONQ4WCUI.js.map
522
- //# sourceMappingURL=chunk-ONQ4WCUI.js.map
521
+ //# sourceMappingURL=chunk-2ZYK5IJG.js.map
522
+ //# sourceMappingURL=chunk-2ZYK5IJG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/context-manager.ts","../src/core/cost-tracker.ts","../src/core/permission-manager.ts","../src/core/task-orchestrator.ts"],"names":[],"mappings":"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","file":"chunk-2ZYK5IJG.js","sourcesContent":["/**\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,5 +1,5 @@
1
- import { SessionManager } from './chunk-H2SYKIMI.js';
2
- import { ApiKeyFallback } from './chunk-6GUD7QIM.js';
1
+ import { SessionManager } from './chunk-7EBLXPL4.js';
2
+ import { ApiKeyFallback } from './chunk-HESQLCLU.js';
3
3
 
4
4
  // src/auth/auth-status.ts
5
5
  var LOGIN_PROVIDERS = ["claude", "codex", "gemini", "kimi"];
@@ -84,5 +84,5 @@ function formatCompactAuthStatusLine(record) {
84
84
  }
85
85
 
86
86
  export { LOGIN_PROVIDERS, formatCompactAuthStatusLine, formatDetailedAuthStatusLine, getAuthStatusRecord, getAuthStatusRecords };
87
- //# sourceMappingURL=chunk-OCJPQFOR.js.map
88
- //# sourceMappingURL=chunk-OCJPQFOR.js.map
87
+ //# sourceMappingURL=chunk-36RXCZOV.js.map
88
+ //# sourceMappingURL=chunk-36RXCZOV.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/auth/auth-status.ts"],"names":[],"mappings":"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","file":"chunk-36RXCZOV.js","sourcesContent":["import { ApiKeyFallback } from \"./api-key-fallback.js\";\nimport { SessionManager } from \"./session-manager.js\";\nimport type { AuthMethod, ProviderName } from \"../types/index.js\";\n\nexport const LOGIN_PROVIDERS = [\"claude\", \"codex\", \"gemini\", \"kimi\"] as const;\nexport type LoginProvider = (typeof LOGIN_PROVIDERS)[number];\n\nexport interface IAuthStatusRecord {\n readonly provider: LoginProvider;\n readonly loggedIn: boolean;\n readonly authMethod?: AuthMethod;\n readonly email?: string;\n readonly plan?: string;\n readonly launchReady: boolean;\n readonly launchMethod?: AuthMethod;\n}\n\nconst PROVIDER_MODEL_SWITCH: Readonly<Record<LoginProvider, { provider: ProviderName; model: string }>> = {\n claude: { provider: \"anthropic\", model: \"claude-sonnet-4-6\" },\n codex: { provider: \"openai\", model: \"gpt-5.2\" },\n gemini: { provider: \"google\", model: \"gemini-2.5-pro\" },\n kimi: { provider: \"kimi\", model: \"kimi-for-coding\" },\n};\n\nfunction formatAuthMethodLabel(method?: AuthMethod): string {\n switch (method) {\n case \"native_login\":\n return \"CLI login\";\n case \"api_key\":\n return \"API key\";\n case \"env_variable\":\n return \"env var\";\n case \"credential_helper\":\n return \"credential helper\";\n default:\n return \"configured\";\n }\n}\n\nfunction formatCompactLoginState(email?: string, plan?: string): string {\n if (email !== undefined && plan !== undefined) {\n return `Logged in as ${email} (${plan})`;\n }\n\n if (email !== undefined) {\n return `Logged in as ${email}`;\n }\n\n if (plan !== undefined) {\n return `Logged in (${plan})`;\n }\n\n return \"Logged in\";\n}\n\nexport async function getAuthStatusRecord(provider: LoginProvider): Promise<IAuthStatusRecord> {\n const providerName = PROVIDER_MODEL_SWITCH[provider].provider;\n const sessionManager = new SessionManager();\n const fallback = new ApiKeyFallback();\n const activeCredential = await sessionManager.getActiveCredential(providerName).catch(() => undefined);\n const storedApiKey = await fallback.getCredential(providerName);\n const envCredential = fallback.getFromEnvironment(providerName);\n const launchCredential = storedApiKey ?? envCredential;\n\n let email: string | undefined;\n let plan: string | undefined;\n if (activeCredential?.method === \"native_login\") {\n const status = await sessionManager.getStatus(providerName);\n email = status.email;\n plan = status.plan;\n }\n\n // Swarm mode is ready if ANY credential exists — native CLI login (OAuth)\n // is sufficient because the native CLI adapters shell out to the provider's\n // own CLI (claude, codex, gemini, kimi) which already holds the session.\n const launchReady = activeCredential !== undefined || launchCredential !== undefined;\n const launchMethod = launchCredential?.method ?? activeCredential?.method;\n\n return {\n provider,\n loggedIn: activeCredential !== undefined,\n ...(activeCredential?.method !== undefined ? { authMethod: activeCredential.method } : {}),\n ...(email !== undefined ? { email } : {}),\n ...(plan !== undefined ? { plan } : {}),\n launchReady,\n ...(launchMethod !== undefined ? { launchMethod } : {}),\n };\n}\n\nexport async function getAuthStatusRecords(): Promise<readonly IAuthStatusRecord[]> {\n return Promise.all(LOGIN_PROVIDERS.map(async (provider) => getAuthStatusRecord(provider)));\n}\n\nexport function formatDetailedAuthStatusLine(record: IAuthStatusRecord): string {\n if (!record.loggedIn) {\n return ` ✗ ${record.provider} — Not logged in`;\n }\n\n const identity =\n record.email !== undefined\n ? ` as ${record.email}${record.plan !== undefined ? ` (${record.plan})` : \"\"}`\n : record.plan !== undefined\n ? ` (${record.plan})`\n : \"\";\n const launchStatus = record.launchReady\n ? `swarm-ready via ${formatAuthMethodLabel(record.launchMethod)}`\n : \"not authenticated — run `aemeathcli auth login` or set an API key\";\n\n return ` ✓ ${record.provider} — ${formatAuthMethodLabel(record.authMethod)}${identity}; ${launchStatus}`;\n}\n\nexport function formatCompactAuthStatusLine(record: IAuthStatusRecord): string {\n if (!record.loggedIn) {\n return ` ✗ ${record.provider} — Not logged in`;\n }\n\n if (record.authMethod === \"native_login\" || record.authMethod === undefined) {\n return ` ✓ ${record.provider} — ${formatCompactLoginState(record.email, record.plan)}`;\n }\n\n return ` ✓ ${record.provider} — Configured via ${formatAuthMethodLabel(record.authMethod)}`;\n}\n"]}
@@ -1,7 +1,7 @@
1
- import { ApiKeyFallback } from './chunk-6GUD7QIM.js';
2
- import { CredentialStore } from './chunk-AQ23TYSQ.js';
3
- import { AuthenticationError } from './chunk-473JN6M5.js';
4
- import { logger } from './chunk-HEKFAKVH.js';
1
+ import { ApiKeyFallback } from './chunk-HESQLCLU.js';
2
+ import { CredentialStore } from './chunk-SNWPI6XJ.js';
3
+ import { AuthenticationError } from './chunk-ZGOHARPV.js';
4
+ import { logger } from './chunk-IR5HLBMH.js';
5
5
 
6
6
  // src/auth/session-manager.ts
7
7
  var SessionManager = class {
@@ -124,19 +124,19 @@ var SessionManager = class {
124
124
  try {
125
125
  switch (provider) {
126
126
  case "anthropic": {
127
- const mod = await import('./claude-login-IS5WTBMP.js');
127
+ const mod = await import('./claude-login-AIFIWTYF.js');
128
128
  return new mod.ClaudeLogin(this.credentialStore);
129
129
  }
130
130
  case "openai": {
131
- const mod = await import('./codex-login-GMPF64MR.js');
131
+ const mod = await import('./codex-login-LW5X7GAM.js');
132
132
  return new mod.CodexLogin(this.credentialStore);
133
133
  }
134
134
  case "google": {
135
- const mod = await import('./gemini-login-KE224MSW.js');
135
+ const mod = await import('./gemini-login-TST454MX.js');
136
136
  return new mod.GeminiLogin(this.credentialStore);
137
137
  }
138
138
  case "kimi": {
139
- const mod = await import('./kimi-login-DNT5YBKX.js');
139
+ const mod = await import('./kimi-login-3IGVOBJI.js');
140
140
  return new mod.KimiLogin(this.credentialStore);
141
141
  }
142
142
  default:
@@ -177,5 +177,5 @@ var SessionManager = class {
177
177
  };
178
178
 
179
179
  export { SessionManager };
180
- //# sourceMappingURL=chunk-H2SYKIMI.js.map
181
- //# sourceMappingURL=chunk-H2SYKIMI.js.map
180
+ //# sourceMappingURL=chunk-7EBLXPL4.js.map
181
+ //# sourceMappingURL=chunk-7EBLXPL4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/auth/session-manager.ts"],"names":[],"mappings":"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","file":"chunk-7EBLXPL4.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,5 +1,5 @@
1
- import { logger } from './chunk-HEKFAKVH.js';
2
- import { getDatabasePath, ensureDirectory, getDatabaseDir } from './chunk-BY4DAKUU.js';
1
+ import { logger } from './chunk-IR5HLBMH.js';
2
+ import { getDatabasePath, ensureDirectory, getDatabaseDir } from './chunk-D275MCIH.js';
3
3
  import Database from 'better-sqlite3';
4
4
  import { chmodSync } from 'fs';
5
5
 
@@ -182,5 +182,5 @@ var SqliteStore = class {
182
182
  };
183
183
 
184
184
  export { SqliteStore };
185
- //# sourceMappingURL=chunk-IARA5XYP.js.map
186
- //# sourceMappingURL=chunk-IARA5XYP.js.map
185
+ //# sourceMappingURL=chunk-BIMQL4AG.js.map
186
+ //# sourceMappingURL=chunk-BIMQL4AG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/storage/migrations/001-initial.ts","../src/storage/sqlite-store.ts"],"names":[],"mappings":"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","file":"chunk-BIMQL4AG.js","sourcesContent":["/**\n * Initial database migration — PRD section 17.1\n * Creates all core tables and indexes for AemeathCLI persistence.\n *\n * SAFETY: All DDL is static SQL. No user input is interpolated.\n */\n\nimport type Database from \"better-sqlite3\";\n\nconst MIGRATION_ID = \"001-initial\";\n\nconst CREATE_CONVERSATIONS = `\nCREATE TABLE IF NOT EXISTS conversations (\n id TEXT PRIMARY KEY,\n project_root TEXT NOT NULL,\n default_model TEXT,\n created_at TEXT DEFAULT (datetime('now')),\n updated_at TEXT DEFAULT (datetime('now')),\n metadata TEXT DEFAULT '{}'\n)`;\n\nconst CREATE_MESSAGES = `\nCREATE TABLE IF NOT EXISTS messages (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n conversation_id TEXT NOT NULL REFERENCES conversations(id) ON DELETE CASCADE,\n role TEXT NOT NULL,\n model TEXT,\n provider TEXT,\n content TEXT NOT NULL,\n tool_calls TEXT,\n token_usage TEXT,\n created_at TEXT DEFAULT (datetime('now'))\n)`;\n\nconst CREATE_FILE_CONTEXT = `\nCREATE TABLE IF NOT EXISTS file_context (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n conversation_id TEXT NOT NULL REFERENCES conversations(id) ON DELETE CASCADE,\n file_path TEXT NOT NULL,\n content_hash TEXT,\n token_count INTEGER,\n added_at TEXT DEFAULT (datetime('now'))\n)`;\n\nconst CREATE_COST_TRACKING = `\nCREATE TABLE IF NOT EXISTS cost_tracking (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n conversation_id TEXT NOT NULL REFERENCES conversations(id) ON DELETE CASCADE,\n provider TEXT NOT NULL,\n model TEXT NOT NULL,\n role TEXT,\n input_tokens INTEGER,\n output_tokens INTEGER,\n cost_usd REAL,\n created_at TEXT DEFAULT (datetime('now'))\n)`;\n\nconst CREATE_TEAMS = `\nCREATE TABLE IF NOT EXISTS teams (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n status TEXT DEFAULT 'active',\n config TEXT,\n created_at TEXT DEFAULT (datetime('now'))\n)`;\n\nconst CREATE_INDEXES = [\n \"CREATE INDEX IF NOT EXISTS idx_messages_conversation ON messages(conversation_id)\",\n \"CREATE INDEX IF NOT EXISTS idx_cost_conversation ON cost_tracking(conversation_id)\",\n \"CREATE INDEX IF NOT EXISTS idx_cost_provider ON cost_tracking(provider)\",\n \"CREATE INDEX IF NOT EXISTS idx_file_context_conversation ON file_context(conversation_id)\",\n] as const;\n\nconst DROP_INDEXES = [\n \"DROP INDEX IF EXISTS idx_file_context_conversation\",\n \"DROP INDEX IF EXISTS idx_cost_provider\",\n \"DROP INDEX IF EXISTS idx_cost_conversation\",\n \"DROP INDEX IF EXISTS idx_messages_conversation\",\n] as const;\n\nconst DROP_TABLES = [\n \"DROP TABLE IF EXISTS cost_tracking\",\n \"DROP TABLE IF EXISTS file_context\",\n \"DROP TABLE IF EXISTS messages\",\n \"DROP TABLE IF EXISTS teams\",\n \"DROP TABLE IF EXISTS conversations\",\n] as const;\n\nexport function up(db: Database.Database): void {\n db.transaction(() => {\n db.exec(CREATE_CONVERSATIONS);\n db.exec(CREATE_MESSAGES);\n db.exec(CREATE_FILE_CONTEXT);\n db.exec(CREATE_COST_TRACKING);\n db.exec(CREATE_TEAMS);\n\n for (const sql of CREATE_INDEXES) {\n db.exec(sql);\n }\n })();\n}\n\nexport function down(db: Database.Database): void {\n db.transaction(() => {\n for (const sql of DROP_INDEXES) {\n db.exec(sql);\n }\n for (const sql of DROP_TABLES) {\n db.exec(sql);\n }\n })();\n}\n\nexport { MIGRATION_ID };\n","/**\n * SQLite database store — PRD section 17.1\n * Uses better-sqlite3 with WAL mode for concurrent reads.\n * Runs migrations on startup. Provides raw query interface.\n */\n\nimport Database from \"better-sqlite3\";\nimport { chmodSync } from \"node:fs\";\nimport { logger } from \"../utils/logger.js\";\nimport {\n getDatabasePath,\n getDatabaseDir,\n ensureDirectory,\n} from \"../utils/pathResolver.js\";\nimport { up as initialMigrationUp } from \"./migrations/001-initial.js\";\n\nconst MIGRATIONS_TABLE_DDL = `\nCREATE TABLE IF NOT EXISTS _migrations (\n id TEXT PRIMARY KEY,\n applied_at TEXT DEFAULT (datetime('now'))\n)`;\n\ninterface IMigration {\n readonly id: string;\n readonly up: (db: Database.Database) => void;\n}\n\nconst MIGRATIONS: readonly IMigration[] = [\n { id: \"001-initial\", up: initialMigrationUp },\n] as const;\n\nexport class SqliteStore {\n private db: Database.Database | undefined;\n private closed = false;\n\n get database(): Database.Database {\n if (this.closed || !this.db) {\n throw new Error(\"SqliteStore is closed or not initialized\");\n }\n return this.db;\n }\n\n open(dbPath?: string): void {\n if (this.db) {\n return;\n }\n\n const resolvedPath = dbPath ?? getDatabasePath();\n ensureDirectory(getDatabaseDir());\n\n logger.info({ path: resolvedPath }, \"Opening SQLite database\");\n\n this.db = new Database(resolvedPath);\n\n // WAL mode for concurrent reads (PRD section 17.1)\n this.db.pragma(\"journal_mode = WAL\");\n this.db.pragma(\"busy_timeout = 5000\");\n this.db.pragma(\"foreign_keys = ON\");\n this.db.pragma(\"synchronous = NORMAL\");\n\n // Secure file permissions (PRD section 14.1)\n try {\n chmodSync(resolvedPath, 0o600);\n } catch {\n logger.warn(\n { path: resolvedPath },\n \"Could not set database file permissions to 600\",\n );\n }\n\n this.runMigrations();\n this.registerCleanupHandlers();\n }\n\n private runMigrations(): void {\n const db = this.database;\n db.exec(MIGRATIONS_TABLE_DDL);\n\n const appliedStmt = db.prepare(\n \"SELECT id FROM _migrations WHERE id = ?\",\n );\n\n const insertStmt = db.prepare(\n \"INSERT INTO _migrations (id) VALUES (?)\",\n );\n\n for (const migration of MIGRATIONS) {\n const existing = appliedStmt.get(migration.id) as\n | { id: string }\n | undefined;\n\n if (!existing) {\n logger.info({ migrationId: migration.id }, \"Running migration\");\n db.transaction(() => {\n migration.up(db);\n insertStmt.run(migration.id);\n })();\n logger.info({ migrationId: migration.id }, \"Migration applied\");\n }\n }\n }\n\n prepare(sql: string): Database.Statement {\n return this.database.prepare(sql);\n }\n\n run(sql: string, ...params: readonly unknown[]): Database.RunResult {\n return this.database.prepare(sql).run(...params);\n }\n\n get(sql: string, ...params: unknown[]): unknown {\n return this.database.prepare(sql).get(...params);\n }\n\n all(sql: string, ...params: unknown[]): unknown[] {\n return this.database.prepare(sql).all(...params);\n }\n\n transaction<T>(fn: () => T): T {\n return this.database.transaction(fn)();\n }\n\n close(): void {\n if (this.closed || !this.db) {\n return;\n }\n\n logger.info(\"Closing SQLite database\");\n this.closed = true;\n\n try {\n this.db.pragma(\"wal_checkpoint(TRUNCATE)\");\n this.db.close();\n } catch (error: unknown) {\n const message =\n error instanceof Error ? error.message : String(error);\n logger.error({ error: message }, \"Error closing database\");\n }\n\n this.db = undefined;\n }\n\n private registerCleanupHandlers(): void {\n const cleanup = (): void => {\n this.close();\n };\n\n process.on(\"exit\", cleanup);\n process.on(\"SIGINT\", () => {\n cleanup();\n process.exit(130);\n });\n process.on(\"SIGTERM\", () => {\n cleanup();\n process.exit(143);\n });\n }\n}\n"]}
@@ -100,5 +100,5 @@ function findProjectRoot(startDir) {
100
100
  }
101
101
 
102
102
  export { ensureDirectory, ensureSecureDirectory, findProjectRoot, getAemeathHome, getConfigDir, getConfigPath, getCredentialsPath, getDatabaseDir, getDatabasePath, getIPCSocketDir, getIPCSocketPath, getLogDir, getMCPConfigPath, getProjectAgentsPath, getProjectConfigDir, getProjectConfigPath, getProjectMCPConfigPath, getProjectSkillsDir, getTasksDir, getTeamsDir, getUniversalProjectSkillsDir, getUniversalUserSkillsDir, getUserSkillsDir, initializeDirectories };
103
- //# sourceMappingURL=chunk-BY4DAKUU.js.map
104
- //# sourceMappingURL=chunk-BY4DAKUU.js.map
103
+ //# sourceMappingURL=chunk-D275MCIH.js.map
104
+ //# sourceMappingURL=chunk-D275MCIH.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/pathResolver.ts"],"names":[],"mappings":"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","file":"chunk-D275MCIH.js","sourcesContent":["/**\n * Safe path handling per PRD section 15.7 item 5\n * NO hardcoded paths — use path.join(), os.homedir(), XDG Base Directory\n */\n\nimport { homedir, tmpdir } from \"node:os\";\nimport { join, dirname } from \"node:path\";\nimport { existsSync, mkdirSync } from \"node:fs\";\n\n// ── XDG-inspired directory layout ────────────────────────────────────────\n\nconst AEMEATHCLI_HOME = join(homedir(), \".aemeathcli\");\n\nexport function getAemeathHome(): string {\n return process.env[\"AEMEATHCLI_HOME\"] ?? AEMEATHCLI_HOME;\n}\n\nexport function getConfigDir(): string {\n return getAemeathHome();\n}\n\nexport function getConfigPath(): string {\n return join(getConfigDir(), \"config.json\");\n}\n\nexport function getDatabaseDir(): string {\n return join(getAemeathHome(), \"db\");\n}\n\nexport function getDatabasePath(): string {\n return join(getDatabaseDir(), \"aemeathcli.db\");\n}\n\nexport function getLogDir(): string {\n return join(getAemeathHome(), \"logs\");\n}\n\nexport function getCredentialsPath(): string {\n return join(getAemeathHome(), \"credentials.enc\");\n}\n\nexport function getMCPConfigPath(): string {\n return join(getAemeathHome(), \"mcp.json\");\n}\n\nexport function getUserSkillsDir(): string {\n return join(getAemeathHome(), \"skills\");\n}\n\n/** Universal user-level skills directory: ~/.agents/skills/ */\nexport function getUniversalUserSkillsDir(): string {\n return join(homedir(), \".agents\", \"skills\");\n}\n\nexport function getTeamsDir(): string {\n return join(getAemeathHome(), \"teams\");\n}\n\nexport function getTasksDir(): string {\n return join(getAemeathHome(), \"tasks\");\n}\n\n// ── Project-level paths ──────────────────────────────────────────────────\n\nexport function getProjectConfigDir(projectRoot: string): string {\n return join(projectRoot, \".aemeathcli\");\n}\n\nexport function getProjectConfigPath(projectRoot: string): string {\n return join(getProjectConfigDir(projectRoot), \"config.json\");\n}\n\nexport function getProjectSkillsDir(projectRoot: string): string {\n return join(getProjectConfigDir(projectRoot), \"skills\");\n}\n\n/** Universal project-level skills directory: <projectRoot>/.agents/skills/ */\nexport function getUniversalProjectSkillsDir(projectRoot: string): string {\n return join(projectRoot, \".agents\", \"skills\");\n}\n\nexport function getProjectMCPConfigPath(projectRoot: string): string {\n return join(getProjectConfigDir(projectRoot), \"mcp.json\");\n}\n\nexport function getProjectAgentsPath(projectRoot: string): string {\n return join(getProjectConfigDir(projectRoot), \"AGENTS.md\");\n}\n\n// ── Socket paths (PRD section 14.5) ──────────────────────────────────────\n\nexport function getIPCSocketDir(): string {\n const tmp = process.env[\"TMPDIR\"] ?? tmpdir();\n const uid = process.platform === \"win32\"\n ? (process.env[\"USERNAME\"] ?? \"user\")\n : String(process.getuid?.() ?? \"user\");\n return join(tmp, `aemeathcli-${uid}`);\n}\n\nexport function getIPCSocketPath(sessionId: string): string {\n return join(getIPCSocketDir(), `${sessionId}.sock`);\n}\n\n// ── Directory Initialization ─────────────────────────────────────────────\n\nexport function ensureDirectory(dirPath: string, mode?: number): void {\n if (!existsSync(dirPath)) {\n mkdirSync(dirPath, { recursive: true, mode: mode ?? 0o755 });\n }\n}\n\nexport function ensureSecureDirectory(dirPath: string): void {\n ensureDirectory(dirPath, 0o700);\n}\n\nexport function initializeDirectories(): void {\n ensureSecureDirectory(getAemeathHome());\n ensureDirectory(getDatabaseDir());\n ensureSecureDirectory(getLogDir());\n ensureDirectory(getUserSkillsDir());\n ensureDirectory(getTeamsDir());\n ensureDirectory(getTasksDir());\n}\n\n// ── Project Root Detection ───────────────────────────────────────────────\n\nexport function findProjectRoot(startDir?: string): string {\n let currentDir = startDir ?? process.cwd();\n\n while (currentDir !== dirname(currentDir)) {\n if (existsSync(join(currentDir, \".git\"))) {\n return currentDir;\n }\n if (existsSync(join(currentDir, \".aemeathcli\"))) {\n return currentDir;\n }\n if (existsSync(join(currentDir, \"package.json\"))) {\n return currentDir;\n }\n currentDir = dirname(currentDir);\n }\n\n // Fallback to cwd\n return process.cwd();\n}\n"]}
@@ -1,6 +1,6 @@
1
- import { validatePath, isPathAllowed, isCommandBlocked, redactSecrets } from './chunk-VBLLDY4R.js';
2
- import { FileNotFoundError, ExecutionTimeoutError } from './chunk-473JN6M5.js';
3
- import { logger } from './chunk-HEKFAKVH.js';
1
+ import { validatePath, isPathAllowed, isCommandBlocked, redactSecrets } from './chunk-OPWAFS6Y.js';
2
+ import { FileNotFoundError, ExecutionTimeoutError } from './chunk-ZGOHARPV.js';
3
+ import { logger } from './chunk-IR5HLBMH.js';
4
4
  import { stat, readFile, mkdir, writeFile } from 'fs/promises';
5
5
  import { dirname, resolve, extname } from 'path';
6
6
  import fg from 'fast-glob';
@@ -1633,5 +1633,5 @@ function createDefaultRegistry(_context) {
1633
1633
  }
1634
1634
 
1635
1635
  export { ToolRegistry, createBashTool, createDefaultRegistry, createEditTool, createGitTool, createGlobTool, createGrepTool, createReadTool, createWebFetchTool, createWebSearchTool, createWriteTool, setWebSearchProvider };
1636
- //# sourceMappingURL=chunk-SOQFMNQC.js.map
1637
- //# sourceMappingURL=chunk-SOQFMNQC.js.map
1636
+ //# sourceMappingURL=chunk-FFS4T7BZ.js.map
1637
+ //# sourceMappingURL=chunk-FFS4T7BZ.js.map