aemeathcli 1.0.11 → 1.0.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (218) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +620 -609
  3. package/dist/{App-YAHJUWCX.js → App-JQ622M66.js} +209 -52
  4. package/dist/App-JQ622M66.js.map +1 -0
  5. package/dist/agent-store/architect.md +32 -32
  6. package/dist/agent-store/debugger.md +32 -32
  7. package/dist/agent-store/developer.md +29 -29
  8. package/dist/agent-store/documenter.md +30 -30
  9. package/dist/agent-store/researcher.md +31 -31
  10. package/dist/agent-store/reviewer.md +28 -28
  11. package/dist/agent-store/supervisor.md +37 -37
  12. package/dist/agent-store/tester.md +30 -30
  13. package/dist/api-key-fallback-RJLPM3KH.js +11 -0
  14. package/dist/{api-key-fallback-UN3TJEOO.js.map → api-key-fallback-RJLPM3KH.js.map} +1 -1
  15. package/dist/auth-status-JQJOKUPF.js +13 -0
  16. package/dist/{auth-status-EIM5A5KL.js.map → auth-status-JQJOKUPF.js.map} +1 -1
  17. package/dist/{chunk-P66WDACW.js → chunk-2KMA5RBC.js} +18 -42
  18. package/dist/chunk-2KMA5RBC.js.map +1 -0
  19. package/dist/{chunk-2GKOK6T7.js → chunk-2Y7TR6BS.js} +2 -2
  20. package/dist/chunk-2Y7TR6BS.js.map +1 -0
  21. package/dist/{chunk-ONQ4WCUI.js → chunk-2ZYK5IJG.js} +6 -6
  22. package/dist/chunk-2ZYK5IJG.js.map +1 -0
  23. package/dist/{chunk-OCJPQFOR.js → chunk-36RXCZOV.js} +4 -4
  24. package/dist/chunk-36RXCZOV.js.map +1 -0
  25. package/dist/{chunk-H2SYKIMI.js → chunk-7EBLXPL4.js} +10 -10
  26. package/dist/chunk-7EBLXPL4.js.map +1 -0
  27. package/dist/{chunk-IARA5XYP.js → chunk-BIMQL4AG.js} +4 -4
  28. package/dist/chunk-BIMQL4AG.js.map +1 -0
  29. package/dist/{chunk-BY4DAKUU.js → chunk-D275MCIH.js} +2 -2
  30. package/dist/chunk-D275MCIH.js.map +1 -0
  31. package/dist/{chunk-SOQFMNQC.js → chunk-FFS4T7BZ.js} +5 -5
  32. package/dist/chunk-FFS4T7BZ.js.map +1 -0
  33. package/dist/{chunk-LDVY5ELP.js → chunk-GXAJGP2T.js} +5 -5
  34. package/dist/chunk-GXAJGP2T.js.map +1 -0
  35. package/dist/{chunk-62HSGYQD.js → chunk-HCIHOHLX.js} +2 -2
  36. package/dist/chunk-HCIHOHLX.js.map +1 -0
  37. package/dist/{chunk-6GUD7QIM.js → chunk-HESQLCLU.js} +4 -4
  38. package/dist/chunk-HESQLCLU.js.map +1 -0
  39. package/dist/{chunk-HEKFAKVH.js → chunk-IR5HLBMH.js} +2 -2
  40. package/dist/chunk-IR5HLBMH.js.map +1 -0
  41. package/dist/{chunk-2LF7ALGR.js → chunk-K2FCMRXH.js} +4 -4
  42. package/dist/chunk-K2FCMRXH.js.map +1 -0
  43. package/dist/{chunk-2NWNIKBK.js → chunk-KIC7UI5U.js} +4 -4
  44. package/dist/chunk-KIC7UI5U.js.map +1 -0
  45. package/dist/{chunk-YPFOE2QJ.js → chunk-KMOAJRDE.js} +5 -5
  46. package/dist/chunk-KMOAJRDE.js.map +1 -0
  47. package/dist/{chunk-RP2TAL3J.js → chunk-LQBALETG.js} +2 -2
  48. package/dist/chunk-LQBALETG.js.map +1 -0
  49. package/dist/{chunk-CC7MGWYY.js → chunk-M3FPQSRU.js} +2 -2
  50. package/dist/chunk-M3FPQSRU.js.map +1 -0
  51. package/dist/{chunk-3TSPZRGM.js → chunk-NQEUK763.js} +3 -3
  52. package/dist/chunk-NQEUK763.js.map +1 -0
  53. package/dist/{chunk-VBLLDY4R.js → chunk-OPWAFS6Y.js} +2 -2
  54. package/dist/chunk-OPWAFS6Y.js.map +1 -0
  55. package/dist/{chunk-RYOB3TLZ.js → chunk-PS4WEFW6.js} +6 -6
  56. package/dist/chunk-PS4WEFW6.js.map +1 -0
  57. package/dist/{chunk-LCYH4T6N.js → chunk-QK7TKNHV.js} +6 -6
  58. package/dist/chunk-QK7TKNHV.js.map +1 -0
  59. package/dist/{chunk-QCRK4QEL.js → chunk-RADJSEG5.js} +3 -3
  60. package/dist/chunk-RADJSEG5.js.map +1 -0
  61. package/dist/{chunk-AQ23TYSQ.js → chunk-SNWPI6XJ.js} +4 -4
  62. package/dist/chunk-SNWPI6XJ.js.map +1 -0
  63. package/dist/{chunk-TDFTX32B.js → chunk-UM7MSLOV.js} +4 -4
  64. package/dist/chunk-UM7MSLOV.js.map +1 -0
  65. package/dist/{chunk-FIC7AK4Q.js → chunk-VNZ3YTQD.js} +5 -5
  66. package/dist/chunk-VNZ3YTQD.js.map +1 -0
  67. package/dist/{chunk-5XFSV6PF.js → chunk-WXIN65UG.js} +6 -6
  68. package/dist/chunk-WXIN65UG.js.map +1 -0
  69. package/dist/{chunk-WC72BRHR.js → chunk-XEXWX7C7.js} +3 -3
  70. package/dist/chunk-XEXWX7C7.js.map +1 -0
  71. package/dist/{chunk-VJNQJALF.js → chunk-YCCYXDW7.js} +4 -4
  72. package/dist/chunk-YCCYXDW7.js.map +1 -0
  73. package/dist/{chunk-ROJPFPJ7.js → chunk-YL5XFHR3.js} +2 -2
  74. package/dist/chunk-YL5XFHR3.js.map +1 -0
  75. package/dist/{chunk-GU33WKPG.js → chunk-YPQ2MLAV.js} +5 -5
  76. package/dist/chunk-YPQ2MLAV.js.map +1 -0
  77. package/dist/{chunk-WAYSJMPS.js → chunk-ZCOVMVK4.js} +2 -2
  78. package/dist/chunk-ZCOVMVK4.js.map +1 -0
  79. package/dist/{chunk-473JN6M5.js → chunk-ZGOHARPV.js} +2 -2
  80. package/dist/chunk-ZGOHARPV.js.map +1 -0
  81. package/dist/{claude-login-IS5WTBMP.js → claude-login-AIFIWTYF.js} +10 -10
  82. package/dist/claude-login-AIFIWTYF.js.map +1 -0
  83. package/dist/cli.js +30 -30
  84. package/dist/cli.js.map +1 -1
  85. package/dist/{codex-login-GMPF64MR.js → codex-login-LW5X7GAM.js} +10 -10
  86. package/dist/codex-login-LW5X7GAM.js.map +1 -0
  87. package/dist/config-store-NF56VHFU.js +7 -0
  88. package/dist/{config-store-POB6I37G.js.map → config-store-NF56VHFU.js.map} +1 -1
  89. package/dist/conversation-store-7GRDQZD2.js +4 -0
  90. package/dist/{conversation-store-PRBHWQMJ.js.map → conversation-store-7GRDQZD2.js.map} +1 -1
  91. package/dist/detect-providers-QICJ5U3R.js +4 -0
  92. package/dist/{detect-providers-C4SVQHFF.js.map → detect-providers-QICJ5U3R.js.map} +1 -1
  93. package/dist/executor-FTABX2AW.js +4 -0
  94. package/dist/{executor-RUX7VK3T.js.map → executor-FTABX2AW.js.map} +1 -1
  95. package/dist/{first-run-GDEVRFPO.js → first-run-ADROZVYF.js} +13 -13
  96. package/dist/first-run-ADROZVYF.js.map +1 -0
  97. package/dist/{gemini-login-KE224MSW.js → gemini-login-TST454MX.js} +10 -10
  98. package/dist/gemini-login-TST454MX.js.map +1 -0
  99. package/dist/index.d.ts +2 -56
  100. package/dist/index.js +30 -34
  101. package/dist/index.js.map +1 -1
  102. package/dist/{input-history-MIOO3FIW.js → input-history-BEICE7PT.js} +3 -3
  103. package/dist/input-history-BEICE7PT.js.map +1 -0
  104. package/dist/kimi-adapter-7FYOAKOI.js +6 -0
  105. package/dist/{kimi-adapter-UODMNX6K.js.map → kimi-adapter-7FYOAKOI.js.map} +1 -1
  106. package/dist/{kimi-login-DNT5YBKX.js → kimi-login-3IGVOBJI.js} +10 -10
  107. package/dist/kimi-login-3IGVOBJI.js.map +1 -0
  108. package/dist/logger-KGHUQ4VE.js +3 -0
  109. package/dist/{logger-PLPDWACQ.js.map → logger-KGHUQ4VE.js.map} +1 -1
  110. package/dist/model-discovery-AAJDHRFO.js +6 -0
  111. package/dist/{model-discovery-O64ZWPX5.js.map → model-discovery-AAJDHRFO.js.map} +1 -1
  112. package/dist/native-cli-adapters-CLONTZOA.js +8 -0
  113. package/dist/{native-cli-adapters-JMZX2C2C.js.map → native-cli-adapters-CLONTZOA.js.map} +1 -1
  114. package/dist/ollama-adapter-2N5OQIEV.js +5 -0
  115. package/dist/{ollama-adapter-GE67BNSS.js.map → ollama-adapter-2N5OQIEV.js.map} +1 -1
  116. package/dist/{pathResolver-A6IXQQFE.js → pathResolver-UVAB2FCW.js} +3 -3
  117. package/dist/{pathResolver-A6IXQQFE.js.map → pathResolver-UVAB2FCW.js.map} +1 -1
  118. package/dist/{profile-loader-TNAXBLDX.js → profile-loader-EMLV4J7S.js} +4 -4
  119. package/dist/profile-loader-EMLV4J7S.js.map +1 -0
  120. package/dist/registry-LRURZVUL.js +5 -0
  121. package/dist/{registry-3NHVCXCZ.js.map → registry-LRURZVUL.js.map} +1 -1
  122. package/dist/registry-MVNSXCEF.js +6 -0
  123. package/dist/{registry-7CQ3NCAD.js.map → registry-MVNSXCEF.js.map} +1 -1
  124. package/dist/server-manager-THGZBBZB.js +5 -0
  125. package/dist/{server-manager-DES23IBQ.js.map → server-manager-THGZBBZB.js.map} +1 -1
  126. package/dist/session-manager-X3DXT53M.js +12 -0
  127. package/dist/{session-manager-EHD7GWM2.js.map → session-manager-X3DXT53M.js.map} +1 -1
  128. package/dist/skills/built-in/code-review/SKILL.md +85 -85
  129. package/dist/skills/built-in/commit/SKILL.md +83 -83
  130. package/dist/skills/built-in/debug/SKILL.md +119 -119
  131. package/dist/skills/built-in/plan/SKILL.md +123 -123
  132. package/dist/skills/built-in/refactor/SKILL.md +132 -132
  133. package/dist/skills/built-in/test/SKILL.md +128 -128
  134. package/dist/sqlite-store-7OECRTXM.js +5 -0
  135. package/dist/{sqlite-store-7ZIVOUNI.js.map → sqlite-store-7OECRTXM.js.map} +1 -1
  136. package/dist/team-manager-2VSMALAA.js +11 -0
  137. package/dist/{team-manager-6DCNLGTC.js.map → team-manager-2VSMALAA.js.map} +1 -1
  138. package/dist/team-state-HZNVMQHT.js +3 -0
  139. package/dist/{team-state-R2D7DT5M.js.map → team-state-HZNVMQHT.js.map} +1 -1
  140. package/dist/tmux-manager-57QCUVHU.js +6 -0
  141. package/dist/{tmux-manager-WBKHUHDT.js.map → tmux-manager-57QCUVHU.js.map} +1 -1
  142. package/dist/tools-KWFSYT56.js +6 -0
  143. package/dist/{tools-I6XCTEZY.js.map → tools-KWFSYT56.js.map} +1 -1
  144. package/package.json +89 -93
  145. package/dist/App-YAHJUWCX.js.map +0 -1
  146. package/dist/api-key-fallback-UN3TJEOO.js +0 -11
  147. package/dist/auth-status-EIM5A5KL.js +0 -13
  148. package/dist/chunk-25UNNEHN.js +0 -140
  149. package/dist/chunk-25UNNEHN.js.map +0 -1
  150. package/dist/chunk-2GKOK6T7.js.map +0 -1
  151. package/dist/chunk-2LF7ALGR.js.map +0 -1
  152. package/dist/chunk-2NWNIKBK.js.map +0 -1
  153. package/dist/chunk-3TSPZRGM.js.map +0 -1
  154. package/dist/chunk-473JN6M5.js.map +0 -1
  155. package/dist/chunk-5XFSV6PF.js.map +0 -1
  156. package/dist/chunk-62HSGYQD.js.map +0 -1
  157. package/dist/chunk-6GUD7QIM.js.map +0 -1
  158. package/dist/chunk-AQ23TYSQ.js.map +0 -1
  159. package/dist/chunk-BY4DAKUU.js.map +0 -1
  160. package/dist/chunk-CC7MGWYY.js.map +0 -1
  161. package/dist/chunk-CTFZTARK.js +0 -155
  162. package/dist/chunk-CTFZTARK.js.map +0 -1
  163. package/dist/chunk-FIC7AK4Q.js.map +0 -1
  164. package/dist/chunk-GU33WKPG.js.map +0 -1
  165. package/dist/chunk-H2SYKIMI.js.map +0 -1
  166. package/dist/chunk-HEKFAKVH.js.map +0 -1
  167. package/dist/chunk-IARA5XYP.js.map +0 -1
  168. package/dist/chunk-LCYH4T6N.js.map +0 -1
  169. package/dist/chunk-LDVY5ELP.js.map +0 -1
  170. package/dist/chunk-OCJPQFOR.js.map +0 -1
  171. package/dist/chunk-ODBY7S4X.js +0 -141
  172. package/dist/chunk-ODBY7S4X.js.map +0 -1
  173. package/dist/chunk-ONQ4WCUI.js.map +0 -1
  174. package/dist/chunk-P5TKZM3T.js +0 -159
  175. package/dist/chunk-P5TKZM3T.js.map +0 -1
  176. package/dist/chunk-P66WDACW.js.map +0 -1
  177. package/dist/chunk-QCRK4QEL.js.map +0 -1
  178. package/dist/chunk-ROJPFPJ7.js.map +0 -1
  179. package/dist/chunk-RP2TAL3J.js.map +0 -1
  180. package/dist/chunk-RYOB3TLZ.js.map +0 -1
  181. package/dist/chunk-SOQFMNQC.js.map +0 -1
  182. package/dist/chunk-TDFTX32B.js.map +0 -1
  183. package/dist/chunk-VBLLDY4R.js.map +0 -1
  184. package/dist/chunk-VJNQJALF.js.map +0 -1
  185. package/dist/chunk-WAYSJMPS.js.map +0 -1
  186. package/dist/chunk-WC72BRHR.js.map +0 -1
  187. package/dist/chunk-YPFOE2QJ.js.map +0 -1
  188. package/dist/claude-adapter-6P4SJH7P.js +0 -7
  189. package/dist/claude-adapter-6P4SJH7P.js.map +0 -1
  190. package/dist/claude-login-IS5WTBMP.js.map +0 -1
  191. package/dist/codex-login-GMPF64MR.js.map +0 -1
  192. package/dist/config-store-POB6I37G.js +0 -7
  193. package/dist/conversation-store-PRBHWQMJ.js +0 -4
  194. package/dist/detect-providers-C4SVQHFF.js +0 -4
  195. package/dist/executor-RUX7VK3T.js +0 -4
  196. package/dist/first-run-GDEVRFPO.js.map +0 -1
  197. package/dist/gemini-adapter-MV3U4QFH.js +0 -7
  198. package/dist/gemini-adapter-MV3U4QFH.js.map +0 -1
  199. package/dist/gemini-login-KE224MSW.js.map +0 -1
  200. package/dist/input-history-MIOO3FIW.js.map +0 -1
  201. package/dist/kimi-adapter-UODMNX6K.js +0 -6
  202. package/dist/kimi-login-DNT5YBKX.js.map +0 -1
  203. package/dist/logger-PLPDWACQ.js +0 -3
  204. package/dist/model-discovery-O64ZWPX5.js +0 -6
  205. package/dist/native-cli-adapters-JMZX2C2C.js +0 -8
  206. package/dist/ollama-adapter-GE67BNSS.js +0 -5
  207. package/dist/openai-adapter-SHPLK77L.js +0 -7
  208. package/dist/openai-adapter-SHPLK77L.js.map +0 -1
  209. package/dist/profile-loader-TNAXBLDX.js.map +0 -1
  210. package/dist/registry-3NHVCXCZ.js +0 -6
  211. package/dist/registry-7CQ3NCAD.js +0 -5
  212. package/dist/server-manager-DES23IBQ.js +0 -5
  213. package/dist/session-manager-EHD7GWM2.js +0 -12
  214. package/dist/sqlite-store-7ZIVOUNI.js +0 -5
  215. package/dist/team-manager-6DCNLGTC.js +0 -11
  216. package/dist/team-state-R2D7DT5M.js +0 -3
  217. package/dist/tmux-manager-WBKHUHDT.js +0 -6
  218. package/dist/tools-I6XCTEZY.js +0 -6
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/panes/layout-engine.ts","../src/panes/tmux-manager.ts"],"names":["firstPane","bottomPanes"],"mappings":"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","file":"chunk-LDVY5ELP.js","sourcesContent":["/**\r\n * Layout engine for split-panel auto-layout computation per PRD section 9.2.\r\n * Computes pane positions based on agent count and terminal dimensions.\r\n */\r\n\r\nimport type { PaneLayout, IPaneConfig, ILayoutConfig } from \"../types/team.js\";\r\nimport { logger } from \"../utils/logger.js\";\r\n\r\n// ── Layout Geometry ─────────────────────────────────────────────────────\r\n\r\nexport interface IPaneGeometry {\r\n readonly paneId: string;\r\n readonly row: number;\r\n readonly col: number;\r\n readonly widthPercent: number;\r\n readonly heightPercent: number;\r\n readonly splitDirection: \"horizontal\" | \"vertical\" | \"none\";\r\n}\r\n\r\nexport interface IComputedLayout {\r\n readonly panes: readonly IPaneGeometry[];\r\n readonly rows: number;\r\n readonly cols: number;\r\n readonly terminalWidth: number;\r\n readonly terminalHeight: number;\r\n}\r\n\r\ninterface ITerminalSize {\r\n readonly columns: number;\r\n readonly rows: number;\r\n}\r\n\r\n// ── Constants ───────────────────────────────────────────────────────────\r\n\r\nconst MIN_PANE_WIDTH = 40;\r\nconst MIN_PANE_HEIGHT = 10;\r\nconst DEFAULT_TERMINAL_WIDTH = 120;\r\nconst DEFAULT_TERMINAL_HEIGHT = 40;\r\nconst MAX_GRID_COLUMNS = 3;\r\n\r\n// ── Layout Engine ───────────────────────────────────────────────────────\r\n\r\nexport class LayoutEngine {\r\n private readonly terminalSize: ITerminalSize;\r\n\r\n constructor(terminalSize?: Partial<ITerminalSize>) {\r\n this.terminalSize = {\r\n columns: terminalSize?.columns ?? this.detectTerminalWidth(),\r\n rows: terminalSize?.rows ?? this.detectTerminalHeight(),\r\n };\r\n logger.debug(\r\n { terminalSize: this.terminalSize },\r\n \"LayoutEngine initialized\",\r\n );\r\n }\r\n\r\n /**\r\n * Compute the full layout for a set of pane configs.\r\n */\r\n computeLayout(config: ILayoutConfig): IComputedLayout {\r\n const paneCount = config.panes.length;\r\n if (paneCount === 0) {\r\n return {\r\n panes: [],\r\n rows: 0,\r\n cols: 0,\r\n terminalWidth: this.terminalSize.columns,\r\n terminalHeight: this.terminalSize.rows,\r\n };\r\n }\r\n\r\n const effectiveCount = Math.max(\r\n 1,\r\n Math.min(paneCount, config.maxPanes, this.getMaxPanes()),\r\n );\r\n const layout = config.layout === \"auto\"\r\n ? this.resolveAutoLayout(effectiveCount)\r\n : config.layout;\r\n\r\n const geometries = this.computeGeometries(\r\n config.panes.slice(0, effectiveCount),\r\n layout,\r\n effectiveCount,\r\n );\r\n\r\n const { gridRows, gridCols } = this.getGridDimensions(effectiveCount, layout);\r\n\r\n logger.info(\r\n { layout, paneCount: effectiveCount, gridRows, gridCols },\r\n \"Layout computed\",\r\n );\r\n\r\n return {\r\n panes: geometries,\r\n rows: gridRows,\r\n cols: gridCols,\r\n terminalWidth: this.terminalSize.columns,\r\n terminalHeight: this.terminalSize.rows,\r\n };\r\n }\r\n\r\n /**\r\n * Determine the best auto-layout for a given pane count (PRD section 9.2).\r\n */\r\n resolveAutoLayout(paneCount: number): Exclude<PaneLayout, \"auto\"> {\r\n if (paneCount <= 1) return \"horizontal\";\r\n return \"hub-spoke\";\r\n }\r\n\r\n /**\r\n * Get the maximum number of panes the terminal can support.\r\n */\r\n getMaxPanes(): number {\r\n const maxByWidth = Math.floor(this.terminalSize.columns / MIN_PANE_WIDTH);\r\n const maxByHeight = Math.floor(this.terminalSize.rows / MIN_PANE_HEIGHT);\r\n return Math.max(1, maxByWidth * maxByHeight);\r\n }\r\n\r\n /**\r\n * Check if the terminal is large enough for the requested pane count.\r\n */\r\n canFitPanes(paneCount: number): boolean {\r\n return paneCount <= this.getMaxPanes();\r\n }\r\n\r\n /**\r\n * Get the grid dimensions for a given pane count and layout type.\r\n */\r\n private getGridDimensions(\r\n paneCount: number,\r\n layout: Exclude<PaneLayout, \"auto\">,\r\n ): { gridRows: number; gridCols: number } {\r\n switch (layout) {\r\n case \"horizontal\":\r\n return { gridRows: 1, gridCols: paneCount };\r\n case \"vertical\":\r\n return { gridRows: paneCount, gridCols: 1 };\r\n case \"grid\":\r\n return this.computeGridSize(paneCount);\r\n case \"hub-spoke\":\r\n return { gridRows: Math.max(1, paneCount - 1), gridCols: 2 };\r\n }\r\n }\r\n\r\n /**\r\n * Compute grid rows and columns for a given pane count.\r\n * PRD section 9.2:\r\n * 2 agents → horizontal split (50/50) → 1x2\r\n * 3 agents → 1 top + 2 bottom → 2 rows\r\n * 4 agents → 2x2 grid\r\n * 5+ agents → leader top + grid bottom\r\n */\r\n private computeGridSize(paneCount: number): { gridRows: number; gridCols: number } {\r\n if (paneCount <= 1) return { gridRows: 1, gridCols: 1 };\r\n if (paneCount === 2) return { gridRows: 1, gridCols: 2 };\r\n if (paneCount <= 4) return { gridRows: 2, gridCols: 2 };\r\n\r\n const bottomPaneCount = paneCount - 1;\r\n const gridCols = Math.min(bottomPaneCount, MAX_GRID_COLUMNS);\r\n const gridRows = 1 + Math.ceil(bottomPaneCount / gridCols);\r\n return { gridRows, gridCols };\r\n }\r\n\r\n /**\r\n * Compute per-pane geometries based on layout type.\r\n */\r\n private computeGeometries(\r\n panes: readonly IPaneConfig[],\r\n layout: Exclude<PaneLayout, \"auto\">,\r\n paneCount: number,\r\n ): IPaneGeometry[] {\r\n switch (layout) {\r\n case \"horizontal\":\r\n return this.computeHorizontalLayout(panes);\r\n case \"vertical\":\r\n return this.computeVerticalLayout(panes);\r\n case \"grid\":\r\n return this.computeGridLayout(panes, paneCount);\r\n case \"hub-spoke\":\r\n return this.computeHubSpokeLayout(panes);\r\n }\r\n }\r\n\r\n private computeHubSpokeLayout(panes: readonly IPaneConfig[]): IPaneGeometry[] {\r\n const [leaderPane, ...workerPanes] = panes;\r\n if (!leaderPane) {\r\n return [];\r\n }\r\n\r\n const geometries: IPaneGeometry[] = [\r\n {\r\n paneId: leaderPane.paneId,\r\n row: 0,\r\n col: 0,\r\n widthPercent: workerPanes.length > 0 ? 50 : 100,\r\n heightPercent: 100,\r\n splitDirection: \"none\",\r\n },\r\n ];\r\n\r\n if (workerPanes.length === 0) {\r\n return geometries;\r\n }\r\n\r\n const workerHeightPercent = Math.floor(100 / workerPanes.length);\r\n for (const [index, pane] of workerPanes.entries()) {\r\n geometries.push({\r\n paneId: pane.paneId,\r\n row: index,\r\n col: 1,\r\n widthPercent: 50,\r\n heightPercent:\r\n index === workerPanes.length - 1\r\n ? 100 - workerHeightPercent * (workerPanes.length - 1)\r\n : workerHeightPercent,\r\n splitDirection: index === 0 ? \"horizontal\" : \"vertical\",\r\n });\r\n }\r\n\r\n return geometries;\r\n }\r\n\r\n /**\r\n * Horizontal split: all panes side by side.\r\n */\r\n private computeHorizontalLayout(panes: readonly IPaneConfig[]): IPaneGeometry[] {\r\n const widthPercent = Math.floor(100 / panes.length);\r\n return panes.map((pane, index) => ({\r\n paneId: pane.paneId,\r\n row: 0,\r\n col: index,\r\n widthPercent: index === panes.length - 1\r\n ? 100 - widthPercent * (panes.length - 1)\r\n : widthPercent,\r\n heightPercent: 100,\r\n splitDirection: index === 0 ? \"none\" as const : \"horizontal\" as const,\r\n }));\r\n }\r\n\r\n /**\r\n * Vertical split: all panes stacked.\r\n */\r\n private computeVerticalLayout(panes: readonly IPaneConfig[]): IPaneGeometry[] {\r\n const heightPercent = Math.floor(100 / panes.length);\r\n return panes.map((pane, index) => ({\r\n paneId: pane.paneId,\r\n row: index,\r\n col: 0,\r\n widthPercent: 100,\r\n heightPercent: index === panes.length - 1\r\n ? 100 - heightPercent * (panes.length - 1)\r\n : heightPercent,\r\n splitDirection: index === 0 ? \"none\" as const : \"vertical\" as const,\r\n }));\r\n }\r\n\r\n /**\r\n * Grid layout per PRD section 9.2 rules:\r\n * 3 agents → leader spans top, 2 on bottom\r\n * 4 agents → 2x2 even grid\r\n * 5+ agents → leader spans top, rest in grid below\r\n */\r\n private computeGridLayout(\r\n panes: readonly IPaneConfig[],\r\n paneCount: number,\r\n ): IPaneGeometry[] {\r\n const geometries: IPaneGeometry[] = [];\r\n\r\n if (paneCount <= 2) {\r\n return this.computeHorizontalLayout(panes);\r\n }\r\n\r\n if (paneCount === 3) {\r\n // 1 top (leader, full width) + 2 bottom\r\n const firstPane = panes[0];\r\n if (firstPane) {\r\n geometries.push({\r\n paneId: firstPane.paneId,\r\n row: 0,\r\n col: 0,\r\n widthPercent: 100,\r\n heightPercent: 50,\r\n splitDirection: \"none\",\r\n });\r\n }\r\n const bottomPanes = panes.slice(1);\r\n for (let i = 0; i < bottomPanes.length; i++) {\r\n const pane = bottomPanes[i];\r\n if (pane) {\r\n geometries.push({\r\n paneId: pane.paneId,\r\n row: 1,\r\n col: i,\r\n widthPercent: 50,\r\n heightPercent: 50,\r\n splitDirection: i === 0 ? \"vertical\" : \"horizontal\",\r\n });\r\n }\r\n }\r\n return geometries;\r\n }\r\n\r\n if (paneCount === 4) {\r\n // 2x2 even grid\r\n const { gridCols } = this.computeGridSize(4);\r\n for (let i = 0; i < panes.length; i++) {\r\n const pane = panes[i];\r\n if (pane) {\r\n const row = Math.floor(i / gridCols);\r\n const col = i % gridCols;\r\n geometries.push({\r\n paneId: pane.paneId,\r\n row,\r\n col,\r\n widthPercent: 50,\r\n heightPercent: 50,\r\n splitDirection: this.determineSplitDirection(i, row, col),\r\n });\r\n }\r\n }\r\n return geometries;\r\n }\r\n\r\n // 5+ agents: leader top + grid bottom\r\n const firstPane = panes[0];\r\n if (firstPane) {\r\n geometries.push({\r\n paneId: firstPane.paneId,\r\n row: 0,\r\n col: 0,\r\n widthPercent: 100,\r\n heightPercent: 40,\r\n splitDirection: \"none\",\r\n });\r\n }\r\n\r\n const bottomPanes = panes.slice(1);\r\n const bottomCols = Math.min(bottomPanes.length, MAX_GRID_COLUMNS);\r\n const bottomRows = Math.ceil(bottomPanes.length / bottomCols);\r\n const cellWidth = Math.floor(100 / bottomCols);\r\n const cellHeight = Math.floor(60 / bottomRows);\r\n\r\n for (let i = 0; i < bottomPanes.length; i++) {\r\n const pane = bottomPanes[i];\r\n if (pane) {\r\n const row = Math.floor(i / bottomCols) + 1;\r\n const col = i % bottomCols;\r\n const isLastInRow = col === bottomCols - 1 || i === bottomPanes.length - 1;\r\n geometries.push({\r\n paneId: pane.paneId,\r\n row,\r\n col,\r\n widthPercent: isLastInRow ? 100 - cellWidth * col : cellWidth,\r\n heightPercent: cellHeight,\r\n splitDirection: this.determineSplitDirection(i + 1, row, col),\r\n });\r\n }\r\n }\r\n\r\n return geometries;\r\n }\r\n\r\n /**\r\n * Determine split direction based on position in grid.\r\n */\r\n private determineSplitDirection(\r\n index: number,\r\n row: number,\r\n col: number,\r\n ): \"horizontal\" | \"vertical\" | \"none\" {\r\n if (index === 0) return \"none\";\r\n if (col === 0) return \"vertical\";\r\n return \"horizontal\";\r\n }\r\n\r\n /**\r\n * Detect terminal width from environment.\r\n */\r\n private detectTerminalWidth(): number {\r\n const columns = process.stdout.columns;\r\n return Number.isFinite(columns) && columns > 0 ? columns : DEFAULT_TERMINAL_WIDTH;\r\n }\r\n\r\n /**\r\n * Detect terminal height from environment.\r\n */\r\n private detectTerminalHeight(): number {\r\n const rows = process.stdout.rows;\r\n return Number.isFinite(rows) && rows > 0 ? rows : DEFAULT_TERMINAL_HEIGHT;\r\n }\r\n}\r\n","/**\r\n * TmuxManager — Programmatic tmux control per PRD section 9.2.\r\n * Creates sessions, splits panes, sends commands, manages lifecycle.\r\n */\r\n\r\nimport { execa } from \"execa\";\r\nimport type { ILayoutConfig } from \"../types/team.js\";\r\nimport type { IComputedLayout, IPaneGeometry } from \"./layout-engine.js\";\r\nimport { LayoutEngine } from \"./layout-engine.js\";\r\nimport { getEventBus } from \"../core/event-bus.js\";\r\nimport { logger } from \"../utils/logger.js\";\r\nimport { AgentSpawnError } from \"../types/errors.js\";\r\n\r\n// ── Types ───────────────────────────────────────────────────────────────\r\n\r\nexport interface ITmuxPaneInfo {\r\n readonly paneId: string;\r\n readonly tmuxPaneId: string;\r\n readonly agentName: string;\r\n readonly title: string;\r\n}\r\n\r\ninterface ITmuxManagerOptions {\r\n readonly sessionPrefix?: string;\r\n}\r\n\r\n// ── Constants ───────────────────────────────────────────────────────────\r\n\r\nconst DEFAULT_SESSION_PREFIX = \"aemeathcli\";\r\nconst TMUX_BINARY = \"tmux\";\r\n\r\n// ── TmuxManager ─────────────────────────────────────────────────────────\r\n\r\nexport class TmuxManager {\r\n private readonly sessionPrefix: string;\r\n private readonly layoutEngine: LayoutEngine;\r\n private readonly panes = new Map<string, ITmuxPaneInfo>();\r\n private sessionName: string | undefined;\r\n private disposed = false;\r\n\r\n constructor(options?: ITmuxManagerOptions) {\r\n this.sessionPrefix = options?.sessionPrefix ?? DEFAULT_SESSION_PREFIX;\r\n this.layoutEngine = new LayoutEngine();\r\n }\r\n\r\n /**\r\n * Check if tmux is available on this system.\r\n */\r\n async isAvailable(): Promise<boolean> {\r\n // tmux is Unix-only — always unavailable on Windows.\r\n if (process.platform === \"win32\") return false;\r\n\r\n try {\r\n const result = await execa(\"which\", [TMUX_BINARY]);\r\n return result.exitCode === 0;\r\n } catch {\r\n logger.warn(\"tmux binary not found on PATH\");\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Create a new tmux session for a team.\r\n */\r\n async createSession(teamName: string): Promise<string> {\r\n this.assertNotDisposed();\r\n\r\n if (!(await this.isAvailable())) {\r\n throw new AgentSpawnError(\r\n teamName,\r\n \"tmux is not installed. Install tmux or use single-pane mode.\",\r\n );\r\n }\r\n\r\n this.sessionName = `${this.sessionPrefix}-${teamName}`;\r\n const stdout = {\r\n columns: process.stdout.columns as number | undefined,\r\n rows: process.stdout.rows as number | undefined,\r\n };\r\n\r\n // Kill any existing session with the same name\r\n await this.killSessionSilent(this.sessionName);\r\n\r\n try {\r\n await execa(TMUX_BINARY, [\r\n \"new-session\",\r\n \"-d\",\r\n \"-s\", this.sessionName,\r\n \"-x\", String(stdout.columns ?? 120),\r\n \"-y\", String(stdout.rows ?? 40),\r\n ]);\r\n logger.info({ sessionName: this.sessionName }, \"tmux session created\");\r\n } catch (error: unknown) {\r\n const message = error instanceof Error ? error.message : String(error);\r\n throw new AgentSpawnError(teamName, `Failed to create tmux session: ${message}`);\r\n }\r\n\r\n return this.sessionName;\r\n }\r\n\r\n /**\r\n * Create split panes based on a layout configuration.\r\n */\r\n async createPanes(layoutConfig: ILayoutConfig): Promise<IComputedLayout> {\r\n this.assertNotDisposed();\r\n this.assertSession();\r\n\r\n const computed = this.layoutEngine.computeLayout(layoutConfig);\r\n const resolvedLayout = layoutConfig.layout === \"auto\"\r\n ? this.layoutEngine.resolveAutoLayout(layoutConfig.panes.length)\r\n : layoutConfig.layout;\r\n\r\n // First pane is already the initial pane in the session\r\n const firstGeometry = computed.panes[0];\r\n const firstConfig = layoutConfig.panes[0];\r\n if (firstGeometry && firstConfig) {\r\n const tmuxPaneId = await this.getFirstPaneId();\r\n const info: ITmuxPaneInfo = {\r\n paneId: firstConfig.paneId,\r\n tmuxPaneId,\r\n agentName: firstConfig.agentName,\r\n title: firstConfig.title,\r\n };\r\n this.panes.set(firstConfig.paneId, info);\r\n await this.setPaneTitle(tmuxPaneId, firstConfig.title);\r\n getEventBus().emit(\"pane:created\", {\r\n paneId: firstConfig.paneId,\r\n agentName: firstConfig.agentName,\r\n });\r\n }\r\n\r\n // Create remaining panes via splits\r\n for (let i = 1; i < computed.panes.length; i++) {\r\n const geometry = computed.panes[i];\r\n const config = layoutConfig.panes[i];\r\n if (!geometry || !config) continue;\r\n\r\n const tmuxPaneId = await this.splitPane(geometry);\r\n const info: ITmuxPaneInfo = {\r\n paneId: config.paneId,\r\n tmuxPaneId,\r\n agentName: config.agentName,\r\n title: config.title,\r\n };\r\n this.panes.set(config.paneId, info);\r\n await this.setPaneTitle(tmuxPaneId, config.title);\r\n getEventBus().emit(\"pane:created\", {\r\n paneId: config.paneId,\r\n agentName: config.agentName,\r\n });\r\n }\r\n\r\n await this.applyLayoutPreset(resolvedLayout);\r\n\r\n logger.info(\r\n { paneCount: this.panes.size, session: this.sessionName },\r\n \"All panes created\",\r\n );\r\n\r\n return computed;\r\n }\r\n\r\n /**\r\n * Send a command string to a specific pane.\r\n */\r\n async sendCommand(paneId: string, command: string): Promise<void> {\r\n this.assertNotDisposed();\r\n this.assertSession();\r\n\r\n const info = this.panes.get(paneId);\r\n if (!info) {\r\n logger.warn({ paneId }, \"Pane not found, cannot send command\");\r\n return;\r\n }\r\n\r\n // tmux pane IDs (%N) are globally unique — use them directly.\r\n // The format \"session:%N\" is invalid because tmux interprets\r\n // the part after \":\" as a window name, not a pane ID.\r\n await execa(TMUX_BINARY, [\r\n \"send-keys\",\r\n \"-t\", info.tmuxPaneId,\r\n command,\r\n \"Enter\",\r\n ]);\r\n\r\n logger.debug({ paneId, command: command.slice(0, 80) }, \"Command sent to pane\");\r\n }\r\n\r\n /**\r\n * Resize a pane by tmux pane target.\r\n */\r\n async resizePane(\r\n paneId: string,\r\n dimensions: { width?: number; height?: number },\r\n ): Promise<void> {\r\n this.assertNotDisposed();\r\n this.assertSession();\r\n\r\n const info = this.panes.get(paneId);\r\n if (!info) return;\r\n\r\n const target = info.tmuxPaneId;\r\n\r\n if (dimensions.width !== undefined) {\r\n await execa(TMUX_BINARY, [\"resize-pane\", \"-t\", target, \"-x\", String(dimensions.width)]);\r\n }\r\n if (dimensions.height !== undefined) {\r\n await execa(TMUX_BINARY, [\"resize-pane\", \"-t\", target, \"-y\", String(dimensions.height)]);\r\n }\r\n }\r\n\r\n /**\r\n * Set the title for a tmux pane.\r\n */\r\n private async setPaneTitle(tmuxPaneId: string, title: string): Promise<void> {\r\n if (!this.sessionName) return;\r\n try {\r\n await execa(TMUX_BINARY, [\r\n \"select-pane\",\r\n \"-t\", tmuxPaneId,\r\n \"-T\", title,\r\n ]);\r\n } catch {\r\n logger.debug({ tmuxPaneId, title }, \"Failed to set pane title (non-fatal)\");\r\n }\r\n }\r\n\r\n /**\r\n * Kill a specific pane.\r\n */\r\n async killPane(paneId: string): Promise<void> {\r\n this.assertNotDisposed();\r\n\r\n const info = this.panes.get(paneId);\r\n if (!info || !this.sessionName) return;\r\n\r\n try {\r\n await execa(TMUX_BINARY, [\r\n \"kill-pane\",\r\n \"-t\", info.tmuxPaneId,\r\n ]);\r\n this.panes.delete(paneId);\r\n getEventBus().emit(\"pane:closed\", { paneId });\r\n logger.debug({ paneId }, \"Pane killed\");\r\n } catch {\r\n logger.debug({ paneId }, \"Failed to kill pane (may already be closed)\");\r\n }\r\n }\r\n\r\n /**\r\n * Attach to the tmux session (gives control to the user).\r\n */\r\n async attachSession(): Promise<void> {\r\n this.assertNotDisposed();\r\n const sessionName = this.requireSessionName();\r\n\r\n await execa(TMUX_BINARY, [\"attach-session\", \"-t\", sessionName], {\r\n stdio: \"inherit\",\r\n });\r\n }\r\n\r\n /**\r\n * Check if the session still exists.\r\n */\r\n async isSessionAlive(): Promise<boolean> {\r\n if (!this.sessionName) return false;\r\n try {\r\n await execa(TMUX_BINARY, [\"has-session\", \"-t\", this.sessionName]);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Destroy the entire tmux session and all panes.\r\n */\r\n async destroy(): Promise<void> {\r\n if (this.disposed) return;\r\n this.disposed = true;\r\n\r\n if (this.sessionName) {\r\n await this.killSessionSilent(this.sessionName);\r\n\r\n for (const paneId of this.panes.keys()) {\r\n getEventBus().emit(\"pane:closed\", { paneId });\r\n }\r\n this.panes.clear();\r\n\r\n logger.info({ sessionName: this.sessionName }, \"tmux session destroyed\");\r\n this.sessionName = undefined;\r\n }\r\n }\r\n\r\n /**\r\n * Get the current session name.\r\n */\r\n getSessionName(): string | undefined {\r\n return this.sessionName;\r\n }\r\n\r\n /**\r\n * Get all tracked pane info.\r\n */\r\n getPanes(): ReadonlyMap<string, ITmuxPaneInfo> {\r\n return this.panes;\r\n }\r\n\r\n // ── Private Helpers ─────────────────────────────────────────────────\r\n\r\n private async splitPane(geometry: IPaneGeometry): Promise<string> {\r\n const sessionName = this.requireSessionName();\r\n const splitFlag = geometry.splitDirection === \"horizontal\" ? \"-h\" : \"-v\";\r\n\r\n const result = await execa(TMUX_BINARY, [\r\n \"split-window\",\r\n splitFlag,\r\n \"-t\", sessionName,\r\n \"-P\",\r\n \"-F\", \"#{pane_id}\",\r\n ]);\r\n\r\n const tmuxPaneId = result.stdout.trim();\r\n logger.debug(\r\n { tmuxPaneId, direction: geometry.splitDirection },\r\n \"Pane split created\",\r\n );\r\n return tmuxPaneId;\r\n }\r\n\r\n private async getFirstPaneId(): Promise<string> {\r\n const sessionName = this.requireSessionName();\r\n const result = await execa(TMUX_BINARY, [\r\n \"list-panes\",\r\n \"-t\", sessionName,\r\n \"-F\", \"#{pane_id}\",\r\n ]);\r\n const firstLine = result.stdout.trim().split(\"\\n\")[0];\r\n return firstLine ?? \"%0\";\r\n }\r\n\r\n private async applyLayoutPreset(layout: Exclude<ILayoutConfig[\"layout\"], \"auto\">): Promise<void> {\r\n if (!this.sessionName) return;\r\n const tmuxLayout = layout === \"hub-spoke\" ? \"main-vertical\" : \"tiled\";\r\n try {\r\n await execa(TMUX_BINARY, [\r\n \"select-layout\",\r\n \"-t\", this.sessionName,\r\n tmuxLayout,\r\n ]);\r\n } catch {\r\n logger.debug({ layout: tmuxLayout }, \"Failed to apply tmux layout preset (non-fatal)\");\r\n }\r\n }\r\n\r\n private async killSessionSilent(sessionName: string): Promise<void> {\r\n try {\r\n await execa(TMUX_BINARY, [\"kill-session\", \"-t\", sessionName]);\r\n } catch {\r\n // Session may not exist — ignore\r\n }\r\n }\r\n\r\n private assertNotDisposed(): void {\r\n if (this.disposed) {\r\n throw new AgentSpawnError(\"tmux\", \"TmuxManager has been disposed\");\r\n }\r\n }\r\n\r\n private assertSession(): void {\r\n if (!this.sessionName) {\r\n throw new AgentSpawnError(\"tmux\", \"No active tmux session. Call createSession() first.\");\r\n }\r\n }\r\n\r\n private requireSessionName(): string {\r\n if (!this.sessionName) {\r\n throw new AgentSpawnError(\"tmux\", \"No active tmux session. Call createSession() first.\");\r\n }\r\n return this.sessionName;\r\n }\r\n}\r\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/auth/auth-status.ts"],"names":[],"mappings":"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","file":"chunk-OCJPQFOR.js","sourcesContent":["import { ApiKeyFallback } from \"./api-key-fallback.js\";\r\nimport { SessionManager } from \"./session-manager.js\";\r\nimport type { AuthMethod, ProviderName } from \"../types/index.js\";\r\n\r\nexport const LOGIN_PROVIDERS = [\"claude\", \"codex\", \"gemini\", \"kimi\"] as const;\r\nexport type LoginProvider = (typeof LOGIN_PROVIDERS)[number];\r\n\r\nexport interface IAuthStatusRecord {\r\n readonly provider: LoginProvider;\r\n readonly loggedIn: boolean;\r\n readonly authMethod?: AuthMethod;\r\n readonly email?: string;\r\n readonly plan?: string;\r\n readonly launchReady: boolean;\r\n readonly launchMethod?: AuthMethod;\r\n}\r\n\r\nconst PROVIDER_MODEL_SWITCH: Readonly<Record<LoginProvider, { provider: ProviderName; model: string }>> = {\r\n claude: { provider: \"anthropic\", model: \"claude-sonnet-4-6\" },\r\n codex: { provider: \"openai\", model: \"gpt-5.2\" },\r\n gemini: { provider: \"google\", model: \"gemini-2.5-pro\" },\r\n kimi: { provider: \"kimi\", model: \"kimi-for-coding\" },\r\n};\r\n\r\nfunction formatAuthMethodLabel(method?: AuthMethod): string {\r\n switch (method) {\r\n case \"native_login\":\r\n return \"CLI login\";\r\n case \"api_key\":\r\n return \"API key\";\r\n case \"env_variable\":\r\n return \"env var\";\r\n case \"credential_helper\":\r\n return \"credential helper\";\r\n default:\r\n return \"configured\";\r\n }\r\n}\r\n\r\nfunction formatCompactLoginState(email?: string, plan?: string): string {\r\n if (email !== undefined && plan !== undefined) {\r\n return `Logged in as ${email} (${plan})`;\r\n }\r\n\r\n if (email !== undefined) {\r\n return `Logged in as ${email}`;\r\n }\r\n\r\n if (plan !== undefined) {\r\n return `Logged in (${plan})`;\r\n }\r\n\r\n return \"Logged in\";\r\n}\r\n\r\nexport async function getAuthStatusRecord(provider: LoginProvider): Promise<IAuthStatusRecord> {\r\n const providerName = PROVIDER_MODEL_SWITCH[provider].provider;\r\n const sessionManager = new SessionManager();\r\n const fallback = new ApiKeyFallback();\r\n const activeCredential = await sessionManager.getActiveCredential(providerName).catch(() => undefined);\r\n const storedApiKey = await fallback.getCredential(providerName);\r\n const envCredential = fallback.getFromEnvironment(providerName);\r\n const launchCredential = storedApiKey ?? envCredential;\r\n\r\n let email: string | undefined;\r\n let plan: string | undefined;\r\n if (activeCredential?.method === \"native_login\") {\r\n const status = await sessionManager.getStatus(providerName);\r\n email = status.email;\r\n plan = status.plan;\r\n }\r\n\r\n // Swarm mode is ready if ANY credential exists — native CLI login (OAuth)\r\n // is sufficient because the native CLI adapters shell out to the provider's\r\n // own CLI (claude, codex, gemini, kimi) which already holds the session.\r\n const launchReady = activeCredential !== undefined || launchCredential !== undefined;\r\n const launchMethod = launchCredential?.method ?? activeCredential?.method;\r\n\r\n return {\r\n provider,\r\n loggedIn: activeCredential !== undefined,\r\n ...(activeCredential?.method !== undefined ? { authMethod: activeCredential.method } : {}),\r\n ...(email !== undefined ? { email } : {}),\r\n ...(plan !== undefined ? { plan } : {}),\r\n launchReady,\r\n ...(launchMethod !== undefined ? { launchMethod } : {}),\r\n };\r\n}\r\n\r\nexport async function getAuthStatusRecords(): Promise<readonly IAuthStatusRecord[]> {\r\n return Promise.all(LOGIN_PROVIDERS.map(async (provider) => getAuthStatusRecord(provider)));\r\n}\r\n\r\nexport function formatDetailedAuthStatusLine(record: IAuthStatusRecord): string {\r\n if (!record.loggedIn) {\r\n return ` ✗ ${record.provider} — Not logged in`;\r\n }\r\n\r\n const identity =\r\n record.email !== undefined\r\n ? ` as ${record.email}${record.plan !== undefined ? ` (${record.plan})` : \"\"}`\r\n : record.plan !== undefined\r\n ? ` (${record.plan})`\r\n : \"\";\r\n const launchStatus = record.launchReady\r\n ? `swarm-ready via ${formatAuthMethodLabel(record.launchMethod)}`\r\n : \"not authenticated — run `aemeathcli auth login` or set an API key\";\r\n\r\n return ` ✓ ${record.provider} — ${formatAuthMethodLabel(record.authMethod)}${identity}; ${launchStatus}`;\r\n}\r\n\r\nexport function formatCompactAuthStatusLine(record: IAuthStatusRecord): string {\r\n if (!record.loggedIn) {\r\n return ` ✗ ${record.provider} — Not logged in`;\r\n }\r\n\r\n if (record.authMethod === \"native_login\" || record.authMethod === undefined) {\r\n return ` ✓ ${record.provider} — ${formatCompactLoginState(record.email, record.plan)}`;\r\n }\r\n\r\n return ` ✓ ${record.provider} — Configured via ${formatAuthMethodLabel(record.authMethod)}`;\r\n}\r\n"]}
@@ -1,141 +0,0 @@
1
- import { jsonSchema } from 'ai';
2
-
3
- // src/providers/ai-sdk-shared.ts
4
- function normalizeToolInput(input) {
5
- if (typeof input === "object" && input !== null && !Array.isArray(input)) {
6
- return input;
7
- }
8
- return { value: input };
9
- }
10
- function buildAiSdkTools(tools) {
11
- if (tools === void 0 || tools.length === 0) {
12
- return void 0;
13
- }
14
- const result = {};
15
- for (const tool of tools) {
16
- const properties = {};
17
- const required = [];
18
- for (const param of tool.parameters) {
19
- const property = {
20
- type: param.type,
21
- description: param.description
22
- };
23
- if (param.enum !== void 0) {
24
- property["enum"] = param.enum;
25
- }
26
- if (param.default !== void 0) {
27
- property["default"] = param.default;
28
- }
29
- properties[param.name] = property;
30
- if (param.required) {
31
- required.push(param.name);
32
- }
33
- }
34
- const inputSchema = {
35
- type: "object",
36
- properties,
37
- required
38
- };
39
- result[tool.name] = {
40
- description: tool.description,
41
- inputSchema: jsonSchema(inputSchema)
42
- };
43
- }
44
- return result;
45
- }
46
- function buildModelMessages(messages, options) {
47
- const mapRole = options?.mapRole ?? ((role) => role);
48
- return messages.map((message) => {
49
- if (message.role === "assistant" && message.toolCalls !== void 0 && message.toolCalls.length > 0) {
50
- const parts = [];
51
- if (message.content.length > 0) {
52
- parts.push({ type: "text", text: message.content });
53
- }
54
- for (const toolCall of message.toolCalls) {
55
- parts.push({
56
- type: "tool-call",
57
- toolCallId: toolCall.id,
58
- toolName: toolCall.name,
59
- input: toolCall.arguments
60
- });
61
- }
62
- return { role: "assistant", content: parts };
63
- }
64
- if (message.role === "tool") {
65
- const firstToolCall = message.toolCalls?.[0];
66
- if (firstToolCall !== void 0) {
67
- return {
68
- role: "tool",
69
- content: [{
70
- type: "tool-result",
71
- toolCallId: firstToolCall.id,
72
- toolName: firstToolCall.name,
73
- output: {
74
- type: "text",
75
- value: message.content
76
- }
77
- }]
78
- };
79
- }
80
- }
81
- const mappedRole = mapRole(message.role);
82
- if (mappedRole === "assistant") {
83
- return {
84
- role: "assistant",
85
- content: message.content
86
- };
87
- }
88
- if (mappedRole === "system") {
89
- return {
90
- role: "system",
91
- content: message.content
92
- };
93
- }
94
- return {
95
- role: "user",
96
- content: message.content
97
- };
98
- });
99
- }
100
- function extractAiSdkToolCalls(toolCalls) {
101
- if (toolCalls === void 0 || toolCalls.length === 0) {
102
- return [];
103
- }
104
- return toolCalls.map((toolCall) => ({
105
- id: toolCall.toolCallId,
106
- name: toolCall.toolName,
107
- arguments: normalizeToolInput(toolCall.input)
108
- }));
109
- }
110
- function buildTokenUsage(modelInfo, usage) {
111
- const inputTokens = usage.inputTokens ?? 0;
112
- const outputTokens = usage.outputTokens ?? 0;
113
- const totalTokens = usage.totalTokens ?? inputTokens + outputTokens;
114
- return {
115
- inputTokens,
116
- outputTokens,
117
- totalTokens,
118
- costUsd: computeCost(modelInfo, inputTokens, outputTokens)
119
- };
120
- }
121
- function mapAiSdkFinishReason(reason, aliases) {
122
- const stopAliases = new Set(aliases?.stop ?? []);
123
- const maxTokenAliases = new Set(aliases?.maxTokens ?? []);
124
- if (reason === "stop" || stopAliases.has(reason ?? "")) {
125
- return "stop";
126
- }
127
- if (reason === "tool-calls") {
128
- return "tool_calls";
129
- }
130
- if (reason === "length" || maxTokenAliases.has(reason ?? "")) {
131
- return "max_tokens";
132
- }
133
- return "stop";
134
- }
135
- function computeCost(modelInfo, inputTokens, outputTokens) {
136
- return inputTokens / 1e6 * modelInfo.inputPricePerMToken + outputTokens / 1e6 * modelInfo.outputPricePerMToken;
137
- }
138
-
139
- export { buildAiSdkTools, buildModelMessages, buildTokenUsage, extractAiSdkToolCalls, mapAiSdkFinishReason };
140
- //# sourceMappingURL=chunk-ODBY7S4X.js.map
141
- //# sourceMappingURL=chunk-ODBY7S4X.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/providers/ai-sdk-shared.ts"],"names":[],"mappings":"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","file":"chunk-ODBY7S4X.js","sourcesContent":["import { jsonSchema, type ModelMessage } from \"ai\";\r\nimport type { IModelInfo, ITokenUsage } from \"../types/model.js\";\r\nimport type { IChatMessage, IToolCall, IToolDefinition } from \"../types/message.js\";\r\n\r\ntype AiSdkToolEntry = {\r\n readonly description: string;\r\n readonly inputSchema: ReturnType<typeof jsonSchema<Record<string, unknown>>>;\r\n};\r\n\r\nexport type AiSdkToolSet = Record<string, AiSdkToolEntry>;\r\n\r\ntype FinishReason = \"stop\" | \"tool_calls\" | \"max_tokens\" | \"error\";\r\n\r\ntype FinishReasonAliases = {\r\n readonly stop?: readonly string[] | undefined;\r\n readonly maxTokens?: readonly string[] | undefined;\r\n};\r\n\r\nfunction normalizeToolInput(input: unknown): Record<string, unknown> {\r\n if (typeof input === \"object\" && input !== null && !Array.isArray(input)) {\r\n return input as Record<string, unknown>;\r\n }\r\n\r\n return { value: input };\r\n}\r\n\r\nexport function buildAiSdkTools(\r\n tools: readonly IToolDefinition[] | undefined,\r\n): AiSdkToolSet | undefined {\r\n if (tools === undefined || tools.length === 0) {\r\n return undefined;\r\n }\r\n\r\n const result: AiSdkToolSet = {};\r\n\r\n for (const tool of tools) {\r\n const properties: Record<string, unknown> = {};\r\n const required: string[] = [];\r\n\r\n for (const param of tool.parameters) {\r\n const property: Record<string, unknown> = {\r\n type: param.type,\r\n description: param.description,\r\n };\r\n\r\n if (param.enum !== undefined) {\r\n property[\"enum\"] = param.enum;\r\n }\r\n if (param.default !== undefined) {\r\n property[\"default\"] = param.default;\r\n }\r\n\r\n properties[param.name] = property;\r\n\r\n if (param.required) {\r\n required.push(param.name);\r\n }\r\n }\r\n\r\n const inputSchema = {\r\n type: \"object\",\r\n properties,\r\n required,\r\n } as Parameters<typeof jsonSchema<Record<string, unknown>>>[0];\r\n\r\n result[tool.name] = {\r\n description: tool.description,\r\n inputSchema: jsonSchema<Record<string, unknown>>(inputSchema),\r\n };\r\n }\r\n\r\n return result;\r\n}\r\n\r\nexport function buildModelMessages(\r\n messages: readonly IChatMessage[],\r\n options?: {\r\n readonly mapRole?: ((role: IChatMessage[\"role\"]) => ModelMessage[\"role\"]) | undefined;\r\n },\r\n): ModelMessage[] {\r\n const mapRole = options?.mapRole ?? ((role: IChatMessage[\"role\"]) => role as ModelMessage[\"role\"]);\r\n\r\n return messages.map((message) => {\r\n if (message.role === \"assistant\" && message.toolCalls !== undefined && message.toolCalls.length > 0) {\r\n const parts: Array<\r\n | { type: \"text\"; text: string }\r\n | { type: \"tool-call\"; toolCallId: string; toolName: string; input: Record<string, unknown> }\r\n > = [];\r\n\r\n if (message.content.length > 0) {\r\n parts.push({ type: \"text\", text: message.content });\r\n }\r\n\r\n for (const toolCall of message.toolCalls) {\r\n parts.push({\r\n type: \"tool-call\",\r\n toolCallId: toolCall.id,\r\n toolName: toolCall.name,\r\n input: toolCall.arguments,\r\n });\r\n }\r\n\r\n return { role: \"assistant\" as const, content: parts };\r\n }\r\n\r\n if (message.role === \"tool\") {\r\n const firstToolCall = message.toolCalls?.[0];\r\n\r\n if (firstToolCall !== undefined) {\r\n return {\r\n role: \"tool\" as const,\r\n content: [{\r\n type: \"tool-result\" as const,\r\n toolCallId: firstToolCall.id,\r\n toolName: firstToolCall.name,\r\n output: {\r\n type: \"text\" as const,\r\n value: message.content,\r\n },\r\n }],\r\n };\r\n }\r\n }\r\n\r\n const mappedRole = mapRole(message.role);\r\n\r\n if (mappedRole === \"assistant\") {\r\n return {\r\n role: \"assistant\" as const,\r\n content: message.content,\r\n };\r\n }\r\n\r\n if (mappedRole === \"system\") {\r\n return {\r\n role: \"system\" as const,\r\n content: message.content,\r\n };\r\n }\r\n\r\n return {\r\n role: \"user\" as const,\r\n content: message.content,\r\n };\r\n });\r\n}\r\n\r\nexport function extractAiSdkToolCalls(\r\n toolCalls: readonly { toolCallId: string; toolName: string; input: unknown }[] | undefined,\r\n): IToolCall[] {\r\n if (toolCalls === undefined || toolCalls.length === 0) {\r\n return [];\r\n }\r\n\r\n return toolCalls.map((toolCall) => ({\r\n id: toolCall.toolCallId,\r\n name: toolCall.toolName,\r\n arguments: normalizeToolInput(toolCall.input),\r\n }));\r\n}\r\n\r\nexport function buildTokenUsage(\r\n modelInfo: IModelInfo,\r\n usage: {\r\n readonly inputTokens: number | undefined;\r\n readonly outputTokens: number | undefined;\r\n readonly totalTokens: number | undefined;\r\n },\r\n): ITokenUsage {\r\n const inputTokens = usage.inputTokens ?? 0;\r\n const outputTokens = usage.outputTokens ?? 0;\r\n const totalTokens = usage.totalTokens ?? (inputTokens + outputTokens);\r\n\r\n return {\r\n inputTokens,\r\n outputTokens,\r\n totalTokens,\r\n costUsd: computeCost(modelInfo, inputTokens, outputTokens),\r\n };\r\n}\r\n\r\nexport function mapAiSdkFinishReason(\r\n reason: string | undefined,\r\n aliases?: FinishReasonAliases,\r\n): FinishReason {\r\n const stopAliases = new Set(aliases?.stop ?? []);\r\n const maxTokenAliases = new Set(aliases?.maxTokens ?? []);\r\n\r\n if (reason === \"stop\" || stopAliases.has(reason ?? \"\")) {\r\n return \"stop\";\r\n }\r\n\r\n if (reason === \"tool-calls\") {\r\n return \"tool_calls\";\r\n }\r\n\r\n if (reason === \"length\" || maxTokenAliases.has(reason ?? \"\")) {\r\n return \"max_tokens\";\r\n }\r\n\r\n return \"stop\";\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"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/core/context-manager.ts","../src/core/cost-tracker.ts","../src/core/permission-manager.ts","../src/core/task-orchestrator.ts"],"names":[],"mappings":"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","file":"chunk-ONQ4WCUI.js","sourcesContent":["/**\r\n * Context window management per PRD section 7.4\r\n * - Token budgeting: 85% conversation, 15% buffer\r\n * - Smart truncation: prioritize recent + system prompt\r\n * - Compression: summarize old messages when approaching limits\r\n * - File context tracking with LRU eviction\r\n */\r\n\r\nimport type { IChatMessage, IModelInfo } from \"../types/index.js\";\r\nimport { estimateTokenCount } from \"../utils/index.js\";\r\nimport { logger } from \"../utils/index.js\";\r\n\r\nconst CONTEXT_BUDGET_RATIO = 0.85;\r\nconst SYSTEM_PROMPT_RESERVE = 4_000;\r\n\r\ninterface IFileContextEntry {\r\n readonly filePath: string;\r\n readonly tokenCount: number;\r\n lastAccessedAt: number;\r\n}\r\n\r\nexport class ContextManager {\r\n private readonly maxTokens: number;\r\n private readonly budgetTokens: number;\r\n private readonly fileContext = new Map<string, IFileContextEntry>();\r\n private currentTokenCount = 0;\r\n\r\n constructor(modelInfo: IModelInfo) {\r\n this.maxTokens = modelInfo.contextWindow;\r\n this.budgetTokens = Math.floor(this.maxTokens * CONTEXT_BUDGET_RATIO);\r\n }\r\n\r\n /**\r\n * Get the available token budget for new content.\r\n */\r\n getAvailableBudget(): number {\r\n return Math.max(0, this.budgetTokens - this.currentTokenCount - SYSTEM_PROMPT_RESERVE);\r\n }\r\n\r\n /**\r\n * Get total context usage.\r\n */\r\n getUsage(): { used: number; budget: number; max: number; percentage: number } {\r\n return {\r\n used: this.currentTokenCount,\r\n budget: this.budgetTokens,\r\n max: this.maxTokens,\r\n percentage: Math.round((this.currentTokenCount / this.budgetTokens) * 100),\r\n };\r\n }\r\n\r\n /**\r\n * Trim messages to fit within the context window.\r\n * Preserves system prompt and most recent messages.\r\n */\r\n trimMessages(messages: readonly IChatMessage[], systemPrompt?: string): IChatMessage[] {\r\n const systemTokens = systemPrompt ? estimateTokenCount(systemPrompt) : 0;\r\n const availableTokens = this.budgetTokens - systemTokens - SYSTEM_PROMPT_RESERVE;\r\n\r\n if (availableTokens <= 0) {\r\n logger.warn(\"System prompt alone exceeds context budget\");\r\n return [];\r\n }\r\n\r\n // Work backwards from most recent, accumulating tokens\r\n const result: IChatMessage[] = [];\r\n let usedTokens = 0;\r\n\r\n for (let i = messages.length - 1; i >= 0; i--) {\r\n const msg = messages[i];\r\n if (!msg) {\r\n continue;\r\n }\r\n const msgTokens = estimateTokenCount(msg.content);\r\n\r\n if (usedTokens + msgTokens > availableTokens) {\r\n break;\r\n }\r\n\r\n result.unshift(msg);\r\n usedTokens += msgTokens;\r\n }\r\n\r\n this.currentTokenCount = usedTokens + systemTokens;\r\n\r\n if (result.length < messages.length) {\r\n logger.info(\r\n {\r\n original: messages.length,\r\n trimmed: result.length,\r\n droppedMessages: messages.length - result.length,\r\n },\r\n \"Trimmed conversation to fit context window\",\r\n );\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Track a file being added to context.\r\n */\r\n addFileContext(filePath: string, content: string): void {\r\n const tokenCount = estimateTokenCount(content);\r\n this.fileContext.set(filePath, {\r\n filePath,\r\n tokenCount,\r\n lastAccessedAt: Date.now(),\r\n });\r\n this.currentTokenCount += tokenCount;\r\n }\r\n\r\n /**\r\n * Touch a file (update last accessed time).\r\n */\r\n touchFile(filePath: string): void {\r\n const entry = this.fileContext.get(filePath);\r\n if (entry) {\r\n entry.lastAccessedAt = Date.now();\r\n }\r\n }\r\n\r\n /**\r\n * Remove a file from context.\r\n */\r\n removeFileContext(filePath: string): void {\r\n const entry = this.fileContext.get(filePath);\r\n if (entry) {\r\n this.currentTokenCount -= entry.tokenCount;\r\n this.fileContext.delete(filePath);\r\n }\r\n }\r\n\r\n /**\r\n * Evict least-recently-used files to free space.\r\n */\r\n evictLRU(tokensNeeded: number): string[] {\r\n const evicted: string[] = [];\r\n const sorted = [...this.fileContext.entries()].sort(\r\n ([, a], [, b]) => a.lastAccessedAt - b.lastAccessedAt,\r\n );\r\n\r\n let freedTokens = 0;\r\n for (const [filePath, entry] of sorted) {\r\n if (freedTokens >= tokensNeeded) {\r\n break;\r\n }\r\n this.removeFileContext(filePath);\r\n freedTokens += entry.tokenCount;\r\n evicted.push(filePath);\r\n }\r\n\r\n if (evicted.length > 0) {\r\n logger.info(\r\n { evicted, freedTokens },\r\n \"Evicted files from context to free space\",\r\n );\r\n }\r\n\r\n return evicted;\r\n }\r\n\r\n /**\r\n * Get all tracked files.\r\n */\r\n getTrackedFiles(): readonly IFileContextEntry[] {\r\n return [...this.fileContext.values()];\r\n }\r\n\r\n /**\r\n * Reset context tracking (for model switch).\r\n */\r\n reset(): void {\r\n this.fileContext.clear();\r\n this.currentTokenCount = 0;\r\n }\r\n}\r\n","/**\r\n * Real-time cost tracking per PRD section 7.5\r\n * - Per-request cost calculation\r\n * - Session total\r\n * - Breakdown by provider, model, and role\r\n * - Configurable budget alerts\r\n */\r\n\r\nimport type { ProviderName, ModelRole, ITokenUsage, ICostConfig } from \"../types/index.js\";\r\nimport { createTokenUsage, formatCost } from \"../utils/index.js\";\r\nimport { logger } from \"../utils/index.js\";\r\nimport { getEventBus } from \"./event-bus.js\";\r\n\r\ninterface ICostEntry {\r\n readonly provider: ProviderName;\r\n readonly model: string;\r\n readonly role?: ModelRole | undefined;\r\n readonly usage: ITokenUsage;\r\n readonly timestamp: Date;\r\n}\r\n\r\ninterface ICostBreakdown {\r\n readonly byProvider: Record<string, number>;\r\n readonly byModel: Record<string, number>;\r\n readonly byRole: Record<string, number>;\r\n}\r\n\r\nexport class CostTracker {\r\n private readonly entries: ICostEntry[] = [];\r\n private readonly budgetConfig: ICostConfig;\r\n private warningEmitted = false;\r\n\r\n constructor(budgetConfig: ICostConfig) {\r\n this.budgetConfig = budgetConfig;\r\n }\r\n\r\n /**\r\n * Record a cost entry from a model response.\r\n */\r\n record(\r\n provider: ProviderName,\r\n model: string,\r\n inputTokens: number,\r\n outputTokens: number,\r\n role?: ModelRole,\r\n ): ITokenUsage {\r\n const usage = createTokenUsage(model, inputTokens, outputTokens);\r\n\r\n const entry: ICostEntry = {\r\n provider,\r\n model,\r\n role,\r\n usage,\r\n timestamp: new Date(),\r\n };\r\n\r\n this.entries.push(entry);\r\n\r\n const total = this.getSessionTotal();\r\n const eventBus = getEventBus();\r\n\r\n eventBus.emit(\"cost:updated\", {\r\n total,\r\n provider,\r\n delta: usage.costUsd,\r\n });\r\n\r\n // Budget warning\r\n if (total >= this.budgetConfig.budgetWarning && !this.warningEmitted) {\r\n this.warningEmitted = true;\r\n eventBus.emit(\"cost:warning\", {\r\n current: total,\r\n limit: this.budgetConfig.budgetWarning,\r\n });\r\n logger.warn(\r\n { current: formatCost(total), warning: formatCost(this.budgetConfig.budgetWarning) },\r\n \"Budget warning threshold reached\",\r\n );\r\n }\r\n\r\n // Budget hard stop\r\n if (total >= this.budgetConfig.budgetHardStop) {\r\n eventBus.emit(\"cost:exceeded\", {\r\n current: total,\r\n limit: this.budgetConfig.budgetHardStop,\r\n });\r\n logger.error(\r\n { current: formatCost(total), limit: formatCost(this.budgetConfig.budgetHardStop) },\r\n \"Budget hard stop reached\",\r\n );\r\n }\r\n\r\n return usage;\r\n }\r\n\r\n /**\r\n * Get total session cost.\r\n */\r\n getSessionTotal(): number {\r\n return this.entries.reduce((sum, entry) => sum + entry.usage.costUsd, 0);\r\n }\r\n\r\n /**\r\n * Get total token counts.\r\n */\r\n getSessionTokens(): { input: number; output: number; total: number } {\r\n const input = this.entries.reduce((sum, e) => sum + e.usage.inputTokens, 0);\r\n const output = this.entries.reduce((sum, e) => sum + e.usage.outputTokens, 0);\r\n return { input, output, total: input + output };\r\n }\r\n\r\n /**\r\n * Get cost breakdown by provider, model, and role.\r\n */\r\n getBreakdown(): ICostBreakdown {\r\n const byProvider: Record<string, number> = {};\r\n const byModel: Record<string, number> = {};\r\n const byRole: Record<string, number> = {};\r\n\r\n for (const entry of this.entries) {\r\n byProvider[entry.provider] = (byProvider[entry.provider] ?? 0) + entry.usage.costUsd;\r\n byModel[entry.model] = (byModel[entry.model] ?? 0) + entry.usage.costUsd;\r\n if (entry.role) {\r\n byRole[entry.role] = (byRole[entry.role] ?? 0) + entry.usage.costUsd;\r\n }\r\n }\r\n\r\n return { byProvider, byModel, byRole };\r\n }\r\n\r\n /**\r\n * Check if budget hard stop has been exceeded.\r\n */\r\n isBudgetExceeded(): boolean {\r\n return this.getSessionTotal() >= this.budgetConfig.budgetHardStop;\r\n }\r\n\r\n /**\r\n * Get formatted session summary.\r\n */\r\n getSummary(): string {\r\n const total = this.getSessionTotal();\r\n const tokens = this.getSessionTokens();\r\n return `${formatCost(total)} (${tokens.total.toLocaleString()} tokens)`;\r\n }\r\n\r\n /**\r\n * Get all cost entries (for export).\r\n */\r\n getEntries(): readonly ICostEntry[] {\r\n return this.entries;\r\n }\r\n\r\n /**\r\n * Reset cost tracking for a new session.\r\n */\r\n reset(): void {\r\n this.entries.length = 0;\r\n this.warningEmitted = false;\r\n }\r\n}\r\n","/**\r\n * Tool permission management per PRD section 14.4\r\n * Permission modes: strict, standard, permissive\r\n */\r\n\r\nimport type { PermissionMode, ToolCategory } from \"../types/index.js\";\r\nimport { logger } from \"../utils/index.js\";\r\nimport { isCommandBlocked } from \"../utils/index.js\";\r\n\r\n// Commands that ALWAYS require confirmation regardless of mode\r\nconst DANGEROUS_COMMANDS = [\r\n \"rm -rf\",\r\n \"git push --force\",\r\n \"git reset --hard\",\r\n \"git checkout .\",\r\n \"git clean -f\",\r\n \"git branch -D\",\r\n \"drop table\",\r\n \"drop database\",\r\n \"truncate\",\r\n \"format c:\",\r\n \"del /f /s /q\",\r\n] as const;\r\n\r\nexport interface IPermissionRequest {\r\n readonly toolName: string;\r\n readonly category: ToolCategory;\r\n readonly operation: string;\r\n readonly resource?: string;\r\n readonly command?: string;\r\n}\r\n\r\nexport interface IPermissionResult {\r\n readonly allowed: boolean;\r\n readonly reason?: string;\r\n readonly requiresUserApproval: boolean;\r\n}\r\n\r\nexport class PermissionManager {\r\n private mode: PermissionMode;\r\n private readonly allowedPaths: readonly string[];\r\n private readonly blockedCommands: readonly string[];\r\n private readonly approvedOperations = new Set<string>();\r\n\r\n constructor(\r\n mode: PermissionMode,\r\n allowedPaths: readonly string[],\r\n blockedCommands: readonly string[],\r\n ) {\r\n this.mode = mode;\r\n this.allowedPaths = allowedPaths;\r\n this.blockedCommands = blockedCommands;\r\n }\r\n\r\n /**\r\n * Check if an operation is permitted.\r\n */\r\n check(request: IPermissionRequest): IPermissionResult {\r\n // Always-blocked operations\r\n if (request.command && this.isDangerousCommand(request.command)) {\r\n return {\r\n allowed: false,\r\n reason: `Dangerous command detected: \"${request.command}\"`,\r\n requiresUserApproval: true,\r\n };\r\n }\r\n\r\n // Check against blocked commands list\r\n if (request.command && isCommandBlocked(request.command, this.blockedCommands)) {\r\n return {\r\n allowed: false,\r\n reason: `Command is on the blocked list`,\r\n requiresUserApproval: true,\r\n };\r\n }\r\n\r\n // Previously approved operations\r\n const opKey = this.getOperationKey(request);\r\n if (this.approvedOperations.has(opKey)) {\r\n return { allowed: true, requiresUserApproval: false };\r\n }\r\n\r\n // Mode-based permissions\r\n switch (this.mode) {\r\n case \"permissive\":\r\n return { allowed: true, requiresUserApproval: false };\r\n\r\n case \"standard\":\r\n return this.checkStandardMode(request);\r\n\r\n case \"strict\":\r\n return this.checkStrictMode(request);\r\n }\r\n }\r\n\r\n /**\r\n * Record that the user has approved an operation.\r\n */\r\n approve(request: IPermissionRequest): void {\r\n const opKey = this.getOperationKey(request);\r\n this.approvedOperations.add(opKey);\r\n logger.info({ operation: opKey }, \"Operation approved by user\");\r\n }\r\n\r\n /**\r\n * Update permission mode.\r\n */\r\n setMode(mode: PermissionMode): void {\r\n this.mode = mode;\r\n this.approvedOperations.clear();\r\n logger.info({ mode }, \"Permission mode changed\");\r\n }\r\n\r\n /**\r\n * Get current mode.\r\n */\r\n getMode(): PermissionMode {\r\n return this.mode;\r\n }\r\n\r\n private checkStandardMode(request: IPermissionRequest): IPermissionResult {\r\n // Read operations auto-approved in standard mode\r\n if (this.isReadOperation(request)) {\r\n return { allowed: true, requiresUserApproval: false };\r\n }\r\n\r\n // Write and shell operations require approval\r\n return {\r\n allowed: false,\r\n reason: `${request.operation} requires approval in standard mode`,\r\n requiresUserApproval: true,\r\n };\r\n }\r\n\r\n private checkStrictMode(request: IPermissionRequest): IPermissionResult {\r\n // Everything requires approval in strict mode\r\n return {\r\n allowed: false,\r\n reason: `${request.operation} requires approval in strict mode`,\r\n requiresUserApproval: true,\r\n };\r\n }\r\n\r\n private isReadOperation(request: IPermissionRequest): boolean {\r\n const readTools = [\"read\", \"glob\", \"grep\", \"web-search\", \"web-fetch\"];\r\n return readTools.includes(request.toolName);\r\n }\r\n\r\n private isDangerousCommand(command: string): boolean {\r\n const lower = command.toLowerCase().trim();\r\n return DANGEROUS_COMMANDS.some((dangerous) => lower.includes(dangerous));\r\n }\r\n\r\n private getOperationKey(request: IPermissionRequest): string {\r\n return `${request.toolName}:${request.operation}:${request.resource ?? \"\"}`;\r\n }\r\n}\r\n","/**\r\n * Agent team task coordination per PRD section 8\r\n * Manages task creation, assignment, dependency resolution, and completion tracking.\r\n */\r\n\r\nimport type { ITask, TaskStatus, ModelRole } from \"../types/index.js\";\r\nimport { logger } from \"../utils/index.js\";\r\nimport { getEventBus } from \"./event-bus.js\";\r\n\r\nlet nextTaskId = 1;\r\n\r\nfunction generateTaskId(): string {\r\n return String(nextTaskId++);\r\n}\r\n\r\nexport class TaskOrchestrator {\r\n private readonly tasks = new Map<string, ITask>();\r\n\r\n /**\r\n * Create a new task.\r\n */\r\n createTask(\r\n subject: string,\r\n description: string,\r\n options?: {\r\n owner?: string;\r\n model?: string;\r\n role?: ModelRole;\r\n blockedBy?: string[];\r\n },\r\n ): ITask {\r\n const id = generateTaskId();\r\n const now = new Date();\r\n\r\n const task: ITask = {\r\n id,\r\n subject,\r\n description,\r\n status: \"pending\",\r\n owner: options?.owner,\r\n model: options?.model,\r\n role: options?.role,\r\n blocks: [],\r\n blockedBy: options?.blockedBy ? [...options.blockedBy] : [],\r\n createdAt: now,\r\n updatedAt: now,\r\n };\r\n\r\n this.tasks.set(id, task);\r\n\r\n // Set up reverse blocking relationships\r\n if (options?.blockedBy) {\r\n for (const blockerId of options.blockedBy) {\r\n const blocker = this.tasks.get(blockerId);\r\n if (blocker && !blocker.blocks.includes(id)) {\r\n blocker.blocks.push(id);\r\n }\r\n }\r\n }\r\n\r\n getEventBus().emit(\"task:created\", { taskId: id, subject });\r\n logger.info({ taskId: id, subject }, \"Task created\");\r\n\r\n return task;\r\n }\r\n\r\n /**\r\n * Update task status.\r\n */\r\n updateStatus(taskId: string, status: TaskStatus): void {\r\n const task = this.getTask(taskId);\r\n task.status = status;\r\n task.updatedAt = new Date();\r\n\r\n getEventBus().emit(\"task:updated\", { taskId, status });\r\n\r\n if (status === \"completed\") {\r\n getEventBus().emit(\"task:completed\", { taskId });\r\n this.resolveBlockedTasks(taskId);\r\n }\r\n\r\n logger.info({ taskId, status }, \"Task status updated\");\r\n }\r\n\r\n /**\r\n * Assign a task to an agent.\r\n */\r\n assignTask(taskId: string, owner: string, model?: string): void {\r\n const task = this.getTask(taskId);\r\n task.owner = owner;\r\n if (model) {\r\n (task as { model?: string }).model = model;\r\n }\r\n task.updatedAt = new Date();\r\n logger.info({ taskId, owner, model }, \"Task assigned\");\r\n }\r\n\r\n /**\r\n * Get a task by ID. Throws if not found.\r\n */\r\n getTask(taskId: string): ITask {\r\n const task = this.tasks.get(taskId);\r\n if (!task) {\r\n throw new Error(`Task not found: ${taskId}`);\r\n }\r\n return task;\r\n }\r\n\r\n /**\r\n * Get all tasks.\r\n */\r\n getAllTasks(): readonly ITask[] {\r\n return [...this.tasks.values()];\r\n }\r\n\r\n /**\r\n * Get tasks by status.\r\n */\r\n getTasksByStatus(status: TaskStatus): readonly ITask[] {\r\n return [...this.tasks.values()].filter((t) => t.status === status);\r\n }\r\n\r\n /**\r\n * Get tasks assigned to an agent.\r\n */\r\n getTasksByOwner(owner: string): readonly ITask[] {\r\n return [...this.tasks.values()].filter((t) => t.owner === owner);\r\n }\r\n\r\n /**\r\n * Get tasks that are ready to be worked on (pending, not blocked).\r\n */\r\n getAvailableTasks(): readonly ITask[] {\r\n return [...this.tasks.values()].filter(\r\n (t) =>\r\n t.status === \"pending\" &&\r\n !t.owner &&\r\n t.blockedBy.every((blockerId) => {\r\n const blocker = this.tasks.get(blockerId);\r\n return blocker?.status === \"completed\";\r\n }),\r\n );\r\n }\r\n\r\n /**\r\n * Check if all tasks are completed.\r\n */\r\n isAllComplete(): boolean {\r\n return [...this.tasks.values()].every((t) => t.status === \"completed\");\r\n }\r\n\r\n /**\r\n * Get progress summary.\r\n */\r\n getProgress(): { total: number; completed: number; inProgress: number; pending: number; blocked: number } {\r\n const tasks = [...this.tasks.values()];\r\n return {\r\n total: tasks.length,\r\n completed: tasks.filter((t) => t.status === \"completed\").length,\r\n inProgress: tasks.filter((t) => t.status === \"in_progress\").length,\r\n pending: tasks.filter((t) => t.status === \"pending\").length,\r\n blocked: tasks.filter((t) => t.status === \"blocked\").length,\r\n };\r\n }\r\n\r\n /**\r\n * Delete a task.\r\n */\r\n deleteTask(taskId: string): void {\r\n const task = this.tasks.get(taskId);\r\n if (task) {\r\n // Remove from blockedBy references\r\n for (const [, otherTask] of this.tasks) {\r\n otherTask.blockedBy = otherTask.blockedBy.filter((id) => id !== taskId);\r\n otherTask.blocks = otherTask.blocks.filter((id) => id !== taskId);\r\n }\r\n this.tasks.delete(taskId);\r\n }\r\n }\r\n\r\n /**\r\n * When a task completes, check if any blocked tasks can now proceed.\r\n */\r\n private resolveBlockedTasks(completedTaskId: string): void {\r\n for (const [, task] of this.tasks) {\r\n if (task.status === \"blocked\" || task.status === \"pending\") {\r\n const allDepsComplete = task.blockedBy.every((depId) => {\r\n const dep = this.tasks.get(depId);\r\n return dep?.status === \"completed\";\r\n });\r\n\r\n if (allDepsComplete && task.status === \"blocked\") {\r\n task.status = \"pending\";\r\n task.updatedAt = new Date();\r\n logger.info(\r\n { taskId: task.id, unblockedBy: completedTaskId },\r\n \"Task unblocked\",\r\n );\r\n }\r\n }\r\n }\r\n }\r\n}\r\n"]}
@@ -1,159 +0,0 @@
1
- import { buildModelMessages, buildAiSdkTools, extractAiSdkToolCalls, buildTokenUsage, mapAiSdkFinishReason } from './chunk-ODBY7S4X.js';
2
- import { ModelNotFoundError, AuthenticationError, RateLimitError } from './chunk-473JN6M5.js';
3
- import { SUPPORTED_MODELS } from './chunk-62HSGYQD.js';
4
- import { logger } from './chunk-HEKFAKVH.js';
5
- import { generateText, streamText } from 'ai';
6
- import { createOpenAI } from '@ai-sdk/openai';
7
-
8
- var PROVIDER_NAME = "openai";
9
- var OPENAI_MODELS = [
10
- "gpt-5.3-codex",
11
- "gpt-5.3-codex-spark",
12
- "gpt-5.2-codex",
13
- "gpt-5.1-codex-max",
14
- "gpt-5.2",
15
- "gpt-5.1-codex-mini"
16
- ];
17
- var CHARS_PER_TOKEN_ESTIMATE = 4;
18
- function classifyError(error, model) {
19
- const message = error instanceof Error ? error.message : String(error);
20
- const lower = message.toLowerCase();
21
- if (lower.includes("401") || lower.includes("unauthorized") || lower.includes("invalid api key")) {
22
- throw new AuthenticationError(PROVIDER_NAME, message);
23
- }
24
- if (lower.includes("429") || lower.includes("rate limit") || lower.includes("too many requests")) {
25
- const match = /(\d+)\s*s/i.exec(message);
26
- const retryMs = match?.[1] !== void 0 ? parseInt(match[1], 10) * 1e3 : 6e4;
27
- throw new RateLimitError(PROVIDER_NAME, retryMs);
28
- }
29
- if (lower.includes("model") && lower.includes("not found")) {
30
- throw new ModelNotFoundError(model);
31
- }
32
- throw error instanceof Error ? error : new Error(message);
33
- }
34
- var OpenAIAdapter = class {
35
- name = PROVIDER_NAME;
36
- supportedModels = OPENAI_MODELS;
37
- supportsToolCalling = true;
38
- openai;
39
- apiKey;
40
- baseUrl;
41
- constructor(options) {
42
- this.apiKey = options?.apiKey ?? process.env["OPENAI_API_KEY"];
43
- this.baseUrl = options?.baseUrl;
44
- this.openai = createOpenAI({
45
- ...this.apiKey !== void 0 ? { apiKey: this.apiKey } : {},
46
- ...this.baseUrl !== void 0 ? { baseURL: this.baseUrl } : {}
47
- });
48
- }
49
- async chat(request) {
50
- const modelInfo = this.getModelInfo(request.model);
51
- const messages = buildModelMessages(request.messages);
52
- const tools = buildAiSdkTools(request.tools);
53
- try {
54
- const result = await generateText({
55
- model: this.openai(request.model),
56
- messages,
57
- ...request.system !== void 0 ? { system: request.system } : {},
58
- ...tools !== void 0 ? { tools } : {},
59
- maxOutputTokens: request.maxTokens ?? modelInfo.maxOutputTokens,
60
- ...request.temperature !== void 0 ? { temperature: request.temperature } : {}
61
- });
62
- const toolCalls = extractAiSdkToolCalls(result.toolCalls);
63
- const usage = buildTokenUsage(modelInfo, result.usage);
64
- const responseMessage = {
65
- id: result.response.id,
66
- role: "assistant",
67
- content: result.text,
68
- model: request.model,
69
- provider: PROVIDER_NAME,
70
- toolCalls: toolCalls.length > 0 ? toolCalls : void 0,
71
- tokenUsage: usage,
72
- createdAt: /* @__PURE__ */ new Date()
73
- };
74
- return {
75
- id: result.response.id,
76
- model: request.model,
77
- provider: PROVIDER_NAME,
78
- message: responseMessage,
79
- usage,
80
- finishReason: mapAiSdkFinishReason(result.finishReason)
81
- };
82
- } catch (error) {
83
- classifyError(error, request.model);
84
- }
85
- }
86
- async *stream(request) {
87
- const modelInfo = this.getModelInfo(request.model);
88
- const messages = buildModelMessages(request.messages);
89
- const tools = buildAiSdkTools(request.tools);
90
- try {
91
- const result = streamText({
92
- model: this.openai(request.model),
93
- messages,
94
- ...request.system !== void 0 ? { system: request.system } : {},
95
- ...tools !== void 0 ? { tools } : {},
96
- maxOutputTokens: request.maxTokens ?? modelInfo.maxOutputTokens,
97
- ...request.temperature !== void 0 ? { temperature: request.temperature } : {}
98
- });
99
- for await (const part of result.fullStream) {
100
- if (part.type === "text-delta") {
101
- yield { type: "text", content: part.text };
102
- } else if (part.type === "tool-call") {
103
- const [toolCall] = extractAiSdkToolCalls([{
104
- toolCallId: part.toolCallId,
105
- toolName: part.toolName,
106
- input: part.input
107
- }]);
108
- if (toolCall === void 0) {
109
- continue;
110
- }
111
- yield { type: "tool_call", toolCall };
112
- } else if (part.type === "finish") {
113
- const usage = buildTokenUsage(modelInfo, part.totalUsage);
114
- yield { type: "usage", usage };
115
- } else if (part.type === "error") {
116
- const errMsg = part.error instanceof Error ? part.error.message : String(part.error);
117
- yield { type: "error", error: errMsg };
118
- }
119
- }
120
- yield { type: "done" };
121
- } catch (error) {
122
- const errMsg = error instanceof Error ? error.message : String(error);
123
- logger.error({ error: errMsg, model: request.model }, "OpenAI stream error");
124
- yield { type: "error", error: errMsg };
125
- yield { type: "done" };
126
- }
127
- }
128
- countTokens(text, _model) {
129
- return Promise.resolve(Math.ceil(text.length / CHARS_PER_TOKEN_ESTIMATE));
130
- }
131
- getModelInfo(model) {
132
- const info = SUPPORTED_MODELS[model];
133
- if (info === void 0 || info.provider !== PROVIDER_NAME) {
134
- throw new ModelNotFoundError(model);
135
- }
136
- return info;
137
- }
138
- async listAvailableModels() {
139
- if (!this.apiKey) return [...this.supportedModels];
140
- try {
141
- const base = this.baseUrl ?? "https://api.openai.com/v1";
142
- const response = await fetch(`${base}/models`, {
143
- headers: { Authorization: `Bearer ${this.apiKey}` },
144
- signal: AbortSignal.timeout(5e3)
145
- });
146
- if (!response.ok) return [...this.supportedModels];
147
- const data = await response.json();
148
- const chatPrefixes = ["gpt-", "o1", "o3", "o4", "chatgpt-"];
149
- const models = data.data.map((m) => m.id).filter((id) => chatPrefixes.some((p) => id.startsWith(p))).sort();
150
- return models.length > 0 ? models : [...this.supportedModels];
151
- } catch {
152
- return [...this.supportedModels];
153
- }
154
- }
155
- };
156
-
157
- export { OpenAIAdapter };
158
- //# sourceMappingURL=chunk-P5TKZM3T.js.map
159
- //# sourceMappingURL=chunk-P5TKZM3T.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/providers/openai-adapter.ts"],"names":[],"mappings":"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","file":"chunk-P5TKZM3T.js","sourcesContent":["/**\r\n * OpenAI adapter via Vercel AI SDK per PRD section 7.1\r\n * Supports GPT-5.3 Codex, GPT-5.2, GPT-5.1 Codex series\r\n */\r\n\r\nimport { generateText, streamText } from \"ai\";\r\nimport { createOpenAI } from \"@ai-sdk/openai\";\r\nimport { logger } from \"../utils/logger.js\";\r\nimport {\r\n AuthenticationError,\r\n RateLimitError,\r\n ModelNotFoundError,\r\n} from \"../types/errors.js\";\r\nimport { SUPPORTED_MODELS } from \"../types/model.js\";\r\nimport type { IModelInfo, ProviderName } from \"../types/model.js\";\r\nimport type {\r\n IChatRequest,\r\n IChatResponse,\r\n IChatMessage,\r\n IStreamChunk,\r\n} from \"../types/message.js\";\r\nimport {\r\n buildAiSdkTools,\r\n buildModelMessages,\r\n buildTokenUsage,\r\n extractAiSdkToolCalls,\r\n mapAiSdkFinishReason,\r\n} from \"./ai-sdk-shared.js\";\r\nimport type { IModelProvider, IProviderOptions } from \"./types.js\";\r\n\r\nconst PROVIDER_NAME: ProviderName = \"openai\";\r\n\r\nconst OPENAI_MODELS: readonly string[] = [\r\n \"gpt-5.3-codex\",\r\n \"gpt-5.3-codex-spark\",\r\n \"gpt-5.2-codex\",\r\n \"gpt-5.1-codex-max\",\r\n \"gpt-5.2\",\r\n \"gpt-5.1-codex-mini\",\r\n] as const;\r\n\r\nconst CHARS_PER_TOKEN_ESTIMATE = 4;\r\n\r\nfunction classifyError(error: unknown, model: string): never {\r\n const message = error instanceof Error ? error.message : String(error);\r\n const lower = message.toLowerCase();\r\n\r\n if (lower.includes(\"401\") || lower.includes(\"unauthorized\") || lower.includes(\"invalid api key\")) {\r\n throw new AuthenticationError(PROVIDER_NAME, message);\r\n }\r\n if (lower.includes(\"429\") || lower.includes(\"rate limit\") || lower.includes(\"too many requests\")) {\r\n const match = /(\\d+)\\s*s/i.exec(message);\r\n const retryMs = match?.[1] !== undefined ? parseInt(match[1], 10) * 1000 : 60_000;\r\n throw new RateLimitError(PROVIDER_NAME, retryMs);\r\n }\r\n if (lower.includes(\"model\") && lower.includes(\"not found\")) {\r\n throw new ModelNotFoundError(model);\r\n }\r\n\r\n throw error instanceof Error ? error : new Error(message);\r\n}\r\n\r\nexport class OpenAIAdapter implements IModelProvider {\r\n readonly name = PROVIDER_NAME;\r\n readonly supportedModels = OPENAI_MODELS;\r\n readonly supportsToolCalling = true;\r\n\r\n private readonly openai: ReturnType<typeof createOpenAI>;\r\n private readonly apiKey: string | undefined;\r\n private readonly baseUrl: string | undefined;\r\n\r\n constructor(options?: IProviderOptions) {\r\n this.apiKey = options?.apiKey ?? process.env[\"OPENAI_API_KEY\"];\r\n this.baseUrl = options?.baseUrl;\r\n this.openai = createOpenAI({\r\n ...(this.apiKey !== undefined ? { apiKey: this.apiKey } : {}),\r\n ...(this.baseUrl !== undefined ? { baseURL: this.baseUrl } : {}),\r\n });\r\n }\r\n\r\n async chat(request: IChatRequest): Promise<IChatResponse> {\r\n const modelInfo = this.getModelInfo(request.model);\r\n const messages = buildModelMessages(request.messages);\r\n const tools = buildAiSdkTools(request.tools);\r\n\r\n try {\r\n const result = await generateText({\r\n model: this.openai(request.model),\r\n messages,\r\n ...(request.system !== undefined ? { system: request.system } : {}),\r\n ...(tools !== undefined ? { tools } : {}),\r\n maxOutputTokens: request.maxTokens ?? modelInfo.maxOutputTokens,\r\n ...(request.temperature !== undefined ? { temperature: request.temperature } : {}),\r\n });\r\n\r\n const toolCalls = extractAiSdkToolCalls(result.toolCalls);\r\n const usage = buildTokenUsage(modelInfo, result.usage);\r\n\r\n const responseMessage: IChatMessage = {\r\n id: result.response.id,\r\n role: \"assistant\",\r\n content: result.text,\r\n model: request.model,\r\n provider: PROVIDER_NAME,\r\n toolCalls: toolCalls.length > 0 ? toolCalls : undefined,\r\n tokenUsage: usage,\r\n createdAt: new Date(),\r\n };\r\n\r\n return {\r\n id: result.response.id,\r\n model: request.model,\r\n provider: PROVIDER_NAME,\r\n message: responseMessage,\r\n usage,\r\n finishReason: mapAiSdkFinishReason(result.finishReason),\r\n };\r\n } catch (error: unknown) {\r\n classifyError(error, request.model);\r\n }\r\n }\r\n\r\n async *stream(request: IChatRequest): AsyncIterable<IStreamChunk> {\r\n const modelInfo = this.getModelInfo(request.model);\r\n const messages = buildModelMessages(request.messages);\r\n const tools = buildAiSdkTools(request.tools);\r\n\r\n try {\r\n const result = streamText({\r\n model: this.openai(request.model),\r\n messages,\r\n ...(request.system !== undefined ? { system: request.system } : {}),\r\n ...(tools !== undefined ? { tools } : {}),\r\n maxOutputTokens: request.maxTokens ?? modelInfo.maxOutputTokens,\r\n ...(request.temperature !== undefined ? { temperature: request.temperature } : {}),\r\n });\r\n\r\n for await (const part of result.fullStream) {\r\n if (part.type === \"text-delta\") {\r\n yield { type: \"text\", content: part.text };\r\n } else if (part.type === \"tool-call\") {\r\n const [toolCall] = extractAiSdkToolCalls([{\r\n toolCallId: part.toolCallId,\r\n toolName: part.toolName,\r\n input: part.input,\r\n }]);\r\n if (toolCall === undefined) {\r\n continue;\r\n }\r\n yield { type: \"tool_call\", toolCall };\r\n } else if (part.type === \"finish\") {\r\n const usage = buildTokenUsage(modelInfo, part.totalUsage);\r\n yield { type: \"usage\", usage };\r\n } else if (part.type === \"error\") {\r\n const errMsg = part.error instanceof Error ? part.error.message : String(part.error);\r\n yield { type: \"error\", error: errMsg };\r\n }\r\n }\r\n\r\n yield { type: \"done\" };\r\n } catch (error: unknown) {\r\n const errMsg = error instanceof Error ? error.message : String(error);\r\n logger.error({ error: errMsg, model: request.model }, \"OpenAI 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 base = this.baseUrl ?? \"https://api.openai.com/v1\";\r\n const response = await fetch(`${base}/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 chatPrefixes = [\"gpt-\", \"o1\", \"o3\", \"o4\", \"chatgpt-\"];\r\n const models = data.data\r\n .map((m) => m.id)\r\n .filter((id) => chatPrefixes.some((p) => id.startsWith(p)))\r\n .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"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/providers/registry.ts"],"names":["provider"],"mappings":"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","file":"chunk-P66WDACW.js","sourcesContent":["/**\r\n * Provider registry per PRD section 7.1\r\n * Central registry for provider adapters — register, resolve, list.\r\n */\r\n\r\nimport { logger } from \"../utils/logger.js\";\r\nimport { ModelNotFoundError } from \"../types/errors.js\";\r\nimport { SUPPORTED_MODELS } from \"../types/model.js\";\r\nimport type { IModelInfo } from \"../types/model.js\";\r\nimport type { IModelProvider, IProviderRegistryOptions } from \"./types.js\";\r\n\r\n/**\r\n * Singleton registry that maps provider names and model IDs to provider adapters.\r\n */\r\nexport class ProviderRegistry {\r\n private readonly providers = new Map<string, IModelProvider>();\r\n private readonly modelToProvider = new Map<string, string>();\r\n\r\n /**\r\n * Register a provider adapter.\r\n * Automatically indexes all supported models to this provider.\r\n */\r\n register(provider: IModelProvider): void {\r\n this.providers.set(provider.name, provider);\r\n\r\n for (const modelId of provider.supportedModels) {\r\n this.modelToProvider.set(modelId, provider.name);\r\n }\r\n\r\n logger.debug(\r\n { provider: provider.name, models: provider.supportedModels },\r\n \"Provider registered\",\r\n );\r\n }\r\n\r\n /**\r\n * Get a provider adapter by its name (e.g. \"anthropic\", \"openai\").\r\n */\r\n getByName(name: string): IModelProvider | undefined {\r\n return this.providers.get(name);\r\n }\r\n\r\n /**\r\n * Get the provider adapter that supports a given model ID.\r\n * @throws ModelNotFoundError if no provider serves this model.\r\n */\r\n getForModel(modelId: string): IModelProvider {\r\n const providerName = this.modelToProvider.get(modelId);\r\n if (providerName === undefined) {\r\n throw new ModelNotFoundError(modelId);\r\n }\r\n\r\n const provider = this.providers.get(providerName);\r\n if (provider === undefined) {\r\n throw new ModelNotFoundError(modelId);\r\n }\r\n\r\n return provider;\r\n }\r\n\r\n /**\r\n * Resolve a model string to its provider.\r\n * Supports both model IDs (\"claude-sonnet-4-6\") and provider-prefixed\r\n * forms (\"anthropic:claude-sonnet-4-6\").\r\n */\r\n resolve(modelString: string): { provider: IModelProvider; modelId: string } {\r\n const colonIndex = modelString.indexOf(\":\");\r\n if (colonIndex !== -1) {\r\n const providerName = modelString.slice(0, colonIndex);\r\n const modelId = modelString.slice(colonIndex + 1);\r\n const provider = this.providers.get(providerName);\r\n if (provider === undefined) {\r\n throw new ModelNotFoundError(modelString);\r\n }\r\n return { provider, modelId };\r\n }\r\n\r\n const provider = this.getForModel(modelString);\r\n return { provider, modelId: modelString };\r\n }\r\n\r\n /**\r\n * List all registered model IDs across all providers.\r\n */\r\n listModels(): readonly IModelInfo[] {\r\n const models: IModelInfo[] = [];\r\n\r\n for (const provider of this.providers.values()) {\r\n for (const modelId of provider.supportedModels) {\r\n const info = SUPPORTED_MODELS[modelId];\r\n if (info !== undefined) {\r\n models.push(info);\r\n }\r\n }\r\n }\r\n\r\n return models;\r\n }\r\n\r\n /**\r\n * List all registered provider names.\r\n */\r\n listProviders(): readonly string[] {\r\n return [...this.providers.keys()];\r\n }\r\n\r\n /**\r\n * Check if a model ID is supported by any registered provider.\r\n */\r\n hasModel(modelId: string): boolean {\r\n return this.modelToProvider.has(modelId);\r\n }\r\n\r\n /**\r\n * Check if a provider is registered.\r\n */\r\n hasProvider(name: string): boolean {\r\n return this.providers.has(name);\r\n }\r\n\r\n /**\r\n * List available models from all providers.\r\n * Uses dynamic API listing where supported, falls back to static models.\r\n */\r\n async listAllAvailableModels(): Promise<Map<string, readonly string[]>> {\r\n const entries = [...this.providers.entries()];\r\n const fetched = await Promise.all(\r\n entries.map(async ([name, provider]): Promise<[string, readonly string[]]> => {\r\n if (typeof provider.listAvailableModels === \"function\") {\r\n try {\r\n return [name, await provider.listAvailableModels()];\r\n } catch {\r\n return [name, [...provider.supportedModels]];\r\n }\r\n }\r\n return [name, [...provider.supportedModels]];\r\n }),\r\n );\r\n\r\n const result = new Map<string, readonly string[]>();\r\n fetched.sort(([a], [b]) => a.localeCompare(b));\r\n for (const [name, models] of fetched) {\r\n result.set(name, models);\r\n }\r\n\r\n return result;\r\n }\r\n}\r\n\r\n/**\r\n * Create a pre-populated registry with all available providers.\r\n * Resolves credentials via SessionManager (CLI delegation, API keys, env vars).\r\n */\r\nexport async function createDefaultRegistry(\r\n options: IProviderRegistryOptions = {},\r\n): Promise<ProviderRegistry> {\r\n const registry = new ProviderRegistry();\r\n\r\n const { SessionManager } = await import(\"../auth/session-manager.js\");\r\n const session = new SessionManager();\r\n const { execa } = await import(\"execa\");\r\n\r\n // When AEMEATHCLI_PREFER_SDK=1 (set for agent child processes), prefer\r\n // SDK-based adapters over native CLI adapters. Native CLI adapters shell\r\n // out to external binaries whose raw JSON output can interfere with IPC\r\n // streaming. Falls back to native only when no API key is available.\r\n const preferSdk = options.preferSdk ?? process.env[\"AEMEATHCLI_PREFER_SDK\"] === \"1\";\r\n\r\n const cliAvailability = new Map<string, boolean>();\r\n const hasCli = async (command: string): Promise<boolean> => {\r\n const cached = cliAvailability.get(command);\r\n if (cached !== undefined) {\r\n return cached;\r\n }\r\n\r\n const pathLookupCommand = process.platform === \"win32\" ? \"where\" : \"which\";\r\n\r\n try {\r\n await execa(pathLookupCommand, [command], { timeout: 3000 });\r\n cliAvailability.set(command, true);\r\n return true;\r\n } catch {\r\n cliAvailability.set(command, false);\r\n return false;\r\n }\r\n };\r\n\r\n /** Determine whether to use a native CLI adapter for a provider. */\r\n const shouldUseNative = async (\r\n credential: { method: string; token?: string | undefined } | undefined,\r\n cliCommand: string,\r\n envKeyName: string,\r\n ): Promise<boolean> => {\r\n const hasApiKey =\r\n credential?.method === \"api_key\"\r\n || credential?.method === \"env_variable\"\r\n || process.env[envKeyName] !== undefined;\r\n\r\n // When preferSdk is set, prefer SDK adapters whenever an API key or\r\n // environment credential is available, even if a native CLI login exists.\r\n if (preferSdk && hasApiKey) {\r\n return false;\r\n }\r\n\r\n // Native login credentials (OAuth sessions) must always use the native CLI\r\n // adapter. The stored token is an OAuth session token, NOT an API key — SDK\r\n // adapters will reject it with \"invalid x-api-key\" / \"API key not valid\".\r\n if (credential?.method === \"native_login\") {\r\n return await hasCli(cliCommand);\r\n }\r\n\r\n // When preferSdk is set, only use native if SDK has no way to authenticate.\r\n if (preferSdk) {\r\n // No API key available — fall back to native if CLI exists.\r\n return await hasCli(cliCommand);\r\n }\r\n\r\n // Default behavior: prefer native when CLI is available and no explicit credential.\r\n return credential === undefined && await hasCli(cliCommand);\r\n };\r\n\r\n const providerLoaders: ReadonlyArray<{\r\n name: string;\r\n load: () => Promise<IModelProvider>;\r\n }> = [\r\n {\r\n name: \"anthropic\",\r\n load: async () => {\r\n const { ClaudeAdapter } = await import(\"./claude-adapter.js\");\r\n const credential = await session.getActiveCredential(\"anthropic\").catch(() => undefined);\r\n const useNative = await shouldUseNative(credential, \"claude\", \"ANTHROPIC_API_KEY\");\r\n\r\n if (useNative) {\r\n const { ClaudeNativeCLIAdapter, logNativeAdapterSelection } = await import(\r\n \"./native-cli-adapters.js\"\r\n );\r\n logNativeAdapterSelection(\"anthropic\");\r\n return new ClaudeNativeCLIAdapter();\r\n }\r\n\r\n return new ClaudeAdapter(\r\n credential?.token !== undefined ? { apiKey: credential.token } : undefined,\r\n );\r\n },\r\n },\r\n {\r\n name: \"openai\",\r\n load: async () => {\r\n const { OpenAIAdapter } = await import(\"./openai-adapter.js\");\r\n const credential = await session.getActiveCredential(\"openai\").catch(() => undefined);\r\n const useNative = await shouldUseNative(credential, \"codex\", \"OPENAI_API_KEY\");\r\n\r\n if (useNative) {\r\n const { CodexNativeCLIAdapter, logNativeAdapterSelection } = await import(\r\n \"./native-cli-adapters.js\"\r\n );\r\n logNativeAdapterSelection(\"openai\");\r\n return new CodexNativeCLIAdapter();\r\n }\r\n\r\n return new OpenAIAdapter(\r\n credential?.token !== undefined ? { apiKey: credential.token } : undefined,\r\n );\r\n },\r\n },\r\n {\r\n name: \"google\",\r\n load: async () => {\r\n const { GeminiAdapter } = await import(\"./gemini-adapter.js\");\r\n const credential = await session.getActiveCredential(\"google\").catch(() => undefined);\r\n const useNative = await shouldUseNative(credential, \"gemini\", \"GOOGLE_API_KEY\");\r\n\r\n if (useNative) {\r\n const { GeminiNativeCLIAdapter, logNativeAdapterSelection } = await import(\r\n \"./native-cli-adapters.js\"\r\n );\r\n logNativeAdapterSelection(\"google\");\r\n return new GeminiNativeCLIAdapter();\r\n }\r\n\r\n return new GeminiAdapter(\r\n credential?.token !== undefined ? { apiKey: credential.token } : undefined,\r\n );\r\n },\r\n },\r\n {\r\n name: \"kimi\",\r\n load: async () => {\r\n const { KimiAdapter } = await import(\"./kimi-adapter.js\");\r\n const credential = await session.getActiveCredential(\"kimi\").catch(() => undefined);\r\n const useNative = await shouldUseNative(credential, \"kimi\", \"MOONSHOT_API_KEY\");\r\n\r\n if (useNative) {\r\n const { KimiNativeCLIAdapter, logNativeAdapterSelection } = await import(\r\n \"./native-cli-adapters.js\"\r\n );\r\n logNativeAdapterSelection(\"kimi\");\r\n return new KimiNativeCLIAdapter();\r\n }\r\n\r\n return new KimiAdapter(\r\n credential?.token !== undefined ? { apiKey: credential.token } : undefined,\r\n );\r\n },\r\n },\r\n ];\r\n\r\n // Initialize all providers in parallel (including Ollama)\r\n const ollamaTask = (async () => {\r\n try {\r\n const { OllamaAdapter } = await import(\"./ollama-adapter.js\");\r\n const ollama = new OllamaAdapter();\r\n await ollama.refreshModels();\r\n registry.register(ollama);\r\n } catch {\r\n // Ollama not available\r\n }\r\n })();\r\n\r\n await Promise.all([\r\n ...providerLoaders.map(async (config) => {\r\n try {\r\n const adapter = await config.load();\r\n registry.register(adapter);\r\n } catch {\r\n // Skip provider if adapter fails to initialize\r\n }\r\n }),\r\n ollamaTask,\r\n ]);\r\n\r\n return registry;\r\n}\r\n"]}