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
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/providers/kimi-adapter.ts"],"names":[],"mappings":"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","file":"chunk-YPFOE2QJ.js","sourcesContent":["/**\r\n * Kimi (Moonshot) adapter — custom HTTP per PRD section 7.1\r\n * Uses OpenAI-compatible API format via fetch().\r\n * Supports Kimi Code (kimi-for-coding)\r\n */\r\n\r\nimport { logger } from \"../utils/logger.js\";\r\nimport {\r\n AuthenticationError,\r\n RateLimitError,\r\n ModelNotFoundError,\r\n} from \"../types/errors.js\";\r\nimport { SUPPORTED_MODELS } from \"../types/model.js\";\r\nimport type { IModelInfo, ProviderName } from \"../types/model.js\";\r\nimport type {\r\n IChatRequest,\r\n IChatResponse,\r\n IChatMessage,\r\n IStreamChunk,\r\n IToolCall,\r\n IToolDefinition,\r\n ITokenUsage,\r\n} from \"../types/message.js\";\r\nimport type { IModelProvider, IProviderOptions } from \"./types.js\";\r\n\r\nconst PROVIDER_NAME: ProviderName = \"kimi\";\r\nconst DEFAULT_BASE_URL = \"https://api.moonshot.cn/v1\";\r\n\r\nconst KIMI_MODELS: readonly string[] = [\"kimi-for-coding\"] as const;\r\nconst CHARS_PER_TOKEN_ESTIMATE = 4;\r\n\r\ninterface OpenAIStandardMessage {\r\n role: \"system\" | \"user\" | \"assistant\";\r\n content: string | null;\r\n tool_calls?: readonly OpenAIToolCallRef[] | undefined;\r\n}\r\ninterface OpenAIToolResultMessage {\r\n role: \"tool\";\r\n content: string;\r\n tool_call_id: string;\r\n name: string;\r\n}\r\ntype OpenAIMessage = OpenAIStandardMessage | OpenAIToolResultMessage;\r\ninterface OpenAITool { type: \"function\"; function: { name: string; description: string; parameters: Record<string, unknown> } }\r\ninterface OpenAIToolCallRef { id: string; type: string; function: { name: string; arguments: string } }\r\ninterface OpenAIChoice {\r\n index: number;\r\n message: { role: string; content: string | null; tool_calls?: readonly OpenAIToolCallRef[] };\r\n finish_reason: string;\r\n}\r\ninterface OpenAIUsage { prompt_tokens: number; completion_tokens: number; total_tokens: number }\r\ninterface OpenAIChatResponse { id: string; choices: OpenAIChoice[]; usage: OpenAIUsage }\r\n\r\nfunction convertMessages(messages: readonly IChatMessage[]): OpenAIMessage[] {\r\n const converted: OpenAIMessage[] = [];\r\n\r\n for (const msg of messages) {\r\n if (msg.role === \"assistant\" && msg.toolCalls !== undefined && msg.toolCalls.length > 0) {\r\n converted.push({\r\n role: \"assistant\" as const,\r\n content: msg.content.length > 0 ? msg.content : null,\r\n tool_calls: msg.toolCalls.map((toolCall) => ({\r\n id: toolCall.id,\r\n type: \"function\",\r\n function: {\r\n name: toolCall.name,\r\n arguments: JSON.stringify(toolCall.arguments),\r\n },\r\n })),\r\n });\r\n continue;\r\n }\r\n\r\n if (msg.role === \"tool\") {\r\n const toolCall = msg.toolCalls?.[0];\r\n if (toolCall !== undefined) {\r\n converted.push({\r\n role: \"tool\" as const,\r\n content: msg.content,\r\n tool_call_id: toolCall.id,\r\n name: toolCall.name,\r\n });\r\n continue;\r\n }\r\n }\r\n\r\n converted.push({\r\n role: msg.role as \"system\" | \"user\" | \"assistant\",\r\n content: msg.content,\r\n });\r\n }\r\n\r\n return converted;\r\n}\r\n\r\nfunction convertTools(tools: readonly IToolDefinition[] | undefined): OpenAITool[] | undefined {\r\n if (tools === undefined || tools.length === 0) {\r\n return undefined;\r\n }\r\n return tools.map((tool) => {\r\n const properties: Record<string, unknown> = {};\r\n const required: string[] = [];\r\n for (const param of tool.parameters) {\r\n const prop: Record<string, unknown> = {\r\n type: param.type,\r\n description: param.description,\r\n };\r\n if (param.enum !== undefined) {\r\n prop[\"enum\"] = param.enum;\r\n }\r\n properties[param.name] = prop;\r\n if (param.required) {\r\n required.push(param.name);\r\n }\r\n }\r\n return {\r\n type: \"function\" as const,\r\n function: {\r\n name: tool.name,\r\n description: tool.description,\r\n parameters: { type: \"object\", properties, required },\r\n },\r\n };\r\n });\r\n}\r\n\r\nfunction computeCost(modelInfo: IModelInfo, inputTokens: number, outputTokens: number): number {\r\n return (\r\n (inputTokens / 1_000_000) * modelInfo.inputPricePerMToken +\r\n (outputTokens / 1_000_000) * modelInfo.outputPricePerMToken\r\n );\r\n}\r\n\r\nasync function handleResponseError(response: Response, model: string): Promise<never> {\r\n const body = await response.text();\r\n if (response.status === 401 || response.status === 403) {\r\n throw new AuthenticationError(PROVIDER_NAME, body);\r\n }\r\n if (response.status === 429) {\r\n const retryHeader = response.headers.get(\"retry-after\");\r\n const retryMs = retryHeader !== null ? parseInt(retryHeader, 10) * 1000 : 60_000;\r\n throw new RateLimitError(PROVIDER_NAME, retryMs);\r\n }\r\n if (response.status === 404) {\r\n throw new ModelNotFoundError(model);\r\n }\r\n throw new Error(`Kimi API error (${response.status}): ${body}`);\r\n}\r\n\r\nexport class KimiAdapter implements IModelProvider {\r\n readonly name = PROVIDER_NAME;\r\n readonly supportedModels = KIMI_MODELS;\r\n readonly supportsToolCalling = true;\r\n\r\n private readonly baseUrl: string;\r\n private readonly apiKey: string;\r\n\r\n constructor(options?: IProviderOptions) {\r\n this.baseUrl = options?.baseUrl ?? DEFAULT_BASE_URL;\r\n this.apiKey = options?.apiKey ?? process.env[\"MOONSHOT_API_KEY\"] ?? \"\";\r\n }\r\n\r\n async chat(request: IChatRequest): Promise<IChatResponse> {\r\n const modelInfo = this.getModelInfo(request.model);\r\n const messages = convertMessages(request.messages);\r\n const tools = convertTools(request.tools);\r\n\r\n if (request.system !== undefined) {\r\n messages.unshift({ role: \"system\", content: request.system });\r\n }\r\n\r\n const body: Record<string, unknown> = {\r\n model: request.model,\r\n messages,\r\n max_tokens: request.maxTokens ?? modelInfo.maxOutputTokens,\r\n stream: false,\r\n };\r\n if (request.temperature !== undefined) {\r\n body[\"temperature\"] = request.temperature;\r\n }\r\n if (tools !== undefined) {\r\n body[\"tools\"] = tools;\r\n }\r\n\r\n const response = await fetch(`${this.baseUrl}/chat/completions`, {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n Authorization: `Bearer ${this.apiKey}`,\r\n },\r\n body: JSON.stringify(body),\r\n });\r\n\r\n if (!response.ok) {\r\n await handleResponseError(response, request.model);\r\n }\r\n\r\n const data = (await response.json()) as OpenAIChatResponse;\r\n const choice = data.choices[0];\r\n if (choice === undefined) {\r\n throw new Error(\"Kimi API returned empty choices\");\r\n }\r\n\r\n const toolCalls = extractToolCalls(choice);\r\n const inputTokens = data.usage.prompt_tokens;\r\n const outputTokens = data.usage.completion_tokens;\r\n\r\n const usage: ITokenUsage = {\r\n inputTokens,\r\n outputTokens,\r\n totalTokens: inputTokens + outputTokens,\r\n costUsd: computeCost(modelInfo, inputTokens, outputTokens),\r\n };\r\n\r\n const responseMessage: IChatMessage = {\r\n id: data.id,\r\n role: \"assistant\",\r\n content: choice.message.content ?? \"\",\r\n model: request.model,\r\n provider: PROVIDER_NAME,\r\n toolCalls: toolCalls.length > 0 ? toolCalls : undefined,\r\n tokenUsage: usage,\r\n createdAt: new Date(),\r\n };\r\n\r\n return {\r\n id: data.id,\r\n model: request.model,\r\n provider: PROVIDER_NAME,\r\n message: responseMessage,\r\n usage,\r\n finishReason: mapFinishReason(choice.finish_reason),\r\n };\r\n }\r\n\r\n async *stream(request: IChatRequest): AsyncIterable<IStreamChunk> {\r\n const modelInfo = this.getModelInfo(request.model);\r\n const messages = convertMessages(request.messages);\r\n const tools = convertTools(request.tools);\r\n\r\n if (request.system !== undefined) {\r\n messages.unshift({ role: \"system\", content: request.system });\r\n }\r\n\r\n const body: Record<string, unknown> = {\r\n model: request.model,\r\n messages,\r\n max_tokens: request.maxTokens ?? modelInfo.maxOutputTokens,\r\n stream: true,\r\n };\r\n if (request.temperature !== undefined) {\r\n body[\"temperature\"] = request.temperature;\r\n }\r\n if (tools !== undefined) {\r\n body[\"tools\"] = tools;\r\n }\r\n\r\n const response = await fetch(`${this.baseUrl}/chat/completions`, {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n Authorization: `Bearer ${this.apiKey}`,\r\n },\r\n body: JSON.stringify(body),\r\n });\r\n\r\n if (!response.ok) {\r\n await handleResponseError(response, request.model);\r\n }\r\n\r\n if (response.body === null) {\r\n yield { type: \"error\", error: \"Kimi API returned empty stream body\" };\r\n yield { type: \"done\" };\r\n return;\r\n }\r\n\r\n try {\r\n yield* this.parseSSEStream(response.body, modelInfo);\r\n yield { type: \"done\" };\r\n } catch (error: unknown) {\r\n const errMsg = error instanceof Error ? error.message : String(error);\r\n logger.error({ error: errMsg, model: request.model }, \"Kimi stream error\");\r\n yield { type: \"error\", error: errMsg };\r\n yield { type: \"done\" };\r\n }\r\n }\r\n\r\n countTokens(text: string, _model: string): Promise<number> {\r\n return Promise.resolve(Math.ceil(text.length / CHARS_PER_TOKEN_ESTIMATE));\r\n }\r\n\r\n getModelInfo(model: string): IModelInfo {\r\n const info = SUPPORTED_MODELS[model];\r\n if (info === undefined || info.provider !== PROVIDER_NAME) {\r\n throw new ModelNotFoundError(model);\r\n }\r\n return info;\r\n }\r\n\r\n async listAvailableModels(): Promise<readonly string[]> {\r\n if (!this.apiKey) return [...this.supportedModels];\r\n\r\n try {\r\n const response = await fetch(`${this.baseUrl}/models`, {\r\n headers: { Authorization: `Bearer ${this.apiKey}` },\r\n signal: AbortSignal.timeout(5000),\r\n });\r\n if (!response.ok) return [...this.supportedModels];\r\n\r\n const data = (await response.json()) as { data: Array<{ id: string }> };\r\n const models = data.data.map((m) => m.id).sort();\r\n return models.length > 0 ? models : [...this.supportedModels];\r\n } catch {\r\n return [...this.supportedModels];\r\n }\r\n }\r\n\r\n private async *parseSSEStream(\r\n body: ReadableStream<Uint8Array>,\r\n modelInfo: IModelInfo,\r\n ): AsyncIterable<IStreamChunk> {\r\n const reader = body.getReader();\r\n const decoder = new TextDecoder();\r\n let buffer = \"\";\r\n\r\n try {\r\n for (;;) {\r\n const { done, value } = await reader.read();\r\n if (done) {\r\n break;\r\n }\r\n\r\n buffer += decoder.decode(value, { stream: true });\r\n const lines = buffer.split(\"\\n\");\r\n buffer = lines.pop() ?? \"\";\r\n\r\n for (const line of lines) {\r\n const trimmed = line.trim();\r\n if (trimmed === \"\" || trimmed === \"data: [DONE]\") {\r\n continue;\r\n }\r\n if (!trimmed.startsWith(\"data: \")) {\r\n continue;\r\n }\r\n\r\n const jsonStr = trimmed.slice(6);\r\n let parsed: {\r\n choices?: Array<{\r\n delta?: {\r\n content?: string;\r\n tool_calls?: Array<{\r\n id?: string;\r\n function?: { name?: string; arguments?: string };\r\n }>;\r\n };\r\n }>;\r\n usage?: OpenAIUsage;\r\n };\r\n\r\n try {\r\n parsed = JSON.parse(jsonStr) as typeof parsed;\r\n } catch {\r\n continue;\r\n }\r\n\r\n const delta = parsed.choices?.[0]?.delta;\r\n if (delta?.content !== undefined && delta.content !== \"\") {\r\n yield { type: \"text\", content: delta.content };\r\n }\r\n\r\n if (delta?.tool_calls !== undefined) {\r\n for (const tc of delta.tool_calls) {\r\n if (tc.id !== undefined && tc.function?.name !== undefined) {\r\n let args: Record<string, unknown> = {};\r\n if (tc.function.arguments !== undefined) {\r\n try {\r\n args = JSON.parse(tc.function.arguments) as Record<string, unknown>;\r\n } catch {\r\n args = {};\r\n }\r\n }\r\n const toolCall: IToolCall = {\r\n id: tc.id,\r\n name: tc.function.name,\r\n arguments: args,\r\n };\r\n yield { type: \"tool_call\", toolCall };\r\n }\r\n }\r\n }\r\n\r\n if (parsed.usage !== undefined) {\r\n const inTok = parsed.usage.prompt_tokens;\r\n const outTok = parsed.usage.completion_tokens;\r\n yield {\r\n type: \"usage\",\r\n usage: {\r\n inputTokens: inTok,\r\n outputTokens: outTok,\r\n totalTokens: inTok + outTok,\r\n costUsd: computeCost(modelInfo, inTok, outTok),\r\n },\r\n };\r\n }\r\n }\r\n }\r\n } finally {\r\n reader.releaseLock();\r\n }\r\n }\r\n}\r\n\r\nfunction extractToolCalls(choice: OpenAIChoice): IToolCall[] {\r\n if (choice.message.tool_calls === undefined || choice.message.tool_calls.length === 0) {\r\n return [];\r\n }\r\n return choice.message.tool_calls.map((tc) => {\r\n let args: Record<string, unknown> = {};\r\n try {\r\n args = JSON.parse(tc.function.arguments) as Record<string, unknown>;\r\n } catch {\r\n args = {};\r\n }\r\n return {\r\n id: tc.id,\r\n name: tc.function.name,\r\n arguments: args,\r\n };\r\n });\r\n}\r\n\r\nfunction mapFinishReason(\r\n reason: string,\r\n): \"stop\" | \"tool_calls\" | \"max_tokens\" | \"error\" {\r\n switch (reason) {\r\n case \"stop\":\r\n return \"stop\";\r\n case \"tool_calls\":\r\n return \"tool_calls\";\r\n case \"length\":\r\n return \"max_tokens\";\r\n default:\r\n return \"stop\";\r\n }\r\n}\r\n"]}
@@ -1,7 +0,0 @@
1
- export { ClaudeAdapter } from './chunk-CTFZTARK.js';
2
- import './chunk-ODBY7S4X.js';
3
- import './chunk-473JN6M5.js';
4
- import './chunk-62HSGYQD.js';
5
- import './chunk-HEKFAKVH.js';
6
- //# sourceMappingURL=claude-adapter-6P4SJH7P.js.map
7
- //# sourceMappingURL=claude-adapter-6P4SJH7P.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"claude-adapter-6P4SJH7P.js"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/auth/providers/claude-login.ts"],"names":["isExpired"],"mappings":"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","file":"claude-login-IS5WTBMP.js","sourcesContent":["/**\r\n * Claude Code OAuth 2.0 + PKCE login\r\n * Uses the same client ID as the official Claude Code CLI.\r\n * After login, stores tokens in our credential store AND writes to macOS Keychain\r\n * so credentials are shared with the official Claude Code CLI.\r\n */\r\n\r\nimport { createServer, type Server, type IncomingMessage, type ServerResponse } from \"node:http\";\r\nimport { randomBytes, createHash } from \"node:crypto\";\r\nimport { execFile } from \"node:child_process\";\r\nimport { promisify } from \"node:util\";\r\nimport { URL } from \"node:url\";\r\nimport type { ICredential } from \"../../types/index.js\";\r\nimport { AuthenticationError } from \"../../types/index.js\";\r\nimport { CredentialStore } from \"../credential-store.js\";\r\nimport { logger } from \"../../utils/index.js\";\r\n\r\nconst execFileAsync = promisify(execFile);\r\n\r\n// ── Claude Code OAuth Config (same as official Claude Code CLI) ─────────\r\n\r\nconst CLIENT_ID = \"9d1c250a-e61b-44d9-88ed-5944d1962f5e\";\r\nconst AUTHORIZE_URL = \"https://claude.ai/oauth/authorize\";\r\nconst TOKEN_URL = \"https://platform.claude.com/v1/oauth/token\";\r\nconst SCOPE = \"user:inference\";\r\nconst CALLBACK_TIMEOUT_MS = 300_000;\r\nconst LOCALHOST = \"localhost\";\r\n\r\n// ── Also try reading from official Claude Code CLI's keychain ───────────\r\n\r\nconst KEYCHAIN_SERVICE = \"Claude Code-credentials\";\r\n\r\nfunction isRecord(value: unknown): value is Record<string, unknown> {\r\n return typeof value === \"object\" && value !== null;\r\n}\r\n\r\nfunction asString(value: unknown): string | undefined {\r\n return typeof value === \"string\" && value.length > 0 ? value : undefined;\r\n}\r\n\r\nfunction asDate(value: unknown): Date | undefined {\r\n if (value instanceof Date) {\r\n return Number.isNaN(value.getTime()) ? undefined : value;\r\n }\r\n\r\n if (typeof value === \"number\" && Number.isFinite(value)) {\r\n const millis = value > 10_000_000_000 ? value : value * 1000;\r\n const date = new Date(millis);\r\n return Number.isNaN(date.getTime()) ? undefined : date;\r\n }\r\n\r\n if (typeof value === \"string\" && value.length > 0) {\r\n const numeric = Number(value);\r\n if (Number.isFinite(numeric) && value.trim() !== \"\") {\r\n return asDate(numeric);\r\n }\r\n\r\n const parsed = new Date(value);\r\n return Number.isNaN(parsed.getTime()) ? undefined : parsed;\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\nfunction parseKeychainCredential(raw: string): ICredential | undefined {\r\n if (raw.length === 0) {\r\n return undefined;\r\n }\r\n\r\n let parsed: unknown;\r\n try {\r\n parsed = JSON.parse(raw) as unknown;\r\n } catch {\r\n return undefined;\r\n }\r\n\r\n if (!isRecord(parsed)) {\r\n return undefined;\r\n }\r\n\r\n const directPayload = parsed;\r\n const nestedPayload = isRecord(parsed[\"claudeAiOauth\"])\r\n ? parsed[\"claudeAiOauth\"]\r\n : undefined;\r\n const payloads = nestedPayload ? [nestedPayload, directPayload] : [directPayload];\r\n\r\n for (const payload of payloads) {\r\n const accessToken = asString(payload[\"accessToken\"]) ?? asString(payload[\"access_token\"]);\r\n if (!accessToken) {\r\n continue;\r\n }\r\n\r\n const refreshToken = asString(payload[\"refreshToken\"]) ?? asString(payload[\"refresh_token\"]);\r\n const expiresAt = asDate(payload[\"expiresAt\"] ?? payload[\"expires_at\"]);\r\n const email = asString(payload[\"email\"]);\r\n const plan = asString(payload[\"plan\"])\r\n ?? asString(payload[\"subscriptionType\"])\r\n ?? asString(payload[\"subscription_type\"])\r\n ?? asString(payload[\"rateLimitTier\"])\r\n ?? asString(payload[\"rate_limit_tier\"]);\r\n\r\n return {\r\n provider: \"anthropic\",\r\n method: \"native_login\",\r\n token: accessToken,\r\n ...(refreshToken !== undefined ? { refreshToken } : {}),\r\n ...(expiresAt !== undefined ? { expiresAt } : {}),\r\n ...(email !== undefined ? { email } : {}),\r\n ...(plan !== undefined ? { plan } : {}),\r\n };\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\nasync function readKeychainCredential(): Promise<ICredential | undefined> {\r\n if (process.platform !== \"darwin\") return undefined;\r\n\r\n try {\r\n const { stdout } = await execFileAsync(\"security\", [\r\n \"find-generic-password\", \"-s\", KEYCHAIN_SERVICE, \"-w\",\r\n ], { timeout: 5000 });\r\n\r\n return parseKeychainCredential(stdout.trim());\r\n } catch {\r\n return undefined;\r\n }\r\n}\r\n\r\n// ── PKCE Helpers ────────────────────────────────────────────────────────\r\n\r\nfunction generateCodeVerifier(): string {\r\n return randomBytes(32).toString(\"base64url\");\r\n}\r\n\r\nfunction generateCodeChallenge(verifier: string): string {\r\n return createHash(\"sha256\").update(verifier).digest(\"base64url\");\r\n}\r\n\r\nfunction generateState(): string {\r\n return randomBytes(16).toString(\"hex\");\r\n}\r\n\r\n// ── HTML Responses ──────────────────────────────────────────────────────\r\n\r\nfunction escapeHtml(unsafe: string): string {\r\n return unsafe\r\n .replace(/&/g, \"&amp;\")\r\n .replace(/</g, \"&lt;\")\r\n .replace(/>/g, \"&gt;\")\r\n .replace(/\"/g, \"&quot;\")\r\n .replace(/'/g, \"&#039;\");\r\n}\r\n\r\nfunction successHtml(): string {\r\n return `<!DOCTYPE html>\r\n<html><head><title>AemeathCLI — Login Successful</title></head>\r\n<body style=\"font-family:system-ui;text-align:center;padding:40px\">\r\n<h1>Login Successful</h1>\r\n<p>You can close this window and return to your terminal.</p>\r\n</body></html>`;\r\n}\r\n\r\nfunction errorHtml(message: string): string {\r\n return `<!DOCTYPE html>\r\n<html><head><title>AemeathCLI — Login Failed</title></head>\r\n<body style=\"font-family:system-ui;text-align:center;padding:40px\">\r\n<h1>Login Failed</h1>\r\n<p>${escapeHtml(message)}</p>\r\n</body></html>`;\r\n}\r\n\r\n// ── ClaudeLogin Class ───────────────────────────────────────────────────\r\n\r\nexport class ClaudeLogin {\r\n private readonly credentialStore: CredentialStore;\r\n private callbackServer: Server | undefined;\r\n\r\n constructor(store?: CredentialStore) {\r\n this.credentialStore = store ?? new CredentialStore();\r\n }\r\n\r\n /**\r\n * Run browser-based OAuth 2.0 + PKCE login using the same client ID\r\n * as the official Claude Code CLI. Browser opens automatically.\r\n */\r\n async login(): Promise<ICredential> {\r\n // First try importing existing credentials from Claude Code's keychain\r\n const existing = await readKeychainCredential();\r\n if (existing && existing.token) {\r\n const isExpired = existing.expiresAt ? new Date() > existing.expiresAt : false;\r\n if (!isExpired) {\r\n logger.info(\"Imported existing Claude Code credentials from keychain\");\r\n await this.credentialStore.set(\"anthropic\", existing);\r\n return existing;\r\n }\r\n }\r\n\r\n // Run the OAuth flow — browser opens automatically\r\n const codeVerifier = generateCodeVerifier();\r\n const codeChallenge = generateCodeChallenge(codeVerifier);\r\n const state = generateState();\r\n\r\n const { port, server } = await this.startCallbackServer();\r\n this.callbackServer = server;\r\n\r\n const redirectUri = `http://${LOCALHOST}:${port}/callback`;\r\n\r\n const authUrl = new URL(AUTHORIZE_URL);\r\n authUrl.searchParams.set(\"code\", \"true\");\r\n authUrl.searchParams.set(\"client_id\", CLIENT_ID);\r\n authUrl.searchParams.set(\"response_type\", \"code\");\r\n authUrl.searchParams.set(\"redirect_uri\", redirectUri);\r\n authUrl.searchParams.set(\"scope\", SCOPE);\r\n authUrl.searchParams.set(\"code_challenge\", codeChallenge);\r\n authUrl.searchParams.set(\"code_challenge_method\", \"S256\");\r\n authUrl.searchParams.set(\"state\", state);\r\n\r\n logger.info(\"Opening browser for Claude OAuth login\");\r\n\r\n try {\r\n const openModule = await import(\"open\");\r\n await openModule.default(authUrl.toString());\r\n } catch {\r\n this.stopServer();\r\n throw new AuthenticationError(\"anthropic\", \"Failed to open browser for login\");\r\n }\r\n\r\n try {\r\n const code = await this.waitForCallback(state);\r\n const credential = await this.exchangeCodeForToken(code, codeVerifier, redirectUri, state);\r\n\r\n await this.credentialStore.set(\"anthropic\", credential);\r\n logger.info(\"Claude OAuth login successful\");\r\n\r\n return credential;\r\n } finally {\r\n this.stopServer();\r\n }\r\n }\r\n\r\n async logout(): Promise<void> {\r\n await this.credentialStore.delete(\"anthropic\");\r\n logger.info(\"Claude session revoked\");\r\n }\r\n\r\n async isLoggedIn(): Promise<boolean> {\r\n const credential = await this.getCachedCredential();\r\n return credential !== undefined;\r\n }\r\n\r\n async getStatus(): Promise<{ loggedIn: boolean; email?: string | undefined; plan?: string | undefined }> {\r\n const loggedIn = await this.isLoggedIn();\r\n if (!loggedIn) return { loggedIn: false };\r\n\r\n const credential = await this.credentialStore.get(\"anthropic\");\r\n if (!credential) return { loggedIn: false };\r\n\r\n return {\r\n loggedIn: true,\r\n ...(credential.email !== undefined ? { email: credential.email } : {}),\r\n ...(credential.plan !== undefined ? { plan: credential.plan } : {}),\r\n };\r\n }\r\n\r\n async getCachedCredential(): Promise<ICredential | undefined> {\r\n const existing = await this.credentialStore.get(\"anthropic\");\r\n if (existing?.method === \"native_login\" && existing.token) {\r\n const isExpired = existing.expiresAt ? new Date() > existing.expiresAt : false;\r\n if (!isExpired) {\r\n return existing;\r\n }\r\n }\r\n\r\n const keychain = await readKeychainCredential();\r\n if (!keychain?.token) {\r\n return undefined;\r\n }\r\n\r\n const isExpired = keychain.expiresAt ? new Date() > keychain.expiresAt : false;\r\n if (isExpired) {\r\n return undefined;\r\n }\r\n\r\n await this.credentialStore.set(\"anthropic\", keychain);\r\n return keychain;\r\n }\r\n\r\n // ── Internal ──────────────────────────────────────────────────────────\r\n\r\n private startCallbackServer(): Promise<{ port: number; server: Server }> {\r\n return new Promise((resolve, reject) => {\r\n const server = createServer();\r\n server.listen(0, LOCALHOST, () => {\r\n const address = server.address();\r\n if (address === null || typeof address === \"string\") {\r\n server.close();\r\n reject(new Error(\"Failed to bind callback server\"));\r\n return;\r\n }\r\n resolve({ port: address.port, server });\r\n });\r\n server.on(\"error\", reject);\r\n });\r\n }\r\n\r\n private waitForCallback(expectedState: string): Promise<string> {\r\n return new Promise((resolve, reject) => {\r\n const server = this.callbackServer;\r\n if (server === undefined) {\r\n reject(new AuthenticationError(\"anthropic\", \"Callback server not started\"));\r\n return;\r\n }\r\n\r\n const timeout = setTimeout(() => {\r\n reject(new AuthenticationError(\"anthropic\", \"Login timed out\"));\r\n }, CALLBACK_TIMEOUT_MS);\r\n\r\n server.on(\"request\", (req: IncomingMessage, res: ServerResponse) => {\r\n const requestUrl = new URL(req.url ?? \"/\", `http://${LOCALHOST}`);\r\n if (requestUrl.pathname !== \"/callback\") {\r\n res.writeHead(404);\r\n res.end(\"Not found\");\r\n return;\r\n }\r\n\r\n clearTimeout(timeout);\r\n\r\n const code = requestUrl.searchParams.get(\"code\");\r\n const state = requestUrl.searchParams.get(\"state\");\r\n const error = requestUrl.searchParams.get(\"error\");\r\n\r\n if (error) {\r\n res.writeHead(400, { \"Content-Type\": \"text/html\" });\r\n res.end(errorHtml(`OAuth error: ${error}`));\r\n reject(new AuthenticationError(\"anthropic\", `OAuth error: ${error}`));\r\n return;\r\n }\r\n\r\n if (state !== expectedState) {\r\n res.writeHead(400, { \"Content-Type\": \"text/html\" });\r\n res.end(errorHtml(\"State mismatch\"));\r\n reject(new AuthenticationError(\"anthropic\", \"OAuth state mismatch\"));\r\n return;\r\n }\r\n\r\n if (!code) {\r\n res.writeHead(400, { \"Content-Type\": \"text/html\" });\r\n res.end(errorHtml(\"Missing authorization code\"));\r\n reject(new AuthenticationError(\"anthropic\", \"No authorization code received\"));\r\n return;\r\n }\r\n\r\n res.writeHead(200, { \"Content-Type\": \"text/html\" });\r\n res.end(successHtml());\r\n resolve(code);\r\n });\r\n });\r\n }\r\n\r\n private async exchangeCodeForToken(\r\n code: string,\r\n codeVerifier: string,\r\n redirectUri: string,\r\n state: string,\r\n ): Promise<ICredential> {\r\n const body = {\r\n grant_type: \"authorization_code\",\r\n code,\r\n redirect_uri: redirectUri,\r\n client_id: CLIENT_ID,\r\n code_verifier: codeVerifier,\r\n state,\r\n };\r\n\r\n const response = await fetch(TOKEN_URL, {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n },\r\n body: JSON.stringify(body),\r\n });\r\n\r\n if (!response.ok) {\r\n const text = await response.text();\r\n throw new AuthenticationError(\"anthropic\", `Token exchange failed: ${response.status} ${text}`);\r\n }\r\n\r\n const data = (await response.json()) as {\r\n access_token?: string;\r\n refresh_token?: string;\r\n expires_in?: number;\r\n email?: string;\r\n plan?: string;\r\n };\r\n\r\n if (!data.access_token) {\r\n throw new AuthenticationError(\"anthropic\", \"Token exchange returned no access_token\");\r\n }\r\n\r\n const expiresAt = data.expires_in\r\n ? new Date(Date.now() + data.expires_in * 1000)\r\n : undefined;\r\n\r\n return {\r\n provider: \"anthropic\",\r\n method: \"native_login\",\r\n token: data.access_token,\r\n ...(data.refresh_token !== undefined ? { refreshToken: data.refresh_token } : {}),\r\n ...(expiresAt !== undefined ? { expiresAt } : {}),\r\n ...(data.email !== undefined ? { email: data.email } : {}),\r\n ...(data.plan !== undefined ? { plan: data.plan } : {}),\r\n };\r\n }\r\n\r\n private stopServer(): void {\r\n if (this.callbackServer !== undefined) {\r\n this.callbackServer.close();\r\n this.callbackServer = undefined;\r\n }\r\n }\r\n}\r\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/auth/providers/codex-login.ts"],"names":[],"mappings":"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","file":"codex-login-GMPF64MR.js","sourcesContent":["/**\r\n * Codex (OpenAI) delegated authentication\r\n * Spawns `codex login` which opens the browser automatically for ChatGPT login.\r\n * After login, reads cached tokens from ~/.codex/auth.json.\r\n */\r\n\r\nimport { readFileSync, existsSync } from \"node:fs\";\r\nimport { join } from \"node:path\";\r\nimport { homedir } from \"node:os\";\r\nimport { execa } from \"execa\";\r\nimport type { ICredential } from \"../../types/index.js\";\r\nimport { AuthenticationError } from \"../../types/index.js\";\r\nimport { CredentialStore } from \"../credential-store.js\";\r\nimport { logger } from \"../../utils/index.js\";\r\n\r\n// ── Codex CLI Token Paths ───────────────────────────────────────────────\r\n\r\nconst CLI_COMMAND = \"codex\";\r\n\r\nfunction getCodexHome(): string {\r\n return process.env[\"CODEX_HOME\"] ?? join(homedir(), \".codex\");\r\n}\r\n\r\nfunction getAuthJsonPath(): string {\r\n return join(getCodexHome(), \"auth.json\");\r\n}\r\n\r\n// ── auth.json Schema ────────────────────────────────────────────────────\r\n\r\ninterface ICodexAuthJson {\r\n readonly OPENAI_API_KEY?: string | null;\r\n readonly tokens?: {\r\n readonly id_token?: string;\r\n readonly access_token?: string;\r\n readonly refresh_token?: string;\r\n readonly account_id?: string;\r\n };\r\n readonly last_refresh?: string;\r\n}\r\n\r\nfunction readCodexAuthJson(): ICodexAuthJson | undefined {\r\n const authPath = getAuthJsonPath();\r\n if (!existsSync(authPath)) {\r\n return undefined;\r\n }\r\n\r\n try {\r\n const raw = readFileSync(authPath, \"utf-8\");\r\n return JSON.parse(raw) as ICodexAuthJson;\r\n } catch {\r\n return undefined;\r\n }\r\n}\r\n\r\nfunction extractEmailFromIdToken(idToken: string): string | undefined {\r\n try {\r\n const payload = idToken.split(\".\")[1];\r\n if (!payload) return undefined;\r\n const decoded = JSON.parse(Buffer.from(payload, \"base64url\").toString(\"utf8\")) as {\r\n email?: string;\r\n };\r\n return decoded.email;\r\n } catch {\r\n return undefined;\r\n }\r\n}\r\n\r\n// ── CodexLogin Class ────────────────────────────────────────────────────\r\n\r\nexport class CodexLogin {\r\n private readonly credentialStore: CredentialStore;\r\n\r\n constructor(store?: CredentialStore) {\r\n this.credentialStore = store ?? new CredentialStore();\r\n }\r\n\r\n /**\r\n * Spawn `codex login` which opens the browser automatically for ChatGPT login,\r\n * then read the cached tokens from ~/.codex/auth.json.\r\n */\r\n async login(): Promise<ICredential> {\r\n // Check if already logged in via cached tokens\r\n const existing = this.readCachedCredentials();\r\n if (existing) {\r\n logger.info(\"Found existing Codex credentials in ~/.codex/auth.json\");\r\n await this.credentialStore.set(\"openai\", existing);\r\n return existing;\r\n }\r\n\r\n // Check if the CLI is available\r\n const cliAvailable = await this.isCliAvailable();\r\n if (!cliAvailable) {\r\n throw new AuthenticationError(\r\n \"openai\",\r\n \"Codex CLI not found. Install it first:\\n\" +\r\n \" npm install -g @openai/codex\\n\" +\r\n \"Or set an API key: aemeathcli auth set-key codex <key>\",\r\n );\r\n }\r\n\r\n // Spawn `codex login` — browser opens automatically\r\n logger.info(\"Spawning codex login (browser will open automatically)\");\r\n try {\r\n await this.spawnInteractive(CLI_COMMAND, [\"login\"]);\r\n } catch {\r\n // Try device auth as fallback for headless environments\r\n try {\r\n await this.spawnInteractive(CLI_COMMAND, [\"login\", \"--device-auth\"]);\r\n } catch {\r\n throw new AuthenticationError(\r\n \"openai\",\r\n \"Codex login failed. Make sure you have the Codex CLI installed:\\n\" +\r\n \" npm install -g @openai/codex\\n\" +\r\n \"Or set an API key: aemeathcli auth set-key codex <key>\",\r\n );\r\n }\r\n }\r\n\r\n // Read the freshly cached credentials\r\n const credential = this.readCachedCredentials();\r\n if (!credential) {\r\n throw new AuthenticationError(\r\n \"openai\",\r\n \"No credentials found after Codex login. Please try again or set an API key: aemeathcli auth set-key codex <key>\",\r\n );\r\n }\r\n\r\n await this.credentialStore.set(\"openai\", credential);\r\n logger.info(\"Codex credentials imported successfully\");\r\n return credential;\r\n }\r\n\r\n async logout(): Promise<void> {\r\n await this.credentialStore.delete(\"openai\");\r\n logger.info(\"OpenAI session revoked from AemeathCLI\");\r\n }\r\n\r\n async isLoggedIn(): Promise<boolean> {\r\n const credential = this.readCachedCredentials();\r\n if (!credential) {\r\n return false;\r\n }\r\n\r\n await this.credentialStore.set(\"openai\", credential);\r\n return true;\r\n }\r\n\r\n async getStatus(): Promise<{ loggedIn: boolean; email?: string | undefined; plan?: string | undefined }> {\r\n const loggedIn = await this.isLoggedIn();\r\n if (!loggedIn) return { loggedIn: false };\r\n\r\n const credential = await this.credentialStore.get(\"openai\");\r\n if (!credential) return { loggedIn: false };\r\n\r\n return {\r\n loggedIn: true,\r\n ...(credential.email !== undefined ? { email: credential.email } : {}),\r\n };\r\n }\r\n\r\n async getCachedCredential(): Promise<ICredential | undefined> {\r\n const credential = this.readCachedCredentials();\r\n if (credential) {\r\n await this.credentialStore.set(\"openai\", credential);\r\n }\r\n return credential;\r\n }\r\n\r\n // ── Internal ──────────────────────────────────────────────────────────\r\n\r\n private readCachedCredentials(): ICredential | undefined {\r\n const authData = readCodexAuthJson();\r\n if (!authData) return undefined;\r\n\r\n if (authData.tokens?.access_token) {\r\n const email = authData.tokens.id_token\r\n ? extractEmailFromIdToken(authData.tokens.id_token)\r\n : undefined;\r\n\r\n return {\r\n provider: \"openai\",\r\n method: \"native_login\",\r\n token: authData.tokens.access_token,\r\n ...(authData.tokens.refresh_token !== undefined ? { refreshToken: authData.tokens.refresh_token } : {}),\r\n ...(email !== undefined ? { email } : {}),\r\n };\r\n }\r\n\r\n if (authData.OPENAI_API_KEY && typeof authData.OPENAI_API_KEY === \"string\") {\r\n return {\r\n provider: \"openai\",\r\n method: \"api_key\",\r\n token: authData.OPENAI_API_KEY,\r\n };\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n private async spawnInteractive(command: string, args: readonly string[]): Promise<void> {\r\n await execa(command, [...args], { stdio: \"inherit\", timeout: 300_000 });\r\n }\r\n\r\n private async isCliAvailable(): Promise<boolean> {\r\n try {\r\n await execa(CLI_COMMAND, [\"--version\"], { timeout: 5000, stdin: \"ignore\", stdout: \"ignore\", stderr: \"ignore\" });\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n}\r\n"]}
@@ -1,7 +0,0 @@
1
- export { ConfigStore } from './chunk-5XFSV6PF.js';
2
- import './chunk-CC7MGWYY.js';
3
- import './chunk-2GKOK6T7.js';
4
- import './chunk-HEKFAKVH.js';
5
- import './chunk-BY4DAKUU.js';
6
- //# sourceMappingURL=config-store-POB6I37G.js.map
7
- //# sourceMappingURL=config-store-POB6I37G.js.map
@@ -1,4 +0,0 @@
1
- export { ConversationStore } from './chunk-WC72BRHR.js';
2
- import './chunk-HEKFAKVH.js';
3
- //# sourceMappingURL=conversation-store-PRBHWQMJ.js.map
4
- //# sourceMappingURL=conversation-store-PRBHWQMJ.js.map
@@ -1,4 +0,0 @@
1
- export { detectInstalledProviders } from './chunk-3TSPZRGM.js';
2
- import './chunk-RP2TAL3J.js';
3
- //# sourceMappingURL=detect-providers-C4SVQHFF.js.map
4
- //# sourceMappingURL=detect-providers-C4SVQHFF.js.map
@@ -1,4 +0,0 @@
1
- export { SkillExecutor } from './chunk-QCRK4QEL.js';
2
- import './chunk-HEKFAKVH.js';
3
- //# sourceMappingURL=executor-RUX7VK3T.js.map
4
- //# sourceMappingURL=executor-RUX7VK3T.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/cli/setup/first-run.ts"],"names":["store"],"mappings":"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","file":"first-run-GDEVRFPO.js","sourcesContent":["import { existsSync } from \"node:fs\";\r\n\r\nimport pc from \"picocolors\";\r\n\r\nimport type { CliProviderType } from \"../../orchestrator/constants.js\";\r\nimport { CLI_PROVIDER_ORDER, getCliProviderEntry, type LoginProvider } from \"../../orchestrator/utils/provider-catalog.js\";\r\nimport { detectInstalledProviders } from \"../../orchestrator/utils/detect-providers.js\";\r\nimport { ConfigStore } from \"../../storage/config-store.js\";\r\nimport { DEFAULT_CONFIG, type IGlobalConfig } from \"../../types/config.js\";\r\nimport { getConfigPath } from \"../../utils/pathResolver.js\";\r\nimport { PACKAGE_VERSION } from \"../../version.js\";\r\n\r\ninterface IFirstRunLogin {\r\n login(): Promise<unknown>;\r\n}\r\n\r\nexport interface FirstRunSetupOptions {\r\n readonly defaults?: boolean;\r\n readonly force?: boolean;\r\n}\r\n\r\nexport interface FirstRunSetupResult {\r\n readonly configPath: string;\r\n readonly created: boolean;\r\n readonly config: IGlobalConfig;\r\n}\r\n\r\nexport function hasGlobalConfig(): boolean {\r\n return existsSync(getConfigPath());\r\n}\r\n\r\nexport function isInteractiveTerminal(): boolean {\r\n return process.stdin.isTTY && process.stdout.isTTY;\r\n}\r\n\r\nexport function createInitialConfig(): IGlobalConfig {\r\n return {\r\n ...DEFAULT_CONFIG,\r\n version: PACKAGE_VERSION,\r\n };\r\n}\r\n\r\nexport function ensureDefaultConfig(): FirstRunSetupResult {\r\n const store = new ConfigStore();\r\n const configPath = getConfigPath();\r\n\r\n if (hasGlobalConfig()) {\r\n return {\r\n configPath,\r\n created: false,\r\n config: store.loadGlobal(),\r\n };\r\n }\r\n\r\n const config = createInitialConfig();\r\n store.saveGlobal(config);\r\n\r\n return {\r\n configPath,\r\n created: true,\r\n config,\r\n };\r\n}\r\n\r\nasync function createFirstRunLogin(provider: LoginProvider): Promise<IFirstRunLogin> {\r\n switch (provider) {\r\n case \"claude\": {\r\n const { ClaudeLogin } = await import(\"../../auth/providers/claude-login.js\");\r\n return new ClaudeLogin();\r\n }\r\n case \"codex\": {\r\n const { CodexLogin } = await import(\"../../auth/providers/codex-login.js\");\r\n return new CodexLogin();\r\n }\r\n case \"gemini\": {\r\n const { GeminiLogin } = await import(\"../../auth/providers/gemini-login.js\");\r\n return new GeminiLogin();\r\n }\r\n case \"kimi\": {\r\n const { KimiLogin } = await import(\"../../auth/providers/kimi-login.js\");\r\n return new KimiLogin();\r\n }\r\n }\r\n}\r\n\r\nfunction writeWelcomeBanner(): void {\r\n process.stdout.write(\r\n [\r\n \"\",\r\n pc.cyan(\" ╔══════════════════════════════════════════════╗\"),\r\n pc.cyan(\" ║ Welcome to AemeathCLI ║\"),\r\n pc.cyan(` ║ Multi-Model CLI Coding Tool v${PACKAGE_VERSION.padEnd(10)} ║`),\r\n pc.cyan(\" ╚══════════════════════════════════════════════╝\"),\r\n \"\",\r\n \" Let's get you set up:\",\r\n \"\",\r\n ].join(\"\\n\"),\r\n );\r\n}\r\n\r\nexport async function runFirstRunSetup(\r\n options: FirstRunSetupOptions = {},\r\n): Promise<FirstRunSetupResult> {\r\n const configPath = getConfigPath();\r\n if (hasGlobalConfig() && !options.force) {\r\n const store = new ConfigStore();\r\n return {\r\n configPath,\r\n created: false,\r\n config: store.loadGlobal(),\r\n };\r\n }\r\n\r\n const store = new ConfigStore();\r\n const config = createInitialConfig();\r\n const detectedProviders = detectInstalledProviders();\r\n\r\n if (options.defaults || !isInteractiveTerminal()) {\r\n const defaultPrimaryMasterProvider = detectedProviders[0];\r\n const configWithDefaults: IGlobalConfig = {\r\n ...config,\r\n swarm: {\r\n onboardingComplete: true,\r\n detectedProviders,\r\n primaryMasterProvider: defaultPrimaryMasterProvider,\r\n fallbackMasterProviders: detectedProviders.slice(1),\r\n },\r\n };\r\n store.saveGlobal(configWithDefaults);\r\n\r\n const modeLabel = options.defaults ? \"defaults\" : \"non-interactive defaults\";\r\n process.stdout.write(\r\n `${pc.green(\"✓\")} Saved ${modeLabel} to ${pc.cyan(configPath)}\\n`,\r\n );\r\n\r\n return {\r\n configPath,\r\n created: true,\r\n config: configWithDefaults,\r\n };\r\n }\r\n\r\n const { checkbox, confirm, select } = await import(\"@inquirer/prompts\");\r\n\r\n writeWelcomeBanner();\r\n\r\n const detectedLines = CLI_PROVIDER_ORDER.map((provider) => {\r\n const entry = getCliProviderEntry(provider);\r\n const installed = detectedProviders.includes(provider);\r\n return ` ${installed ? pc.green(\"✓\") : pc.dim(\"○\")} ${entry.label} — ${installed ? \"installed\" : \"not detected\"}`;\r\n });\r\n process.stdout.write(`${detectedLines.join(\"\\n\")}\\n\\n`);\r\n\r\n const loginChoices = CLI_PROVIDER_ORDER\r\n .map((provider) => {\r\n const entry = getCliProviderEntry(provider);\r\n if (entry.loginProvider === undefined) {\r\n return undefined;\r\n }\r\n\r\n const installed = detectedProviders.includes(provider);\r\n return {\r\n name: `${entry.label}${installed ? \"\" : \" (not detected, login only)\"}`,\r\n value: entry.loginProvider,\r\n checked: installed && provider !== \"kimi-cli\",\r\n };\r\n })\r\n .filter((choice): choice is { name: string; value: LoginProvider; checked: boolean } => choice !== undefined);\r\n\r\n const selectedLoginProviders = await checkbox<LoginProvider>({\r\n message: \"Which providers should be authenticated during setup?\",\r\n choices: loginChoices,\r\n });\r\n\r\n for (const provider of selectedLoginProviders) {\r\n process.stdout.write(pc.cyan(` Logging in to ${provider}...\\n`));\r\n try {\r\n const login = await createFirstRunLogin(provider);\r\n await login.login();\r\n process.stdout.write(pc.green(` ✓ ${provider} — Logged in successfully\\n`));\r\n } catch (error: unknown) {\r\n const message = error instanceof Error ? error.message : String(error);\r\n process.stdout.write(pc.yellow(` ! ${provider} — Login skipped: ${message}\\n`));\r\n }\r\n }\r\n\r\n if (detectedProviders.includes(\"ollama\")) {\r\n process.stdout.write(pc.green(\" ✓ ollama — Local agent runtime detected\\n\"));\r\n }\r\n\r\n let primaryMasterProvider: CliProviderType | undefined;\r\n let fallbackMasterProviders: CliProviderType[] = [];\r\n\r\n if (detectedProviders.length > 0) {\r\n primaryMasterProvider = await select<CliProviderType>({\r\n message: \"Choose the primary master agent provider for swarm orchestration:\",\r\n choices: detectedProviders.map((provider) => ({\r\n name: `${getCliProviderEntry(provider).label} — ${getCliProviderEntry(provider).description}`,\r\n value: provider,\r\n })),\r\n });\r\n\r\n const remainingProviders = detectedProviders.filter(\r\n (provider) => provider !== primaryMasterProvider,\r\n );\r\n\r\n if (remainingProviders.length > 0) {\r\n fallbackMasterProviders = await checkbox<CliProviderType>({\r\n message: \"Select optional fallback master-agent providers:\",\r\n choices: remainingProviders.map((provider) => ({\r\n name: `${getCliProviderEntry(provider).label} — ${getCliProviderEntry(provider).description}`,\r\n value: provider,\r\n })),\r\n });\r\n }\r\n } else {\r\n process.stdout.write(\r\n `${pc.yellow(\" !\")} No supported native agent CLIs were detected. You can still use direct chat, but swarm orchestration will stay limited until one is installed.\\n`,\r\n );\r\n }\r\n\r\n const keepRoleDefaults = await confirm({\r\n message: \"Keep the recommended role-routing defaults?\",\r\n default: true,\r\n });\r\n\r\n const configuredProviders: IGlobalConfig[\"providers\"] = {\r\n ...config.providers,\r\n };\r\n for (const provider of detectedProviders) {\r\n const entry = getCliProviderEntry(provider);\r\n configuredProviders[entry.provider] = {\r\n ...configuredProviders[entry.provider],\r\n enabled: true,\r\n };\r\n }\r\n\r\n const finalConfig: IGlobalConfig = {\r\n ...config,\r\n roles: keepRoleDefaults ? DEFAULT_CONFIG.roles : config.roles,\r\n providers: configuredProviders,\r\n swarm: {\r\n onboardingComplete: true,\r\n detectedProviders,\r\n primaryMasterProvider,\r\n fallbackMasterProviders,\r\n },\r\n };\r\n\r\n store.saveGlobal(finalConfig);\r\n\r\n process.stdout.write(\r\n [\r\n \"\",\r\n ` ${pc.green(\"✓\")} Configuration saved to ${pc.cyan(configPath)}`,\r\n \"\",\r\n ` Swarm primary: ${primaryMasterProvider ? getCliProviderEntry(primaryMasterProvider).label : \"not set\"}`,\r\n ` Swarm fallbacks: ${fallbackMasterProviders.length > 0 ? fallbackMasterProviders.map(getCliProviderEntry).map((entry) => entry.label).join(\", \") : \"none\"}`,\r\n \"\",\r\n \" Ready. Start with `aemeathcli` or `ac`.\",\r\n \" Use Shift+Tab inside the TUI to switch between swarm, guided edits, and direct chat.\",\r\n \"\",\r\n ].join(\"\\n\"),\r\n );\r\n\r\n return {\r\n configPath,\r\n created: true,\r\n config: finalConfig,\r\n };\r\n}\r\n"]}
@@ -1,7 +0,0 @@
1
- export { GeminiAdapter } from './chunk-25UNNEHN.js';
2
- import './chunk-ODBY7S4X.js';
3
- import './chunk-473JN6M5.js';
4
- import './chunk-62HSGYQD.js';
5
- import './chunk-HEKFAKVH.js';
6
- //# sourceMappingURL=gemini-adapter-MV3U4QFH.js.map
7
- //# sourceMappingURL=gemini-adapter-MV3U4QFH.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"gemini-adapter-MV3U4QFH.js"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/auth/providers/gemini-login.ts"],"names":[],"mappings":"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","file":"gemini-login-KE224MSW.js","sourcesContent":["/**\r\n * Gemini (Google) delegated authentication\r\n * Reads cached credentials from ~/.gemini/oauth_creds.json (shared with the Gemini CLI).\r\n * If not authenticated, opens a new terminal window running `gemini` for interactive login,\r\n * then polls for credentials to appear.\r\n */\r\n\r\nimport { readFileSync, existsSync, statSync } from \"node:fs\";\r\nimport { join } from \"node:path\";\r\nimport { homedir } from \"node:os\";\r\nimport { execa } from \"execa\";\r\nimport type { ICredential } from \"../../types/index.js\";\r\nimport { AuthenticationError } from \"../../types/index.js\";\r\nimport { CredentialStore } from \"../credential-store.js\";\r\nimport { logger } from \"../../utils/index.js\";\r\n\r\n// ── Gemini CLI Token Paths ──────────────────────────────────────────────\r\n\r\nconst CLI_COMMAND = \"gemini\";\r\nconst LOGIN_POLL_INTERVAL_MS = 2_000;\r\nconst LOGIN_POLL_TIMEOUT_MS = 120_000;\r\n\r\nfunction getGeminiHome(): string {\r\n return process.env[\"GEMINI_HOME\"] ?? join(homedir(), \".gemini\");\r\n}\r\n\r\nfunction getOAuthCredsPath(): string {\r\n return join(getGeminiHome(), \"oauth_creds.json\");\r\n}\r\n\r\nfunction getGoogleAccountsPath(): string {\r\n return join(getGeminiHome(), \"google_accounts.json\");\r\n}\r\n\r\n// ── Read existing tokens from Gemini CLI cache ──────────────────────────\r\n\r\ninterface IGeminiOAuthCreds {\r\n readonly access_token?: string;\r\n readonly scope?: string;\r\n readonly token_type?: string;\r\n readonly id_token?: string;\r\n readonly expiry_date?: number;\r\n readonly refresh_token?: string;\r\n}\r\n\r\ninterface IGoogleAccounts {\r\n readonly active?: string;\r\n}\r\n\r\nfunction readOAuthCreds(): IGeminiOAuthCreds | undefined {\r\n const credsPath = getOAuthCredsPath();\r\n if (!existsSync(credsPath)) return undefined;\r\n try {\r\n return JSON.parse(readFileSync(credsPath, \"utf-8\")) as IGeminiOAuthCreds;\r\n } catch {\r\n return undefined;\r\n }\r\n}\r\n\r\nfunction readGoogleAccounts(): IGoogleAccounts | undefined {\r\n const accountsPath = getGoogleAccountsPath();\r\n if (!existsSync(accountsPath)) return undefined;\r\n try {\r\n return JSON.parse(readFileSync(accountsPath, \"utf-8\")) as IGoogleAccounts;\r\n } catch {\r\n return undefined;\r\n }\r\n}\r\n\r\nfunction getCredsMtime(): number {\r\n const credsPath = getOAuthCredsPath();\r\n try {\r\n return statSync(credsPath).mtimeMs;\r\n } catch {\r\n return 0;\r\n }\r\n}\r\n\r\nfunction extractEmailFromIdToken(idToken: string): string | undefined {\r\n try {\r\n const payload = idToken.split(\".\")[1];\r\n if (!payload) return undefined;\r\n const decoded = JSON.parse(Buffer.from(payload, \"base64url\").toString(\"utf8\")) as { email?: string };\r\n return decoded.email;\r\n } catch {\r\n return undefined;\r\n }\r\n}\r\n\r\nfunction sleep(ms: number): Promise<void> {\r\n return new Promise((resolve) => setTimeout(resolve, ms));\r\n}\r\n\r\n// ── Open a new terminal window cross-platform ───────────────────────────\r\n\r\nasync function openTerminalWithGemini(): Promise<void> {\r\n const platform = process.platform;\r\n\r\n if (platform === \"win32\") {\r\n // Windows: open a new PowerShell window running gemini\r\n await execa(\"cmd\", [\"/c\", \"start\", \"powershell\", \"-NoExit\", \"-Command\", \"gemini\"], {\r\n stdin: \"ignore\",\r\n stdout: \"ignore\",\r\n stderr: \"ignore\",\r\n });\r\n } else if (platform === \"darwin\") {\r\n // macOS: open a new Terminal.app window running gemini\r\n await execa(\"osascript\", [\r\n \"-e\",\r\n 'tell application \"Terminal\" to do script \"gemini\"',\r\n \"-e\",\r\n 'tell application \"Terminal\" to activate',\r\n ], {\r\n stdin: \"ignore\",\r\n stdout: \"ignore\",\r\n stderr: \"ignore\",\r\n });\r\n } else {\r\n // Linux: try common terminal emulators\r\n const terminals = [\r\n { cmd: \"gnome-terminal\", args: [\"--\", \"gemini\"] },\r\n { cmd: \"konsole\", args: [\"-e\", \"gemini\"] },\r\n { cmd: \"xfce4-terminal\", args: [\"-e\", \"gemini\"] },\r\n { cmd: \"xterm\", args: [\"-e\", \"gemini\"] },\r\n ];\r\n\r\n for (const terminal of terminals) {\r\n try {\r\n await execa(terminal.cmd, terminal.args, {\r\n stdin: \"ignore\",\r\n stdout: \"ignore\",\r\n stderr: \"ignore\",\r\n detached: true,\r\n });\r\n return;\r\n } catch {\r\n // Try next terminal\r\n }\r\n }\r\n\r\n throw new Error(\"Could not find a terminal emulator. Please run `gemini` manually in a separate terminal.\");\r\n }\r\n}\r\n\r\n// ── GeminiLogin Class ───────────────────────────────────────────────────\r\n\r\nexport class GeminiLogin {\r\n private readonly credentialStore: CredentialStore;\r\n\r\n constructor(store?: CredentialStore) {\r\n this.credentialStore = store ?? new CredentialStore();\r\n }\r\n\r\n /**\r\n * Attempt to import credentials from the Gemini CLI cache.\r\n * If not found, opens a new terminal window running `gemini` for interactive\r\n * login, then polls for credentials to appear in ~/.gemini/oauth_creds.json.\r\n */\r\n async login(): Promise<ICredential> {\r\n // Try importing existing credentials from Gemini CLI's cache\r\n const existing = this.readCachedCredential();\r\n if (existing) {\r\n const isExpired = existing.expiresAt ? new Date() > existing.expiresAt : false;\r\n if (!isExpired) {\r\n logger.info(\"Found existing Gemini CLI credentials in ~/.gemini/oauth_creds.json\");\r\n await this.credentialStore.set(\"google\", existing);\r\n return existing;\r\n }\r\n }\r\n\r\n // Check if the CLI is installed\r\n const cliAvailable = await this.isCliAvailable();\r\n\r\n if (!cliAvailable) {\r\n throw new AuthenticationError(\r\n \"google\",\r\n \"Gemini CLI not found. Install it first:\\n\" +\r\n \" npm install -g @google/gemini-cli\\n\" +\r\n \"Then retry /login.\",\r\n );\r\n }\r\n\r\n // Record the current mtime so we can detect new credentials\r\n const beforeMtime = getCredsMtime();\r\n\r\n // Open a new terminal window running gemini for interactive login\r\n logger.info(\"Opening new terminal window for Gemini login\");\r\n try {\r\n await openTerminalWithGemini();\r\n } catch (error: unknown) {\r\n const msg = error instanceof Error ? error.message : String(error);\r\n throw new AuthenticationError(\"google\", msg);\r\n }\r\n\r\n // Poll for credentials to appear (user authenticates in the other window)\r\n const credential = await this.pollForCredentials(beforeMtime);\r\n if (!credential) {\r\n throw new AuthenticationError(\r\n \"google\",\r\n \"Login timed out. Please complete authentication in the Gemini terminal, then retry /login.\",\r\n );\r\n }\r\n\r\n await this.credentialStore.set(\"google\", credential);\r\n logger.info(\"Gemini credentials imported successfully\");\r\n return credential;\r\n }\r\n\r\n async logout(): Promise<void> {\r\n await this.credentialStore.delete(\"google\");\r\n logger.info(\"Google session revoked from AemeathCLI\");\r\n }\r\n\r\n async isLoggedIn(): Promise<boolean> {\r\n const credential = this.readCachedCredential();\r\n if (!credential) return false;\r\n if (credential.expiresAt && new Date() > credential.expiresAt && credential.refreshToken === undefined) {\r\n return false;\r\n }\r\n\r\n await this.credentialStore.set(\"google\", credential);\r\n return true;\r\n }\r\n\r\n async getStatus(): Promise<{ loggedIn: boolean; email?: string | undefined; plan?: string | undefined }> {\r\n const loggedIn = await this.isLoggedIn();\r\n if (!loggedIn) return { loggedIn: false };\r\n\r\n const credential = await this.credentialStore.get(\"google\");\r\n if (!credential) return { loggedIn: false };\r\n\r\n return {\r\n loggedIn: true,\r\n ...(credential.email !== undefined ? { email: credential.email } : {}),\r\n plan: \"Google AI\",\r\n };\r\n }\r\n\r\n async getCachedCredential(): Promise<ICredential | undefined> {\r\n const credential = this.readCachedCredential();\r\n if (credential) {\r\n await this.credentialStore.set(\"google\", credential);\r\n }\r\n return credential;\r\n }\r\n\r\n // ── Internal ──────────────────────────────────────────────────────────\r\n\r\n private readCachedCredential(): ICredential | undefined {\r\n const oauthCreds = readOAuthCreds();\r\n if (!oauthCreds?.access_token) return undefined;\r\n\r\n let email: string | undefined;\r\n const accounts = readGoogleAccounts();\r\n if (accounts?.active) {\r\n email = accounts.active;\r\n } else if (oauthCreds.id_token) {\r\n email = extractEmailFromIdToken(oauthCreds.id_token);\r\n }\r\n\r\n const expiresAt = oauthCreds.expiry_date ? new Date(oauthCreds.expiry_date) : undefined;\r\n\r\n return {\r\n provider: \"google\",\r\n method: \"native_login\",\r\n token: oauthCreds.access_token,\r\n ...(oauthCreds.refresh_token !== undefined ? { refreshToken: oauthCreds.refresh_token } : {}),\r\n ...(expiresAt !== undefined ? { expiresAt } : {}),\r\n ...(email !== undefined ? { email } : {}),\r\n plan: \"Google AI\",\r\n };\r\n }\r\n\r\n /**\r\n * Poll for new credentials to appear in ~/.gemini/oauth_creds.json.\r\n * Detects new credentials by checking if the file mtime changed from beforeMtime.\r\n */\r\n private async pollForCredentials(beforeMtime: number): Promise<ICredential | undefined> {\r\n const deadline = Date.now() + LOGIN_POLL_TIMEOUT_MS;\r\n\r\n while (Date.now() < deadline) {\r\n await sleep(LOGIN_POLL_INTERVAL_MS);\r\n\r\n const currentMtime = getCredsMtime();\r\n if (currentMtime > beforeMtime) {\r\n const credential = this.readCachedCredential();\r\n if (credential) return credential;\r\n }\r\n }\r\n\r\n // One final check\r\n return this.readCachedCredential() ?? undefined;\r\n }\r\n\r\n private async isCliAvailable(): Promise<boolean> {\r\n try {\r\n await execa(CLI_COMMAND, [\"--version\"], { timeout: 5000, stdin: \"ignore\", stdout: \"ignore\", stderr: \"ignore\" });\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n}\r\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/storage/input-history.ts"],"names":["history"],"mappings":";;;;;AAUA,IAAM,YAAA,GAAe,oBAAA;AACrB,IAAM,WAAA,GAAc,GAAA;AAEpB,IAAM,aAAA,uBAAoB,GAAA,EAAsB;AAGhD,SAAS,YAAY,WAAA,EAA6B;AAChD,EAAA,OAAO,UAAA,CAAW,QAAQ,CAAA,CAAE,MAAA,CAAO,WAAW,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAC3E;AAEA,SAAS,cAAc,WAAA,EAA6B;AAClD,EAAA,OAAO,KAAK,cAAA,EAAe,EAAG,SAAA,EAAW,WAAA,CAAY,WAAW,CAAC,CAAA;AACnE;AAEA,SAAS,eAAe,WAAA,EAA6B;AACnD,EAAA,OAAO,IAAA,CAAK,aAAA,CAAc,WAAW,CAAA,EAAG,YAAY,CAAA;AACtD;AAGA,eAAsB,iBAAiB,WAAA,EAAwC;AAC7E,EAAA,MAAM,MAAA,GAAS,aAAA,CAAc,GAAA,CAAI,WAAW,CAAA;AAC5C,EAAA,IAAI,MAAA,KAAW,QAAW,OAAO,MAAA;AAEjC,EAAA,IAAI;AACF,IAAA,MAAM,MAAM,MAAM,QAAA,CAAS,cAAA,CAAe,WAAW,GAAG,OAAO,CAAA;AAC/D,IAAA,MAAM,MAAA,GAAkB,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AACtC,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,IAAK,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA,KAAM,OAAO,CAAA,KAAM,QAAQ,CAAA,EAAG;AACvE,MAAA,MAAMA,QAAAA,GAAU,CAAC,GAAG,MAAM,CAAA;AAC1B,MAAA,aAAA,CAAc,GAAA,CAAI,aAAaA,QAAO,CAAA;AACtC,MAAA,OAAOA,QAAAA;AAAA,IACT;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AAEA,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,aAAA,CAAc,GAAA,CAAI,aAAa,OAAO,CAAA;AACtC,EAAA,OAAO,OAAA;AACT;AAGA,eAAsB,kBAAA,CACpB,aACA,KAAA,EACe;AACf,EAAA,IAAI,OAAA,GAAU,aAAA,CAAc,GAAA,CAAI,WAAW,CAAA;AAC3C,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAA,GAAU,MAAM,iBAAiB,WAAW,CAAA;AAAA,EAC9C;AAGA,EAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,IAAK,OAAA,CAAQ,QAAQ,MAAA,GAAS,CAAC,MAAM,KAAA,EAAO;AAC/D,IAAA;AAAA,EACF;AAEA,EAAA,OAAA,CAAQ,KAAK,KAAK,CAAA;AAElB,EAAA,IAAI,OAAA,CAAQ,SAAS,WAAA,EAAa;AAChC,IAAA,OAAA,CAAQ,MAAA,CAAO,CAAA,EAAG,OAAA,CAAQ,MAAA,GAAS,WAAW,CAAA;AAAA,EAChD;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,cAAc,WAAW,CAAA;AACrC,IAAA,MAAM,KAAA,CAAM,GAAA,EAAK,EAAE,SAAA,EAAW,MAAM,CAAA;AACpC,IAAA,MAAM,SAAA,CAAU,eAAe,WAAW,CAAA,EAAG,KAAK,SAAA,CAAU,OAAO,GAAG,OAAO,CAAA;AAAA,EAC/E,CAAA,CAAA,MAAQ;AAAA,EAER;AACF","file":"input-history-MIOO3FIW.js","sourcesContent":["/**\r\n * Per-project persistent input history across CLI sessions.\r\n * Stores at ~/.aemeathcli/history/<project-hash>/input-history.json\r\n */\r\n\r\nimport { createHash } from \"node:crypto\";\r\nimport { readFile, writeFile, mkdir } from \"node:fs/promises\";\r\nimport { join } from \"node:path\";\r\nimport { getAemeathHome } from \"../utils/pathResolver.js\";\r\n\r\nconst HISTORY_FILE = \"input-history.json\";\r\nconst MAX_HISTORY = 500;\r\n\r\nconst projectCaches = new Map<string, string[]>();\r\n\r\n/** Derive a short directory name from a project root path. */\r\nfunction projectHash(projectRoot: string): string {\r\n return createHash(\"sha256\").update(projectRoot).digest(\"hex\").slice(0, 12);\r\n}\r\n\r\nfunction getHistoryDir(projectRoot: string): string {\r\n return join(getAemeathHome(), \"history\", projectHash(projectRoot));\r\n}\r\n\r\nfunction getHistoryPath(projectRoot: string): string {\r\n return join(getHistoryDir(projectRoot), HISTORY_FILE);\r\n}\r\n\r\n/** Load persistent input history for a specific project. */\r\nexport async function loadInputHistory(projectRoot: string): Promise<string[]> {\r\n const cached = projectCaches.get(projectRoot);\r\n if (cached !== undefined) return cached;\r\n\r\n try {\r\n const raw = await readFile(getHistoryPath(projectRoot), \"utf-8\");\r\n const parsed: unknown = JSON.parse(raw);\r\n if (Array.isArray(parsed) && parsed.every((x) => typeof x === \"string\")) {\r\n const history = [...parsed];\r\n projectCaches.set(projectRoot, history);\r\n return history;\r\n }\r\n } catch {\r\n // File doesn't exist yet\r\n }\r\n\r\n const history: string[] = [];\r\n projectCaches.set(projectRoot, history);\r\n return history;\r\n}\r\n\r\n/** Append an entry to the project's persistent history and flush to disk. */\r\nexport async function appendInputHistory(\r\n projectRoot: string,\r\n entry: string,\r\n): Promise<void> {\r\n let history = projectCaches.get(projectRoot);\r\n if (!history) {\r\n history = await loadInputHistory(projectRoot);\r\n }\r\n\r\n // Deduplicate consecutive\r\n if (history.length > 0 && history[history.length - 1] === entry) {\r\n return;\r\n }\r\n\r\n history.push(entry);\r\n\r\n if (history.length > MAX_HISTORY) {\r\n history.splice(0, history.length - MAX_HISTORY);\r\n }\r\n\r\n try {\r\n const dir = getHistoryDir(projectRoot);\r\n await mkdir(dir, { recursive: true });\r\n await writeFile(getHistoryPath(projectRoot), JSON.stringify(history), \"utf-8\");\r\n } catch {\r\n // Non-critical\r\n }\r\n}\r\n"]}
@@ -1,6 +0,0 @@
1
- export { KimiAdapter } from './chunk-YPFOE2QJ.js';
2
- import './chunk-473JN6M5.js';
3
- import './chunk-62HSGYQD.js';
4
- import './chunk-HEKFAKVH.js';
5
- //# sourceMappingURL=kimi-adapter-UODMNX6K.js.map
6
- //# sourceMappingURL=kimi-adapter-UODMNX6K.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/auth/providers/kimi-login.ts"],"names":["expiresAt"],"mappings":"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","file":"kimi-login-DNT5YBKX.js","sourcesContent":["/**\r\n * Kimi (Moonshot) delegated authentication\r\n * Reads cached credentials from Kimi CLI's ~/.kimi/credentials/kimi-code.json.\r\n * If not found, spawns `kimi` CLI for interactive login.\r\n * Kimi's login opens a browser automatically from its interactive session.\r\n */\r\n\r\nimport { readFileSync, existsSync } from \"node:fs\";\r\nimport { join } from \"node:path\";\r\nimport { homedir } from \"node:os\";\r\nimport { execa } from \"execa\";\r\nimport type { ICredential } from \"../../types/index.js\";\r\nimport { AuthenticationError } from \"../../types/index.js\";\r\nimport { CredentialStore } from \"../credential-store.js\";\r\nimport { logger } from \"../../utils/index.js\";\r\n\r\n// ── Kimi CLI Token Paths ────────────────────────────────────────────────\r\n\r\nconst CLI_COMMAND = \"kimi\";\r\n\r\nfunction getKimiHome(): string {\r\n return process.env[\"KIMI_HOME\"] ?? join(homedir(), \".kimi\");\r\n}\r\n\r\nfunction getCredentialsPath(): string {\r\n return join(getKimiHome(), \"credentials\", \"kimi-code.json\");\r\n}\r\n\r\n// ── kimi-code.json Schema ───────────────────────────────────────────────\r\n\r\ninterface IKimiCredentials {\r\n readonly access_token?: string;\r\n readonly refresh_token?: string;\r\n readonly expires_at?: number;\r\n readonly scope?: string;\r\n readonly token_type?: string;\r\n}\r\n\r\nfunction readKimiCredentials(): IKimiCredentials | undefined {\r\n const credsPath = getCredentialsPath();\r\n if (!existsSync(credsPath)) return undefined;\r\n try {\r\n return JSON.parse(readFileSync(credsPath, \"utf-8\")) as IKimiCredentials;\r\n } catch {\r\n return undefined;\r\n }\r\n}\r\n\r\n// ── KimiLogin Class ─────────────────────────────────────────────────────\r\n\r\nexport class KimiLogin {\r\n private readonly credentialStore: CredentialStore;\r\n\r\n constructor(store?: CredentialStore) {\r\n this.credentialStore = store ?? new CredentialStore();\r\n }\r\n\r\n /**\r\n * Login via the Kimi CLI.\r\n * First checks for cached credentials. If not found, spawns the Kimi CLI\r\n * interactive session which handles browser-based login automatically.\r\n */\r\n async login(): Promise<ICredential> {\r\n // Check if already logged in via cached tokens\r\n const existing = this.readCachedCredentials();\r\n if (existing) {\r\n logger.info(\"Found existing Kimi CLI credentials\");\r\n await this.credentialStore.set(\"kimi\", existing);\r\n return existing;\r\n }\r\n\r\n // Check if the CLI is available\r\n const cliAvailable = await this.isCliAvailable();\r\n if (!cliAvailable) {\r\n throw new AuthenticationError(\r\n \"kimi\",\r\n \"Kimi CLI not found. Install it first:\\n\" +\r\n (process.platform === \"win32\"\r\n ? \" irm https://code.kimi.com/install.ps1 | iex\\n\"\r\n : \" curl -L code.kimi.com/install.sh | bash\\n\") +\r\n \"Or set an API key: aemeathcli auth set-key kimi <key>\",\r\n );\r\n }\r\n\r\n // Spawn kimi CLI — it handles login with browser automatically\r\n logger.info(\"Spawning Kimi CLI for login (browser will open automatically)\");\r\n try {\r\n await this.spawnInteractive(CLI_COMMAND, [\"login\"]);\r\n } catch {\r\n // Some versions may not have `kimi login` — try spawning interactive session\r\n try {\r\n await this.spawnInteractive(CLI_COMMAND, []);\r\n } catch {\r\n throw new AuthenticationError(\r\n \"kimi\",\r\n \"Kimi login failed. Make sure you have the Kimi CLI installed:\\n\" +\r\n (process.platform === \"win32\"\r\n ? \" irm https://code.kimi.com/install.ps1 | iex\\n\"\r\n : \" curl -L code.kimi.com/install.sh | bash\\n\") +\r\n \"Or set an API key: aemeathcli auth set-key kimi <key>\",\r\n );\r\n }\r\n }\r\n\r\n // Read the freshly cached credentials\r\n const credential = this.readCachedCredentials();\r\n if (!credential) {\r\n throw new AuthenticationError(\r\n \"kimi\",\r\n \"No Kimi credentials found after login. Please try again or set an API key: aemeathcli auth set-key kimi <key>\",\r\n );\r\n }\r\n\r\n await this.credentialStore.set(\"kimi\", credential);\r\n logger.info(\"Kimi credentials imported successfully\");\r\n return credential;\r\n }\r\n\r\n async logout(): Promise<void> {\r\n await this.credentialStore.delete(\"kimi\");\r\n logger.info(\"Kimi session revoked from AemeathCLI\");\r\n }\r\n\r\n async isLoggedIn(): Promise<boolean> {\r\n const credential = this.readCachedCredentials();\r\n if (!credential) {\r\n return false;\r\n }\r\n\r\n await this.credentialStore.set(\"kimi\", credential);\r\n return true;\r\n }\r\n\r\n async getStatus(): Promise<{ loggedIn: boolean; email?: string | undefined; plan?: string | undefined }> {\r\n const loggedIn = await this.isLoggedIn();\r\n if (!loggedIn) return { loggedIn: false };\r\n\r\n const credential = await this.credentialStore.get(\"kimi\");\r\n if (!credential) return { loggedIn: false };\r\n\r\n return {\r\n loggedIn: true,\r\n ...(credential.email !== undefined ? { email: credential.email } : {}),\r\n };\r\n }\r\n\r\n async getCachedCredential(): Promise<ICredential | undefined> {\r\n const credential = this.readCachedCredentials();\r\n if (credential) {\r\n await this.credentialStore.set(\"kimi\", credential);\r\n }\r\n return credential;\r\n }\r\n\r\n // ── Internal ──────────────────────────────────────────────────────────\r\n\r\n private readCachedCredentials(): ICredential | undefined {\r\n const kimiCreds = readKimiCredentials();\r\n if (!kimiCreds?.access_token) return undefined;\r\n\r\n // Check expiry (expires_at is seconds since epoch)\r\n if (kimiCreds.expires_at) {\r\n const expiresAt = new Date(kimiCreds.expires_at * 1000);\r\n if (new Date() > expiresAt && !kimiCreds.refresh_token) {\r\n logger.debug(\"Kimi CLI token expired with no refresh token\");\r\n return undefined;\r\n }\r\n }\r\n\r\n const expiresAt = kimiCreds.expires_at\r\n ? new Date(kimiCreds.expires_at * 1000)\r\n : undefined;\r\n\r\n return {\r\n provider: \"kimi\",\r\n method: \"native_login\",\r\n token: kimiCreds.access_token,\r\n ...(kimiCreds.refresh_token !== undefined ? { refreshToken: kimiCreds.refresh_token } : {}),\r\n ...(expiresAt !== undefined ? { expiresAt } : {}),\r\n };\r\n }\r\n\r\n private async spawnInteractive(command: string, args: readonly string[]): Promise<void> {\r\n await execa(command, [...args], { stdio: \"inherit\", timeout: 300_000 });\r\n }\r\n\r\n private async isCliAvailable(): Promise<boolean> {\r\n try {\r\n await execa(CLI_COMMAND, [\"--version\"], { timeout: 5000, stdin: \"ignore\", stdout: \"ignore\", stderr: \"ignore\" });\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n}\r\n"]}
@@ -1,3 +0,0 @@
1
- export { logger } from './chunk-HEKFAKVH.js';
2
- //# sourceMappingURL=logger-PLPDWACQ.js.map
3
- //# sourceMappingURL=logger-PLPDWACQ.js.map
@@ -1,6 +0,0 @@
1
- export { discoverModels, getAllModels, getDisplayOrder, getModelInfo, isKnownModel, registerModel } from './chunk-FIC7AK4Q.js';
2
- import './chunk-62HSGYQD.js';
3
- import './chunk-HEKFAKVH.js';
4
- import './chunk-BY4DAKUU.js';
5
- //# sourceMappingURL=model-discovery-O64ZWPX5.js.map
6
- //# sourceMappingURL=model-discovery-O64ZWPX5.js.map
@@ -1,8 +0,0 @@
1
- export { ClaudeNativeCLIAdapter, CodexNativeCLIAdapter, GeminiNativeCLIAdapter, KimiNativeCLIAdapter, logNativeAdapterSelection } from './chunk-RYOB3TLZ.js';
2
- import './chunk-FIC7AK4Q.js';
3
- import './chunk-473JN6M5.js';
4
- import './chunk-62HSGYQD.js';
5
- import './chunk-HEKFAKVH.js';
6
- import './chunk-BY4DAKUU.js';
7
- //# sourceMappingURL=native-cli-adapters-JMZX2C2C.js.map
8
- //# sourceMappingURL=native-cli-adapters-JMZX2C2C.js.map
@@ -1,5 +0,0 @@
1
- export { OllamaAdapter } from './chunk-2NWNIKBK.js';
2
- import './chunk-62HSGYQD.js';
3
- import './chunk-HEKFAKVH.js';
4
- //# sourceMappingURL=ollama-adapter-GE67BNSS.js.map
5
- //# sourceMappingURL=ollama-adapter-GE67BNSS.js.map
@@ -1,7 +0,0 @@
1
- export { OpenAIAdapter } from './chunk-P5TKZM3T.js';
2
- import './chunk-ODBY7S4X.js';
3
- import './chunk-473JN6M5.js';
4
- import './chunk-62HSGYQD.js';
5
- import './chunk-HEKFAKVH.js';
6
- //# sourceMappingURL=openai-adapter-SHPLK77L.js.map
7
- //# sourceMappingURL=openai-adapter-SHPLK77L.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"openai-adapter-SHPLK77L.js"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/orchestrator/profiles/profile-loader.ts"],"names":["parseYaml"],"mappings":"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","file":"profile-loader-TNAXBLDX.js","sourcesContent":["/**\r\n * ProfileLoader — loads, lists, installs, and resolves agent profiles.\r\n *\r\n * Agent profiles are Markdown files with YAML frontmatter that define\r\n * an agent's identity (name, description, preferred CLI provider) and\r\n * a system prompt body.\r\n *\r\n * Resolution order: user store (~/.aemeathcli/agent-store/) takes\r\n * priority over the built-in store shipped with the package.\r\n */\r\n\r\nimport {\r\n readFileSync,\r\n readdirSync,\r\n existsSync,\r\n mkdirSync,\r\n writeFileSync,\r\n} from \"node:fs\";\r\nimport { join, basename } from \"node:path\";\r\nimport { fileURLToPath } from \"node:url\";\r\nimport { parse as parseYaml } from \"yaml\";\r\nimport { getAemeathHome } from \"../../utils/pathResolver.js\";\r\nimport { CLI_PROVIDERS, type AgentProfile, type CliProviderType } from \"../constants.js\";\r\n\r\n// ── Store Paths ──────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Built-in agent-store directory, co-located with the source/dist tree.\r\n * Uses `import.meta.url` so it resolves correctly after compilation.\r\n */\r\nconst DIST_BUILTIN_STORE = fileURLToPath(new URL(\"./agent-store/\", import.meta.url));\r\nconst SOURCE_BUILTIN_STORE = fileURLToPath(new URL(\"../agent-store/\", import.meta.url));\r\nconst BUILTIN_STORE = existsSync(DIST_BUILTIN_STORE) ? DIST_BUILTIN_STORE : SOURCE_BUILTIN_STORE;\r\n\r\n/** Per-user override directory. */\r\nconst USER_STORE: string = join(getAemeathHome(), \"agent-store\");\r\nconst MAX_PROFILE_BYTES = 64 * 1024;\r\n\r\n// ── Frontmatter Shape ────────────────────────────────────────────────────\r\n\r\ninterface ProfileFrontmatter {\r\n name?: string;\r\n description?: string;\r\n provider?: string;\r\n}\r\n\r\nfunction sanitizeProfileName(name: string): string {\r\n const normalized = name\r\n .trim()\r\n .replace(/\\.md$/iu, \"\")\r\n .replace(/[^a-zA-Z0-9._-]+/gu, \"-\")\r\n .replace(/^-+/u, \"\")\r\n .replace(/-+/gu, \"-\");\r\n\r\n if (normalized.length === 0 || normalized === \".\" || normalized === \"..\") {\r\n throw new Error(\"Profile name must contain at least one alphanumeric character\");\r\n }\r\n\r\n return normalized;\r\n}\r\n\r\nfunction assertProfileSize(content: string, source: string): void {\r\n if (Buffer.byteLength(content, \"utf-8\") > MAX_PROFILE_BYTES) {\r\n throw new Error(`Profile is too large: ${source}`);\r\n }\r\n}\r\n\r\n// ── ProfileLoader ────────────────────────────────────────────────────────\r\n\r\nexport class ProfileLoader {\r\n constructor() {\r\n // Ensure the user store directory exists on first access.\r\n mkdirSync(USER_STORE, { recursive: true });\r\n }\r\n\r\n // ── Core API ─────────────────────────────────────────────────────────\r\n\r\n /**\r\n * Load a profile by name.\r\n * User store takes priority over the built-in store.\r\n */\r\n load(name: string): AgentProfile {\r\n const fileName = name.endsWith(\".md\") ? name : `${name}.md`;\r\n\r\n // Try user store first\r\n const userPath = join(USER_STORE, fileName);\r\n if (existsSync(userPath)) {\r\n return this.parseProfile(readFileSync(userPath, \"utf-8\"), userPath);\r\n }\r\n\r\n // Fall back to built-in store\r\n const builtinPath = join(BUILTIN_STORE, fileName);\r\n if (existsSync(builtinPath)) {\r\n return this.parseProfile(\r\n readFileSync(builtinPath, \"utf-8\"),\r\n builtinPath,\r\n );\r\n }\r\n\r\n throw new Error(`Agent profile not found: ${name}`);\r\n }\r\n\r\n /**\r\n * List all available profiles (user + built-in, deduplicated by name).\r\n * User profiles shadow built-in profiles with the same name.\r\n */\r\n listProfiles(): AgentProfile[] {\r\n const seen = new Set<string>();\r\n const profiles: AgentProfile[] = [];\r\n\r\n // User profiles first — they take priority\r\n for (const dir of [USER_STORE, BUILTIN_STORE]) {\r\n if (!existsSync(dir)) continue;\r\n for (const file of readdirSync(dir)) {\r\n if (!file.endsWith(\".md\")) continue;\r\n const name = basename(file, \".md\");\r\n if (seen.has(name)) continue;\r\n seen.add(name);\r\n try {\r\n profiles.push(this.load(name));\r\n } catch {\r\n // Skip malformed profiles silently\r\n }\r\n }\r\n }\r\n\r\n return profiles;\r\n }\r\n\r\n /**\r\n * Install a profile from a local file path or remote URL.\r\n * The profile is validated before being written to the user store.\r\n * Returns the canonical profile name (filename without extension).\r\n */\r\n async install(source: string): Promise<string> {\r\n let content: string;\r\n\r\n if (source.startsWith(\"http://\") || source.startsWith(\"https://\")) {\r\n const url = new URL(source);\r\n if (url.protocol !== \"https:\") {\r\n throw new Error(\"Remote profile installation requires HTTPS\");\r\n }\r\n\r\n const response = await fetch(url);\r\n if (!response.ok) {\r\n throw new Error(`Failed to fetch profile: ${response.statusText}`);\r\n }\r\n\r\n const contentLength = response.headers.get(\"content-length\");\r\n if (contentLength !== null && Number(contentLength) > MAX_PROFILE_BYTES) {\r\n throw new Error(\"Remote profile exceeds the maximum supported size\");\r\n }\r\n\r\n content = await response.text();\r\n } else {\r\n if (!existsSync(source)) {\r\n throw new Error(`Profile source file not found: ${source}`);\r\n }\r\n content = readFileSync(source, \"utf-8\");\r\n }\r\n\r\n assertProfileSize(content, source);\r\n\r\n // Validate that the content is a valid profile\r\n const profile = this.parseProfile(content, source);\r\n const profileName = sanitizeProfileName(profile.name);\r\n\r\n const destPath = join(USER_STORE, `${profileName}.md`);\r\n writeFileSync(destPath, content, \"utf-8\");\r\n\r\n return profileName;\r\n }\r\n\r\n /**\r\n * Resolve the CLI provider for a profile, falling back to the given\r\n * default when the profile is missing or does not specify a provider.\r\n */\r\n resolveProvider(name: string, fallback: CliProviderType): CliProviderType {\r\n try {\r\n const profile = this.load(name);\r\n return profile.provider ?? fallback;\r\n } catch {\r\n return fallback;\r\n }\r\n }\r\n\r\n // ── Internal Parser ──────────────────────────────────────────────────\r\n\r\n /**\r\n * Parse a profile Markdown file with optional YAML frontmatter.\r\n *\r\n * Accepted formats:\r\n *\r\n * ---\r\n * name: my-agent\r\n * description: Does cool things\r\n * provider: claude-code\r\n * ---\r\n * # System Prompt Body ...\r\n *\r\n * If no frontmatter block is present the entire file is treated as\r\n * the system prompt and the file's basename is used as the name.\r\n */\r\n private parseProfile(content: string, sourcePath: string): AgentProfile {\r\n const match = content.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---\\r?\\n([\\s\\S]*)$/);\r\n if (!match) {\r\n // No frontmatter — treat entire content as system prompt\r\n const name = sanitizeProfileName(basename(sourcePath, \".md\"));\r\n return {\r\n name,\r\n description: name,\r\n systemPrompt: content.trim(),\r\n };\r\n }\r\n\r\n const rawFrontmatter = match[1] || \"\";\r\n const body = (match[2] || \"\").trim();\r\n if (body.length === 0) {\r\n throw new Error(`Profile body is empty: ${sourcePath}`);\r\n }\r\n\r\n const frontmatter = parseYaml(rawFrontmatter) as ProfileFrontmatter;\r\n\r\n const provider = frontmatter.provider;\r\n const resolvedProvider =\r\n provider && (CLI_PROVIDERS as readonly string[]).includes(provider)\r\n ? provider as CliProviderType\r\n : undefined;\r\n\r\n return {\r\n name: sanitizeProfileName(frontmatter.name ?? basename(sourcePath, \".md\")),\r\n description: frontmatter.description ?? \"\",\r\n provider: resolvedProvider,\r\n systemPrompt: body,\r\n };\r\n }\r\n}\r\n"]}
@@ -1,6 +0,0 @@
1
- export { ProviderRegistry, createDefaultRegistry } from './chunk-P66WDACW.js';
2
- import './chunk-473JN6M5.js';
3
- import './chunk-62HSGYQD.js';
4
- import './chunk-HEKFAKVH.js';
5
- //# sourceMappingURL=registry-3NHVCXCZ.js.map
6
- //# sourceMappingURL=registry-3NHVCXCZ.js.map
@@ -1,5 +0,0 @@
1
- export { SkillRegistry } from './chunk-TDFTX32B.js';
2
- import './chunk-HEKFAKVH.js';
3
- import './chunk-BY4DAKUU.js';
4
- //# sourceMappingURL=registry-7CQ3NCAD.js.map
5
- //# sourceMappingURL=registry-7CQ3NCAD.js.map
@@ -1,5 +0,0 @@
1
- export { MCPServerManager } from './chunk-2LF7ALGR.js';
2
- import './chunk-473JN6M5.js';
3
- import './chunk-HEKFAKVH.js';
4
- //# sourceMappingURL=server-manager-DES23IBQ.js.map
5
- //# sourceMappingURL=server-manager-DES23IBQ.js.map
@@ -1,12 +0,0 @@
1
- export { SessionManager } from './chunk-H2SYKIMI.js';
2
- import './chunk-6GUD7QIM.js';
3
- import './chunk-AQ23TYSQ.js';
4
- import './chunk-VJNQJALF.js';
5
- import './chunk-VBLLDY4R.js';
6
- import './chunk-2GKOK6T7.js';
7
- import './chunk-473JN6M5.js';
8
- import './chunk-62HSGYQD.js';
9
- import './chunk-HEKFAKVH.js';
10
- import './chunk-BY4DAKUU.js';
11
- //# sourceMappingURL=session-manager-EHD7GWM2.js.map
12
- //# sourceMappingURL=session-manager-EHD7GWM2.js.map
@@ -1,5 +0,0 @@
1
- export { SqliteStore } from './chunk-IARA5XYP.js';
2
- import './chunk-HEKFAKVH.js';
3
- import './chunk-BY4DAKUU.js';
4
- //# sourceMappingURL=sqlite-store-7ZIVOUNI.js.map
5
- //# sourceMappingURL=sqlite-store-7ZIVOUNI.js.map
@@ -1,11 +0,0 @@
1
- export { TeamManager } from './chunk-LCYH4T6N.js';
2
- import './chunk-ROJPFPJ7.js';
3
- import './chunk-VJNQJALF.js';
4
- import './chunk-VBLLDY4R.js';
5
- import './chunk-2GKOK6T7.js';
6
- import './chunk-473JN6M5.js';
7
- import './chunk-62HSGYQD.js';
8
- import './chunk-HEKFAKVH.js';
9
- import './chunk-BY4DAKUU.js';
10
- //# sourceMappingURL=team-manager-6DCNLGTC.js.map
11
- //# sourceMappingURL=team-manager-6DCNLGTC.js.map
@@ -1,3 +0,0 @@
1
- export { getActiveTeamManager, getActiveTeamName, getActiveTmuxCleanup, setActiveTeamManager, setActiveTeamName, setActiveTmuxCleanup } from './chunk-WAYSJMPS.js';
2
- //# sourceMappingURL=team-state-R2D7DT5M.js.map
3
- //# sourceMappingURL=team-state-R2D7DT5M.js.map
@@ -1,6 +0,0 @@
1
- export { TmuxManager } from './chunk-LDVY5ELP.js';
2
- import './chunk-ROJPFPJ7.js';
3
- import './chunk-473JN6M5.js';
4
- import './chunk-HEKFAKVH.js';
5
- //# sourceMappingURL=tmux-manager-WBKHUHDT.js.map
6
- //# sourceMappingURL=tmux-manager-WBKHUHDT.js.map
@@ -1,6 +0,0 @@
1
- export { ToolRegistry, createBashTool, createDefaultRegistry, createEditTool, createGitTool, createGlobTool, createGrepTool, createReadTool, createWebFetchTool, createWebSearchTool, createWriteTool, setWebSearchProvider } from './chunk-SOQFMNQC.js';
2
- import './chunk-VBLLDY4R.js';
3
- import './chunk-473JN6M5.js';
4
- import './chunk-HEKFAKVH.js';
5
- //# sourceMappingURL=tools-I6XCTEZY.js.map
6
- //# sourceMappingURL=tools-I6XCTEZY.js.map