aemeathcli 1.0.11 → 1.1.0

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-NT6MRKQJ.js} +675 -169
  4. package/dist/App-NT6MRKQJ.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/utils/tokenCounter.ts","../src/utils/retry.ts"],"names":[],"mappings":"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","file":"chunk-YCCYXDW7.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 { ITokenUsage } 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"]}
@@ -52,5 +52,5 @@ function getEventBus() {
52
52
  }
53
53
 
54
54
  export { getEventBus };
55
- //# sourceMappingURL=chunk-ROJPFPJ7.js.map
56
- //# sourceMappingURL=chunk-ROJPFPJ7.js.map
55
+ //# sourceMappingURL=chunk-YL5XFHR3.js.map
56
+ //# sourceMappingURL=chunk-YL5XFHR3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/event-bus.ts"],"names":[],"mappings":";AAwCO,IAAM,WAAN,MAAe;AAAA,EACH,SAAA,uBAAgB,GAAA,EAA+B;AAAA,EAEhE,EAAA,CAAwB,OAAU,OAAA,EAAiD;AACjF,IAAA,MAAM,WAAW,IAAA,CAAK,SAAA,CAAU,IAAI,KAAK,CAAA,wBAAS,GAAA,EAAI;AACtD,IAAA,QAAA,CAAS,IAAI,OAAuB,CAAA;AACpC,IAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAA,EAAO,QAAQ,CAAA;AAGlC,IAAA,OAAO,MAAM;AACX,MAAA,QAAA,CAAS,OAAO,OAAuB,CAAA;AACvC,MAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACvB,QAAA,IAAA,CAAK,SAAA,CAAU,OAAO,KAAK,CAAA;AAAA,MAC7B;AAAA,IACF,CAAA;AAAA,EACF;AAAA,EAEA,IAAA,CAA0B,OAAU,OAAA,EAAiD;AACnF,IAAA,MAAM,cAAA,GAA6C,CAAC,IAAA,KAAS;AAC3D,MAAA,WAAA,EAAY;AACZ,MAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,IACd,CAAA;AACA,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,EAAA,CAAG,KAAA,EAAO,cAAc,CAAA;AACjD,IAAA,OAAO,WAAA;AAAA,EACT;AAAA,EAEA,IAAA,CAA0B,OAAU,IAAA,EAA0B;AAC5D,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAK,CAAA;AACzC,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA;AAAA,IACF;AACA,IAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,MAAA,IAAI;AACF,QAAC,QAAuC,IAAI,CAAA;AAAA,MAC9C,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AAAA,EAEA,mBAAmB,KAAA,EAAyB;AAC1C,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,IAAA,CAAK,SAAA,CAAU,OAAO,KAAK,CAAA;AAAA,IAC7B,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,UAAU,KAAA,EAAM;AAAA,IACvB;AAAA,EACF;AAAA,EAEA,cAAc,KAAA,EAA0B;AACtC,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAK,GAAG,IAAA,IAAQ,CAAA;AAAA,EAC5C;AACF,CAAA;AAGA,IAAI,cAAA;AAEG,SAAS,WAAA,GAAwB;AACtC,EAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,IAAA,cAAA,GAAiB,IAAI,QAAA,EAAS;AAAA,EAChC;AACA,EAAA,OAAO,cAAA;AACT","file":"chunk-YL5XFHR3.js","sourcesContent":["/**\n * Typed event emitter per PRD section 6.1\n * Core IPC backbone for the orchestration layer.\n */\n\ntype EventHandler<T = unknown> = (data: T) => void;\n\ninterface IEventMap {\n \"model:request\": { model: string; role?: string };\n \"model:response\": { model: string; tokens: number; cost: number };\n \"model:stream:chunk\": { model: string; content: string };\n \"model:stream:done\": { model: string; totalTokens: number };\n \"model:error\": { model: string; error: Error };\n \"tool:call\": { name: string; args: Record<string, unknown> };\n \"tool:result\": { name: string; isError: boolean; content: string };\n \"team:created\": { teamName: string; agentCount: number };\n \"team:deleted\": { teamName: string };\n \"agent:spawned\": { agentName: string; model: string };\n \"agent:status\": { agentName: string; status: string };\n \"agent:message\": { from: string; to: string; content: string };\n \"task:created\": { taskId: string; subject: string };\n \"task:updated\": { taskId: string; status: string };\n \"task:completed\": { taskId: string };\n \"cost:updated\": { total: number; provider: string; delta: number };\n \"cost:warning\": { current: number; limit: number };\n \"cost:exceeded\": { current: number; limit: number };\n \"pane:created\": { paneId: string; agentName: string };\n \"pane:closed\": { paneId: string };\n \"skill:activated\": { skillName: string };\n \"skill:deactivated\": { skillName: string };\n \"mcp:server:started\": { serverName: string };\n \"mcp:server:stopped\": { serverName: string };\n \"mcp:server:error\": { serverName: string; error: string };\n \"config:changed\": { key: string };\n \"auth:login\": { provider: string; email?: string };\n \"auth:logout\": { provider: string };\n}\n\ntype EventName = keyof IEventMap;\n\nexport class EventBus {\n private readonly listeners = new Map<string, Set<EventHandler>>();\n\n on<K extends EventName>(event: K, handler: EventHandler<IEventMap[K]>): () => void {\n const handlers = this.listeners.get(event) ?? new Set();\n handlers.add(handler as EventHandler);\n this.listeners.set(event, handlers);\n\n // Return unsubscribe function\n return () => {\n handlers.delete(handler as EventHandler);\n if (handlers.size === 0) {\n this.listeners.delete(event);\n }\n };\n }\n\n once<K extends EventName>(event: K, handler: EventHandler<IEventMap[K]>): () => void {\n const wrappedHandler: EventHandler<IEventMap[K]> = (data) => {\n unsubscribe();\n handler(data);\n };\n const unsubscribe = this.on(event, wrappedHandler);\n return unsubscribe;\n }\n\n emit<K extends EventName>(event: K, data: IEventMap[K]): void {\n const handlers = this.listeners.get(event);\n if (!handlers) {\n return;\n }\n for (const handler of handlers) {\n try {\n (handler as EventHandler<IEventMap[K]>)(data);\n } catch {\n // Event handlers should not throw; silently catch to avoid cascading\n }\n }\n }\n\n removeAllListeners(event?: EventName): void {\n if (event) {\n this.listeners.delete(event);\n } else {\n this.listeners.clear();\n }\n }\n\n listenerCount(event: EventName): number {\n return this.listeners.get(event)?.size ?? 0;\n }\n}\n\n// Singleton event bus for the application\nlet globalEventBus: EventBus | undefined;\n\nexport function getEventBus(): EventBus {\n if (!globalEventBus) {\n globalEventBus = new EventBus();\n }\n return globalEventBus;\n}\n\nexport type { IEventMap, EventName };\n"]}
@@ -1,6 +1,6 @@
1
- import { ModelNotFoundError } from './chunk-473JN6M5.js';
2
- import { SUPPORTED_MODELS } from './chunk-62HSGYQD.js';
3
- import { logger } from './chunk-HEKFAKVH.js';
1
+ import { ModelNotFoundError } from './chunk-ZGOHARPV.js';
2
+ import { SUPPORTED_MODELS } from './chunk-HCIHOHLX.js';
3
+ import { logger } from './chunk-IR5HLBMH.js';
4
4
 
