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
@@ -0,0 +1,7 @@
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/update-sources/registry-client.ts"],
4
+ "sourcesContent": ["/**\n * Unified deploy flow. #1085 unified install+update; #1237 split into:\n * - obtain (sync + prepare + abmind) \u2014 fail-safe, may run as old code\n * - deployActivation() \u2014 brick-risk, runs fresh via __deploy\n * deploy() keeps the monolithic path (obtain+activate) for --local and tests.\n */\nimport { hostname, homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { existsSync, readFileSync, writeFileSync, rmSync, cpSync, mkdirSync, copyFileSync } from \"node:fs\";\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport { execSync } from \"node:child_process\";\nimport { acquireLock, cleanStaleStaging, healthProbe, packagePaths, readManifest, writeManifest, emptyManifest } from \"../deploy-lib/index.js\";\nimport { resolveAbmindHome } from \"./paths.js\";\nimport { makeLocalBuildSource } from \"../update-sources/dev.js\";\nimport { makeNpmSource } from \"../update-sources/npm.js\";\nimport type { SourceName, StagedRelease } 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\n/**\n * Sync source repos into <releasesDir>/src \u2014 clone if missing, fetch+reset if\n * present, nuke+reclone on failure. Throws if a required repo (abtars) cannot\n * be synced. Obtain step \u2014 fail-safe (no release is swapped here).\n */\nexport function syncSrcRepos(srcDir: string, names: readonly string[]): void {\n mkdirSync(srcDir, { recursive: true });\n for (const name of names) {\n const dir = join(srcDir, name);\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\") throw err;\n }\n }\n }\n}\n\n// abmind is no longer built or bundled by abtars (#1243) \u2014 it ships as a\n// separate global package, discovered at runtime via import(\"abmind\").\n\n/**\n * Monolithic deploy: obtain (sync + prepare + abmind) then activate.\n * Used by `abtars update --local <dir>` and as the single-process path.\n * The bootstrap (#1237) instead obtains, then execs fresh `__deploy` which\n * calls deployActivation() directly.\n */\nexport async function deploy(opts: DeployOptions): Promise<number> {\n const paths = packagePaths(\"abtars\");\n\n if (!opts.localDir) {\n const srcDir = join(paths.releasesDir, \"src\");\n try { syncSrcRepos(srcDir, [\"abtars\"]); } catch { return 1; }\n }\n\n const repoRoot = opts.localDir ?? join(paths.releasesDir, \"src\", \"abtars\");\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 const { migrateIfNeeded } = await import(\"./migrate-layout.js\");\n migrateIfNeeded(paths.home);\n\n const release = await acquireLock(paths.lock, \"deploy\");\n try {\n cleanStaleStaging(paths.appStaging);\n process.stdout.write(`Building from ${repoRoot}...\\n`);\n\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 return await deployActivation({ staged, channel: opts.source, repoRoot });\n } finally {\n await release();\n }\n}\n\n/**\n * `__deploy` CLI entry \u2014 runs as FRESHLY-staged code (the bundle the bootstrap\n * just produced). Consumes a StagedRelease via flags and performs activation\n * only. Hidden command; stable, forward-compatible arg contract:\n * __deploy --staged <dir> --version <v> [--commit <c>] [--branch <b>]\n * [--channel dev|alpha|stable] [--package-lock-hash <h>] [--repo-root <dir>]\n * Unknown flags are ignored.\n */\nexport async function deployActivationCli(flags: ReadonlyMap<string, string | boolean>): Promise<number> {\n const str = (k: string): string | undefined => (typeof flags.get(k) === \"string\" ? (flags.get(k) as string) : undefined);\n const stagedPath = str(\"staged\");\n if (!stagedPath) {\n process.stderr.write(`__deploy: --staged <dir> is required\\n`);\n return 2;\n }\n const paths = packagePaths(\"abtars\");\n const channel = (str(\"channel\") ?? \"dev\") as SourceName;\n const staged: StagedRelease = {\n version: str(\"version\") ?? \"unknown\",\n stagedPath,\n commit: str(\"commit\") ?? null,\n branch: str(\"branch\") ?? null,\n packageLockHash: str(\"package-lock-hash\") ?? null,\n source: channel,\n };\n const repoRoot = str(\"repo-root\") ?? join(paths.releasesDir, \"src\", \"abtars\");\n\n const { migrateIfNeeded } = await import(\"./migrate-layout.js\");\n migrateIfNeeded(paths.home);\n\n const release = await acquireLock(paths.lock, \"deploy\");\n try {\n return await deployActivation({ staged, channel, repoRoot });\n } finally {\n await release();\n }\n}\n\n/**\n * Activation: stage \u2192 releases/<commit> \u2192 history \u2192 symlink \u2192 refresh \u2192\n * manifest \u2192 stop \u2192 respawn \u2192 healthProbe. BRICK-RISK \u2014 always runs fresh.\n * Caller MUST hold the deploy lock. Does not build/fetch (obtain is done).\n *\n * The stop/respawn sequence (Step 7/8) is FROZEN (abtars.md watchdog) \u2014 moved\n * verbatim from the previous monolithic deploy().\n *\n * BASH MIRROR: scripts/emergency-update.sh reimplements this activation in pure\n * shell as the zero-dependency last resort (no deployed binary needed). If this\n * stop/respawn sequence or the release path layout changes, update it too.\n */\nasync function deployActivation(args: { staged: StagedRelease; channel: SourceName; repoRoot: string }): Promise<number> {\n const { staged, channel, repoRoot } = args;\n const paths = packagePaths(\"abtars\");\n const isFirstInstall = !existsSync(paths.manifest);\n process.stdout.write(`[__deploy] activating ${staged.version} from ${staged.stagedPath}\\n`);\n\n // Validate entry point\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: unlink } = 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 // Copy (not rename): the running __deploy CLI execs from staged.stagedPath;\n // moving it would break code-split dynamic imports. staged/ is reclaimed by\n // cleanStaleStaging on the next bootstrap.\n cpSync(staged.stagedPath, releaseDir, { recursive: true });\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 { unlink(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: channel,\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: channel,\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 (FROZEN \u2014 abtars.md watchdog) \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(homedir(), \"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 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}\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 = resolveAbmindHome();\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(homedir(), \"Library/LaunchAgents/com.abtars.watchdog.plist\");\n if (existsSync(src)) {\n let srcContent = readFileSync(src, \"utf-8\").replace(/\\{\\{HOME\\}\\}/g, homedir());\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(homedir(), \".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// abmind is no longer copied into the release (#1243) \u2014 it is discovered at\n// runtime from the global install. The legacy two-mode copy (sibling-repo\n// rebuild + registry tarball) lived here.\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). npm ci wipes node_modules\n // and installs from package-lock.json \u2014 also clears any stale pnpm store\n // (the .pnpm workspace: links that npm cannot parse). (#1234)\n if (opts.skipInstall !== true) {\n runCmd('npm', ['ci'], repoRoot);\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", "/**\n * registry-client.ts \u2014 Direct npm registry HTTP fetch (#1176).\n * No npm/pnpm CLI dependency. Pure fetch() + tar.\n */\nimport { writeFileSync } from \"node:fs\";\n\nconst REGISTRY = \"https://registry.npmjs.org\";\nconst METADATA_TIMEOUT_MS = 30_000;\nconst TARBALL_TIMEOUT_MS = 120_000;\n\nexport interface ResolvedVersion {\n version: string;\n tarballUrl: string;\n}\n\n/** Resolve a dist-tag (alpha, latest) to a concrete version + tarball URL. */\nexport async function resolveVersion(packageName: string, tag: string): Promise<ResolvedVersion> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), METADATA_TIMEOUT_MS);\n try {\n const res = await fetch(`${REGISTRY}/${packageName}`, {\n headers: { Accept: \"application/vnd.npm.install-v1+json\" },\n signal: controller.signal,\n });\n if (!res.ok) throw new Error(`Registry returned ${res.status} for ${packageName}`);\n const data = await res.json() as { \"dist-tags\"?: Record<string, string>; versions?: Record<string, { dist?: { tarball?: string } }> };\n const version = data[\"dist-tags\"]?.[tag];\n if (!version) throw new Error(`No dist-tag '${tag}' for ${packageName}`);\n const tarballUrl = data.versions?.[version]?.dist?.tarball;\n if (!tarballUrl) throw new Error(`No tarball URL for ${packageName}@${version}`);\n return { version, tarballUrl };\n } finally {\n clearTimeout(timer);\n }\n}\n\n/** Download a tarball to a local file path. */\nexport async function downloadTarball(url: string, destPath: string): Promise<void> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), TARBALL_TIMEOUT_MS);\n try {\n const res = await fetch(url, { signal: controller.signal });\n if (!res.ok) throw new Error(`Tarball download failed: ${res.status} ${url}`);\n const buf = Buffer.from(await res.arrayBuffer());\n writeFileSync(destPath, buf);\n } finally {\n clearTimeout(timer);\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["join", "existsSync", "readFileSync", "writeFileSync", "cpSync", "mkdir", "writeFile", "pkgVersion", "version", "stagedPath", "spawnSync", "existsSync", "mkdir", "rm", "join", "spawnSync", "join", "rm", "mkdir", "existsSync", "readFileSync", "join", "existsSync", "cpSync", "writeFileSync", "mkdir", "writeFile"]
7
+ }
@@ -3,24 +3,27 @@
3
3
  import {
4
4
  init_kanban_board,
5
5
  kanban_board_exports
6
- } from "./chunk-S6HEHCCG.js";
6
+ } from "./chunk-RO3TAYBR.js";
7
+ import {
8
+ init_lazy_require,
9
+ resolveNativeDep
10
+ } from "./chunk-GFAJSPMD.js";
7
11
  import {
8
12
  init_nerve,
9
13
  nerve
10
- } from "./chunk-YME7NRGP.js";
14
+ } from "./chunk-B2TIRDZC.js";
11
15
  import {
12
16
  init_logger,
13
17
  logInfo,
14
18
  logWarn
15
- } from "./chunk-OOKNHOCB.js";
19
+ } from "./chunk-6S3G6GPO.js";
16
20
  import {
17
21
  abtarsHome,
18
22
  init_paths
19
- } from "./chunk-H2K23MOF.js";
23
+ } from "./chunk-7XXISOHU.js";
20
24
  import {
21
25
  __esm,
22
26
  __export,
23
- __require,
24
27
  __toCommonJS
25
28
  } from "./chunk-7K2YZTLD.js";
