abtars 0.3.3 → 0.3.4-alpha.1

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 (384) hide show
  1. package/bundle/{_registry.generated-7DRCE4V6.js → _registry.generated-ZJBAZMXN.js} +16 -15
  2. package/bundle/{_registry.generated-7DRCE4V6.js.map → _registry.generated-ZJBAZMXN.js.map} +1 -1
  3. package/bundle/abtars-browser.js +6 -5
  4. package/bundle/abtars-browser.js.map +1 -1
  5. package/bundle/abtars-cli.js +47 -39
  6. package/bundle/abtars-cli.js.map +2 -2
  7. package/bundle/abtars-restart.js +7 -7
  8. package/bundle/abtars-rss.js +2 -1
  9. package/bundle/abtars-rss.js.map +2 -2
  10. package/bundle/abtars-task.js +6 -5
  11. package/bundle/abtars-task.js.map +1 -1
  12. package/bundle/abtars-todo.js +2 -1
  13. package/bundle/abtars-todo.js.map +1 -1
  14. package/bundle/abtars.js +299 -209
  15. package/bundle/abtars.js.map +4 -4
  16. package/bundle/{acp-raw-client-AZJCEB6S.js → acp-raw-client-YTBGFN4S.js} +4 -3
  17. package/bundle/{acp-raw-client-AZJCEB6S.js.map → acp-raw-client-YTBGFN4S.js.map} +1 -1
  18. package/bundle/{action-gate-QYJL57IX.js → action-gate-YISTP773.js} +4 -3
  19. package/bundle/{action-gate-QYJL57IX.js.map → action-gate-YISTP773.js.map} +1 -1
  20. package/bundle/{agent-api-adapter-PYMNQXHE.js → agent-api-adapter-E4HWVJ32.js} +5 -4
  21. package/bundle/{agent-api-adapter-PYMNQXHE.js.map → agent-api-adapter-E4HWVJ32.js.map} +1 -1
  22. package/bundle/{agent-api-rate-limit-4GEZ4YN5.js → agent-api-rate-limit-VENFGOAD.js} +6 -5
  23. package/bundle/{agent-registry-563P4EUJ.js → agent-registry-DL7UT272.js} +9 -8
  24. package/bundle/bootstrap-V5MROD3X.js +62 -0
  25. package/bundle/bootstrap-V5MROD3X.js.map +7 -0
  26. package/bundle/{bridge-lock-transport-LXCF2IVN.js → bridge-lock-transport-BJAMHMXW.js} +6 -5
  27. package/bundle/{browser-2VZOGOGX.js → browser-PT54UWSW.js} +8 -7
  28. package/bundle/{budget-PPA7WY3D.js → budget-QNK6IIT6.js} +5 -4
  29. package/bundle/{budget-PPA7WY3D.js.map → budget-QNK6IIT6.js.map} +1 -1
  30. package/bundle/{capability-WXEA2WFK.js → capability-EKPGHQIO.js} +7 -6
  31. package/bundle/{chunk-C3EYYJN3.js → chunk-2BXXQG7P.js} +16 -4
  32. package/bundle/chunk-2BXXQG7P.js.map +7 -0
  33. package/bundle/{chunk-4PIVWXUJ.js → chunk-2ZD7VQRW.js} +2 -2
  34. package/bundle/{chunk-OY2HAK33.js → chunk-36ZEYDKZ.js} +1 -1
  35. package/bundle/chunk-36ZEYDKZ.js.map +7 -0
  36. package/bundle/{chunk-3QW2K53E.js → chunk-4IGLXZCC.js} +11 -19
  37. package/bundle/chunk-4IGLXZCC.js.map +7 -0
  38. package/bundle/{chunk-T7TAWGBX.js → chunk-52PQM4EZ.js} +2 -2
  39. package/bundle/{chunk-2RGR3LSV.js → chunk-5P5HF7IJ.js} +2 -2
  40. package/bundle/{chunk-LE23VPN3.js → chunk-63A7ZRIH.js} +4 -4
  41. package/bundle/{chunk-LE23VPN3.js.map → chunk-63A7ZRIH.js.map} +1 -1
  42. package/bundle/chunk-6IB3GVXK.js +77 -0
  43. package/bundle/chunk-6IB3GVXK.js.map +7 -0
  44. package/bundle/{chunk-OOKNHOCB.js → chunk-6S3G6GPO.js} +2 -2
  45. package/bundle/{chunk-E7MV7WFT.js → chunk-6VTHSN4V.js} +6 -6
  46. package/bundle/{chunk-NGZVJ52F.js → chunk-76YN7O3U.js} +7 -7
  47. package/bundle/{chunk-43DKPXTP.js → chunk-7LORCJCQ.js} +4 -4
  48. package/bundle/{chunk-HDOFJVFS.js → chunk-7OI46MH7.js} +3 -3
  49. package/bundle/{chunk-H2K23MOF.js → chunk-7XXISOHU.js} +21 -5
  50. package/bundle/chunk-7XXISOHU.js.map +7 -0
  51. package/bundle/{chunk-CB6S3ZRF.js → chunk-AFFW2LRY.js} +3 -3
  52. package/bundle/{chunk-TCI6FZTP.js → chunk-AHJDG6OM.js} +9 -9
  53. package/bundle/{chunk-NP72ZB7P.js → chunk-AMUJEP6L.js} +45 -45
  54. package/bundle/{chunk-NP72ZB7P.js.map → chunk-AMUJEP6L.js.map} +2 -2
  55. package/bundle/{chunk-BU7LTI2W.js → chunk-AWCO3DQ3.js} +6 -7
  56. package/bundle/chunk-AWCO3DQ3.js.map +7 -0
  57. package/bundle/{chunk-YME7NRGP.js → chunk-B2TIRDZC.js} +2 -2
  58. package/bundle/{chunk-SSCGWDIC.js → chunk-BWJ37KMW.js} +2 -2
  59. package/bundle/{chunk-ULO2PX3T.js → chunk-CCZ43JB7.js} +3 -3
  60. package/bundle/{chunk-FVUL44T4.js → chunk-CNENVY37.js} +2 -2
  61. package/bundle/{chunk-J5NOL4DB.js → chunk-DJOSXXM2.js} +2 -2
  62. package/bundle/{chunk-7RAGSHSH.js → chunk-DMDX35YT.js} +12 -10
  63. package/bundle/chunk-DMDX35YT.js.map +7 -0
  64. package/bundle/{chunk-DNDYD5SL.js → chunk-E7DZYCSF.js} +3 -3
  65. package/bundle/{chunk-M6Q3IQ4H.js → chunk-FF2F7ENH.js} +250 -118
  66. package/bundle/chunk-FF2F7ENH.js.map +7 -0
  67. package/bundle/{chunk-GCFIK6OB.js → chunk-FSGICOCX.js} +21 -21
  68. package/bundle/{chunk-IXKQ4JMX.js → chunk-GFAJSPMD.js} +33 -17
  69. package/bundle/chunk-GFAJSPMD.js.map +7 -0
  70. package/bundle/{chunk-FJF42RZY.js → chunk-GHRLO2UL.js} +3 -3
  71. package/bundle/{chunk-3LQOJVTB.js → chunk-HFOCNYEO.js} +1842 -1220
  72. package/bundle/{chunk-3LQOJVTB.js.map → chunk-HFOCNYEO.js.map} +4 -4
  73. package/bundle/{chunk-7WHXTCVD.js → chunk-HWFN7JGU.js} +2 -2
  74. package/bundle/{chunk-KBPVJGD7.js → chunk-IXGDDDAB.js} +3 -3
  75. package/bundle/chunk-JHLKEUHE.js +37 -0
  76. package/bundle/chunk-JHLKEUHE.js.map +7 -0
  77. package/bundle/{chunk-YEOZN5IE.js → chunk-JRGEEGZF.js} +2 -2
  78. package/bundle/{chunk-56D3Y44D.js → chunk-KLG4SCF7.js} +10 -10
  79. package/bundle/{chunk-ASYX43OU.js → chunk-LB43Q7G6.js} +26 -26
  80. package/bundle/{chunk-TVSPVZTX.js → chunk-LN5MNDSA.js} +3 -3
  81. package/bundle/{chunk-RJX45XIC.js → chunk-LPF2HELD.js} +9 -4
  82. package/bundle/chunk-LPF2HELD.js.map +7 -0
  83. package/bundle/{chunk-72T2Q7IG.js → chunk-MJACYH7A.js} +270 -282
  84. package/bundle/chunk-MJACYH7A.js.map +7 -0
  85. package/bundle/{chunk-SESM4GBM.js → chunk-MPQ2PJQX.js} +52 -25
  86. package/bundle/chunk-MPQ2PJQX.js.map +7 -0
  87. package/bundle/{chunk-FIAVVKGN.js → chunk-MTE32OQH.js} +3 -3
  88. package/bundle/{chunk-MV5KOWOR.js → chunk-N3Q3TASM.js} +7 -7
  89. package/bundle/{chunk-IQKADER4.js → chunk-O4YBJS2K.js} +2 -2
  90. package/bundle/{chunk-VJATH7AN.js → chunk-OOUCUCUW.js} +9 -8
  91. package/bundle/chunk-OOUCUCUW.js.map +7 -0
  92. package/bundle/{chunk-5V4VHKEA.js → chunk-OT6HLPEA.js} +3 -3
  93. package/bundle/{chunk-V6CV3QPH.js → chunk-OWPQIBAO.js} +2 -2
  94. package/bundle/{chunk-EDZGF6BC.js → chunk-QJPDBJDP.js} +11 -4
  95. package/bundle/chunk-QJPDBJDP.js.map +7 -0
  96. package/bundle/{chunk-N5VROZ7A.js → chunk-QMP2KC4W.js} +5 -5
  97. package/bundle/{chunk-4HNCOQSK.js → chunk-QOGZ7BFL.js} +7 -7
  98. package/bundle/{chunk-2LKQV2ND.js → chunk-R23FHZRY.js} +3 -3
  99. package/bundle/{chunk-SXNY6HC4.js → chunk-R4GYWVCR.js} +6 -6
  100. package/bundle/chunk-R4GYWVCR.js.map +7 -0
  101. package/bundle/{chunk-S7ZIGIR5.js → chunk-R76K6L6H.js} +27 -27
  102. package/bundle/{chunk-S7ZIGIR5.js.map → chunk-R76K6L6H.js.map} +1 -1
  103. package/bundle/{chunk-TY26WMQY.js → chunk-RCWQ34QR.js} +2 -2
  104. package/bundle/{chunk-MQJG7OJX.js → chunk-RJ2OUNFU.js} +38 -36
  105. package/bundle/chunk-RJ2OUNFU.js.map +7 -0
  106. package/bundle/{chunk-S6HEHCCG.js → chunk-RO3TAYBR.js} +83 -46
  107. package/bundle/chunk-RO3TAYBR.js.map +7 -0
  108. package/bundle/{chunk-ZOCEBV62.js → chunk-UU3RLJSD.js} +3 -3
  109. package/bundle/{chunk-P5O6QZDC.js → chunk-V7Y2LFO4.js} +10 -6
  110. package/bundle/chunk-V7Y2LFO4.js.map +7 -0
  111. package/bundle/{chunk-WP7FZHMI.js → chunk-W2PSVV2T.js} +2 -2
  112. package/bundle/{chunk-V2QIAXWZ.js → chunk-WEGFRA6G.js} +3 -3
  113. package/bundle/{chunk-ZY6DH2S4.js → chunk-WTIGZO3N.js} +80 -70
  114. package/bundle/chunk-WTIGZO3N.js.map +7 -0
  115. package/bundle/{chunk-O4GKI3Q3.js → chunk-X7DLKIQM.js} +4 -4
  116. package/bundle/{chunk-BNBC4T45.js → chunk-XZ4ZBDM5.js} +3 -3
  117. package/bundle/{chunk-24V4A6RP.js → chunk-YI2KSYB4.js} +4 -4
  118. package/bundle/{chunk-37EX63K4.js → chunk-YWHJJHJ2.js} +6998 -3621
  119. package/bundle/chunk-YWHJJHJ2.js.map +7 -0
  120. package/bundle/{chunk-IK4R3RBZ.js → chunk-YZCOA4DC.js} +3 -3
  121. package/bundle/{chunk-2FZJDMAF.js → chunk-ZGNSCJWH.js} +10 -10
  122. package/bundle/{chunk-W726UGI6.js → chunk-ZKMKAO75.js} +3 -3
  123. package/bundle/{chunk-WGWM4IZM.js → chunk-ZT5ZBGWS.js} +4 -4
  124. package/bundle/{chunk-WGWM4IZM.js.map → chunk-ZT5ZBGWS.js.map} +1 -1
  125. package/bundle/{commands-XXFU2ZF7.js → commands-2JQ5YTJX.js} +20 -20
  126. package/bundle/{config-EWDZ234X.js → config-ZEWIM5Z2.js} +8 -7
  127. package/bundle/{config-show-6J33O4TE.js → config-show-WBJPQPRD.js} +5 -5
  128. package/bundle/{context-OCS7HLJP.js → context-V75QNXB5.js} +5 -2
  129. package/bundle/{context-OCS7HLJP.js.map → context-V75QNXB5.js.map} +1 -1
  130. package/bundle/{daemon-LTDAXNA2.js → daemon-W7VQOSZC.js} +7 -7
  131. package/bundle/{delegation-tools-YDTWQMZD.js → delegation-tools-VGTRFQBF.js} +13 -11
  132. package/bundle/{registry-client-VN2MM2HI.js → deploy-5AGIULM2.js} +10 -6
  133. package/bundle/{deploy-lib-import-RGZJ3CGC.js → deploy-lib-import-ZBDYORN4.js} +5 -3
  134. package/bundle/{deps-PHSLIA77.js → deps-VB3S3RLF.js} +21 -19
  135. package/bundle/deps-VB3S3RLF.js.map +7 -0
  136. package/bundle/{direct-api-transport-OAKYQBJR.js → direct-api-transport-YSROTC35.js} +30 -28
  137. package/bundle/direct-api-transport-YSROTC35.js.map +7 -0
  138. package/bundle/{discord-adapter-WUNYPTDE.js → discord-adapter-LKBSIFLV.js} +26 -26
  139. package/bundle/{dist-7HEHHQI2.js → dist-KMK7TZGN.js} +376 -348
  140. package/bundle/dist-KMK7TZGN.js.map +7 -0
  141. package/bundle/{dns-wakeup-F55ALHXJ.js → dns-wakeup-KIURCCFJ.js} +4 -3
  142. package/bundle/{dns-wakeup-F55ALHXJ.js.map → dns-wakeup-KIURCCFJ.js.map} +1 -1
  143. package/bundle/{doctor-probes-3SLIUGKS.js → doctor-probes-46UKIROK.js} +4 -3
  144. package/bundle/{env-schema-MSDP2YBO.js → env-schema-YGHCKX5B.js} +5 -4
  145. package/bundle/{gossip-CS3G3447.js → gossip-VSEY2HSE.js} +7 -6
  146. package/bundle/{guardrails-24XK2COI.js → guardrails-U7M6H2GE.js} +6 -5
  147. package/bundle/{health-check-FRUNRVNQ.js → health-check-ASRLUJE5.js} +6 -2
  148. package/bundle/health-check-ASRLUJE5.js.map +7 -0
  149. package/bundle/{heartbeat-system-G4IFQXT6.js → heartbeat-system-MUXLT4E6.js} +7 -6
  150. package/bundle/{heartbeat-tier3-3ZO3EVXP.js → heartbeat-tier3-636ZMM4E.js} +45 -44
  151. package/bundle/heartbeat-tier3-636ZMM4E.js.map +7 -0
  152. package/bundle/{hook-system-X6INNJGV.js → hook-system-Z4XD6IM5.js} +5 -4
  153. package/bundle/{hotskills-6FQYTJIO.js → hotskills-AOUWVTQB.js} +7 -6
  154. package/bundle/{install-ZAHTZ5M5.js → install-3GGZUN22.js} +23 -20
  155. package/bundle/install-3GGZUN22.js.map +7 -0
  156. package/bundle/{install-manifest-QX7KVDCA.js → install-manifest-624KOB4S.js} +4 -3
  157. package/bundle/{install-manifest-QX7KVDCA.js.map → install-manifest-624KOB4S.js.map} +1 -1
  158. package/bundle/{irc-adapter-IEJQKKJF.js → irc-adapter-SA7GLJGR.js} +5 -4
  159. package/bundle/{irc-adapter-IEJQKKJF.js.map → irc-adapter-SA7GLJGR.js.map} +1 -1
  160. package/bundle/{irc-config-TTWNYFLH.js → irc-config-PG4X2I4M.js} +6 -5
  161. package/bundle/{irc-config-TTWNYFLH.js.map → irc-config-PG4X2I4M.js.map} +1 -1
  162. package/bundle/{kanban-board-J6RO3ZU7.js → kanban-board-4AI5Z6B5.js} +7 -5
  163. package/bundle/{kanban-channel-5EIXBFSA.js → kanban-channel-JMBYWGWD.js} +8 -6
  164. package/bundle/{lazy-require-V6EFUATC.js → lazy-require-GURNBC3C.js} +11 -6
  165. package/bundle/{logger-Y3VILPRH.js → logger-UQJPZMYV.js} +4 -3
  166. package/bundle/{logs-YS3GDURO.js → logs-2WTDLMB5.js} +5 -5
  167. package/bundle/{main-chat-YLZDNQPO.js → main-chat-EID5Y6H2.js} +6 -5
  168. package/bundle/{master-user-Z4M7KCJE.js → master-user-TKA7M2GL.js} +7 -6
  169. package/bundle/{media-utils-P6RZ2K3U.js → media-utils-X3UN342B.js} +44 -43
  170. package/bundle/{media-utils-P6RZ2K3U.js.map → media-utils-X3UN342B.js.map} +2 -2
  171. package/bundle/{message-pipeline-MHEBDJLH.js → message-pipeline-TAWXNEVS.js} +20 -20
  172. package/bundle/meta.json +9264 -8575
  173. package/bundle/{migrate-layout-RJJQLVGR.js → migrate-layout-KEAIIN26.js} +8 -4
  174. package/bundle/migrate-layout-KEAIIN26.js.map +7 -0
  175. package/bundle/{nerve-VZNMFDGY.js → nerve-TC34H4EL.js} +5 -4
  176. package/bundle/{notification-VV2OR6NW.js → notification-JQNVGICN.js} +8 -7
  177. package/bundle/{openrouter-credits-LXC7P4G6.js → openrouter-credits-5Q3EYWE5.js} +5 -4
  178. package/bundle/{openrouter-credits-LXC7P4G6.js.map → openrouter-credits-5Q3EYWE5.js.map} +1 -1
  179. package/bundle/{orc-KC4USP55.js → orc-74Z62W7B.js} +4 -4
  180. package/bundle/{orc-tools-CHRSXSAS.js → orc-tools-GME3DKIN.js} +5 -4
  181. package/bundle/{paths-EDK6KWHG.js → paths-BAUNPLNJ.js} +6 -2
  182. package/bundle/{paths-RZF6WDMG.js → paths-MZC2KU2C.js} +3 -2
  183. package/bundle/{peer-auth-SRONOLNG.js → peer-auth-VRO3JYL5.js} +9 -8
  184. package/bundle/{peer-client-VOF77T6C.js → peer-client-WLK5GZQS.js} +9 -8
  185. package/bundle/{peer-client-VOF77T6C.js.map → peer-client-WLK5GZQS.js.map} +1 -1
  186. package/bundle/{peer-config-FRWLEYQ5.js → peer-config-24WILLCJ.js} +6 -5
  187. package/bundle/{peer-jwt-XY3XRIA2.js → peer-jwt-ZR6RF3XM.js} +6 -5
  188. package/bundle/{peer-transport-UBBXTDRP.js → peer-transport-BK5VHI2M.js} +8 -7
  189. package/bundle/{phase-transport-4NQHZX75.js → phase-transport-7QJM7J6V.js} +18 -16
  190. package/bundle/{reconcile-2EUXJ6W5.js → reconcile-7N7OE2GU.js} +5 -4
  191. package/bundle/{reconciler-FFQGV4DO.js → reconciler-7LOOUK43.js} +13 -11
  192. package/bundle/{reconciler-FFQGV4DO.js.map → reconciler-7LOOUK43.js.map} +1 -1
  193. package/bundle/{restore-NFDE2RG6.js → restore-MENZ3I3K.js} +13 -9
  194. package/bundle/{restore-NFDE2RG6.js.map → restore-MENZ3I3K.js.map} +3 -3
  195. package/bundle/{rollback-MVZ53XS4.js → rollback-JOHY6KWW.js} +5 -5
  196. package/bundle/{chunk-SKY6656M.js → sandbox-runtime-T7RF4WJD.js} +11 -28
  197. package/bundle/{chunk-SKY6656M.js.map → sandbox-runtime-T7RF4WJD.js.map} +1 -1
  198. package/bundle/{self-healer-utils-KD6LV63S.js → self-healer-utils-OR2N6RLD.js} +5 -4
  199. package/bundle/{self-healer-utils-KD6LV63S.js.map → self-healer-utils-OR2N6RLD.js.map} +1 -1
  200. package/bundle/{sha-tracker-2DB4R2TW.js → sha-tracker-BXOLWZJL.js} +5 -4
  201. package/bundle/{skill-session-BPDVA6ZG.js → skill-session-H6EQ4NGN.js} +5 -4
  202. package/bundle/{skill-session-BPDVA6ZG.js.map → skill-session-H6EQ4NGN.js.map} +1 -1
  203. package/bundle/{skill-stats-TPD2NROA.js → skill-stats-7O777ZSZ.js} +6 -5
  204. package/bundle/{skill-watcher-D7QYYYON.js → skill-watcher-ZGLTDPG5.js} +6 -5
  205. package/bundle/{sleep-GH6DLBJJ.js → sleep-3LFZH727.js} +10 -9
  206. package/bundle/{soul-bundle-GXLMDBCC.js → soul-bundle-RQ2YQMJW.js} +10 -9
  207. package/bundle/{spin-4DBYHS3E.js → spin-76K4R6FK.js} +12 -10
  208. package/bundle/{spin-notifications-IKYJPER5.js → spin-notifications-LD46B4K5.js} +7 -5
  209. package/bundle/{spin-notifications-IKYJPER5.js.map → spin-notifications-LD46B4K5.js.map} +1 -1
  210. package/bundle/{spin-types-PLJH3SIK.js → spin-types-MOKTZXGB.js} +5 -4
  211. package/bundle/{src-SUFZ27S5.js → src-6BTCMOD3.js} +4 -4
  212. package/bundle/{sse-parser-anthropic-U7ILHOY5.js → sse-parser-anthropic-NV2CGBIT.js} +5 -4
  213. package/bundle/{sse-parser-anthropic-U7ILHOY5.js.map → sse-parser-anthropic-NV2CGBIT.js.map} +1 -1
  214. package/bundle/{sse-parser-responses-OI73R3AH.js → sse-parser-responses-FC3PFHQ5.js} +5 -4
  215. package/bundle/{sse-parser-responses-OI73R3AH.js.map → sse-parser-responses-FC3PFHQ5.js.map} +1 -1
  216. package/bundle/{ssrf-guard-6GP4QYVA.js → ssrf-guard-E2YPLW6G.js} +5 -4
  217. package/bundle/{ssrf-guard-6GP4QYVA.js.map → ssrf-guard-E2YPLW6G.js.map} +1 -1
  218. package/bundle/{start-JT2BPMSW.js → start-HPO5LYJP.js} +5 -5
  219. package/bundle/start-HPO5LYJP.js.map +7 -0
  220. package/bundle/{stt-KD3AABKG.js → stt-UE7EOYD7.js} +6 -5
  221. package/bundle/{subagent-runtime-LVECAUPV.js → subagent-runtime-4X3UHF4H.js} +6 -5
  222. package/bundle/system-status-PLPWV4RF.js +346 -0
  223. package/bundle/system-status-PLPWV4RF.js.map +7 -0
  224. package/bundle/{task-store-2XRDM3AW.js → task-store-RAFMDQ7N.js} +6 -5
  225. package/bundle/{telegram-adapter-UJ3RYYV6.js → telegram-adapter-PPXKTGOP.js} +35 -35
  226. package/bundle/{tool-registry-YU6WBXPA.js → tool-registry-NKIPNJZ5.js} +25 -23
  227. package/bundle/{tool-sandbox-RNNPDR5M.js → tool-sandbox-DQCP3UTU.js} +6 -5
  228. package/bundle/{transport-config-OK3MZPJK.js → transport-config-SF6GBV47.js} +9 -8
  229. package/bundle/{update-ENNPRW7Y.js → update-QOOGMFSJ.js} +6 -6
  230. package/bundle/{update-check-SJB6GV3A.js → update-check-LPZG3K5P.js} +3 -2
  231. package/bundle/{update-check-SJB6GV3A.js.map → update-check-LPZG3K5P.js.map} +1 -1
  232. package/bundle/{usage-tracker-HRSGC7QC.js → usage-tracker-TBDM4KE6.js} +2 -2
  233. package/bundle/{user-registry-6PUJJ5J2.js → user-registry-OYJVAHDD.js} +6 -5
  234. package/bundle/{wrapper-WLHLG4MI.js → wrapper-W66YICNZ.js} +3 -3
  235. package/bundle/{ws-peer-client-WHW3RJTD.js → ws-peer-client-G5QHOF6K.js} +15 -14
  236. package/bundle/{ws-peer-client-WHW3RJTD.js.map → ws-peer-client-G5QHOF6K.js.map} +2 -2
  237. package/package.json +3 -7
  238. package/scripts/emergency-deploy.sh +11 -8
  239. package/scripts/emergency-update.sh +156 -23
  240. package/templates/config/.env +1 -1
  241. package/templates/config/models.json +13 -0
  242. package/bundle/chunk-37EX63K4.js.map +0 -7
  243. package/bundle/chunk-3QW2K53E.js.map +0 -7
  244. package/bundle/chunk-72T2Q7IG.js.map +0 -7
  245. package/bundle/chunk-7RAGSHSH.js.map +0 -7
  246. package/bundle/chunk-BU7LTI2W.js.map +0 -7
  247. package/bundle/chunk-C3EYYJN3.js.map +0 -7
  248. package/bundle/chunk-CAOIIVFP.js +0 -110
  249. package/bundle/chunk-CAOIIVFP.js.map +0 -7
  250. package/bundle/chunk-EDZGF6BC.js.map +0 -7
  251. package/bundle/chunk-H2K23MOF.js.map +0 -7
  252. package/bundle/chunk-HAZHNBBY.js +0 -156
  253. package/bundle/chunk-HAZHNBBY.js.map +0 -7
  254. package/bundle/chunk-IXKQ4JMX.js.map +0 -7
  255. package/bundle/chunk-JAJ3DUQ2.js +0 -30
  256. package/bundle/chunk-JAJ3DUQ2.js.map +0 -7
  257. package/bundle/chunk-KMFR5AVY.js +0 -45
  258. package/bundle/chunk-KMFR5AVY.js.map +0 -7
  259. package/bundle/chunk-M6Q3IQ4H.js.map +0 -7
  260. package/bundle/chunk-MQJG7OJX.js.map +0 -7
  261. package/bundle/chunk-OY2HAK33.js.map +0 -7
  262. package/bundle/chunk-P5O6QZDC.js.map +0 -7
  263. package/bundle/chunk-RJX45XIC.js.map +0 -7
  264. package/bundle/chunk-S6HEHCCG.js.map +0 -7
  265. package/bundle/chunk-SESM4GBM.js.map +0 -7
  266. package/bundle/chunk-SXNY6HC4.js.map +0 -7
  267. package/bundle/chunk-VJATH7AN.js.map +0 -7
  268. package/bundle/chunk-ZY6DH2S4.js.map +0 -7
  269. package/bundle/deps-PHSLIA77.js.map +0 -7
  270. package/bundle/direct-api-transport-OAKYQBJR.js.map +0 -7
  271. package/bundle/dist-7HEHHQI2.js.map +0 -7
  272. package/bundle/health-check-FRUNRVNQ.js.map +0 -7
  273. package/bundle/heartbeat-tier3-3ZO3EVXP.js.map +0 -7
  274. package/bundle/install-ZAHTZ5M5.js.map +0 -7
  275. package/bundle/migrate-layout-RJJQLVGR.js.map +0 -7
  276. package/bundle/phase-config-V4XETN5F.js +0 -18
  277. package/bundle/sandbox-runtime-WHACQLLN.js +0 -22
  278. package/bundle/start-JT2BPMSW.js.map +0 -7
  279. package/bundle/system-status-XXJWTVJN.js +0 -243
  280. package/bundle/system-status-XXJWTVJN.js.map +0 -7
  281. package/bundle/user-registry-6PUJJ5J2.js.map +0 -7
  282. package/bundle/wrapper-WLHLG4MI.js.map +0 -7
  283. /package/bundle/{agent-api-rate-limit-4GEZ4YN5.js.map → agent-api-rate-limit-VENFGOAD.js.map} +0 -0
  284. /package/bundle/{agent-registry-563P4EUJ.js.map → agent-registry-DL7UT272.js.map} +0 -0
  285. /package/bundle/{bridge-lock-transport-LXCF2IVN.js.map → bridge-lock-transport-BJAMHMXW.js.map} +0 -0
  286. /package/bundle/{browser-2VZOGOGX.js.map → browser-PT54UWSW.js.map} +0 -0
  287. /package/bundle/{capability-WXEA2WFK.js.map → capability-EKPGHQIO.js.map} +0 -0
  288. /package/bundle/{chunk-4PIVWXUJ.js.map → chunk-2ZD7VQRW.js.map} +0 -0
  289. /package/bundle/{chunk-T7TAWGBX.js.map → chunk-52PQM4EZ.js.map} +0 -0
  290. /package/bundle/{chunk-2RGR3LSV.js.map → chunk-5P5HF7IJ.js.map} +0 -0
  291. /package/bundle/{chunk-OOKNHOCB.js.map → chunk-6S3G6GPO.js.map} +0 -0
  292. /package/bundle/{chunk-E7MV7WFT.js.map → chunk-6VTHSN4V.js.map} +0 -0
  293. /package/bundle/{chunk-NGZVJ52F.js.map → chunk-76YN7O3U.js.map} +0 -0
  294. /package/bundle/{chunk-43DKPXTP.js.map → chunk-7LORCJCQ.js.map} +0 -0
  295. /package/bundle/{chunk-HDOFJVFS.js.map → chunk-7OI46MH7.js.map} +0 -0
  296. /package/bundle/{chunk-CB6S3ZRF.js.map → chunk-AFFW2LRY.js.map} +0 -0
  297. /package/bundle/{chunk-TCI6FZTP.js.map → chunk-AHJDG6OM.js.map} +0 -0
  298. /package/bundle/{chunk-YME7NRGP.js.map → chunk-B2TIRDZC.js.map} +0 -0
  299. /package/bundle/{chunk-SSCGWDIC.js.map → chunk-BWJ37KMW.js.map} +0 -0
  300. /package/bundle/{chunk-ULO2PX3T.js.map → chunk-CCZ43JB7.js.map} +0 -0
  301. /package/bundle/{chunk-FVUL44T4.js.map → chunk-CNENVY37.js.map} +0 -0
  302. /package/bundle/{chunk-J5NOL4DB.js.map → chunk-DJOSXXM2.js.map} +0 -0
  303. /package/bundle/{chunk-DNDYD5SL.js.map → chunk-E7DZYCSF.js.map} +0 -0
  304. /package/bundle/{chunk-GCFIK6OB.js.map → chunk-FSGICOCX.js.map} +0 -0
  305. /package/bundle/{chunk-FJF42RZY.js.map → chunk-GHRLO2UL.js.map} +0 -0
  306. /package/bundle/{chunk-7WHXTCVD.js.map → chunk-HWFN7JGU.js.map} +0 -0
  307. /package/bundle/{chunk-KBPVJGD7.js.map → chunk-IXGDDDAB.js.map} +0 -0
  308. /package/bundle/{chunk-YEOZN5IE.js.map → chunk-JRGEEGZF.js.map} +0 -0
  309. /package/bundle/{chunk-56D3Y44D.js.map → chunk-KLG4SCF7.js.map} +0 -0
  310. /package/bundle/{chunk-ASYX43OU.js.map → chunk-LB43Q7G6.js.map} +0 -0
  311. /package/bundle/{chunk-TVSPVZTX.js.map → chunk-LN5MNDSA.js.map} +0 -0
  312. /package/bundle/{chunk-FIAVVKGN.js.map → chunk-MTE32OQH.js.map} +0 -0
  313. /package/bundle/{chunk-MV5KOWOR.js.map → chunk-N3Q3TASM.js.map} +0 -0
  314. /package/bundle/{chunk-IQKADER4.js.map → chunk-O4YBJS2K.js.map} +0 -0
  315. /package/bundle/{chunk-5V4VHKEA.js.map → chunk-OT6HLPEA.js.map} +0 -0
  316. /package/bundle/{chunk-V6CV3QPH.js.map → chunk-OWPQIBAO.js.map} +0 -0
  317. /package/bundle/{chunk-N5VROZ7A.js.map → chunk-QMP2KC4W.js.map} +0 -0
  318. /package/bundle/{chunk-4HNCOQSK.js.map → chunk-QOGZ7BFL.js.map} +0 -0
  319. /package/bundle/{chunk-2LKQV2ND.js.map → chunk-R23FHZRY.js.map} +0 -0
  320. /package/bundle/{chunk-TY26WMQY.js.map → chunk-RCWQ34QR.js.map} +0 -0
  321. /package/bundle/{chunk-ZOCEBV62.js.map → chunk-UU3RLJSD.js.map} +0 -0
  322. /package/bundle/{chunk-WP7FZHMI.js.map → chunk-W2PSVV2T.js.map} +0 -0
  323. /package/bundle/{chunk-V2QIAXWZ.js.map → chunk-WEGFRA6G.js.map} +0 -0
  324. /package/bundle/{chunk-O4GKI3Q3.js.map → chunk-X7DLKIQM.js.map} +0 -0
  325. /package/bundle/{chunk-BNBC4T45.js.map → chunk-XZ4ZBDM5.js.map} +0 -0
  326. /package/bundle/{chunk-24V4A6RP.js.map → chunk-YI2KSYB4.js.map} +0 -0
  327. /package/bundle/{chunk-IK4R3RBZ.js.map → chunk-YZCOA4DC.js.map} +0 -0
  328. /package/bundle/{chunk-2FZJDMAF.js.map → chunk-ZGNSCJWH.js.map} +0 -0
  329. /package/bundle/{chunk-W726UGI6.js.map → chunk-ZKMKAO75.js.map} +0 -0
  330. /package/bundle/{commands-XXFU2ZF7.js.map → commands-2JQ5YTJX.js.map} +0 -0
  331. /package/bundle/{config-EWDZ234X.js.map → config-ZEWIM5Z2.js.map} +0 -0
  332. /package/bundle/{config-show-6J33O4TE.js.map → config-show-WBJPQPRD.js.map} +0 -0
  333. /package/bundle/{daemon-LTDAXNA2.js.map → daemon-W7VQOSZC.js.map} +0 -0
  334. /package/bundle/{delegation-tools-YDTWQMZD.js.map → delegation-tools-VGTRFQBF.js.map} +0 -0
  335. /package/bundle/{deploy-lib-import-RGZJ3CGC.js.map → deploy-5AGIULM2.js.map} +0 -0
  336. /package/bundle/{doctor-probes-3SLIUGKS.js.map → deploy-lib-import-ZBDYORN4.js.map} +0 -0
  337. /package/bundle/{discord-adapter-WUNYPTDE.js.map → discord-adapter-LKBSIFLV.js.map} +0 -0
  338. /package/bundle/{env-schema-MSDP2YBO.js.map → doctor-probes-46UKIROK.js.map} +0 -0
  339. /package/bundle/{gossip-CS3G3447.js.map → env-schema-YGHCKX5B.js.map} +0 -0
  340. /package/bundle/{guardrails-24XK2COI.js.map → gossip-VSEY2HSE.js.map} +0 -0
  341. /package/bundle/{heartbeat-system-G4IFQXT6.js.map → guardrails-U7M6H2GE.js.map} +0 -0
  342. /package/bundle/{hook-system-X6INNJGV.js.map → heartbeat-system-MUXLT4E6.js.map} +0 -0
  343. /package/bundle/{hotskills-6FQYTJIO.js.map → hook-system-Z4XD6IM5.js.map} +0 -0
  344. /package/bundle/{kanban-board-J6RO3ZU7.js.map → hotskills-AOUWVTQB.js.map} +0 -0
  345. /package/bundle/{kanban-channel-5EIXBFSA.js.map → kanban-board-4AI5Z6B5.js.map} +0 -0
  346. /package/bundle/{lazy-require-V6EFUATC.js.map → kanban-channel-JMBYWGWD.js.map} +0 -0
  347. /package/bundle/{logger-Y3VILPRH.js.map → lazy-require-GURNBC3C.js.map} +0 -0
  348. /package/bundle/{main-chat-YLZDNQPO.js.map → logger-UQJPZMYV.js.map} +0 -0
  349. /package/bundle/{logs-YS3GDURO.js.map → logs-2WTDLMB5.js.map} +0 -0
  350. /package/bundle/{master-user-Z4M7KCJE.js.map → main-chat-EID5Y6H2.js.map} +0 -0
  351. /package/bundle/{message-pipeline-MHEBDJLH.js.map → master-user-TKA7M2GL.js.map} +0 -0
  352. /package/bundle/{nerve-VZNMFDGY.js.map → message-pipeline-TAWXNEVS.js.map} +0 -0
  353. /package/bundle/{notification-VV2OR6NW.js.map → nerve-TC34H4EL.js.map} +0 -0
  354. /package/bundle/{orc-tools-CHRSXSAS.js.map → notification-JQNVGICN.js.map} +0 -0
  355. /package/bundle/{orc-KC4USP55.js.map → orc-74Z62W7B.js.map} +0 -0
  356. /package/bundle/{paths-EDK6KWHG.js.map → orc-tools-GME3DKIN.js.map} +0 -0
  357. /package/bundle/{paths-RZF6WDMG.js.map → paths-BAUNPLNJ.js.map} +0 -0
  358. /package/bundle/{peer-auth-SRONOLNG.js.map → paths-MZC2KU2C.js.map} +0 -0
  359. /package/bundle/{peer-config-FRWLEYQ5.js.map → peer-auth-VRO3JYL5.js.map} +0 -0
  360. /package/bundle/{peer-jwt-XY3XRIA2.js.map → peer-config-24WILLCJ.js.map} +0 -0
  361. /package/bundle/{peer-transport-UBBXTDRP.js.map → peer-jwt-ZR6RF3XM.js.map} +0 -0
  362. /package/bundle/{phase-config-V4XETN5F.js.map → peer-transport-BK5VHI2M.js.map} +0 -0
  363. /package/bundle/{phase-transport-4NQHZX75.js.map → phase-transport-7QJM7J6V.js.map} +0 -0
  364. /package/bundle/{reconcile-2EUXJ6W5.js.map → reconcile-7N7OE2GU.js.map} +0 -0
  365. /package/bundle/{registry-client-VN2MM2HI.js.map → rollback-JOHY6KWW.js.map} +0 -0
  366. /package/bundle/{rollback-MVZ53XS4.js.map → sha-tracker-BXOLWZJL.js.map} +0 -0
  367. /package/bundle/{sandbox-runtime-WHACQLLN.js.map → skill-stats-7O777ZSZ.js.map} +0 -0
  368. /package/bundle/{sha-tracker-2DB4R2TW.js.map → skill-watcher-ZGLTDPG5.js.map} +0 -0
  369. /package/bundle/{skill-stats-TPD2NROA.js.map → sleep-3LFZH727.js.map} +0 -0
  370. /package/bundle/{skill-watcher-D7QYYYON.js.map → soul-bundle-RQ2YQMJW.js.map} +0 -0
  371. /package/bundle/{sleep-GH6DLBJJ.js.map → spin-76K4R6FK.js.map} +0 -0
  372. /package/bundle/{soul-bundle-GXLMDBCC.js.map → spin-types-MOKTZXGB.js.map} +0 -0
  373. /package/bundle/{spin-4DBYHS3E.js.map → src-6BTCMOD3.js.map} +0 -0
  374. /package/bundle/{spin-types-PLJH3SIK.js.map → stt-UE7EOYD7.js.map} +0 -0
  375. /package/bundle/{src-SUFZ27S5.js.map → subagent-runtime-4X3UHF4H.js.map} +0 -0
  376. /package/bundle/{stt-KD3AABKG.js.map → task-store-RAFMDQ7N.js.map} +0 -0
  377. /package/bundle/{telegram-adapter-UJ3RYYV6.js.map → telegram-adapter-PPXKTGOP.js.map} +0 -0
  378. /package/bundle/{subagent-runtime-LVECAUPV.js.map → tool-registry-NKIPNJZ5.js.map} +0 -0
  379. /package/bundle/{task-store-2XRDM3AW.js.map → tool-sandbox-DQCP3UTU.js.map} +0 -0
  380. /package/bundle/{tool-registry-YU6WBXPA.js.map → transport-config-SF6GBV47.js.map} +0 -0
  381. /package/bundle/{tool-sandbox-RNNPDR5M.js.map → update-QOOGMFSJ.js.map} +0 -0
  382. /package/bundle/{transport-config-OK3MZPJK.js.map → usage-tracker-TBDM4KE6.js.map} +0 -0
  383. /package/bundle/{update-ENNPRW7Y.js.map → user-registry-OYJVAHDD.js.map} +0 -0
  384. /package/bundle/{usage-tracker-HRSGC7QC.js.map → wrapper-W66YICNZ.js.map} +0 -0
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/components/peer-transport/http-transport.ts", "../src/components/peer-transport/index.ts"],
4
- "sourcesContent": ["/**\n * peer-transport/http-transport.ts \u2014 HTTP implementation of PeerTransport (#911).\n *\n * Wraps existing peer-client.ts (JWT auth, TLS, Ed25519 signing) behind the\n * PeerTransport interface. discover() reads peers.json (static).\n */\n\nimport type { PeerTransport, PeerCard, PeerMessage, TaskResult } from \"./interface.js\";\nimport { getAlivePeers } from \"./gossip.js\";\nimport { loadPeerConfig, type PeerEntry } from \"../peer-config.js\";\nimport { logInfo, logDebug, logTrace } from \"../logger.js\";\nimport type { WsPeerClient } from \"./ws-peer-client.js\";\n\nconst TAG = \"http-transport\";\n\nexport class HttpTransport implements PeerTransport {\n private handlers: Array<(from: string, message: PeerMessage) => void> = [];\n private wsClients = new Map<string, WsPeerClient>();\n\n /** Init WS connections for all ws-outbound peers. Call on boot. */\n async initWsConnections(): Promise<void> {\n const config = loadPeerConfig();\n const { WsPeerClient: Client } = await import(\"./ws-peer-client.js\");\n for (const [name, entry] of Object.entries(config.peers)) {\n if (entry.transport !== \"ws-outbound\") continue;\n const client = new Client(name, entry);\n client.onPush((method, payload) => {\n if (method === \"callback\") {\n // Inbound callback from peer \u2014 fire as if it arrived via HTTP /v1/callbacks\n const p = payload as { task_id: number; status: string; result_summary?: string; error?: string; tokens_used?: number };\n import(\"../tasks/kanban-board.js\").then(({ kanbanList, kanbanComplete, kanbanFail, kanbanAddTokens }) => {\n const cards = kanbanList(\"running\", \"status\").filter(c => {\n if (c.type !== \"remote\") return false;\n try { const m = JSON.parse(c.notes ?? \"{}\"); return m.peer === name && m.remote_task_id === p.task_id; } catch { return false; }\n });\n if (!cards.length) return;\n const card = cards[0]!;\n if (p.tokens_used) kanbanAddTokens(card.id, p.tokens_used);\n if (p.status === \"done\") kanbanComplete(card.id, undefined, p.result_summary);\n else kanbanFail(card.id, p.error ?? \"remote failure\");\n import(\"../nerve.js\").then(({ nerve }) => nerve.emit(p.status === \"done\" ? \"card:done\" : \"card:failed\", card.id));\n }).catch(() => {});\n } else if (method === \"channel\") {\n // Inbound channel message from peer\n const p = payload as { card_id: number; from_agent: string; message: string; created_at: string };\n import(\"../tasks/kanban-channel.js\").then(({ channelPost }) => {\n channelPost(p.card_id, p.from_agent, \"ALL\", p.message);\n }).catch(() => {});\n }\n for (const h of this.handlers) h(name, { type: method as any, payload: payload as any });\n });\n client.connect();\n this.wsClients.set(name, client);\n logInfo(TAG, `WS outbound: connecting to ${name}`);\n }\n }\n\n /** Check if a peer is reachable via WS. */\n hasWsConnection(peer: string): boolean {\n return this.wsClients.get(peer)?.connected ?? false;\n }\n\n /** Send via WS if available, otherwise fall back to HTTP. */\n private async wsOrHttp(peer: string, method: string, payload: unknown, httpFallback: () => Promise<unknown>): Promise<unknown> {\n const ws = this.wsClients.get(peer);\n if (ws?.connected) {\n return ws.send(method, payload);\n }\n return httpFallback();\n }\n\n discover(): PeerCard[] {\n return getAlivePeers();\n }\n\n async send(peer: string, message: PeerMessage): Promise<unknown> {\n if (message.type === \"ask\") {\n const { callPeer } = await import(\"../peer-client.js\");\n const config = loadPeerConfig();\n return callPeer(peer, message.payload.prompt as string, config.maxHops);\n }\n if (message.type === \"task\" && message.payload.action === \"callback\") {\n const config = loadPeerConfig();\n const entry = resolvePeer(config.peers, peer);\n logDebug(TAG, `\u2192 callback ${peer}: task_id=${message.payload.task_id} status=${message.payload.status}`);\n logTrace(TAG, `\u2192 callback ${peer} result: ${String(message.payload.result_summary ?? \"\").slice(0, 200)}`);\n const payload: Record<string, unknown> = { task_id: message.payload.task_id, status: message.payload.status, result_summary: message.payload.result_summary, error: message.payload.error };\n if (message.payload.artifacts) payload.artifacts = message.payload.artifacts;\n\n // #972: Push via WS if connected\n const ws = this.wsClients.get(peer);\n if (ws?.connected) {\n await ws.send(\"callback\", payload);\n logInfo(TAG, `CALLBACK ${peer} (ws) task_id=${message.payload.task_id}`);\n return;\n }\n\n const body = JSON.stringify(payload);\n return this.httpCall(entry, peer, \"POST\", \"/v1/callbacks\", body);\n }\n if (message.type === \"task\") return this.delegateTask(peer, message.payload.goal as string, message.payload as any);\n if (message.type === \"check\") return this.checkTask(peer, message.payload.taskId as number);\n if (message.type === \"terminate\") return this.terminateTask(peer, message.payload.taskId as number);\n throw new Error(`Unknown message type: ${message.type}`);\n }\n\n async broadcast(message: PeerMessage): Promise<void> {\n const peers = this.discover();\n await Promise.allSettled(peers.map(p => this.send(p.name, message)));\n }\n\n onMessage(handler: (from: string, message: PeerMessage) => void): void {\n this.handlers.push(handler);\n }\n\n /** Called by agent-api-server when an inbound peer message arrives. */\n dispatchInbound(from: string, message: PeerMessage): void {\n for (const h of this.handlers) { try { h(from, message); } catch {} }\n }\n\n async delegateTask(peer: string, goal: string, opts?: { priority?: string; context?: string; artifacts?: Array<{ name: string; content: string }> }): Promise<{ taskId: number; remoteSessionId?: string }> {\n const config = loadPeerConfig();\n const entry = resolvePeer(config.peers, peer);\n\n // Callback: remote peer looks us up in its peers.json by name\n\n logDebug(TAG, `\u2192 peer_delegate ${peer}: priority=${opts?.priority ?? \"MEDIUM\"}, goal=${goal.length}ch`);\n logTrace(TAG, `\u2192 peer_delegate ${peer} goal: ${goal.slice(0, 300)}`);\n\n // Size guard for artifacts (#928)\n if (opts?.artifacts?.length) {\n const MAX_SINGLE = 1_400_000; // 1.4MB base64 per artifact\n const MAX_TOTAL = 5_000_000; // 5MB total\n let total = 0;\n for (const a of opts.artifacts) {\n if (a.content.length > MAX_SINGLE) throw new Error(`Artifact '${a.name}' exceeds 1.4MB limit (${a.content.length} bytes)`);\n total += a.content.length;\n }\n if (total > MAX_TOTAL) throw new Error(`Total artifacts exceed 5MB limit (${total} bytes)`);\n }\n\n const payload: Record<string, unknown> = { goal, priority: opts?.priority ?? \"MEDIUM\", context: opts?.context, callback_peer: config.self.name };\n if (opts?.artifacts?.length) payload.artifacts = opts.artifacts;\n\n // #972: Route via WS if connected, otherwise HTTP\n const ws = this.wsClients.get(peer);\n if (ws?.connected) {\n const result = await ws.send(\"delegate\", payload) as any;\n logInfo(TAG, `PEER_DELEGATE ${peer} (ws) \u2192 remote#${result.taskId} (${goal.length}ch)`);\n return { taskId: result.taskId, remoteSessionId: result.session_id };\n }\n\n const body = JSON.stringify(payload);\n const response = await this.httpCall(entry, peer, \"POST\", \"/v1/tasks\", body);\n const parsed = JSON.parse(response);\n logInfo(TAG, `PEER_DELEGATE ${peer} \u2192 remote#${parsed.task_id} (${goal.length}ch)`);\n return { taskId: parsed.task_id, remoteSessionId: parsed.session_id };\n }\n\n async checkTask(peer: string, taskId: number): Promise<TaskResult> {\n const config = loadPeerConfig();\n const entry = resolvePeer(config.peers, peer);\n logDebug(TAG, `\u2192 peer_check ${peer}#${taskId}`);\n const response = await this.httpCall(entry, peer, \"GET\", `/v1/tasks/${taskId}`);\n const parsed = JSON.parse(response);\n logDebug(TAG, `\u2190 peer_check ${peer}#${taskId}: status=${parsed.status}`);\n logTrace(TAG, `\u2190 peer_check ${peer}#${taskId} result: ${(parsed.result_summary ?? \"\").slice(0, 200)}`);\n return {\n taskId: parsed.id ?? taskId,\n status: parsed.status,\n result: parsed.result_summary,\n error: parsed.error,\n tokensUsed: parsed.tokens_used,\n };\n }\n\n async terminateTask(peer: string, taskId: number): Promise<void> {\n const config = loadPeerConfig();\n const entry = resolvePeer(config.peers, peer);\n logDebug(TAG, `\u2192 peer_terminate ${peer}#${taskId}`);\n await this.httpCall(entry, peer, \"DELETE\", `/v1/tasks/${taskId}`);\n logInfo(TAG, `PEER_TERMINATE ${peer}#${taskId}`);\n }\n\n /** #949: Push a channel message to a remote peer. */\n async pushChannelMessage(peer: string, cardId: number, from: string, message: string, createdAt: string): Promise<void> {\n const config = loadPeerConfig();\n const entry = resolvePeer(config.peers, peer);\n await this.httpCall(entry, peer, \"POST\", `/v1/tasks/${cardId}/messages`, JSON.stringify({ from_agent: from, message, created_at: createdAt }));\n }\n\n private async httpCall(entry: PeerEntry, peerName: string, method: string, path: string, body?: string): Promise<string> {\n const { mintPeerJwt, signBody, tlsOptions } = await import(\"./peer-auth.js\");\n const jwt = mintPeerJwt(peerName);\n const finalBody = body ? await signBody(peerName, body) : undefined;\n const tls = tlsOptions(entry);\n const http = await import(\"node:https\");\n\n return new Promise((resolve, reject) => {\n const headers: Record<string, string> = {\n \"Authorization\": `Bearer ${jwt}`,\n \"Content-Type\": \"application/json\",\n };\n if (finalBody) headers[\"Content-Length\"] = String(Buffer.byteLength(finalBody));\n\n const req = http.request({\n hostname: entry.host,\n port: entry.port,\n path,\n method,\n headers,\n timeout: 60_000,\n ...tls,\n } as any, (res: any) => {\n let data = \"\";\n res.on(\"data\", (c: any) => data += c);\n res.on(\"end\", () => {\n if (res.statusCode >= 400) {\n reject(new Error(`Peer ${peerName} returned ${res.statusCode}: ${data.slice(0, 200)}`));\n return;\n }\n resolve(data);\n });\n });\n req.on(\"timeout\", () => { req.destroy(); reject(new Error(`Peer ${peerName} timeout`)); });\n req.on(\"error\", (err: Error) => reject(new Error(`Peer ${peerName} unreachable: ${err.message}`)));\n if (finalBody) req.write(finalBody);\n req.end();\n });\n }\n}\n\nfunction resolvePeer(peers: Record<string, PeerEntry>, name: string): PeerEntry {\n const key = Object.keys(peers).find(k => k.toLowerCase() === name.toLowerCase());\n if (!key || !peers[key]) throw new Error(`Unknown peer '${name}'. Available: ${Object.keys(peers).join(\", \")}`);\n return peers[key];\n}\n", "/**\n * peer-transport/index.ts \u2014 Factory + singleton (#911).\n */\n\nexport type { PeerTransport, PeerCard, PeerMessage, TaskResult, PeerHealth } from \"./interface.js\";\nexport { HttpTransport } from \"./http-transport.js\";\nexport { startGossipListener, gossipBroadcast, getAlivePeers, getPeerTable, setGossipInterval, stopGossipListener } from \"./gossip.js\";\n\nimport { HttpTransport } from \"./http-transport.js\";\nimport type { PeerTransport } from \"./interface.js\";\n\nlet _instance: PeerTransport | null = null;\n\n/** Get the singleton PeerTransport instance. */\nexport function getPeerTransport(): PeerTransport {\n if (!_instance) _instance = new HttpTransport();\n return _instance;\n}\n\n/** Initialize peer transport + WS outbound connections. Call at boot. */\nexport async function initPeerTransport(): Promise<void> {\n const transport = getPeerTransport() as HttpTransport;\n await transport.initWsConnections();\n}\n"],
5
- "mappings": "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",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/cli/deploy-lib/deploy.ts", "../src/cli/update-sources/dev.ts", "../src/cli/update-sources/npm.ts", "../src/cli/commands/update.ts"],
4
- "sourcesContent": ["/**\n * Unified deploy flow \u2014 9 steps, handles both first install and update.\n * #1085: replaces separate install + update commands.\n */\nimport { hostname } from \"node:os\";\nimport { join } from \"node:path\";\nimport { existsSync, readFileSync, writeFileSync, rmSync, cpSync, readdirSync, mkdirSync, copyFileSync, unlinkSync, chmodSync } from \"node:fs\";\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport { execSync, spawn, spawnSync } from \"node:child_process\";\nimport { abtarsHome } from \"../../paths.js\";\nimport { acquireLock, atomicSwap, cleanStaleStaging, healthProbe, packagePaths, readManifest, writeManifest, emptyManifest } from \"../deploy-lib/index.js\";\nimport { makeLocalBuildSource } from \"../update-sources/dev.js\";\nimport { makeNpmSource } from \"../update-sources/npm.js\";\nimport type { SourceName } from \"../update-sources/types.js\";\n\nexport interface DeployOptions {\n readonly source: SourceName;\n readonly localDir?: string;\n readonly skipFreshness?: boolean;\n}\n\nfunction readJsonField(file: string, field: string): unknown {\n try { return JSON.parse(readFileSync(file, \"utf-8\"))[field]; } catch { return undefined; }\n}\n\nexport async function deploy(opts: DeployOptions): Promise<number> {\n const paths = packagePaths(\"abtars\");\n const isFirstInstall = !existsSync(paths.manifest);\n\n // Sync source repos \u2014 clone if missing, fetch+reset if exists, nuke+reclone on failure\n if (!opts.localDir) {\n const srcDir = join(paths.releasesDir, \"src\");\n mkdirSync(srcDir, { recursive: true });\n const abtarsSrcDir = join(srcDir, \"abtars\");\n const abmindSrcDir = join(srcDir, \"abmind\");\n const repos: Array<[string, string]> = [[abtarsSrcDir, \"abtars\"], [abmindSrcDir, \"abmind\"]];\n for (const [dir, name] of repos) {\n try {\n if (existsSync(join(dir, \".git\"))) {\n execSync(\"git fetch --depth 1 origin dev && git reset --hard origin/dev\", { cwd: dir, stdio: \"pipe\", timeout: 30_000 });\n } else {\n rmSync(dir, { recursive: true, force: true });\n execSync(`git clone --depth 1 -b dev https://github.com/aksika/${name}.git`, { cwd: srcDir, stdio: \"pipe\", timeout: 120_000 });\n }\n } catch {\n try {\n rmSync(dir, { recursive: true, force: true });\n execSync(`git clone --depth 1 -b dev https://github.com/aksika/${name}.git`, { cwd: srcDir, stdio: \"pipe\", timeout: 120_000 });\n } catch (err) {\n process.stderr.write(`Failed to sync ${name}: ${err instanceof Error ? err.message : String(err)}\\n`);\n if (name === \"abtars\") return 1;\n }\n }\n }\n\n // Ensure abmind is built (needs deps for tsc)\n if (existsSync(join(abmindSrcDir, \"package.json\")) && !existsSync(join(abmindSrcDir, \"dist\", \"cli\", \"abmind.js\"))) {\n try {\n execSync(\"pnpm install --ignore-scripts 2>/dev/null || npm install --ignore-scripts 2>/dev/null\", { cwd: abmindSrcDir, stdio: \"pipe\", timeout: 120_000 });\n execSync(\"npm run build\", { cwd: abmindSrcDir, stdio: \"pipe\", timeout: 60_000 });\n } catch {}\n }\n }\n\n const repoRoot = opts.localDir ?? join(paths.releasesDir, \"src\", \"abtars\");\n\n if (!existsSync(join(repoRoot, \"package.json\"))) {\n process.stderr.write(`Source not found at ${repoRoot}\\nUse: abtars update --local <DIR>\\n`);\n return 1;\n }\n\n // \u2500\u2500 Migrate from old layout if needed \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const { migrateIfNeeded } = await import(\"./migrate-layout.js\");\n migrateIfNeeded(paths.home);\n\n // \u2500\u2500 Step 1: Lock \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const release = await acquireLock(paths.lock, \"deploy\");\n try {\n cleanStaleStaging(paths.appStaging);\n process.stdout.write(`Building from ${repoRoot}...\\n`);\n\n // \u2500\u2500 Step 2: Build + Stage \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const source = opts.source === \"alpha\" || opts.source === \"stable\"\n ? makeNpmSource(\"abtars\", opts.source === \"alpha\" ? \"alpha\" : \"latest\")\n : makeLocalBuildSource({ repoRoot, allowStale: !!opts.skipFreshness });\n\n const staged = await source.prepare({ stagingDir: paths.appStaging, home: paths.home, allowStale: !!opts.skipFreshness });\n process.stdout.write(`\u2713 staged ${staged.version}\\n`);\n\n // Copy abmind\n await copyAbmind(staged.stagedPath, repoRoot);\n\n // Validate\n if (!existsSync(join(staged.stagedPath, \"bundle\", \"abtars.js\"))) {\n process.stderr.write(`x entry point not found\\n`);\n return 1;\n }\n\n // \u2500\u2500 Step 3: Deploy to releases dir + repoint symlink \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const { symlinkSync, unlinkSync, renameSync } = await import(\"node:fs\");\n mkdirSync(paths.releasesDir, { recursive: true });\n const releaseDir = join(paths.releasesDir, staged.commit || staged.version);\n if (existsSync(releaseDir)) rmSync(releaseDir, { recursive: true, force: true });\n renameSync(staged.stagedPath, releaseDir);\n\n // Update history.json (ordered array, max 4)\n let history: string[] = [];\n try { history = JSON.parse(readFileSync(paths.releasesHistory, \"utf-8\")); } catch {}\n history.unshift(staged.commit || staged.version);\n if (history.length > 4) {\n const dropped = history.pop()!;\n rmSync(join(paths.releasesDir, dropped), { recursive: true, force: true });\n }\n writeFileSync(paths.releasesHistory, JSON.stringify(history) + \"\\n\");\n\n // Repoint current symlink\n try { unlinkSync(paths.releasesCurrentLink); } catch {}\n symlinkSync(releaseDir, paths.releasesCurrentLink);\n\n // Keep legacy app/ as symlink for backward compat (WD, bridge.lock paths)\n try { rmSync(paths.app, { recursive: true, force: true }); } catch {}\n symlinkSync(releaseDir, paths.app);\n\n process.stdout.write(`\u2713 deployed to releases/${staged.commit || staged.version}\\n`);\n\n // \u2500\u2500 Step 4: Bootstrap manifest if missing \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n if (isFirstInstall) {\n await writeManifest(paths.manifest, {\n ...emptyManifest(\"abtars\", hostname()),\n installMode: \"daemon\",\n source: opts.source,\n } as any);\n }\n\n // \u2500\u2500 Step 5: Refresh \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n await refresh(paths, repoRoot);\n\n // \u2500\u2500 Step 6: Manifest + deploy.state \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const prior = isFirstInstall ? null : await readManifest(paths.manifest);\n await writeManifest(paths.manifest, {\n ...(prior ?? emptyManifest(\"abtars\", hostname())),\n version: staged.version,\n commit: staged.commit,\n branch: staged.branch,\n packageLockHash: staged.packageLockHash,\n activatedAt: new Date().toISOString(),\n source: opts.source,\n previousVersion: prior?.version ?? null,\n previousCommit: prior?.commit ?? null,\n installMode: prior?.installMode ?? \"daemon\",\n repoRoot,\n } as any);\n writeFileSync(join(paths.home, \"deploy.state\"), JSON.stringify({ status: \"deploying\", version: staged.version, startedAt: new Date().toISOString() }) + \"\\n\");\n process.stdout.write(`\u2713 manifest updated\\n`);\n\n // \u2500\u2500 Step 7: Stop everything \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n if (!isFirstInstall) {\n // 7.1 Stop daemon service (tells WD to exit via service manager)\n if (process.platform === \"darwin\") {\n const uid = `gui/${process.getuid?.() ?? 501}`;\n try { execSync(`launchctl bootout ${uid}/com.abtars.watchdog 2>/dev/null`, { stdio: \"ignore\", timeout: 5000 }); } catch {}\n } else {\n try { execSync(\"systemctl --user stop abtars-watchdog\", { stdio: \"ignore\", timeout: 5000 }); } catch {}\n }\n\n // 7.2 Write .start-reason = \"update:X\" (safety net if WD survives service stop)\n writeFileSync(join(paths.home, \".start-reason\"), `update:${staged.version}`);\n\n // 7.3 Kill WD PID explicitly (belt)\n const wdPid = readJsonField(join(paths.home, \"bridge.lock\"), \"watchdogPid\") as number | undefined;\n if (wdPid && wdPid > 0) {\n try { process.kill(wdPid, \"SIGTERM\"); } catch {}\n }\n\n // 7.4 Kill bridge PID\n const bridgePid = readJsonField(join(paths.home, \"bridge.lock\"), \"pid\") as number | undefined;\n if (bridgePid && bridgePid > 0) {\n try { process.kill(bridgePid, \"SIGTERM\"); } catch {}\n process.stdout.write(` x Killing bridge (PID ${bridgePid})...\\n`);\n for (let i = 0; i < 10; i++) {\n await new Promise(r => setTimeout(r, 500));\n try { process.kill(bridgePid, 0); } catch { break; }\n }\n }\n\n // 7.5 Wait for WD to die (flock release). SIGKILL after 3s.\n if (wdPid && wdPid > 0) {\n let wdAlive = false;\n for (let i = 0; i < 6; i++) {\n try { process.kill(wdPid, 0); wdAlive = true; } catch { wdAlive = false; break; }\n await new Promise(r => setTimeout(r, 500));\n }\n if (wdAlive) { try { process.kill(wdPid, \"SIGKILL\"); } catch {} }\n }\n\n // 7.6 Clear .stopped sentinel\n try { rmSync(join(paths.home, \".stopped\")); } catch {}\n }\n\n // \u2500\u2500 Step 8: Respawn \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // 8.1 Write neutral .start-reason \u2014 new WD won't match any exit case\n writeFileSync(join(paths.home, \".start-reason\"), \"deploy-respawn\");\n\n const manifest = await readManifest(paths.manifest);\n const mode = manifest?.installMode ?? \"daemon\";\n\n // 8.2 Restart daemon service\n if (mode === \"daemon\") {\n if (process.platform === \"darwin\") {\n const plistPath = join(process.env[\"HOME\"] ?? \"\", \"Library/LaunchAgents/com.abtars.watchdog.plist\");\n const uid = `gui/${process.getuid?.() ?? 501}`;\n try { execSync(`launchctl bootstrap ${uid} \"${plistPath}\"`, { stdio: \"ignore\", timeout: 5000 }); } catch {}\n } else {\n try { execSync(\"systemctl --user daemon-reload\", { stdio: \"ignore\", timeout: 5000 }); } catch {}\n try { execSync(\"systemctl --user unmask abtars-watchdog\", { stdio: \"ignore\", timeout: 5000 }); } catch {}\n try { execSync(\"systemctl --user enable abtars-watchdog\", { stdio: \"ignore\", timeout: 5000 }); } catch {}\n try { execSync(\"systemctl --user start abtars-watchdog\", { stdio: \"ignore\", timeout: 5000 }); } catch {}\n }\n process.stdout.write(` Daemon started\\n`);\n } else {\n // simple mode: update only deploys, user manages lifecycle via start/stop\n process.stdout.write(` Deployed. Run 'abtars start' to launch the bridge.\\n`);\n }\n\n // \u2500\u2500 Step 9: Health probe \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n process.stdout.write(`Waiting for bridge health...\\n`);\n const health = await healthProbe(paths.home, Date.now(), 180_000);\n if (health.healthy) {\n process.stdout.write(`\u2713 Bridge healthy (PID ${health.pid}, tick at ${new Date(health.heartbeat!).toISOString()})\\n`);\n writeFileSync(join(paths.home, \"deploy.state\"), JSON.stringify({ status: \"success\", version: staged.version, completedAt: new Date().toISOString() }) + \"\\n\");\n } else {\n process.stderr.write(`\u26A0 Bridge not healthy after 120s \u2014 check logs. Watchdog will keep trying.\\n`);\n writeFileSync(join(paths.home, \"deploy.state\"), JSON.stringify({ status: \"unhealthy\", version: staged.version, completedAt: new Date().toISOString() }) + \"\\n\");\n }\n\n return 0;\n } finally {\n await release();\n }\n}\n\n// \u2500\u2500 Refresh \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nasync function refresh(paths: ReturnType<typeof packagePaths>, repoRoot: string): Promise<void> {\n // CLI wrappers\n await mkdir(paths.bin, { recursive: true });\n const { writeWrapper } = await import(\"../commands/install.js\");\n const { loadManifest } = await import(\"../install-manifest.js\");\n const installManifest = loadManifest(paths.app);\n for (const name of installManifest.cliWrappers) {\n await writeWrapper(paths.bin, name, paths.app, false);\n }\n\n // abmind CLI wrappers \u2014 point at the bundled copy inside the release\n const abmindDist = join(paths.app, \"node_modules\", \"abmind\", \"dist\", \"cli\");\n if (existsSync(abmindDist)) {\n for (const name of [\"abmind\", \"abmind-embed\"]) {\n const cliFile = name === \"abmind\" ? \"abmind.js\" : `${name}.js`;\n const target = join(abmindDist, cliFile);\n const content = `#!/usr/bin/env bash\\nexport NODE_PATH=\"$HOME/.local/lib/node_modules:\\${NODE_PATH:-}\"\\nexec node \"${target}\" \"$@\"\\n`;\n const dest = join(paths.bin, name);\n try { rmSync(dest); } catch {}\n await writeFile(dest, content, { mode: 0o755 });\n }\n }\n\n process.stdout.write(`\u2713 wrappers refreshed (${installManifest.cliWrappers.length} files)\\n`);\n\n // One-time cleanup: remove stale binary dirs from data directories (#1134)\n const abmindHome = join(process.env[\"HOME\"] ?? \"\", \".abmind\");\n for (const stale of [join(abmindHome, \"bin\"), join(abmindHome, \"current\"), join(abmindHome, \"lib\"), join(paths.home, \"bin\"), join(paths.home, \"scripts\"), join(paths.releasesDir, \"deps\")]) {\n if (existsSync(stale)) {\n rmSync(stale, { recursive: true, force: true });\n process.stdout.write(`\u2713 removed stale ${stale}\\n`);\n }\n }\n\n // Reload plist/systemd if changed (scripts run from repoRoot directly)\n const repoScripts = join(repoRoot, \"scripts\");\n if (process.platform === \"darwin\") {\n const src = join(repoScripts, \"com.abtars.watchdog.plist\");\n const dst = join(process.env[\"HOME\"] ?? \"\", \"Library/LaunchAgents/com.abtars.watchdog.plist\");\n if (existsSync(src)) {\n let srcContent = readFileSync(src, \"utf-8\").replace(/\\{\\{HOME\\}\\}/g, process.env[\"HOME\"] ?? \"\");\n const dstContent = existsSync(dst) ? readFileSync(dst, \"utf-8\") : \"\";\n if (srcContent !== dstContent) {\n writeFileSync(dst, srcContent);\n const uid = `gui/${process.getuid?.() ?? 501}`;\n try { execSync(`launchctl bootout ${uid}/com.abtars.watchdog 2>/dev/null`, { stdio: \"ignore\", timeout: 5000 }); } catch {}\n try { execSync(`launchctl bootstrap ${uid} \"${dst}\"`, { stdio: \"ignore\", timeout: 5000 }); } catch {}\n process.stdout.write(` \u2713 plist reloaded\\n`);\n }\n }\n } else {\n const src = join(repoScripts, \"abtars-watchdog.service\");\n const dst = join(process.env[\"HOME\"] ?? \"\", \".config/systemd/user/abtars-watchdog.service\");\n if (existsSync(src) && existsSync(dst)) {\n const srcContent = readFileSync(src, \"utf-8\");\n const dstContent = readFileSync(dst, \"utf-8\");\n if (srcContent !== dstContent) {\n copyFileSync(src, dst);\n try { execSync(\"systemctl --user daemon-reload\", { stdio: \"ignore\", timeout: 5000 }); } catch {}\n process.stdout.write(` \u2713 systemd unit reloaded\\n`);\n }\n }\n }\n\n // Reconcile runtime tree from templates\n const { reconcile, migrate } = await import(\"./reconcile.js\");\n const templatesSrc = join(paths.app, \"templates\");\n reconcile(templatesSrc, paths.home);\n migrate(paths.home);\n process.stdout.write(`\u2713 skills + prompts synced\\n`);\n}\n\n// \u2500\u2500 Copy abmind \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nasync function copyAbmind(stagingDir: string, repoRoot: string): Promise<void> {\n const abmindSrc = join(repoRoot, \"..\", \"abmind\");\n if (existsSync(join(abmindSrc, \"package.json\"))) {\n // Dev mode: build from sibling git repo\n try {\n execSync(\"npm run build\", { cwd: abmindSrc, stdio: \"pipe\", timeout: 60_000 });\n } catch {}\n if (!existsSync(join(abmindSrc, \"dist\", \"cli\", \"abmind.js\"))) {\n process.stdout.write(`\u26A0 abmind build failed (no dist output)\\n`);\n return;\n }\n process.stdout.write(`\u2713 abmind rebuilt\\n`);\n const dest = join(stagingDir, \"node_modules\", \"abmind\");\n cpSync(abmindSrc, dest, { recursive: true, filter: (src) => !src.includes(\"node_modules\") && !src.includes(\".git\") });\n try { chmodSync(join(dest, \"dist/cli/abmind.js\"), 0o755); } catch {}\n process.stdout.write(`\u2713 abmind copied\\n`);\n return;\n }\n\n // Registry mode (#1176): fetch abmind tarball directly\n try {\n const { resolveVersion, downloadTarball } = await import(\"../update-sources/registry-client.js\");\n const tag = process.env[\"ABMIND_TAG\"] ?? \"alpha\";\n const { version, tarballUrl } = await resolveVersion(\"abmind\", tag);\n const dest = join(stagingDir, \"node_modules\", \"abmind\");\n const tgzPath = join(stagingDir, `abmind-${version}.tgz`);\n await downloadTarball(tarballUrl, tgzPath);\n mkdirSync(dest, { recursive: true });\n spawnSync(\"tar\", [\"-xzf\", tgzPath, \"--strip-components=1\", \"-C\", dest], { stdio: \"pipe\" });\n if (existsSync(tgzPath)) unlinkSync(tgzPath);\n try { chmodSync(join(dest, \"dist/cli/abmind.js\"), 0o755); } catch {}\n process.stdout.write(`\u2713 abmind ${version} (registry)\\n`);\n } catch (err) {\n process.stdout.write(`\u26A0 abmind fetch skipped: ${err instanceof Error ? err.message : String(err)}\\n`);\n }\n}\n", "/**\n * LocalBuildSource: the Phase 1 adapter. Builds the current working-tree\n * checkout and stages the output into releases/<version>/dist/.\n *\n * Staleness guard: runs `git fetch` and refuses to proceed if HEAD is behind\n * origin/<branch>, unless allowStale (--local) is passed. Handles the\n * detached-HEAD / no-upstream / unpushed edge cases with a friendly message.\n *\n * Version string: `<package-version>-<short-sha>`, e.g. `0.1.0-28f71ef`.\n * Uniqueness: if the same version is staged twice, the second stage\n * overwrites (rsync --delete semantics via rm + cp). Rare; only happens when\n * operator runs update twice without changing a commit or bumping version.\n */\n\nimport { spawnSync } from 'node:child_process';\nimport { existsSync, cpSync } from 'node:fs';\nimport { copyFile, cp, mkdir, readFile, rm, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { hashFile } from '../deploy-lib-import.js';\nimport type { PrepareContext, StagedRelease, UpdateSource } from './types.js';\n\nexport class LocalBuildError extends Error {\n constructor(\n message: string,\n public readonly hint?: string,\n ) {\n super(hint ? `${message}\\n\\n${hint}` : message);\n this.name = 'LocalBuildError';\n }\n}\n\nexport interface LocalBuildOptions {\n /** Repository root for the build (defaults to process.cwd()). */\n readonly repoRoot?: string;\n /** If true, skip the behind-origin guard. Operator opt-in. */\n readonly allowStale?: boolean;\n /** If true, skip `npm install` (assume node_modules is already current). */\n readonly skipInstall?: boolean;\n}\n\nfunction runCmd(cmd: string, args: readonly string[], cwd: string): string {\n const r = spawnSync(cmd, args, { cwd, encoding: 'utf-8' });\n if (r.error) throw new LocalBuildError(`${cmd} ${args.join(' ')} failed: ${r.error.message}`);\n if (r.status !== 0) {\n throw new LocalBuildError(\n `${cmd} ${args.join(' ')} exited with status ${r.status}`,\n r.stderr?.trim() || undefined,\n );\n }\n return r.stdout.trim();\n}\n\nfunction tryCmd(cmd: string, args: readonly string[], cwd: string): string | null {\n const r = spawnSync(cmd, args, { cwd, encoding: 'utf-8' });\n if (r.status !== 0) return null;\n return r.stdout.trim();\n}\n\nfunction checkStaleness(repoRoot: string, allowStale: boolean): { commit: string; branch: string | null } {\n const commit = runCmd('git', ['rev-parse', '--short', 'HEAD'], repoRoot);\n const branch = tryCmd('git', ['rev-parse', '--abbrev-ref', 'HEAD'], repoRoot);\n if (allowStale) return { commit, branch: branch === 'HEAD' ? null : branch };\n\n // Detached HEAD / no-branch case\n if (branch === 'HEAD' || branch === null) {\n throw new LocalBuildError(\n 'Working tree is in detached HEAD (no current branch).',\n 'Cannot check for staleness. Pass --local to proceed with the current tree.',\n );\n }\n\n // Fetch to refresh origin refs. Not --unshallow; caller may have a shallow clone intentionally.\n runCmd('git', ['fetch', '--quiet'], repoRoot);\n\n // Does the branch have an upstream?\n const upstream = tryCmd('git', ['rev-parse', '--abbrev-ref', `${branch}@{upstream}`], repoRoot);\n if (upstream === null) {\n throw new LocalBuildError(\n `Branch '${branch}' has no upstream configured.`,\n 'Cannot check for staleness. Push the branch, or pass --local to proceed with the current tree.',\n );\n }\n\n // How many commits is HEAD behind upstream?\n const behindStr = tryCmd('git', ['rev-list', '--count', `HEAD..${upstream}`], repoRoot);\n const behind = behindStr === null ? null : Number(behindStr);\n if (behind === null || !Number.isFinite(behind)) {\n throw new LocalBuildError(\n `Could not determine how far HEAD is behind ${upstream}.`,\n 'Pass --local to proceed anyway.',\n );\n }\n if (behind > 0) {\n throw new LocalBuildError(\n `Current branch: ${branch} (${commit})\\n${upstream} is ahead by ${behind} commit${behind === 1 ? '' : 's'}.`,\n `Run 'git pull' first, or pass --local to build from the current tree.`,\n );\n }\n\n // Enforce dev branch for deployments\n if (branch !== 'dev') {\n throw new LocalBuildError(\n `Current branch is '${branch}', but deployments must come from 'dev'.`,\n `Run 'git checkout dev && git pull', or pass --local to override.`,\n );\n }\n\n return { commit, branch };\n}\n\nasync function readPackageVersion(repoRoot: string): Promise<string> {\n const pkg = JSON.parse(await readFile(join(repoRoot, 'package.json'), 'utf-8')) as { version?: string };\n if (typeof pkg.version !== 'string') {\n throw new LocalBuildError('package.json has no version field.');\n }\n return pkg.version;\n}\n\nexport function makeLocalBuildSource(opts: LocalBuildOptions = {}): UpdateSource {\n const repoRoot = opts.repoRoot ?? process.cwd();\n const isNpmPackage = !existsSync(join(repoRoot, '.git'));\n\n return {\n name: 'dev',\n async prepare(ctx: PrepareContext): Promise<StagedRelease> {\n // npm package mode: no git, no build \u2014 just copy the pre-built bundle\n if (isNpmPackage) {\n const bundleDir = join(repoRoot, 'bundle');\n if (!existsSync(bundleDir)) {\n throw new Error(`No bundle/ found at ${repoRoot}. Run from the abtars npm package or a git checkout.`);\n }\n const pkgVersion = await readPackageVersion(repoRoot);\n const version = pkgVersion;\n const stagedPath = ctx.stagingDir;\n await rm(stagedPath, { recursive: true, force: true });\n await mkdir(stagedPath, { recursive: true });\n await cp(bundleDir, join(stagedPath, 'bundle'), { recursive: true });\n const templatesDir = join(repoRoot, 'templates');\n if (existsSync(templatesDir)) await cp(templatesDir, join(stagedPath, 'templates'), { recursive: true });\n const configSrc = join(repoRoot, 'config');\n if (existsSync(configSrc)) await cp(configSrc, join(stagedPath, 'config'), { recursive: true });\n const manifestSrc = join(repoRoot, 'install-manifest.json');\n if (existsSync(manifestSrc)) await copyFile(manifestSrc, join(stagedPath, 'install-manifest.json'));\n await writeFile(join(stagedPath, 'package.json'), JSON.stringify({ type: \"module\", name: \"abtars\", version }, null, 2) + \"\\n\");\n process.stdout.write(`\u2713 staged ${version} (from npm package)\\n`);\n return { version, stagedPath, commit: null, branch: null, packageLockHash: null, source: 'dev' };\n }\n\n // Git checkout mode: build from source\n const { commit, branch } = checkStaleness(repoRoot, opts.allowStale === true || ctx.allowStale);\n const pkgVersion = await readPackageVersion(repoRoot);\n const version = `${pkgVersion}-${commit}`;\n\n // Install deps into the repo (if not skipped).\n if (opts.skipInstall !== true) {\n const pnpmPath = (() => {\n try { return spawnSync('which', ['pnpm'], { encoding: 'utf-8' }).stdout.trim() || 'pnpm'; } catch { return 'pnpm'; }\n })();\n try {\n runCmd(pnpmPath, ['install', '--frozen-lockfile'], repoRoot);\n } catch (err) {\n if (err instanceof LocalBuildError && err.message.includes('ENOENT')) {\n runCmd('npm', ['install'], repoRoot);\n } else throw err;\n }\n }\n\n // Bundle mode (esbuild) \u2014 build directly, skip npm run bundle (it requires ../abmind)\n runCmd('node', ['esbuild.config.js'], repoRoot);\n const publicSrc = join(repoRoot, 'src', 'components', 'dashboard', 'public');\n if (existsSync(publicSrc)) cpSync(publicSrc, join(repoRoot, 'bundle', 'public'), { recursive: true });\n const agentsSrc = join(repoRoot, 'agents');\n if (existsSync(agentsSrc)) cpSync(agentsSrc, join(repoRoot, 'bundle', 'agents'), { recursive: true });\n\n const stagedPath = ctx.stagingDir;\n await rm(stagedPath, { recursive: true, force: true });\n await mkdir(stagedPath, { recursive: true });\n await cp(join(repoRoot, 'bundle'), join(stagedPath, 'bundle'), { recursive: true });\n\n // Copy templates/ for reconcile (skills, prompts, config seeds, tasks)\n const templatesSrc = join(repoRoot, 'templates');\n if (existsSync(templatesSrc)) {\n await cp(templatesSrc, join(stagedPath, 'templates'), { recursive: true });\n }\n\n // Ensure ESM works\n await writeFile(join(stagedPath, 'package.json'), JSON.stringify({ type: \"module\", name: \"abtars\", version }, null, 2) + \"\\n\");\n\n // Copy install-manifest.json for doctor reconciliation\n await copyFile(join(repoRoot, 'install-manifest.json'), join(stagedPath, 'install-manifest.json'));\n\n const packageLockHash = await hashFile(join(repoRoot, 'package-lock.json'));\n return { version, stagedPath, commit, branch, packageLockHash, source: 'dev' };\n },\n };\n}\n", "/**\n * NpmSource: fetch latest published version directly from npm registry (#1176).\n * Pure HTTP fetch \u2014 no npm/pnpm CLI dependency.\n */\n\nimport { spawnSync } from \"node:child_process\";\nimport { existsSync, readFileSync, unlinkSync } from \"node:fs\";\nimport { mkdir, rm } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { resolveVersion, downloadTarball } from \"./registry-client.js\";\nimport type { PrepareContext, StagedRelease, UpdateSource } from \"./types.js\";\n\nconst TAR_TIMEOUT_MS = 60_000;\n\nfunction run(cmd: string, args: string[], cwd: string): string {\n const r = spawnSync(cmd, args, { cwd, encoding: \"utf-8\", timeout: TAR_TIMEOUT_MS });\n if (r.error) throw new Error(`${cmd} ${args.join(\" \")}: ${r.error.message}`);\n if (r.status !== 0) throw new Error(`${cmd} ${args.join(\" \")} exited ${r.status}: ${r.stderr?.trim()}`);\n return r.stdout.trim();\n}\n\nfunction readLocalVersion(home: string): string | null {\n try {\n const pkg = JSON.parse(readFileSync(join(home, \"app\", \"package.json\"), \"utf-8\"));\n return pkg.version ?? null;\n } catch { return null; }\n}\n\nexport function makeNpmSource(packageName: string, tag?: string): UpdateSource {\n const distTag = tag ?? \"latest\";\n const sourceName = distTag === \"alpha\" ? \"alpha\" : \"stable\";\n return {\n name: sourceName,\n async prepare(ctx: PrepareContext): Promise<StagedRelease> {\n const { version, tarballUrl } = await resolveVersion(packageName, distTag);\n const current = readLocalVersion(ctx.home);\n if (version === current) {\n throw new Error(`Already at ${distTag} version (${version}). Nothing to update.`);\n }\n\n const stagedPath = ctx.stagingDir;\n await rm(stagedPath, { recursive: true, force: true });\n await mkdir(stagedPath, { recursive: true });\n\n // Download tarball directly from registry\n const tgzPath = join(stagedPath, `${packageName.replace(\"/\", \"-\")}-${version}.tgz`);\n await downloadTarball(tarballUrl, tgzPath);\n\n // Extract (strip package/ prefix)\n run(\"tar\", [\"-xzf\", tgzPath, \"--strip-components=1\"], stagedPath);\n\n // Cleanup tarball\n if (existsSync(tgzPath)) unlinkSync(tgzPath);\n\n // No dep install \u2014 native deps handled by #1191 (manifest-driven copy from deps/ dir)\n\n return { version, stagedPath, commit: null, branch: null, packageLockHash: null, source: sourceName };\n },\n };\n}\n", "import { printBanner } from './banner.js';\n/**\n * `abtars update` \u2014 unified deploy command.\n * Detects first-time install (no manifest.json) and onboards automatically.\n * #1085: replaces separate install + update commands.\n */\nimport { deploy, type DeployOptions } from \"../deploy-lib/deploy.js\";\nimport type { SourceName } from \"../update-sources/types.js\";\n\nexport interface UpdateOptions {\n readonly source: SourceName | null;\n readonly localDir?: string;\n readonly skipFreshness?: boolean;\n readonly allowAbmindMismatch: boolean;\n readonly dryRun?: boolean;\n readonly check?: boolean;\n}\n\nexport async function update(opts: UpdateOptions): Promise<number> {\n await printBanner(\"update\");\n if (!opts.source) {\n process.stderr.write(`No channel specified.\\nUsage: abtars update --dev [dir] | --alpha | --stable\\n`);\n return 2;\n }\n\n if (opts.check) {\n // TODO: implement check-for-updates (git fetch --dry-run)\n process.stdout.write(\"--check not yet implemented in new deploy flow\\n\");\n return 0;\n }\n\n if (opts.dryRun) {\n process.stdout.write(\"--dry-run not yet implemented in new deploy flow\\n\");\n return 0;\n }\n\n const deployOpts: DeployOptions = {\n source: opts.source,\n localDir: opts.localDir,\n skipFreshness: opts.skipFreshness,\n };\n\n return deploy(deployOpts);\n}\n"],
5
- "mappings": "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",
6
- "names": ["join", "existsSync", "readFileSync", "cpSync", "unlinkSync", "mkdir", "writeFile", "spawnSync", "pkgVersion", "version", "stagedPath", "spawnSync", "existsSync", "mkdir", "rm", "join", "spawnSync", "join", "rm", "mkdir", "existsSync", "readFileSync", "existsSync", "join", "unlinkSync", "mkdir", "writeFile", "cpSync", "resolveVersion", "downloadTarball", "spawnSync"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/components/transport/orc-tools.ts"],
4
- "sourcesContent": ["/**\n * orc-tools.ts \u2014 Orc-specific tools for spawning/managing workers (#1005).\n *\n * Module-scoped activeOrcCardId \u2014 set by executeOrc before prompt, cleared in finally.\n * Tools always registered; return error if no active Orc project.\n */\n\nimport type { ToolDefinition } from \"./tool-registry.js\";\nimport { logInfo, logWarn } from \"../logger.js\";\n\nconst TAG = \"orc-tools\";\n\nlet _activeOrcCardId: number | null = null;\n\nexport function setActiveOrcCard(id: number | null): void {\n _activeOrcCardId = id;\n}\n\nexport function getActiveOrcCard(): number | null {\n return _activeOrcCardId;\n}\n\n// \u2500\u2500 spawn_worker \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst spawnWorkerTool: ToolDefinition = {\n name: \"spawn_worker\",\n description: \"Spawn a worker to execute a task in parallel. Workers run independently and report results.\",\n parameters: {\n type: \"object\",\n properties: {\n goal: { type: \"string\", description: \"What the worker should accomplish (detailed instruction)\" },\n title: { type: \"string\", description: \"Short label for the worker card (optional)\" },\n priority: { type: \"string\", description: \"CRITICAL | HIGH | MEDIUM | LOW\", enum: [\"CRITICAL\", \"HIGH\", \"MEDIUM\", \"LOW\"] },\n },\n required: [\"goal\"],\n },\n async execute(args: Record<string, string>): Promise<string> {\n if (!_activeOrcCardId) return \"[err] No active Orc project. spawn_worker only works during orchestration.\";\n const { spin } = await import(\"../spin.js\");\n const cardId = spin.spawnChild(_activeOrcCardId, {\n goal: args.goal,\n title: args.title || args.goal.slice(0, 40),\n source: \"agent\",\n priority: args.priority as any,\n });\n logInfo(TAG, `spawn_worker card:${cardId} parent:${_activeOrcCardId} \u2014 ${(args.title || args.goal).slice(0, 60)}`);\n return `+ Worker card #${cardId} created: \"${args.title || args.goal.slice(0, 40)}\"`;\n },\n};\n\n// \u2500\u2500 check_workers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst checkWorkersTool: ToolDefinition = {\n name: \"check_workers\",\n description: \"Check status of all workers on the current project. Returns their status and results.\",\n parameters: { type: \"object\", properties: {}, required: [] },\n async execute(): Promise<string> {\n if (!_activeOrcCardId) return \"[err] No active Orc project.\";\n const { kanbanGetChildren } = await import(\"../tasks/kanban-board.js\");\n const children = kanbanGetChildren(_activeOrcCardId);\n if (children.length === 0) return \"No workers spawned yet.\";\n const lines = children.map(c => {\n const icon = c.status === \"done\" ? \"*\" : c.status === \"running\" ? \"~\" : c.status === \"failed\" ? \"x\" : \"+\";\n const result = c.result_summary ? ` \u2014 ${c.result_summary.slice(0, 100)}` : \"\";\n const tokens = c.tokens_used ? ` (${c.tokens_used} tok)` : \"\";\n const source = c.type === \"remote\" ? (() => { try { return ` [${JSON.parse(c.notes ?? \"{}\").peer}]`; } catch { return \"\"; } })() : \"\";\n return `${icon} #${c.id} ${c.title || \"(untitled)\"} (${c.status})${tokens}${source}${result}`;\n });\n return `Workers (${children.length}):\\n${lines.join(\"\\n\")}`;\n },\n};\n\n// \u2500\u2500 cancel_worker \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst cancelWorkerTool: ToolDefinition = {\n name: \"cancel_worker\",\n description: \"Cancel a running or queued worker. Use when a task is no longer needed (e.g., another worker found the answer first).\",\n parameters: {\n type: \"object\",\n properties: {\n card_id: { type: \"string\", description: \"The card ID of the worker to cancel\" },\n },\n required: [\"card_id\"],\n },\n async execute(args: Record<string, string>): Promise<string> {\n if (!_activeOrcCardId) return \"[err] No active Orc project.\";\n const cardId = parseInt(args.card_id, 10);\n if (isNaN(cardId)) return \"[err] Invalid card_id.\";\n const { kanbanGetCard, kanbanFail } = await import(\"../tasks/kanban-board.js\");\n const card = kanbanGetCard(cardId);\n if (!card) return `[err] Card #${cardId} not found.`;\n if (card.parent_id !== _activeOrcCardId) return `[err] Card #${cardId} is not a child of this project.`;\n if (card.status === \"done\" || card.status === \"delivered\") return `Card #${cardId} already completed.`;\n kanbanFail(cardId, \"cancelled by Orc\");\n logInfo(TAG, `cancel_worker card:${cardId} (parent:${_activeOrcCardId})`);\n return `x Worker #${cardId} cancelled.`;\n },\n};\n\n// \u2500\u2500 Export \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport function getOrcTools(): ToolDefinition[] {\n return [spawnWorkerTool, checkWorkersTool, cancelWorkerTool];\n}\n"],
5
- "mappings": "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",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/cli/commands/rollback.ts"],
4
- "sourcesContent": ["import { printBanner } from './banner.js';\n/**\n * `abtars rollback` \u2014 repoint current symlink to a previous release from history.json.\n * --to N (1-3, default 1) selects which prior to restore.\n */\n\nimport { existsSync, readFileSync, writeFileSync, unlinkSync, symlinkSync } from 'node:fs';\nimport { join, resolve } from 'node:path';\nimport { homedir } from 'node:os';\nimport { acquireLock, packagePaths } from '../deploy-lib-import.js';\n\nexport async function rollback(opts?: { to?: number }): Promise<number> {\n await printBanner(\"rollback\");\n const paths = packagePaths('abtars');\n const releasesDir = resolve(homedir(), '.abtars-releases');\n const historyFile = join(releasesDir, 'history.json');\n const currentLink = join(releasesDir, 'current');\n const slot = opts?.to ?? 1;\n\n if (slot < 1 || slot > 3) {\n process.stderr.write(`Invalid --to value: ${slot}. Must be 1-3.\\n`);\n return 2;\n }\n\n let history: string[] = [];\n try { history = JSON.parse(readFileSync(historyFile, \"utf-8\")); } catch {}\n\n if (history.length <= slot) {\n process.stderr.write(`Nothing at slot ${slot} (history has ${history.length} entries).\\n`);\n return 2;\n }\n\n const target = history[slot]!;\n const targetDir = join(releasesDir, target);\n if (!existsSync(targetDir)) {\n process.stderr.write(`Release dir ${target} not found on disk.\\n`);\n return 2;\n }\n\n const release = await acquireLock(paths.lock, 'rollback');\n try {\n // Repoint current symlink\n try { unlinkSync(currentLink); } catch {}\n symlinkSync(targetDir, currentLink);\n\n // Also repoint legacy app/ symlink\n try { unlinkSync(paths.app); } catch {}\n try { symlinkSync(targetDir, paths.app); } catch {}\n\n process.stdout.write(`\u2713 rolled back to ${target} (slot ${slot})\\n`);\n\n // Reset circuit breaker counter\n try {\n const state = JSON.parse(readFileSync(join(paths.home, 'deploy.state'), 'utf-8'));\n state.restartCount = 0;\n writeFileSync(join(paths.home, 'deploy.state'), JSON.stringify(state) + '\\n');\n } catch {}\n\n // Write start reason + restart\n writeFileSync(join(paths.home, '.start-reason'), `rollback:${target}`);\n\n // Kill bridge so WD respawns from rolled-back code\n try {\n const bridgePid = JSON.parse(readFileSync(join(paths.home, 'bridge.lock'), 'utf-8')).pid;\n if (bridgePid > 0) process.kill(bridgePid, 'SIGTERM');\n } catch {}\n\n process.stdout.write(`\u267B\uFE0F Bridge killed \u2014 WD will respawn from ${target}\\n`);\n return 0;\n } finally {\n await release();\n }\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;AAMA,SAAS,YAAY,cAAc,eAAe,YAAY,mBAAmB;AACjF,SAAS,MAAM,eAAe;AAC9B,SAAS,eAAe;AAGxB,eAAsB,SAAS,MAAyC;AACtE,QAAM,YAAY,UAAU;AAC5B,QAAM,QAAQ,aAAa,QAAQ;AACnC,QAAM,cAAc,QAAQ,QAAQ,GAAG,kBAAkB;AACzD,QAAM,cAAc,KAAK,aAAa,cAAc;AACpD,QAAM,cAAc,KAAK,aAAa,SAAS;AAC/C,QAAM,OAAO,MAAM,MAAM;AAEzB,MAAI,OAAO,KAAK,OAAO,GAAG;AACxB,YAAQ,OAAO,MAAM,uBAAuB,IAAI;AAAA,CAAkB;AAClE,WAAO;AAAA,EACT;AAEA,MAAI,UAAoB,CAAC;AACzB,MAAI;AAAE,cAAU,KAAK,MAAM,aAAa,aAAa,OAAO,CAAC;AAAA,EAAG,QAAQ;AAAA,EAAC;AAEzE,MAAI,QAAQ,UAAU,MAAM;AAC1B,YAAQ,OAAO,MAAM,mBAAmB,IAAI,iBAAiB,QAAQ,MAAM;AAAA,CAAc;AACzF,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,QAAQ,IAAI;AAC3B,QAAM,YAAY,KAAK,aAAa,MAAM;AAC1C,MAAI,CAAC,WAAW,SAAS,GAAG;AAC1B,YAAQ,OAAO,MAAM,eAAe,MAAM;AAAA,CAAuB;AACjE,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,MAAM,YAAY,MAAM,MAAM,UAAU;AACxD,MAAI;AAEF,QAAI;AAAE,iBAAW,WAAW;AAAA,IAAG,QAAQ;AAAA,IAAC;AACxC,gBAAY,WAAW,WAAW;AAGlC,QAAI;AAAE,iBAAW,MAAM,GAAG;AAAA,IAAG,QAAQ;AAAA,IAAC;AACtC,QAAI;AAAE,kBAAY,WAAW,MAAM,GAAG;AAAA,IAAG,QAAQ;AAAA,IAAC;AAElD,YAAQ,OAAO,MAAM,yBAAoB,MAAM,UAAU,IAAI;AAAA,CAAK;AAGlE,QAAI;AACF,YAAM,QAAQ,KAAK,MAAM,aAAa,KAAK,MAAM,MAAM,cAAc,GAAG,OAAO,CAAC;AAChF,YAAM,eAAe;AACrB,oBAAc,KAAK,MAAM,MAAM,cAAc,GAAG,KAAK,UAAU,KAAK,IAAI,IAAI;AAAA,IAC9E,QAAQ;AAAA,IAAC;AAGT,kBAAc,KAAK,MAAM,MAAM,eAAe,GAAG,YAAY,MAAM,EAAE;AAGrE,QAAI;AACF,YAAM,YAAY,KAAK,MAAM,aAAa,KAAK,MAAM,MAAM,aAAa,GAAG,OAAO,CAAC,EAAE;AACrF,UAAI,YAAY,EAAG,SAAQ,KAAK,WAAW,SAAS;AAAA,IACtD,QAAQ;AAAA,IAAC;AAET,YAAQ,OAAO,MAAM,0DAA2C,MAAM;AAAA,CAAI;AAC1E,WAAO;AAAA,EACT,UAAE;AACA,UAAM,QAAQ;AAAA,EAChB;AACF;",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/cli/deploy-lib/paths.ts"],
4
- "sourcesContent": ["/**\n * Runtime directory resolution for deploy-lib consumers.\n *\n * Rules:\n * - abtars runtime root: $ABTARS_HOME ?? ~/.abtars\n * - abmind runtime root: $ABMIND_HOME ?? ~/.abmind\n * - user bin dir: ~/.local/bin (always, XDG convention)\n *\n * All callers use these resolvers \u2014 never hardcode paths. Required by\n * plan #158 v7 (Ag2 round-2 nit): cross-repo manifest reads must respect\n * env-var overrides, not assume default locations.\n */\n\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\n\nexport type PackageName = 'abtars' | 'abmind';\n\nexport function resolveAbtarsHome(): string {\n return process.env['ABTARS_HOME'] ?? join(homedir(), '.abtars');\n}\n\nexport function resolveAbmindHome(): string {\n return process.env['ABMIND_HOME'] ?? join(homedir(), '.abmind');\n}\n\nexport function resolvePackageHome(pkg: PackageName): string {\n return pkg === 'abtars' ? resolveAbtarsHome() : resolveAbmindHome();\n}\n\nexport function resolveUserBinDir(): string {\n return join(homedir(), '.local', 'bin');\n}\n\nexport interface PackagePaths {\n readonly home: string;\n readonly config: string;\n readonly app: string;\n readonly appPrev: string;\n readonly appPrev1: string;\n readonly appPrev2: string;\n readonly appPrev3: string;\n readonly appStaging: string;\n readonly bin: string;\n readonly manifest: string;\n readonly lock: string;\n // #1089: releases dir layout\n readonly releasesDir: string;\n readonly releasesCurrentLink: string;\n readonly releasesHistory: string;\n readonly releasesSrc: string;\n // Legacy \u2014 kept for migration detection only. Remove after all hosts migrated.\n readonly releases: string;\n readonly current: string;\n}\n\nexport function packagePaths(pkg: PackageName): PackagePaths {\n const home = resolvePackageHome(pkg);\n const releasesDir = join(homedir(), '.abtars-releases');\n return {\n home,\n config: join(home, 'config'),\n app: join(home, 'app'),\n appPrev: join(home, 'app.prev'),\n appPrev1: join(home, 'app.prev.1'),\n appPrev2: join(home, 'app.prev.2'),\n appPrev3: join(home, 'app.prev.3'),\n appStaging: join(home, 'app.staging'),\n bin: resolveUserBinDir(),\n manifest: join(home, 'manifest.json'),\n lock: join(home, '.update.lock'),\n // #1089\n releasesDir,\n releasesCurrentLink: join(releasesDir, 'current'),\n releasesHistory: join(releasesDir, 'history.json'),\n releasesSrc: join(releasesDir, 'src'),\n // Legacy\n releases: join(home, 'releases'),\n current: join(home, 'current'),\n };\n}\n"],
5
- "mappings": ";;;;AAaA,SAAS,eAAe;AACxB,SAAS,YAAY;AAId,SAAS,oBAA4B;AAC1C,SAAO,QAAQ,IAAI,aAAa,KAAK,KAAK,QAAQ,GAAG,SAAS;AAChE;AAEO,SAAS,oBAA4B;AAC1C,SAAO,QAAQ,IAAI,aAAa,KAAK,KAAK,QAAQ,GAAG,SAAS;AAChE;AAEO,SAAS,mBAAmB,KAA0B;AAC3D,SAAO,QAAQ,WAAW,kBAAkB,IAAI,kBAAkB;AACpE;AAEO,SAAS,oBAA4B;AAC1C,SAAO,KAAK,QAAQ,GAAG,UAAU,KAAK;AACxC;AAwBO,SAAS,aAAa,KAAgC;AAC3D,QAAM,OAAO,mBAAmB,GAAG;AACnC,QAAM,cAAc,KAAK,QAAQ,GAAG,kBAAkB;AACtD,SAAO;AAAA,IACL;AAAA,IACA,QAAQ,KAAK,MAAM,QAAQ;AAAA,IAC3B,KAAK,KAAK,MAAM,KAAK;AAAA,IACrB,SAAS,KAAK,MAAM,UAAU;AAAA,IAC9B,UAAU,KAAK,MAAM,YAAY;AAAA,IACjC,UAAU,KAAK,MAAM,YAAY;AAAA,IACjC,UAAU,KAAK,MAAM,YAAY;AAAA,IACjC,YAAY,KAAK,MAAM,aAAa;AAAA,IACpC,KAAK,kBAAkB;AAAA,IACvB,UAAU,KAAK,MAAM,eAAe;AAAA,IACpC,MAAM,KAAK,MAAM,cAAc;AAAA;AAAA,IAE/B;AAAA,IACA,qBAAqB,KAAK,aAAa,SAAS;AAAA,IAChD,iBAAiB,KAAK,aAAa,cAAc;AAAA,IACjD,aAAa,KAAK,aAAa,KAAK;AAAA;AAAA,IAEpC,UAAU,KAAK,MAAM,UAAU;AAAA,IAC/B,SAAS,KAAK,MAAM,SAAS;AAAA,EAC/B;AACF;",
6
- "names": []
7
- }
@@ -1,110 +0,0 @@
1
- #!/usr/bin/env node
2
- import { createRequire as __bundleCreateRequire } from 'node:module'; import { fileURLToPath as __bundleFileURLToPath } from 'node:url'; import { dirname as __bundleDirname } from 'node:path'; const require = __bundleCreateRequire(import.meta.url); const __chunk_filename = __bundleFileURLToPath(import.meta.url); const __chunk_dirname = __bundleDirname(__chunk_filename);
3
- import {
4
- loadNLMConfig
5
- } from "./chunk-HAZHNBBY.js";
6
- import {
7
- loadAndValidateConfig
8
- } from "./chunk-MV5KOWOR.js";
9
- import {
10
- getEnv,
11
- init_env_schema
12
- } from "./chunk-SSCGWDIC.js";
13
- import {
14
- init_log_and_swallow,
15
- logAndSwallow
16
- } from "./chunk-WP7FZHMI.js";
17
- import {
18
- init_logger,
19
- logInfo,
20
- setLogLevel
21
- } from "./chunk-OOKNHOCB.js";
22
- import {
23
- abtarsHome,
24
- init_paths
25
- } from "./chunk-H2K23MOF.js";
26
-
27
- // src/boot/phase-config.ts
28
- init_log_and_swallow();
29
- import { writeFileSync } from "node:fs";
30
- import { join as join2 } from "node:path";
31
- import { homedir as homedir2 } from "node:os";
32
-
33
- // src/components/cli-flags.ts
34
- import { existsSync } from "node:fs";
35
- import { join } from "node:path";
36
- import { homedir } from "node:os";
37
- function envBool(key) {
38
- const v = process.env[key];
39
- if (v === void 0 || v === "") return void 0;
40
- return v === "true" || v === "1";
41
- }
42
- function parsePlatformFlags(args) {
43
- const argv = args ?? process.argv.slice(2);
44
- const transport = argv.includes("--acp") ? "acp" : argv.includes("--tmux") ? "tmux" : void 0;
45
- if (argv.includes("--telegram") || argv.includes("--discord") || argv.includes("--irc") || argv.includes("--web") || argv.includes("--agent")) {
46
- return {
47
- telegram: argv.includes("--telegram"),
48
- discord: argv.includes("--discord"),
49
- irc: argv.includes("--irc"),
50
- web: argv.includes("--web"),
51
- agent: argv.includes("--agent"),
52
- transport
53
- };
54
- }
55
- const home = process.env["ABTARS_HOME"] ?? join(homedir(), ".abtars");
56
- const configDir = join(home, "config");
57
- const telegram = envBool("TELEGRAM_ENABLED") ?? !!process.env["TELEGRAM_BOT_TOKEN"];
58
- const discord = envBool("DISCORD_ENABLED") ?? !!process.env["DISCORD_TOKEN"];
59
- const irc = envBool("IRC_ENABLED") ?? existsSync(join(configDir, "irc.json"));
60
- const web = envBool("ENABLE_DASHBOARD") ?? false;
61
- const agent = envBool("ENABLE_AGENT_API") ?? false;
62
- return { telegram, discord, irc, web, agent, transport };
63
- }
64
-
65
- // src/boot/phase-config.ts
66
- init_logger();
67
- init_env_schema();
68
- init_paths();
69
- async function phaseConfig(ctx) {
70
- const binDir = join2(homedir2(), ".local", "bin");
71
- if (!process.env["PATH"]?.includes(binDir)) {
72
- process.env["PATH"] = `${binDir}:${process.env["PATH"] ?? ""}`;
73
- }
74
- ctx.platforms = parsePlatformFlags();
75
- ctx.config = await loadAndValidateConfig();
76
- setLogLevel(ctx.config.logLevel);
77
- const provider = getEnv().memory;
78
- const memoryEnabled = provider !== "none";
79
- const abmindHome = process.env["ABMIND_HOME"] || join2(homedir2(), ".abmind");
80
- const memoryDir = memoryEnabled ? join2(abmindHome, "memory") : "";
81
- ctx.memoryConfig = { memoryEnabled, memoryDir };
82
- ctx.bridgeLockPath = join2(abtarsHome(), "bridge.lock");
83
- ctx.sleepAuditDir = join2(memoryDir || join2(homedir2(), ".abmind", "memory"), "sleep");
84
- const { initUsageTracker } = await import("./usage-tracker-HRSGC7QC.js");
85
- initUsageTracker(abtarsHome());
86
- ctx.sttConfig = ctx.config.voice.sttEnabled ? { provider: "groq", apiKey: ctx.config.voice.groqApiKey, model: ctx.config.voice.sttModel } : null;
87
- ctx.ttsConfig = ctx.config.voice.ttsEnabled ? { voice: ctx.config.voice.ttsVoice } : null;
88
- ctx.nlmConfig = loadNLMConfig();
89
- const enabledList = [
90
- ctx.platforms.telegram && "telegram",
91
- ctx.platforms.discord && "discord"
92
- ].filter(Boolean).join(", ");
93
- logInfo("main", "\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 BRIDGE START \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500");
94
- logInfo("main", `v${ctx.version}${ctx.commit ? "-" + ctx.commit : ""} (platforms=${enabledList}, log=${ctx.config.logLevel})`);
95
- if (ctx.sttConfig) logInfo("main", `\u{1F3A4} STT enabled (${ctx.sttConfig.provider}/${ctx.sttConfig.model || "whisper-large-v3"})`);
96
- if (ctx.ttsConfig) logInfo("main", `\u{1F50A} TTS enabled (Edge TTS / ${ctx.ttsConfig.voice})`);
97
- try {
98
- writeFileSync(join2(abtarsHome(), "logs", "launchd.log"), "", "utf-8");
99
- } catch (err) {
100
- logAndSwallow("phase_config", "op", err);
101
- }
102
- const { loadHookConfig } = await import("./hook-system-X6INNJGV.js");
103
- loadHookConfig();
104
- return "ran";
105
- }
106
-
107
- export {
108
- phaseConfig
109
- };
110
- //# sourceMappingURL=chunk-CAOIIVFP.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/boot/phase-config.ts", "../src/components/cli-flags.ts"],
4
- "sourcesContent": ["/**\n * phase-config \u2014 boot phase 1: parse CLI flags, load config, set log level.\n *\n * Side effects:\n * - Prepends ~/.local/bin to PATH\n * - Truncates ~/.abtars/logs/launchd.log\n * - Sets log level (module-level singleton: logger.currentLevel)\n * - Emits BRIDGE START + startup log lines\n *\n * Populates ctx: platforms, config, memoryConfig, startedAt, bridgeLockPath,\n * sleepAuditDir, sttConfig, ttsConfig, nlmConfig.\n */\n\nimport { logAndSwallow } from \"../components/log-and-swallow.js\";\nimport { writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { loadAndValidateConfig } from \"../components/config.js\";\nimport { parsePlatformFlags } from \"../components/cli-flags.js\";\nimport { setLogLevel, logInfo } from \"../components/logger.js\";\nimport { getEnv } from \"../components/env-schema.js\";\nimport { loadNLMConfig } from \"../components/nlm-command-handler.js\";\nimport { abtarsHome } from \"../paths.js\";\nimport type { BootCtx, PhaseResult } from \"./context.js\";\nimport type { SttConfig } from \"../components/stt.js\";\nimport type { TtsConfig } from \"../components/tts.js\";\n\nexport async function phaseConfig(ctx: BootCtx): Promise<PhaseResult> {\n // Intentional: raw process.env \u2014 mutates PATH for child processes (kiro-cli, gemini-cli)\n const binDir = join(homedir(), \".local\", \"bin\");\n if (!process.env[\"PATH\"]?.includes(binDir)) {\n process.env[\"PATH\"] = `${binDir}:${process.env[\"PATH\"] ?? \"\"}`;\n }\n\n ctx.platforms = parsePlatformFlags();\n ctx.config = await loadAndValidateConfig();\n setLogLevel(ctx.config.logLevel);\n\n // Resolve memory provider from MEMORY env var\n const provider = getEnv().memory; // \"abmind\" | \"none\"\n const memoryEnabled = provider !== \"none\";\n const abmindHome = process.env[\"ABMIND_HOME\"] || join(homedir(), \".abmind\");\n const memoryDir = memoryEnabled ? join(abmindHome, \"memory\") : \"\";\n\n ctx.memoryConfig = { memoryEnabled, memoryDir } as any;\n // startedAt set by createBootCtx; preserved here\n ctx.bridgeLockPath = join(abtarsHome(), \"bridge.lock\");\n ctx.sleepAuditDir = join(memoryDir || join(homedir(), \".abmind\", \"memory\"), \"sleep\");\n\n // Usage tracker\n const { initUsageTracker } = await import(\"../components/usage-tracker.js\");\n initUsageTracker(abtarsHome());\n\n // STT/TTS/NLM config (lightweight \u2014 just reads env vars)\n ctx.sttConfig = ctx.config.voice.sttEnabled\n ? ({ provider: \"groq\", apiKey: ctx.config.voice.groqApiKey, model: ctx.config.voice.sttModel } satisfies SttConfig)\n : null;\n ctx.ttsConfig = ctx.config.voice.ttsEnabled\n ? ({ voice: ctx.config.voice.ttsVoice } satisfies TtsConfig)\n : null;\n ctx.nlmConfig = loadNLMConfig();\n\n const enabledList = [\n ctx.platforms.telegram && \"telegram\",\n ctx.platforms.discord && \"discord\",\n ].filter(Boolean).join(\", \");\n logInfo(\"main\", \"\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 BRIDGE START \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\");\n logInfo(\"main\", `v${ctx.version}${ctx.commit ? \"-\" + ctx.commit : \"\"} (platforms=${enabledList}, log=${ctx.config.logLevel})`);\n if (ctx.sttConfig) logInfo(\"main\", `\uD83C\uDFA4 STT enabled (${ctx.sttConfig.provider}/${ctx.sttConfig.model || \"whisper-large-v3\"})`);\n if (ctx.ttsConfig) logInfo(\"main\", `\uD83D\uDD0A TTS enabled (Edge TTS / ${ctx.ttsConfig.voice})`);\n\n // Truncate launchd.log on startup \u2014 bridge logger takes over, previous crash output already captured\n try { writeFileSync(join(abtarsHome(), \"logs\", \"launchd.log\"), \"\", \"utf-8\"); } catch (err) { logAndSwallow(\"phase_config\", \"op\", err); }\n\n // Load hooks config\n const { loadHookConfig } = await import(\"../components/hooks/hook-system.js\");\n loadHookConfig();\n return \"ran\";\n}\n", "/**\n * Parse platform flags. Single source of truth: .env *_ENABLED vars.\n * CLI flags (--telegram, --discord, etc.) override for one-off testing only.\n * Transport override: --acp / --tmux.\n */\n\nimport { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\n\nfunction envBool(key: string): boolean | undefined {\n const v = process.env[key];\n if (v === undefined || v === \"\") return undefined;\n return v === \"true\" || v === \"1\";\n}\n\nexport function parsePlatformFlags(args?: string[]): { telegram: boolean; discord: boolean; irc: boolean; web: boolean; agent: boolean; transport?: \"tmux\" | \"acp\" | \"api\" } {\n const argv = args ?? process.argv.slice(2);\n const transport = argv.includes(\"--acp\") ? \"acp\" as const : argv.includes(\"--tmux\") ? \"tmux\" as const : undefined;\n\n // CLI flags override env (one-off testing)\n if (argv.includes(\"--telegram\") || argv.includes(\"--discord\") || argv.includes(\"--irc\") || argv.includes(\"--web\") || argv.includes(\"--agent\")) {\n return {\n telegram: argv.includes(\"--telegram\"),\n discord: argv.includes(\"--discord\"),\n irc: argv.includes(\"--irc\"),\n web: argv.includes(\"--web\"),\n agent: argv.includes(\"--agent\"),\n transport,\n };\n }\n\n // .env is SSoT \u2014 *_ENABLED vars, fallback to token/config presence\n const home = process.env[\"ABTARS_HOME\"] ?? join(homedir(), \".abtars\");\n const configDir = join(home, \"config\");\n\n const telegram = envBool(\"TELEGRAM_ENABLED\") ?? !!process.env[\"TELEGRAM_BOT_TOKEN\"];\n const discord = envBool(\"DISCORD_ENABLED\") ?? !!process.env[\"DISCORD_TOKEN\"];\n const irc = envBool(\"IRC_ENABLED\") ?? existsSync(join(configDir, \"irc.json\"));\n const web = envBool(\"ENABLE_DASHBOARD\") ?? false;\n const agent = envBool(\"ENABLE_AGENT_API\") ?? false;\n\n return { telegram, discord, irc, web, agent, transport };\n}\n"],
5
- "mappings": "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",
6
- "names": ["join", "homedir", "join", "homedir"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/cli/deploy-lib/manifest.ts", "../src/cli/deploy-lib/lock.ts", "../src/cli/deploy-lib/releases.ts", "../src/cli/deploy-lib/cleanup.ts", "../src/cli/deploy-lib/safe-copy.ts"],
4
- "sourcesContent": ["/**\n * Runtime manifest: the single source of truth for \"what's installed\".\n *\n * Location: $HOME/manifest.json (per packagePaths().manifest).\n * Read by: `status`, cross-package compatibility checks, doctor.\n * Written by: `install`, `update`, `rollback`, migrations.\n */\n\nimport { readFile, writeFile } from 'node:fs/promises';\n\nexport interface Manifest {\n readonly package: 'abtars' | 'abmind';\n /** Currently active release version. */\n readonly version: string;\n /** Git SHA of the source that produced the active release, if known. */\n readonly commit: string | null;\n /** Git branch, if known. */\n readonly branch: string | null;\n /** Hash of package-lock.json at time of last install. */\n readonly packageLockHash: string | null;\n /** ISO timestamp of when the active release became active. */\n readonly activatedAt: string;\n /** Hostname where install lives (informational). */\n readonly host: string;\n /** Source adapter that produced the current release. */\n readonly source: 'dev' | 'alpha' | 'stable' | 'local' | 'npm' | 'github';\n /** Applied migrations (ordered). */\n readonly migrationsApplied: readonly string[];\n /** Previous version (for rollback). Null on first install. */\n readonly previousVersion: string | null;\n /** Previous commit (for rollback reference). */\n readonly previousCommit: string | null;\n /** Install mode: simple (manual) or daemon (watchdog + OS integration if available). */\n readonly installMode?: 'simple' | 'daemon';\n /** Repo root path (set when source=local). Null for npm installs. */\n readonly repoRoot?: string | null;\n}\n\nexport async function readManifest(path: string): Promise<Manifest | null> {\n try {\n const raw = await readFile(path, 'utf-8');\n return JSON.parse(raw) as Manifest;\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') return null;\n throw err;\n }\n}\n\nexport async function writeManifest(path: string, manifest: Manifest): Promise<void> {\n await writeFile(path, JSON.stringify(manifest, null, 2) + '\\n', 'utf-8');\n}\n\nexport function emptyManifest(pkg: 'abtars' | 'abmind', host: string): Manifest {\n return {\n package: pkg,\n version: '',\n commit: null,\n branch: null,\n packageLockHash: null,\n activatedAt: new Date().toISOString(),\n host,\n source: 'dev',\n migrationsApplied: [],\n previousVersion: null,\n previousCommit: null,\n };\n}\n", "/**\n * Update lock: prevents concurrent `install` / `update` / `rollback` runs\n * in the same runtime from colliding.\n *\n * Mechanism: write a JSON pidfile at packagePaths().lock. If file exists and\n * the PID is alive and the mtime is recent (<1h), refuse to proceed. Otherwise\n * take the lock.\n *\n * Stale timeout matches plan: 1 hour (our updates take minutes). Compared to\n * claude-code's 7-day timeout which accommodates laptop sleep during a long\n * install \u2014 not applicable for our short-lived updates.\n */\n\nimport { readFile, unlink, writeFile } from 'node:fs/promises';\nimport { unlinkSync } from 'node:fs';\nimport { hostname } from 'node:os';\n\nconst STALE_MS = 5 * 60 * 1000; // 5 minutes \u2014 deploys take <2min\n\nexport interface LockContent {\n readonly pid: number;\n readonly host: string;\n readonly startedAt: string;\n readonly cmd: string;\n}\n\nexport class LockHeldError extends Error {\n constructor(\n public readonly content: LockContent,\n public readonly isStale: boolean,\n ) {\n const staleMsg = isStale ? ' (appears stale \u2014 process may have crashed)' : '';\n super(\n `Lock held by pid ${content.pid} since ${content.startedAt} ` +\n `(cmd: ${content.cmd})${staleMsg}`,\n );\n this.name = 'LockHeldError';\n }\n}\n\nfunction isPidAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch (err) {\n return (err as NodeJS.ErrnoException).code === 'EPERM';\n }\n}\n\nasync function readLock(path: string): Promise<LockContent | null> {\n try {\n return JSON.parse(await readFile(path, 'utf-8')) as LockContent;\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') return null;\n throw err;\n }\n}\n\n/**\n * Acquire the lock or throw LockHeldError. Returns a release function.\n * Caller must call release() on both success and failure; the returned\n * function is idempotent.\n */\nexport async function acquireLock(path: string, cmd: string): Promise<() => Promise<void>> {\n const existing = await readLock(path);\n if (existing) {\n const alive = isPidAlive(existing.pid);\n const started = Date.parse(existing.startedAt);\n const age = Date.now() - (Number.isFinite(started) ? started : 0);\n const stale = !alive || age > STALE_MS;\n if (!stale) {\n throw new LockHeldError(existing, false);\n }\n // Stale: fall through and take it, but tell the caller so doctor can surface.\n }\n\n const content: LockContent = {\n pid: process.pid,\n host: hostname(),\n startedAt: new Date().toISOString(),\n cmd,\n };\n await writeFile(path, JSON.stringify(content, null, 2) + '\\n', 'utf-8');\n\n let released = false;\n const release = async (): Promise<void> => {\n if (released) return;\n released = true;\n try {\n await unlink(path);\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== 'ENOENT') throw err;\n }\n };\n\n // Best-effort cleanup on unexpected exit.\n const exitHandler = (): void => {\n try {\n unlinkSync(path);\n } catch {\n /* ignore \u2014 stale detection handles orphans next run */\n }\n };\n process.once('exit', exitHandler);\n\n return release;\n}\n\nexport async function inspectLock(path: string): Promise<\n | { held: false }\n | { held: true; content: LockContent; stale: boolean }\n> {\n const content = await readLock(path);\n if (!content) return { held: false };\n const alive = isPidAlive(content.pid);\n const started = Date.parse(content.startedAt);\n const age = Date.now() - (Number.isFinite(started) ? started : 0);\n const stale = !alive || age > STALE_MS;\n return { held: true, content, stale };\n}\n", "/**\n * Deploy primitives: atomic swap, config snapshot, health probe, hash.\n *\n * #785: replaces the old releases/current symlink model with\n * app/ + app.prev/ atomic rename swap.\n */\n\nimport { createHash } from 'node:crypto';\nimport { existsSync, mkdirSync, rmSync, renameSync, readdirSync, cpSync, readFileSync, writeFileSync } from 'node:fs';\nimport { readFile } from 'node:fs/promises';\nimport { join } from 'node:path';\n\n/**\n * Atomic swap with 3-prior rotation.\n * app.prev.3/ \u2192 delete, app.prev.2/ \u2192 .3, app.prev.1/ \u2192 .2, app/ \u2192 .prev.1, staging/ \u2192 app/\n * Backward compat: migrates old app.prev/ \u2192 app.prev.1/ if found.\n */\nexport function atomicSwap(appDir: string, _appPrevLegacy: string, appStagingDir: string): void {\n const prev1 = appDir.replace(/\\/app$/, '/app.prev.1');\n const prev2 = appDir.replace(/\\/app$/, '/app.prev.2');\n const prev3 = appDir.replace(/\\/app$/, '/app.prev.3');\n const legacyPrev = _appPrevLegacy; // app.prev/ (old format)\n\n // Migrate old app.prev/ \u2192 app.prev.1/ if exists\n if (existsSync(legacyPrev) && !existsSync(prev1)) {\n renameSync(legacyPrev, prev1);\n } else if (existsSync(legacyPrev)) {\n rmSync(legacyPrev, { recursive: true, force: true });\n }\n\n // Skip rotation if current app/ has same version as staging (no-op redeploy)\n try {\n const curPkg = join(appDir, \"package.json\");\n const stagePkg = join(appStagingDir, \"package.json\");\n if (existsSync(curPkg) && existsSync(stagePkg)) {\n const curVer = JSON.parse(readFileSync(curPkg, \"utf-8\")).version;\n const stageVer = JSON.parse(readFileSync(stagePkg, \"utf-8\")).version;\n if (curVer && curVer === stageVer) {\n // Same version \u2014 just replace app/ without rotating priors\n rmSync(appDir, { recursive: true, force: true });\n renameSync(appStagingDir, appDir);\n return;\n }\n }\n } catch { /* proceed with normal rotation if read fails */ }\n\n // Rotate: 3 \u2192 delete, 2 \u2192 3, 1 \u2192 2\n if (existsSync(prev3)) rmSync(prev3, { recursive: true, force: true });\n if (existsSync(prev2)) renameSync(prev2, prev3);\n if (existsSync(prev1)) renameSync(prev1, prev2);\n\n // app/ \u2192 app.prev.1/\n if (existsSync(appDir)) renameSync(appDir, prev1);\n\n // app.staging/ \u2192 app/\n renameSync(appStagingDir, appDir);\n}\n\n/**\n * Rotate config snapshots (3 slots) and create a fresh snapshot.\n * Excludes .pre-update* dirs from the copy to avoid recursion.\n */\nexport function configSnapshot(configDir: string): void {\n const slot0 = join(configDir, '.pre-update');\n const slot1 = join(configDir, '.pre-update.1');\n const slot2 = join(configDir, '.pre-update.2');\n\n // Rotate\n if (existsSync(slot2)) rmSync(slot2, { recursive: true, force: true });\n if (existsSync(slot1)) renameSync(slot1, slot2);\n if (existsSync(slot0)) renameSync(slot0, slot1);\n\n // Fresh snapshot \u2014 copy config/ contents excluding .pre-update* dirs\n mkdirSync(slot0, { recursive: true });\n if (!existsSync(configDir)) return;\n for (const entry of readdirSync(configDir, { withFileTypes: true })) {\n if (entry.name.startsWith('.pre-update')) continue;\n const src = join(configDir, entry.name);\n const dst = join(slot0, entry.name);\n if (entry.isDirectory()) {\n cpSync(src, dst, { recursive: true });\n } else {\n cpSync(src, dst);\n }\n }\n}\n\n/**\n * Poll bridge.lock for a fresh lastHeartbeat after restart.\n * Returns true if healthy within timeoutMs, false otherwise.\n */\nexport async function healthProbe(\n home: string,\n afterTimestamp: number,\n timeoutMs: number = 60_000,\n): Promise<{ healthy: boolean; pid?: number; heartbeat?: number }> {\n const lockPath = join(home, 'bridge.lock');\n const deadline = Date.now() + timeoutMs;\n const oldPid = (() => { try { return JSON.parse(readFileSync(lockPath, 'utf-8')).pid; } catch { return 0; } })();\n while (Date.now() < deadline) {\n try {\n const content = JSON.parse(await readFile(lockPath, 'utf-8'));\n // Verify bridge restarted (new PID) AND is healthy (fresh heartbeat)\n if (content.pid !== oldPid && content.lastHeartbeat && content.lastHeartbeat > afterTimestamp) {\n return { healthy: true, pid: content.pid, heartbeat: content.lastHeartbeat };\n }\n } catch {}\n await new Promise(r => setTimeout(r, 3000));\n }\n return { healthy: false };\n}\n\n/**\n * Write/read/clear the update sentinel.\n */\nexport interface UpdateSentinel {\n version: string;\n previousVersion: string | null;\n startedAt: string;\n status: 'pending' | 'success';\n}\n\nexport function writeSentinel(home: string, sentinel: UpdateSentinel): void {\n const dir = join(home, 'state');\n mkdirSync(dir, { recursive: true });\n writeFileSync(join(dir, 'update.sentinel'), JSON.stringify(sentinel, null, 2) + '\\n');\n}\n\nexport function readSentinel(home: string): UpdateSentinel | null {\n try {\n const content = readFileSync(join(home, 'state', 'update.sentinel'), 'utf-8');\n return JSON.parse(content);\n } catch {\n return null;\n }\n}\n\nexport function clearSentinel(home: string, _version: string): void {\n const path = join(home, 'state', 'update.sentinel');\n if (!existsSync(path)) return;\n try {\n const sentinel: UpdateSentinel = JSON.parse(readFileSync(path, 'utf-8'));\n sentinel.status = 'success';\n writeFileSync(path, JSON.stringify(sentinel, null, 2) + '\\n');\n } catch {\n // Best effort\n }\n}\n\nexport async function hashFile(path: string): Promise<string | null> {\n try {\n const buf = await readFile(path);\n return createHash('sha256').update(buf).digest('hex');\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') return null;\n throw err;\n }\n}\n\n/**\n * Clean up stale app.staging/ from a previously interrupted update.\n */\nexport function cleanStaleStaging(stagingDir: string): void {\n if (existsSync(stagingDir)) {\n rmSync(stagingDir, { recursive: true, force: true });\n }\n}\n", "/**\n * Safety-guarded destructive ops for `reset` / `uninstall`.\n *\n * Cleanup utilities for deploy operations.\n * Key primitive: isUnsafeRemovalTarget() rejects catastrophic paths ('/',\n * '~', empty, etc.) BEFORE any caller invokes rm. Caller must always check.\n */\n\nimport { rm } from 'node:fs/promises';\nimport { homedir } from 'node:os';\nimport { resolve } from 'node:path';\n\n/**\n * True if the path is something we refuse to remove, regardless of flags.\n *\n * Rejects:\n * - empty / whitespace-only strings\n * - '/', '\\\\', or any path that resolves to root\n * - '~' (home), home dir itself, or parents of home\n * - Anything not under the user's home dir (defense-in-depth against\n * config pointing at /etc/... by mistake)\n *\n * Callers SHOULD still confirm with the user before removing even \"safe\"\n * paths; this function is a hard floor, not a substitute for confirmation.\n */\nexport function isUnsafeRemovalTarget(path: string): boolean {\n const trimmed = path.trim();\n if (trimmed === '') return true;\n if (trimmed === '~' || trimmed === '/' || trimmed === '\\\\') return true;\n const abs = resolve(trimmed);\n if (abs === '/' || abs === '') return true;\n const home = homedir();\n if (abs === home) return true;\n // Must be under home (defense in depth).\n const homeWithSep = home.endsWith('/') ? home : home + '/';\n if (!abs.startsWith(homeWithSep)) return true;\n return false;\n}\n\nexport interface RemovePlan {\n readonly path: string;\n readonly willRemove: boolean;\n readonly reason: string;\n}\n\n/**\n * Plan a remove without executing. Used by --dry-run flows in reset/uninstall.\n */\nexport function planRemoval(path: string): RemovePlan {\n if (isUnsafeRemovalTarget(path)) {\n return { path, willRemove: false, reason: 'refused: unsafe target' };\n }\n return { path, willRemove: true, reason: 'would remove recursively' };\n}\n\n/**\n * Remove a path after validating safety. Throws if the target is unsafe.\n * Returns true if the path was removed, false if it didn't exist.\n */\nexport async function removePath(path: string, opts: { dryRun?: boolean } = {}): Promise<boolean> {\n if (isUnsafeRemovalTarget(path)) {\n throw new Error(`Refused to remove unsafe target: ${path}`);\n }\n if (opts.dryRun) return true;\n try {\n await rm(path, { recursive: true });\n return true;\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') return false;\n throw err;\n }\n}\n", "/**\n * Safe recursive copy that skips non-regular-file entries Node's cp()\n * refuses to handle (EINVAL on sockets). Real runtime roots can contain\n * UNIX sockets (browser.sock, memory.sock, etc.) which are ephemeral IPC\n * endpoints \u2014 not data we want or can back up.\n *\n * Skipped: sockets, FIFOs, block devices, character devices.\n * Copied: regular files, directories, symlinks.\n */\n\nimport { cp, lstat } from 'node:fs/promises';\n\nexport interface SafeCopyOptions {\n readonly preserveTimestamps?: boolean;\n /** Overwrite existing entries at the destination. Default: false. */\n readonly force?: boolean;\n}\n\nasync function shouldCopy(src: string): Promise<boolean> {\n try {\n const s = await lstat(src);\n if (s.isSocket() || s.isFIFO() || s.isBlockDevice() || s.isCharacterDevice()) {\n return false;\n }\n return true;\n } catch {\n // Let the subsequent cp call surface the real error if any.\n return true;\n }\n}\n\nexport async function safeCopyTree(src: string, dst: string, opts: SafeCopyOptions = {}): Promise<void> {\n await cp(src, dst, {\n recursive: true,\n preserveTimestamps: opts.preserveTimestamps === true,\n force: opts.force === true,\n filter: shouldCopy,\n });\n}\n"],
5
- "mappings": "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",
6
- "names": ["readFile", "writeFile", "readFile"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/paths.ts"],
4
- "sourcesContent": ["import { resolve, join, relative } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { mkdirSync, readFileSync, realpathSync, existsSync } from \"node:fs\";\n\n/** Base directory for all Abtars runtime data. Override with ABTARS_HOME env var. */\nexport function abtarsHome(): string {\n return process.env.ABTARS_HOME ?? resolve(homedir(), \".abtars\");\n}\n\n/** Base directory for abmind runtime data. Override with ABMIND_HOME env var. */\nexport function abmindHome(): string {\n return process.env.ABMIND_HOME ?? resolve(homedir(), \".abmind\");\n}\n\nlet _abtarsRootCache: string | null = null;\n\n/**\n * Root of the active release (code, prompts, scripts, templates).\n * Resolves ~/.abtars-releases/current symlink. Falls back to legacy layout.\n * Override with ABTARS_ROOT env var (always re-read, not cached).\n */\nexport function abtarsRoot(): string {\n if (process.env.ABTARS_ROOT) return process.env.ABTARS_ROOT;\n if (_abtarsRootCache) return _abtarsRootCache;\n const releasesDir = resolve(homedir(), \".abtars-releases\", \"current\");\n if (existsSync(releasesDir)) { _abtarsRootCache = realpathSync(releasesDir); return _abtarsRootCache; }\n // Legacy fallback: app/ inside abtarsHome (pre-#1089)\n const legacyApp = join(abtarsHome(), \"app\");\n if (existsSync(legacyApp)) { _abtarsRootCache = legacyApp; return _abtarsRootCache; }\n // Ultimate fallback: relative to this file (npm package layout)\n _abtarsRootCache = resolve(__dirname, \"..\");\n return _abtarsRootCache;\n}\n\n/** Single source of truth for deployed version. Reads ~/.abtars/manifest.json. */\nexport function getDeployedVersion(): { version: string; commit: string } {\n try {\n const manifest = JSON.parse(readFileSync(join(abtarsHome(), \"manifest.json\"), \"utf-8\"));\n return { version: manifest.version ?? \"?\", commit: manifest.commit ?? \"\" };\n } catch { return { version: \"?\", commit: \"\" }; }\n}\n\n// \u2500\u2500 Lazy directory creation \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nlet lazyRootsCache: string[] | null = null;\n\n/** Set allowed lazy roots (called once at boot from manifest). */\nexport function setLazyRoots(roots: string[]): void { lazyRootsCache = roots; }\n\n/**\n * Create a directory under abtarsHome if it doesn't exist.\n * If lazyRoots are configured, warns on undeclared paths.\n */\nexport function ensureDir(absPath: string): void {\n const home = abtarsHome();\n const rel = relative(home, absPath);\n if (lazyRootsCache && !rel.startsWith(\"..\") && rel !== \"\") {\n const allowed = lazyRootsCache.some(root => rel === root || rel.startsWith(root + \"/\"));\n if (!allowed) {\n // Check if it's an eager dir (those are always allowed)\n const isEager = [\"config\", \"logs\", \"scripts\", \"bin\", \"releases\"].some(d => rel === d || rel.startsWith(d + \"/\"));\n if (!isEager) {\n // eslint-disable-next-line no-console\n console.warn(`[manifest] ensureDir: \"${rel}\" is not under a declared lazyRoot or eager directory`);\n }\n }\n }\n mkdirSync(absPath, { recursive: true });\n}\n\n\n"],
5
- "mappings": ";;;;;;;AAAA,SAAS,SAAS,MAAM,gBAAgB;AACxC,SAAS,eAAe;AACxB,SAAS,WAAW,cAAc,cAAc,kBAAkB;AAG3D,SAAS,aAAqB;AACnC,SAAO,QAAQ,IAAI,eAAe,QAAQ,QAAQ,GAAG,SAAS;AAChE;AAGO,SAAS,aAAqB;AACnC,SAAO,QAAQ,IAAI,eAAe,QAAQ,QAAQ,GAAG,SAAS;AAChE;AASO,SAAS,aAAqB;AACnC,MAAI,QAAQ,IAAI,YAAa,QAAO,QAAQ,IAAI;AAChD,MAAI,iBAAkB,QAAO;AAC7B,QAAM,cAAc,QAAQ,QAAQ,GAAG,oBAAoB,SAAS;AACpE,MAAI,WAAW,WAAW,GAAG;AAAE,uBAAmB,aAAa,WAAW;AAAG,WAAO;AAAA,EAAkB;AAEtG,QAAM,YAAY,KAAK,WAAW,GAAG,KAAK;AAC1C,MAAI,WAAW,SAAS,GAAG;AAAE,uBAAmB;AAAW,WAAO;AAAA,EAAkB;AAEpF,qBAAmB,QAAQ,iBAAW,IAAI;AAC1C,SAAO;AACT;AAGO,SAAS,qBAA0D;AACxE,MAAI;AACF,UAAM,WAAW,KAAK,MAAM,aAAa,KAAK,WAAW,GAAG,eAAe,GAAG,OAAO,CAAC;AACtF,WAAO,EAAE,SAAS,SAAS,WAAW,KAAK,QAAQ,SAAS,UAAU,GAAG;AAAA,EAC3E,QAAQ;AAAE,WAAO,EAAE,SAAS,KAAK,QAAQ,GAAG;AAAA,EAAG;AACjD;AAOO,SAAS,aAAa,OAAuB;AAAE,mBAAiB;AAAO;AAMvE,SAAS,UAAU,SAAuB;AAC/C,QAAM,OAAO,WAAW;AACxB,QAAM,MAAM,SAAS,MAAM,OAAO;AAClC,MAAI,kBAAkB,CAAC,IAAI,WAAW,IAAI,KAAK,QAAQ,IAAI;AACzD,UAAM,UAAU,eAAe,KAAK,UAAQ,QAAQ,QAAQ,IAAI,WAAW,OAAO,GAAG,CAAC;AACtF,QAAI,CAAC,SAAS;AAEZ,YAAM,UAAU,CAAC,UAAU,QAAQ,WAAW,OAAO,UAAU,EAAE,KAAK,OAAK,QAAQ,KAAK,IAAI,WAAW,IAAI,GAAG,CAAC;AAC/G,UAAI,CAAC,SAAS;AAEZ,gBAAQ,KAAK,0BAA0B,GAAG,uDAAuD;AAAA,MACnG;AAAA,IACF;AAAA,EACF;AACA,YAAU,SAAS,EAAE,WAAW,KAAK,CAAC;AACxC;AApEA,IAcI,kBA8BA;AA5CJ;AAAA;AAcA,IAAI,mBAAkC;AA8BtC,IAAI,iBAAkC;AAAA;AAAA;",
6
- "names": []
7
- }