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
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/panes/iterm2-manager.ts","../src/panes/ipc-hub.ts","../src/panes/pane-process.ts","../src/mcp/tool-bridge.ts"],"names":["NEWLINE","createHmac"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BA,IAAM,aAAA,GAAwD;AAAA,EAC5D,QAAA,EAAU,EAAE,eAAA,EAAiB,SAAA,EAAW,WAAW,SAAA,EAAU;AAAA,EAC7D,MAAA,EAAQ,EAAE,eAAA,EAAiB,SAAA,EAAW,WAAW,OAAA,EAAQ;AAAA,EACzD,MAAA,EAAQ,EAAE,eAAA,EAAiB,SAAA,EAAW,WAAW,UAAA,EAAW;AAAA,EAC5D,OAAA,EAAS,EAAE,eAAA,EAAiB,SAAA,EAAW,WAAW,QAAA,EAAS;AAAA,EAC3D,MAAA,EAAQ,EAAE,eAAA,EAAiB,SAAA,EAAW,WAAW,UAAA,EAAW;AAAA,EAC5D,aAAA,EAAe,EAAE,eAAA,EAAiB,SAAA,EAAW,WAAW,MAAA;AAC1D,CAAA;AAEA,IAAM,eAAA,GAAgC;AAAA,EACpC,eAAA,EAAiB,SAAA;AAAA,EACjB,SAAA,EAAW;AACb,CAAA;AAIO,IAAM,gBAAN,MAAoB;AAAA,EACR,KAAA,uBAAY,GAAA,EAA6B;AAAA,EAClD,QAAA,GAAW,KAAA;AAAA;AAAA;AAAA;AAAA,EAKnB,WAAA,GAAuB;AACrB,IAAA,IAAI,OAAA,CAAQ,aAAa,QAAA,EAAU;AACjC,MAAA,MAAA,CAAO,MAAM,8BAA8B,CAAA;AAC3C,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,GAAA,CAAI,cAAc,CAAA;AAC9C,IAAA,IAAI,gBAAgB,WAAA,EAAa;AAC/B,MAAA,MAAA,CAAO,KAAA,CAAM,EAAE,WAAA,EAAY,EAAG,2BAA2B,CAAA;AACzD,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,oBAAA,GAAyC;AAC7C,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,EAAY,EAAG,OAAO,KAAA;AAEhC,IAAA,IAAI;AACF,MAAA,MAAM,SAAS,MAAM,KAAA,CAAM,WAAW,CAAC,IAAA,EAAM,eAAe,CAAC,CAAA;AAC7D,MAAA,OAAO,OAAO,QAAA,KAAa,CAAA;AAAA,IAC7B,CAAA,CAAA,MAAQ;AACN,MAAA,MAAA,CAAO,KAAK,iDAAiD,CAAA;AAC7D,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,YAAA,EAA4C;AAC5D,IAAA,IAAA,CAAK,iBAAA,EAAkB;AAEvB,IAAA,IAAI,CAAE,MAAM,IAAA,CAAK,oBAAA,EAAqB,EAAI;AACxC,MAAA,MAAM,IAAI,eAAA;AAAA,QACR,QAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,sBAAA,CAAuB,YAAY,CAAA;AAEvD,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,oBAAoB,MAAM,CAAA;AACrC,MAAA,MAAA,CAAO,IAAA;AAAA,QACL,EAAE,SAAA,EAAW,YAAA,CAAa,KAAA,CAAM,MAAA,EAAO;AAAA,QACvC;AAAA,OACF;AAAA,IACF,SAAS,KAAA,EAAgB;AACvB,MAAA,MAAM,UAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACrE,MAAA,MAAM,IAAI,eAAA,CAAgB,QAAA,EAAU,CAAA,+BAAA,EAAkC,OAAO,CAAA,CAAE,CAAA;AAAA,IACjF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAA,CAAY,MAAA,EAAgB,OAAA,EAAgC;AAChE,IAAA,IAAA,CAAK,iBAAA,EAAkB;AAEvB,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,MAAM,CAAA;AAClC,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,MAAA,CAAO,IAAA,CAAK,EAAE,MAAA,EAAO,EAAG,4CAA4C,CAAA;AACpE,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,cAAA,GAAiB,QAAQ,OAAA,CAAQ,IAAA,EAAM,KAAK,CAAA,CAAE,OAAA,CAAQ,OAAO,MAAM,CAAA;AACzE,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,sBAAA,CAAuB,IAAA,CAAK,WAAW,cAAc,CAAA;AAEzE,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,oBAAoB,MAAM,CAAA;AACrC,MAAA,MAAA,CAAO,KAAA,CAAM,EAAE,MAAA,EAAQ,OAAA,EAAS,OAAA,CAAQ,MAAM,CAAA,EAAG,EAAE,CAAA,EAAE,EAAG,6BAA6B,CAAA;AAAA,IACvF,SAAS,KAAA,EAAgB;AACvB,MAAA,MAAM,UAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACrE,MAAA,MAAA,CAAO,MAAM,EAAE,MAAA,EAAQ,KAAA,EAAO,OAAA,IAAW,uCAAuC,CAAA;AAAA,IAClF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAA,CAAW,MAAA,EAAgB,IAAA,EAA6B;AAC5D,IAAA,IAAA,CAAK,iBAAA,EAAkB;AAEvB,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,MAAM,CAAA;AAClC,IAAA,IAAI,CAAC,IAAA,EAAM;AAEX,IAAA,MAAM,OAAA,GAAU,aAAA,CAAc,IAAI,CAAA,IAAK,eAAA;AACvC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,qBAAA,CAAsB,IAAA,CAAK,WAAW,OAAO,CAAA;AAEjE,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,oBAAoB,MAAM,CAAA;AACrC,MAAA,MAAA,CAAO,KAAA,CAAM,EAAE,MAAA,EAAQ,IAAA,IAAQ,yBAAyB,CAAA;AAAA,IAC1D,CAAA,CAAA,MAAQ;AACN,MAAA,MAAA,CAAO,KAAA,CAAM,EAAE,MAAA,EAAQ,IAAA,IAAQ,0CAA0C,CAAA;AAAA,IAC3E;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAA,GAAyB;AAC7B,IAAA,IAAI,KAAK,QAAA,EAAU;AACnB,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAEhB,IAAA,KAAA,MAAW,CAAC,MAAA,EAAQ,IAAI,CAAA,IAAK,KAAK,KAAA,EAAO;AACvC,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,uBAAA,CAAwB,IAAA,CAAK,SAAS,CAAA;AAC1D,QAAA,MAAM,IAAA,CAAK,oBAAoB,MAAM,CAAA;AAAA,MACvC,CAAA,CAAA,MAAQ;AAAA,MAER;AACA,MAAA,WAAA,EAAY,CAAE,IAAA,CAAK,aAAA,EAAe,EAAE,QAAQ,CAAA;AAAA,IAC9C;AAEA,IAAA,IAAA,CAAK,MAAM,KAAA,EAAM;AACjB,IAAA,MAAA,CAAO,KAAK,wBAAwB,CAAA;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,GAAiD;AAC/C,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,IAAA,EAA6B;AACxC,IAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,IAAA,CAAK,MAAA,EAAQ,IAAI,CAAA;AAChC,IAAA,WAAA,EAAY,CAAE,KAAK,cAAA,EAAgB;AAAA,MACjC,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,WAAW,IAAA,CAAK;AAAA,KACjB,CAAA;AAAA,EACH;AAAA;AAAA,EAIQ,uBAAuB,YAAA,EAAqC;AAClE,IAAA,MAAM,cAAc,YAAA,CAAa,KAAA;AACjC,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,kBAAA,CAAmB,WAAA,EAAa,aAAa,MAAM,CAAA;AAE9E,IAAA,OAAO;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA,EAcT,aAAa;;AAAA;AAAA;AAAA;;AAAA;AAAA,CAAA,CAOb,IAAA,EAAK;AAAA,EACL;AAAA,EAEQ,kBAAA,CACN,OACA,MAAA,EACQ;AACR,IAAA,MAAM,QAAkB,EAAC;AAEzB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,MAAA,MAAM,WAAW,IAAA,CAAK,qBAAA,CAAsB,CAAA,EAAG,KAAA,CAAM,QAAQ,MAAM,CAAA;AACnE,MAAA,MAAM,SAAA,GAAY,WAAW,MAAA,GAAS,OAAA;AACtC,MAAA,KAAA,CAAM,IAAA;AAAA,QACJ,oCAAoC,IAAA,CAAK,KAAA,CAAM,IAAI,CAAC,CAAC,+BAA+B,SAAS,CAAA,CAAA;AAAA,OAC/F;AACA,MAAA,KAAA,CAAM,KAAK,CAAA,gCAAA,CAAkC,CAAA;AAE7C,MAAA,MAAM,IAAA,GAAO,MAAM,CAAC,CAAA;AACpB,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,MAAM,YAAA,GAAe,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,MAAM,KAAK,CAAA;AACnD,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,sCAAA,EAAyC,YAAY,CAAA,EAAA,CAAI,CAAA;AAAA,MACtE;AAAA,IACF;AAEA,IAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,EACxB;AAAA,EAEQ,qBAAA,CACN,KAAA,EACA,KAAA,EACA,MAAA,EACS;AACT,IAAA,IAAI,MAAA,KAAW,YAAY,OAAO,IAAA;AAClC,IAAA,IAAI,MAAA,KAAW,cAAc,OAAO,KAAA;AAEpC,IAAA,IAAI,KAAA,IAAS,GAAG,OAAO,KAAA;AACvB,IAAA,OAAO,QAAQ,CAAA,KAAM,CAAA;AAAA,EACvB;AAAA,EAEQ,sBAAA,CAAuB,WAAmB,OAAA,EAAyB;AACzE,IAAA,OAAO;AAAA;;AAAA;AAAA;AAAA,qCAAA,EAK4B,SAAS,CAAA;AAAA;AAAA,uCAAA,EAEP,OAAO,CAAA;;AAAA;AAAA,CAAA,CAG9C,IAAA,EAAK;AAAA,EACL;AAAA,EAEQ,qBAAA,CAAsB,WAAmB,OAAA,EAA+B;AAC9E,IAAA,OAAO;AAAA;;AAAA;AAAA;AAAA,qCAAA,EAK4B,SAAS,CAAA;AAAA;AAAA;AAAA,uCAAA,EAGP,QAAQ,eAAe,CAAA;AAAA;AAAA,+BAAA,EAE/B,QAAQ,SAAS,CAAA;AAAA;;AAAA;AAAA,CAAA,CAIhD,IAAA,EAAK;AAAA,EACL;AAAA,EAEQ,wBAAwB,SAAA,EAA2B;AACzD,IAAA,OAAO;AAAA;;AAAA;AAAA;AAAA,qCAAA,EAK4B,SAAS,CAAA;AAAA;AAAA;;AAAA;AAAA,CAAA,CAK9C,IAAA,EAAK;AAAA,EACL;AAAA;AAAA,EAIA,MAAc,oBAAoB,MAAA,EAAiC;AACjE,IAAA,MAAM,SAAS,MAAM,KAAA,CAAM,WAAW,CAAC,IAAA,EAAM,MAAM,CAAA,EAAG;AAAA,MACpD,OAAA,EAAS;AAAA,KACV,CAAA;AACD,IAAA,OAAO,MAAA,CAAO,MAAA;AAAA,EAChB;AAAA,EAEQ,iBAAA,GAA0B;AAChC,IAAA,IAAI,KAAK,QAAA,EAAU;AACjB,MAAA,MAAM,IAAI,eAAA,CAAgB,QAAA,EAAU,iCAAiC,CAAA;AAAA,IACvE;AAAA,EACF;AACF;AChSA,IAAM,OAAA,GAAU,EAAA;AAChB,IAAM,YAAA,GAAe,GAAA;AACrB,IAAM,YAAA,GAAe,OAAA;AACrB,IAAM,eAAA,GAAkB,MAAA;AACxB,IAAM,eAAA,GAAkB,MAAA;AACxB,IAAM,oBAAA,GAAuB,MAAA;AAC7B,IAAM,kBAAA,GAAqB,MAAA;AAC3B,IAAM,cAAA,GAAiB,KAAA;AAIhB,IAAM,SAAN,MAAa;AAAA,EACD,SAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA,uBAAc,GAAA,EAA+B;AAAA,EAC7C,QAAA,uBAAe,GAAA,EAA2B;AAAA,EACnD,MAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EAEnB,YAAY,SAAA,EAAmB;AAC7B,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,IAAA,IAAA,CAAK,UAAA,GAAa,WAAA,CAAY,EAAE,CAAA,CAAE,SAAS,KAAK,CAAA;AAChD,IAAA,IAAA,CAAK,UAAA,GAAa,iBAAiB,SAAS,CAAA;AAC5C,IAAA,IAAA,CAAK,uBAAA,EAAwB;AAAA,EAC/B;AAAA,EAEA,aAAA,GAAwB;AAAE,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,EAAY;AAAA,EAClD,aAAA,GAAwB;AAAE,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,EAAY;AAAA,EAClD,cAAA,GAAyB;AAAE,IAAA,OAAO,KAAK,OAAA,CAAQ,IAAA;AAAA,EAAM;AAAA,EACrD,oBAAA,GAA0C;AAAE,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAA;AAAA,EAAG;AAAA;AAAA,EAG7E,MAAM,KAAA,GAAuB;AAC3B,IAAA,IAAA,CAAK,WAAA,EAAY;AACjB,IAAA,qBAAA,CAAsB,iBAAiB,CAAA;AACvC,IAAA,MAAM,KAAK,iBAAA,EAAkB;AAE7B,IAAA,OAAO,IAAI,OAAA,CAAc,CAAC,OAAA,EAAS,MAAA,KAAW;AAC5C,MAAA,IAAA,CAAK,MAAA,GAAS,YAAA,CAAa,CAAC,MAAA,KAAW;AACrC,QAAA,IAAA,CAAK,iBAAiB,MAAM,CAAA;AAAA,MAC9B,CAAC,CAAA;AACD,MAAA,IAAA,CAAK,MAAA,CAAO,EAAA,CAAG,OAAA,EAAS,CAAC,GAAA,KAAe;AACtC,QAAA,MAAA,CAAO,MAAM,EAAE,KAAA,EAAO,GAAA,CAAI,OAAA,IAAW,kBAAkB,CAAA;AACvD,QAAA,MAAA,CAAO,IAAI,QAAA,CAAS,CAAA,cAAA,EAAiB,GAAA,CAAI,OAAO,EAAE,CAAC,CAAA;AAAA,MACrD,CAAC,CAAA;AACD,MAAA,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,UAAA,EAAY,MAAM;AACxC,QAAA,KAAA,CAAM,YAAY;AAChB,UAAA,IAAI;AACF,YAAA,MAAM,KAAA,CAAM,IAAA,CAAK,UAAA,EAAY,YAAY,CAAA;AAAA,UAC3C,CAAA,CAAA,MAAQ;AAAA,UAER;AACA,UAAA,MAAA,CAAO,KAAK,EAAE,UAAA,EAAY,IAAA,CAAK,UAAA,IAAc,mBAAmB,CAAA;AAChE,UAAA,IAAA,CAAK,mBAAA,EAAoB;AACzB,UAAA,OAAA,EAAQ;AAAA,QACV,CAAA,GAAG;AAAA,MACL,CAAC,CAAA;AAAA,IACH,CAAC,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,YAAA,CAAa,SAAiB,OAAA,EAA4B;AACxD,IAAA,IAAA,CAAK,WAAA,EAAY;AACjB,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA;AACvC,IAAA,IAAI,MAAA,EAAQ,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,QAAQ,OAAO,CAAA;AAAA,EAC/C;AAAA;AAAA,EAGA,SAAA,CAAU,SAAsB,SAAA,EAA0B;AACxD,IAAA,IAAA,CAAK,WAAA,EAAY;AACjB,IAAA,KAAA,MAAW,CAAC,EAAA,EAAI,MAAM,CAAA,IAAK,KAAK,OAAA,EAAS;AACvC,MAAA,IAAI,OAAO,SAAA,EAAW,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,QAAQ,OAAO,CAAA;AAAA,IACzD;AAAA,EACF;AAAA;AAAA,EAGA,QAAA,CAAS,QAAgB,OAAA,EAA8B;AACrD,IAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,MAAA,EAAQ,OAAO,CAAA;AAAA,EACnC;AAAA;AAAA,EAGA,YAAY,OAAA,EAA0B;AACpC,IAAA,OAAO,UAAA,CAAW,QAAA,EAAU,IAAA,CAAK,UAAU,CAAA,CACxC,MAAA,CAAO,IAAA,CAAK,SAAA,CAAU,OAAO,CAAC,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA;AAAA,EACjD;AAAA;AAAA,EAGA,oBAAA,CAAqB,OAAA,EAAiB,SAAA,EAAmB,MAAA,EAAsB;AAC7E,IAAA,IAAA,CAAK,QAAQ,GAAA,CAAI,OAAA,EAAS,EAAE,OAAA,EAAS,SAAA,EAAW,QAAQ,CAAA;AAAA,EAC1D;AAAA;AAAA,EAGA,MAAM,OAAA,GAAyB;AAC7B,IAAA,IAAI,KAAK,QAAA,EAAU;AACnB,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAChB,IAAA,MAAM,GAAA,GAAmB,EAAE,OAAA,EAAS,KAAA,EAAO,MAAA,EAAQ,gBAAgB,MAAA,EAAQ,EAAE,MAAA,EAAQ,mBAAA,EAAoB,EAAE;AAC3G,IAAA,KAAA,MAAW,CAAA,IAAK,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAO,EAAG;AACrC,MAAA,IAAI;AAAE,QAAA,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,MAAA,EAAQ,GAAG,CAAA;AAAG,QAAA,CAAA,CAAE,OAAO,GAAA,EAAI;AAAA,MAAG,CAAA,CAAA,MAAQ;AAAA,MAAqB;AAAA,IAChF;AACA,IAAA,IAAA,CAAK,QAAQ,KAAA,EAAM;AACnB,IAAA,IAAI,KAAK,MAAA,EAAQ;AACf,MAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,MAAA,MAAM,IAAI,OAAA,CAAc,CAAC,OAAA,KAAY;AACnC,QAAA,MAAA,CAAO,MAAM,MAAM;AACjB,UAAA,OAAA,EAAQ;AAAA,QACV,CAAC,CAAA;AAAA,MACH,CAAC,CAAA;AACD,MAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,IAChB;AACA,IAAA,MAAM,KAAK,iBAAA,EAAkB;AAC7B,IAAA,MAAA,CAAO,KAAK,EAAE,SAAA,EAAW,IAAA,CAAK,SAAA,IAAa,mBAAmB,CAAA;AAAA,EAChE;AAAA;AAAA,EAIQ,iBAAiB,MAAA,EAAsB;AAC7C,IAAA,IAAI,MAAA,GAAS,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA;AAC3B,IAAA,IAAI,OAAA;AAEJ,IAAA,MAAA,CAAO,EAAA,CAAG,MAAA,EAAQ,CAAC,IAAA,KAAiB;AAClC,MAAA,MAAA,GAAS,MAAA,CAAO,MAAA,CAAO,CAAC,MAAA,EAAQ,IAAI,CAAC,CAAA;AACrC,MAAA,IAAI,MAAA,CAAO,SAAS,YAAA,EAAc;AAAE,QAAA,MAAA,CAAO,OAAA,EAAQ;AAAG,QAAA;AAAA,MAAQ;AAE9D,MAAA,IAAI,GAAA;AACJ,MAAA,OAAA,CAAQ,GAAA,GAAM,MAAA,CAAO,OAAA,CAAQ,OAAO,OAAO,EAAA,EAAI;AAC7C,QAAA,MAAM,MAAM,MAAA,CAAO,QAAA,CAAS,GAAG,GAAG,CAAA,CAAE,SAAS,OAAO,CAAA;AACpD,QAAA,MAAA,GAAS,MAAA,CAAO,QAAA,CAAS,GAAA,GAAM,CAAC,CAAA;AAChC,QAAA,IAAI,GAAA,CAAI,WAAW,CAAA,EAAG;AACtB,QAAA,IAAA,CAAK,WAAW,GAAA,EAAK,MAAA,EAAQ,OAAO,CAAA,CAAE,IAAA,CAAK,CAAC,EAAA,KAAO;AAAE,UAAA,IAAI,IAAI,OAAA,GAAU,EAAA;AAAA,QAAI,CAAC,CAAA,CACzE,KAAA,CAAM,CAAC,CAAA,KAAe;AACrB,UAAA,MAAA,CAAO,KAAA,CAAM,EAAE,KAAA,EAAO,CAAA,YAAa,KAAA,GAAQ,CAAA,CAAE,OAAA,GAAU,MAAA,CAAO,CAAC,CAAA,EAAE,EAAG,eAAe,CAAA;AAAA,QACrF,CAAC,CAAA;AAAA,MACL;AAAA,IACF,CAAC,CAAA;AAED,IAAA,MAAA,CAAO,EAAA,CAAG,SAAS,MAAM;AACvB,MAAA,IAAI,OAAA,EAAS;AAAE,QAAA,IAAA,CAAK,OAAA,CAAQ,OAAO,OAAO,CAAA;AAAG,QAAA,MAAA,CAAO,IAAA,CAAK,EAAE,OAAA,EAAQ,EAAG,qBAAqB,CAAA;AAAA,MAAG;AAAA,IAChG,CAAC,CAAA;AACD,IAAA,MAAA,CAAO,EAAA,CAAG,OAAA,EAAS,CAAC,GAAA,KAAe;AACjC,MAAA,MAAA,CAAO,MAAM,EAAE,KAAA,EAAO,IAAI,OAAA,EAAS,OAAA,IAAW,cAAc,CAAA;AAAA,IAC9D,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,MAAc,UAAA,CAAW,GAAA,EAAa,MAAA,EAAgB,SAAA,EAA4D;AAChH,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI;AAAE,MAAA,MAAA,GAAS,IAAA,CAAK,MAAM,GAAG,CAAA;AAAA,IAAc,CAAA,CAAA,MAAQ;AACjD,MAAA,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,MAAA,EAAW,eAAA,EAAiB,aAAa,CAAA;AAAG,MAAA,OAAO,MAAA;AAAA,IAC5E;AAEA,IAAA,IAAI,CAAC,IAAA,CAAK,cAAA,CAAe,MAAM,CAAA,EAAG;AAChC,MAAA,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,MAAA,EAAW,eAAA,EAAiB,wBAAwB,CAAA;AAAG,MAAA,OAAO,MAAA;AAAA,IACvF;AACA,IAAA,MAAM,EAAE,OAAA,EAAS,IAAA,EAAK,GAAI,MAAA;AAC1B,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,YAAA,CAAa,OAAO,CAAA;AAE3C,IAAA,IAAI,CAAC,IAAA,CAAK,UAAA,CAAW,OAAA,EAAS,IAAI,CAAA,EAAG;AACnC,MAAA,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,SAAA,EAAW,cAAA,EAAgB,uBAAuB,CAAA;AAAG,MAAA,OAAO,MAAA;AAAA,IACrF;AACA,IAAA,IAAI,CAAC,IAAA,CAAK,YAAA,CAAa,OAAO,CAAA,EAAG;AAC/B,MAAA,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,SAAA,EAAW,eAAA,EAAiB,sBAAsB,CAAA;AAAG,MAAA,OAAO,MAAA;AAAA,IACrF;AAEA,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,QAAQ,MAAM,CAAA;AAChD,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,IAAA,CAAK,SAAA,CAAU,QAAQ,OAAA,CAAQ,EAAA,EAAI,sBAAsB,CAAA,SAAA,EAAY,OAAA,CAAQ,MAAM,CAAA,CAAE,CAAA;AAAG,MAAA,OAAO,MAAA;AAAA,IACjG;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,SAAA,IAAc,OAAA,CAAQ,MAAA,CAAO,SAAS,CAAA,IAA4B,SAAA;AAC9E,MAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,GAAA,EAAK,QAAQ,MAAA,EAAQ,OAAA,CAAQ,IAAI,MAAM,CAAA;AACpE,MAAA,IAAI,OAAA,CAAQ,OAAO,KAAA,CAAA,EAAW,IAAA,CAAK,WAAW,MAAA,EAAQ,OAAA,CAAQ,IAAI,MAAM,CAAA;AACxE,MAAA,IAAI,QAAQ,MAAA,KAAW,gBAAA,EAAkB,OAAO,OAAA,CAAQ,OAAO,SAAS,CAAA;AAAA,IAC1E,SAAS,CAAA,EAAY;AACnB,MAAA,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,OAAA,CAAQ,EAAA,EAAI,kBAAA,EAAoB,CAAA,YAAa,KAAA,GAAQ,CAAA,CAAE,OAAA,GAAU,MAAA,CAAO,CAAC,CAAC,CAAA;AAAA,IACnG;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA,EAIQ,uBAAA,GAAgC;AACtC,IAAA,IAAA,CAAK,SAAS,GAAA,CAAI,gBAAA,EAAkB,CAAC,IAAA,EAAM,MAAA,EAAQ,KAAK,MAAA,KAAW;AACjE,MAAA,MAAM,OAAA,GAAU,OAAO,SAAS,CAAA;AAChC,MAAA,MAAM,SAAA,GAAY,OAAO,WAAW,CAAA;AACpC,MAAA,IAAI,CAAC,OAAA,IAAW,CAAC,WAAW,MAAM,IAAI,SAAS,+CAA+C,CAAA;AAC9F,MAAA,IAAA,CAAK,oBAAA,CAAqB,OAAA,EAAS,SAAA,EAAW,MAAM,CAAA;AACpD,MAAA,MAAA,CAAO,IAAA,CAAK,EAAE,OAAA,EAAS,SAAA,IAAa,kBAAkB,CAAA;AACtD,MAAA,OAAO,EAAE,UAAA,EAAY,IAAA,EAAM,OAAA,EAAQ;AAAA,IACrC,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,mBAAA,EAAqB,CAAC,MAAM,MAAA,KAAW;AACvD,MAAA,WAAA,EAAY,CAAE,KAAK,oBAAA,EAAsB;AAAA,QACvC,KAAA,EAAQ,MAAA,CAAO,OAAO,CAAA,IAA4B,SAAA;AAAA,QAClD,OAAA,EAAU,MAAA,CAAO,SAAS,CAAA,IAA4B;AAAA,OACvD,CAAA;AACD,MAAA,OAAO,EAAE,UAAU,IAAA,EAAK;AAAA,IAC1B,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,kBAAA,EAAoB,CAAC,MAAM,MAAA,KAAW;AACtD,MAAA,MAAM,MAAA,GAAS,OAAO,QAAQ,CAAA;AAC9B,MAAA,MAAM,MAAA,GAAS,OAAO,QAAQ,CAAA;AAC9B,MAAA,IAAI,MAAA,IAAU,QAAQ,WAAA,EAAY,CAAE,KAAK,cAAA,EAAgB,EAAE,MAAA,EAAQ,MAAA,EAAQ,CAAA;AAC3E,MAAA,OAAO,EAAE,UAAU,IAAA,EAAK;AAAA,IAC1B,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,eAAA,EAAiB,CAAC,MAAM,MAAA,KAAW;AACnD,MAAA,MAAM,EAAA,GAAK,OAAO,IAAI,CAAA;AACtB,MAAA,MAAM,OAAA,GAAU,OAAO,SAAS,CAAA;AAChC,MAAA,MAAM,IAAA,GAAO,OAAO,MAAM,CAAA;AAC1B,MAAA,IAAI,IAAA,IAAQ,MAAM,OAAA,EAAS;AACzB,QAAA,WAAA,GAAc,IAAA,CAAK,eAAA,EAAiB,EAAE,IAAA,EAAM,EAAA,EAAI,SAAS,CAAA;AACzD,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA;AAClC,QAAA,IAAI,MAAA,EAAQ;AACV,UAAA,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,MAAA,EAAQ,EAAE,OAAA,EAAS,KAAA,EAAO,MAAA,EAAQ,eAAA,EAAiB,MAAA,EAAQ,EAAE,IAAA,EAAM,OAAA,IAAW,CAAA;AAAA,QAClG;AAAA,MACF;AACA,MAAA,OAAO,EAAE,SAAA,EAAW,IAAA,CAAK,QAAQ,GAAA,CAAI,EAAA,IAAM,EAAE,CAAA,EAAE;AAAA,IACjD,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,gBAAA,EAAkB,CAAC,MAAM,MAAA,KAAW;AACpD,MAAA,MAAM,OAAA,GAAU,OAAO,SAAS,CAAA;AAChC,MAAA,MAAM,MAAA,GAAS,OAAO,QAAQ,CAAA;AAC9B,MAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA;AACvC,QAAA,IAAI,QAAQ,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,MAAA,EAAQ,EAAE,OAAA,EAAS,KAAA,EAAO,MAAA,EAAQ,gBAAA,EAAkB,QAAQ,EAAE,MAAA,EAAQ,GAAG,MAAA,IAAU,CAAA;AAAA,MACnH;AACA,MAAA,OAAO,EAAE,QAAA,EAAU,IAAA,CAAK,QAAQ,GAAA,CAAI,OAAA,IAAW,EAAE,CAAA,EAAE;AAAA,IACrD,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,cAAA,EAAgB,CAAC,MAAM,MAAA,KAAW;AAClD,MAAA,MAAM,OAAA,GAAU,OAAO,SAAS,CAAA;AAChC,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA;AACvC,QAAA,IAAI,MAAA,EAAQ;AACV,UAAA,IAAA,CAAK,KAAA,CAAM,OAAO,MAAA,EAAQ;AAAA,YACxB,OAAA,EAAS,KAAA;AAAA,YAAO,MAAA,EAAQ,cAAA;AAAA,YACxB,QAAQ,EAAE,MAAA,EAAS,MAAA,CAAO,QAAQ,KAA4B,oBAAA;AAAqB,WACpF,CAAA;AAAA,QACH;AAAA,MACF;AACA,MAAA,OAAO,EAAE,QAAA,EAAU,IAAA,CAAK,QAAQ,GAAA,CAAI,OAAA,IAAW,EAAE,CAAA,EAAE;AAAA,IACrD,CAAC,CAAA;AAAA,EACH;AAAA;AAAA,EAIQ,UAAA,CAAW,SAAkB,IAAA,EAAuB;AAC1D,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,WAAA,CAAY,OAAO,CAAA;AACzC,IAAA,IAAI,QAAA,CAAS,MAAA,KAAW,IAAA,CAAK,MAAA,EAAQ,OAAO,KAAA;AAC5C,IAAA,OAAO,eAAA,CAAgB,MAAA,CAAO,IAAA,CAAK,QAAA,EAAU,KAAK,GAAG,MAAA,CAAO,IAAA,CAAK,IAAA,EAAM,KAAK,CAAC,CAAA;AAAA,EAC/E;AAAA,EAEQ,eAAe,CAAA,EAAqD;AAC1E,IAAA,IAAI,OAAO,CAAA,KAAM,QAAA,IAAY,CAAA,KAAM,MAAM,OAAO,KAAA;AAChD,IAAA,MAAM,CAAA,GAAI,CAAA;AACV,IAAA,OAAO,OAAO,CAAA,CAAE,MAAM,CAAA,KAAM,QAAA,IAAY,OAAO,CAAA,CAAE,SAAS,CAAA,KAAM,QAAA,IAAY,CAAA,CAAE,SAAS,CAAA,KAAM,IAAA;AAAA,EAC/F;AAAA,EAEQ,aAAa,CAAA,EAA8B;AACjD,IAAA,IAAI,OAAO,CAAA,KAAM,QAAA,IAAY,CAAA,KAAM,MAAM,OAAO,KAAA;AAChD,IAAA,MAAM,CAAA,GAAI,CAAA;AACV,IAAA,OAAO,EAAE,SAAS,CAAA,KAAM,KAAA,IACnB,OAAO,EAAE,QAAQ,CAAA,KAAM,QAAA,IACvB,OAAO,EAAE,QAAQ,CAAA,KAAM,QAAA,IACvB,CAAA,CAAE,QAAQ,CAAA,KAAM,IAAA;AAAA,EACvB;AAAA,EAEQ,aAAa,CAAA,EAAgC;AACnD,IAAA,IAAI,OAAO,CAAA,KAAM,QAAA,IAAY,CAAA,KAAM,MAAM,OAAO,MAAA;AAChD,IAAA,MAAM,CAAA,GAAI,CAAA;AACV,IAAA,OAAO,OAAO,CAAA,CAAE,IAAI,MAAM,QAAA,GAAW,CAAA,CAAE,IAAI,CAAA,GAAI,MAAA;AAAA,EACjD;AAAA;AAAA,EAIQ,KAAA,CAAM,QAAgB,GAAA,EAAuC;AACnE,IAAA,IAAI,CAAC,OAAO,SAAA,EAAW,MAAA,CAAO,MAAM,IAAA,CAAK,SAAA,CAAU,GAAG,CAAA,GAAI,IAAI,CAAA;AAAA,EAChE;AAAA,EAEQ,UAAA,CAAW,MAAA,EAAgB,EAAA,EAAY,MAAA,EAAuB;AACpE,IAAA,IAAA,CAAK,MAAM,MAAA,EAAQ,EAAE,SAAS,KAAA,EAAO,MAAA,EAAQ,IAAoB,CAAA;AAAA,EACnE;AAAA,EAEQ,SAAA,CAAU,MAAA,EAAgB,EAAA,EAAwB,IAAA,EAAc,OAAA,EAAuB;AAC7F,IAAA,IAAA,CAAK,KAAA,CAAM,MAAA,EAAQ,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,EAAE,IAAA,EAAM,OAAA,EAAQ,EAAG,EAAA,EAAI,EAAA,IAAM,GAAmB,CAAA;AAAA,EAC9F;AAAA;AAAA,EAIA,MAAc,iBAAA,GAAmC;AAC/C,IAAA,IAAI;AAAE,MAAA,MAAM,MAAA,CAAO,KAAK,UAAU,CAAA;AAAA,IAAG,CAAA,CAAA,MAAQ;AAAA,IAAsB;AAAA,EACrE;AAAA,EAEQ,mBAAA,GAA4B;AAClC,IAAA,MAAM,UAAU,MAAY;AAAE,MAAA,IAAA,CAAK,OAAA,EAAQ,CAAE,KAAA,CAAM,MAAM;AAAA,MAAC,CAAC,CAAA;AAAA,IAAG,CAAA;AAC9D,IAAA,OAAA,CAAQ,IAAA,CAAK,QAAQ,OAAO,CAAA;AAC5B,IAAA,OAAA,CAAQ,IAAA,CAAK,UAAU,OAAO,CAAA;AAC9B,IAAA,OAAA,CAAQ,IAAA,CAAK,WAAW,OAAO,CAAA;AAAA,EACjC;AAAA,EAEQ,WAAA,GAAoB;AAC1B,IAAA,IAAI,IAAA,CAAK,QAAA,EAAU,MAAM,IAAI,SAAS,0BAA0B,CAAA;AAAA,EAClE;AACF;AC7SA,IAAM,oBAAA,GAAuB,IAAA;AAC7B,IAAM,yBAAA,GAA4B,CAAA;AAClC,IAAM,kBAAA,GAAqB,GAAA;AAC3B,IAAMA,QAAAA,GAAU,EAAA;AAIT,IAAM,WAAA,GAAN,MAAM,YAAA,CAAY;AAAA,EACvB,OAAwB,eAAA,GAAkB,OAAA,CAAQ,OAAA,EAAQ;AAAA,EAEzC,OAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA,uBAAkB,GAAA,EAAiC;AAAA,EACnD,OAAA,uBAAc,GAAA,EAA4B;AAAA,EAEnD,MAAA;AAAA,EACA,cAAA;AAAA,EACA,MAAA,GAAS,CAAA;AAAA,EACT,SAAA,GAAY,KAAA;AAAA,EACZ,QAAA,GAAW,KAAA;AAAA,EAEnB,YAAY,OAAA,EAA8B;AACxC,IAAA,IAAA,CAAK,UAAU,OAAA,CAAQ,OAAA;AACvB,IAAA,IAAA,CAAK,YAAY,OAAA,CAAQ,SAAA;AACzB,IAAA,IAAA,CAAK,aAAa,OAAA,CAAQ,UAAA;AAC1B,IAAA,IAAA,CAAK,aAAa,OAAA,CAAQ,UAAA;AAC1B,IAAA,IAAA,CAAK,WAAA,GAAc,QAAQ,mBAAA,IAAuB,oBAAA;AAClD,IAAA,IAAA,CAAK,UAAA,GAAa,QAAQ,mBAAA,IAAuB,yBAAA;AAAA,EACnD;AAAA;AAAA,EAGA,MAAM,OAAA,GAAyB;AAC7B,IAAA,IAAA,CAAK,WAAA,EAAY;AACjB,IAAA,MAAM,KAAK,SAAA,EAAU;AACrB,IAAA,MAAM,KAAK,QAAA,EAAS;AACpB,IAAA,IAAA,CAAK,cAAA,EAAe;AACpB,IAAA,MAAA,CAAO,KAAK,EAAE,OAAA,EAAS,IAAA,CAAK,OAAA,IAAW,uBAAuB,CAAA;AAAA,EAChE;AAAA;AAAA,EAGA,MAAM,OAAA,CAAQ,MAAA,EAAmB,MAAA,EAAmD;AAClF,IAAA,IAAA,CAAK,WAAA,EAAY;AACjB,IAAA,IAAA,CAAK,eAAA,EAAgB;AACrB,IAAA,MAAM,KAAK,IAAA,CAAK,MAAA,EAAA;AAChB,IAAA,MAAM,OAAA,GAAuB,EAAE,OAAA,EAAS,KAAA,EAAO,MAAA,EAAQ,MAAA,EAAQ,EAAE,GAAG,MAAA,EAAQ,OAAA,EAAS,IAAA,CAAK,OAAA,IAAW,EAAA,EAAG;AAExG,IAAA,OAAO,IAAI,OAAA,CAAiB,CAAC,OAAA,EAAS,MAAA,KAAW;AAC/C,MAAA,MAAM,KAAA,GAAQ,WAAW,MAAM;AAC7B,QAAA,IAAA,CAAK,OAAA,CAAQ,OAAO,EAAE,CAAA;AACtB,QAAA,MAAA,CAAO,IAAI,QAAA,CAAS,CAAA,iBAAA,EAAoB,MAAM,EAAE,CAAC,CAAA;AAAA,MACnD,GAAG,kBAAkB,CAAA;AACrB,MAAA,IAAA,CAAK,QAAQ,GAAA,CAAI,EAAA,EAAI,EAAE,OAAA,EAAS,MAAA,EAAQ,OAAO,CAAA;AAC/C,MAAA,IAAA,CAAK,kBAAkB,OAAO,CAAA;AAAA,IAChC,CAAC,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAA,CAAO,QAAmB,MAAA,EAAuC;AAC/D,IAAA,IAAA,CAAK,WAAA,EAAY;AACjB,IAAA,IAAA,CAAK,eAAA,EAAgB;AACrB,IAAA,IAAA,CAAK,iBAAA,CAAkB,EAAE,OAAA,EAAS,KAAA,EAAO,MAAA,EAAQ,MAAA,EAAQ,EAAE,GAAG,MAAA,EAAQ,OAAA,EAAS,IAAA,CAAK,OAAA,IAAW,CAAA;AAAA,EACjG;AAAA;AAAA,EAGA,eAAA,CAAgB,OAAA,EAAiB,KAAA,EAAe,MAAA,EAAuB;AACrE,IAAA,IAAA,CAAK,OAAO,mBAAA,EAAqB,EAAE,OAAA,EAAS,KAAA,EAAO,QAAQ,CAAA;AAAA,EAC7D;AAAA;AAAA,EAGA,cAAA,CAAe,QAAgB,MAAA,EAAsB;AACnD,IAAA,IAAA,CAAK,MAAA,CAAO,kBAAA,EAAoB,EAAE,MAAA,EAAQ,QAAQ,CAAA;AAAA,EACpD;AAAA;AAAA,EAGA,MAAM,WAAA,CAAY,EAAA,EAAY,OAAA,EAAmC;AAC/D,IAAA,OAAO,IAAA,CAAK,QAAQ,eAAA,EAAiB,EAAE,MAAM,IAAA,CAAK,OAAA,EAAS,EAAA,EAAI,OAAA,EAAS,CAAA;AAAA,EAC1E;AAAA;AAAA,EAGA,SAAA,CAAU,QAAgB,OAAA,EAAqC;AAC7D,IAAA,MAAM,MAAM,IAAA,CAAK,WAAA,CAAY,IAAI,MAAM,CAAA,wBAAS,GAAA,EAAI;AACpD,IAAA,GAAA,CAAI,IAAI,OAAO,CAAA;AACf,IAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,MAAA,EAAQ,GAAG,CAAA;AAChC,IAAA,OAAO,MAAM;AAAE,MAAA,GAAA,CAAI,OAAO,OAAO,CAAA;AAAG,MAAA,IAAI,IAAI,IAAA,KAAS,CAAA,EAAG,IAAA,CAAK,WAAA,CAAY,OAAO,MAAM,CAAA;AAAA,IAAG,CAAA;AAAA,EAC3F;AAAA,EAEA,WAAA,GAAuB;AAAE,IAAA,OAAO,IAAA,CAAK,SAAA,IAAa,CAAC,IAAA,CAAK,QAAA;AAAA,EAAU;AAAA;AAAA,EAGlE,UAAA,GAA4B;AAC1B,IAAA,IAAI,KAAK,QAAA,EAAU;AACjB,MAAA,OAAO,YAAA,CAAY,eAAA;AAAA,IACrB;AACA,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAChB,IAAA,IAAA,CAAK,aAAA,EAAc;AACnB,IAAA,IAAA,CAAK,SAAA,EAAU;AACf,IAAA,IAAI,KAAK,MAAA,EAAQ;AAAE,MAAA,IAAA,CAAK,OAAO,GAAA,EAAI;AAAG,MAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,IAAW;AAC/D,IAAA,IAAA,CAAK,SAAA,GAAY,KAAA;AACjB,IAAA,MAAA,CAAO,KAAK,EAAE,OAAA,EAAS,IAAA,CAAK,OAAA,IAAW,0BAA0B,CAAA;AACjE,IAAA,OAAO,YAAA,CAAY,eAAA;AAAA,EACrB;AAAA;AAAA,EAIA,MAAc,SAAA,GAA2B;AACvC,IAAA,MAAM,SAAA,CAAU,MAAM,IAAA,CAAK,aAAA,EAAc,EAAG;AAAA,MAC1C,YAAY,IAAA,CAAK,UAAA;AAAA,MACjB,WAAA,EAAa,GAAA;AAAA,MACb,UAAA,EAAY,GAAA;AAAA,MACZ,WAAA,EAAa,MAAM,CAAC,IAAA,CAAK;AAAA,KAC1B,CAAA;AAAA,EACH;AAAA,EAEQ,aAAA,GAA+B;AACrC,IAAA,OAAO,IAAI,OAAA,CAAc,CAAC,OAAA,EAAS,MAAA,KAAW;AAC5C,MAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,IAAA,CAAK,UAAU,CAAA;AACtC,MAAA,IAAI,MAAA,GAAS,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA;AAE3B,MAAA,MAAA,CAAO,EAAA,CAAG,WAAW,MAAM;AACzB,QAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,QAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AACjB,QAAA,OAAA,EAAQ;AAAA,MACV,CAAC,CAAA;AAED,MAAA,MAAA,CAAO,EAAA,CAAG,MAAA,EAAQ,CAAC,IAAA,KAAiB;AAClC,QAAA,MAAA,GAAS,MAAA,CAAO,MAAA,CAAO,CAAC,MAAA,EAAQ,IAAI,CAAC,CAAA;AACrC,QAAA,IAAI,GAAA;AACJ,QAAA,OAAA,CAAQ,GAAA,GAAM,MAAA,CAAO,OAAA,CAAQA,QAAO,OAAO,EAAA,EAAI;AAC7C,UAAA,MAAM,MAAM,MAAA,CAAO,QAAA,CAAS,GAAG,GAAG,CAAA,CAAE,SAAS,OAAO,CAAA;AACpD,UAAA,MAAA,GAAS,MAAA,CAAO,QAAA,CAAS,GAAA,GAAM,CAAC,CAAA;AAChC,UAAA,IAAI,GAAA,CAAI,MAAA,GAAS,CAAA,EAAG,IAAA,CAAK,eAAe,GAAG,CAAA;AAAA,QAC7C;AAAA,MACF,CAAC,CAAA;AAED,MAAA,MAAA,CAAO,EAAA,CAAG,SAAS,MAAM;AACvB,QAAA,IAAA,CAAK,SAAA,GAAY,KAAA;AACjB,QAAA,IAAI,CAAC,KAAK,QAAA,EAAU;AAClB,UAAA,MAAA,CAAO,KAAK,EAAE,OAAA,EAAS,IAAA,CAAK,OAAA,IAAW,+BAA+B,CAAA;AACtE,UAAA,KAAK,KAAK,gBAAA,EAAiB;AAAA,QAC7B;AAAA,MACF,CAAC,CAAA;AAED,MAAA,MAAA,CAAO,EAAA,CAAG,OAAA,EAAS,CAAC,GAAA,KAAe;AACjC,QAAA,IAAI,CAAC,IAAA,CAAK,SAAA,EAAW,MAAA,CAAO,IAAI,SAAS,CAAA,mBAAA,EAAsB,GAAA,CAAI,OAAO,CAAA,CAAE,CAAC,CAAA;AAAA,aACxE,MAAA,CAAO,KAAA,CAAM,EAAE,OAAA,EAAS,IAAA,CAAK,SAAS,KAAA,EAAO,GAAA,CAAI,OAAA,EAAQ,EAAG,cAAc,CAAA;AAAA,MACjF,CAAC,CAAA;AAAA,IACH,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,MAAc,gBAAA,GAAkC;AAC9C,IAAA,IAAI,KAAK,QAAA,EAAU;AACnB,IAAA,IAAA,CAAK,aAAA,EAAc;AACnB,IAAA,IAAI;AACF,MAAA,MAAM,MAAM,GAAK,CAAA;AACjB,MAAA,MAAM,KAAK,SAAA,EAAU;AACrB,MAAA,MAAM,KAAK,QAAA,EAAS;AACpB,MAAA,IAAA,CAAK,cAAA,EAAe;AACpB,MAAA,MAAA,CAAO,KAAK,EAAE,OAAA,EAAS,IAAA,CAAK,OAAA,IAAW,aAAa,CAAA;AAAA,IACtD,SAAS,CAAA,EAAY;AACnB,MAAA,MAAA,CAAO,KAAA,CAAM,EAAE,OAAA,EAAS,IAAA,CAAK,SAAS,KAAA,EAAO,CAAA,YAAa,KAAA,GAAQ,CAAA,CAAE,OAAA,GAAU,MAAA,CAAO,CAAC,CAAA,IAAK,kBAAkB,CAAA;AAAA,IAC/G;AAAA,EACF;AAAA,EAEA,MAAc,QAAA,GAA0B;AACtC,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,gBAAA,EAAkB,EAAE,OAAA,EAAS,KAAK,OAAA,EAAS,SAAA,EAAW,IAAA,CAAK,SAAA,EAAW,CAAA;AAAA,EAC3F;AAAA;AAAA,EAIQ,eAAe,GAAA,EAAmB;AACxC,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI;AAAE,MAAA,MAAA,GAAS,IAAA,CAAK,MAAM,GAAG,CAAA;AAAA,IAAc,CAAA,CAAA,MAAQ;AAAE,MAAA;AAAA,IAAQ;AAE7D,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,MAAM,CAAA,EAAG;AAAE,MAAA,IAAA,CAAK,gBAAgB,MAAM,CAAA;AAAG,MAAA;AAAA,IAAQ;AACrE,IAAA,IAAI,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA,EAAG;AAAE,MAAA,IAAA,CAAK,SAAS,MAAM,CAAA;AAAG,MAAA;AAAA,IAAQ;AAAA,EAC/D;AAAA,EAEQ,gBAAgB,QAAA,EAA8B;AACpD,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,SAAS,EAAE,CAAA;AACtC,IAAA,IAAI,CAAC,CAAA,EAAG;AACR,IAAA,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,QAAA,CAAS,EAAE,CAAA;AAC/B,IAAA,YAAA,CAAa,EAAE,KAAK,CAAA;AACpB,IAAA,IAAI,QAAA,CAAS,KAAA,EAAO,CAAA,CAAE,MAAA,CAAO,IAAI,QAAA,CAAS,CAAA,IAAA,EAAO,QAAA,CAAS,KAAA,CAAM,IAAI,CAAA,EAAA,EAAK,QAAA,CAAS,KAAA,CAAM,OAAO,EAAE,CAAC,CAAA;AAAA,SAC7F,CAAA,CAAE,OAAA,CAAQ,QAAA,CAAS,MAAM,CAAA;AAAA,EAChC;AAAA,EAEQ,SAAS,OAAA,EAA4B;AAC3C,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,QAAQ,MAAM,CAAA;AACpD,IAAA,IAAI,CAAC,QAAA,EAAU;AACf,IAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,MAAA,IAAI;AAAE,QAAA,CAAA,CAAE,OAAO,CAAA;AAAA,MAAG,SAAS,CAAA,EAAY;AACrC,QAAA,MAAA,CAAO,KAAA,CAAM,EAAE,MAAA,EAAQ,OAAA,CAAQ,QAAQ,KAAA,EAAO,CAAA,YAAa,KAAA,GAAQ,CAAA,CAAE,OAAA,GAAU,MAAA,CAAO,CAAC,CAAA,IAAK,eAAe,CAAA;AAAA,MAC7G;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAIQ,cAAA,GAAuB;AAC7B,IAAA,IAAA,CAAK,aAAA,EAAc;AACnB,IAAA,IAAA,CAAK,cAAA,GAAiB,YAAY,MAAM;AACtC,MAAA,IAAI,KAAK,SAAA,IAAa,IAAA,CAAK,UAAU,CAAC,IAAA,CAAK,OAAO,SAAA,EAAW;AAC3D,QAAA,IAAA,CAAK,MAAA,CAAO,qBAAqB,EAAE,OAAA,EAAS,IAAI,KAAA,EAAO,WAAA,EAAa,SAAA,EAAW,IAAA,EAAM,CAAA;AAAA,MACvF;AAAA,IACF,CAAA,EAAG,KAAK,WAAW,CAAA;AACnB,IAAA,IAAA,CAAK,eAAe,KAAA,EAAM;AAAA,EAC5B;AAAA,EAEQ,aAAA,GAAsB;AAC5B,IAAA,IAAI,KAAK,cAAA,EAAgB;AAAE,MAAA,aAAA,CAAc,KAAK,cAAc,CAAA;AAAG,MAAA,IAAA,CAAK,cAAA,GAAiB,MAAA;AAAA,IAAW;AAAA,EAClG;AAAA;AAAA,EAIQ,kBAAkB,OAAA,EAA4B;AACpD,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,OAAO,SAAA,EAAW;AAC3C,IAAA,MAAM,IAAA,GAAOC,UAAAA,CAAW,QAAA,EAAU,IAAA,CAAK,UAAU,CAAA,CAAE,MAAA,CAAO,IAAA,CAAK,SAAA,CAAU,OAAO,CAAC,CAAA,CAAE,OAAO,KAAK,CAAA;AAC/F,IAAA,IAAA,CAAK,MAAA,CAAO,MAAM,IAAA,CAAK,SAAA,CAAU,EAAE,OAAA,EAAS,IAAA,EAAM,CAAA,GAAI,IAAI,CAAA;AAAA,EAC5D;AAAA;AAAA,EAIQ,WAAW,CAAA,EAA+B;AAChD,IAAA,IAAI,OAAO,CAAA,KAAM,QAAA,IAAY,CAAA,KAAM,MAAM,OAAO,KAAA;AAChD,IAAA,MAAM,CAAA,GAAI,CAAA;AACV,IAAA,OAAO,CAAA,CAAE,SAAS,CAAA,KAAM,KAAA,IAAS,OAAO,EAAE,IAAI,CAAA,KAAM,QAAA,IAAY,EAAE,QAAA,IAAY,CAAA,CAAA;AAAA,EAChF;AAAA,EAEQ,UAAU,CAAA,EAA8B;AAC9C,IAAA,IAAI,OAAO,CAAA,KAAM,QAAA,IAAY,CAAA,KAAM,MAAM,OAAO,KAAA;AAChD,IAAA,MAAM,CAAA,GAAI,CAAA;AACV,IAAA,OAAO,EAAE,SAAS,CAAA,KAAM,SAAS,OAAO,CAAA,CAAE,QAAQ,CAAA,KAAM,QAAA;AAAA,EAC1D;AAAA;AAAA,EAIQ,SAAA,GAAkB;AACxB,IAAA,MAAM,GAAA,GAAM,IAAI,QAAA,CAAS,0BAA0B,CAAA;AACnD,IAAA,KAAA,MAAW,GAAG,CAAC,CAAA,IAAK,KAAK,OAAA,EAAS;AAAE,MAAA,YAAA,CAAa,EAAE,KAAK,CAAA;AAAG,MAAA,CAAA,CAAE,OAAO,GAAG,CAAA;AAAA,IAAG;AAC1E,IAAA,IAAA,CAAK,QAAQ,KAAA,EAAM;AAAA,EACrB;AAAA,EAEQ,WAAA,GAAoB;AAAE,IAAA,IAAI,IAAA,CAAK,QAAA,EAAU,MAAM,IAAI,SAAS,sBAAsB,CAAA;AAAA,EAAG;AAAA,EACrF,eAAA,GAAwB;AAAE,IAAA,IAAI,CAAC,KAAK,SAAA,IAAa,CAAC,KAAK,MAAA,EAAQ,MAAM,IAAI,QAAA,CAAS,eAAe,CAAA;AAAA,EAAG;AAC9G;;;ACvQA,IAAM,mBAAA,GAAsB,IAAA;AAC5B,IAAM,UAAA,GAAa,KAAA;AACnB,IAAM,YAAA,GAA6B,KAAA;AAInC,SAAS,aAAA,CAAc,YAAoB,QAAA,EAA0B;AACnE,EAAA,OAAO,CAAA,EAAG,UAAU,CAAA,EAAG,mBAAmB,GAAG,UAAU,CAAA,EAAG,mBAAmB,CAAA,EAAG,QAAQ,CAAA,CAAA;AAC1F;AAEA,SAAS,cACP,cAAA,EACsD;AACtD,EAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,KAAA,CAAM,mBAAmB,CAAA;AACtD,EAAA,IAAI,MAAM,MAAA,GAAS,CAAA,IAAK,KAAA,CAAM,CAAC,MAAM,UAAA,EAAY;AAC/C,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,MAAM,UAAA,GAAa,MAAM,CAAC,CAAA;AAC1B,EAAA,MAAM,WAAW,KAAA,CAAM,KAAA,CAAM,CAAC,CAAA,CAAE,KAAK,mBAAmB,CAAA;AACxD,EAAA,IAAI,CAAC,UAAA,IAAc,CAAC,QAAA,EAAU;AAC5B,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,OAAO,EAAE,YAAY,QAAA,EAAS;AAChC;AAWA,SAAS,mBACP,WAAA,EAC2B;AAC3B,EAAA,MAAM,UAAA,GAAa,YAAY,YAAY,CAAA;AAC3C,EAAA,IAAI,CAAC,UAAA,IAAc,OAAO,UAAA,KAAe,QAAA,EAAU;AACjD,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,MAAM,YAAA,GAAe,YAAY,UAAU,CAAA;AAC3C,EAAA,MAAM,cAAc,IAAI,GAAA;AAAA,IACtB,KAAA,CAAM,OAAA,CAAQ,YAAY,CAAA,GAAK,eAA4B;AAAC,GAC9D;AAEA,EAAA,MAAM,SAA2B,EAAC;AAClC,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,SAAS,CAAA,IAAK,MAAA,CAAO,OAAA;AAAA,IACrC;AAAA,GACF,EAAG;AACD,IAAA,MAAM,MAAA,GAAS,SAAA;AACf,IAAA,IAAI,CAAC,MAAA,IAAU,OAAO,MAAA,KAAW,QAAA,EAAU;AACzC,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,KAAA,GAAwB;AAAA,MAC5B,IAAA;AAAA,MACA,IAAA,EAAM,OAAO,IAAA,IAAQ,QAAA;AAAA,MACrB,WAAA,EAAa,OAAO,WAAA,IAAe,EAAA;AAAA,MACnC,QAAA,EAAU,WAAA,CAAY,GAAA,CAAI,IAAI,CAAA;AAAA,MAC9B,GAAI,OAAO,OAAA,KAAY,MAAA,GAAY,EAAE,OAAA,EAAS,MAAA,CAAO,OAAA,EAAQ,GAAI,EAAC;AAAA,MAClE,GAAI,OAAO,IAAA,KAAS,MAAA,GAAY,EAAE,IAAA,EAAM,MAAA,CAAO,IAAA,EAAK,GAAI;AAAC,KAC3D;AACA,IAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA,EACnB;AAEA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,mBAAA,CACP,YACA,OAAA,EACiB;AACjB,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,aAAA,CAAc,UAAA,EAAY,OAAA,CAAQ,IAAI,CAAA;AAAA,IAC5C,WAAA,EAAa,CAAA,KAAA,EAAQ,UAAU,CAAA,EAAA,EAAK,QAAQ,WAAW,CAAA,CAAA;AAAA,IACvD,UAAA,EAAY,kBAAA,CAAmB,OAAA,CAAQ,WAAW;AAAA,GACpD;AACF;AAUA,SAAS,qBAAqB,IAAA,EAAkC;AAC9D,EAAA,MAAM,MAAA,GAAS,aAAA,CAAc,IAAA,CAAK,IAAI,CAAA;AACtC,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,MAAM,IAAI,aAAA;AAAA,MACR,IAAA,CAAK,IAAA;AAAA,MACL;AAAA,KACF;AAAA,EACF;AACA,EAAA,OAAO;AAAA,IACL,YAAY,MAAA,CAAO,UAAA;AAAA,IACnB,UAAU,MAAA,CAAO,QAAA;AAAA,IACjB,WAAW,IAAA,CAAK;AAAA,GAClB;AACF;AAEA,SAAS,qBAAA,CACP,UAAA,EACA,QAAA,EACA,OAAA,EACA,OAAA,EACa;AACb,EAAA,OAAO,EAAE,UAAA,EAAY,IAAA,EAAM,QAAA,EAAU,SAAS,OAAA,EAAQ;AACxD;AAIA,SAAS,iBAAA,CACP,MACA,UAAA,EACoB;AACpB,EAAA,KAAA,MAAW,SAAS,UAAA,EAAY;AAC9B,IAAA,IAAI,KAAA,CAAM,QAAA,IAAY,EAAE,KAAA,CAAM,QAAQ,IAAA,CAAA,EAAO;AAC3C,MAAA,OAAO,CAAA,2BAAA,EAA8B,MAAM,IAAI,CAAA,CAAA;AAAA,IACjD;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAIO,IAAM,gBAAN,MAAoB;AAAA,EACR,aAAA;AAAA,EACA,SAAA,uBAAgB,GAAA,EAAwC;AAAA,EAEzE,YAAY,aAAA,EAAiC;AAC3C,IAAA,IAAA,CAAK,aAAA,GAAgB,aAAA;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,YAAY,QAAA,EAA0C;AAC1D,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,aAAA,CAAc,mBAAA,EAAoB;AACvD,IAAA,IAAI,eAAA,GAAkB,CAAA;AAEtB,IAAA,KAAA,MAAW,cAAc,OAAA,EAAS;AAChC,MAAA,IAAI;AACF,QAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,mBAAA,CAAoB,YAAY,QAAQ,CAAA;AACjE,QAAA,eAAA,IAAmB,KAAA;AAAA,MACrB,SAAS,KAAA,EAAgB;AACvB,QAAA,MAAM,MAAM,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACjE,QAAA,MAAA,CAAO,KAAA;AAAA,UACL,EAAE,MAAA,EAAQ,UAAA,EAAY,KAAA,EAAO,GAAA,EAAI;AAAA,UACjC;AAAA,SACF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,MAAA,CAAO,IAAA;AAAA,MACL,EAAE,eAAA,EAAiB,OAAA,EAAS,OAAA,CAAQ,MAAA,EAAO;AAAA,MAC3C;AAAA,KACF;AAEA,IAAA,OAAO,eAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,mBAAA,CACJ,UAAA,EACA,QAAA,EACiB;AACjB,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,mBAAA,CAAoB,UAAU,CAAA;AAE7D,IAAA,KAAA,MAAW,cAAc,WAAA,EAAa;AACpC,MAAA,MAAM,YAAA,GAAe,IAAA,CAAK,kBAAA,CAAmB,UAAA,EAAY,UAAU,CAAA;AACnE,MAAA,QAAA,CAAS,SAAS,YAAY,CAAA;AAAA,IAChC;AAEA,IAAA,MAAA,CAAO,IAAA;AAAA,MACL,EAAE,MAAA,EAAQ,UAAA,EAAY,KAAA,EAAO,YAAY,MAAA,EAAO;AAAA,MAChD;AAAA,KACF;AAEA,IAAA,OAAO,WAAA,CAAY,MAAA;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,oBACJ,UAAA,EACqC;AACrC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,UAAU,CAAA;AAC5C,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,aAAA,CAAc,gBAAgB,UAAU,CAAA;AACpE,IAAA,MAAM,cAAc,QAAA,CAAS,GAAA;AAAA,MAAI,CAAC,IAAA,KAChC,mBAAA,CAAoB,UAAA,EAAY,IAAI;AAAA,KACtC;AAEA,IAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,UAAA,EAAY,WAAW,CAAA;AAC1C,IAAA,OAAO,WAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,IAAA,EAAuC;AACvD,IAAA,MAAM,OAAA,GAAU,qBAAqB,IAAI,CAAA;AAGzC,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,QAAQ,UAAU,CAAA;AACzD,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,MAAM,GAAA,GAAM,YAAY,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,KAAK,IAAI,CAAA;AACxD,MAAA,IAAI,GAAA,EAAK;AACP,QAAA,MAAM,eAAA,GAAkB,iBAAA,CAAkB,IAAA,CAAK,SAAA,EAAW,IAAI,UAAU,CAAA;AACxE,QAAA,IAAI,eAAA,EAAiB;AACnB,UAAA,OAAO,sBAAsB,IAAA,CAAK,EAAA,EAAI,IAAA,CAAK,IAAA,EAAM,iBAAiB,IAAI,CAAA;AAAA,QACxE;AAAA,MACF;AAAA,IACF;AAGA,IAAA,IAAA,CAAK,aAAA,CAAc,iBAAA,CAAkB,OAAA,CAAQ,UAAU,CAAA;AACvD,IAAA,IAAA,CAAK,aAAA,CAAc,UAAA,CAAW,OAAA,CAAQ,UAAU,CAAA;AAEhD,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,aAAA,CAAc,SAAA,CAAU,QAAQ,UAAU,CAAA;AAC9D,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,OAAO,qBAAA;AAAA,QACL,IAAA,CAAK,EAAA;AAAA,QACL,IAAA,CAAK,IAAA;AAAA,QACL,CAAA,YAAA,EAAe,QAAQ,UAAU,CAAA,kBAAA,CAAA;AAAA,QACjC;AAAA,OACF;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,SAAS,MAAM,MAAA,CAAO,SAAS,OAAA,CAAQ,QAAA,EAAU,QAAQ,SAAS,CAAA;AACxE,MAAA,OAAO,qBAAA;AAAA,QACL,IAAA,CAAK,EAAA;AAAA,QACL,IAAA,CAAK,IAAA;AAAA,QACL,MAAA,CAAO,OAAA;AAAA,QACP,MAAA,CAAO;AAAA,OACT;AAAA,IACF,SAAS,KAAA,EAAgB;AACvB,MAAA,MAAM,MAAM,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACjE,MAAA,OAAO,sBAAsB,IAAA,CAAK,EAAA,EAAI,IAAA,CAAK,IAAA,EAAM,KAAK,IAAI,CAAA;AAAA,IAC5D;AAAA,EACF;AAAA;AAAA,EAGA,gBAAgB,UAAA,EAA2B;AACzC,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,IAAA,CAAK,SAAA,CAAU,OAAO,UAAU,CAAA;AAAA,IAClC,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,UAAU,KAAA,EAAM;AAAA,IACvB;AAAA,EACF;AAAA;AAAA,EAGA,UAAU,QAAA,EAA2B;AACnC,IAAA,OAAO,aAAA,CAAc,QAAQ,CAAA,KAAM,MAAA;AAAA,EACrC;AAAA;AAAA,EAGA,iBAAA,GAAgD;AAC9C,IAAA,MAAM,MAAyB,EAAC;AAChC,IAAA,KAAA,MAAW,IAAA,IAAQ,IAAA,CAAK,SAAA,CAAU,MAAA,EAAO,EAAG;AAC1C,MAAA,GAAA,CAAI,IAAA,CAAK,GAAG,IAAI,CAAA;AAAA,IAClB;AACA,IAAA,OAAO,GAAA;AAAA,EACT;AAAA;AAAA,EAIQ,kBAAA,CACN,aACA,UAAA,EACmB;AACnB,IAAA,OAAO;AAAA,MACL,UAAA;AAAA,MACA,QAAA,EAAU,YAAA;AAAA,MACV,gBAAA,EAAkB,CAAC,OAAA,EAAgC,KAAA,KAAmC;AAEpF,QAAA,OAAO,QAAQ,cAAA,KAAmB,QAAA;AAAA,MACpC,CAAA;AAAA,MACA,OAAA,EAAS,OAAO,IAAA,KAAkC;AAChD,QAAA,MAAM,IAAA,GAAkB;AAAA,UACtB,EAAA,EAAI,CAAA,IAAA,EAAO,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,SAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AAAA,UAC/D,MAAM,UAAA,CAAW,IAAA;AAAA,UACjB,SAAA,EAAW;AAAA,SACb;AACA,QAAA,OAAO,IAAA,CAAK,YAAY,IAAI,CAAA;AAAA,MAC9B;AAAA,KACF;AAAA,EACF;AACF","file":"index.js","sourcesContent":["/**\r\n * iTerm2Manager — macOS iTerm2 Python API bridge per PRD section 9.3.\r\n * Splits sessions into panes, sets profiles, sends commands.\r\n * Graceful fallback if iTerm2 is not available.\r\n */\r\n\r\nimport { execa } from \"execa\";\r\nimport type { ILayoutConfig, IPaneConfig, PaneLayout } from \"../types/team.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 IITerm2PaneInfo {\r\n readonly paneId: string;\r\n readonly sessionId: string;\r\n readonly agentName: string;\r\n readonly title: string;\r\n}\r\n\r\ninterface IRoleProfile {\r\n readonly backgroundColor: string;\r\n readonly badgeText: string;\r\n}\r\n\r\n// ── Role color profiles per agent role ──────────────────────────────────\r\n\r\nconst ROLE_PROFILES: Readonly<Record<string, IRoleProfile>> = {\r\n planning: { backgroundColor: \"#1a1a2e\", badgeText: \"Planner\" },\r\n coding: { backgroundColor: \"#162447\", badgeText: \"Coder\" },\r\n review: { backgroundColor: \"#1b2a1b\", badgeText: \"Reviewer\" },\r\n testing: { backgroundColor: \"#2a1b1b\", badgeText: \"Tester\" },\r\n bugfix: { backgroundColor: \"#2a2a1b\", badgeText: \"Debugger\" },\r\n documentation: { backgroundColor: \"#1b1b2a\", badgeText: \"Docs\" },\r\n};\r\n\r\nconst DEFAULT_PROFILE: IRoleProfile = {\r\n backgroundColor: \"#1e1e1e\",\r\n badgeText: \"Agent\",\r\n};\r\n\r\n// ── iTerm2 Manager ──────────────────────────────────────────────────────\r\n\r\nexport class ITerm2Manager {\r\n private readonly panes = new Map<string, IITerm2PaneInfo>();\r\n private disposed = false;\r\n\r\n /**\r\n * Check if currently running inside iTerm2 on macOS.\r\n */\r\n isAvailable(): boolean {\r\n if (process.platform !== \"darwin\") {\r\n logger.debug(\"iTerm2 manager is macOS-only\");\r\n return false;\r\n }\r\n\r\n const termProgram = process.env[\"TERM_PROGRAM\"];\r\n if (termProgram !== \"iTerm.app\") {\r\n logger.debug({ termProgram }, \"Not running inside iTerm2\");\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Check if the iTerm2 Python API is accessible.\r\n */\r\n async isPythonAPIAvailable(): Promise<boolean> {\r\n if (!this.isAvailable()) return false;\r\n\r\n try {\r\n const result = await execa(\"python3\", [\"-c\", \"import iterm2\"]);\r\n return result.exitCode === 0;\r\n } catch {\r\n logger.warn(\"iTerm2 Python API module (iterm2) not installed\");\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Create panes in the current iTerm2 window based on layout config.\r\n */\r\n async createPanes(layoutConfig: ILayoutConfig): Promise<void> {\r\n this.assertNotDisposed();\r\n\r\n if (!(await this.isPythonAPIAvailable())) {\r\n throw new AgentSpawnError(\r\n \"iterm2\",\r\n \"iTerm2 Python API is not available. Install with: pip3 install iterm2\",\r\n );\r\n }\r\n\r\n const script = this.buildCreatePanesScript(layoutConfig);\r\n\r\n try {\r\n await this.executePythonScript(script);\r\n logger.info(\r\n { paneCount: layoutConfig.panes.length },\r\n \"iTerm2 panes created\",\r\n );\r\n } catch (error: unknown) {\r\n const message = error instanceof Error ? error.message : String(error);\r\n throw new AgentSpawnError(\"iterm2\", `Failed to create iTerm2 panes: ${message}`);\r\n }\r\n }\r\n\r\n /**\r\n * Send a command to a specific pane via iTerm2 Python API.\r\n */\r\n async sendCommand(paneId: string, command: string): Promise<void> {\r\n this.assertNotDisposed();\r\n\r\n const info = this.panes.get(paneId);\r\n if (!info) {\r\n logger.warn({ paneId }, \"iTerm2 pane not found, cannot send command\");\r\n return;\r\n }\r\n\r\n const escapedCommand = command.replace(/\"/g, '\\\\\"').replace(/\\\\/g, \"\\\\\\\\\");\r\n const script = this.buildSendCommandScript(info.sessionId, escapedCommand);\r\n\r\n try {\r\n await this.executePythonScript(script);\r\n logger.debug({ paneId, command: command.slice(0, 80) }, \"Command sent to iTerm2 pane\");\r\n } catch (error: unknown) {\r\n const message = error instanceof Error ? error.message : String(error);\r\n logger.error({ paneId, error: message }, \"Failed to send command to iTerm2 pane\");\r\n }\r\n }\r\n\r\n /**\r\n * Set the profile (colors) for a pane based on agent role.\r\n */\r\n async setProfile(paneId: string, role: string): Promise<void> {\r\n this.assertNotDisposed();\r\n\r\n const info = this.panes.get(paneId);\r\n if (!info) return;\r\n\r\n const profile = ROLE_PROFILES[role] ?? DEFAULT_PROFILE;\r\n const script = this.buildSetProfileScript(info.sessionId, profile);\r\n\r\n try {\r\n await this.executePythonScript(script);\r\n logger.debug({ paneId, role }, \"iTerm2 pane profile set\");\r\n } catch {\r\n logger.debug({ paneId, role }, \"Failed to set iTerm2 profile (non-fatal)\");\r\n }\r\n }\r\n\r\n /**\r\n * Destroy all managed iTerm2 panes.\r\n */\r\n async destroy(): Promise<void> {\r\n if (this.disposed) return;\r\n this.disposed = true;\r\n\r\n for (const [paneId, info] of this.panes) {\r\n try {\r\n const script = this.buildCloseSessionScript(info.sessionId);\r\n await this.executePythonScript(script);\r\n } catch {\r\n // Pane may already be closed\r\n }\r\n getEventBus().emit(\"pane:closed\", { paneId });\r\n }\r\n\r\n this.panes.clear();\r\n logger.info(\"iTerm2 panes destroyed\");\r\n }\r\n\r\n /**\r\n * Get all tracked pane info.\r\n */\r\n getPanes(): ReadonlyMap<string, IITerm2PaneInfo> {\r\n return this.panes;\r\n }\r\n\r\n /**\r\n * Register a pane that was created externally.\r\n */\r\n registerPane(info: IITerm2PaneInfo): void {\r\n this.panes.set(info.paneId, info);\r\n getEventBus().emit(\"pane:created\", {\r\n paneId: info.paneId,\r\n agentName: info.agentName,\r\n });\r\n }\r\n\r\n // ── Python Script Builders ─────────────────────────────────────────\r\n\r\n private buildCreatePanesScript(layoutConfig: ILayoutConfig): string {\r\n const paneConfigs = layoutConfig.panes;\r\n const splitCommands = this.buildSplitCommands(paneConfigs, layoutConfig.layout);\r\n\r\n return `\r\nimport iterm2\r\nimport asyncio\r\n\r\nasync def main(connection):\r\n app = await iterm2.async_get_app(connection)\r\n window = app.current_terminal_window\r\n if window is None:\r\n return\r\n\r\n tab = window.current_tab\r\n root_session = tab.current_session\r\n sessions = [root_session]\r\n\r\n${splitCommands}\r\n\r\n # Output session IDs for tracking\r\n for s in sessions:\r\n print(s.session_id)\r\n\r\niterm2.run_until_complete(main)\r\n`.trim();\r\n }\r\n\r\n private buildSplitCommands(\r\n panes: readonly IPaneConfig[],\r\n layout: PaneLayout,\r\n ): string {\r\n const lines: string[] = [];\r\n\r\n for (let i = 1; i < panes.length; i++) {\r\n const vertical = this.shouldSplitVertically(i, panes.length, layout);\r\n const direction = vertical ? \"True\" : \"False\";\r\n lines.push(\r\n ` new_session = await sessions[${Math.floor(i / 2)}].async_split_pane(vertical=${direction})`,\r\n );\r\n lines.push(` sessions.append(new_session)`);\r\n\r\n const pane = panes[i];\r\n if (pane) {\r\n const escapedTitle = pane.title.replace(/'/g, \"\\\\'\");\r\n lines.push(` await new_session.async_set_name(\"${escapedTitle}\")`);\r\n }\r\n }\r\n\r\n return lines.join(\"\\n\");\r\n }\r\n\r\n private shouldSplitVertically(\r\n index: number,\r\n total: number,\r\n layout: PaneLayout,\r\n ): boolean {\r\n if (layout === \"vertical\") return true;\r\n if (layout === \"horizontal\") return false;\r\n // Auto and grid: alternate directions\r\n if (total <= 2) return false;\r\n return index % 2 === 1;\r\n }\r\n\r\n private buildSendCommandScript(sessionId: string, command: string): string {\r\n return `\r\nimport iterm2\r\n\r\nasync def main(connection):\r\n app = await iterm2.async_get_app(connection)\r\n session = app.get_session_by_id(\"${sessionId}\")\r\n if session:\r\n await session.async_send_text(\"${command}\\\\n\")\r\n\r\niterm2.run_until_complete(main)\r\n`.trim();\r\n }\r\n\r\n private buildSetProfileScript(sessionId: string, profile: IRoleProfile): string {\r\n return `\r\nimport iterm2\r\n\r\nasync def main(connection):\r\n app = await iterm2.async_get_app(connection)\r\n session = app.get_session_by_id(\"${sessionId}\")\r\n if session:\r\n change = iterm2.LocalWriteOnlyProfile()\r\n color = iterm2.Color.from_hex(\"${profile.backgroundColor}\")\r\n change.set_background_color(color)\r\n change.set_badge_text(\"${profile.badgeText}\")\r\n await session.async_set_profile_properties(change)\r\n\r\niterm2.run_until_complete(main)\r\n`.trim();\r\n }\r\n\r\n private buildCloseSessionScript(sessionId: string): string {\r\n return `\r\nimport iterm2\r\n\r\nasync def main(connection):\r\n app = await iterm2.async_get_app(connection)\r\n session = app.get_session_by_id(\"${sessionId}\")\r\n if session:\r\n await session.async_close()\r\n\r\niterm2.run_until_complete(main)\r\n`.trim();\r\n }\r\n\r\n // ── Execution ──────────────────────────────────────────────────────\r\n\r\n private async executePythonScript(script: string): Promise<string> {\r\n const result = await execa(\"python3\", [\"-c\", script], {\r\n timeout: 10_000,\r\n });\r\n return result.stdout;\r\n }\r\n\r\n private assertNotDisposed(): void {\r\n if (this.disposed) {\r\n throw new AgentSpawnError(\"iterm2\", \"ITerm2Manager has been disposed\");\r\n }\r\n }\r\n}\r\n","/**\r\n * IPCHub — Unix domain socket server for inter-agent communication.\r\n * JSON-RPC 2.0 protocol with HMAC authentication per PRD section 9.4 & 14.5.\r\n */\r\n\r\nimport { createServer, type Server, type Socket } from \"node:net\";\r\nimport { createHmac, randomBytes, timingSafeEqual } from \"node:crypto\";\r\nimport { chmod, unlink } from \"node:fs/promises\";\r\nimport type { IIPCMessage, IIPCResponse } from \"../types/team.js\";\r\nimport { getIPCSocketDir, getIPCSocketPath, ensureSecureDirectory } from \"../utils/pathResolver.js\";\r\nimport { getEventBus } from \"../core/event-bus.js\";\r\nimport { logger } from \"../utils/logger.js\";\r\nimport { IPCError } from \"../types/errors.js\";\r\n\r\n// ── Types ───────────────────────────────────────────────────────────────\r\n\r\ninterface IRegisteredClient {\r\n readonly agentId: string;\r\n readonly agentName: string;\r\n readonly socket: Socket;\r\n}\r\n\r\ntype MethodHandler = (\r\n clientId: string, params: Record<string, unknown>,\r\n id: number | undefined, socket: Socket,\r\n) => unknown;\r\n\r\n// ── Constants ───────────────────────────────────────────────────────────\r\n\r\nconst NEWLINE = 0x0a;\r\nconst SOCKET_PERMS = 0o700;\r\nconst MAX_MSG_SIZE = 1_048_576;\r\nconst RPC_PARSE_ERROR = -32700;\r\nconst RPC_INVALID_REQ = -32600;\r\nconst RPC_METHOD_NOT_FOUND = -32601;\r\nconst RPC_INTERNAL_ERROR = -32603;\r\nconst RPC_AUTH_ERROR = -32000;\r\n\r\n// ── IPCHub ──────────────────────────────────────────────────────────────\r\n\r\nexport class IPCHub {\r\n private readonly sessionId: string;\r\n private readonly hmacSecret: string;\r\n private readonly socketPath: string;\r\n private readonly clients = new Map<string, IRegisteredClient>();\r\n private readonly handlers = new Map<string, MethodHandler>();\r\n private server: Server | undefined;\r\n private disposed = false;\r\n\r\n constructor(sessionId: string) {\r\n this.sessionId = sessionId;\r\n this.hmacSecret = randomBytes(32).toString(\"hex\");\r\n this.socketPath = getIPCSocketPath(sessionId);\r\n this.registerDefaultHandlers();\r\n }\r\n\r\n getHmacSecret(): string { return this.hmacSecret; }\r\n getSocketPath(): string { return this.socketPath; }\r\n getClientCount(): number { return this.clients.size; }\r\n getConnectedAgentIds(): readonly string[] { return [...this.clients.keys()]; }\r\n\r\n /** Start the Unix domain socket server. */\r\n async start(): Promise<void> {\r\n this.assertAlive();\r\n ensureSecureDirectory(getIPCSocketDir());\r\n await this.removeStaleSocket();\r\n\r\n return new Promise<void>((resolve, reject) => {\r\n this.server = createServer((socket) => {\r\n this.handleConnection(socket);\r\n });\r\n this.server.on(\"error\", (err: Error) => {\r\n logger.error({ error: err.message }, \"IPC server error\");\r\n reject(new IPCError(`Server error: ${err.message}`));\r\n });\r\n this.server.listen(this.socketPath, () => {\r\n void (async () => {\r\n try {\r\n await chmod(this.socketPath, SOCKET_PERMS);\r\n } catch {\r\n /* non-fatal */\r\n }\r\n logger.info({ socketPath: this.socketPath }, \"IPC hub listening\");\r\n this.setupProcessCleanup();\r\n resolve();\r\n })();\r\n });\r\n });\r\n }\r\n\r\n /** Send a message to a specific registered client. */\r\n sendToClient(agentId: string, message: IIPCMessage): void {\r\n this.assertAlive();\r\n const client = this.clients.get(agentId);\r\n if (client) this.write(client.socket, message);\r\n }\r\n\r\n /** Broadcast a message to all connected clients. */\r\n broadcast(message: IIPCMessage, excludeId?: string): void {\r\n this.assertAlive();\r\n for (const [id, client] of this.clients) {\r\n if (id !== excludeId) this.write(client.socket, message);\r\n }\r\n }\r\n\r\n /** Register a custom method handler. */\r\n onMethod(method: string, handler: MethodHandler): void {\r\n this.handlers.set(method, handler);\r\n }\r\n\r\n /** Compute HMAC-SHA256 for a message. */\r\n computeHmac(message: unknown): string {\r\n return createHmac(\"sha256\", this.hmacSecret)\r\n .update(JSON.stringify(message)).digest(\"hex\");\r\n }\r\n\r\n /** Register a connected socket as a client (also called by agent.register). */\r\n registerClientSocket(agentId: string, agentName: string, socket: Socket): void {\r\n this.clients.set(agentId, { agentId, agentName, socket });\r\n }\r\n\r\n /** Gracefully shut down the hub and all connections. */\r\n async destroy(): Promise<void> {\r\n if (this.disposed) return;\r\n this.disposed = true;\r\n const msg: IIPCMessage = { jsonrpc: \"2.0\", method: \"hub.shutdown\", params: { reason: \"Hub shutting down\" } };\r\n for (const c of this.clients.values()) {\r\n try { this.write(c.socket, msg); c.socket.end(); } catch { /* already gone */ }\r\n }\r\n this.clients.clear();\r\n if (this.server) {\r\n const server = this.server;\r\n await new Promise<void>((resolve) => {\r\n server.close(() => {\r\n resolve();\r\n });\r\n });\r\n this.server = undefined;\r\n }\r\n await this.removeStaleSocket();\r\n logger.info({ sessionId: this.sessionId }, \"IPC hub destroyed\");\r\n }\r\n\r\n // ── Connection Handling ───────────────────────────────────────────\r\n\r\n private handleConnection(socket: Socket): void {\r\n let buffer = Buffer.alloc(0);\r\n let agentId: string | undefined;\r\n\r\n socket.on(\"data\", (data: Buffer) => {\r\n buffer = Buffer.concat([buffer, data]);\r\n if (buffer.length > MAX_MSG_SIZE) { socket.destroy(); return; }\r\n\r\n let idx: number;\r\n while ((idx = buffer.indexOf(NEWLINE)) !== -1) {\r\n const raw = buffer.subarray(0, idx).toString(\"utf-8\");\r\n buffer = buffer.subarray(idx + 1);\r\n if (raw.length === 0) continue;\r\n this.processRaw(raw, socket, agentId).then((id) => { if (id) agentId = id; })\r\n .catch((e: unknown) => {\r\n logger.error({ error: e instanceof Error ? e.message : String(e) }, \"IPC msg error\");\r\n });\r\n }\r\n });\r\n\r\n socket.on(\"close\", () => {\r\n if (agentId) { this.clients.delete(agentId); logger.info({ agentId }, \"Client disconnected\"); }\r\n });\r\n socket.on(\"error\", (err: Error) => {\r\n logger.error({ error: err.message, agentId }, \"Socket error\");\r\n });\r\n }\r\n\r\n private async processRaw(raw: string, socket: Socket, currentId: string | undefined): Promise<string | undefined> {\r\n let parsed: unknown;\r\n try { parsed = JSON.parse(raw) as unknown; } catch {\r\n this.sendError(socket, undefined, RPC_PARSE_ERROR, \"Parse error\"); return undefined;\r\n }\r\n\r\n if (!this.isAuthEnvelope(parsed)) {\r\n this.sendError(socket, undefined, RPC_INVALID_REQ, \"Invalid request format\"); return undefined;\r\n }\r\n const { message, hmac } = parsed;\r\n const requestId = this.getRequestId(message);\r\n\r\n if (!this.verifyHmac(message, hmac)) {\r\n this.sendError(socket, requestId, RPC_AUTH_ERROR, \"Authentication failed\"); return undefined;\r\n }\r\n if (!this.isIPCMessage(message)) {\r\n this.sendError(socket, requestId, RPC_INVALID_REQ, \"Invalid JSON-RPC 2.0\"); return undefined;\r\n }\r\n\r\n const handler = this.handlers.get(message.method);\r\n if (!handler) {\r\n this.sendError(socket, message.id, RPC_METHOD_NOT_FOUND, `Unknown: ${message.method}`); return undefined;\r\n }\r\n\r\n try {\r\n const aid = currentId ?? (message.params[\"agentId\"] as string | undefined) ?? \"unknown\";\r\n const result = await handler(aid, message.params, message.id, socket);\r\n if (message.id !== undefined) this.sendResult(socket, message.id, result);\r\n if (message.method === \"agent.register\") return message.params[\"agentId\"] as string | undefined;\r\n } catch (e: unknown) {\r\n this.sendError(socket, message.id, RPC_INTERNAL_ERROR, e instanceof Error ? e.message : String(e));\r\n }\r\n return undefined;\r\n }\r\n\r\n // ── Default Handlers ──────────────────────────────────────────────\r\n\r\n private registerDefaultHandlers(): void {\r\n this.handlers.set(\"agent.register\", (_cid, params, _id, socket) => {\r\n const agentId = params[\"agentId\"] as string | undefined;\r\n const agentName = params[\"agentName\"] as string | undefined;\r\n if (!agentId || !agentName) throw new IPCError(\"agent.register requires agentId and agentName\");\r\n this.registerClientSocket(agentId, agentName, socket);\r\n logger.info({ agentId, agentName }, \"Agent registered\");\r\n return { registered: true, agentId };\r\n });\r\n\r\n this.handlers.set(\"agent.streamChunk\", (_cid, params) => {\r\n getEventBus().emit(\"model:stream:chunk\", {\r\n model: (params[\"model\"] as string | undefined) ?? \"unknown\",\r\n content: (params[\"content\"] as string | undefined) ?? \"\",\r\n });\r\n return { received: true };\r\n });\r\n\r\n this.handlers.set(\"agent.taskUpdate\", (_cid, params) => {\r\n const taskId = params[\"taskId\"] as string | undefined;\r\n const status = params[\"status\"] as string | undefined;\r\n if (taskId && status) getEventBus().emit(\"task:updated\", { taskId, status });\r\n return { received: true };\r\n });\r\n\r\n this.handlers.set(\"agent.message\", (_cid, params) => {\r\n const to = params[\"to\"] as string | undefined;\r\n const content = params[\"content\"] as string | undefined;\r\n const from = params[\"from\"] as string | undefined;\r\n if (from && to && content) {\r\n getEventBus().emit(\"agent:message\", { from, to, content });\r\n const target = this.clients.get(to);\r\n if (target) {\r\n this.write(target.socket, { jsonrpc: \"2.0\", method: \"agent.message\", params: { from, content } });\r\n }\r\n }\r\n return { delivered: this.clients.has(to ?? \"\") };\r\n });\r\n\r\n this.handlers.set(\"hub.taskAssign\", (_cid, params) => {\r\n const agentId = params[\"agentId\"] as string | undefined;\r\n const taskId = params[\"taskId\"] as string | undefined;\r\n if (agentId && taskId) {\r\n const target = this.clients.get(agentId);\r\n if (target) this.write(target.socket, { jsonrpc: \"2.0\", method: \"hub.taskAssign\", params: { taskId, ...params } });\r\n }\r\n return { assigned: this.clients.has(agentId ?? \"\") };\r\n });\r\n\r\n this.handlers.set(\"hub.shutdown\", (_cid, params) => {\r\n const agentId = params[\"agentId\"] as string | undefined;\r\n if (agentId) {\r\n const target = this.clients.get(agentId);\r\n if (target) {\r\n this.write(target.socket, {\r\n jsonrpc: \"2.0\", method: \"hub.shutdown\",\r\n params: { reason: (params[\"reason\"] as string | undefined) ?? \"Shutdown requested\" },\r\n });\r\n }\r\n }\r\n return { notified: this.clients.has(agentId ?? \"\") };\r\n });\r\n }\r\n\r\n // ── HMAC ──────────────────────────────────────────────────────────\r\n\r\n private verifyHmac(message: unknown, hmac: string): boolean {\r\n const expected = this.computeHmac(message);\r\n if (expected.length !== hmac.length) return false;\r\n return timingSafeEqual(Buffer.from(expected, \"hex\"), Buffer.from(hmac, \"hex\"));\r\n }\r\n\r\n private isAuthEnvelope(v: unknown): v is { message: unknown; hmac: string } {\r\n if (typeof v !== \"object\" || v === null) return false;\r\n const o = v as Record<string, unknown>;\r\n return typeof o[\"hmac\"] === \"string\" && typeof o[\"message\"] === \"object\" && o[\"message\"] !== null;\r\n }\r\n\r\n private isIPCMessage(v: unknown): v is IIPCMessage {\r\n if (typeof v !== \"object\" || v === null) return false;\r\n const o = v as Record<string, unknown>;\r\n return o[\"jsonrpc\"] === \"2.0\"\r\n && typeof o[\"method\"] === \"string\"\r\n && typeof o[\"params\"] === \"object\"\r\n && o[\"params\"] !== null;\r\n }\r\n\r\n private getRequestId(v: unknown): number | undefined {\r\n if (typeof v !== \"object\" || v === null) return undefined;\r\n const o = v as Record<string, unknown>;\r\n return typeof o[\"id\"] === \"number\" ? o[\"id\"] : undefined;\r\n }\r\n\r\n // ── I/O ───────────────────────────────────────────────────────────\r\n\r\n private write(socket: Socket, msg: IIPCMessage | IIPCResponse): void {\r\n if (!socket.destroyed) socket.write(JSON.stringify(msg) + \"\\n\");\r\n }\r\n\r\n private sendResult(socket: Socket, id: number, result: unknown): void {\r\n this.write(socket, { jsonrpc: \"2.0\", result, id } as IIPCResponse);\r\n }\r\n\r\n private sendError(socket: Socket, id: number | undefined, code: number, message: string): void {\r\n this.write(socket, { jsonrpc: \"2.0\", error: { code, message }, id: id ?? 0 } as IIPCResponse);\r\n }\r\n\r\n // ── Lifecycle ─────────────────────────────────────────────────────\r\n\r\n private async removeStaleSocket(): Promise<void> {\r\n try { await unlink(this.socketPath); } catch { /* may not exist */ }\r\n }\r\n\r\n private setupProcessCleanup(): void {\r\n const cleanup = (): void => { this.destroy().catch(() => {}); };\r\n process.once(\"exit\", cleanup);\r\n process.once(\"SIGINT\", cleanup);\r\n process.once(\"SIGTERM\", cleanup);\r\n }\r\n\r\n private assertAlive(): void {\r\n if (this.disposed) throw new IPCError(\"IPCHub has been disposed\");\r\n }\r\n}\r\n","/**\r\n * PaneProcess — IPC client connecting to the IPCHub from an agent process.\r\n * JSON-RPC 2.0 with HMAC auth, reconnection, and heartbeat per PRD 9.4 & 20.2.\r\n */\r\n\r\nimport { connect, type Socket } from \"node:net\";\r\nimport { createHmac } from \"node:crypto\";\r\nimport type { IIPCMessage, IIPCResponse, IPCMethod } from \"../types/team.js\";\r\nimport { logger } from \"../utils/logger.js\";\r\nimport { IPCError } from \"../types/errors.js\";\r\nimport { withRetry, sleep } from \"../utils/retry.js\";\r\n\r\n// ── Types ───────────────────────────────────────────────────────────────\r\n\r\ninterface IPaneProcessOptions {\r\n readonly agentId: string;\r\n readonly agentName: string;\r\n readonly socketPath: string;\r\n readonly hmacSecret: string;\r\n readonly heartbeatIntervalMs?: number;\r\n readonly reconnectMaxRetries?: number;\r\n}\r\n\r\ntype MessageHandler = (message: IIPCMessage) => void;\r\ntype PendingRequest = {\r\n readonly resolve: (result: unknown) => void;\r\n readonly reject: (error: Error) => void;\r\n readonly timer: ReturnType<typeof setTimeout>;\r\n};\r\n\r\n// ── Constants ───────────────────────────────────────────────────────────\r\n\r\nconst DEFAULT_HEARTBEAT_MS = 15_000;\r\nconst DEFAULT_RECONNECT_RETRIES = 5;\r\nconst REQUEST_TIMEOUT_MS = 30_000;\r\nconst NEWLINE = 0x0a;\r\n\r\n// ── PaneProcess ─────────────────────────────────────────────────────────\r\n\r\nexport class PaneProcess {\r\n private static readonly resolvedPromise = Promise.resolve();\r\n\r\n private readonly agentId: string;\r\n private readonly agentName: string;\r\n private readonly socketPath: string;\r\n private readonly hmacSecret: string;\r\n private readonly heartbeatMs: number;\r\n private readonly maxRetries: number;\r\n private readonly msgHandlers = new Map<string, Set<MessageHandler>>();\r\n private readonly pending = new Map<number, PendingRequest>();\r\n\r\n private socket: Socket | undefined;\r\n private heartbeatTimer: ReturnType<typeof setInterval> | undefined;\r\n private nextId = 1;\r\n private connected = false;\r\n private disposed = false;\r\n\r\n constructor(options: IPaneProcessOptions) {\r\n this.agentId = options.agentId;\r\n this.agentName = options.agentName;\r\n this.socketPath = options.socketPath;\r\n this.hmacSecret = options.hmacSecret;\r\n this.heartbeatMs = options.heartbeatIntervalMs ?? DEFAULT_HEARTBEAT_MS;\r\n this.maxRetries = options.reconnectMaxRetries ?? DEFAULT_RECONNECT_RETRIES;\r\n }\r\n\r\n /** Connect to the IPC hub and register this agent. */\r\n async connect(): Promise<void> {\r\n this.assertAlive();\r\n await this.establish();\r\n await this.register();\r\n this.startHeartbeat();\r\n logger.info({ agentId: this.agentId }, \"PaneProcess connected\");\r\n }\r\n\r\n /** Send a JSON-RPC 2.0 request and wait for response. */\r\n async request(method: IPCMethod, params: Record<string, unknown>): Promise<unknown> {\r\n this.assertAlive();\r\n this.assertConnected();\r\n const id = this.nextId++;\r\n const message: IIPCMessage = { jsonrpc: \"2.0\", method, params: { ...params, agentId: this.agentId }, id };\r\n\r\n return new Promise<unknown>((resolve, reject) => {\r\n const timer = setTimeout(() => {\r\n this.pending.delete(id);\r\n reject(new IPCError(`Request timeout: ${method}`));\r\n }, REQUEST_TIMEOUT_MS);\r\n this.pending.set(id, { resolve, reject, timer });\r\n this.sendAuthenticated(message);\r\n });\r\n }\r\n\r\n /** Send a notification (no response expected). */\r\n notify(method: IPCMethod, params: Record<string, unknown>): void {\r\n this.assertAlive();\r\n this.assertConnected();\r\n this.sendAuthenticated({ jsonrpc: \"2.0\", method, params: { ...params, agentId: this.agentId } });\r\n }\r\n\r\n /** Convenience: send a stream chunk. */\r\n sendStreamChunk(content: string, model: string, taskId?: string): void {\r\n this.notify(\"agent.streamChunk\", { content, model, taskId });\r\n }\r\n\r\n /** Convenience: send a task status update. */\r\n sendTaskUpdate(taskId: string, status: string): void {\r\n this.notify(\"agent.taskUpdate\", { taskId, status });\r\n }\r\n\r\n /** Convenience: send a message to another agent via the hub. */\r\n async sendMessage(to: string, content: string): Promise<unknown> {\r\n return this.request(\"agent.message\", { from: this.agentId, to, content });\r\n }\r\n\r\n /** Register a handler for incoming messages of a specific method. */\r\n onMessage(method: string, handler: MessageHandler): () => void {\r\n const set = this.msgHandlers.get(method) ?? new Set();\r\n set.add(handler);\r\n this.msgHandlers.set(method, set);\r\n return () => { set.delete(handler); if (set.size === 0) this.msgHandlers.delete(method); };\r\n }\r\n\r\n isConnected(): boolean { return this.connected && !this.disposed; }\r\n\r\n /** Gracefully disconnect from the hub. */\r\n disconnect(): Promise<void> {\r\n if (this.disposed) {\r\n return PaneProcess.resolvedPromise;\r\n }\r\n this.disposed = true;\r\n this.stopHeartbeat();\r\n this.rejectAll();\r\n if (this.socket) { this.socket.end(); this.socket = undefined; }\r\n this.connected = false;\r\n logger.info({ agentId: this.agentId }, \"PaneProcess disconnected\");\r\n return PaneProcess.resolvedPromise;\r\n }\r\n\r\n // ── Connection ────────────────────────────────────────────────────\r\n\r\n private async establish(): Promise<void> {\r\n await withRetry(() => this.connectSocket(), {\r\n maxRetries: this.maxRetries,\r\n baseDelayMs: 500,\r\n maxDelayMs: 10_000,\r\n shouldRetry: () => !this.disposed,\r\n });\r\n }\r\n\r\n private connectSocket(): Promise<void> {\r\n return new Promise<void>((resolve, reject) => {\r\n const socket = connect(this.socketPath);\r\n let buffer = Buffer.alloc(0);\r\n\r\n socket.on(\"connect\", () => {\r\n this.socket = socket;\r\n this.connected = true;\r\n resolve();\r\n });\r\n\r\n socket.on(\"data\", (data: Buffer) => {\r\n buffer = Buffer.concat([buffer, data]);\r\n let idx: number;\r\n while ((idx = buffer.indexOf(NEWLINE)) !== -1) {\r\n const raw = buffer.subarray(0, idx).toString(\"utf-8\");\r\n buffer = buffer.subarray(idx + 1);\r\n if (raw.length > 0) this.handleIncoming(raw);\r\n }\r\n });\r\n\r\n socket.on(\"close\", () => {\r\n this.connected = false;\r\n if (!this.disposed) {\r\n logger.warn({ agentId: this.agentId }, \"Connection lost, reconnecting\");\r\n void this.attemptReconnect();\r\n }\r\n });\r\n\r\n socket.on(\"error\", (err: Error) => {\r\n if (!this.connected) reject(new IPCError(`Connection failed: ${err.message}`));\r\n else logger.error({ agentId: this.agentId, error: err.message }, \"Socket error\");\r\n });\r\n });\r\n }\r\n\r\n private async attemptReconnect(): Promise<void> {\r\n if (this.disposed) return;\r\n this.stopHeartbeat();\r\n try {\r\n await sleep(1_000);\r\n await this.establish();\r\n await this.register();\r\n this.startHeartbeat();\r\n logger.info({ agentId: this.agentId }, \"Reconnected\");\r\n } catch (e: unknown) {\r\n logger.error({ agentId: this.agentId, error: e instanceof Error ? e.message : String(e) }, \"Reconnect failed\");\r\n }\r\n }\r\n\r\n private async register(): Promise<void> {\r\n await this.request(\"agent.register\", { agentId: this.agentId, agentName: this.agentName });\r\n }\r\n\r\n // ── Message Processing ────────────────────────────────────────────\r\n\r\n private handleIncoming(raw: string): void {\r\n let parsed: unknown;\r\n try { parsed = JSON.parse(raw) as unknown; } catch { return; }\r\n\r\n if (this.isResponse(parsed)) { this.resolveResponse(parsed); return; }\r\n if (this.isMessage(parsed)) { this.dispatch(parsed); return; }\r\n }\r\n\r\n private resolveResponse(response: IIPCResponse): void {\r\n const p = this.pending.get(response.id);\r\n if (!p) return;\r\n this.pending.delete(response.id);\r\n clearTimeout(p.timer);\r\n if (response.error) p.reject(new IPCError(`RPC ${response.error.code}: ${response.error.message}`));\r\n else p.resolve(response.result);\r\n }\r\n\r\n private dispatch(message: IIPCMessage): void {\r\n const handlers = this.msgHandlers.get(message.method);\r\n if (!handlers) return;\r\n for (const h of handlers) {\r\n try { h(message); } catch (e: unknown) {\r\n logger.error({ method: message.method, error: e instanceof Error ? e.message : String(e) }, \"Handler error\");\r\n }\r\n }\r\n }\r\n\r\n // ── Heartbeat ─────────────────────────────────────────────────────\r\n\r\n private startHeartbeat(): void {\r\n this.stopHeartbeat();\r\n this.heartbeatTimer = setInterval(() => {\r\n if (this.connected && this.socket && !this.socket.destroyed) {\r\n this.notify(\"agent.streamChunk\", { content: \"\", model: \"heartbeat\", heartbeat: true });\r\n }\r\n }, this.heartbeatMs);\r\n this.heartbeatTimer.unref();\r\n }\r\n\r\n private stopHeartbeat(): void {\r\n if (this.heartbeatTimer) { clearInterval(this.heartbeatTimer); this.heartbeatTimer = undefined; }\r\n }\r\n\r\n // ── HMAC ──────────────────────────────────────────────────────────\r\n\r\n private sendAuthenticated(message: IIPCMessage): void {\r\n if (!this.socket || this.socket.destroyed) return;\r\n const hmac = createHmac(\"sha256\", this.hmacSecret).update(JSON.stringify(message)).digest(\"hex\");\r\n this.socket.write(JSON.stringify({ message, hmac }) + \"\\n\");\r\n }\r\n\r\n // ── Type Guards ───────────────────────────────────────────────────\r\n\r\n private isResponse(v: unknown): v is IIPCResponse {\r\n if (typeof v !== \"object\" || v === null) return false;\r\n const o = v as Record<string, unknown>;\r\n return o[\"jsonrpc\"] === \"2.0\" && typeof o[\"id\"] === \"number\" && !(\"method\" in o);\r\n }\r\n\r\n private isMessage(v: unknown): v is IIPCMessage {\r\n if (typeof v !== \"object\" || v === null) return false;\r\n const o = v as Record<string, unknown>;\r\n return o[\"jsonrpc\"] === \"2.0\" && typeof o[\"method\"] === \"string\";\r\n }\r\n\r\n // ── Helpers ───────────────────────────────────────────────────────\r\n\r\n private rejectAll(): void {\r\n const err = new IPCError(\"PaneProcess disconnected\");\r\n for (const [, p] of this.pending) { clearTimeout(p.timer); p.reject(err); }\r\n this.pending.clear();\r\n }\r\n\r\n private assertAlive(): void { if (this.disposed) throw new IPCError(\"PaneProcess disposed\"); }\r\n private assertConnected(): void { if (!this.connected || !this.socket) throw new IPCError(\"Not connected\"); }\r\n}\r\n","/**\r\n * MCP tool bridge per PRD section 11.3\r\n * Converts MCP tool schemas to AemeathCLI IToolDefinition format and back.\r\n * Registers MCP tools into the unified tool registry with lazy loading.\r\n * Tool namespacing: mcp__{serverName}__{toolName}\r\n */\r\n\r\nimport { logger } from \"../utils/logger.js\";\r\nimport { ToolCallError } from \"../types/errors.js\";\r\nimport type { IToolDefinition, IToolParameter, IToolCall, IToolResult } from \"../types/message.js\";\r\nimport type { IToolRegistration, IToolRegistry, ToolCategory } from \"../types/tool.js\";\r\nimport type { IToolExecutionContext } from \"../types/tool.js\";\r\nimport type { MCPServerManager } from \"./server-manager.js\";\r\nimport type { IMCPToolSchema } from \"./client.js\";\r\n\r\n// ── Constants ───────────────────────────────────────────────────────────\r\n\r\nconst NAMESPACE_SEPARATOR = \"__\";\r\nconst MCP_PREFIX = \"mcp\";\r\nconst MCP_CATEGORY: ToolCategory = \"mcp\";\r\n\r\n// ── Namespacing ─────────────────────────────────────────────────────────\r\n\r\nfunction buildToolName(serverName: string, toolName: string): string {\r\n return `${MCP_PREFIX}${NAMESPACE_SEPARATOR}${serverName}${NAMESPACE_SEPARATOR}${toolName}`;\r\n}\r\n\r\nfunction parseToolName(\r\n namespacedName: string,\r\n): { serverName: string; toolName: string } | undefined {\r\n const parts = namespacedName.split(NAMESPACE_SEPARATOR);\r\n if (parts.length < 3 || parts[0] !== MCP_PREFIX) {\r\n return undefined;\r\n }\r\n const serverName = parts[1];\r\n const toolName = parts.slice(2).join(NAMESPACE_SEPARATOR);\r\n if (!serverName || !toolName) {\r\n return undefined;\r\n }\r\n return { serverName, toolName };\r\n}\r\n\r\n// ── Schema Conversion ───────────────────────────────────────────────────\r\n\r\ninterface IJsonSchemaProperty {\r\n readonly type?: string;\r\n readonly description?: string;\r\n readonly default?: unknown;\r\n readonly enum?: readonly string[];\r\n}\r\n\r\nfunction convertInputSchema(\r\n inputSchema: Readonly<Record<string, unknown>>,\r\n): readonly IToolParameter[] {\r\n const properties = inputSchema[\"properties\"];\r\n if (!properties || typeof properties !== \"object\") {\r\n return [];\r\n }\r\n\r\n const requiredList = inputSchema[\"required\"];\r\n const requiredSet = new Set<string>(\r\n Array.isArray(requiredList) ? (requiredList as string[]) : [],\r\n );\r\n\r\n const params: IToolParameter[] = [];\r\n for (const [name, rawSchema] of Object.entries(\r\n properties as Record<string, unknown>,\r\n )) {\r\n const schema = rawSchema as IJsonSchemaProperty | undefined;\r\n if (!schema || typeof schema !== \"object\") {\r\n continue;\r\n }\r\n\r\n const param: IToolParameter = {\r\n name,\r\n type: schema.type ?? \"string\",\r\n description: schema.description ?? \"\",\r\n required: requiredSet.has(name),\r\n ...(schema.default !== undefined ? { default: schema.default } : {}),\r\n ...(schema.enum !== undefined ? { enum: schema.enum } : {}),\r\n };\r\n params.push(param);\r\n }\r\n\r\n return params;\r\n}\r\n\r\nfunction mcpToolToDefinition(\r\n serverName: string,\r\n mcpTool: IMCPToolSchema,\r\n): IToolDefinition {\r\n return {\r\n name: buildToolName(serverName, mcpTool.name),\r\n description: `[MCP:${serverName}] ${mcpTool.description}`,\r\n parameters: convertInputSchema(mcpTool.inputSchema),\r\n };\r\n}\r\n\r\n// ── Tool Call Conversion ────────────────────────────────────────────────\r\n\r\ninterface IMCPCallRequest {\r\n readonly serverName: string;\r\n readonly toolName: string;\r\n readonly arguments: Record<string, unknown>;\r\n}\r\n\r\nfunction toolCallToMCPRequest(call: IToolCall): IMCPCallRequest {\r\n const parsed = parseToolName(call.name);\r\n if (!parsed) {\r\n throw new ToolCallError(\r\n call.name,\r\n \"Invalid MCP tool name format — expected mcp__{server}__{tool}\",\r\n );\r\n }\r\n return {\r\n serverName: parsed.serverName,\r\n toolName: parsed.toolName,\r\n arguments: call.arguments,\r\n };\r\n}\r\n\r\nfunction mcpResultToToolResult(\r\n toolCallId: string,\r\n toolName: string,\r\n content: string,\r\n isError: boolean,\r\n): IToolResult {\r\n return { toolCallId, name: toolName, content, isError };\r\n}\r\n\r\n// ── Argument Validation (PRD 11.4) ──────────────────────────────────────\r\n\r\nfunction validateArguments(\r\n args: Record<string, unknown>,\r\n parameters: readonly IToolParameter[],\r\n): string | undefined {\r\n for (const param of parameters) {\r\n if (param.required && !(param.name in args)) {\r\n return `Missing required argument: ${param.name}`;\r\n }\r\n }\r\n return undefined;\r\n}\r\n\r\n// ── MCPToolBridge ───────────────────────────────────────────────────────\r\n\r\nexport class MCPToolBridge {\r\n private readonly serverManager: MCPServerManager;\r\n private readonly toolCache = new Map<string, readonly IToolDefinition[]>();\r\n\r\n constructor(serverManager: MCPServerManager) {\r\n this.serverManager = serverManager;\r\n }\r\n\r\n /**\r\n * Discover tools from all connected MCP servers and register them.\r\n * Uses lazy loading: definitions are fetched and cached on first request.\r\n */\r\n async registerAll(registry: IToolRegistry): Promise<number> {\r\n const servers = this.serverManager.getConnectedServers();\r\n let totalRegistered = 0;\r\n\r\n for (const serverName of servers) {\r\n try {\r\n const count = await this.registerServerTools(serverName, registry);\r\n totalRegistered += count;\r\n } catch (error: unknown) {\r\n const msg = error instanceof Error ? error.message : String(error);\r\n logger.error(\r\n { server: serverName, error: msg },\r\n \"Failed to register MCP tools\",\r\n );\r\n }\r\n }\r\n\r\n logger.info(\r\n { totalRegistered, servers: servers.length },\r\n \"MCP tool registration complete\",\r\n );\r\n\r\n return totalRegistered;\r\n }\r\n\r\n /**\r\n * Register tools from a single MCP server.\r\n * Fetches tool schemas and caches definitions.\r\n */\r\n async registerServerTools(\r\n serverName: string,\r\n registry: IToolRegistry,\r\n ): Promise<number> {\r\n const definitions = await this.loadToolDefinitions(serverName);\r\n\r\n for (const definition of definitions) {\r\n const registration = this.createRegistration(serverName, definition);\r\n registry.register(registration);\r\n }\r\n\r\n logger.info(\r\n { server: serverName, tools: definitions.length },\r\n \"Registered MCP server tools\",\r\n );\r\n\r\n return definitions.length;\r\n }\r\n\r\n /**\r\n * Lazy-load tool definitions for a server.\r\n * Returns cached definitions if already loaded.\r\n */\r\n async loadToolDefinitions(\r\n serverName: string,\r\n ): Promise<readonly IToolDefinition[]> {\r\n const cached = this.toolCache.get(serverName);\r\n if (cached) {\r\n return cached;\r\n }\r\n\r\n const mcpTools = await this.serverManager.listServerTools(serverName);\r\n const definitions = mcpTools.map((tool) =>\r\n mcpToolToDefinition(serverName, tool),\r\n );\r\n\r\n this.toolCache.set(serverName, definitions);\r\n return definitions;\r\n }\r\n\r\n /**\r\n * Execute an MCP tool call: validate, convert, call, return result.\r\n */\r\n async executeTool(call: IToolCall): Promise<IToolResult> {\r\n const request = toolCallToMCPRequest(call);\r\n\r\n // Validate arguments against cached schema\r\n const definitions = this.toolCache.get(request.serverName);\r\n if (definitions) {\r\n const def = definitions.find((d) => d.name === call.name);\r\n if (def) {\r\n const validationError = validateArguments(call.arguments, def.parameters);\r\n if (validationError) {\r\n return mcpResultToToolResult(call.id, call.name, validationError, true);\r\n }\r\n }\r\n }\r\n\r\n // Rate-limit check\r\n this.serverManager.checkRateLimitFor(request.serverName);\r\n this.serverManager.recordCall(request.serverName);\r\n\r\n const client = this.serverManager.getClient(request.serverName);\r\n if (!client) {\r\n return mcpResultToToolResult(\r\n call.id,\r\n call.name,\r\n `MCP server \"${request.serverName}\" is not connected`,\r\n true,\r\n );\r\n }\r\n\r\n try {\r\n const result = await client.callTool(request.toolName, request.arguments);\r\n return mcpResultToToolResult(\r\n call.id,\r\n call.name,\r\n result.content,\r\n result.isError,\r\n );\r\n } catch (error: unknown) {\r\n const msg = error instanceof Error ? error.message : String(error);\r\n return mcpResultToToolResult(call.id, call.name, msg, true);\r\n }\r\n }\r\n\r\n /** Invalidate cached tool definitions for a server (e.g. after config reload). */\r\n invalidateCache(serverName?: string): void {\r\n if (serverName) {\r\n this.toolCache.delete(serverName);\r\n } else {\r\n this.toolCache.clear();\r\n }\r\n }\r\n\r\n /** Check whether a tool name is an MCP-namespaced tool. */\r\n isMCPTool(toolName: string): boolean {\r\n return parseToolName(toolName) !== undefined;\r\n }\r\n\r\n /** Get all cached tool definitions across all servers. */\r\n getAllDefinitions(): readonly IToolDefinition[] {\r\n const all: IToolDefinition[] = [];\r\n for (const defs of this.toolCache.values()) {\r\n all.push(...defs);\r\n }\r\n return all;\r\n }\r\n\r\n // ── Private ─────────────────────────────────────────────────────────\r\n\r\n private createRegistration(\r\n _serverName: string,\r\n definition: IToolDefinition,\r\n ): IToolRegistration {\r\n return {\r\n definition,\r\n category: MCP_CATEGORY,\r\n requiresApproval: (context: IToolExecutionContext, _args: Record<string, unknown>) => {\r\n // MCP tools always require approval in strict mode\r\n return context.permissionMode === \"strict\";\r\n },\r\n execute: async (args: Record<string, unknown>) => {\r\n const call: IToolCall = {\r\n id: `mcp-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,\r\n name: definition.name,\r\n arguments: args,\r\n };\r\n return this.executeTool(call);\r\n },\r\n };\r\n }\r\n}\r\n"]}
1
+ {"version":3,"sources":["../src/panes/iterm2-manager.ts","../src/panes/ipc-hub.ts","../src/panes/pane-process.ts","../src/mcp/tool-bridge.ts"],"names":["NEWLINE","createHmac"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * iTerm2Manager — macOS iTerm2 Python API bridge per PRD section 9.3.\n * Splits sessions into panes, sets profiles, sends commands.\n * Graceful fallback if iTerm2 is not available.\n */\n\nimport { execa } from \"execa\";\nimport type { ILayoutConfig, IPaneConfig, PaneLayout } from \"../types/team.js\";\nimport { getEventBus } from \"../core/event-bus.js\";\nimport { logger } from \"../utils/logger.js\";\nimport { AgentSpawnError } from \"../types/errors.js\";\n\n// ── Types ───────────────────────────────────────────────────────────────\n\nexport interface IITerm2PaneInfo {\n readonly paneId: string;\n readonly sessionId: string;\n readonly agentName: string;\n readonly title: string;\n}\n\ninterface IRoleProfile {\n readonly backgroundColor: string;\n readonly badgeText: string;\n}\n\n// ── Role color profiles per agent role ──────────────────────────────────\n\nconst ROLE_PROFILES: Readonly<Record<string, IRoleProfile>> = {\n planning: { backgroundColor: \"#1a1a2e\", badgeText: \"Planner\" },\n coding: { backgroundColor: \"#162447\", badgeText: \"Coder\" },\n review: { backgroundColor: \"#1b2a1b\", badgeText: \"Reviewer\" },\n testing: { backgroundColor: \"#2a1b1b\", badgeText: \"Tester\" },\n bugfix: { backgroundColor: \"#2a2a1b\", badgeText: \"Debugger\" },\n documentation: { backgroundColor: \"#1b1b2a\", badgeText: \"Docs\" },\n};\n\nconst DEFAULT_PROFILE: IRoleProfile = {\n backgroundColor: \"#1e1e1e\",\n badgeText: \"Agent\",\n};\n\n// ── iTerm2 Manager ──────────────────────────────────────────────────────\n\nexport class ITerm2Manager {\n private readonly panes = new Map<string, IITerm2PaneInfo>();\n private disposed = false;\n\n /**\n * Check if currently running inside iTerm2 on macOS.\n */\n isAvailable(): boolean {\n if (process.platform !== \"darwin\") {\n logger.debug(\"iTerm2 manager is macOS-only\");\n return false;\n }\n\n const termProgram = process.env[\"TERM_PROGRAM\"];\n if (termProgram !== \"iTerm.app\") {\n logger.debug({ termProgram }, \"Not running inside iTerm2\");\n return false;\n }\n\n return true;\n }\n\n /**\n * Check if the iTerm2 Python API is accessible.\n */\n async isPythonAPIAvailable(): Promise<boolean> {\n if (!this.isAvailable()) return false;\n\n try {\n const result = await execa(\"python3\", [\"-c\", \"import iterm2\"]);\n return result.exitCode === 0;\n } catch {\n logger.warn(\"iTerm2 Python API module (iterm2) not installed\");\n return false;\n }\n }\n\n /**\n * Create panes in the current iTerm2 window based on layout config.\n */\n async createPanes(layoutConfig: ILayoutConfig): Promise<void> {\n this.assertNotDisposed();\n\n if (!(await this.isPythonAPIAvailable())) {\n throw new AgentSpawnError(\n \"iterm2\",\n \"iTerm2 Python API is not available. Install with: pip3 install iterm2\",\n );\n }\n\n const script = this.buildCreatePanesScript(layoutConfig);\n\n try {\n await this.executePythonScript(script);\n logger.info(\n { paneCount: layoutConfig.panes.length },\n \"iTerm2 panes created\",\n );\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n throw new AgentSpawnError(\"iterm2\", `Failed to create iTerm2 panes: ${message}`);\n }\n }\n\n /**\n * Send a command to a specific pane via iTerm2 Python API.\n */\n async sendCommand(paneId: string, command: string): Promise<void> {\n this.assertNotDisposed();\n\n const info = this.panes.get(paneId);\n if (!info) {\n logger.warn({ paneId }, \"iTerm2 pane not found, cannot send command\");\n return;\n }\n\n const escapedCommand = command.replace(/\"/g, '\\\\\"').replace(/\\\\/g, \"\\\\\\\\\");\n const script = this.buildSendCommandScript(info.sessionId, escapedCommand);\n\n try {\n await this.executePythonScript(script);\n logger.debug({ paneId, command: command.slice(0, 80) }, \"Command sent to iTerm2 pane\");\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n logger.error({ paneId, error: message }, \"Failed to send command to iTerm2 pane\");\n }\n }\n\n /**\n * Set the profile (colors) for a pane based on agent role.\n */\n async setProfile(paneId: string, role: string): Promise<void> {\n this.assertNotDisposed();\n\n const info = this.panes.get(paneId);\n if (!info) return;\n\n const profile = ROLE_PROFILES[role] ?? DEFAULT_PROFILE;\n const script = this.buildSetProfileScript(info.sessionId, profile);\n\n try {\n await this.executePythonScript(script);\n logger.debug({ paneId, role }, \"iTerm2 pane profile set\");\n } catch {\n logger.debug({ paneId, role }, \"Failed to set iTerm2 profile (non-fatal)\");\n }\n }\n\n /**\n * Destroy all managed iTerm2 panes.\n */\n async destroy(): Promise<void> {\n if (this.disposed) return;\n this.disposed = true;\n\n for (const [paneId, info] of this.panes) {\n try {\n const script = this.buildCloseSessionScript(info.sessionId);\n await this.executePythonScript(script);\n } catch {\n // Pane may already be closed\n }\n getEventBus().emit(\"pane:closed\", { paneId });\n }\n\n this.panes.clear();\n logger.info(\"iTerm2 panes destroyed\");\n }\n\n /**\n * Get all tracked pane info.\n */\n getPanes(): ReadonlyMap<string, IITerm2PaneInfo> {\n return this.panes;\n }\n\n /**\n * Register a pane that was created externally.\n */\n registerPane(info: IITerm2PaneInfo): void {\n this.panes.set(info.paneId, info);\n getEventBus().emit(\"pane:created\", {\n paneId: info.paneId,\n agentName: info.agentName,\n });\n }\n\n // ── Python Script Builders ─────────────────────────────────────────\n\n private buildCreatePanesScript(layoutConfig: ILayoutConfig): string {\n const paneConfigs = layoutConfig.panes;\n const splitCommands = this.buildSplitCommands(paneConfigs, layoutConfig.layout);\n\n return `\nimport iterm2\nimport asyncio\n\nasync def main(connection):\n app = await iterm2.async_get_app(connection)\n window = app.current_terminal_window\n if window is None:\n return\n\n tab = window.current_tab\n root_session = tab.current_session\n sessions = [root_session]\n\n${splitCommands}\n\n # Output session IDs for tracking\n for s in sessions:\n print(s.session_id)\n\niterm2.run_until_complete(main)\n`.trim();\n }\n\n private buildSplitCommands(\n panes: readonly IPaneConfig[],\n layout: PaneLayout,\n ): string {\n const lines: string[] = [];\n\n for (let i = 1; i < panes.length; i++) {\n const vertical = this.shouldSplitVertically(i, panes.length, layout);\n const direction = vertical ? \"True\" : \"False\";\n lines.push(\n ` new_session = await sessions[${Math.floor(i / 2)}].async_split_pane(vertical=${direction})`,\n );\n lines.push(` sessions.append(new_session)`);\n\n const pane = panes[i];\n if (pane) {\n const escapedTitle = pane.title.replace(/'/g, \"\\\\'\");\n lines.push(` await new_session.async_set_name(\"${escapedTitle}\")`);\n }\n }\n\n return lines.join(\"\\n\");\n }\n\n private shouldSplitVertically(\n index: number,\n total: number,\n layout: PaneLayout,\n ): boolean {\n if (layout === \"vertical\") return true;\n if (layout === \"horizontal\") return false;\n // Auto and grid: alternate directions\n if (total <= 2) return false;\n return index % 2 === 1;\n }\n\n private buildSendCommandScript(sessionId: string, command: string): string {\n return `\nimport iterm2\n\nasync def main(connection):\n app = await iterm2.async_get_app(connection)\n session = app.get_session_by_id(\"${sessionId}\")\n if session:\n await session.async_send_text(\"${command}\\\\n\")\n\niterm2.run_until_complete(main)\n`.trim();\n }\n\n private buildSetProfileScript(sessionId: string, profile: IRoleProfile): string {\n return `\nimport iterm2\n\nasync def main(connection):\n app = await iterm2.async_get_app(connection)\n session = app.get_session_by_id(\"${sessionId}\")\n if session:\n change = iterm2.LocalWriteOnlyProfile()\n color = iterm2.Color.from_hex(\"${profile.backgroundColor}\")\n change.set_background_color(color)\n change.set_badge_text(\"${profile.badgeText}\")\n await session.async_set_profile_properties(change)\n\niterm2.run_until_complete(main)\n`.trim();\n }\n\n private buildCloseSessionScript(sessionId: string): string {\n return `\nimport iterm2\n\nasync def main(connection):\n app = await iterm2.async_get_app(connection)\n session = app.get_session_by_id(\"${sessionId}\")\n if session:\n await session.async_close()\n\niterm2.run_until_complete(main)\n`.trim();\n }\n\n // ── Execution ──────────────────────────────────────────────────────\n\n private async executePythonScript(script: string): Promise<string> {\n const result = await execa(\"python3\", [\"-c\", script], {\n timeout: 10_000,\n });\n return result.stdout;\n }\n\n private assertNotDisposed(): void {\n if (this.disposed) {\n throw new AgentSpawnError(\"iterm2\", \"ITerm2Manager has been disposed\");\n }\n }\n}\n","/**\n * IPCHub — Unix domain socket server for inter-agent communication.\n * JSON-RPC 2.0 protocol with HMAC authentication per PRD section 9.4 & 14.5.\n */\n\nimport { createServer, type Server, type Socket } from \"node:net\";\nimport { createHmac, randomBytes, timingSafeEqual } from \"node:crypto\";\nimport { chmod, unlink } from \"node:fs/promises\";\nimport type { IIPCMessage, IIPCResponse } from \"../types/team.js\";\nimport { getIPCSocketDir, getIPCSocketPath, ensureSecureDirectory } from \"../utils/pathResolver.js\";\nimport { getEventBus } from \"../core/event-bus.js\";\nimport { logger } from \"../utils/logger.js\";\nimport { IPCError } from \"../types/errors.js\";\n\n// ── Types ───────────────────────────────────────────────────────────────\n\ninterface IRegisteredClient {\n readonly agentId: string;\n readonly agentName: string;\n readonly socket: Socket;\n}\n\ntype MethodHandler = (\n clientId: string, params: Record<string, unknown>,\n id: number | undefined, socket: Socket,\n) => unknown;\n\n// ── Constants ───────────────────────────────────────────────────────────\n\nconst NEWLINE = 0x0a;\nconst SOCKET_PERMS = 0o700;\nconst MAX_MSG_SIZE = 1_048_576;\nconst RPC_PARSE_ERROR = -32700;\nconst RPC_INVALID_REQ = -32600;\nconst RPC_METHOD_NOT_FOUND = -32601;\nconst RPC_INTERNAL_ERROR = -32603;\nconst RPC_AUTH_ERROR = -32000;\n\n// ── IPCHub ──────────────────────────────────────────────────────────────\n\nexport class IPCHub {\n private readonly sessionId: string;\n private readonly hmacSecret: string;\n private readonly socketPath: string;\n private readonly clients = new Map<string, IRegisteredClient>();\n private readonly handlers = new Map<string, MethodHandler>();\n private server: Server | undefined;\n private disposed = false;\n\n constructor(sessionId: string) {\n this.sessionId = sessionId;\n this.hmacSecret = randomBytes(32).toString(\"hex\");\n this.socketPath = getIPCSocketPath(sessionId);\n this.registerDefaultHandlers();\n }\n\n getHmacSecret(): string { return this.hmacSecret; }\n getSocketPath(): string { return this.socketPath; }\n getClientCount(): number { return this.clients.size; }\n getConnectedAgentIds(): readonly string[] { return [...this.clients.keys()]; }\n\n /** Start the Unix domain socket server. */\n async start(): Promise<void> {\n this.assertAlive();\n ensureSecureDirectory(getIPCSocketDir());\n await this.removeStaleSocket();\n\n return new Promise<void>((resolve, reject) => {\n this.server = createServer((socket) => {\n this.handleConnection(socket);\n });\n this.server.on(\"error\", (err: Error) => {\n logger.error({ error: err.message }, \"IPC server error\");\n reject(new IPCError(`Server error: ${err.message}`));\n });\n this.server.listen(this.socketPath, () => {\n void (async () => {\n try {\n await chmod(this.socketPath, SOCKET_PERMS);\n } catch {\n /* non-fatal */\n }\n logger.info({ socketPath: this.socketPath }, \"IPC hub listening\");\n this.setupProcessCleanup();\n resolve();\n })();\n });\n });\n }\n\n /** Send a message to a specific registered client. */\n sendToClient(agentId: string, message: IIPCMessage): void {\n this.assertAlive();\n const client = this.clients.get(agentId);\n if (client) this.write(client.socket, message);\n }\n\n /** Broadcast a message to all connected clients. */\n broadcast(message: IIPCMessage, excludeId?: string): void {\n this.assertAlive();\n for (const [id, client] of this.clients) {\n if (id !== excludeId) this.write(client.socket, message);\n }\n }\n\n /** Register a custom method handler. */\n onMethod(method: string, handler: MethodHandler): void {\n this.handlers.set(method, handler);\n }\n\n /** Compute HMAC-SHA256 for a message. */\n computeHmac(message: unknown): string {\n return createHmac(\"sha256\", this.hmacSecret)\n .update(JSON.stringify(message)).digest(\"hex\");\n }\n\n /** Register a connected socket as a client (also called by agent.register). */\n registerClientSocket(agentId: string, agentName: string, socket: Socket): void {\n this.clients.set(agentId, { agentId, agentName, socket });\n }\n\n /** Gracefully shut down the hub and all connections. */\n async destroy(): Promise<void> {\n if (this.disposed) return;\n this.disposed = true;\n const msg: IIPCMessage = { jsonrpc: \"2.0\", method: \"hub.shutdown\", params: { reason: \"Hub shutting down\" } };\n for (const c of this.clients.values()) {\n try { this.write(c.socket, msg); c.socket.end(); } catch { /* already gone */ }\n }\n this.clients.clear();\n if (this.server) {\n const server = this.server;\n await new Promise<void>((resolve) => {\n server.close(() => {\n resolve();\n });\n });\n this.server = undefined;\n }\n await this.removeStaleSocket();\n logger.info({ sessionId: this.sessionId }, \"IPC hub destroyed\");\n }\n\n // ── Connection Handling ───────────────────────────────────────────\n\n private handleConnection(socket: Socket): void {\n let buffer = Buffer.alloc(0);\n let agentId: string | undefined;\n\n socket.on(\"data\", (data: Buffer) => {\n buffer = Buffer.concat([buffer, data]);\n if (buffer.length > MAX_MSG_SIZE) { socket.destroy(); return; }\n\n let idx: number;\n while ((idx = buffer.indexOf(NEWLINE)) !== -1) {\n const raw = buffer.subarray(0, idx).toString(\"utf-8\");\n buffer = buffer.subarray(idx + 1);\n if (raw.length === 0) continue;\n this.processRaw(raw, socket, agentId).then((id) => { if (id) agentId = id; })\n .catch((e: unknown) => {\n logger.error({ error: e instanceof Error ? e.message : String(e) }, \"IPC msg error\");\n });\n }\n });\n\n socket.on(\"close\", () => {\n if (agentId) { this.clients.delete(agentId); logger.info({ agentId }, \"Client disconnected\"); }\n });\n socket.on(\"error\", (err: Error) => {\n logger.error({ error: err.message, agentId }, \"Socket error\");\n });\n }\n\n private async processRaw(raw: string, socket: Socket, currentId: string | undefined): Promise<string | undefined> {\n let parsed: unknown;\n try { parsed = JSON.parse(raw) as unknown; } catch {\n this.sendError(socket, undefined, RPC_PARSE_ERROR, \"Parse error\"); return undefined;\n }\n\n if (!this.isAuthEnvelope(parsed)) {\n this.sendError(socket, undefined, RPC_INVALID_REQ, \"Invalid request format\"); return undefined;\n }\n const { message, hmac } = parsed;\n const requestId = this.getRequestId(message);\n\n if (!this.verifyHmac(message, hmac)) {\n this.sendError(socket, requestId, RPC_AUTH_ERROR, \"Authentication failed\"); return undefined;\n }\n if (!this.isIPCMessage(message)) {\n this.sendError(socket, requestId, RPC_INVALID_REQ, \"Invalid JSON-RPC 2.0\"); return undefined;\n }\n\n const handler = this.handlers.get(message.method);\n if (!handler) {\n this.sendError(socket, message.id, RPC_METHOD_NOT_FOUND, `Unknown: ${message.method}`); return undefined;\n }\n\n try {\n const aid = currentId ?? (message.params[\"agentId\"] as string | undefined) ?? \"unknown\";\n const result = await handler(aid, message.params, message.id, socket);\n if (message.id !== undefined) this.sendResult(socket, message.id, result);\n if (message.method === \"agent.register\") return message.params[\"agentId\"] as string | undefined;\n } catch (e: unknown) {\n this.sendError(socket, message.id, RPC_INTERNAL_ERROR, e instanceof Error ? e.message : String(e));\n }\n return undefined;\n }\n\n // ── Default Handlers ──────────────────────────────────────────────\n\n private registerDefaultHandlers(): void {\n this.handlers.set(\"agent.register\", (_cid, params, _id, socket) => {\n const agentId = params[\"agentId\"] as string | undefined;\n const agentName = params[\"agentName\"] as string | undefined;\n if (!agentId || !agentName) throw new IPCError(\"agent.register requires agentId and agentName\");\n this.registerClientSocket(agentId, agentName, socket);\n logger.info({ agentId, agentName }, \"Agent registered\");\n return { registered: true, agentId };\n });\n\n this.handlers.set(\"agent.streamChunk\", (_cid, params) => {\n getEventBus().emit(\"model:stream:chunk\", {\n model: (params[\"model\"] as string | undefined) ?? \"unknown\",\n content: (params[\"content\"] as string | undefined) ?? \"\",\n });\n return { received: true };\n });\n\n this.handlers.set(\"agent.taskUpdate\", (_cid, params) => {\n const taskId = params[\"taskId\"] as string | undefined;\n const status = params[\"status\"] as string | undefined;\n if (taskId && status) getEventBus().emit(\"task:updated\", { taskId, status });\n return { received: true };\n });\n\n this.handlers.set(\"agent.message\", (_cid, params) => {\n const to = params[\"to\"] as string | undefined;\n const content = params[\"content\"] as string | undefined;\n const from = params[\"from\"] as string | undefined;\n if (from && to && content) {\n getEventBus().emit(\"agent:message\", { from, to, content });\n const target = this.clients.get(to);\n if (target) {\n this.write(target.socket, { jsonrpc: \"2.0\", method: \"agent.message\", params: { from, content } });\n }\n }\n return { delivered: this.clients.has(to ?? \"\") };\n });\n\n this.handlers.set(\"hub.taskAssign\", (_cid, params) => {\n const agentId = params[\"agentId\"] as string | undefined;\n const taskId = params[\"taskId\"] as string | undefined;\n if (agentId && taskId) {\n const target = this.clients.get(agentId);\n if (target) this.write(target.socket, { jsonrpc: \"2.0\", method: \"hub.taskAssign\", params: { taskId, ...params } });\n }\n return { assigned: this.clients.has(agentId ?? \"\") };\n });\n\n this.handlers.set(\"hub.shutdown\", (_cid, params) => {\n const agentId = params[\"agentId\"] as string | undefined;\n if (agentId) {\n const target = this.clients.get(agentId);\n if (target) {\n this.write(target.socket, {\n jsonrpc: \"2.0\", method: \"hub.shutdown\",\n params: { reason: (params[\"reason\"] as string | undefined) ?? \"Shutdown requested\" },\n });\n }\n }\n return { notified: this.clients.has(agentId ?? \"\") };\n });\n }\n\n // ── HMAC ──────────────────────────────────────────────────────────\n\n private verifyHmac(message: unknown, hmac: string): boolean {\n const expected = this.computeHmac(message);\n if (expected.length !== hmac.length) return false;\n return timingSafeEqual(Buffer.from(expected, \"hex\"), Buffer.from(hmac, \"hex\"));\n }\n\n private isAuthEnvelope(v: unknown): v is { message: unknown; hmac: string } {\n if (typeof v !== \"object\" || v === null) return false;\n const o = v as Record<string, unknown>;\n return typeof o[\"hmac\"] === \"string\" && typeof o[\"message\"] === \"object\" && o[\"message\"] !== null;\n }\n\n private isIPCMessage(v: unknown): v is IIPCMessage {\n if (typeof v !== \"object\" || v === null) return false;\n const o = v as Record<string, unknown>;\n return o[\"jsonrpc\"] === \"2.0\"\n && typeof o[\"method\"] === \"string\"\n && typeof o[\"params\"] === \"object\"\n && o[\"params\"] !== null;\n }\n\n private getRequestId(v: unknown): number | undefined {\n if (typeof v !== \"object\" || v === null) return undefined;\n const o = v as Record<string, unknown>;\n return typeof o[\"id\"] === \"number\" ? o[\"id\"] : undefined;\n }\n\n // ── I/O ───────────────────────────────────────────────────────────\n\n private write(socket: Socket, msg: IIPCMessage | IIPCResponse): void {\n if (!socket.destroyed) socket.write(JSON.stringify(msg) + \"\\n\");\n }\n\n private sendResult(socket: Socket, id: number, result: unknown): void {\n this.write(socket, { jsonrpc: \"2.0\", result, id } as IIPCResponse);\n }\n\n private sendError(socket: Socket, id: number | undefined, code: number, message: string): void {\n this.write(socket, { jsonrpc: \"2.0\", error: { code, message }, id: id ?? 0 } as IIPCResponse);\n }\n\n // ── Lifecycle ─────────────────────────────────────────────────────\n\n private async removeStaleSocket(): Promise<void> {\n try { await unlink(this.socketPath); } catch { /* may not exist */ }\n }\n\n private setupProcessCleanup(): void {\n const cleanup = (): void => { this.destroy().catch(() => {}); };\n process.once(\"exit\", cleanup);\n process.once(\"SIGINT\", cleanup);\n process.once(\"SIGTERM\", cleanup);\n }\n\n private assertAlive(): void {\n if (this.disposed) throw new IPCError(\"IPCHub has been disposed\");\n }\n}\n","/**\n * PaneProcess — IPC client connecting to the IPCHub from an agent process.\n * JSON-RPC 2.0 with HMAC auth, reconnection, and heartbeat per PRD 9.4 & 20.2.\n */\n\nimport { connect, type Socket } from \"node:net\";\nimport { createHmac } from \"node:crypto\";\nimport type { IIPCMessage, IIPCResponse, IPCMethod } from \"../types/team.js\";\nimport { logger } from \"../utils/logger.js\";\nimport { IPCError } from \"../types/errors.js\";\nimport { withRetry, sleep } from \"../utils/retry.js\";\n\n// ── Types ───────────────────────────────────────────────────────────────\n\ninterface IPaneProcessOptions {\n readonly agentId: string;\n readonly agentName: string;\n readonly socketPath: string;\n readonly hmacSecret: string;\n readonly heartbeatIntervalMs?: number;\n readonly reconnectMaxRetries?: number;\n}\n\ntype MessageHandler = (message: IIPCMessage) => void;\ntype PendingRequest = {\n readonly resolve: (result: unknown) => void;\n readonly reject: (error: Error) => void;\n readonly timer: ReturnType<typeof setTimeout>;\n};\n\n// ── Constants ───────────────────────────────────────────────────────────\n\nconst DEFAULT_HEARTBEAT_MS = 15_000;\nconst DEFAULT_RECONNECT_RETRIES = 5;\nconst REQUEST_TIMEOUT_MS = 30_000;\nconst NEWLINE = 0x0a;\n\n// ── PaneProcess ─────────────────────────────────────────────────────────\n\nexport class PaneProcess {\n private static readonly resolvedPromise = Promise.resolve();\n\n private readonly agentId: string;\n private readonly agentName: string;\n private readonly socketPath: string;\n private readonly hmacSecret: string;\n private readonly heartbeatMs: number;\n private readonly maxRetries: number;\n private readonly msgHandlers = new Map<string, Set<MessageHandler>>();\n private readonly pending = new Map<number, PendingRequest>();\n\n private socket: Socket | undefined;\n private heartbeatTimer: ReturnType<typeof setInterval> | undefined;\n private nextId = 1;\n private connected = false;\n private disposed = false;\n\n constructor(options: IPaneProcessOptions) {\n this.agentId = options.agentId;\n this.agentName = options.agentName;\n this.socketPath = options.socketPath;\n this.hmacSecret = options.hmacSecret;\n this.heartbeatMs = options.heartbeatIntervalMs ?? DEFAULT_HEARTBEAT_MS;\n this.maxRetries = options.reconnectMaxRetries ?? DEFAULT_RECONNECT_RETRIES;\n }\n\n /** Connect to the IPC hub and register this agent. */\n async connect(): Promise<void> {\n this.assertAlive();\n await this.establish();\n await this.register();\n this.startHeartbeat();\n logger.info({ agentId: this.agentId }, \"PaneProcess connected\");\n }\n\n /** Send a JSON-RPC 2.0 request and wait for response. */\n async request(method: IPCMethod, params: Record<string, unknown>): Promise<unknown> {\n this.assertAlive();\n this.assertConnected();\n const id = this.nextId++;\n const message: IIPCMessage = { jsonrpc: \"2.0\", method, params: { ...params, agentId: this.agentId }, id };\n\n return new Promise<unknown>((resolve, reject) => {\n const timer = setTimeout(() => {\n this.pending.delete(id);\n reject(new IPCError(`Request timeout: ${method}`));\n }, REQUEST_TIMEOUT_MS);\n this.pending.set(id, { resolve, reject, timer });\n this.sendAuthenticated(message);\n });\n }\n\n /** Send a notification (no response expected). */\n notify(method: IPCMethod, params: Record<string, unknown>): void {\n this.assertAlive();\n this.assertConnected();\n this.sendAuthenticated({ jsonrpc: \"2.0\", method, params: { ...params, agentId: this.agentId } });\n }\n\n /** Convenience: send a stream chunk. */\n sendStreamChunk(content: string, model: string, taskId?: string): void {\n this.notify(\"agent.streamChunk\", { content, model, taskId });\n }\n\n /** Convenience: send a task status update. */\n sendTaskUpdate(taskId: string, status: string): void {\n this.notify(\"agent.taskUpdate\", { taskId, status });\n }\n\n /** Convenience: send a message to another agent via the hub. */\n async sendMessage(to: string, content: string): Promise<unknown> {\n return this.request(\"agent.message\", { from: this.agentId, to, content });\n }\n\n /** Register a handler for incoming messages of a specific method. */\n onMessage(method: string, handler: MessageHandler): () => void {\n const set = this.msgHandlers.get(method) ?? new Set();\n set.add(handler);\n this.msgHandlers.set(method, set);\n return () => { set.delete(handler); if (set.size === 0) this.msgHandlers.delete(method); };\n }\n\n isConnected(): boolean { return this.connected && !this.disposed; }\n\n /** Gracefully disconnect from the hub. */\n disconnect(): Promise<void> {\n if (this.disposed) {\n return PaneProcess.resolvedPromise;\n }\n this.disposed = true;\n this.stopHeartbeat();\n this.rejectAll();\n if (this.socket) { this.socket.end(); this.socket = undefined; }\n this.connected = false;\n logger.info({ agentId: this.agentId }, \"PaneProcess disconnected\");\n return PaneProcess.resolvedPromise;\n }\n\n // ── Connection ────────────────────────────────────────────────────\n\n private async establish(): Promise<void> {\n await withRetry(() => this.connectSocket(), {\n maxRetries: this.maxRetries,\n baseDelayMs: 500,\n maxDelayMs: 10_000,\n shouldRetry: () => !this.disposed,\n });\n }\n\n private connectSocket(): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n const socket = connect(this.socketPath);\n let buffer = Buffer.alloc(0);\n\n socket.on(\"connect\", () => {\n this.socket = socket;\n this.connected = true;\n resolve();\n });\n\n socket.on(\"data\", (data: Buffer) => {\n buffer = Buffer.concat([buffer, data]);\n let idx: number;\n while ((idx = buffer.indexOf(NEWLINE)) !== -1) {\n const raw = buffer.subarray(0, idx).toString(\"utf-8\");\n buffer = buffer.subarray(idx + 1);\n if (raw.length > 0) this.handleIncoming(raw);\n }\n });\n\n socket.on(\"close\", () => {\n this.connected = false;\n if (!this.disposed) {\n logger.warn({ agentId: this.agentId }, \"Connection lost, reconnecting\");\n void this.attemptReconnect();\n }\n });\n\n socket.on(\"error\", (err: Error) => {\n if (!this.connected) reject(new IPCError(`Connection failed: ${err.message}`));\n else logger.error({ agentId: this.agentId, error: err.message }, \"Socket error\");\n });\n });\n }\n\n private async attemptReconnect(): Promise<void> {\n if (this.disposed) return;\n this.stopHeartbeat();\n try {\n await sleep(1_000);\n await this.establish();\n await this.register();\n this.startHeartbeat();\n logger.info({ agentId: this.agentId }, \"Reconnected\");\n } catch (e: unknown) {\n logger.error({ agentId: this.agentId, error: e instanceof Error ? e.message : String(e) }, \"Reconnect failed\");\n }\n }\n\n private async register(): Promise<void> {\n await this.request(\"agent.register\", { agentId: this.agentId, agentName: this.agentName });\n }\n\n // ── Message Processing ────────────────────────────────────────────\n\n private handleIncoming(raw: string): void {\n let parsed: unknown;\n try { parsed = JSON.parse(raw) as unknown; } catch { return; }\n\n if (this.isResponse(parsed)) { this.resolveResponse(parsed); return; }\n if (this.isMessage(parsed)) { this.dispatch(parsed); return; }\n }\n\n private resolveResponse(response: IIPCResponse): void {\n const p = this.pending.get(response.id);\n if (!p) return;\n this.pending.delete(response.id);\n clearTimeout(p.timer);\n if (response.error) p.reject(new IPCError(`RPC ${response.error.code}: ${response.error.message}`));\n else p.resolve(response.result);\n }\n\n private dispatch(message: IIPCMessage): void {\n const handlers = this.msgHandlers.get(message.method);\n if (!handlers) return;\n for (const h of handlers) {\n try { h(message); } catch (e: unknown) {\n logger.error({ method: message.method, error: e instanceof Error ? e.message : String(e) }, \"Handler error\");\n }\n }\n }\n\n // ── Heartbeat ─────────────────────────────────────────────────────\n\n private startHeartbeat(): void {\n this.stopHeartbeat();\n this.heartbeatTimer = setInterval(() => {\n if (this.connected && this.socket && !this.socket.destroyed) {\n this.notify(\"agent.streamChunk\", { content: \"\", model: \"heartbeat\", heartbeat: true });\n }\n }, this.heartbeatMs);\n this.heartbeatTimer.unref();\n }\n\n private stopHeartbeat(): void {\n if (this.heartbeatTimer) { clearInterval(this.heartbeatTimer); this.heartbeatTimer = undefined; }\n }\n\n // ── HMAC ──────────────────────────────────────────────────────────\n\n private sendAuthenticated(message: IIPCMessage): void {\n if (!this.socket || this.socket.destroyed) return;\n const hmac = createHmac(\"sha256\", this.hmacSecret).update(JSON.stringify(message)).digest(\"hex\");\n this.socket.write(JSON.stringify({ message, hmac }) + \"\\n\");\n }\n\n // ── Type Guards ───────────────────────────────────────────────────\n\n private isResponse(v: unknown): v is IIPCResponse {\n if (typeof v !== \"object\" || v === null) return false;\n const o = v as Record<string, unknown>;\n return o[\"jsonrpc\"] === \"2.0\" && typeof o[\"id\"] === \"number\" && !(\"method\" in o);\n }\n\n private isMessage(v: unknown): v is IIPCMessage {\n if (typeof v !== \"object\" || v === null) return false;\n const o = v as Record<string, unknown>;\n return o[\"jsonrpc\"] === \"2.0\" && typeof o[\"method\"] === \"string\";\n }\n\n // ── Helpers ───────────────────────────────────────────────────────\n\n private rejectAll(): void {\n const err = new IPCError(\"PaneProcess disconnected\");\n for (const [, p] of this.pending) { clearTimeout(p.timer); p.reject(err); }\n this.pending.clear();\n }\n\n private assertAlive(): void { if (this.disposed) throw new IPCError(\"PaneProcess disposed\"); }\n private assertConnected(): void { if (!this.connected || !this.socket) throw new IPCError(\"Not connected\"); }\n}\n","/**\n * MCP tool bridge per PRD section 11.3\n * Converts MCP tool schemas to AemeathCLI IToolDefinition format and back.\n * Registers MCP tools into the unified tool registry with lazy loading.\n * Tool namespacing: mcp__{serverName}__{toolName}\n */\n\nimport { logger } from \"../utils/logger.js\";\nimport { ToolCallError } from \"../types/errors.js\";\nimport type { IToolDefinition, IToolParameter, IToolCall, IToolResult } from \"../types/message.js\";\nimport type { IToolRegistration, IToolRegistry, ToolCategory } from \"../types/tool.js\";\nimport type { IToolExecutionContext } from \"../types/tool.js\";\nimport type { MCPServerManager } from \"./server-manager.js\";\nimport type { IMCPToolSchema } from \"./client.js\";\n\n// ── Constants ───────────────────────────────────────────────────────────\n\nconst NAMESPACE_SEPARATOR = \"__\";\nconst MCP_PREFIX = \"mcp\";\nconst MCP_CATEGORY: ToolCategory = \"mcp\";\n\n// ── Namespacing ─────────────────────────────────────────────────────────\n\nfunction buildToolName(serverName: string, toolName: string): string {\n return `${MCP_PREFIX}${NAMESPACE_SEPARATOR}${serverName}${NAMESPACE_SEPARATOR}${toolName}`;\n}\n\nfunction parseToolName(\n namespacedName: string,\n): { serverName: string; toolName: string } | undefined {\n const parts = namespacedName.split(NAMESPACE_SEPARATOR);\n if (parts.length < 3 || parts[0] !== MCP_PREFIX) {\n return undefined;\n }\n const serverName = parts[1];\n const toolName = parts.slice(2).join(NAMESPACE_SEPARATOR);\n if (!serverName || !toolName) {\n return undefined;\n }\n return { serverName, toolName };\n}\n\n// ── Schema Conversion ───────────────────────────────────────────────────\n\ninterface IJsonSchemaProperty {\n readonly type?: string;\n readonly description?: string;\n readonly default?: unknown;\n readonly enum?: readonly string[];\n}\n\nfunction convertInputSchema(\n inputSchema: Readonly<Record<string, unknown>>,\n): readonly IToolParameter[] {\n const properties = inputSchema[\"properties\"];\n if (!properties || typeof properties !== \"object\") {\n return [];\n }\n\n const requiredList = inputSchema[\"required\"];\n const requiredSet = new Set<string>(\n Array.isArray(requiredList) ? (requiredList as string[]) : [],\n );\n\n const params: IToolParameter[] = [];\n for (const [name, rawSchema] of Object.entries(\n properties as Record<string, unknown>,\n )) {\n const schema = rawSchema as IJsonSchemaProperty | undefined;\n if (!schema || typeof schema !== \"object\") {\n continue;\n }\n\n const param: IToolParameter = {\n name,\n type: schema.type ?? \"string\",\n description: schema.description ?? \"\",\n required: requiredSet.has(name),\n ...(schema.default !== undefined ? { default: schema.default } : {}),\n ...(schema.enum !== undefined ? { enum: schema.enum } : {}),\n };\n params.push(param);\n }\n\n return params;\n}\n\nfunction mcpToolToDefinition(\n serverName: string,\n mcpTool: IMCPToolSchema,\n): IToolDefinition {\n return {\n name: buildToolName(serverName, mcpTool.name),\n description: `[MCP:${serverName}] ${mcpTool.description}`,\n parameters: convertInputSchema(mcpTool.inputSchema),\n };\n}\n\n// ── Tool Call Conversion ────────────────────────────────────────────────\n\ninterface IMCPCallRequest {\n readonly serverName: string;\n readonly toolName: string;\n readonly arguments: Record<string, unknown>;\n}\n\nfunction toolCallToMCPRequest(call: IToolCall): IMCPCallRequest {\n const parsed = parseToolName(call.name);\n if (!parsed) {\n throw new ToolCallError(\n call.name,\n \"Invalid MCP tool name format — expected mcp__{server}__{tool}\",\n );\n }\n return {\n serverName: parsed.serverName,\n toolName: parsed.toolName,\n arguments: call.arguments,\n };\n}\n\nfunction mcpResultToToolResult(\n toolCallId: string,\n toolName: string,\n content: string,\n isError: boolean,\n): IToolResult {\n return { toolCallId, name: toolName, content, isError };\n}\n\n// ── Argument Validation (PRD 11.4) ──────────────────────────────────────\n\nfunction validateArguments(\n args: Record<string, unknown>,\n parameters: readonly IToolParameter[],\n): string | undefined {\n for (const param of parameters) {\n if (param.required && !(param.name in args)) {\n return `Missing required argument: ${param.name}`;\n }\n }\n return undefined;\n}\n\n// ── MCPToolBridge ───────────────────────────────────────────────────────\n\nexport class MCPToolBridge {\n private readonly serverManager: MCPServerManager;\n private readonly toolCache = new Map<string, readonly IToolDefinition[]>();\n\n constructor(serverManager: MCPServerManager) {\n this.serverManager = serverManager;\n }\n\n /**\n * Discover tools from all connected MCP servers and register them.\n * Uses lazy loading: definitions are fetched and cached on first request.\n */\n async registerAll(registry: IToolRegistry): Promise<number> {\n const servers = this.serverManager.getConnectedServers();\n let totalRegistered = 0;\n\n for (const serverName of servers) {\n try {\n const count = await this.registerServerTools(serverName, registry);\n totalRegistered += count;\n } catch (error: unknown) {\n const msg = error instanceof Error ? error.message : String(error);\n logger.error(\n { server: serverName, error: msg },\n \"Failed to register MCP tools\",\n );\n }\n }\n\n logger.info(\n { totalRegistered, servers: servers.length },\n \"MCP tool registration complete\",\n );\n\n return totalRegistered;\n }\n\n /**\n * Register tools from a single MCP server.\n * Fetches tool schemas and caches definitions.\n */\n async registerServerTools(\n serverName: string,\n registry: IToolRegistry,\n ): Promise<number> {\n const definitions = await this.loadToolDefinitions(serverName);\n\n for (const definition of definitions) {\n const registration = this.createRegistration(serverName, definition);\n registry.register(registration);\n }\n\n logger.info(\n { server: serverName, tools: definitions.length },\n \"Registered MCP server tools\",\n );\n\n return definitions.length;\n }\n\n /**\n * Lazy-load tool definitions for a server.\n * Returns cached definitions if already loaded.\n */\n async loadToolDefinitions(\n serverName: string,\n ): Promise<readonly IToolDefinition[]> {\n const cached = this.toolCache.get(serverName);\n if (cached) {\n return cached;\n }\n\n const mcpTools = await this.serverManager.listServerTools(serverName);\n const definitions = mcpTools.map((tool) =>\n mcpToolToDefinition(serverName, tool),\n );\n\n this.toolCache.set(serverName, definitions);\n return definitions;\n }\n\n /**\n * Execute an MCP tool call: validate, convert, call, return result.\n */\n async executeTool(call: IToolCall): Promise<IToolResult> {\n const request = toolCallToMCPRequest(call);\n\n // Validate arguments against cached schema\n const definitions = this.toolCache.get(request.serverName);\n if (definitions) {\n const def = definitions.find((d) => d.name === call.name);\n if (def) {\n const validationError = validateArguments(call.arguments, def.parameters);\n if (validationError) {\n return mcpResultToToolResult(call.id, call.name, validationError, true);\n }\n }\n }\n\n // Rate-limit check\n this.serverManager.checkRateLimitFor(request.serverName);\n this.serverManager.recordCall(request.serverName);\n\n const client = this.serverManager.getClient(request.serverName);\n if (!client) {\n return mcpResultToToolResult(\n call.id,\n call.name,\n `MCP server \"${request.serverName}\" is not connected`,\n true,\n );\n }\n\n try {\n const result = await client.callTool(request.toolName, request.arguments);\n return mcpResultToToolResult(\n call.id,\n call.name,\n result.content,\n result.isError,\n );\n } catch (error: unknown) {\n const msg = error instanceof Error ? error.message : String(error);\n return mcpResultToToolResult(call.id, call.name, msg, true);\n }\n }\n\n /** Invalidate cached tool definitions for a server (e.g. after config reload). */\n invalidateCache(serverName?: string): void {\n if (serverName) {\n this.toolCache.delete(serverName);\n } else {\n this.toolCache.clear();\n }\n }\n\n /** Check whether a tool name is an MCP-namespaced tool. */\n isMCPTool(toolName: string): boolean {\n return parseToolName(toolName) !== undefined;\n }\n\n /** Get all cached tool definitions across all servers. */\n getAllDefinitions(): readonly IToolDefinition[] {\n const all: IToolDefinition[] = [];\n for (const defs of this.toolCache.values()) {\n all.push(...defs);\n }\n return all;\n }\n\n // ── Private ─────────────────────────────────────────────────────────\n\n private createRegistration(\n _serverName: string,\n definition: IToolDefinition,\n ): IToolRegistration {\n return {\n definition,\n category: MCP_CATEGORY,\n requiresApproval: (context: IToolExecutionContext, _args: Record<string, unknown>) => {\n // MCP tools always require approval in strict mode\n return context.permissionMode === \"strict\";\n },\n execute: async (args: Record<string, unknown>) => {\n const call: IToolCall = {\n id: `mcp-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,\n name: definition.name,\n arguments: args,\n };\n return this.executeTool(call);\n },\n };\n }\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { getAemeathHome } from './chunk-BY4DAKUU.js';
1
+ import { getAemeathHome } from './chunk-D275MCIH.js';
2
2
  import { createHash } from 'crypto';
3
3
  import { readFile, mkdir, writeFile } from 'fs/promises';
4
4
  import { join } from 'path';
@@ -53,5 +53,5 @@ async function appendInputHistory(projectRoot, entry) {
53
53
  }
54
54
 
55
55
  export { appendInputHistory, loadInputHistory };
56
- //# sourceMappingURL=input-history-MIOO3FIW.js.map
57
- //# sourceMappingURL=input-history-MIOO3FIW.js.map
56
+ //# sourceMappingURL=input-history-BEICE7PT.js.map
57
+ //# sourceMappingURL=input-history-BEICE7PT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/storage/input-history.ts"],"names":["history"],"mappings":";;;;;AAUA,IAAM,YAAA,GAAe,oBAAA;AACrB,IAAM,WAAA,GAAc,GAAA;AAEpB,IAAM,aAAA,uBAAoB,GAAA,EAAsB;AAGhD,SAAS,YAAY,WAAA,EAA6B;AAChD,EAAA,OAAO,UAAA,CAAW,QAAQ,CAAA,CAAE,MAAA,CAAO,WAAW,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAC3E;AAEA,SAAS,cAAc,WAAA,EAA6B;AAClD,EAAA,OAAO,KAAK,cAAA,EAAe,EAAG,SAAA,EAAW,WAAA,CAAY,WAAW,CAAC,CAAA;AACnE;AAEA,SAAS,eAAe,WAAA,EAA6B;AACnD,EAAA,OAAO,IAAA,CAAK,aAAA,CAAc,WAAW,CAAA,EAAG,YAAY,CAAA;AACtD;AAGA,eAAsB,iBAAiB,WAAA,EAAwC;AAC7E,EAAA,MAAM,MAAA,GAAS,aAAA,CAAc,GAAA,CAAI,WAAW,CAAA;AAC5C,EAAA,IAAI,MAAA,KAAW,QAAW,OAAO,MAAA;AAEjC,EAAA,IAAI;AACF,IAAA,MAAM,MAAM,MAAM,QAAA,CAAS,cAAA,CAAe,WAAW,GAAG,OAAO,CAAA;AAC/D,IAAA,MAAM,MAAA,GAAkB,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AACtC,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,IAAK,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA,KAAM,OAAO,CAAA,KAAM,QAAQ,CAAA,EAAG;AACvE,MAAA,MAAMA,QAAAA,GAAU,CAAC,GAAG,MAAM,CAAA;AAC1B,MAAA,aAAA,CAAc,GAAA,CAAI,aAAaA,QAAO,CAAA;AACtC,MAAA,OAAOA,QAAAA;AAAA,IACT;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AAEA,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,aAAA,CAAc,GAAA,CAAI,aAAa,OAAO,CAAA;AACtC,EAAA,OAAO,OAAA;AACT;AAGA,eAAsB,kBAAA,CACpB,aACA,KAAA,EACe;AACf,EAAA,IAAI,OAAA,GAAU,aAAA,CAAc,GAAA,CAAI,WAAW,CAAA;AAC3C,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAA,GAAU,MAAM,iBAAiB,WAAW,CAAA;AAAA,EAC9C;AAGA,EAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,IAAK,OAAA,CAAQ,QAAQ,MAAA,GAAS,CAAC,MAAM,KAAA,EAAO;AAC/D,IAAA;AAAA,EACF;AAEA,EAAA,OAAA,CAAQ,KAAK,KAAK,CAAA;AAElB,EAAA,IAAI,OAAA,CAAQ,SAAS,WAAA,EAAa;AAChC,IAAA,OAAA,CAAQ,MAAA,CAAO,CAAA,EAAG,OAAA,CAAQ,MAAA,GAAS,WAAW,CAAA;AAAA,EAChD;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,cAAc,WAAW,CAAA;AACrC,IAAA,MAAM,KAAA,CAAM,GAAA,EAAK,EAAE,SAAA,EAAW,MAAM,CAAA;AACpC,IAAA,MAAM,SAAA,CAAU,eAAe,WAAW,CAAA,EAAG,KAAK,SAAA,CAAU,OAAO,GAAG,OAAO,CAAA;AAAA,EAC/E,CAAA,CAAA,MAAQ;AAAA,EAER;AACF","file":"input-history-BEICE7PT.js","sourcesContent":["/**\n * Per-project persistent input history across CLI sessions.\n * Stores at ~/.aemeathcli/history/<project-hash>/input-history.json\n */\n\nimport { createHash } from \"node:crypto\";\nimport { readFile, writeFile, mkdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { getAemeathHome } from \"../utils/pathResolver.js\";\n\nconst HISTORY_FILE = \"input-history.json\";\nconst MAX_HISTORY = 500;\n\nconst projectCaches = new Map<string, string[]>();\n\n/** Derive a short directory name from a project root path. */\nfunction projectHash(projectRoot: string): string {\n return createHash(\"sha256\").update(projectRoot).digest(\"hex\").slice(0, 12);\n}\n\nfunction getHistoryDir(projectRoot: string): string {\n return join(getAemeathHome(), \"history\", projectHash(projectRoot));\n}\n\nfunction getHistoryPath(projectRoot: string): string {\n return join(getHistoryDir(projectRoot), HISTORY_FILE);\n}\n\n/** Load persistent input history for a specific project. */\nexport async function loadInputHistory(projectRoot: string): Promise<string[]> {\n const cached = projectCaches.get(projectRoot);\n if (cached !== undefined) return cached;\n\n try {\n const raw = await readFile(getHistoryPath(projectRoot), \"utf-8\");\n const parsed: unknown = JSON.parse(raw);\n if (Array.isArray(parsed) && parsed.every((x) => typeof x === \"string\")) {\n const history = [...parsed];\n projectCaches.set(projectRoot, history);\n return history;\n }\n } catch {\n // File doesn't exist yet\n }\n\n const history: string[] = [];\n projectCaches.set(projectRoot, history);\n return history;\n}\n\n/** Append an entry to the project's persistent history and flush to disk. */\nexport async function appendInputHistory(\n projectRoot: string,\n entry: string,\n): Promise<void> {\n let history = projectCaches.get(projectRoot);\n if (!history) {\n history = await loadInputHistory(projectRoot);\n }\n\n // Deduplicate consecutive\n if (history.length > 0 && history[history.length - 1] === entry) {\n return;\n }\n\n history.push(entry);\n\n if (history.length > MAX_HISTORY) {\n history.splice(0, history.length - MAX_HISTORY);\n }\n\n try {\n const dir = getHistoryDir(projectRoot);\n await mkdir(dir, { recursive: true });\n await writeFile(getHistoryPath(projectRoot), JSON.stringify(history), \"utf-8\");\n } catch {\n // Non-critical\n }\n}\n"]}
@@ -0,0 +1,6 @@
1
+ export { KimiAdapter } from './chunk-KMOAJRDE.js';
2
+ import './chunk-ZGOHARPV.js';
3
+ import './chunk-HCIHOHLX.js';
4
+ import './chunk-IR5HLBMH.js';
5
+ //# sourceMappingURL=kimi-adapter-7FYOAKOI.js.map
6
+ //# sourceMappingURL=kimi-adapter-7FYOAKOI.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"kimi-adapter-UODMNX6K.js"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"kimi-adapter-7FYOAKOI.js"}
@@ -1,11 +1,11 @@
1
- import { CredentialStore } from './chunk-AQ23TYSQ.js';
2
- import './chunk-VJNQJALF.js';
3
- import './chunk-VBLLDY4R.js';
4
- import './chunk-2GKOK6T7.js';
5
- import { AuthenticationError } from './chunk-473JN6M5.js';
6
- import './chunk-62HSGYQD.js';
7
- import { logger } from './chunk-HEKFAKVH.js';
8
- import './chunk-BY4DAKUU.js';
1
+ import { CredentialStore } from './chunk-SNWPI6XJ.js';
2
+ import './chunk-YCCYXDW7.js';
3
+ import './chunk-OPWAFS6Y.js';
4
+ import { AuthenticationError } from './chunk-ZGOHARPV.js';
5
+ import './chunk-HCIHOHLX.js';
6
+ import './chunk-2Y7TR6BS.js';
7
+ import { logger } from './chunk-IR5HLBMH.js';
8
+ import './chunk-D275MCIH.js';
9
9
  import { existsSync, readFileSync } from 'fs';
10
10
  import { join } from 'path';
11
11
  import { homedir } from 'os';
@@ -138,5 +138,5 @@ var KimiLogin = class {
138
138
  };
139
139
 
140
140
  export { KimiLogin };
141
- //# sourceMappingURL=kimi-login-DNT5YBKX.js.map
142
- //# sourceMappingURL=kimi-login-DNT5YBKX.js.map
141
+ //# sourceMappingURL=kimi-login-3IGVOBJI.js.map
142
+ //# sourceMappingURL=kimi-login-3IGVOBJI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/auth/providers/kimi-login.ts"],"names":["expiresAt"],"mappings":"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","file":"kimi-login-3IGVOBJI.js","sourcesContent":["/**\n * Kimi (Moonshot) delegated authentication\n * Reads cached credentials from Kimi CLI's ~/.kimi/credentials/kimi-code.json.\n * If not found, spawns `kimi` CLI for interactive login.\n * Kimi's login opens a browser automatically from its interactive session.\n */\n\nimport { readFileSync, existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { execa } from \"execa\";\nimport type { ICredential } from \"../../types/index.js\";\nimport { AuthenticationError } from \"../../types/index.js\";\nimport { CredentialStore } from \"../credential-store.js\";\nimport { logger } from \"../../utils/index.js\";\n\n// ── Kimi CLI Token Paths ────────────────────────────────────────────────\n\nconst CLI_COMMAND = \"kimi\";\n\nfunction getKimiHome(): string {\n return process.env[\"KIMI_HOME\"] ?? join(homedir(), \".kimi\");\n}\n\nfunction getCredentialsPath(): string {\n return join(getKimiHome(), \"credentials\", \"kimi-code.json\");\n}\n\n// ── kimi-code.json Schema ───────────────────────────────────────────────\n\ninterface IKimiCredentials {\n readonly access_token?: string;\n readonly refresh_token?: string;\n readonly expires_at?: number;\n readonly scope?: string;\n readonly token_type?: string;\n}\n\nfunction readKimiCredentials(): IKimiCredentials | undefined {\n const credsPath = getCredentialsPath();\n if (!existsSync(credsPath)) return undefined;\n try {\n return JSON.parse(readFileSync(credsPath, \"utf-8\")) as IKimiCredentials;\n } catch {\n return undefined;\n }\n}\n\n// ── KimiLogin Class ─────────────────────────────────────────────────────\n\nexport class KimiLogin {\n private readonly credentialStore: CredentialStore;\n\n constructor(store?: CredentialStore) {\n this.credentialStore = store ?? new CredentialStore();\n }\n\n /**\n * Login via the Kimi CLI.\n * First checks for cached credentials. If not found, spawns the Kimi CLI\n * interactive session which handles browser-based login automatically.\n */\n async login(): Promise<ICredential> {\n // Check if already logged in via cached tokens\n const existing = this.readCachedCredentials();\n if (existing) {\n logger.info(\"Found existing Kimi CLI credentials\");\n await this.credentialStore.set(\"kimi\", existing);\n return existing;\n }\n\n // Check if the CLI is available\n const cliAvailable = await this.isCliAvailable();\n if (!cliAvailable) {\n throw new AuthenticationError(\n \"kimi\",\n \"Kimi CLI not found. Install it first:\\n\" +\n (process.platform === \"win32\"\n ? \" irm https://code.kimi.com/install.ps1 | iex\\n\"\n : \" curl -L code.kimi.com/install.sh | bash\\n\") +\n \"Or set an API key: aemeathcli auth set-key kimi <key>\",\n );\n }\n\n // Spawn kimi CLI — it handles login with browser automatically\n logger.info(\"Spawning Kimi CLI for login (browser will open automatically)\");\n try {\n await this.spawnInteractive(CLI_COMMAND, [\"login\"]);\n } catch {\n // Some versions may not have `kimi login` — try spawning interactive session\n try {\n await this.spawnInteractive(CLI_COMMAND, []);\n } catch {\n throw new AuthenticationError(\n \"kimi\",\n \"Kimi login failed. Make sure you have the Kimi CLI installed:\\n\" +\n (process.platform === \"win32\"\n ? \" irm https://code.kimi.com/install.ps1 | iex\\n\"\n : \" curl -L code.kimi.com/install.sh | bash\\n\") +\n \"Or set an API key: aemeathcli auth set-key kimi <key>\",\n );\n }\n }\n\n // Read the freshly cached credentials\n const credential = this.readCachedCredentials();\n if (!credential) {\n throw new AuthenticationError(\n \"kimi\",\n \"No Kimi credentials found after login. Please try again or set an API key: aemeathcli auth set-key kimi <key>\",\n );\n }\n\n await this.credentialStore.set(\"kimi\", credential);\n logger.info(\"Kimi credentials imported successfully\");\n return credential;\n }\n\n async logout(): Promise<void> {\n await this.credentialStore.delete(\"kimi\");\n logger.info(\"Kimi session revoked from AemeathCLI\");\n }\n\n async isLoggedIn(): Promise<boolean> {\n const credential = this.readCachedCredentials();\n if (!credential) {\n return false;\n }\n\n await this.credentialStore.set(\"kimi\", credential);\n return true;\n }\n\n async getStatus(): Promise<{ loggedIn: boolean; email?: string | undefined; plan?: string | undefined }> {\n const loggedIn = await this.isLoggedIn();\n if (!loggedIn) return { loggedIn: false };\n\n const credential = await this.credentialStore.get(\"kimi\");\n if (!credential) return { loggedIn: false };\n\n return {\n loggedIn: true,\n ...(credential.email !== undefined ? { email: credential.email } : {}),\n };\n }\n\n async getCachedCredential(): Promise<ICredential | undefined> {\n const credential = this.readCachedCredentials();\n if (credential) {\n await this.credentialStore.set(\"kimi\", credential);\n }\n return credential;\n }\n\n // ── Internal ──────────────────────────────────────────────────────────\n\n private readCachedCredentials(): ICredential | undefined {\n const kimiCreds = readKimiCredentials();\n if (!kimiCreds?.access_token) return undefined;\n\n // Check expiry (expires_at is seconds since epoch)\n if (kimiCreds.expires_at) {\n const expiresAt = new Date(kimiCreds.expires_at * 1000);\n if (new Date() > expiresAt && !kimiCreds.refresh_token) {\n logger.debug(\"Kimi CLI token expired with no refresh token\");\n return undefined;\n }\n }\n\n const expiresAt = kimiCreds.expires_at\n ? new Date(kimiCreds.expires_at * 1000)\n : undefined;\n\n return {\n provider: \"kimi\",\n method: \"native_login\",\n token: kimiCreds.access_token,\n ...(kimiCreds.refresh_token !== undefined ? { refreshToken: kimiCreds.refresh_token } : {}),\n ...(expiresAt !== undefined ? { expiresAt } : {}),\n };\n }\n\n private async spawnInteractive(command: string, args: readonly string[]): Promise<void> {\n await execa(command, [...args], { stdio: \"inherit\", timeout: 300_000 });\n }\n\n private async isCliAvailable(): Promise<boolean> {\n try {\n await execa(CLI_COMMAND, [\"--version\"], { timeout: 5000, stdin: \"ignore\", stdout: \"ignore\", stderr: \"ignore\" });\n return true;\n } catch {\n return false;\n }\n }\n}\n"]}
@@ -0,0 +1,3 @@
1
+ export { logger } from './chunk-IR5HLBMH.js';
2
+ //# sourceMappingURL=logger-KGHUQ4VE.js.map
3
+ //# sourceMappingURL=logger-KGHUQ4VE.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"logger-PLPDWACQ.js"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"logger-KGHUQ4VE.js"}
@@ -0,0 +1,6 @@
1
+ export { discoverModels, getAllModels, getDisplayOrder, getModelInfo, isKnownModel, registerModel } from './chunk-VNZ3YTQD.js';
2
+ import './chunk-HCIHOHLX.js';
3
+ import './chunk-IR5HLBMH.js';
4
+ import './chunk-D275MCIH.js';
5
+ //# sourceMappingURL=model-discovery-AAJDHRFO.js.map
6
+ //# sourceMappingURL=model-discovery-AAJDHRFO.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"model-discovery-O64ZWPX5.js"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"model-discovery-AAJDHRFO.js"}
@@ -0,0 +1,8 @@
1
+ export { ClaudeNativeCLIAdapter, CodexNativeCLIAdapter, GeminiNativeCLIAdapter, KimiNativeCLIAdapter, logNativeAdapterSelection } from './chunk-PS4WEFW6.js';
2
+ import './chunk-VNZ3YTQD.js';
3
+ import './chunk-ZGOHARPV.js';
4
+ import './chunk-HCIHOHLX.js';
5
+ import './chunk-IR5HLBMH.js';
6
+ import './chunk-D275MCIH.js';
7
+ //# sourceMappingURL=native-cli-adapters-CLONTZOA.js.map
8
+ //# sourceMappingURL=native-cli-adapters-CLONTZOA.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"native-cli-adapters-JMZX2C2C.js"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"native-cli-adapters-CLONTZOA.js"}
@@ -0,0 +1,5 @@
1
+ export { OllamaAdapter } from './chunk-KIC7UI5U.js';
2
+ import './chunk-HCIHOHLX.js';
3
+ import './chunk-IR5HLBMH.js';
4
+ //# sourceMappingURL=ollama-adapter-2N5OQIEV.js.map
5
+ //# sourceMappingURL=ollama-adapter-2N5OQIEV.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"ollama-adapter-GE67BNSS.js"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"ollama-adapter-2N5OQIEV.js"}
@@ -1,3 +1,3 @@
1
- export { ensureDirectory, ensureSecureDirectory, findProjectRoot, getAemeathHome, getConfigDir, getConfigPath, getCredentialsPath, getDatabaseDir, getDatabasePath, getIPCSocketDir, getIPCSocketPath, getLogDir, getMCPConfigPath, getProjectAgentsPath, getProjectConfigDir, getProjectConfigPath, getProjectMCPConfigPath, getProjectSkillsDir, getTasksDir, getTeamsDir, getUniversalProjectSkillsDir, getUniversalUserSkillsDir, getUserSkillsDir, initializeDirectories } from './chunk-BY4DAKUU.js';
2
- //# sourceMappingURL=pathResolver-A6IXQQFE.js.map
3
- //# sourceMappingURL=pathResolver-A6IXQQFE.js.map
1
+ export { ensureDirectory, ensureSecureDirectory, findProjectRoot, getAemeathHome, getConfigDir, getConfigPath, getCredentialsPath, getDatabaseDir, getDatabasePath, getIPCSocketDir, getIPCSocketPath, getLogDir, getMCPConfigPath, getProjectAgentsPath, getProjectConfigDir, getProjectConfigPath, getProjectMCPConfigPath, getProjectSkillsDir, getTasksDir, getTeamsDir, getUniversalProjectSkillsDir, getUniversalUserSkillsDir, getUserSkillsDir, initializeDirectories } from './chunk-D275MCIH.js';
2
+ //# sourceMappingURL=pathResolver-UVAB2FCW.js.map
3
+ //# sourceMappingURL=pathResolver-UVAB2FCW.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"pathResolver-A6IXQQFE.js"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"pathResolver-UVAB2FCW.js"}
@@ -1,5 +1,5 @@
1
- import { CLI_PROVIDERS } from './chunk-CC7MGWYY.js';
2
- import { getAemeathHome } from './chunk-BY4DAKUU.js';
1
+ import { CLI_PROVIDERS } from './chunk-M3FPQSRU.js';
2
+ import { getAemeathHome } from './chunk-D275MCIH.js';
3
3
  import { existsSync, mkdirSync, readFileSync, readdirSync, writeFileSync } from 'fs';
4
4
  import { join, basename } from 'path';
5
5
  import { fileURLToPath } from 'url';
@@ -158,5 +158,5 @@ var ProfileLoader = class {
158
158
  };
159
159
 
160
160
  export { ProfileLoader };
161
- //# sourceMappingURL=profile-loader-TNAXBLDX.js.map
162
- //# sourceMappingURL=profile-loader-TNAXBLDX.js.map
161
+ //# sourceMappingURL=profile-loader-EMLV4J7S.js.map
162
+ //# sourceMappingURL=profile-loader-EMLV4J7S.js.map