26
29
 
@@ -39,10 +42,12 @@ __export(kanban_channel_exports, {
39
42
  import { join } from "node:path";
40
43
  import { mkdirSync } from "node:fs";
41
44
  function db() {
42
- if (!_db) {
43
- const dir = join(abtarsHome(), "kanban");
44
- mkdirSync(dir, { recursive: true });
45
- const Database = __require("better-sqlite3");
45
+ if (_dbAttempted) return _db;
46
+ _dbAttempted = true;
47
+ const dir = join(abtarsHome(), "kanban");
48
+ mkdirSync(dir, { recursive: true });
49
+ try {
50
+ const Database = resolveNativeDep("better-sqlite3");
46
51
  _db = new Database(join(dir, "kanban.db"));
47
52
  _db.pragma("journal_mode = WAL");
48
53
  _db.exec(`CREATE TABLE IF NOT EXISTS agent_channel (
@@ -73,18 +78,25 @@ function db() {
73
78
  _db.exec(`CREATE INDEX IF NOT EXISTS idx_ac_dedup ON agent_channel(card_id, from_agent, created_at)`);
74
79
  } catch {
75
80
  }
81
+ } catch {
82
+ logWarn("channel", "better-sqlite3 not available \u2014 channel features disabled (run: abtars deps install)");
83
+ _db = null;
76
84
  }
77
85
  return _db;
78
86
  }
79
87
  function channelPost(cardId, from, to, message, directive = false, msgType = "progress") {
88
+ const d = db();
89
+ if (!d) return 0;
80
90
  if (message.length > MAX_MESSAGE_LEN) message = message.slice(0, MAX_MESSAGE_LEN) + "\u2026";
81
- const stmt = db().prepare("INSERT INTO agent_channel (card_id, from_agent, to_agent, message, directive, msg_type) VALUES (?, ?, ?, ?, ?, ?)");
91
+ const stmt = d.prepare("INSERT INTO agent_channel (card_id, from_agent, to_agent, message, directive, msg_type) VALUES (?, ?, ?, ?, ?, ?)");
82
92
  const result = stmt.run(cardId, from, to || "ALL", message, directive ? 1 : 0, msgType);
83
93
  nerve.fire("channel:message", cardId, { from, to: to || "ALL", message });
84
94
  logInfo("channel", `[${from}\u2192${to || "ALL"}] card:${cardId} (${message.length} chars${directive ? ", directive" : ""})`);
85
95
  return result.lastInsertRowid;
86
96
  }
87
97
  function channelRead(cardId, opts) {
98
+ const d = db();
99
+ if (!d) return [];
88
100
  let sql = "SELECT id, card_id, from_agent, to_agent, message, directive, created_at, remote_peer, msg_type FROM agent_channel WHERE card_id = ?";
89
101
  const params = [cardId];
90
102
  if (opts?.since) {
@@ -96,43 +108,51 @@ function channelRead(cardId, opts) {
96
108
  params.push(opts.from);
97
109
  }
98
110
  sql += " ORDER BY created_at ASC";
99
- return db().prepare(sql).all(...params);
111
+ return d.prepare(sql).all(...params);
100
112
  }
101
113
  function channelUnread(cardId, agentName) {
114
+ const d = db();
115
+ if (!d) return [];
102
116
  const sql = `SELECT id, card_id, from_agent, to_agent, message, directive, created_at
103
117
  FROM agent_channel
104
118
  WHERE card_id = ? AND to_agent IN ('ALL', ?) AND last_seen_by NOT LIKE ?
105
119
  ORDER BY directive DESC, created_at DESC LIMIT 10`;
106
- const rows = db().prepare(sql).all(cardId, agentName, `%${agentName}%`);
120
+ const rows = d.prepare(sql).all(cardId, agentName, `%${agentName}%`);
107
121
  if (rows.length > 0) {
108
- const markStmt = db().prepare("UPDATE agent_channel SET last_seen_by = last_seen_by || ? WHERE id = ?");
122
+ const markStmt = d.prepare("UPDATE agent_channel SET last_seen_by = last_seen_by || ? WHERE id = ?");
109
123
  for (const row of rows) markStmt.run(`${agentName},`, row.id);
110
124
  }
111
125
  return rows;
112
126
  }
113
127
  function channelGc(completedCardIds) {
128
+ const d = db();
129
+ if (!d) return 0;
114
130
  if (completedCardIds.length === 0) return 0;
115
131
  const placeholders = completedCardIds.map(() => "?").join(",");
116
- const result = db().prepare(`DELETE FROM agent_channel WHERE card_id IN (${placeholders})`).run(...completedCardIds);
132
+ const result = d.prepare(`DELETE FROM agent_channel WHERE card_id IN (${placeholders})`).run(...completedCardIds);
117
133
  return result.changes;
118
134
  }
119
135
  function channelRetentionGc(activeCardIds) {
136
+ const d = db();
137
+ if (!d) return 0;
120
138
  const activeSet = activeCardIds.length ? activeCardIds.map(() => "?").join(",") : "0";
121
- const aged = db().prepare(`DELETE FROM agent_channel WHERE created_at < datetime('now', '-3 days') AND card_id NOT IN (${activeSet})`).run(...activeCardIds);
122
- const count = db().prepare("SELECT count(*) as c FROM agent_channel").get().c;
139
+ const aged = d.prepare(`DELETE FROM agent_channel WHERE created_at < datetime('now', '-3 days') AND card_id NOT IN (${activeSet})`).run(...activeCardIds);
140
+ const count = d.prepare("SELECT count(*) as c FROM agent_channel").get().c;
123
141
  let capped = 0;
124
142
  if (count > 1e3) {
125
143
  const excess = count - 800;
126
- capped = db().prepare(`DELETE FROM agent_channel WHERE id IN (SELECT id FROM agent_channel WHERE card_id NOT IN (${activeSet}) ORDER BY created_at ASC LIMIT ?)`).run(...activeCardIds, excess).changes;
144
+ capped = d.prepare(`DELETE FROM agent_channel WHERE id IN (SELECT id FROM agent_channel WHERE card_id NOT IN (${activeSet}) ORDER BY created_at ASC LIMIT ?)`).run(...activeCardIds, excess).changes;
127
145
  }
128
146
  return aged.changes + capped;
129
147
  }
130
148
  function channelPostFromRemote(cardId, from, message, createdAt, peer) {
149
+ const d = db();
150
+ if (!d) return false;
131
151
  if (message.length > MAX_MESSAGE_LEN) message = message.slice(0, MAX_MESSAGE_LEN) + "\u2026";
132
152
  try {
133
- const exists = db().prepare("SELECT 1 FROM agent_channel WHERE card_id = ? AND from_agent = ? AND created_at = ?").get(cardId, from, createdAt);
153
+ const exists = d.prepare("SELECT 1 FROM agent_channel WHERE card_id = ? AND from_agent = ? AND created_at = ?").get(cardId, from, createdAt);
134
154
  if (exists) return true;
135
- db().prepare("INSERT INTO agent_channel (card_id, from_agent, to_agent, message, created_at, remote_peer, synced) VALUES (?, ?, 'ALL', ?, ?, ?, 1)").run(cardId, from, message, createdAt, peer);
155
+ d.prepare("INSERT INTO agent_channel (card_id, from_agent, to_agent, message, created_at, remote_peer, synced) VALUES (?, ?, 'ALL', ?, ?, ?, 1)").run(cardId, from, message, createdAt, peer);
136
156
  nerve.fire("channel:message", cardId, { from, to: "ALL", message });
137
157
  return true;
138
158
  } catch {
@@ -140,15 +160,19 @@ function channelPostFromRemote(cardId, from, message, createdAt, peer) {
140
160
  }
141
161
  }
142
162
  function channelGetSince(cardId, since) {
143
- return db().prepare("SELECT id, card_id, from_agent, to_agent, message, directive, created_at FROM agent_channel WHERE card_id = ? AND created_at > ? ORDER BY created_at ASC").all(cardId, since);
163
+ const d = db();
164
+ if (!d) return [];
165
+ return d.prepare("SELECT id, card_id, from_agent, to_agent, message, directive, created_at FROM agent_channel WHERE card_id = ? AND created_at > ? ORDER BY created_at ASC").all(cardId, since);
144
166
  }
145
167
  function initChannelSync() {
146
168
  nerve.on("channel:message", (cardId, meta) => {
147
169
  if (!meta) return;
170
+ const d = db();
171
+ if (!d) return;
148
172
  const { kanbanGetCard } = (init_kanban_board(), __toCommonJS(kanban_board_exports));
149
173
  const card = kanbanGetCard(cardId);
150
174
  if (!card?.source_peer) return;
151
- const lastRow = db().prepare("SELECT remote_peer FROM agent_channel WHERE card_id = ? ORDER BY id DESC LIMIT 1").get(cardId);
175
+ const lastRow = d.prepare("SELECT remote_peer FROM agent_channel WHERE card_id = ? ORDER BY id DESC LIMIT 1").get(cardId);
152
176
  if (lastRow?.remote_peer) return;
153
177
  pushToRemote(card.source_peer, cardId, meta.from, meta.message).catch(
154
178
  (err) => logWarn("channel-sync", `Push to ${card.source_peer} failed: ${err instanceof Error ? err.message : String(err)}`)
@@ -156,19 +180,22 @@ function initChannelSync() {
156
180
  });
157
181
  }
158
182
  async function pushToRemote(peer, cardId, from, message) {
159
- const { getPeerTransport } = await import("./peer-transport-UBBXTDRP.js");
183
+ const { getPeerTransport } = await import("./peer-transport-BK5VHI2M.js");
160
184
  const transport = getPeerTransport();
161
185
  const createdAt = (/* @__PURE__ */ new Date()).toISOString().replace("T", " ").slice(0, 19);
162
186
  await transport.pushChannelMessage(peer, cardId, from, message, createdAt);
163
- db().prepare("UPDATE agent_channel SET synced = 1 WHERE card_id = ? AND synced = 0").run(cardId);
187
+ const d = db();
188
+ if (d) d.prepare("UPDATE agent_channel SET synced = 1 WHERE card_id = ? AND synced = 0").run(cardId);
164
189
  }
165
- var _db, MAX_MESSAGE_LEN;
190
+ var _db, _dbAttempted, MAX_MESSAGE_LEN;
166
191
  var init_kanban_channel = __esm({
167
192
  "src/components/tasks/kanban-channel.ts"() {
168
193
  init_paths();
169
194
  init_nerve();
170
195
  init_logger();
196
+ init_lazy_require();
171
197
  _db = null;
198
+ _dbAttempted = false;
172
199
  MAX_MESSAGE_LEN = 1e3;
173
200
  }
174
201
  });
@@ -185,4 +212,4 @@ export {
185
212
  kanban_channel_exports,
186
213
  init_kanban_channel
187
214
  };
188
- //# sourceMappingURL=chunk-SESM4GBM.js.map
215
+ //# sourceMappingURL=chunk-MPQ2PJQX.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/components/tasks/kanban-channel.ts"],
4
+ "sourcesContent": ["/**\n * kanban-channel.ts \u2014 Agent Communication Platform (#891 Phase 1).\n * Card-scoped messaging for workers, Orc, and master.\n * Same DB as kanban-board (kanban.db).\n */\n\nimport { join } from \"node:path\";\nimport { mkdirSync } from \"node:fs\";\nimport { abtarsHome } from \"../../paths.js\";\nimport { nerve } from \"../nerve.js\";\nimport { logInfo, logWarn } from \"../logger.js\";\nimport { resolveNativeDep } from \"../../utils/lazy-require.js\";\n\ntype SqliteDb = { prepare(sql: string): any; exec(sql: string): void; pragma(s: string): void };\n\nlet _db: SqliteDb | null = null;\nlet _dbAttempted = false;\n\nfunction db(): SqliteDb | null {\n if (_dbAttempted) return _db;\n _dbAttempted = true;\n const dir = join(abtarsHome(), \"kanban\");\n mkdirSync(dir, { recursive: true });\n try {\n const Database = resolveNativeDep(\"better-sqlite3\");\n _db = new Database(join(dir, \"kanban.db\")) as SqliteDb;\n _db.pragma(\"journal_mode = WAL\");\n _db.exec(`CREATE TABLE IF NOT EXISTS agent_channel (\n id INTEGER PRIMARY KEY,\n card_id INTEGER NOT NULL,\n from_agent TEXT NOT NULL,\n to_agent TEXT DEFAULT 'ALL',\n message TEXT NOT NULL,\n directive INTEGER DEFAULT 0,\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n last_seen_by TEXT DEFAULT ''\n )`);\n _db.exec(`CREATE INDEX IF NOT EXISTS idx_ac_card ON agent_channel(card_id, created_at)`);\n _db.exec(`CREATE INDEX IF NOT EXISTS idx_ac_to ON agent_channel(card_id, to_agent)`);\n // #949: remote sync columns\n try { _db.exec(`ALTER TABLE agent_channel ADD COLUMN remote_peer TEXT DEFAULT NULL`); } catch { /* already exists */ }\n try { _db.exec(`ALTER TABLE agent_channel ADD COLUMN synced INTEGER DEFAULT 1`); } catch { /* already exists */ }\n try { _db.exec(`ALTER TABLE agent_channel ADD COLUMN msg_type TEXT DEFAULT 'progress'`); } catch { /* already exists */ }\n // #949: dedup index only enforced via INSERT OR IGNORE in channelPostFromRemote\n try { _db.exec(`CREATE INDEX IF NOT EXISTS idx_ac_dedup ON agent_channel(card_id, from_agent, created_at)`); } catch { /* already exists */ }\n } catch {\n logWarn(\"channel\", \"better-sqlite3 not available \u2014 channel features disabled (run: abtars deps install)\");\n _db = null;\n }\n return _db;\n}\n\nexport interface ChannelMessage {\n id: number;\n card_id: number;\n from_agent: string;\n to_agent: string;\n message: string;\n directive: number;\n created_at: string;\n remote_peer: string | null;\n msg_type: string;\n}\n\nconst MAX_MESSAGE_LEN = 1000;\n\nexport function channelPost(cardId: number, from: string, to: string, message: string, directive = false, msgType = \"progress\"): number {\n const d = db();\n if (!d) return 0;\n if (message.length > MAX_MESSAGE_LEN) message = message.slice(0, MAX_MESSAGE_LEN) + \"\u2026\";\n const stmt = d.prepare(\"INSERT INTO agent_channel (card_id, from_agent, to_agent, message, directive, msg_type) VALUES (?, ?, ?, ?, ?, ?)\");\n const result = stmt.run(cardId, from, to || \"ALL\", message, directive ? 1 : 0, msgType);\n nerve.fire(\"channel:message\", cardId, { from, to: to || \"ALL\", message });\n logInfo(\"channel\", `[${from}\u2192${to || \"ALL\"}] card:${cardId} (${message.length} chars${directive ? \", directive\" : \"\"})`);\n return result.lastInsertRowid as number;\n}\n\nexport function channelRead(cardId: number, opts?: { since?: string; from?: string }): ChannelMessage[] {\n const d = db();\n if (!d) return [];\n let sql = \"SELECT id, card_id, from_agent, to_agent, message, directive, created_at, remote_peer, msg_type FROM agent_channel WHERE card_id = ?\";\n const params: any[] = [cardId];\n if (opts?.since) { sql += \" AND created_at > ?\"; params.push(opts.since); }\n if (opts?.from) { sql += \" AND from_agent = ?\"; params.push(opts.from); }\n sql += \" ORDER BY created_at ASC\";\n return d.prepare(sql).all(...params) as ChannelMessage[];\n}\n\n/** Get unread messages for an agent (for auto-inject). Marks as seen. */\nexport function channelUnread(cardId: number, agentName: string): ChannelMessage[] {\n const d = db();\n if (!d) return [];\n const sql = `SELECT id, card_id, from_agent, to_agent, message, directive, created_at \n FROM agent_channel \n WHERE card_id = ? AND to_agent IN ('ALL', ?) AND last_seen_by NOT LIKE ?\n ORDER BY directive DESC, created_at DESC LIMIT 10`;\n const rows = d.prepare(sql).all(cardId, agentName, `%${agentName}%`) as ChannelMessage[];\n\n // Mark as seen\n if (rows.length > 0) {\n const markStmt = d.prepare(\"UPDATE agent_channel SET last_seen_by = last_seen_by || ? WHERE id = ?\");\n for (const row of rows) markStmt.run(`${agentName},`, row.id);\n }\n return rows;\n}\n\n/** GC: delete messages for completed/archived cards. */\nexport function channelGc(completedCardIds: number[]): number {\n const d = db();\n if (!d) return 0;\n if (completedCardIds.length === 0) return 0;\n const placeholders = completedCardIds.map(() => \"?\").join(\",\");\n const result = d.prepare(`DELETE FROM agent_channel WHERE card_id IN (${placeholders})`).run(...completedCardIds);\n return result.changes as number;\n}\n\n/** GC: age + row cap enforcement. Only targets non-active cards. */\nexport function channelRetentionGc(activeCardIds: number[]): number {\n const d = db();\n if (!d) return 0;\n const activeSet = activeCardIds.length ? activeCardIds.map(() => \"?\").join(\",\") : \"0\";\n // Age: 3 days, skip active\n const aged = d.prepare(`DELETE FROM agent_channel WHERE created_at < datetime('now', '-3 days') AND card_id NOT IN (${activeSet})`).run(...activeCardIds);\n // Row cap: keep under 1000\n const count = (d.prepare(\"SELECT count(*) as c FROM agent_channel\").get() as any).c;\n let capped = 0;\n if (count > 1000) {\n const excess = count - 800;\n capped = (d.prepare(`DELETE FROM agent_channel WHERE id IN (SELECT id FROM agent_channel WHERE card_id NOT IN (${activeSet}) ORDER BY created_at ASC LIMIT ?)`).run(...activeCardIds, excess)).changes as number;\n }\n return (aged.changes as number) + capped;\n}\n\n/** #949: Insert a message pushed from a remote peer. Dedup via existence check. */\nexport function channelPostFromRemote(cardId: number, from: string, message: string, createdAt: string, peer: string): boolean {\n const d = db();\n if (!d) return false;\n if (message.length > MAX_MESSAGE_LEN) message = message.slice(0, MAX_MESSAGE_LEN) + \"\u2026\";\n try {\n const exists = d.prepare(\"SELECT 1 FROM agent_channel WHERE card_id = ? AND from_agent = ? AND created_at = ?\").get(cardId, from, createdAt);\n if (exists) return true; // already have it\n d.prepare(\"INSERT INTO agent_channel (card_id, from_agent, to_agent, message, created_at, remote_peer, synced) VALUES (?, ?, 'ALL', ?, ?, ?, 1)\")\n .run(cardId, from, message, createdAt, peer);\n nerve.fire(\"channel:message\", cardId, { from, to: \"ALL\", message });\n return true;\n } catch { return false; }\n}\n\n/** #949: Get messages since a given timestamp (for pull catch-up). */\nexport function channelGetSince(cardId: number, since: string): ChannelMessage[] {\n const d = db();\n if (!d) return [];\n return d.prepare(\"SELECT id, card_id, from_agent, to_agent, message, directive, created_at FROM agent_channel WHERE card_id = ? AND created_at > ? ORDER BY created_at ASC\")\n .all(cardId, since) as ChannelMessage[];\n}\n\n/** #949: Push channel messages to remote Orc when card has source_peer. */\nexport function initChannelSync(): void {\n nerve.on(\"channel:message\", (cardId: number, meta?: { from: string; to: string; message: string }) => {\n if (!meta) return;\n const d = db();\n if (!d) return;\n // Lazy import to avoid circular deps\n const { kanbanGetCard } = require(\"./kanban-board.js\") as typeof import(\"./kanban-board.js\");\n const card = kanbanGetCard(cardId);\n if (!card?.source_peer) return;\n // Don't push messages that came from remote (avoid echo loop)\n const lastRow = d.prepare(\"SELECT remote_peer FROM agent_channel WHERE card_id = ? ORDER BY id DESC LIMIT 1\").get(cardId) as { remote_peer: string | null } | undefined;\n if (lastRow?.remote_peer) return;\n // Push to source peer\n pushToRemote(card.source_peer, cardId, meta.from, meta.message).catch(err =>\n logWarn(\"channel-sync\", `Push to ${card.source_peer} failed: ${err instanceof Error ? err.message : String(err)}`)\n );\n });\n}\n\nasync function pushToRemote(peer: string, cardId: number, from: string, message: string): Promise<void> {\n const { getPeerTransport } = await import(\"../peer-transport/index.js\");\n const transport = getPeerTransport();\n const createdAt = new Date().toISOString().replace(\"T\", \" \").slice(0, 19);\n await transport.pushChannelMessage(peer, cardId, from, message, createdAt);\n const d = db();\n if (d) d.prepare(\"UPDATE agent_channel SET synced = 1 WHERE card_id = ? AND synced = 0\").run(cardId);\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -3,12 +3,12 @@
3
3
  import {
4
4
  init_log_and_swallow,
5
5
  logAndSwallow
6
- } from "./chunk-WP7FZHMI.js";
6
+ } from "./chunk-W2PSVV2T.js";
7
7
  import {
8
8
  init_logger,
9
9
  logInfo,
10
10
  logWarn
11
- } from "./chunk-OOKNHOCB.js";
11
+ } from "./chunk-6S3G6GPO.js";
12
12
  import {
13
13
  __esm,
14
14
  __require
@@ -287,4 +287,4 @@ export {
287
287
  SkillWatcher,
288
288
  init_skill_watcher
289
289
  };
290
- //# sourceMappingURL=chunk-FIAVVKGN.js.map
290
+ //# sourceMappingURL=chunk-MTE32OQH.js.map
@@ -2,23 +2,23 @@
2
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
3
  import {
4
4
  readEnv
5
- } from "./chunk-V6CV3QPH.js";
5
+ } from "./chunk-OWPQIBAO.js";
6
6
  import {
7
7
  init_user_registry,
8
8
  loadUsers
9
- } from "./chunk-43DKPXTP.js";
9
+ } from "./chunk-7LORCJCQ.js";
10
10
  import {
11
11
  getEnv,
12
12
  init_env_schema
13
- } from "./chunk-SSCGWDIC.js";
13
+ } from "./chunk-BWJ37KMW.js";
14
14
  import {
15
15
  init_logger,
16
16
  logError,
17
17
  logWarn
18
- } from "./chunk-OOKNHOCB.js";
18
+ } from "./chunk-6S3G6GPO.js";
19
19
  import {
20
20
  init_paths
21
- } from "./chunk-H2K23MOF.js";
21
+ } from "./chunk-7XXISOHU.js";
22
22
 
23
23
  // src/components/config.ts
24
24
  import { access, stat, constants } from "node:fs/promises";
@@ -90,7 +90,7 @@ async function validateCliPath(cliPath) {
90
90
  }
91
91
  }
92
92
  async function loadAndValidateConfig() {
93
- const { loadTransport, validateAtStartup } = await import("./transport-config-OK3MZPJK.js");
93
+ const { loadTransport, validateAtStartup } = await import("./transport-config-SF6GBV47.js");
94
94
  const tc = loadTransport();
95
95
  if (tc) {
96
96
  validateAtStartup();
@@ -213,4 +213,4 @@ export {
213
213
  isValidSnowflake,
214
214
  loadAndValidateConfig
215
215
  };
216
- //# sourceMappingURL=chunk-MV5KOWOR.js.map
216
+ //# sourceMappingURL=chunk-N3Q3TASM.js.map
@@ -3,7 +3,7 @@
3
3
  import {
4
4
  init_log_and_swallow,
5
5
  logAndSwallow
6
- } from "./chunk-WP7FZHMI.js";
6
+ } from "./chunk-W2PSVV2T.js";
7
7
  import {
8
8
  __esm,
9
9
  __export
@@ -69,4 +69,4 @@ export {
69
69
  peer_jwt_exports,
70
70
  init_peer_jwt
71
71
  };
72
- //# sourceMappingURL=chunk-IQKADER4.js.map
72
+ //# sourceMappingURL=chunk-O4YBJS2K.js.map
@@ -3,21 +3,21 @@
3
3
  import {
4
4
  getEnv,
5
5
  init_env_schema
6
- } from "./chunk-SSCGWDIC.js";
6
+ } from "./chunk-BWJ37KMW.js";
7
7
  import {
8
8
  init_log_and_swallow,
9
9
  logAndSwallow
10
- } from "./chunk-WP7FZHMI.js";
10
+ } from "./chunk-W2PSVV2T.js";
11
11
  import {
12
12
  init_logger,
13
13
  logDebug,
14
14
  logInfo,
15
15
  logWarn
16
- } from "./chunk-OOKNHOCB.js";
16
+ } from "./chunk-6S3G6GPO.js";
17
17
  import {
18
18
  abtarsHome,
19
19
  init_paths
20
- } from "./chunk-H2K23MOF.js";
20
+ } from "./chunk-7XXISOHU.js";
21
21
 