5
5
  // src/core/model-router.ts
6
6
  var ModelRouter = class {
@@ -136,5 +136,5 @@ function createModelRouter(config) {
136
136
  }
137
137
 
138
138
  export { ModelRouter, createModelRouter };
139
- //# sourceMappingURL=chunk-GU33WKPG.js.map
140
- //# sourceMappingURL=chunk-GU33WKPG.js.map
139
+ //# sourceMappingURL=chunk-YPQ2MLAV.js.map
140
+ //# sourceMappingURL=chunk-YPQ2MLAV.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/model-router.ts"],"names":[],"mappings":"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","file":"chunk-YPQ2MLAV.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 IRoleConfig,\n IGlobalConfig,\n ProviderName,\n IModelInfo,\n} from \"../types/index.js\";\nimport { SUPPORTED_MODELS, ModelNotFoundError } from \"../types/index.js\";\nimport { logger } from \"../utils/index.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"]}
@@ -22,5 +22,5 @@ function setActiveTmuxCleanup(cleanup) {
22
22
  }
23
23
 
24
24
  export { getActiveTeamManager, getActiveTeamName, getActiveTmuxCleanup, setActiveTeamManager, setActiveTeamName, setActiveTmuxCleanup };
25
- //# sourceMappingURL=chunk-WAYSJMPS.js.map
26
- //# sourceMappingURL=chunk-WAYSJMPS.js.map
25
+ //# sourceMappingURL=chunk-ZCOVMVK4.js.map
26
+ //# sourceMappingURL=chunk-ZCOVMVK4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/ui/team-state.ts"],"names":[],"mappings":";AAOA,IAAI,iBAAA;AACJ,IAAI,cAAA;AACJ,IAAI,iBAAA;AAEG,SAAS,oBAAA,GAAgD;AAC9D,EAAA,OAAO,iBAAA;AACT;AAEO,SAAS,qBAAqB,OAAA,EAAwC;AAC3E,EAAA,iBAAA,GAAoB,OAAA;AACtB;AAEO,SAAS,iBAAA,GAAwC;AACtD,EAAA,OAAO,cAAA;AACT;AAEO,SAAS,kBAAkB,IAAA,EAAgC;AAChE,EAAA,cAAA,GAAiB,IAAA;AACnB;AAEO,SAAS,oBAAA,GAA0D;AACxE,EAAA,OAAO,iBAAA;AACT;AAEO,SAAS,qBAAqB,OAAA,EAAkD;AACrF,EAAA,iBAAA,GAAoB,OAAA;AACtB","file":"chunk-ZCOVMVK4.js","sourcesContent":["/**\n * Module-level active team state shared between team commands and team launcher.\n * Extracted from App.tsx to enforce the 300-line component limit (PRD 6.2).\n */\n\nimport type { TeamManager } from \"../teams/team-manager.js\";\n\nlet activeTeamManager: TeamManager | undefined;\nlet activeTeamName: string | undefined;\nlet activeTmuxCleanup: (() => Promise<void>) | undefined;\n\nexport function getActiveTeamManager(): TeamManager | undefined {\n return activeTeamManager;\n}\n\nexport function setActiveTeamManager(manager: TeamManager | undefined): void {\n activeTeamManager = manager;\n}\n\nexport function getActiveTeamName(): string | undefined {\n return activeTeamName;\n}\n\nexport function setActiveTeamName(name: string | undefined): void {\n activeTeamName = name;\n}\n\nexport function getActiveTmuxCleanup(): (() => Promise<void>) | undefined {\n return activeTmuxCleanup;\n}\n\nexport function setActiveTmuxCleanup(cleanup: (() => Promise<void>) | undefined): void {\n activeTmuxCleanup = cleanup;\n}\n"]}
@@ -118,5 +118,5 @@ var ToolCallError = class extends AemeathError {
118
118
  };
119
119
 
120
120
  export { AemeathError, AgentSpawnError, AuthenticationError, ContextOverflowError, ExecutionTimeoutError, FileNotFoundError, IPCError, InvalidConfigError, MissingConfigError, ModelNotFoundError, PermissionDeniedError, RateLimitError, ServerConnectionError, ToolCallError };
121
- //# sourceMappingURL=chunk-473JN6M5.js.map
122
- //# sourceMappingURL=chunk-473JN6M5.js.map
121
+ //# sourceMappingURL=chunk-ZGOHARPV.js.map
122
+ //# sourceMappingURL=chunk-ZGOHARPV.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/types/errors.ts"],"names":[],"mappings":"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","file":"chunk-ZGOHARPV.js","sourcesContent":["/**\n * AemeathCLI Typed Error Hierarchy\n * Per PRD section 15.5: Every error includes code, user message, diagnostic, recovery action\n */\n\nexport interface IErrorContext {\n readonly code: string;\n readonly userMessage: string;\n readonly diagnosticMessage?: string | undefined;\n readonly suggestedRecovery?: string | undefined;\n}\n\nexport abstract class AemeathError extends Error {\n abstract readonly code: string;\n abstract readonly userMessage: string;\n diagnosticMessage?: string | undefined;\n suggestedRecovery?: string | undefined;\n\n constructor(message: string, context?: Partial<IErrorContext>) {\n super(message);\n this.name = this.constructor.name;\n this.diagnosticMessage = context?.diagnosticMessage;\n this.suggestedRecovery = context?.suggestedRecovery;\n }\n}\n\n// ── Provider Errors ──────────────────────────────────────────────────────\n\nexport class AuthenticationError extends AemeathError {\n readonly code = \"AEMEATH_PROVIDER_AUTH_001\" as const;\n readonly userMessage: string;\n\n constructor(provider: string, message?: string) {\n super(message ?? `Authentication failed for provider: ${provider}`);\n this.userMessage = `Authentication failed for ${provider}. Please re-login with: aemeathcli auth login ${provider}`;\n }\n}\n\nexport class RateLimitError extends AemeathError {\n readonly code = \"AEMEATH_PROVIDER_RATE_001\" as const;\n readonly userMessage: string;\n readonly retryAfterMs: number;\n\n constructor(provider: string, retryAfterMs: number) {\n super(`Rate limited by ${provider}`);\n this.retryAfterMs = retryAfterMs;\n this.userMessage = `Rate limited by ${provider}. Retry in ${Math.ceil(retryAfterMs / 1000)}s.`;\n this.suggestedRecovery = \"Wait and retry, or switch to a different provider.\";\n }\n}\n\nexport class ContextOverflowError extends AemeathError {\n readonly code = \"AEMEATH_PROVIDER_CTX_001\" as const;\n readonly userMessage: string;\n\n constructor(model: string, maxTokens: number, currentTokens: number) {\n super(`Context overflow for ${model}: ${currentTokens}/${maxTokens}`);\n this.userMessage = `Context window exceeded for ${model}. Use /compact to compress context.`;\n }\n}\n\nexport class ModelNotFoundError extends AemeathError {\n readonly code = \"AEMEATH_PROVIDER_MODEL_001\" as const;\n readonly userMessage: string;\n\n constructor(model: string) {\n super(`Model not found: ${model}`);\n this.userMessage = `Model \"${model}\" not found. Use /model list to see available models.`;\n }\n}\n\n// ── Config Errors ────────────────────────────────────────────────────────\n\nexport class MissingConfigError extends AemeathError {\n readonly code = \"AEMEATH_CONFIG_MISS_001\" as const;\n readonly userMessage: string;\n\n constructor(key: string) {\n super(`Missing configuration: ${key}`);\n this.userMessage = `Missing configuration \"${key}\". Run aemeathcli config to set up.`;\n }\n}\n\nexport class InvalidConfigError extends AemeathError {\n readonly code = \"AEMEATH_CONFIG_INVALID_001\" as const;\n readonly userMessage: string;\n\n constructor(key: string, reason: string) {\n super(`Invalid configuration for ${key}: ${reason}`);\n this.userMessage = `Invalid configuration \"${key}\": ${reason}`;\n }\n}\n\n// ── Tool Errors ──────────────────────────────────────────────────────────\n\nexport class FileNotFoundError extends AemeathError {\n readonly code = \"AEMEATH_TOOL_FILE_001\" as const;\n readonly userMessage: string;\n\n constructor(filePath: string) {\n super(`File not found: ${filePath}`);\n this.userMessage = `File not found: ${filePath}`;\n }\n}\n\nexport class PermissionDeniedError extends AemeathError {\n readonly code = \"AEMEATH_TOOL_PERM_001\" as const;\n readonly userMessage: string;\n\n constructor(operation: string, resource: string) {\n super(`Permission denied: ${operation} on ${resource}`);\n this.userMessage = `Permission denied for ${operation} on ${resource}. Check your permission mode.`;\n }\n}\n\nexport class ExecutionTimeoutError extends AemeathError {\n readonly code = \"AEMEATH_TOOL_TIMEOUT_001\" as const;\n readonly userMessage: string;\n\n constructor(command: string, timeoutMs: number) {\n super(`Execution timeout: ${command} after ${timeoutMs}ms`);\n this.userMessage = `Command timed out after ${Math.ceil(timeoutMs / 1000)}s.`;\n }\n}\n\n// ── Team Errors ──────────────────────────────────────────────────────────\n\nexport class AgentSpawnError extends AemeathError {\n readonly code = \"AEMEATH_TEAM_SPAWN_001\" as const;\n readonly userMessage: string;\n\n constructor(agentName: string, reason: string) {\n super(`Failed to spawn agent ${agentName}: ${reason}`);\n this.userMessage = `Failed to start agent \"${agentName}\": ${reason}`;\n }\n}\n\nexport class IPCError extends AemeathError {\n readonly code = \"AEMEATH_TEAM_IPC_001\" as const;\n readonly userMessage: string;\n\n constructor(message: string) {\n super(`IPC error: ${message}`);\n this.userMessage = `Inter-agent communication error: ${message}`;\n }\n}\n\n// ── MCP Errors ───────────────────────────────────────────────────────────\n\nexport class ServerConnectionError extends AemeathError {\n readonly code = \"AEMEATH_MCP_CONN_001\" as const;\n readonly userMessage: string;\n\n constructor(serverName: string, reason: string) {\n super(`MCP server connection failed: ${serverName} - ${reason}`);\n this.userMessage = `Cannot connect to MCP server \"${serverName}\": ${reason}`;\n }\n}\n\nexport class ToolCallError extends AemeathError {\n readonly code = \"AEMEATH_MCP_TOOL_001\" as const;\n readonly userMessage: string;\n\n constructor(toolName: string, reason: string) {\n super(`MCP tool call failed: ${toolName} - ${reason}`);\n this.userMessage = `Tool \"${toolName}\" failed: ${reason}`;\n }\n}\n\n// ── Discriminated Error Union ────────────────────────────────────────────\n\nexport type ProviderError =\n | AuthenticationError\n | RateLimitError\n | ContextOverflowError\n | ModelNotFoundError;\n\nexport type ConfigError =\n | MissingConfigError\n | InvalidConfigError;\n\nexport type ToolError =\n | FileNotFoundError\n | PermissionDeniedError\n | ExecutionTimeoutError;\n\nexport type TeamError =\n | AgentSpawnError\n | IPCError;\n\nexport type MCPError =\n | ServerConnectionError\n | ToolCallError;\n\nexport type AnyAemeathError =\n | ProviderError\n | ConfigError\n | ToolError\n | TeamError\n | MCPError;\n"]}
@@ -1,11 +1,11 @@
1
- import { CredentialStore } from './chunk-AQ23TYSQ.js';
2
- import './chunk-VJNQJALF.js';
3
- import './chunk-VBLLDY4R.js';
4
- import './chunk-2GKOK6T7.js';
5
- import { AuthenticationError } from './chunk-473JN6M5.js';
6
- import './chunk-62HSGYQD.js';
7
- import { logger } from './chunk-HEKFAKVH.js';
8
- import './chunk-BY4DAKUU.js';
1
+ import { CredentialStore } from './chunk-SNWPI6XJ.js';
2
+ import './chunk-YCCYXDW7.js';
3
+ import './chunk-OPWAFS6Y.js';
4
+ import { AuthenticationError } from './chunk-ZGOHARPV.js';
5
+ import './chunk-HCIHOHLX.js';
6
+ import './chunk-2Y7TR6BS.js';
7
+ import { logger } from './chunk-IR5HLBMH.js';
8
+ import './chunk-D275MCIH.js';
9
9
  import { createServer } from 'http';
10
10
  import { randomBytes, createHash } from 'crypto';
11
11
  import { execFile } from 'child_process';
@@ -320,5 +320,5 @@ var ClaudeLogin = class {
320
320
  };
321
321
 
322
322
  export { ClaudeLogin };
323
- //# sourceMappingURL=claude-login-IS5WTBMP.js.map
324
- //# sourceMappingURL=claude-login-IS5WTBMP.js.map
323
+ //# sourceMappingURL=claude-login-AIFIWTYF.js.map
324
+ //# sourceMappingURL=claude-login-AIFIWTYF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/auth/providers/claude-login.ts"],"names":["isExpired"],"mappings":"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","file":"claude-login-AIFIWTYF.js","sourcesContent":["/**\n * Claude Code OAuth 2.0 + PKCE login\n * Uses the same client ID as the official Claude Code CLI.\n * After login, stores tokens in our credential store AND writes to macOS Keychain\n * so credentials are shared with the official Claude Code CLI.\n */\n\nimport { createServer, type Server, type IncomingMessage, type ServerResponse } from \"node:http\";\nimport { randomBytes, createHash } from \"node:crypto\";\nimport { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport { URL } from \"node:url\";\nimport type { ICredential } from \"../../types/index.js\";\nimport { AuthenticationError } from \"../../types/index.js\";\nimport { CredentialStore } from \"../credential-store.js\";\nimport { logger } from \"../../utils/index.js\";\n\nconst execFileAsync = promisify(execFile);\n\n// ── Claude Code OAuth Config (same as official Claude Code CLI) ─────────\n\nconst CLIENT_ID = \"9d1c250a-e61b-44d9-88ed-5944d1962f5e\";\nconst AUTHORIZE_URL = \"https://claude.ai/oauth/authorize\";\nconst TOKEN_URL = \"https://platform.claude.com/v1/oauth/token\";\nconst SCOPE = \"user:inference\";\nconst CALLBACK_TIMEOUT_MS = 300_000;\nconst LOCALHOST = \"localhost\";\n\n// ── Also try reading from official Claude Code CLI's keychain ───────────\n\nconst KEYCHAIN_SERVICE = \"Claude Code-credentials\";\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.length > 0 ? value : undefined;\n}\n\nfunction asDate(value: unknown): Date | undefined {\n if (value instanceof Date) {\n return Number.isNaN(value.getTime()) ? undefined : value;\n }\n\n if (typeof value === \"number\" && Number.isFinite(value)) {\n const millis = value > 10_000_000_000 ? value : value * 1000;\n const date = new Date(millis);\n return Number.isNaN(date.getTime()) ? undefined : date;\n }\n\n if (typeof value === \"string\" && value.length > 0) {\n const numeric = Number(value);\n if (Number.isFinite(numeric) && value.trim() !== \"\") {\n return asDate(numeric);\n }\n\n const parsed = new Date(value);\n return Number.isNaN(parsed.getTime()) ? undefined : parsed;\n }\n\n return undefined;\n}\n\nfunction parseKeychainCredential(raw: string): ICredential | undefined {\n if (raw.length === 0) {\n return undefined;\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw) as unknown;\n } catch {\n return undefined;\n }\n\n if (!isRecord(parsed)) {\n return undefined;\n }\n\n const directPayload = parsed;\n const nestedPayload = isRecord(parsed[\"claudeAiOauth\"])\n ? parsed[\"claudeAiOauth\"]\n : undefined;\n const payloads = nestedPayload ? [nestedPayload, directPayload] : [directPayload];\n\n for (const payload of payloads) {\n const accessToken = asString(payload[\"accessToken\"]) ?? asString(payload[\"access_token\"]);\n if (!accessToken) {\n continue;\n }\n\n const refreshToken = asString(payload[\"refreshToken\"]) ?? asString(payload[\"refresh_token\"]);\n const expiresAt = asDate(payload[\"expiresAt\"] ?? payload[\"expires_at\"]);\n const email = asString(payload[\"email\"]);\n const plan = asString(payload[\"plan\"])\n ?? asString(payload[\"subscriptionType\"])\n ?? asString(payload[\"subscription_type\"])\n ?? asString(payload[\"rateLimitTier\"])\n ?? asString(payload[\"rate_limit_tier\"]);\n\n return {\n provider: \"anthropic\",\n method: \"native_login\",\n token: accessToken,\n ...(refreshToken !== undefined ? { refreshToken } : {}),\n ...(expiresAt !== undefined ? { expiresAt } : {}),\n ...(email !== undefined ? { email } : {}),\n ...(plan !== undefined ? { plan } : {}),\n };\n }\n\n return undefined;\n}\n\nasync function readKeychainCredential(): Promise<ICredential | undefined> {\n if (process.platform !== \"darwin\") return undefined;\n\n try {\n const { stdout } = await execFileAsync(\"security\", [\n \"find-generic-password\", \"-s\", KEYCHAIN_SERVICE, \"-w\",\n ], { timeout: 5000 });\n\n return parseKeychainCredential(stdout.trim());\n } catch {\n return undefined;\n }\n}\n\n// ── PKCE Helpers ────────────────────────────────────────────────────────\n\nfunction generateCodeVerifier(): string {\n return randomBytes(32).toString(\"base64url\");\n}\n\nfunction generateCodeChallenge(verifier: string): string {\n return createHash(\"sha256\").update(verifier).digest(\"base64url\");\n}\n\nfunction generateState(): string {\n return randomBytes(16).toString(\"hex\");\n}\n\n// ── HTML Responses ──────────────────────────────────────────────────────\n\nfunction escapeHtml(unsafe: string): string {\n return unsafe\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&#039;\");\n}\n\nfunction successHtml(): string {\n return `<!DOCTYPE html>\n<html><head><title>AemeathCLI — Login Successful</title></head>\n<body style=\"font-family:system-ui;text-align:center;padding:40px\">\n<h1>Login Successful</h1>\n<p>You can close this window and return to your terminal.</p>\n</body></html>`;\n}\n\nfunction errorHtml(message: string): string {\n return `<!DOCTYPE html>\n<html><head><title>AemeathCLI — Login Failed</title></head>\n<body style=\"font-family:system-ui;text-align:center;padding:40px\">\n<h1>Login Failed</h1>\n<p>${escapeHtml(message)}</p>\n</body></html>`;\n}\n\n// ── ClaudeLogin Class ───────────────────────────────────────────────────\n\nexport class ClaudeLogin {\n private readonly credentialStore: CredentialStore;\n private callbackServer: Server | undefined;\n\n constructor(store?: CredentialStore) {\n this.credentialStore = store ?? new CredentialStore();\n }\n\n /**\n * Run browser-based OAuth 2.0 + PKCE login using the same client ID\n * as the official Claude Code CLI. Browser opens automatically.\n */\n async login(): Promise<ICredential> {\n // First try importing existing credentials from Claude Code's keychain\n const existing = await readKeychainCredential();\n if (existing && existing.token) {\n const isExpired = existing.expiresAt ? new Date() > existing.expiresAt : false;\n if (!isExpired) {\n logger.info(\"Imported existing Claude Code credentials from keychain\");\n await this.credentialStore.set(\"anthropic\", existing);\n return existing;\n }\n }\n\n // Run the OAuth flow — browser opens automatically\n const codeVerifier = generateCodeVerifier();\n const codeChallenge = generateCodeChallenge(codeVerifier);\n const state = generateState();\n\n const { port, server } = await this.startCallbackServer();\n this.callbackServer = server;\n\n const redirectUri = `http://${LOCALHOST}:${port}/callback`;\n\n const authUrl = new URL(AUTHORIZE_URL);\n authUrl.searchParams.set(\"code\", \"true\");\n authUrl.searchParams.set(\"client_id\", CLIENT_ID);\n authUrl.searchParams.set(\"response_type\", \"code\");\n authUrl.searchParams.set(\"redirect_uri\", redirectUri);\n authUrl.searchParams.set(\"scope\", SCOPE);\n authUrl.searchParams.set(\"code_challenge\", codeChallenge);\n authUrl.searchParams.set(\"code_challenge_method\", \"S256\");\n authUrl.searchParams.set(\"state\", state);\n\n logger.info(\"Opening browser for Claude OAuth login\");\n\n try {\n const openModule = await import(\"open\");\n await openModule.default(authUrl.toString());\n } catch {\n this.stopServer();\n throw new AuthenticationError(\"anthropic\", \"Failed to open browser for login\");\n }\n\n try {\n const code = await this.waitForCallback(state);\n const credential = await this.exchangeCodeForToken(code, codeVerifier, redirectUri, state);\n\n await this.credentialStore.set(\"anthropic\", credential);\n logger.info(\"Claude OAuth login successful\");\n\n return credential;\n } finally {\n this.stopServer();\n }\n }\n\n async logout(): Promise<void> {\n await this.credentialStore.delete(\"anthropic\");\n logger.info(\"Claude session revoked\");\n }\n\n async isLoggedIn(): Promise<boolean> {\n const credential = await this.getCachedCredential();\n return credential !== undefined;\n }\n\n async getStatus(): Promise<{ loggedIn: boolean; email?: string | undefined; plan?: string | undefined }> {\n const loggedIn = await this.isLoggedIn();\n if (!loggedIn) return { loggedIn: false };\n\n const credential = await this.credentialStore.get(\"anthropic\");\n if (!credential) return { loggedIn: false };\n\n return {\n loggedIn: true,\n ...(credential.email !== undefined ? { email: credential.email } : {}),\n ...(credential.plan !== undefined ? { plan: credential.plan } : {}),\n };\n }\n\n async getCachedCredential(): Promise<ICredential | undefined> {\n const existing = await this.credentialStore.get(\"anthropic\");\n if (existing?.method === \"native_login\" && existing.token) {\n const isExpired = existing.expiresAt ? new Date() > existing.expiresAt : false;\n if (!isExpired) {\n return existing;\n }\n }\n\n const keychain = await readKeychainCredential();\n if (!keychain?.token) {\n return undefined;\n }\n\n const isExpired = keychain.expiresAt ? new Date() > keychain.expiresAt : false;\n if (isExpired) {\n return undefined;\n }\n\n await this.credentialStore.set(\"anthropic\", keychain);\n return keychain;\n }\n\n // ── Internal ──────────────────────────────────────────────────────────\n\n private startCallbackServer(): Promise<{ port: number; server: Server }> {\n return new Promise((resolve, reject) => {\n const server = createServer();\n server.listen(0, LOCALHOST, () => {\n const address = server.address();\n if (address === null || typeof address === \"string\") {\n server.close();\n reject(new Error(\"Failed to bind callback server\"));\n return;\n }\n resolve({ port: address.port, server });\n });\n server.on(\"error\", reject);\n });\n }\n\n private waitForCallback(expectedState: string): Promise<string> {\n return new Promise((resolve, reject) => {\n const server = this.callbackServer;\n if (server === undefined) {\n reject(new AuthenticationError(\"anthropic\", \"Callback server not started\"));\n return;\n }\n\n const timeout = setTimeout(() => {\n reject(new AuthenticationError(\"anthropic\", \"Login timed out\"));\n }, CALLBACK_TIMEOUT_MS);\n\n server.on(\"request\", (req: IncomingMessage, res: ServerResponse) => {\n const requestUrl = new URL(req.url ?? \"/\", `http://${LOCALHOST}`);\n if (requestUrl.pathname !== \"/callback\") {\n res.writeHead(404);\n res.end(\"Not found\");\n return;\n }\n\n clearTimeout(timeout);\n\n const code = requestUrl.searchParams.get(\"code\");\n const state = requestUrl.searchParams.get(\"state\");\n const error = requestUrl.searchParams.get(\"error\");\n\n if (error) {\n res.writeHead(400, { \"Content-Type\": \"text/html\" });\n res.end(errorHtml(`OAuth error: ${error}`));\n reject(new AuthenticationError(\"anthropic\", `OAuth error: ${error}`));\n return;\n }\n\n if (state !== expectedState) {\n res.writeHead(400, { \"Content-Type\": \"text/html\" });\n res.end(errorHtml(\"State mismatch\"));\n reject(new AuthenticationError(\"anthropic\", \"OAuth state mismatch\"));\n return;\n }\n\n if (!code) {\n res.writeHead(400, { \"Content-Type\": \"text/html\" });\n res.end(errorHtml(\"Missing authorization code\"));\n reject(new AuthenticationError(\"anthropic\", \"No authorization code received\"));\n return;\n }\n\n res.writeHead(200, { \"Content-Type\": \"text/html\" });\n res.end(successHtml());\n resolve(code);\n });\n });\n }\n\n private async exchangeCodeForToken(\n code: string,\n codeVerifier: string,\n redirectUri: string,\n state: string,\n ): Promise<ICredential> {\n const body = {\n grant_type: \"authorization_code\",\n code,\n redirect_uri: redirectUri,\n client_id: CLIENT_ID,\n code_verifier: codeVerifier,\n state,\n };\n\n const response = await fetch(TOKEN_URL, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new AuthenticationError(\"anthropic\", `Token exchange failed: ${response.status} ${text}`);\n }\n\n const data = (await response.json()) as {\n access_token?: string;\n refresh_token?: string;\n expires_in?: number;\n email?: string;\n plan?: string;\n };\n\n if (!data.access_token) {\n throw new AuthenticationError(\"anthropic\", \"Token exchange returned no access_token\");\n }\n\n const expiresAt = data.expires_in\n ? new Date(Date.now() + data.expires_in * 1000)\n : undefined;\n\n return {\n provider: \"anthropic\",\n method: \"native_login\",\n token: data.access_token,\n ...(data.refresh_token !== undefined ? { refreshToken: data.refresh_token } : {}),\n ...(expiresAt !== undefined ? { expiresAt } : {}),\n ...(data.email !== undefined ? { email: data.email } : {}),\n ...(data.plan !== undefined ? { plan: data.plan } : {}),\n };\n }\n\n private stopServer(): void {\n if (this.callbackServer !== undefined) {\n this.callbackServer.close();\n this.callbackServer = undefined;\n }\n }\n}\n"]}
package/dist/cli.js CHANGED
@@ -1,19 +1,19 @@
1
1
  #!/usr/bin/env node
2
- import { LOGIN_PROVIDERS, getAuthStatusRecord, formatDetailedAuthStatusLine } from './chunk-OCJPQFOR.js';
3
- import { createModelRouter } from './chunk-GU33WKPG.js';
4
- import { createDefaultRegistry } from './chunk-P66WDACW.js';
5
- import { ConfigStore } from './chunk-5XFSV6PF.js';
6
- import './chunk-CC7MGWYY.js';
7
- import './chunk-H2SYKIMI.js';
8
- import './chunk-6GUD7QIM.js';
9
- import './chunk-AQ23TYSQ.js';
10
- import './chunk-VJNQJALF.js';
11
- import './chunk-VBLLDY4R.js';
12
- import { PACKAGE_VERSION } from './chunk-2GKOK6T7.js';
13
- import './chunk-473JN6M5.js';
14
- import './chunk-62HSGYQD.js';
15
- import './chunk-HEKFAKVH.js';
16
- import './chunk-BY4DAKUU.js';
2
+ import { LOGIN_PROVIDERS, getAuthStatusRecord, formatDetailedAuthStatusLine } from './chunk-36RXCZOV.js';
3
+ import { createModelRouter } from './chunk-YPQ2MLAV.js';
4
+ import './chunk-7EBLXPL4.js';
5
+ import { createDefaultRegistry } from './chunk-2KMA5RBC.js';
6
+ import { ConfigStore } from './chunk-WXIN65UG.js';
7
+ import './chunk-M3FPQSRU.js';
8
+ import './chunk-HESQLCLU.js';
9
+ import './chunk-SNWPI6XJ.js';
10
+ import './chunk-YCCYXDW7.js';
11
+ import './chunk-OPWAFS6Y.js';
12
+ import './chunk-ZGOHARPV.js';
13
+ import './chunk-HCIHOHLX.js';
14
+ import { PACKAGE_VERSION } from './chunk-2Y7TR6BS.js';
15
+ import './chunk-IR5HLBMH.js';
16
+ import './chunk-D275MCIH.js';
17
17
  import { Command } from 'commander';
18
18
  import pc2 from 'picocolors';
19
19
  import { randomUUID } from 'crypto';
@@ -43,14 +43,14 @@ function parseRole(role) {
43
43
  throw new Error(`Unknown role "${role}". Valid roles: ${VALID_ROLES.join(", ")}`);
44
44
  }
45
45
  async function ensureInteractiveConfig() {
46
- const { ensureDefaultConfig, hasGlobalConfig } = await import('./first-run-GDEVRFPO.js');
46
+ const { ensureDefaultConfig, hasGlobalConfig } = await import('./first-run-ADROZVYF.js');
47
47
  if (!hasGlobalConfig()) {
48
48
  ensureDefaultConfig();
49
49
  }
50
50
  }
51
51
  async function startInteractiveChat(options) {
52
52
  await ensureInteractiveConfig();
53
- const { startChatSession } = await import('./App-YAHJUWCX.js');
53
+ const { startChatSession } = await import('./App-NT6MRKQJ.js');
54
54
  await startChatSession({
55
55
  ...options.initialMessage !== void 0 ? { initialMessage: options.initialMessage } : {},
56
56
  ...options.model !== void 0 ? { model: options.model } : {},
@@ -187,7 +187,7 @@ function createConfigCommand() {
187
187
  const config = new Command("config").description("Configuration management");
188
188
  config.command("get [key]").description("Get configuration value (or all if no key)").action(async (key) => {
189
189
  try {
190
- const { ConfigStore: ConfigStore2 } = await import('./config-store-POB6I37G.js');
190
+ const { ConfigStore: ConfigStore2 } = await import('./config-store-NF56VHFU.js');
191
191
  const store = new ConfigStore2();
192
192
  const cfg = store.loadGlobal();
193
193
  if (key) {
@@ -212,7 +212,7 @@ function createConfigCommand() {
212
212
  });
213
213
  config.command("set <key> <value>").description("Set a configuration value").action(async (key, value) => {
214
214
  try {
215
- const { ConfigStore: ConfigStore2 } = await import('./config-store-POB6I37G.js');
215
+ const { ConfigStore: ConfigStore2 } = await import('./config-store-NF56VHFU.js');
216
216
  const store = new ConfigStore2();
217
217
  const cfg = store.loadGlobal();
218
218
  let parsedValue;
@@ -234,7 +234,7 @@ function createConfigCommand() {
234
234
  });
235
235
  config.command("init").description("Initialize configuration with interactive setup").option("--defaults", "Write default configuration without interactive prompts").option("--force", "Overwrite or recreate the global configuration").action(async (options) => {
236
236
  try {
237
- const { runFirstRunSetup } = await import('./first-run-GDEVRFPO.js');
237
+ const { runFirstRunSetup } = await import('./first-run-ADROZVYF.js');
238
238
  await runFirstRunSetup({
239
239
  ...options.defaults !== void 0 ? { defaults: options.defaults } : {},
240
240
  ...options.force !== void 0 ? { force: options.force } : {}
@@ -247,7 +247,7 @@ function createConfigCommand() {
247
247
  }
248
248
  });
249
249
  config.command("path").description("Show the active global configuration path").action(async () => {
250
- const { getConfigPath } = await import('./pathResolver-A6IXQQFE.js');
250
+ const { getConfigPath } = await import('./pathResolver-UVAB2FCW.js');
251
251
  process.stdout.write(`${getConfigPath()}
252
252
  `);
253
253
  });
@@ -440,7 +440,7 @@ function createAuthCommand() {
440
440
  return;
441
441
  }
442
442
  try {
443
- const { ApiKeyFallback } = await import('./api-key-fallback-UN3TJEOO.js');
443
+ const { ApiKeyFallback } = await import('./api-key-fallback-RJLPM3KH.js');
444
444
  const fallback = new ApiKeyFallback();
445
445
  const providerMap = {
446
446
  claude: "anthropic",
@@ -474,7 +474,7 @@ function createAuthCommand() {
474
474
  }
475
475
  try {
476
476
  const target = PROVIDER_MODEL_SWITCH[provider];
477
- const { ConfigStore: ConfigStore2 } = await import('./config-store-POB6I37G.js');
477
+ const { ConfigStore: ConfigStore2 } = await import('./config-store-NF56VHFU.js');
478
478
  const store = new ConfigStore2();
479
479
  const cfg = store.loadGlobal();
480
480
  const nextConfig = {
@@ -505,19 +505,19 @@ function createAuthCommand() {
505
505
  async function loadLoginModule(provider) {
506
506
  switch (provider) {
507
507
  case "claude": {
508
- const mod = await import('./claude-login-IS5WTBMP.js');
508
+ const mod = await import('./claude-login-AIFIWTYF.js');
509
509
  return new mod.ClaudeLogin();
510
510
  }
511
511
  case "codex": {
512
- const mod = await import('./codex-login-GMPF64MR.js');
512
+ const mod = await import('./codex-login-LW5X7GAM.js');
513
513
  return new mod.CodexLogin();
514
514
  }
515
515
  case "gemini": {
516
- const mod = await import('./gemini-login-KE224MSW.js');
516
+ const mod = await import('./gemini-login-TST454MX.js');
517
517
  return new mod.GeminiLogin();
518
518
  }
519
519
  case "kimi": {
520
- const mod = await import('./kimi-login-DNT5YBKX.js');
520
+ const mod = await import('./kimi-login-3IGVOBJI.js');
521
521
  return new mod.KimiLogin();
522
522
  }
523
523
  }
@@ -525,7 +525,7 @@ async function loadLoginModule(provider) {
525
525
  function createInstallCommand() {
526
526
  return new Command("install").description("Install an agent profile from a file or URL").argument("<source>", "Path to .md profile file or URL").action(async (source) => {
527
527
  try {
528
- const { ProfileLoader } = await import('./profile-loader-TNAXBLDX.js');
528
+ const { ProfileLoader } = await import('./profile-loader-EMLV4J7S.js');
529
529
  const loader = new ProfileLoader();
530
530
  const name = await loader.install(source);
531
531
  process.stdout.write(`${pc2.green(`Profile "${name}" installed successfully.`)}
@@ -625,7 +625,7 @@ async function maybeRunAgentMode(args) {
625
625
  let registryPromise;
626
626
  function getRegistry() {
627
627
  if (!registryPromise) {
628
- registryPromise = import('./registry-3NHVCXCZ.js').then(
628
+ registryPromise = import('./registry-MVNSXCEF.js').then(
629
629
  ({ createDefaultRegistry: createDefaultRegistry2 }) => createDefaultRegistry2({ preferSdk: true })
630
630
  );
631
631
  }
@@ -634,7 +634,7 @@ async function maybeRunAgentMode(args) {
634
634
  let toolRegistryPromise;
635
635
  function getToolRegistry() {
636
636
  if (!toolRegistryPromise) {
637
- toolRegistryPromise = import('./tools-I6XCTEZY.js').then(
637
+ toolRegistryPromise = import('./tools-KWFSYT56.js').then(
638
638
  ({ createDefaultRegistry: createToolReg }) => createToolReg(toolContext)
639
639
  );
640
640
  }