22
22
  // src/capabilities/browser/browser-manager.ts
23
23
  init_log_and_swallow();
@@ -96,13 +96,14 @@ var BrowserManager = class _BrowserManager {
96
96
  return this._launching;
97
97
  }
98
98
  async _launchPatchright() {
99
- const { chromium } = await import("cloakbrowser");
99
+ const { launch } = await import("cloakbrowser");
100
100
  const headed = getEnv().browserHeaded;
101
101
  const args = headed ? [] : ["--headless=new"];
102
102
  if (getEnv().browserNoSandbox) args.push("--no-sandbox");
103
- return chromium.launch({
103
+ return launch({
104
104
  headless: !headed,
105
105
  channel: getEnv().browserChannel,
106
+ // #1203: cloakbrowser LaunchOptions omits 'channel'; passed through to Playwright
106
107
  args
107
108
  });
108
109
  }
@@ -361,7 +362,7 @@ var BrowserTool = class {
361
362
  if (getEnv().ssrfCheck) {
362
363
  try {
363
364
  const { hostname } = new URL(url);
364
- const { isPrivateHost } = await import("./ssrf-guard-6GP4QYVA.js");
365
+ const { isPrivateHost } = await import("./ssrf-guard-E2YPLW6G.js");
365
366
  if (await isPrivateHost(hostname)) {
366
367
  return { success: false, error: `Blocked: "${hostname}" resolves to a private/internal IP address` };
367
368
  }
@@ -756,4 +757,4 @@ export {
756
757
  BrowserIpcServer,
757
758
  DomainAllowlist
758
759
  };
759
- //# sourceMappingURL=chunk-VJATH7AN.js.map
760
+ //# sourceMappingURL=chunk-OOUCUCUW.js.map