abtars 0.3.4-alpha.7 → 0.3.4

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 (348) hide show
  1. package/bundle/{_registry.generated-WGR4WOPT.js → _registry.generated-AVR7DK2A.js} +17 -14
  2. package/bundle/{_registry.generated-WGR4WOPT.js.map → _registry.generated-AVR7DK2A.js.map} +1 -1
  3. package/bundle/{abmind-lazy-7Z44NODV.js → abmind-lazy-E3YCFKQ5.js} +15 -5
  4. package/bundle/abtars-browser.js +4 -4
  5. package/bundle/abtars-cli.js +23 -13
  6. package/bundle/abtars-cli.js.map +2 -2
  7. package/bundle/abtars-restart.js +3 -3
  8. package/bundle/abtars-task.js +3 -3
  9. package/bundle/abtars-task.js.map +2 -2
  10. package/bundle/abtars.js +610 -455
  11. package/bundle/abtars.js.map +4 -4
  12. package/bundle/{acp-raw-client-E6FM45NC.js → acp-raw-client-UCNK3OTU.js} +2 -2
  13. package/bundle/{action-gate-G2V47NHW.js → action-gate-V4FCBHFB.js} +2 -2
  14. package/bundle/{agent-api-adapter-YAHKQMMZ.js → agent-api-adapter-7HEPYSIN.js} +3 -3
  15. package/bundle/{agent-api-rate-limit-WCFXJMGY.js → agent-api-rate-limit-RZSAM3SW.js} +4 -4
  16. package/bundle/{agent-registry-GI6CLT3Z.js → agent-registry-46A2R5KP.js} +7 -7
  17. package/bundle/{bootstrap-X2QYIZIJ.js → bootstrap-MIHJJSWU.js} +2 -2
  18. package/bundle/{bridge-lock-transport-4ZH7QTJP.js → bridge-lock-transport-7RSN7OLJ.js} +4 -4
  19. package/bundle/{browser-DMARZJIN.js → browser-F6BCWJWW.js} +6 -6
  20. package/bundle/{budget-45QOBDWA.js → budget-WUM3SPKW.js} +3 -3
  21. package/bundle/{capability-JFWX3IQF.js → capability-QVRKGRFC.js} +5 -5
  22. package/bundle/{chunk-YSKCQH6E.js → chunk-2IYJ4I66.js} +2 -2
  23. package/bundle/{chunk-KTYGKPYM.js → chunk-2NLUT5S2.js} +6 -6
  24. package/bundle/chunk-3BG3AIDP.js +191 -0
  25. package/bundle/chunk-3BG3AIDP.js.map +7 -0
  26. package/bundle/{chunk-OKAQICWY.js → chunk-3GQX34S2.js} +3 -3
  27. package/bundle/{chunk-QROWBWLL.js → chunk-3XZ773BS.js} +2 -2
  28. package/bundle/{chunk-DYBW4XXL.js → chunk-467SRLLR.js} +2 -2
  29. package/bundle/{chunk-LGP6TYFI.js → chunk-4AILRHUI.js} +97 -8
  30. package/bundle/chunk-4AILRHUI.js.map +7 -0
  31. package/bundle/{chunk-GPZNXY2U.js → chunk-4S3H4OK7.js} +4 -4
  32. package/bundle/{chunk-NDCRWEEJ.js → chunk-4Y5MJQRE.js} +6 -6
  33. package/bundle/{chunk-FRKW6LWB.js → chunk-55UWKI5C.js} +3 -3
  34. package/bundle/{chunk-4UL3KINB.js → chunk-5PNJFDSW.js} +8 -8
  35. package/bundle/{chunk-LUNA6PM5.js → chunk-5RVOEFGT.js} +4 -2
  36. package/bundle/{chunk-LUNA6PM5.js.map → chunk-5RVOEFGT.js.map} +2 -2
  37. package/bundle/{chunk-OXTSWQCX.js → chunk-5Y3FJ2Y7.js} +2 -2
  38. package/bundle/{chunk-TMUYFERL.js → chunk-6B5ZFUPD.js} +2 -2
  39. package/bundle/{chunk-65VCEC32.js → chunk-6PA5JBUU.js} +2 -2
  40. package/bundle/chunk-BNXV7SZI.js +195 -0
  41. package/bundle/chunk-BNXV7SZI.js.map +7 -0
  42. package/bundle/{chunk-AFREM7FX.js → chunk-CK7YTA2F.js} +2 -2
  43. package/bundle/{chunk-NRUSRJXR.js → chunk-DZJ5QZFD.js} +2 -2
  44. package/bundle/{chunk-YRSMGJFP.js → chunk-E67KESEG.js} +2 -2
  45. package/bundle/{chunk-ZV4IWKDJ.js → chunk-E7XD5UGB.js} +3 -3
  46. package/bundle/{chunk-GXL7HJPT.js → chunk-EAX5ZZUL.js} +63 -39
  47. package/bundle/chunk-EAX5ZZUL.js.map +7 -0
  48. package/bundle/{chunk-PEDX56EL.js → chunk-EFGBM555.js} +2 -2
  49. package/bundle/{chunk-EQSG2CRM.js → chunk-FGYDIX54.js} +22 -15
  50. package/bundle/chunk-FGYDIX54.js.map +7 -0
  51. package/bundle/{chunk-XWRADSXO.js → chunk-GF6NVNA7.js} +15 -5
  52. package/bundle/chunk-GF6NVNA7.js.map +7 -0
  53. package/bundle/{chunk-SIFPBTI4.js → chunk-HGSHCQ5F.js} +113 -73
  54. package/bundle/chunk-HGSHCQ5F.js.map +7 -0
  55. package/bundle/{chunk-YRU2K3O6.js → chunk-IMIGG5EO.js} +39 -39
  56. package/bundle/chunk-IMIGG5EO.js.map +7 -0
  57. package/bundle/{chunk-W4EA4GCA.js → chunk-ITOFPJAV.js} +43 -31
  58. package/bundle/chunk-ITOFPJAV.js.map +7 -0
  59. package/bundle/{chunk-UPRZDU6T.js → chunk-IY6UKLPS.js} +3 -3
  60. package/bundle/{chunk-EUZDKV3C.js → chunk-J4RUFAPK.js} +3 -3
  61. package/bundle/{chunk-HZDLFLRP.js → chunk-J7DRPVMU.js} +35 -5
  62. package/bundle/chunk-J7DRPVMU.js.map +7 -0
  63. package/bundle/{chunk-EGL6UMAO.js → chunk-JG4BKXBN.js} +7 -1
  64. package/bundle/chunk-JG4BKXBN.js.map +7 -0
  65. package/bundle/{chunk-5B5B6EHL.js → chunk-JLWYPGWI.js} +5 -5
  66. package/bundle/{chunk-5QUTMUIK.js → chunk-JXYWDAHD.js} +12 -12
  67. package/bundle/{chunk-GRVWZO4C.js → chunk-KOSFXW2S.js} +24 -3
  68. package/bundle/{chunk-GRVWZO4C.js.map → chunk-KOSFXW2S.js.map} +1 -1
  69. package/bundle/{chunk-ONBF5DDU.js → chunk-L72RIPEC.js} +248 -182
  70. package/bundle/chunk-L72RIPEC.js.map +7 -0
  71. package/bundle/{chunk-TEFZ4JA4.js → chunk-NHPLD3C7.js} +2 -2
  72. package/bundle/{chunk-2KC5G3EA.js → chunk-OWUO5RS3.js} +5 -5
  73. package/bundle/{chunk-4MULJ5SS.js → chunk-OY4Q6AMY.js} +71 -49
  74. package/bundle/chunk-OY4Q6AMY.js.map +7 -0
  75. package/bundle/{chunk-WBTJ2E62.js → chunk-P3NODAHF.js} +2 -5
  76. package/bundle/{chunk-WBTJ2E62.js.map → chunk-P3NODAHF.js.map} +2 -2
  77. package/bundle/{chunk-BROFMHC2.js → chunk-PB5GF4FG.js} +334 -237
  78. package/bundle/chunk-PB5GF4FG.js.map +7 -0
  79. package/bundle/{chunk-WYHGNI56.js → chunk-PMD5BLFS.js} +6 -6
  80. package/bundle/{chunk-URQPDCK5.js → chunk-Q66LQMMZ.js} +3 -3
  81. package/bundle/{chunk-HKRSMUXJ.js → chunk-SC2Y5NR2.js} +71 -132
  82. package/bundle/chunk-SC2Y5NR2.js.map +7 -0
  83. package/bundle/chunk-SFL4EPCZ.js +555 -0
  84. package/bundle/chunk-SFL4EPCZ.js.map +7 -0
  85. package/bundle/{chunk-LDUOOKQY.js → chunk-SJPUNDZ3.js} +5 -5
  86. package/bundle/{chunk-LDUOOKQY.js.map → chunk-SJPUNDZ3.js.map} +1 -1
  87. package/bundle/{chunk-JQDJPUHM.js → chunk-TWB2ZGVH.js} +2 -2
  88. package/bundle/{chunk-IJT4KWXT.js → chunk-U4U47YE7.js} +2 -2
  89. package/bundle/{chunk-2FAZIA37.js → chunk-W546CU3A.js} +3 -3
  90. package/bundle/chunk-WC5O5KOE.js +211 -0
  91. package/bundle/chunk-WC5O5KOE.js.map +7 -0
  92. package/bundle/{chunk-JNIHEDKF.js → chunk-XPWYDNWL.js} +2 -2
  93. package/bundle/{chunk-GWILHZPT.js → chunk-XRTXYN66.js} +10 -7
  94. package/bundle/{chunk-GWILHZPT.js.map → chunk-XRTXYN66.js.map} +2 -2
  95. package/bundle/{chunk-EFJVUJBE.js → chunk-Y5FEFKGM.js} +6 -6
  96. package/bundle/chunk-YJZE4OK3.js +169 -0
  97. package/bundle/chunk-YJZE4OK3.js.map +7 -0
  98. package/bundle/{chunk-GVM5YU5I.js → chunk-Z4FZPB42.js} +2 -2
  99. package/bundle/{chunk-7BSQ5UQO.js → chunk-ZSIDQ66D.js} +3 -3
  100. package/bundle/{chunk-XX6BGTPO.js → chunk-ZZZCJJEO.js} +4 -4
  101. package/bundle/{commands-XYEGVUZF.js → commands-2ZW6CMLC.js} +17 -16
  102. package/bundle/{config-M3P5IOAI.js → config-YMY5YHKN.js} +6 -6
  103. package/bundle/{context-2RJHC2LE.js → context-CL2RSLII.js} +7 -5
  104. package/bundle/context-CL2RSLII.js.map +7 -0
  105. package/bundle/{daemon-TB23FFWY.js → daemon-D7SU63OY.js} +3 -3
  106. package/bundle/{delegation-tools-QKNYQGTQ.js → delegation-tools-WS7Z56KZ.js} +12 -12
  107. package/bundle/{deploy-EPDWNHJU.js → deploy-AMTVKIMU.js} +2 -2
  108. package/bundle/{deps-WVK553KF.js → deps-T63AVJKJ.js} +3 -3
  109. package/bundle/{direct-api-transport-E3LNDBJT.js → direct-api-transport-QNNY2WWP.js} +56 -33
  110. package/bundle/direct-api-transport-QNNY2WWP.js.map +7 -0
  111. package/bundle/{discord-adapter-IT3KP3VB.js → discord-adapter-ABAD56Y2.js} +21 -20
  112. package/bundle/{discord-adapter-IT3KP3VB.js.map → discord-adapter-ABAD56Y2.js.map} +1 -1
  113. package/bundle/{dns-wakeup-IDOJIXBX.js → dns-wakeup-V3LEFXPE.js} +9 -33
  114. package/bundle/dns-wakeup-V3LEFXPE.js.map +7 -0
  115. package/bundle/{doctor-probes-B54JFIW3.js → doctor-probes-O6YI6XSZ.js} +6 -2
  116. package/bundle/{env-schema-4JXQUOH4.js → env-schema-B5RB32DC.js} +3 -3
  117. package/bundle/{gossip-3C3BSNPN.js → gossip-SKRCPOBS.js} +9 -5
  118. package/bundle/{guardrails-DL7ZSWVN.js → guardrails-64GQ5Y5K.js} +4 -4
  119. package/bundle/{heartbeat-system-MVTRS4GP.js → heartbeat-system-X4MUTKJD.js} +6 -6
  120. package/bundle/{heartbeat-tier3-ABWL3P7M.js → heartbeat-tier3-2PTPWEQQ.js} +53 -76
  121. package/bundle/heartbeat-tier3-2PTPWEQQ.js.map +7 -0
  122. package/bundle/{hook-system-M3POLUIB.js → hook-system-YB635OC4.js} +3 -3
  123. package/bundle/{hotskills-FWX4QI7V.js → hotskills-Q75D2DK3.js} +5 -5
  124. package/bundle/{install-OS3CU7NF.js → install-RFKKFSGS.js} +17 -30
  125. package/bundle/install-RFKKFSGS.js.map +7 -0
  126. package/bundle/{install-manifest-5PPWMD2W.js → install-manifest-J7ICPCJN.js} +2 -2
  127. package/bundle/{irc-adapter-PTTZD32W.js → irc-adapter-TVEV4R6H.js} +3 -3
  128. package/bundle/{irc-config-CP7ZMUOX.js → irc-config-M676FOFI.js} +4 -4
  129. package/bundle/{kanban-board-M326B2XJ.js → kanban-board-DLEJUCNN.js} +9 -7
  130. package/bundle/{kanban-channel-IJ52OMNA.js → kanban-channel-XOLUHJZJ.js} +6 -6
  131. package/bundle/kanban-delivery-C4QPBNPX.js +45 -0
  132. package/bundle/kanban-delivery-C4QPBNPX.js.map +7 -0
  133. package/bundle/{lazy-require-KCRVT4SI.js → lazy-require-JKQSALXN.js} +3 -3
  134. package/bundle/{logger-OWCSNYCA.js → logger-3EGHBD4R.js} +2 -2
  135. package/bundle/{main-chat-ZNUZCTNS.js → main-chat-3H63REKK.js} +4 -4
  136. package/bundle/{master-user-HSKM4ZFN.js → master-user-MUBUP3KD.js} +5 -5
  137. package/bundle/{media-utils-3ZYOD7SK.js → media-utils-HUUIALAJ.js} +3 -3
  138. package/bundle/{message-pipeline-P5GAQU4Z.js → message-pipeline-GRDRWONR.js} +17 -16
  139. package/bundle/meta.json +3699 -3138
  140. package/bundle/{metrics-collector-L3VPEHII.js → metrics-collector-YMUGY3PI.js} +31 -2
  141. package/bundle/metrics-collector-YMUGY3PI.js.map +7 -0
  142. package/bundle/{model-health-registry-MLEIZSTV.js → model-health-registry-QADMFQFQ.js} +2 -2
  143. package/bundle/{nerve-IGSXBKZZ.js → nerve-QPAEBRKX.js} +3 -3
  144. package/bundle/{notification-BFSIEECG.js → notification-3JICGXWU.js} +6 -6
  145. package/bundle/{openrouter-credits-NTVZDRYM.js → openrouter-credits-7NEIPYJN.js} +3 -3
  146. package/bundle/{orc-tools-4CHEFWSN.js → orc-tools-UZVPONKY.js} +5 -3
  147. package/bundle/{peer-auth-QC4EF2PM.js → peer-auth-RI43DKJE.js} +24 -15
  148. package/bundle/{peer-client-RGEU5HOK.js → peer-client-UITTMWJ2.js} +34 -29
  149. package/bundle/peer-client-UITTMWJ2.js.map +7 -0
  150. package/bundle/{peer-config-TN55LFDC.js → peer-config-URM7DCW6.js} +9 -4
  151. package/bundle/{peer-transport-I6JPLFZ2.js → peer-transport-SI7I72DB.js} +12 -10
  152. package/bundle/{phase-transport-PGKU2KD4.js → phase-transport-ESWWACZI.js} +17 -17
  153. package/bundle/{reconcile-CTFCLQRN.js → reconcile-GFDQYNBD.js} +3 -3
  154. package/bundle/{reconciler-EBKH3JNU.js → reconciler-IEUJXJN2.js} +12 -12
  155. package/bundle/{restore-IFHPI7I7.js → restore-FARTGLQQ.js} +3 -3
  156. package/bundle/{rollback-ANRI3T5Z.js → rollback-GEWPZABG.js} +2 -2
  157. package/bundle/{sandbox-runtime-QROWHDCS.js → sandbox-runtime-DV6E25J6.js} +2 -2
  158. package/bundle/{self-healer-utils-IFAYOQO2.js → self-healer-utils-P4SKNNEM.js} +3 -3
  159. package/bundle/{sha-tracker-ZWBP6CIJ.js → sha-tracker-77SHLYNY.js} +3 -3
  160. package/bundle/{skill-session-BMSRQSHV.js → skill-session-5HSMXY54.js} +3 -3
  161. package/bundle/{skill-stats-JORH5DGM.js → skill-stats-MI3RSWWL.js} +4 -4
  162. package/bundle/{skill-watcher-E4MGLKLS.js → skill-watcher-5L7JE6TN.js} +4 -4
  163. package/bundle/{sleep-36XS6MHJ.js → sleep-I4JFASCY.js} +11 -8
  164. package/bundle/{soul-bundle-VWAVHCZ6.js → soul-bundle-522C3IRH.js} +9 -8
  165. package/bundle/{spin-TI3TSVVT.js → spin-VHNGNWTD.js} +11 -11
  166. package/bundle/{spin-notifications-SE2HVZI7.js → spin-notifications-7NC5XZEM.js} +5 -5
  167. package/bundle/{spin-types-BLPYAETA.js → spin-types-C5KOQOPD.js} +7 -3
  168. package/bundle/{sse-parser-anthropic-A6R4Z2TB.js → sse-parser-anthropic-MMTVWHLI.js} +3 -3
  169. package/bundle/{sse-parser-responses-HSZY3QGJ.js → sse-parser-responses-3AOFN64C.js} +3 -3
  170. package/bundle/{ssrf-guard-O6SHIK6Q.js → ssrf-guard-U2JA72TC.js} +3 -3
  171. package/bundle/{start-7QZIWO3S.js → start-H5IUFAWF.js} +4 -2
  172. package/bundle/{start-7QZIWO3S.js.map → start-H5IUFAWF.js.map} +2 -2
  173. package/bundle/{stt-LGVPXMVR.js → stt-PSOPPBV4.js} +4 -4
  174. package/bundle/{system-status-JZU5FO7B.js → system-status-4LYGOFNO.js} +38 -24
  175. package/bundle/system-status-4LYGOFNO.js.map +7 -0
  176. package/bundle/{task-store-W5BFIAIH.js → task-store-MNCW42BW.js} +4 -4
  177. package/bundle/{telegram-adapter-H6PMFPMB.js → telegram-adapter-O6KIZDY6.js} +69 -46
  178. package/bundle/telegram-adapter-O6KIZDY6.js.map +7 -0
  179. package/bundle/{tool-registry-IZX2IOBM.js → tool-registry-JJMWCQKZ.js} +26 -24
  180. package/bundle/{tool-sandbox-4UC6GAKA.js → tool-sandbox-CNL6V6IH.js} +4 -4
  181. package/bundle/{transport-config-KBF5W2DP.js → transport-config-6MB2K2XC.js} +7 -7
  182. package/bundle/tribe-GDTFYJTK.js +111 -0
  183. package/bundle/tribe-GDTFYJTK.js.map +7 -0
  184. package/bundle/{update-MESYO4LO.js → update-HGQAOC5L.js} +3 -3
  185. package/bundle/{usage-tracker-NXD364VX.js → usage-tracker-SR4BI6ZT.js} +2 -2
  186. package/bundle/{user-registry-35BW4XKM.js → user-registry-4PACZJIJ.js} +4 -4
  187. package/bundle/wire-platform-KKPWNNNQ.js +88 -0
  188. package/bundle/wire-platform-KKPWNNNQ.js.map +7 -0
  189. package/bundle/ws-peer-client-U3NNPOK7.js +370 -0
  190. package/bundle/ws-peer-client-U3NNPOK7.js.map +7 -0
  191. package/package.json +1 -1
  192. package/scripts/abtars-watchdog.service +2 -1
  193. package/scripts/abtars-watchdog.sh +1 -5
  194. package/scripts/emergency-deploy.sh +2 -2
  195. package/scripts/emergency-update.sh +88 -41
  196. package/bundle/chunk-3AAENI2K.js +0 -210
  197. package/bundle/chunk-3AAENI2K.js.map +0 -7
  198. package/bundle/chunk-4MULJ5SS.js.map +0 -7
  199. package/bundle/chunk-4S554KLW.js +0 -105
  200. package/bundle/chunk-4S554KLW.js.map +0 -7
  201. package/bundle/chunk-5GCLBUBS.js +0 -257
  202. package/bundle/chunk-5GCLBUBS.js.map +0 -7
  203. package/bundle/chunk-BROFMHC2.js.map +0 -7
  204. package/bundle/chunk-EGL6UMAO.js.map +0 -7
  205. package/bundle/chunk-EQSG2CRM.js.map +0 -7
  206. package/bundle/chunk-GXL7HJPT.js.map +0 -7
  207. package/bundle/chunk-HKRSMUXJ.js.map +0 -7
  208. package/bundle/chunk-HT2BPTZY.js +0 -241
  209. package/bundle/chunk-HT2BPTZY.js.map +0 -7
  210. package/bundle/chunk-HZDLFLRP.js.map +0 -7
  211. package/bundle/chunk-IKUZPMVA.js +0 -82
  212. package/bundle/chunk-IKUZPMVA.js.map +0 -7
  213. package/bundle/chunk-LGP6TYFI.js.map +0 -7
  214. package/bundle/chunk-ONBF5DDU.js.map +0 -7
  215. package/bundle/chunk-RWRRGE4U.js +0 -72
  216. package/bundle/chunk-RWRRGE4U.js.map +0 -7
  217. package/bundle/chunk-SIFPBTI4.js.map +0 -7
  218. package/bundle/chunk-VUIX5AGB.js +0 -65
  219. package/bundle/chunk-VUIX5AGB.js.map +0 -7
  220. package/bundle/chunk-W4EA4GCA.js.map +0 -7
  221. package/bundle/chunk-XWRADSXO.js.map +0 -7
  222. package/bundle/chunk-Y76VUJSF.js +0 -75
  223. package/bundle/chunk-Y76VUJSF.js.map +0 -7
  224. package/bundle/chunk-YRU2K3O6.js.map +0 -7
  225. package/bundle/context-2RJHC2LE.js.map +0 -7
  226. package/bundle/direct-api-transport-E3LNDBJT.js.map +0 -7
  227. package/bundle/dns-wakeup-IDOJIXBX.js.map +0 -7
  228. package/bundle/heartbeat-tier3-ABWL3P7M.js.map +0 -7
  229. package/bundle/install-OS3CU7NF.js.map +0 -7
  230. package/bundle/metrics-collector-L3VPEHII.js.map +0 -7
  231. package/bundle/peer-client-RGEU5HOK.js.map +0 -7
  232. package/bundle/peer-jwt-NCCPXJRX.js +0 -18
  233. package/bundle/public/css/dashboard.css +0 -542
  234. package/bundle/public/index.html +0 -180
  235. package/bundle/public/js/app.js +0 -437
  236. package/bundle/public/memory-universe.js +0 -384
  237. package/bundle/stream-single-RFJNUTL6.js +0 -34
  238. package/bundle/stream-single-RFJNUTL6.js.map +0 -7
  239. package/bundle/subagent-runtime-5QUVES3W.js +0 -14
  240. package/bundle/system-status-JZU5FO7B.js.map +0 -7
  241. package/bundle/telegram-adapter-H6PMFPMB.js.map +0 -7
  242. package/bundle/usage-tracker-NXD364VX.js.map +0 -7
  243. package/bundle/user-registry-35BW4XKM.js.map +0 -7
  244. package/bundle/ws-peer-client-AIXCXF7V.js +0 -173
  245. package/bundle/ws-peer-client-AIXCXF7V.js.map +0 -7
  246. /package/bundle/{abmind-lazy-7Z44NODV.js.map → abmind-lazy-E3YCFKQ5.js.map} +0 -0
  247. /package/bundle/{acp-raw-client-E6FM45NC.js.map → acp-raw-client-UCNK3OTU.js.map} +0 -0
  248. /package/bundle/{action-gate-G2V47NHW.js.map → action-gate-V4FCBHFB.js.map} +0 -0
  249. /package/bundle/{agent-api-adapter-YAHKQMMZ.js.map → agent-api-adapter-7HEPYSIN.js.map} +0 -0
  250. /package/bundle/{agent-api-rate-limit-WCFXJMGY.js.map → agent-api-rate-limit-RZSAM3SW.js.map} +0 -0
  251. /package/bundle/{agent-registry-GI6CLT3Z.js.map → agent-registry-46A2R5KP.js.map} +0 -0
  252. /package/bundle/{bootstrap-X2QYIZIJ.js.map → bootstrap-MIHJJSWU.js.map} +0 -0
  253. /package/bundle/{bridge-lock-transport-4ZH7QTJP.js.map → bridge-lock-transport-7RSN7OLJ.js.map} +0 -0
  254. /package/bundle/{browser-DMARZJIN.js.map → browser-F6BCWJWW.js.map} +0 -0
  255. /package/bundle/{budget-45QOBDWA.js.map → budget-WUM3SPKW.js.map} +0 -0
  256. /package/bundle/{capability-JFWX3IQF.js.map → capability-QVRKGRFC.js.map} +0 -0
  257. /package/bundle/{chunk-YSKCQH6E.js.map → chunk-2IYJ4I66.js.map} +0 -0
  258. /package/bundle/{chunk-KTYGKPYM.js.map → chunk-2NLUT5S2.js.map} +0 -0
  259. /package/bundle/{chunk-OKAQICWY.js.map → chunk-3GQX34S2.js.map} +0 -0
  260. /package/bundle/{chunk-QROWBWLL.js.map → chunk-3XZ773BS.js.map} +0 -0
  261. /package/bundle/{chunk-DYBW4XXL.js.map → chunk-467SRLLR.js.map} +0 -0
  262. /package/bundle/{chunk-GPZNXY2U.js.map → chunk-4S3H4OK7.js.map} +0 -0
  263. /package/bundle/{chunk-NDCRWEEJ.js.map → chunk-4Y5MJQRE.js.map} +0 -0
  264. /package/bundle/{chunk-FRKW6LWB.js.map → chunk-55UWKI5C.js.map} +0 -0
  265. /package/bundle/{chunk-4UL3KINB.js.map → chunk-5PNJFDSW.js.map} +0 -0
  266. /package/bundle/{chunk-OXTSWQCX.js.map → chunk-5Y3FJ2Y7.js.map} +0 -0
  267. /package/bundle/{chunk-TMUYFERL.js.map → chunk-6B5ZFUPD.js.map} +0 -0
  268. /package/bundle/{chunk-65VCEC32.js.map → chunk-6PA5JBUU.js.map} +0 -0
  269. /package/bundle/{chunk-AFREM7FX.js.map → chunk-CK7YTA2F.js.map} +0 -0
  270. /package/bundle/{chunk-NRUSRJXR.js.map → chunk-DZJ5QZFD.js.map} +0 -0
  271. /package/bundle/{chunk-YRSMGJFP.js.map → chunk-E67KESEG.js.map} +0 -0
  272. /package/bundle/{chunk-ZV4IWKDJ.js.map → chunk-E7XD5UGB.js.map} +0 -0
  273. /package/bundle/{chunk-PEDX56EL.js.map → chunk-EFGBM555.js.map} +0 -0
  274. /package/bundle/{chunk-UPRZDU6T.js.map → chunk-IY6UKLPS.js.map} +0 -0
  275. /package/bundle/{chunk-EUZDKV3C.js.map → chunk-J4RUFAPK.js.map} +0 -0
  276. /package/bundle/{chunk-5B5B6EHL.js.map → chunk-JLWYPGWI.js.map} +0 -0
  277. /package/bundle/{chunk-5QUTMUIK.js.map → chunk-JXYWDAHD.js.map} +0 -0
  278. /package/bundle/{chunk-TEFZ4JA4.js.map → chunk-NHPLD3C7.js.map} +0 -0
  279. /package/bundle/{chunk-2KC5G3EA.js.map → chunk-OWUO5RS3.js.map} +0 -0
  280. /package/bundle/{chunk-WYHGNI56.js.map → chunk-PMD5BLFS.js.map} +0 -0
  281. /package/bundle/{chunk-URQPDCK5.js.map → chunk-Q66LQMMZ.js.map} +0 -0
  282. /package/bundle/{chunk-JQDJPUHM.js.map → chunk-TWB2ZGVH.js.map} +0 -0
  283. /package/bundle/{chunk-IJT4KWXT.js.map → chunk-U4U47YE7.js.map} +0 -0
  284. /package/bundle/{chunk-2FAZIA37.js.map → chunk-W546CU3A.js.map} +0 -0
  285. /package/bundle/{chunk-JNIHEDKF.js.map → chunk-XPWYDNWL.js.map} +0 -0
  286. /package/bundle/{chunk-EFJVUJBE.js.map → chunk-Y5FEFKGM.js.map} +0 -0
  287. /package/bundle/{chunk-GVM5YU5I.js.map → chunk-Z4FZPB42.js.map} +0 -0
  288. /package/bundle/{chunk-7BSQ5UQO.js.map → chunk-ZSIDQ66D.js.map} +0 -0
  289. /package/bundle/{chunk-XX6BGTPO.js.map → chunk-ZZZCJJEO.js.map} +0 -0
  290. /package/bundle/{commands-XYEGVUZF.js.map → commands-2ZW6CMLC.js.map} +0 -0
  291. /package/bundle/{config-M3P5IOAI.js.map → config-YMY5YHKN.js.map} +0 -0
  292. /package/bundle/{daemon-TB23FFWY.js.map → daemon-D7SU63OY.js.map} +0 -0
  293. /package/bundle/{delegation-tools-QKNYQGTQ.js.map → delegation-tools-WS7Z56KZ.js.map} +0 -0
  294. /package/bundle/{deploy-EPDWNHJU.js.map → deploy-AMTVKIMU.js.map} +0 -0
  295. /package/bundle/{deps-WVK553KF.js.map → deps-T63AVJKJ.js.map} +0 -0
  296. /package/bundle/{doctor-probes-B54JFIW3.js.map → doctor-probes-O6YI6XSZ.js.map} +0 -0
  297. /package/bundle/{env-schema-4JXQUOH4.js.map → env-schema-B5RB32DC.js.map} +0 -0
  298. /package/bundle/{gossip-3C3BSNPN.js.map → gossip-SKRCPOBS.js.map} +0 -0
  299. /package/bundle/{guardrails-DL7ZSWVN.js.map → guardrails-64GQ5Y5K.js.map} +0 -0
  300. /package/bundle/{heartbeat-system-MVTRS4GP.js.map → heartbeat-system-X4MUTKJD.js.map} +0 -0
  301. /package/bundle/{hook-system-M3POLUIB.js.map → hook-system-YB635OC4.js.map} +0 -0
  302. /package/bundle/{hotskills-FWX4QI7V.js.map → hotskills-Q75D2DK3.js.map} +0 -0
  303. /package/bundle/{install-manifest-5PPWMD2W.js.map → install-manifest-J7ICPCJN.js.map} +0 -0
  304. /package/bundle/{irc-adapter-PTTZD32W.js.map → irc-adapter-TVEV4R6H.js.map} +0 -0
  305. /package/bundle/{irc-config-CP7ZMUOX.js.map → irc-config-M676FOFI.js.map} +0 -0
  306. /package/bundle/{kanban-board-M326B2XJ.js.map → kanban-board-DLEJUCNN.js.map} +0 -0
  307. /package/bundle/{kanban-channel-IJ52OMNA.js.map → kanban-channel-XOLUHJZJ.js.map} +0 -0
  308. /package/bundle/{lazy-require-KCRVT4SI.js.map → lazy-require-JKQSALXN.js.map} +0 -0
  309. /package/bundle/{logger-OWCSNYCA.js.map → logger-3EGHBD4R.js.map} +0 -0
  310. /package/bundle/{main-chat-ZNUZCTNS.js.map → main-chat-3H63REKK.js.map} +0 -0
  311. /package/bundle/{master-user-HSKM4ZFN.js.map → master-user-MUBUP3KD.js.map} +0 -0
  312. /package/bundle/{media-utils-3ZYOD7SK.js.map → media-utils-HUUIALAJ.js.map} +0 -0
  313. /package/bundle/{message-pipeline-P5GAQU4Z.js.map → message-pipeline-GRDRWONR.js.map} +0 -0
  314. /package/bundle/{model-health-registry-MLEIZSTV.js.map → model-health-registry-QADMFQFQ.js.map} +0 -0
  315. /package/bundle/{nerve-IGSXBKZZ.js.map → nerve-QPAEBRKX.js.map} +0 -0
  316. /package/bundle/{notification-BFSIEECG.js.map → notification-3JICGXWU.js.map} +0 -0
  317. /package/bundle/{openrouter-credits-NTVZDRYM.js.map → openrouter-credits-7NEIPYJN.js.map} +0 -0
  318. /package/bundle/{orc-tools-4CHEFWSN.js.map → orc-tools-UZVPONKY.js.map} +0 -0
  319. /package/bundle/{peer-auth-QC4EF2PM.js.map → peer-auth-RI43DKJE.js.map} +0 -0
  320. /package/bundle/{peer-config-TN55LFDC.js.map → peer-config-URM7DCW6.js.map} +0 -0
  321. /package/bundle/{peer-jwt-NCCPXJRX.js.map → peer-transport-SI7I72DB.js.map} +0 -0
  322. /package/bundle/{peer-transport-I6JPLFZ2.js.map → phase-transport-ESWWACZI.js.map} +0 -0
  323. /package/bundle/{phase-transport-PGKU2KD4.js.map → reconcile-GFDQYNBD.js.map} +0 -0
  324. /package/bundle/{reconciler-EBKH3JNU.js.map → reconciler-IEUJXJN2.js.map} +0 -0
  325. /package/bundle/{restore-IFHPI7I7.js.map → restore-FARTGLQQ.js.map} +0 -0
  326. /package/bundle/{reconcile-CTFCLQRN.js.map → rollback-GEWPZABG.js.map} +0 -0
  327. /package/bundle/{sandbox-runtime-QROWHDCS.js.map → sandbox-runtime-DV6E25J6.js.map} +0 -0
  328. /package/bundle/{self-healer-utils-IFAYOQO2.js.map → self-healer-utils-P4SKNNEM.js.map} +0 -0
  329. /package/bundle/{rollback-ANRI3T5Z.js.map → sha-tracker-77SHLYNY.js.map} +0 -0
  330. /package/bundle/{skill-session-BMSRQSHV.js.map → skill-session-5HSMXY54.js.map} +0 -0
  331. /package/bundle/{sha-tracker-ZWBP6CIJ.js.map → skill-stats-MI3RSWWL.js.map} +0 -0
  332. /package/bundle/{skill-stats-JORH5DGM.js.map → skill-watcher-5L7JE6TN.js.map} +0 -0
  333. /package/bundle/{skill-watcher-E4MGLKLS.js.map → sleep-I4JFASCY.js.map} +0 -0
  334. /package/bundle/{sleep-36XS6MHJ.js.map → soul-bundle-522C3IRH.js.map} +0 -0
  335. /package/bundle/{soul-bundle-VWAVHCZ6.js.map → spin-VHNGNWTD.js.map} +0 -0
  336. /package/bundle/{spin-notifications-SE2HVZI7.js.map → spin-notifications-7NC5XZEM.js.map} +0 -0
  337. /package/bundle/{spin-TI3TSVVT.js.map → spin-types-C5KOQOPD.js.map} +0 -0
  338. /package/bundle/{sse-parser-anthropic-A6R4Z2TB.js.map → sse-parser-anthropic-MMTVWHLI.js.map} +0 -0
  339. /package/bundle/{sse-parser-responses-HSZY3QGJ.js.map → sse-parser-responses-3AOFN64C.js.map} +0 -0
  340. /package/bundle/{ssrf-guard-O6SHIK6Q.js.map → ssrf-guard-U2JA72TC.js.map} +0 -0
  341. /package/bundle/{spin-types-BLPYAETA.js.map → stt-PSOPPBV4.js.map} +0 -0
  342. /package/bundle/{stt-LGVPXMVR.js.map → task-store-MNCW42BW.js.map} +0 -0
  343. /package/bundle/{subagent-runtime-5QUVES3W.js.map → tool-registry-JJMWCQKZ.js.map} +0 -0
  344. /package/bundle/{task-store-W5BFIAIH.js.map → tool-sandbox-CNL6V6IH.js.map} +0 -0
  345. /package/bundle/{tool-registry-IZX2IOBM.js.map → transport-config-6MB2K2XC.js.map} +0 -0
  346. /package/bundle/{tool-sandbox-4UC6GAKA.js.map → update-HGQAOC5L.js.map} +0 -0
  347. /package/bundle/{transport-config-KBF5W2DP.js.map → usage-tracker-SR4BI6ZT.js.map} +0 -0
  348. /package/bundle/{update-MESYO4LO.js.map → user-registry-4PACZJIJ.js.map} +0 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/components/spin-sessions.ts", "../src/components/artifact-store.ts", "../src/components/transport/artifact-tools.ts", "../src/components/spin.ts"],
4
+ "sourcesContent": ["/**\n * spin-sessions.ts \u2014 Session CRUD on a flat Map<id, ManagedSession> (#953).\n * No PlatformState, no bucketing. Filter/find on the one map.\n */\n\nimport type { ManagedSession, SessionType } from \"./spin-types.js\";\nimport { sessionType, sessionCreatedAt, typeLabel } from \"./spin-types.js\";\n\nconst MAX_LOG = 5;\n\nexport function pushLog(session: ManagedSession, event: string): void {\n session.log.push(`${new Date().toISOString().slice(11, 19)} ${event}`);\n if (session.log.length > MAX_LOG) session.log.shift();\n}\n\nexport function allocateSession(\n sessions: Map<string, ManagedSession>, nextIndex: number,\n type: SessionType, userId: string, platform: string, chatId: number,\n opts?: { active?: boolean; motherId?: string },\n): { session: ManagedSession; nextIndex: number } {\n const idx = nextIndex + 1;\n const ts = Math.floor(Date.now() / 1000);\n const session: ManagedSession = {\n id: `${ts}_${type}_${String(idx).padStart(2, \"0\")}`,\n userId, platform, chatId,\n delivery: \"simple\",\n active: opts?.active ?? false,\n status: \"ready\",\n idleTimeoutMs: 7200000,\n lastActiveAt: Date.now(),\n motherId: opts?.motherId,\n messageCount: 0, tokenCount: 0, toolCallCount: 0,\n log: [],\n shortIndex: idx,\n // Pipeline state defaults (#1040)\n busy: false, queue: [], fullMode: false, pendingStart: false,\n seen: false, compacting: false, ctxWarned: false, compactFailures: 0,\n primingTerms: [], completions: [],\n };\n sessions.set(session.id, session);\n pushLog(session, \"created\");\n return { session, nextIndex: idx };\n}\n\nexport function getActiveSession(sessions: Map<string, ManagedSession>, userId: string, platform: string): ManagedSession | undefined {\n for (const s of sessions.values()) {\n if (s.userId === userId && s.platform === platform && s.active && s.status !== \"ended\") return s;\n }\n return undefined;\n}\n\nexport function createSession(\n sessions: Map<string, ManagedSession>, nextIndex: number,\n userId: string, platform: string, type: SessionType, chatId: number, maxSessions: number,\n): { session: ManagedSession; nextIndex: number } | string {\n const alive = [...sessions.values()].filter(s => s.status !== \"ended\");\n if (alive.length >= maxSessions) return `Max sessions reached (${maxSessions}). End or kill a session first.`;\n\n // Deactivate current active\n const cur = getActiveSession(sessions, userId, platform);\n if (cur) cur.active = false;\n\n const result = allocateSession(sessions, nextIndex, type, userId, platform, chatId, { active: true });\n return result;\n}\n\nexport function createSubSession(\n sessions: Map<string, ManagedSession>, nextIndex: number,\n userId: string, platform: string, type: SessionType, chatId: number, maxSessions: number,\n): { session: ManagedSession; nextIndex: number } | string {\n const alive = [...sessions.values()].filter(s => s.status !== \"ended\");\n if (alive.length >= maxSessions) return `Max sessions reached \u2014 auto-spawn skipped.`;\n\n const active = getActiveSession(sessions, userId, platform);\n return allocateSession(sessions, nextIndex, type, userId, platform, chatId, { active: false, motherId: active?.id });\n}\n\nexport function isHollow(session: ManagedSession): boolean { return !!session.peer; }\n\nexport function createHollowSession(\n sessions: Map<string, ManagedSession>, nextIndex: number,\n userId: string, platform: string, type: SessionType, chatId: number,\n peer: string, remoteSessionId: string, maxSessions: number,\n): { session: ManagedSession; nextIndex: number } | string {\n const alive = [...sessions.values()].filter(s => s.status !== \"ended\");\n if (alive.length >= maxSessions) return `Max sessions reached \u2014 cannot create hollow session.`;\n\n const result = allocateSession(sessions, nextIndex, type, userId, platform, chatId, { active: false });\n result.session.peer = peer;\n result.session.remoteSessionId = remoteSessionId;\n pushLog(result.session, `hollow (${peer})`);\n return result;\n}\n\nexport function switchSession(sessions: Map<string, ManagedSession>, userId: string, platform: string, index: number): ManagedSession | string {\n const target = [...sessions.values()].find(s => s.shortIndex === index && s.status !== \"ended\" && s.userId === userId);\n if (!target) return `Session #${index} not found or not switchable.`;\n const cur = getActiveSession(sessions, userId, platform);\n if (cur) cur.active = false;\n target.active = true;\n return target;\n}\n\nexport function endSession(sessions: Map<string, ManagedSession>, nextIndex: number, userId: string, platform: string, index?: number): { ended: ManagedSession; nextIndex: number } | string {\n const targetIdx = index ?? getActiveSession(sessions, userId, platform)?.shortIndex;\n if (!targetIdx) return `No active session found.`;\n const target = [...sessions.values()].find(s => s.shortIndex === targetIdx && s.status !== \"ended\" && s.userId === userId);\n if (!target) return `Session #${targetIdx} not found.`;\n\n const aliveMains = [...sessions.values()].filter(s => sessionType(s) === \"A\" && s.status !== \"ended\" && s.userId === userId);\n\n target.status = \"ended\";\n target.active = false;\n pushLog(target, \"ended\");\n\n // If ended the last Main, create a replacement\n if (sessionType(target) === \"A\" && aliveMains.length <= 1) {\n const result = allocateSession(sessions, nextIndex, \"A\", userId, platform, target.chatId, { active: true });\n return { ended: target, nextIndex: result.nextIndex };\n }\n\n // If ended the active session, activate first available Main\n if (index === undefined || target.active) {\n const main = [...sessions.values()].find(s => sessionType(s) === \"A\" && s.status !== \"ended\" && s.userId === userId);\n if (main) main.active = true;\n }\n\n return { ended: target, nextIndex };\n}\n\nexport function killSession(sessions: Map<string, ManagedSession>, nextIndex: number, userId: string, platform: string, index: number): { killed: ManagedSession; nextIndex: number } | string {\n const target = [...sessions.values()].find(s => s.shortIndex === index && s.status !== \"ended\" && s.userId === userId);\n if (!target) return `Session #${index} not found.`;\n\n target.status = \"ended\";\n target.active = false;\n pushLog(target, \"killed\");\n\n // If killed a Main and it was the last, create replacement\n const aliveMains = [...sessions.values()].filter(s => sessionType(s) === \"A\" && s.status !== \"ended\" && s.userId === userId);\n if (sessionType(target) === \"A\" && aliveMains.length === 0) {\n const result = allocateSession(sessions, nextIndex, \"A\", userId, platform, target.chatId, { active: true });\n return { killed: target, nextIndex: result.nextIndex };\n }\n\n // If killed the active, activate a Main\n if (!getActiveSession(sessions, userId, platform)) {\n const main = [...sessions.values()].find(s => sessionType(s) === \"A\" && s.status !== \"ended\" && s.userId === userId);\n if (main) main.active = true;\n }\n\n return { killed: target, nextIndex };\n}\n\nexport function pauseSession(sessions: Map<string, ManagedSession>, userId: string, platform: string, index?: number): ManagedSession | string {\n const targetIdx = index ?? getActiveSession(sessions, userId, platform)?.shortIndex;\n if (!targetIdx) return `No active session found.`;\n const target = [...sessions.values()].find(s => s.shortIndex === targetIdx && s.status !== \"ended\" && s.userId === userId);\n if (!target) return `Session #${targetIdx} not found.`;\n if (target.status === \"paused\") return `Session #${targetIdx} is already paused.`;\n target.status = \"paused\";\n pushLog(target, \"paused\");\n return target;\n}\n\nexport function resumeSession(sessions: Map<string, ManagedSession>, userId: string, platform: string, index?: number): ManagedSession | string {\n const targetIdx = index ?? getActiveSession(sessions, userId, platform)?.shortIndex;\n if (!targetIdx) return `No active session found.`;\n const target = [...sessions.values()].find(s => s.shortIndex === targetIdx && s.status !== \"ended\" && s.userId === userId);\n if (!target) return `Session #${targetIdx} not found.`;\n if (target.status !== \"paused\") return `Session #${targetIdx} is not paused.`;\n target.status = \"ready\";\n pushLog(target, \"resumed\");\n return target;\n}\n\nexport function listSessions(sessions: Map<string, ManagedSession>, userId: string, platform: string): ManagedSession[] {\n return [...sessions.values()].filter(s => s.userId === userId && s.platform === platform && s.status !== \"ended\");\n}\n\nexport function listAllSessions(sessions: Map<string, ManagedSession>): ManagedSession[] {\n return [...sessions.values()].filter(s => s.status !== \"ended\");\n}\n\nexport function getSessionById(sessions: Map<string, ManagedSession>, sessionId: string): ManagedSession | undefined {\n return sessions.get(sessionId);\n}\n\nexport function formatList(sessions: Map<string, ManagedSession>, userId: string, platform: string, showAll = false): string {\n const list = showAll ? listAllSessions(sessions) : listSessions(sessions, userId, platform);\n if (list.length === 0) return \"No active sessions.\";\n return list.map(s => {\n const marker = s.active && s.userId === userId ? \" *\" : \"\";\n const owner = showAll && s.userId !== userId ? ` (${s.userId})` : \"\";\n const bg = !s.active && sessionType(s) !== \"A\" ? \" (bg)\" : \"\";\n const paused = s.status === \"paused\" ? \" \u23F8\" : \"\";\n const remote = s.peer ? ` (remote: ${s.peer})` : \"\";\n const model = s.model ? ` ${s.model}` : \"\";\n const nm = s.name ? ` \"${s.name}\"` : \"\";\n const time = new Date(sessionCreatedAt(s)).toLocaleTimeString(\"en-GB\", { hour: \"2-digit\", minute: \"2-digit\" });\n const idle = s.busy ? \"busy\" : `idle ${Math.round((Date.now() - s.lastActiveAt) / 60000)}m`;\n const metrics = s.messageCount ? ` | ${s.messageCount} msgs` : \"\";\n return `#${s.shortIndex} ${typeLabel(sessionType(s))}${owner}${nm}${remote}${bg}${model} \u2014 ${time}${paused}${marker} | ${idle}${metrics}`;\n }).join(\"\\n\");\n}\n", "/**\n * artifact-store.ts \u2014 S3-compatible artifact store with lazy SDK loading (#929).\n */\n\nimport { createReadStream, createWriteStream } from \"node:fs\";\nimport { pipeline } from \"node:stream/promises\";\nimport { execSync } from \"node:child_process\";\nimport { createRequire } from \"node:module\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { Readable } from \"node:stream\";\n\nconst LIB_DIR = join(process.env[\"ABTARS_HOME\"] ?? join(homedir(), \".abtars\"), \"lib\");\nconst localRequire = createRequire(join(LIB_DIR, \"node_modules\", \"_placeholder.js\"));\n\nlet _s3: any;\nlet _presigner: any;\n\nfunction loadSdk(): void {\n if (_s3) return;\n try {\n _s3 = localRequire(\"@aws-sdk/client-s3\");\n _presigner = localRequire(\"@aws-sdk/s3-request-presigner\");\n } catch {\n execSync(`npm install --prefix \"${LIB_DIR}\" @aws-sdk/client-s3 @aws-sdk/s3-request-presigner`, { stdio: \"pipe\" });\n _s3 = localRequire(\"@aws-sdk/client-s3\");\n _presigner = localRequire(\"@aws-sdk/s3-request-presigner\");\n }\n}\n\nfunction getClient(): any {\n const endpoint = process.env[\"ARTIFACT_S3_ENDPOINT\"];\n if (!endpoint) throw new Error(\"Artifact store not configured\");\n loadSdk();\n return new _s3.S3Client({\n endpoint,\n region: process.env[\"ARTIFACT_S3_REGION\"] || \"auto\",\n credentials: { accessKeyId: process.env[\"ARTIFACT_S3_KEY\"] ?? \"\", secretAccessKey: process.env[\"ARTIFACT_S3_SECRET\"] ?? \"\" },\n });\n}\n\nfunction bucket(): string {\n return process.env[\"ARTIFACT_S3_BUCKET\"] || \"abtars-artifacts\";\n}\n\nexport async function upload(localPath: string, remotePath: string): Promise<string> {\n const client = getClient();\n const stream = createReadStream(localPath);\n await client.send(new _s3.PutObjectCommand({ Bucket: bucket(), Key: remotePath, Body: stream }));\n return `${process.env[\"ARTIFACT_S3_ENDPOINT\"]}/${bucket()}/${remotePath}`;\n}\n\nexport async function download(remotePath: string, localPath: string): Promise<void> {\n const client = getClient();\n const resp = await client.send(new _s3.GetObjectCommand({ Bucket: bucket(), Key: remotePath }));\n await pipeline(resp.Body as Readable, createWriteStream(localPath));\n}\n\nexport async function presign(remotePath: string, expiresIn = 3600): Promise<string> {\n const client = getClient();\n const cmd = new _s3.GetObjectCommand({ Bucket: bucket(), Key: remotePath });\n return _presigner.getSignedUrl(client, cmd, { expiresIn });\n}\n\nexport async function exists(remotePath: string): Promise<boolean> {\n const client = getClient();\n try {\n await client.send(new _s3.HeadObjectCommand({ Bucket: bucket(), Key: remotePath }));\n return true;\n } catch { return false; }\n}\n\nexport async function remove(remotePath: string): Promise<void> {\n const client = getClient();\n await client.send(new _s3.DeleteObjectCommand({ Bucket: bucket(), Key: remotePath }));\n}\n", "/**\n * artifact-tools.ts \u2014 Agent tools for S3 artifact store (#929) + inline transfer (#928).\n */\n\nimport type { ToolDefinition } from \"./tool-registry.js\";\nimport { upload, download } from \"../artifact-store.js\";\nimport { readFileSync, statSync } from \"node:fs\";\nimport { basename } from \"node:path\";\n\n// \u2500\u2500 Inline artifact queue (#928) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 interface InlineArtifact { name: string; content: string }\n\nconst pendingArtifacts = new Map<number, InlineArtifact[]>();\n\nconst MAX_FILE_BYTES = 1_000_000; // 1MB raw\n\nexport function drainArtifacts(cardId: number): InlineArtifact[] | undefined {\n const arts = pendingArtifacts.get(cardId);\n if (arts) pendingArtifacts.delete(cardId);\n return arts;\n}\n\nexport const artifactAttachTool: ToolDefinition = {\n name: \"artifact_attach\",\n description: \"Attach a local file to the task result. The file is base64-encoded and sent back to the delegating peer on task completion. Max 1MB per file.\",\n parameters: {\n type: \"object\",\n properties: {\n path: { type: \"string\", description: \"Absolute path to the file to attach\" },\n card_id: { type: \"number\", description: \"Current card ID (from environment)\" },\n },\n required: [\"path\", \"card_id\"],\n },\n async execute(args): Promise<string> {\n const filePath = args[\"path\"];\n const cardId = parseInt(args[\"card_id\"] ?? \"0\", 10);\n if (!filePath) return JSON.stringify({ error: \"path is required\" });\n if (!cardId) return JSON.stringify({ error: \"card_id is required\" });\n\n try {\n const stat = statSync(filePath);\n if (stat.size > MAX_FILE_BYTES) {\n return JSON.stringify({ error: `File too large: ${stat.size} bytes (max ${MAX_FILE_BYTES})` });\n }\n const content = readFileSync(filePath).toString(\"base64\");\n const name = basename(filePath);\n const list = pendingArtifacts.get(cardId) ?? [];\n list.push({ name, content });\n pendingArtifacts.set(cardId, list);\n return JSON.stringify({ ok: true, name, size: stat.size, queued: list.length });\n } catch (err) {\n return JSON.stringify({ error: err instanceof Error ? err.message : String(err) });\n }\n },\n};\n\nexport const artifactPushTool: ToolDefinition = {\n name: \"artifact_push\",\n description: \"Upload a local file to the shared artifact store (S3). Returns the artifact URL.\",\n parameters: {\n type: \"object\",\n properties: {\n local_path: { type: \"string\", description: \"Absolute path to local file\" },\n remote_path: { type: \"string\", description: \"Remote key/path in the artifact store\" },\n },\n required: [\"local_path\", \"remote_path\"],\n },\n async execute(args): Promise<string> {\n try {\n const url = await upload(args[\"local_path\"] ?? \"\", args[\"remote_path\"] ?? \"\");\n return JSON.stringify({ ok: true, url });\n } catch (err) {\n return JSON.stringify({ error: err instanceof Error ? err.message : String(err) });\n }\n },\n};\n\nexport const artifactPullTool: ToolDefinition = {\n name: \"artifact_pull\",\n description: \"Download a file from the shared artifact store (S3) to a local path.\",\n parameters: {\n type: \"object\",\n properties: {\n remote_path: { type: \"string\", description: \"Remote key/path in the artifact store\" },\n local_path: { type: \"string\", description: \"Absolute local path to save the file\" },\n },\n required: [\"remote_path\", \"local_path\"],\n },\n async execute(args): Promise<string> {\n try {\n await download(args[\"remote_path\"] ?? \"\", args[\"local_path\"] ?? \"\");\n return JSON.stringify({ ok: true, path: args[\"local_path\"] });\n } catch (err) {\n return JSON.stringify({ error: err instanceof Error ? err.message : String(err) });\n }\n },\n};\n", "/**\n * spin.ts \u2014 Unified session router (#943, #953).\n * Single flat Map<sessionId, ManagedSession>. No bucketing. No PlatformState.\n */\n\nimport { logInfo, logWarn, logDebug } from \"./logger.js\";\nimport { logAndSwallow } from \"./log-and-swallow.js\";\nimport { kanbanEnqueue, kanbanRunning, kanbanComplete, kanbanFail, kanbanRetryOrFail, kanbanList, kanbanGetCard, isUnblocked } from \"./tasks/kanban-board.js\";\nimport type { SubagentRuntime, AgentSession } from \"./subagent-runtime.js\";\nimport type { IKiroTransport } from \"./transport/kiro-transport.js\";\nimport { loadUsers } from \"./user-registry.js\";\nimport { getMasterUserId } from \"./master-user.js\";\nimport type { ManagedSession, SpinRequest, SessionType, SpinSessionSpec, SpinResult, StepEvent, DispatchBackgroundOptions } from \"./spin-types.js\";\nimport { sessionType } from \"./spin-types.js\";\nimport { profileFor, type SessionProfile } from \"./spin-profiles.js\";\nimport * as Sessions from \"./spin-sessions.js\";\nimport { pushLog, isHollow } from \"./spin-sessions.js\";\n\nexport type { ManagedSession, SpinRequest, SessionType } from \"./spin-types.js\";\nexport { sessionType, sessionCreatedAt, typeLabel, typeAgent, parseSessionType } from \"./spin-types.js\";\nexport { isHollow };\n\nconst TAG = \"spin\";\nconst USER_SESSION_IDLE_MS = parseInt(process.env[\"USER_SESSION_IDLE_MS\"] ?? \"7200000\", 10);\nconst GUEST_SESSION_IDLE_MS = parseInt(process.env[\"GUEST_SESSION_IDLE_MS\"] ?? \"1800000\", 10);\nconst MAX_TOTAL_SESSIONS = parseInt(process.env[\"MAX_TOTAL_SESSIONS\"] ?? \"12\", 10);\nconst SESSION_CREATE_TIMEOUT_MS = 30_000;\nconst DEFAULT_TIMEOUT_MS = 30 * 60_000;\n\nconst MAX_CONCURRENT: Partial<Record<SessionType, number>> = {\n T: 1, O: 1, B: 1, D: 1, H: 1, W: 3,\n};\n\nexport class Spin {\n private sessions = new Map<string, ManagedSession>();\n private nextIndex = 0;\n private running = new Map<SessionType, Set<number>>();\n private runtime: SubagentRuntime | null = null;\n private memory: { recordMessage(opts: { role: string; content: string; timestamp: number; userId: string; sessionId: string }): void } | null = null;\n private orcSession: AgentSession | null = null;\n private _lastHealerDoneAt = 0;\n private _housekeepCounter = 0;\n\n setRuntime(runtime: SubagentRuntime): void { this.runtime = runtime; }\n setMemory(memory: Spin[\"memory\"]): void { this.memory = memory; }\n\n // \u2500\u2500 Session CRUD \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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\n getActiveSession(userId: string, platform: string): ManagedSession {\n let s = Sessions.getActiveSession(this.sessions, userId, platform);\n if (!s) {\n // Auto-create initial Main session\n const r = Sessions.allocateSession(this.sessions, this.nextIndex, \"A\", userId, platform, 0, { active: true });\n this.nextIndex = r.nextIndex;\n s = r.session;\n }\n return s;\n }\n\n getActiveSessionId(userId: string, platform: string): string {\n return this.getActiveSession(userId, platform).id;\n }\n\n createSession(userId: string, platform: string, type: SessionType): ManagedSession | string {\n // Ensure a Main session exists before creating additional ones\n this.getActiveSession(userId, platform);\n const r = Sessions.createSession(this.sessions, this.nextIndex, userId, platform, type, 0, MAX_TOTAL_SESSIONS);\n if (typeof r === \"string\") return r;\n this.nextIndex = r.nextIndex;\n return r.session;\n }\n\n createSubSession(userId: string, platform: string, type: SessionType): ManagedSession | string {\n const r = Sessions.createSubSession(this.sessions, this.nextIndex, userId, platform, type, 0, MAX_TOTAL_SESSIONS);\n if (typeof r === \"string\") return r;\n this.nextIndex = r.nextIndex;\n return r.session;\n }\n\n createHollowSession(userId: string, platform: string, type: SessionType, peer: string, remoteSessionId: string): ManagedSession | string {\n const r = Sessions.createHollowSession(this.sessions, this.nextIndex, userId, platform, type, 0, peer, remoteSessionId, MAX_TOTAL_SESSIONS);\n if (typeof r === \"string\") return r;\n this.nextIndex = r.nextIndex;\n return r.session;\n }\n\n /** Allocate a named Dreamy (D) session upfront for the duration of a sleep cycle (#1280).\n * Non-active, platform=\"background\" \u2014 visible in master /session (showAll) for the full cycle.\n * Call at sleep start before the first runtime.complete(); the caller holds the returned id\n * and passes it as sessionId to subsequent spin({ type:\"D\", sessionId }) calls. */\n allocateDreamySession(name: string): ManagedSession {\n const userId = getMasterUserId();\n const r = Sessions.allocateSession(this.sessions, this.nextIndex, \"D\", userId, \"background\", 0, { active: false });\n this.nextIndex = r.nextIndex;\n r.session.name = name;\n return r.session;\n }\n\n switchSession(userId: string, platform: string, index: number): ManagedSession | string {\n return Sessions.switchSession(this.sessions, userId, platform, index);\n }\n\n endSession(userId: string, platform: string, index?: number): ManagedSession | string {\n const r = Sessions.endSession(this.sessions, this.nextIndex, userId, platform, index);\n if (typeof r === \"string\") return r;\n this.nextIndex = r.nextIndex;\n return r.ended;\n }\n\n killSession(userId: string, platform: string, index: number): ManagedSession | string {\n const r = Sessions.killSession(this.sessions, this.nextIndex, userId, platform, index);\n if (typeof r === \"string\") return r;\n this.nextIndex = r.nextIndex;\n return r.killed;\n }\n\n pauseSession(userId: string, platform: string, index?: number): ManagedSession | string {\n return Sessions.pauseSession(this.sessions, userId, platform, index);\n }\n\n resumeSession(userId: string, platform: string, index?: number): ManagedSession | string {\n return Sessions.resumeSession(this.sessions, userId, platform, index);\n }\n\n listSessions(userId: string, platform: string): { sessions: ManagedSession[]; activeIndex: number } {\n const list = Sessions.listSessions(this.sessions, userId, platform);\n const active = list.find(s => s.active);\n return { sessions: list, activeIndex: active?.shortIndex ?? 0 };\n }\n\n listAllSessions(): ManagedSession[] {\n return Sessions.listAllSessions(this.sessions);\n }\n\n getSessionById(sessionId: string): ManagedSession | undefined {\n return this.sessions.get(sessionId);\n }\n\n formatList(userId: string, platform: string, showAll = false): string {\n return Sessions.formatList(this.sessions, userId, platform, showAll);\n }\n\n clearAll(): void { this.sessions.clear(); this.nextIndex = 0; }\n\n // \u2500\u2500 Interactive session lifecycle \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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\n private _greetingSent = false;\n private _greetingAdapter: { injectMessage: (msg: any) => void } | null = null;\n\n registerMasterSession(opts: { userId: string; chatId: number; platform: string; transport: IKiroTransport }): void {\n const session = this.getActiveSession(opts.userId, opts.platform);\n session.transport = opts.transport;\n session.delivery = \"streaming\";\n session.idleTimeoutMs = Infinity;\n session.chatId = opts.chatId;\n session.status = \"ready\";\n session.lastActiveAt = Date.now();\n const t = opts.transport as any;\n session.pid = t?._rawClient?.pid ?? t?.agent?.pid ?? undefined;\n pushLog(session, \"master transport attached\");\n logInfo(TAG, `Master session registered: ${opts.userId} (${opts.platform}:${opts.chatId}${session.pid ? ` pid=${session.pid}` : \"\"})`);\n\n // #980: Fire greeting once adapter is set (deferred via setGreetingAdapter)\n this._masterOpts = { userId: opts.userId, chatId: opts.chatId, platform: opts.platform };\n this.tryFireGreeting();\n }\n\n /** Set the adapter for boot greeting. Called after platforms are up. */\n setGreetingAdapter(adapter: { injectMessage: (msg: any) => void }): void {\n this._greetingAdapter = adapter;\n this.tryFireGreeting();\n }\n\n private _masterOpts: { userId: string; chatId: number; platform: string } | null = null;\n\n private tryFireGreeting(): void {\n if (this._greetingSent || !this._greetingAdapter || !this._masterOpts) return;\n this._greetingSent = true;\n const { userId, chatId, platform } = this._masterOpts;\n const session = this.getActiveSession(userId, platform);\n this.greetSession(session, chatId, userId);\n }\n\n /** Inject a greeting into an interactive session (A/C only). */\n greetSession(session: ManagedSession, chatId: number, userId: string, adapter?: { injectMessage: (msg: any) => void }): void {\n const type = sessionType(session);\n if (type !== \"A\" && type !== \"C\") return;\n if (session.messageCount > 0) return;\n const a = adapter ?? this._greetingAdapter;\n if (!a) return;\n\n let attempt = 0;\n const inject = (): void => {\n attempt++;\n a.injectMessage({\n platform: session.platform,\n channelId: String(chatId),\n userId,\n senderId: String(chatId),\n senderName: userId,\n text: \"[SESSION START] You just came online. Greet the user.\",\n timestamp: Date.now(),\n isGroup: false,\n isVoice: false,\n });\n setTimeout(() => {\n if (session.messageCount > 0) return;\n if (session.busy) return;\n if (attempt >= 3) { logWarn(TAG, \"Greeting failed after 3 attempts\"); return; }\n logWarn(TAG, `Greeting attempt ${attempt}/3 \u2014 no response, retrying`);\n inject();\n }, 60_000);\n };\n\n if (session.transport?.isReady) {\n inject();\n } else if (session.transport) {\n session.transport.onReady = () => inject();\n }\n }\n\n async resolveSession(userId: string, platform: string, chatId: number): Promise<ManagedSession> {\n const session = this.getActiveSession(userId, platform);\n\n if (session.transport) {\n session.lastActiveAt = Date.now();\n return session;\n }\n if (session.status === \"ended\") throw new Error(\"Session ended \u2014 use /session new\");\n\n const total = this.listAllSessions().filter(s => s.transport).length;\n if (total >= MAX_TOTAL_SESSIONS) throw new Error(\"System busy, try again in a few minutes.\");\n\n session.status = \"creating\";\n session.chatId = chatId;\n const registry = loadUsers();\n const user = registry.byUserId.get(userId);\n const role = user?.role ?? \"guest\";\n session.idleTimeoutMs = role === \"master\" ? Infinity : role === \"guest\" ? GUEST_SESSION_IDLE_MS : USER_SESSION_IDLE_MS;\n session.delivery = role === \"master\" ? \"streaming\" : \"simple\";\n\n pushLog(session, `creating transport (${role})`);\n logInfo(TAG, `Creating transport for ${userId} (${role})`);\n\n try {\n const agentSession = await Promise.race([\n this.runtime!.session(\"professor\", userId),\n new Promise<never>((_, rej) => setTimeout(() => rej(new Error(\"Session creation timed out\")), SESSION_CREATE_TIMEOUT_MS)),\n ]);\n session.transport = agentSession.transport!;\n session.status = \"ready\";\n session.lastActiveAt = Date.now();\n const t = session.transport as any;\n session.pid = t?._rawClient?.pid ?? t?.agent?.pid ?? undefined;\n pushLog(session, \"transport ready\");\n logInfo(TAG, `Session ready: ${userId} id=${session.id}${session.pid ? ` pid=${session.pid}` : \"\"}`);\n return session;\n } catch (err) {\n session.status = \"ended\";\n pushLog(session, `error: ${err instanceof Error ? err.message : String(err)}`);\n logWarn(TAG, `Session creation failed for ${userId}: ${err instanceof Error ? err.message : String(err)}`);\n throw err;\n }\n }\n\n destroySession(userId: string, sessionId?: string): void {\n for (const s of this.sessions.values()) {\n if (s.userId !== userId) continue;\n if (sessionId && s.id !== sessionId) continue;\n if (s.idleTimeoutMs === Infinity) continue;\n if (s.transport) { try { s.transport.destroy(); } catch (err) { logAndSwallow(TAG, \"destroy\", err); } s.transport = undefined; }\n s.status = \"ended\";\n s.active = false;\n pushLog(s, \"destroyed\");\n logInfo(TAG, `Session destroyed: ${userId} id=${s.id}`);\n }\n }\n\n destroyAll(): void {\n for (const s of this.sessions.values()) {\n if (s.transport) { try { s.transport.destroy(); } catch (err) { logAndSwallow(TAG, \"destroy\", err); } }\n }\n if (this.orcSession) { try { this.orcSession.destroy(); } catch (err) { logAndSwallow(TAG, \"destroy\", err); } this.orcSession = null; }\n this.sessions.clear();\n this.nextIndex = 0;\n logInfo(TAG, \"All sessions destroyed (shutdown)\");\n }\n\n // \u2500\u2500 injectGreeting() \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 // #1106: replaced inject() (which generated a model response but never\n // delivered to the user). injectGreeting routes a synthetic message\n // through the normal pipeline \u2014 the model responds AND the response is\n // delivered to the user via the standard adapter.sendMessage path.\n\n async injectGreeting(userId: string, prompt: string): Promise<string | null> {\n if (!this._greetingAdapter) { logWarn(TAG, \"injectGreeting: no adapter\"); return null; }\n const registry = loadUsers();\n const user = registry.byUserId.get(userId);\n if (!user) { logWarn(TAG, `inject: unknown user ${userId}`); return null; }\n const chatId = user.platforms.telegram ?? user.platforms.discord;\n if (!chatId) { logWarn(TAG, `inject: no chatId for ${userId}`); return null; }\n const platform = user.platforms.telegram ? \"telegram\" : \"discord\";\n this._greetingAdapter.injectMessage({\n platform,\n channelId: String(chatId),\n userId,\n senderId: String(chatId),\n senderName: userId,\n text: prompt,\n timestamp: Date.now(),\n isGroup: false,\n isVoice: false,\n });\n logInfo(TAG, `injectGreeting: routed to pipeline for ${userId}`);\n return \"routed\";\n }\n\n // \u2500\u2500 Orc \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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\n getOrcSession(): AgentSession | null { return this.orcSession?.isReady ? this.orcSession : null; }\n\n /** @deprecated Use `spin({ type:\"O\", sessionId, prompt:\"[USER] \"+msg, await:true })`. */\n async sendUserToOrc(message: string): Promise<string | null> {\n const orcSession = [...this.sessions.values()].find(s => s.id.includes(\"_O_\") && s.status !== \"ended\");\n if (!orcSession) return null;\n const { result } = await this.spin({ type: \"O\", sessionId: orcSession.id, prompt: `[USER] ${message}`, await: true });\n return result ?? null;\n }\n\n\n // \u2500\u2500 #1271: unified session API \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 //\n // spin(spec) is the single chokepoint for issuing a model prompt. Per-type\n // behavior lives in SESSION_PROFILES (spin-profiles.ts) \u2014 no `type === \"\u2026\"`\n // branches here. Continuation (pipeline main turn, sleep step N) is just\n // spin() with a sessionId.\n\n async spin(spec: SpinSessionSpec): Promise<SpinResult> {\n if (!this.runtime) throw new Error(\"Spin: runtime not set\");\n const profile = profileFor(spec.type);\n\n // 1. Defaults\n const userId = spec.userId ?? getMasterUserId();\n const platform = spec.platform ?? \"background\";\n const chatId = spec.chatId ?? 0;\n const agent = spec.agent ?? profile.agent;\n const timeoutMs = spec.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const terminate = spec.terminateAfter ?? profile.terminateAfter;\n const persistent = spec.persistent ?? (profile.transportMode === \"persistent\");\n\n // 2. Resolve session (reuse | active | singleton | transient) \u2014 driven by profile, no type branches\n let session: ManagedSession;\n if (spec.sessionId) {\n const found = this.sessions.get(spec.sessionId);\n if (!found) throw new Error(`Spin: sessionId ${spec.sessionId} not found`);\n if (found.status === \"ended\") throw new Error(`Spin: sessionId ${spec.sessionId} is ended`);\n session = found;\n } else if (spec.active || profile.resolution === \"active\") {\n session = this.getActiveSession(userId, platform);\n } else if (profile.resolution === \"singleton\") {\n session = this.getOrCreateVisibleSession(userId, spec.type)!;\n } else {\n const r = Sessions.allocateSession(this.sessions, this.nextIndex, spec.type, userId, platform, chatId);\n this.nextIndex = r.nextIndex; session = r.session;\n if (spec.metadata) session.metadata = { ...spec.metadata };\n }\n const stepIndex = (session.messageCount >> 1) + 1;\n\n // 3. Kanban card (user-facing work only)\n let cardId = spec.cardId;\n if (cardId === undefined && spec.goal !== undefined) {\n cardId = kanbanEnqueue(spec.title ?? spec.goal.slice(0, 80), spec.source ?? \"user\", undefined, {\n priority: spec.priority ?? \"MEDIUM\", type: spec.type, parent_id: spec.parentCardId,\n deliveryMode: spec.deliveryMode, chatId: chatId ? String(chatId) : undefined,\n notes: spec.callbackPeer ? JSON.stringify({ callback_peer: spec.callbackPeer }) : undefined,\n sourcePeer: spec.sourcePeer,\n });\n }\n if (cardId !== undefined && this.canDispatch(spec.type, cardId)) {\n this.markRunning(spec.type, cardId); kanbanRunning(cardId);\n }\n\n // 4-7. Single try/catch so EVERY exit path (pre-exec throws included) flows\n // through failSpin, which owns markDone + drainQueued. Without this,\n // a throw from beforePrompt / transport creation / a decorator leaves\n // the cardId in this.running forever, wedging single-slot types\n // (O/T/B/D/H) until bridge restart. (#1274)\n const started = Date.now();\n try {\n // 4. before-hook\n await profile.beforePrompt?.(session, cardId);\n\n // 5. Resolve the execution transport. Reuse the session's OWN transport if it\n // already has one (A per-user main turn, D step N, O reuse). Only\n // create+attach for a NEW persistent session.\n let sessionTransport = session.transport as IKiroTransport | undefined;\n if (persistent && !sessionTransport) {\n const agentSession = await this.runtime.session(agent, profile.resolution === \"active\" ? userId : undefined);\n sessionTransport = agentSession.transport as IKiroTransport;\n session.transport = sessionTransport;\n session.status = \"ready\";\n }\n\n // 6. Build prompt via decorators\n let prompt = spec.prompt ?? spec.goal ?? \"\";\n for (const decorate of profile.decorators) {\n prompt = await decorate(prompt, { session, cardId, parentCardId: spec.parentCardId });\n }\n pushLog(session, `spin type=${spec.type} agent=${agent} step=${stepIndex}`);\n\n // 7. Execute \u2014 persistent/continuation sends via the session's own transport\n // (key = session.id preserves the Orc sneak-in); oneshot uses runtime.complete.\n const exec = sessionTransport\n ? sessionTransport.sendPrompt(session.id, prompt, spec.imageContent as { mime: string; base64: string } | undefined, spec.userId ?? userId)\n : this.runtime.complete(agent, prompt, { timeoutMs, session: \"fresh\", maxToolRounds: spec.maxToolRounds });\n\n if (!spec.await) {\n exec.then(r => this.finishSpin(spec, profile, session, cardId, stepIndex, started, r || \"(no output)\", terminate))\n .catch(e => this.failSpin(spec, profile, session, cardId, stepIndex, started, e, terminate));\n return { sessionId: session.id, cardId };\n }\n const result = (await exec) || \"(no output)\";\n await this.finishSpin(spec, profile, session, cardId, stepIndex, started, result, terminate);\n return { sessionId: session.id, cardId, result };\n } catch (err) {\n // Covers: pre-exec throws (steps 4-6) AND awaited execution failures (step 7).\n // failSpin calls markDone + drainQueued \u2014 concurrency slot always released.\n await this.failSpin(spec, profile, session, cardId, stepIndex, started, err, terminate);\n if (spec.await) throw err; // awaited callers still see the error\n return { sessionId: session.id, cardId }; // fire-and-forget: recorded, no unhandled rejection\n }\n }\n\n private async finishSpin(\n spec: SpinSessionSpec, profile: SessionProfile, session: ManagedSession,\n cardId: number | undefined, stepIndex: number, started: number, result: string,\n terminate: \"call\" | \"response\" | \"external\",\n ): Promise<void> {\n // Persistent sends go through session.transport (runtime.lastUsage is only\n // updated by runtime.complete). Prefer the transport's own usage; fall back\n // to runtime for oneshot.\n const usage = (session.transport as { lastUsage?: () => { input: number; output: number } | null } | undefined)?.lastUsage?.()\n ?? this.runtime?.lastUsage ?? null;\n session.messageCount += 2;\n session.lastActiveAt = Date.now();\n session.tokenCount = usage ? usage.input + usage.output : session.tokenCount;\n pushLog(session, \"complete\");\n\n if (this.memory) {\n const sid = cardId !== undefined ? `${spec.type}_card${cardId}` : `${spec.type}_${session.id}`;\n this.memory.recordMessage({ role: \"user\", content: spec.goal ?? spec.prompt ?? \"\", timestamp: Date.now(), userId: \"system\", sessionId: sid });\n this.memory.recordMessage({ role: \"assistant\", content: result, timestamp: Date.now(), userId: \"system\", sessionId: sid });\n }\n if (cardId !== undefined) {\n // drainArtifacts lives in transport/artifact-tools \u2014 wrapped in try/catch\n // for test envs where the module's transitive deps (artifact-store) may not\n // resolve. In production this always succeeds.\n let artifacts: Array<{ name: string; content: string }> = [];\n try {\n const { drainArtifacts } = require(\"./transport/artifact-tools.js\") as typeof import(\"./transport/artifact-tools.js\");\n artifacts = drainArtifacts(cardId) ?? [];\n } catch { /* artifact-tools unavailable (e.g. test env) \u2014 skip */ }\n kanbanComplete(cardId, null, result.slice(0, 500));\n if (spec.callbackPeer) {\n const card = kanbanGetCard(cardId);\n fireCallback(spec.callbackPeer, cardId, \"done\", result.slice(0, 500), undefined, artifacts, card?.tokens_used ?? 0);\n }\n }\n\n await profile.afterPrompt?.(session, cardId);\n const stepEvent: StepEvent = {\n sessionId: session.id, cardId, stepIndex, result,\n durationMs: Date.now() - started,\n inputTokens: usage?.input, outputTokens: usage?.output,\n };\n await spec.onStepComplete?.(stepEvent);\n\n this.applyTerminate(session, terminate);\n if (cardId !== undefined) { this.markDone(spec.type, cardId); this.drainQueued(); }\n }\n\n private async failSpin(\n spec: SpinSessionSpec, profile: SessionProfile, session: ManagedSession,\n cardId: number | undefined, stepIndex: number, started: number, err: unknown,\n terminate: \"call\" | \"response\" | \"external\",\n ): Promise<void> {\n const msg = (err instanceof Error ? err.message : String(err)).slice(0, 1000);\n logWarn(TAG, `${spec.type} spin failed: ${msg}`);\n pushLog(session, `failed: ${msg.slice(0, 80)}`);\n if (cardId !== undefined) {\n kanbanRetryOrFail(cardId, msg);\n if (spec.callbackPeer) fireCallback(spec.callbackPeer, cardId, \"failed\", undefined, msg);\n }\n await profile.afterPrompt?.(session, cardId);\n const stepEvent: StepEvent = {\n sessionId: session.id, cardId, stepIndex,\n error: err instanceof Error ? err : new Error(msg),\n durationMs: Date.now() - started,\n };\n await spec.onStepComplete?.(stepEvent);\n\n this.applyTerminate(session, terminate);\n if (cardId !== undefined) { this.markDone(spec.type, cardId); this.drainQueued(); }\n }\n\n private applyTerminate(session: ManagedSession, terminate: \"call\" | \"response\" | \"external\"): void {\n if (terminate === \"call\") this.sessions.delete(session.id);\n else if (terminate === \"response\") { session.status = \"ended\"; session.active = false; }\n // \"external\" \u2192 stays alive (Orc, persistent D); 1hr housekeeping prunes ended ones\n }\n\n /** #1271: Background one-shot (e.g. compaction summary). Returns the result string. */\n async dispatchBackground(opts: DispatchBackgroundOptions): Promise<string> {\n const { result } = await this.spin({\n type: opts.type ?? \"S\",\n prompt: opts.prompt,\n timeoutMs: opts.timeoutMs,\n agent: opts.agent,\n await: true,\n });\n return result ?? \"\";\n }\n\n // \u2500\u2500 Dispatch (legacy wrappers, #1271) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 // dispatch / dispatchAwait / getOrCreateOrc / sendUserToOrc are thin wrappers\n // around the unified spin(spec) chokepoint. dispatchBackground is the new\n // background-only entry point.\n\n /** #1010: O-type reuses existing session (one Orc). All others create new. */\n private getOrCreateVisibleSession(userId: string, type: SessionType): ManagedSession | undefined {\n if (type === \"O\") {\n for (const s of this.sessions.values()) {\n if (s.id.includes(\"_O_\") && s.status !== \"ended\") return s;\n }\n }\n const sub = this.createSubSession(userId, \"telegram\", type);\n return typeof sub === \"string\" ? undefined : sub;\n }\n\n /**\n * @deprecated Use `spin({ type, goal, \u2026, await: false })` instead.\n * Backward-compat wrapper: creates a kanban card, then dispatches via spin().\n * Returns the cardId synchronously; the model call runs in the background.\n */\n dispatch(request: SpinRequest): { cardId: number; sessionId?: string } {\n // Pre-create the card (matches old behavior \u2014 card exists even if blocked)\n const cardTitle = request.title ?? request.goal.slice(0, 80);\n const cardId = request.cardId ?? kanbanEnqueue(cardTitle, request.source, undefined, {\n priority: request.priority ?? \"MEDIUM\", type: request.type,\n parent_id: request.parentCardId, deliveryMode: request.deliveryMode,\n notes: request.callbackPeer ? JSON.stringify({ callback_peer: request.callbackPeer }) : undefined,\n chatId: request.chatId, sourcePeer: request.sourcePeer,\n });\n\n // Concurrency gate: blocked cards stay queued for drainQueued() to pick up.\n // Session cap: also gate here so a full Map never generates a void-spin\n // unhandled rejection (step-2 throws in spin() are outside the try/catch). (#1274)\n const aliveSessions = [...this.sessions.values()].filter(s => s.status !== \"ended\").length;\n if (aliveSessions >= MAX_TOTAL_SESSIONS || !this.canDispatch(request.type, cardId)) {\n const reason = aliveSessions >= MAX_TOTAL_SESSIONS ? \"session cap\" : \"concurrency gate\";\n logInfo(TAG, `${request.type} card:${cardId} queued (${reason})`);\n return { cardId };\n }\n\n void this.spin({\n type: request.type,\n goal: request.goal,\n cardId,\n parentCardId: request.parentCardId,\n title: request.title,\n priority: request.priority as \"CRITICAL\" | \"HIGH\" | \"MEDIUM\" | \"LOW\" | undefined,\n source: request.source,\n deliveryMode: request.deliveryMode,\n agent: request.agent,\n timeoutMs: request.timeoutMs,\n callbackPeer: request.callbackPeer,\n sourcePeer: request.sourcePeer,\n chatId: request.chatId ? Number(request.chatId) : undefined,\n await: false,\n });\n return { cardId };\n }\n\n /**\n * @deprecated Use `spin({ type, goal, \u2026, await: true })` instead.\n * Backward-compat wrapper: synchronously dispatches and returns the result.\n */\n async dispatchAwait(request: SpinRequest): Promise<{ cardId: number; result: string }> {\n // #987: enforce concurrency + cooldown gates\n // #1274: also enforce session cap (await:true \u2014 throw is safe, caller awaits)\n const aliveSessions = [...this.sessions.values()].filter(s => s.status !== \"ended\").length;\n if (aliveSessions >= MAX_TOTAL_SESSIONS) {\n throw new Error(\"System busy \u2014 max sessions reached.\");\n }\n if (!this.canDispatch(request.type, 0)) {\n throw new Error(`${request.type} session busy or in cooldown \u2014 skipping`);\n }\n const { cardId, result } = await this.spin({\n type: request.type,\n goal: request.goal,\n title: request.title,\n priority: request.priority as \"CRITICAL\" | \"HIGH\" | \"MEDIUM\" | \"LOW\" | undefined,\n source: request.source,\n deliveryMode: request.deliveryMode,\n agent: request.agent,\n timeoutMs: request.timeoutMs,\n maxToolRounds: request.maxToolRounds,\n parentCardId: request.parentCardId,\n chatId: request.chatId ? Number(request.chatId) : undefined,\n await: true,\n });\n return { cardId: cardId!, result: result! };\n }\n\n spawnChild(parentCardId: number, request: Omit<SpinRequest, \"type\"> & { type?: SessionType }): number {\n if (request.type === \"O\") throw new Error(\"Cannot nest orchestrators\");\n return this.dispatch({ ...request, type: \"W\", parentCardId }).cardId;\n }\n\n // \u2500\u2500 Internal \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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\n private drainQueued(): void {\n const queued = kanbanList(\"queued\");\n const now = new Date().toISOString();\n for (const card of queued) {\n // #897: respect retry backoff\n if ((card as any).next_retry_at && (card as any).next_retry_at > now) continue;\n // #677: respect DAG dependencies\n if (!isUnblocked(card)) continue;\n const type = (card.type as SessionType) ?? \"T\";\n if (this.canDispatch(type, card.id)) {\n this.dispatch({ type, goal: card.title, source: (card.source as SpinRequest[\"source\"]) ?? \"task\", cardId: card.id });\n }\n }\n }\n\n /** Periodic housekeeping \u2014 registered as HB task (#980). */\n async tick(): Promise<void> {\n this.drainQueued();\n this.checkStaleWorkers();\n await this.pollRemoteCards();\n this._housekeepCounter++;\n if (this._housekeepCounter % 72 === 0) {\n this.pruneSkillTrash();\n this.rotateAuditLog();\n this.pruneEndedSessions();\n }\n }\n\n private checkStaleWorkers(): void {\n const STALE_MS = parseInt(process.env[\"WORKER_STALE_MS\"] || \"300000\", 10);\n const now = Date.now();\n let freed = false;\n for (const [type, cardIds] of this.running) {\n for (const cardId of [...cardIds]) { // snapshot \u2014 markDone mutates the Set\n const card = kanbanGetCard(cardId);\n if (!card || card.status !== \"running\") continue;\n const lastActivity = new Date(card.updated_at + \"Z\").getTime();\n if (now - lastActivity > STALE_MS) {\n logWarn(TAG, `Stale card ${cardId} (${Math.round((now - lastActivity) / 1000)}s no activity) \u2014 failing`);\n kanbanFail(cardId, \"stale \u2014 no activity\");\n this.markDone(type, cardId); // release in-memory slot (#1274)\n freed = true;\n }\n }\n }\n if (freed) this.drainQueued(); // reuse freed slot without waiting a tick\n }\n\n /** #613: Prune .trash/ entries older than 7 days (~hourly). */\n private pruneSkillTrash(): void {\n const SEVEN_DAYS_MS = 7 * 24 * 60 * 60 * 1000;\n const { existsSync, readdirSync, rmSync, statSync } = require(\"node:fs\") as typeof import(\"node:fs\");\n const { join } = require(\"node:path\") as typeof import(\"node:path\");\n const { abtarsHome } = require(\"../paths.js\") as typeof import(\"../paths.js\");\n const trashPath = join(abtarsHome(), \"skills\", \".trash\");\n if (!existsSync(trashPath)) return;\n const now = Date.now();\n for (const entry of readdirSync(trashPath)) {\n try {\n const full = join(trashPath, entry);\n const stat = statSync(full);\n if (now - stat.mtimeMs > SEVEN_DAYS_MS) {\n rmSync(full, { recursive: true });\n logInfo(\"skill-trash-prune\", `Pruned: ${entry}`);\n }\n } catch (err) { logAndSwallow(TAG, \"prune entry\", err); }\n }\n }\n\n /** #681: Rotate audit.jsonl when > 10MB, prune files older than 30 days (~hourly). */\n private rotateAuditLog(): void {\n const THIRTY_DAYS_MS = 30 * 24 * 60 * 60 * 1000;\n const { existsSync, statSync, renameSync, readdirSync, unlinkSync } = require(\"node:fs\") as typeof import(\"node:fs\");\n const { join } = require(\"node:path\") as typeof import(\"node:path\");\n const { abtarsHome } = require(\"../paths.js\") as typeof import(\"../paths.js\");\n const logsDir = join(abtarsHome(), \"logs\");\n const auditPath = join(logsDir, \"audit.jsonl\");\n if (!existsSync(auditPath)) return;\n try {\n const stat = statSync(auditPath);\n if (stat.size > 10 * 1024 * 1024) {\n const date = new Date().toISOString().slice(0, 10);\n renameSync(auditPath, join(logsDir, `audit-${date}.jsonl`));\n logInfo(\"audit-rotation\", `Rotated audit.jsonl (${(stat.size / 1024 / 1024).toFixed(1)}MB)`);\n }\n } catch (err) { logAndSwallow(TAG, \"audit rotate\", err); }\n const now = Date.now();\n try {\n for (const f of readdirSync(logsDir)) {\n if (!f.startsWith(\"audit-\") || !f.endsWith(\".jsonl\")) continue;\n const full = join(logsDir, f);\n const stat = statSync(full);\n if (now - stat.mtimeMs > THIRTY_DAYS_MS) {\n unlinkSync(full);\n logInfo(\"audit-rotation\", `Pruned: ${f}`);\n }\n }\n } catch (err) { logAndSwallow(TAG, \"audit prune\", err); }\n }\n\n /** #1248: Prune ended sessions older than 1 hour (~hourly). Prevents unbounded Map growth. */\n private pruneEndedSessions(): void {\n const ONE_HOUR_MS = 60 * 60 * 1000;\n const now = Date.now();\n for (const [id, s] of this.sessions) {\n if (s.status === \"ended\" && now - s.lastActiveAt > ONE_HOUR_MS) {\n this.sessions.delete(id);\n logDebug(TAG, `Pruned ended session: ${s.userId} id=${id}`);\n }\n }\n }\n\n private async pollRemoteCards(): Promise<void> {\n const remoteCards = kanbanList(\"running\", \"status\").filter(c => c.type === \"remote\");\n if (remoteCards.length === 0) return;\n const { getPeerTransport } = await import(\"./peer-transport/index.js\");\n const transport = getPeerTransport();\n const REMOTE_MAX_AGE_MS = 15 * 60 * 1000;\n for (const card of remoteCards) {\n try {\n const meta = JSON.parse(card.notes ?? \"{}\") as { peer?: string; remote_task_id?: number };\n if (!meta.peer || !meta.remote_task_id) continue;\n const cardAge = Date.now() - new Date(card.created_at + \"Z\").getTime();\n if (cardAge > REMOTE_MAX_AGE_MS) {\n kanbanFail(card.id, `remote task timeout (${Math.round(cardAge / 60000)}min)`);\n continue;\n }\n const result = await transport.checkTask(meta.peer, meta.remote_task_id);\n if (result.status === \"done\") kanbanComplete(card.id, null, result.result?.slice(0, 500) ?? \"completed\");\n else if (result.status === \"failed\") kanbanFail(card.id, result.error ?? \"remote task failed\");\n } catch (err) { logAndSwallow(TAG, \"pollRemote\", err); }\n }\n }\n\n private canDispatch(type: SessionType, _cardId: number): boolean {\n const max = MAX_CONCURRENT[type] ?? 5;\n if ((this.running.get(type)?.size ?? 0) >= max) return false;\n // #987: 2-min cooldown after H session ends\n if (type === \"H\" && Date.now() - this._lastHealerDoneAt < 120_000) return false;\n return true;\n }\n\n private markRunning(type: SessionType, cardId: number): void {\n if (!this.running.has(type)) this.running.set(type, new Set());\n this.running.get(type)!.add(cardId);\n }\n\n private markDone(type: SessionType, cardId: number): void {\n this.running.get(type)?.delete(cardId);\n if (type === \"H\") this._lastHealerDoneAt = Date.now();\n }\n}\n\n/** #675: Fire result callback to the delegating peer. Fire-and-forget. */\nasync function fireCallback(peerName: string, taskId: number, status: \"done\" | \"failed\", result?: string, error?: string, artifacts?: Array<{ name: string; content: string }>, tokensUsed?: number): Promise<void> {\n try {\n const { getPeerTransport } = await import(\"./peer-transport/index.js\");\n const transport = getPeerTransport();\n const payload: Record<string, unknown> = { action: \"callback\", task_id: taskId, status, result_summary: result, error, tokens_used: tokensUsed ?? 0 };\n if (artifacts?.length) payload.artifacts = artifacts;\n await transport.send(peerName, { type: \"task\", payload });\n logInfo(TAG, `Callback fired to ${peerName} for card:${taskId} (${status})`);\n } catch (err) {\n logWarn(TAG, `Callback to ${peerName} failed (card:${taskId}): ${err instanceof Error ? err.message : String(err)}`);\n }\n}\n\nexport const spin = new Spin();\n"],
5
+ "mappings": "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",
6
+ "names": ["drainArtifacts", "statSync", "join"]
7
+ }
@@ -3,7 +3,7 @@
3
3
  import {
4
4
  init_log_and_swallow,
5
5
  logAndSwallow
6
- } from "./chunk-YSKCQH6E.js";
6
+ } from "./chunk-2IYJ4I66.js";
7
7
  import {
8
8
  abtarsHome,
9
9
  init_paths
@@ -81,4 +81,4 @@ export {
81
81
  _getStats,
82
82
  _reset
83
83
  };
84
- //# sourceMappingURL=chunk-TEFZ4JA4.js.map
84
+ //# sourceMappingURL=chunk-NHPLD3C7.js.map
@@ -3,17 +3,17 @@
3
3
  import {
4
4
  getEnv,
5
5
  init_env_schema
6
- } from "./chunk-65VCEC32.js";
6
+ } from "./chunk-6PA5JBUU.js";
7
7
  import {
8
8
  init_log_and_swallow,
9
9
  logAndSwallow
10
- } from "./chunk-YSKCQH6E.js";
10
+ } from "./chunk-2IYJ4I66.js";
11
11
  import {
12
12
  init_logger,
13
13
  logDebug,
14
14
  logInfo,
15
15
  logWarn
16
- } from "./chunk-GWILHZPT.js";
16
+ } from "./chunk-XRTXYN66.js";
17
17
  import {
18
18
  abtarsHome,
19
19
  init_paths
@@ -362,7 +362,7 @@ var BrowserTool = class {
362
362
  if (getEnv().ssrfCheck) {
363
363
  try {
364
364
  const { hostname } = new URL(url);
365
- const { isPrivateHost } = await import("./ssrf-guard-O6SHIK6Q.js");
365
+ const { isPrivateHost } = await import("./ssrf-guard-U2JA72TC.js");
366
366
  if (await isPrivateHost(hostname)) {
367
367
  return { success: false, error: `Blocked: "${hostname}" resolves to a private/internal IP address` };
368
368
  }
@@ -757,4 +757,4 @@ export {
757
757
  BrowserIpcServer,
758
758
  DomainAllowlist
759
759
  };
760
- //# sourceMappingURL=chunk-2KC5G3EA.js.map
760
+ //# sourceMappingURL=chunk-OWUO5RS3.js.map
@@ -1,11 +1,20 @@
1
1
  #!/usr/bin/env node
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
+ import {
4
+ init_peer_config,
5
+ peer_config_exports
6
+ } from "./chunk-3BG3AIDP.js";
7
+ import {
8
+ init_peer_auth,
9
+ peer_auth_exports
10
+ } from "./chunk-WC5O5KOE.js";
3
11
  import {
4
12
  abtarsHome,
5
13
  init_paths
6
14
  } from "./chunk-GALQBVKO.js";
7
15
  import {
8
- __require
16
+ __require,
17
+ __toCommonJS
9
18
  } from "./chunk-7K2YZTLD.js";
10
19
 
11
20
  // src/cli/commands/doctor-probes.ts
@@ -15,6 +24,7 @@ import { join } from "node:path";
15
24
  import { homedir } from "node:os";
16
25
  var home = abtarsHome();
17
26
  var configDir = join(home, "config");
27
+ var TTL_MS = 18e4;
18
28
  function readJson(path) {
19
29
  try {
20
30
  return JSON.parse(readFileSync(path, "utf-8"));
@@ -219,9 +229,9 @@ async function probeSha() {
219
229
  if (existsSync(join(configDir, "sha-policy.json"))) return { name: "sha", status: "ok", detail: "rules loaded" };
220
230
  return { name: "sha", status: "skipped", detail: "no healer rules configured" };
221
231
  }
222
- async function probeAgentApi() {
232
+ async function probeA2a() {
223
233
  const env = readEnv();
224
- if (env.get("ENABLE_AGENT_API") !== "true") return { name: "agent-api", status: "skipped", detail: "not enabled" };
234
+ if (env.get("ENABLE_AGENT_API") !== "true") return { name: "a2a", status: "skipped", detail: "not enabled" };
225
235
  const port = parseInt(env.get("AGENT_API_PORT") || "7100", 10);
226
236
  try {
227
237
  const { createConnection } = await import("node:net");
@@ -236,68 +246,80 @@ async function probeAgentApi() {
236
246
  reject(new Error("timeout"));
237
247
  });
238
248
  });
239
- return { name: "agent-api", status: "ok", detail: `:${port}` };
249
+ return { name: "a2a", status: "ok", detail: `${port}` };
240
250
  } catch {
241
- return { name: "agent-api", status: "failed", detail: `:${port} not listening` };
251
+ return { name: "a2a", status: "failed", detail: `${port} not listening` };
242
252
  }
243
253
  }
244
254
  async function probePeers() {
245
255
  const peersPath = join(configDir, "peers.json");
246
256
  const peers = readJson(peersPath);
247
257
  if (!peers) return { name: "peers", status: "skipped", detail: "peers.json missing" };
248
- const peerCount = Object.keys(peers.peers ?? {}).length;
249
- if (peerCount === 0) return { name: "peers", status: "ok", detail: "no peers configured" };
250
- const lock = readJson(join(home, "bridge.lock"));
251
- const gossipAge = lock?.lastGossipBroadcast ? ago(Date.now() - lock.lastGossipBroadcast) : "unknown";
252
- return { name: "peers", status: "ok", detail: `${peerCount} configured, gossip: ${gossipAge}` };
258
+ if (!peers.self?.signingKey) return { name: "peers", status: "failed", detail: "self.signingKey missing \u2014 run: abtars install" };
259
+ const peerEntries = Object.entries(peers.peers ?? {});
260
+ const peerCount = peerEntries.length;
261
+ if (peerCount === 0) return { name: "peers", status: "skipped", detail: "no peers (solo)" };
262
+ const missingKey = peerEntries.filter(([, e]) => !e.verifyKey).map(([n]) => n);
263
+ if (missingKey.length > 0) return { name: "peers", status: "failed", detail: `missing verifyKey: ${missingKey.join(", ")}` };
264
+ return { name: "peers", status: "ok", detail: `${peerCount} enrolled (all keys valid)` };
253
265
  }
254
- async function probeTls() {
266
+ async function probeIdentity() {
255
267
  const env = readEnv();
256
- if (env.get("ENABLE_AGENT_API") !== "true") return { name: "tls", status: "skipped", detail: "agent-api disabled" };
257
- const certExists = existsSync(join(configDir, "identity.crt"));
258
- const keyExists = existsSync(join(configDir, "identity.tls.key"));
259
- if (certExists && keyExists) return { name: "tls", status: "ok", detail: "certs present" };
260
- const missing = [!certExists && "identity.crt", !keyExists && "identity.tls.key"].filter(Boolean);
261
- return { name: "tls", status: "failed", detail: `missing: ${missing.join(", ")}` };
262
- }
263
- async function probeA2a() {
264
- const peersPath = join(configDir, "peers.json");
265
- const peers = readJson(peersPath);
266
- if (!peers?.self?.udpPort) return { name: "a2a", status: "skipped", detail: "no gossip port configured" };
267
- const port = peers.self.udpPort;
268
+ if (env.get("ENABLE_AGENT_API") !== "true") return { name: "identity", status: "skipped", detail: "a2a disabled" };
269
+ const certPath = join(configDir, "identity.crt");
270
+ const keyPath = join(configDir, "identity.tls.key");
271
+ const certExists = existsSync(certPath);
272
+ const keyExists = existsSync(keyPath);
273
+ if (!certExists || !keyExists) {
274
+ const missing = [!certExists && "identity.crt", !keyExists && "identity.tls.key"].filter(Boolean);
275
+ return { name: "identity", status: "failed", detail: `missing: ${missing.join(", ")}` };
276
+ }
268
277
  try {
269
- const dgram = await import("node:dgram");
270
- const { createHmac } = await import("node:crypto");
271
- const key = peers.gossipSecret ?? Object.values(peers.peers ?? {})[0]?.token ?? "default";
272
- const payload = JSON.stringify({ type: "ping", name: "__doctor__" });
273
- const sig = createHmac("sha256", key).update(payload).digest("base64url").slice(0, 16);
274
- const ping = Buffer.from(`${payload}|${sig}`);
275
- const alive = await new Promise((resolve) => {
276
- const sock = dgram.createSocket("udp4");
277
- const timer = setTimeout(() => {
278
- sock.close();
279
- resolve(false);
280
- }, 500);
281
- sock.on("message", () => {
282
- clearTimeout(timer);
278
+ const { loadPeerConfig, deriveVerifyKey } = (init_peer_config(), __toCommonJS(peer_config_exports));
279
+ const { verifyServerCert } = (init_peer_auth(), __toCommonJS(peer_auth_exports));
280
+ const config = loadPeerConfig();
281
+ const expectedVerifyKey = deriveVerifyKey(config.self.signingKey);
282
+ const certPem = readFileSync(certPath, "utf-8");
283
+ if (!verifyServerCert(certPem, expectedVerifyKey)) {
284
+ return { name: "identity", status: "failed", detail: "cert pubkey mismatch \u2014 re-run: abtars install --force" };
285
+ }
286
+ return { name: "identity", status: "ok", detail: "cert matches signing key" };
287
+ } catch {
288
+ return { name: "identity", status: "ok", detail: "cert present (key-match skipped)" };
289
+ }
290
+ }
291
+ async function probeGossip() {
292
+ const env = readEnv();
293
+ if (env.get("ENABLE_AGENT_API") !== "true") return { name: "gossip", status: "skipped", detail: "a2a disabled" };
294
+ const peers = readJson(join(configDir, "peers.json"));
295
+ const peerCount = Object.keys(peers?.peers ?? {}).length;
296
+ if (peerCount === 0) return { name: "gossip", status: "skipped", detail: "no peers (solo)" };
297
+ if (!peers?.self?.signingKey) return { name: "gossip", status: "failed", detail: "self.signingKey missing \u2014 Ed25519 gossip requires identity" };
298
+ const port = parseInt(env.get("GOSSIP_PORT") || "5355", 10);
299
+ const inUse = await new Promise((resolve) => {
300
+ import("node:dgram").then(({ createSocket }) => {
301
+ const sock = createSocket("udp4");
302
+ sock.once("error", (err) => {
283
303
  sock.close();
284
- resolve(true);
304
+ resolve(err.code === "EADDRINUSE");
285
305
  });
286
- sock.on("error", () => {
287
- clearTimeout(timer);
306
+ sock.bind(port, "0.0.0.0", () => {
288
307
  sock.close();
289
308
  resolve(false);
290
309
  });
291
- sock.send(ping, port, "127.0.0.1");
292
- });
293
- return { name: "a2a", status: alive ? "ok" : "failed", detail: alive ? `UDP :${port} alive` : `UDP :${port} no response` };
294
- } catch {
295
- return { name: "a2a", status: "failed", detail: "UDP probe error" };
296
- }
310
+ }).catch(() => resolve(false));
311
+ });
312
+ if (!inUse) return { name: "gossip", status: "failed", detail: `${port} not listening` };
313
+ const lock = readJson(join(home, "bridge.lock"));
314
+ const last = typeof lock?.lastGossipBroadcast === "number" ? lock.lastGossipBroadcast : 0;
315
+ if (!last) return { name: "gossip", status: "ok", detail: `${port} / no broadcast yet` };
316
+ const age = Date.now() - last;
317
+ if (age > TTL_MS) return { name: "gossip", status: "failed", detail: `${port} / stale (${ago(age)})` };
318
+ return { name: "gossip", status: "ok", detail: `${port} / last broadcast ${ago(age)}` };
297
319
  }
298
320
  async function probeMind() {
299
321
  try {
300
- const { loadAbmind } = await import("./abmind-lazy-7Z44NODV.js");
322
+ const { loadAbmind } = await import("./abmind-lazy-E3YCFKQ5.js");
301
323
  const mod = await loadAbmind();
302
324
  if (!mod) return { name: "mind", status: "skipped", detail: "abmind not installed" };
303
325
  return { name: "mind", status: "ok", detail: "abmind loaded (in-process)" };
@@ -312,7 +334,7 @@ async function runAllProbes() {
312
334
  Promise.all([probeHeartbeat()].map((p) => timedProbe(() => p))),
313
335
  Promise.all([probeTransport(), probeSpin(), probeKanban(), probeSkills(), probeSha()].map((p) => timedProbe(() => p))),
314
336
  Promise.all([probeMind()].map((p) => timedProbe(() => p))),
315
- Promise.all([probeAgentApi(), probePeers(), probeTls(), probeA2a()].map((p) => timedProbe(() => p)))
337
+ Promise.all([probeA2a(), probePeers(), probeIdentity(), probeGossip()].map((p) => timedProbe(() => p)))
316
338
  ]);
317
339
  return { version: "1.0", totalMs: Date.now() - start, layers: { body, heart, brain, soul, tribe } };
318
340
  }
@@ -501,4 +523,4 @@ export {
501
523
  renderHuman,
502
524
  renderJson
503
525
  };
504
- //# sourceMappingURL=chunk-4MULJ5SS.js.map
526
+ //# sourceMappingURL=chunk-OY4Q6AMY.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/cli/commands/doctor-probes.ts"],
4
+ "sourcesContent": ["/**\n * doctor-probes.ts \u2014 structured health probes grouped by subsystem layer.\n * Replaces scripts/doctor.sh entirely.\n */\n\nimport { existsSync, readFileSync, readdirSync, statSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { abtarsHome } from \"../../paths.js\";\n\n// \u2500\u2500 Types \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 interface ProbeResult {\n name: string;\n status: \"ok\" | \"failed\" | \"skipped\";\n detail?: string;\n ms?: number;\n}\n\nexport interface FixResult {\n probe: string;\n action: string;\n success: boolean;\n}\n\nexport type LayerName = \"body\" | \"heart\" | \"brain\" | \"soul\" | \"tribe\";\n\nexport interface DoctorOutput {\n version: \"1.0\";\n totalMs: number;\n layers: Record<LayerName, ProbeResult[]>;\n fixes?: FixResult[];\n}\n\n// \u2500\u2500 Helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 home = abtarsHome();\nconst configDir = join(home, \"config\");\nconst TTL_MS = 180_000; // gossip: 3 missed 60s broadcasts \u2192 stale (matches gossip.ts)\n\nfunction readJson(path: string): any | null {\n try { return JSON.parse(readFileSync(path, \"utf-8\")); } catch { return null; }\n}\n\nfunction readEnv(): Map<string, string> {\n const envPath = join(configDir, \".env\");\n const map = new Map<string, string>();\n if (!existsSync(envPath)) return map;\n for (const line of readFileSync(envPath, \"utf-8\").split(\"\\n\")) {\n const m = line.match(/^([A-Z_]+)=(.*)$/);\n if (m) map.set(m[1]!, m[2]!.replace(/^[\"']|[\"']$/g, \"\"));\n }\n return map;\n}\n\nfunction pidAlive(pid: number): boolean {\n try { process.kill(pid, 0); return true; } catch { return false; }\n}\n\nfunction ago(ms: number): string {\n const s = Math.round(ms / 1000);\n if (s < 60) return `${s}s ago`;\n return `${Math.round(s / 60)}m ago`;\n}\n\nasync function timedProbe(fn: () => Promise<ProbeResult>): Promise<ProbeResult> {\n const start = Date.now();\n try {\n const r = await fn();\n r.ms = r.ms ?? (Date.now() - start);\n return r;\n } catch (err) {\n return { name: \"unknown\", status: \"failed\", detail: String(err), ms: Date.now() - start };\n }\n}\n\n// \u2500\u2500 Body Probes \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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\nasync function probePlatforms(): Promise<ProbeResult> {\n const { readSecret, initSecretsKey } = await import(\"../../components/secrets.js\");\n initSecretsKey();\n\n const results: Array<{ name: string; status: \"ok\" | \"failed\" | \"skipped\"; detail: string }> = [];\n\n // Telegram: read token, call getMe\n const telegramToken = readSecret(\"TELEGRAM_BOT_TOKEN\") ?? readSecret(\"TELEGRAM_TOKEN\");\n if (telegramToken) {\n const r = await verifyTelegram(telegramToken);\n results.push({ name: \"telegram\", ...r });\n }\n\n // Discord: read token, call gateway\n const discordToken = readSecret(\"DISCORD_BOT_TOKEN\") ?? readSecret(\"DISCORD_TOKEN\");\n if (discordToken) {\n const r = await verifyDiscord(discordToken);\n results.push({ name: \"discord\", ...r });\n }\n\n // IRC: skip real verification (connection-based), just check if configured\n const ircServer = readSecret(\"IRC_SERVER\");\n if (ircServer) {\n results.push({ name: \"irc\", status: \"ok\", detail: \"server configured (connection not verified)\" });\n }\n\n if (results.length === 0) return { name: \"platforms\", status: \"skipped\", detail: \"no platform configured\" };\n\n const failed = results.filter(r => r.status === \"failed\");\n const skipped = results.filter(r => r.status === \"skipped\");\n const allOk = failed.length === 0 && skipped.length === 0;\n const status = allOk ? \"ok\" : failed.length > 0 ? \"failed\" : \"ok\";\n const detail = results.map(r => `${r.name}: ${r.status}${r.detail ? ` (${r.detail})` : \"\"}`).join(\", \");\n return { name: \"platforms\", status, detail };\n}\n\nasync function verifyTelegram(token: string): Promise<{ status: \"ok\" | \"failed\" | \"skipped\"; detail: string }> {\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 5000);\n const res = await fetch(`https://api.telegram.org/bot${token}/getMe`, { signal: controller.signal });\n clearTimeout(timeout);\n if (res.ok) return { status: \"ok\", detail: \"getMe ok\" };\n if (res.status === 401 || res.status === 403) return { status: \"failed\", detail: \"invalid token\" };\n return { status: \"skipped\", detail: `http ${res.status}` };\n } catch {\n return { status: \"skipped\", detail: \"unreachable\" };\n }\n}\n\nasync function verifyDiscord(token: string): Promise<{ status: \"ok\" | \"failed\" | \"skipped\"; detail: string }> {\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 5000);\n const res = await fetch(\"https://discord.com/api/v10/users/@me\", {\n headers: { \"Authorization\": `Bot ${token}` },\n signal: controller.signal,\n });\n clearTimeout(timeout);\n if (res.ok) return { status: \"ok\", detail: \"gateway ok\" };\n if (res.status === 401 || res.status === 403) return { status: \"failed\", detail: \"invalid token\" };\n return { status: \"skipped\", detail: `http ${res.status}` };\n } catch {\n return { status: \"skipped\", detail: \"unreachable\" };\n }\n}\n\nasync function probeDashboard(): Promise<ProbeResult> {\n const env = readEnv();\n if (env.get(\"ENABLE_DASHBOARD\") !== \"true\") return { name: \"dashboard\", status: \"skipped\", detail: \"not enabled\" };\n const port = env.get(\"DASHBOARD_PORT\") || env.get(\"WEB_PORT\") || \"3000\";\n try {\n const res = await fetch(`http://127.0.0.1:${port}/`, { signal: AbortSignal.timeout(3000) });\n return { name: \"dashboard\", status: res.ok ? \"ok\" : \"failed\", detail: `:${port}` };\n } catch {\n return { name: \"dashboard\", status: \"failed\", detail: `:${port} unreachable` };\n }\n}\n\nasync function probeSecurity(): Promise<ProbeResult> {\n const env = readEnv();\n const mode = env.get(\"SECURITY_MODE\") || \"off\";\n const validModes = [\"off\", \"guardrails\", \"seatbelt\", \"docker\"];\n if (!validModes.includes(mode)) return { name: \"security\", status: \"failed\", detail: `invalid mode: ${mode}` };\n\n // Check secret file perms\n const secretDir = join(home, \"secret\");\n let permIssues = 0;\n if (existsSync(secretDir)) {\n for (const f of readdirSync(secretDir)) {\n const st = statSync(join(secretDir, f));\n if (st.isFile() && (st.mode & 0o777) !== 0o600) permIssues++;\n }\n }\n\n const parts = [mode];\n if (existsSync(join(home, \"auth\", \"rules.json\"))) parts.push(\"ActionGate\");\n if (permIssues > 0) return { name: \"security\", status: \"failed\", detail: `${mode}, ${permIssues} file(s) not 600` };\n return { name: \"security\", status: \"ok\", detail: parts.join(\", \") };\n}\n\nasync function probeWatchdog(): Promise<ProbeResult> {\n const lock = readJson(join(home, \"bridge.lock\"));\n if (!lock) return { name: \"watchdog\", status: \"failed\", detail: \"bridge.lock missing\" };\n\n const bridgePid = lock.pid ?? 0;\n const wdPid = lock.watchdogPid ?? 0;\n const bridgeAlive = bridgePid > 0 && pidAlive(bridgePid);\n const wdAlive = wdPid > 0 && pidAlive(wdPid);\n\n if (bridgeAlive && wdAlive) return { name: \"watchdog\", status: \"ok\", detail: `bridge:${bridgePid}, wd:${wdPid}` };\n if (!bridgeAlive && !wdAlive) return { name: \"watchdog\", status: \"failed\", detail: `bridge:${bridgePid} dead, wd:${wdPid} dead` };\n if (!wdAlive) return { name: \"watchdog\", status: \"failed\", detail: `bridge:${bridgePid} alive, wd:${wdPid} dead (unprotected)` };\n return { name: \"watchdog\", status: \"failed\", detail: `bridge:${bridgePid} dead, wd:${wdPid} alive (will restart)` };\n}\n\n// \u2500\u2500 Heart Probes \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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\nasync function probeHeartbeat(): Promise<ProbeResult> {\n const lock = readJson(join(home, \"bridge.lock\"));\n if (!lock?.lastHeartbeat) return { name: \"heartbeat\", status: \"skipped\", detail: \"no bridge.lock\" };\n const ageMs = Date.now() - lock.lastHeartbeat;\n if (ageMs > 120_000) return { name: \"heartbeat\", status: \"failed\", detail: `stale (${ago(ageMs)})` };\n return { name: \"heartbeat\", status: \"ok\", detail: ago(ageMs) };\n}\n\n// #1261: single-bridge invariant \u2014 catches duplicate-bridge regressions at runtime.\n// pgrep counts the bridge processes. >1 means a second bridge is running (likely orphaned).\nasync function probeSingleBridge(): Promise<ProbeResult> {\n const { spawnSync } = await import(\"node:child_process\");\n const pgrep = spawnSync(\"pgrep\", [\"-f\", \"app/bundle/abtars.js\"], { encoding: \"utf-8\" });\n const pids = pgrep.stdout ? pgrep.stdout.trim().split(\"\\n\").filter(Boolean) : [];\n if (pids.length === 0) return { name: \"single-bridge\", status: \"skipped\", detail: \"no bridge running\" };\n if (pids.length === 1) return { name: \"single-bridge\", status: \"ok\", detail: `pid:${pids[0]}` };\n return { name: \"single-bridge\", status: \"failed\", detail: `${pids.length} bridges running: ${pids.join(\",\")}` };\n}\n\n// \u2500\u2500 Brain Probes \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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\nasync function probeTransport(): Promise<ProbeResult> {\n const tPath = join(configDir, \"transport.json\");\n const t = readJson(tPath);\n if (!t) return { name: \"transport\", status: \"failed\", detail: \"transport.json missing or invalid\" };\n const agents = Object.keys(t.agents ?? {});\n if (agents.length === 0) return { name: \"transport\", status: \"failed\", detail: \"no agents configured\" };\n return { name: \"transport\", status: \"ok\", detail: `${agents.length} agent(s): ${agents.join(\", \")}` };\n}\n\nasync function probeSpin(): Promise<ProbeResult> {\n const lock = readJson(join(home, \"bridge.lock\"));\n if (!lock?.pid || !pidAlive(lock.pid)) return { name: \"spin\", status: \"failed\", detail: \"bridge not running\" };\n return { name: \"spin\", status: \"ok\", detail: \"bridge alive\" };\n}\n\nasync function probeKanban(): Promise<ProbeResult> {\n const dbPath = join(home, \"kanban\", \"kanban.db\");\n if (!existsSync(dbPath)) return { name: \"kanban\", status: \"skipped\", detail: \"kanban.db not found\" };\n const sharedNm = join(homedir(), \".local\", \"lib\", \"node_modules\", \"better-sqlite3\");\n if (!existsSync(sharedNm)) return { name: \"kanban\", status: \"skipped\", detail: \"better-sqlite3 not installed (run: abtars deps install)\" };\n let Db: any;\n try {\n const { createRequire } = await import(\"node:module\");\n const _require = createRequire(import.meta.url);\n Db = _require(sharedNm);\n } catch (err) {\n return { name: \"kanban\", status: \"skipped\", detail: `better-sqlite3 not loadable: ${err instanceof Error ? err.message : String(err)}` };\n }\n try {\n const db = new Db(dbPath, { readonly: true });\n const row = db.prepare(\"SELECT COUNT(*) as cnt FROM kanban_board\").get() as { cnt: number };\n const stuck = db.prepare(\"SELECT COUNT(*) as cnt FROM kanban_board WHERE status='running' AND updated_at < datetime('now', '-10 minutes')\").get() as { cnt: number };\n db.close();\n const detail = stuck.cnt > 0 ? `${row.cnt} cards, ${stuck.cnt} stuck` : `${row.cnt} cards`;\n return { name: \"kanban\", status: stuck.cnt > 0 ? \"failed\" : \"ok\", detail };\n } catch (err) {\n return { name: \"kanban\", status: \"skipped\", detail: `kanban.db query failed: ${err instanceof Error ? err.message : String(err)}` };\n }\n}\n\nasync function probeSkills(): Promise<ProbeResult> {\n const catalog = join(home, \"skills\", \"skills_catalog.md\");\n if (!existsSync(catalog)) return { name: \"skills\", status: \"failed\", detail: \"skills_catalog.md missing\" };\n const content = readFileSync(catalog, \"utf-8\");\n const count = (content.match(/^## /gm) || []).length;\n if (count === 0) return { name: \"skills\", status: \"failed\", detail: \"catalog empty\" };\n return { name: \"skills\", status: \"ok\", detail: `${count} loaded` };\n}\n\nasync function probeSha(): Promise<ProbeResult> {\n // Check if healer skill exists in catalog\n const catalog = join(home, \"skills\", \"skills_catalog.md\");\n if (!existsSync(catalog)) return { name: \"sha\", status: \"skipped\", detail: \"no catalog\" };\n const content = readFileSync(catalog, \"utf-8\");\n if (/self.heal|healer|auto.fix/i.test(content)) return { name: \"sha\", status: \"ok\", detail: \"rules loaded\" };\n // Check sha-policy.json\n if (existsSync(join(configDir, \"sha-policy.json\"))) return { name: \"sha\", status: \"ok\", detail: \"rules loaded\" };\n return { name: \"sha\", status: \"skipped\", detail: \"no healer rules configured\" };\n}\n\n// \u2500\u2500 Tribe Probes \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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\nasync function probeA2a(): Promise<ProbeResult> {\n const env = readEnv();\n if (env.get(\"ENABLE_AGENT_API\") !== \"true\") return { name: \"a2a\", status: \"skipped\", detail: \"not enabled\" };\n const port = parseInt(env.get(\"AGENT_API_PORT\") || \"7100\", 10);\n try {\n const { createConnection } = await import(\"node:net\");\n await new Promise<void>((resolve, reject) => {\n const sock = createConnection({ port, host: \"127.0.0.1\" }, () => { sock.destroy(); resolve(); });\n sock.on(\"error\", reject);\n sock.setTimeout(2000, () => { sock.destroy(); reject(new Error(\"timeout\")); });\n });\n return { name: \"a2a\", status: \"ok\", detail: `${port}` };\n } catch {\n return { name: \"a2a\", status: \"failed\", detail: `${port} not listening` };\n }\n}\n\nasync function probePeers(): Promise<ProbeResult> {\n const peersPath = join(configDir, \"peers.json\");\n const peers = readJson(peersPath) as { peers?: Record<string, { verifyKey?: string; trust?: number }>; self?: { signingKey?: string; tribeToken?: string } } | null;\n if (!peers) return { name: \"peers\", status: \"skipped\", detail: \"peers.json missing\" };\n if (!peers.self?.signingKey) return { name: \"peers\", status: \"failed\", detail: \"self.signingKey missing \u2014 run: abtars install\" };\n\n const peerEntries = Object.entries(peers.peers ?? {});\n const peerCount = peerEntries.length;\n if (peerCount === 0) return { name: \"peers\", status: \"skipped\", detail: \"no peers (solo)\" };\n\n // Check that all peers have verifyKey\n const missingKey = peerEntries.filter(([, e]) => !e.verifyKey).map(([n]) => n);\n if (missingKey.length > 0) return { name: \"peers\", status: \"failed\", detail: `missing verifyKey: ${missingKey.join(\", \")}` };\n\n return { name: \"peers\", status: \"ok\", detail: `${peerCount} enrolled (all keys valid)` };\n}\n\nasync function probeIdentity(): Promise<ProbeResult> {\n const env = readEnv();\n if (env.get(\"ENABLE_AGENT_API\") !== \"true\") return { name: \"identity\", status: \"skipped\", detail: \"a2a disabled\" };\n\n const certPath = join(configDir, \"identity.crt\");\n const keyPath = join(configDir, \"identity.tls.key\");\n const certExists = existsSync(certPath);\n const keyExists = existsSync(keyPath);\n if (!certExists || !keyExists) {\n const missing = [!certExists && \"identity.crt\", !keyExists && \"identity.tls.key\"].filter(Boolean);\n return { name: \"identity\", status: \"failed\", detail: `missing: ${missing.join(\", \")}` };\n }\n\n // Verify cert public key matches self.signingKey (#1293)\n try {\n const { loadPeerConfig, deriveVerifyKey } = require(\"../../components/peer-config.js\") as typeof import(\"../../components/peer-config.js\");\n const { verifyServerCert } = require(\"../../components/peer-transport/peer-auth.js\") as typeof import(\"../../components/peer-transport/peer-auth.js\");\n const config = loadPeerConfig();\n const expectedVerifyKey = deriveVerifyKey(config.self.signingKey);\n const certPem = readFileSync(certPath, \"utf-8\");\n if (!verifyServerCert(certPem, expectedVerifyKey)) {\n return { name: \"identity\", status: \"failed\", detail: \"cert pubkey mismatch \u2014 re-run: abtars install --force\" };\n }\n return { name: \"identity\", status: \"ok\", detail: \"cert matches signing key\" };\n } catch {\n return { name: \"identity\", status: \"ok\", detail: \"cert present (key-match skipped)\" };\n }\n}\n\nasync function probeGossip(): Promise<ProbeResult> {\n const env = readEnv();\n if (env.get(\"ENABLE_AGENT_API\") !== \"true\") return { name: \"gossip\", status: \"skipped\", detail: \"a2a disabled\" };\n\n const peers = readJson(join(configDir, \"peers.json\")) as { peers?: Record<string, unknown>; self?: { signingKey?: string } } | null;\n const peerCount = Object.keys(peers?.peers ?? {}).length;\n if (peerCount === 0) return { name: \"gossip\", status: \"skipped\", detail: \"no peers (solo)\" };\n if (!peers?.self?.signingKey) return { name: \"gossip\", status: \"failed\", detail: \"self.signingKey missing \u2014 Ed25519 gossip requires identity\" };\n\n const port = parseInt(env.get(\"GOSSIP_PORT\") || \"5355\", 10);\n\n // Bind-test: if the port is already in use, gossip is live (EADDRINUSE = good).\n // If we can bind it, nothing is listening \u2192 gossip not running.\n const inUse = await new Promise<boolean>((resolve) => {\n import(\"node:dgram\").then(({ createSocket }) => {\n const sock = createSocket(\"udp4\");\n sock.once(\"error\", (err: NodeJS.ErrnoException) => { sock.close(); resolve(err.code === \"EADDRINUSE\"); });\n sock.bind(port, \"0.0.0.0\", () => { sock.close(); resolve(false); });\n }).catch(() => resolve(false));\n });\n if (!inUse) return { name: \"gossip\", status: \"failed\", detail: `${port} not listening` };\n\n // Live \u2014 report broadcast freshness.\n const lock = readJson(join(home, \"bridge.lock\"));\n const last = typeof lock?.lastGossipBroadcast === \"number\" ? lock.lastGossipBroadcast : 0;\n if (!last) return { name: \"gossip\", status: \"ok\", detail: `${port} / no broadcast yet` };\n const age = Date.now() - last;\n if (age > TTL_MS) return { name: \"gossip\", status: \"failed\", detail: `${port} / stale (${ago(age)})` };\n return { name: \"gossip\", status: \"ok\", detail: `${port} / last broadcast ${ago(age)}` };\n}\n\n// \u2500\u2500 Soul Probes \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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\nasync function probeMind(): Promise<ProbeResult> {\n try {\n const { loadAbmind } = await import(\"../../utils/abmind-lazy.js\");\n const mod = await loadAbmind();\n if (!mod) return { name: \"mind\", status: \"skipped\", detail: \"abmind not installed\" };\n return { name: \"mind\", status: \"ok\", detail: \"abmind loaded (in-process)\" };\n } catch {\n return { name: \"mind\", status: \"skipped\", detail: \"abmind load failed\" };\n }\n}\n\n// \u2500\u2500 Runner \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 async function runAllProbes(): Promise<DoctorOutput> {\n const start = Date.now();\n\n const [body, heart, brain, soul, tribe] = await Promise.all([\n Promise.all([probePlatforms(), probeDashboard(), probeSecurity(), probeWatchdog(), probeSingleBridge()].map(p => timedProbe(() => p))),\n Promise.all([probeHeartbeat()].map(p => timedProbe(() => p))),\n Promise.all([probeTransport(), probeSpin(), probeKanban(), probeSkills(), probeSha()].map(p => timedProbe(() => p))),\n Promise.all([probeMind()].map(p => timedProbe(() => p))),\n Promise.all([probeA2a(), probePeers(), probeIdentity(), probeGossip()].map(p => timedProbe(() => p))),\n ]);\n\n return { version: \"1.0\", totalMs: Date.now() - start, layers: { body, heart, brain, soul, tribe } };\n}\n\n// \u2500\u2500 Fix Logic \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 async function runFixes(): Promise<FixResult[]> {\n const { chmodSync, unlinkSync, mkdirSync, existsSync: ex, readdirSync: rd, statSync: st, readFileSync: rf, writeFileSync: wf } = await import(\"node:fs\");\n const { spawnSync } = await import(\"node:child_process\");\n const fixes: FixResult[] = [];\n\n function fix(probe: string, action: string, fn: () => void): void {\n try { fn(); fixes.push({ probe, action, success: true }); }\n catch { fixes.push({ probe, action, success: false }); }\n }\n\n // 1. chmod 700 sensitive dirs\n for (const dir of [\"config\", \"secret\", \"auth\", \"hooks\"]) {\n const p = join(home, dir);\n if (ex(p) && (st(p).mode & 0o777) !== 0o700) {\n fix(\"security\", `${dir}/ \u2192 700`, () => chmodSync(p, 0o700));\n }\n }\n\n // 2. chmod 600 secret files\n const secretDir = join(home, \"secret\");\n if (ex(secretDir)) {\n for (const f of rd(secretDir)) {\n const fp = join(secretDir, f);\n if (st(fp).isFile() && (st(fp).mode & 0o777) !== 0o600) {\n fix(\"security\", `${f} \u2192 600`, () => chmodSync(fp, 0o600));\n }\n }\n }\n\n // 3. chmod 600 config files\n if (ex(configDir)) {\n for (const f of rd(configDir)) {\n const fp = join(configDir, f);\n if (st(fp).isFile() && (st(fp).mode & 0o777) !== 0o600) {\n fix(\"security\", `config/${f} \u2192 600`, () => chmodSync(fp, 0o600));\n }\n }\n }\n\n // 4. Stale deploy.lock\n const deployLock = join(home, \"deploy.lock\");\n if (ex(deployLock)) {\n const lock = readJson(deployLock);\n const lockAge = lock?.startedAt ? (Date.now() - new Date(lock.startedAt).getTime()) / 1000 : 9999;\n const lockPid = lock?.pid ?? 0;\n if (lockAge > 300 && (lockPid === 0 || !pidAlive(lockPid))) {\n fix(\"watchdog\", \"removed stale deploy.lock\", () => unlinkSync(deployLock));\n }\n }\n\n // 5. Stale .start-reason\n const startReason = join(home, \".start-reason\");\n if (ex(startReason)) {\n const age = (Date.now() - st(startReason).mtimeMs) / 1000;\n if (age > 300) fix(\"watchdog\", \"removed stale .start-reason\", () => unlinkSync(startReason));\n }\n\n // 6. Create missing dirs\n for (const dir of [\"logs\", \"workspace\", \"overflow\", \"received\"]) {\n const p = join(home, dir);\n if (!ex(p)) fix(\"watchdog\", `created ${dir}/`, () => mkdirSync(p, { recursive: true }));\n }\n\n // 7. Kill orphan CLI processes\n try {\n const lock = readJson(join(home, \"bridge.lock\"));\n const bridgePid = lock?.pid ?? 0;\n const wdPid = lock?.watchdogPid ?? 0;\n\n // Orphan kiro-cli\n const kiro = spawnSync(\"pgrep\", [\"-f\", \"kiro-cli.*acp\"], { encoding: \"utf-8\" });\n if (kiro.stdout) {\n for (const pid of kiro.stdout.trim().split(\"\\n\").filter(Boolean).map(Number)) {\n if (pid > 0 && pid !== bridgePid && pid !== wdPid && pid !== process.pid) {\n fix(\"brain\", `killed orphan kiro-cli ${pid}`, () => process.kill(pid, \"SIGTERM\"));\n }\n }\n }\n\n // Orphan abtars-sleep\n const sleep = spawnSync(\"pgrep\", [\"-f\", \"abtars-sleep\"], { encoding: \"utf-8\" });\n if (sleep.stdout) {\n for (const pid of sleep.stdout.trim().split(\"\\n\").filter(Boolean).map(Number)) {\n if (pid > 0 && pid !== bridgePid) {\n fix(\"brain\", `killed orphan abtars-sleep ${pid}`, () => process.kill(pid, \"SIGTERM\"));\n }\n }\n }\n } catch { /* pgrep not available or no orphans */ }\n\n // 8. Stale locks/sockets\n for (const f of [\"sleep.lock\", \"memory.sock\"]) {\n const p = join(home, f);\n if (ex(p)) {\n const age = (Date.now() - st(p).mtimeMs) / 1000;\n const lock = readJson(join(home, \"bridge.lock\"));\n if (age > 600 && (!lock?.pid || !pidAlive(lock.pid))) {\n fix(\"watchdog\", `removed stale ${f}`, () => unlinkSync(p));\n }\n }\n }\n\n // 9. Retention: delete old logs/overflow/media\n const LOGS_KEEP_DAYS = 7;\n const DATA_KEEP_DAYS = 30;\n try {\n const cutoffLogs = Date.now() - LOGS_KEEP_DAYS * 86400_000;\n const cutoffData = Date.now() - DATA_KEEP_DAYS * 86400_000;\n\n for (const [dir, cutoff] of [[join(home, \"logs\"), cutoffLogs], [join(home, \"overflow\"), cutoffData], [join(home, \"received\", \"media\"), cutoffLogs]] as const) {\n if (!ex(dir)) continue;\n let deleted = 0;\n for (const f of rd(dir)) {\n const fp = join(dir, f);\n if (st(fp).isFile() && st(fp).mtimeMs < cutoff) { unlinkSync(fp); deleted++; }\n }\n if (deleted > 0) fixes.push({ probe: \"retention\", action: `deleted ${deleted} stale file(s) from ${dir.split(\"/\").pop()}`, success: true });\n }\n\n // Truncate audit.jsonl if >10MB\n const auditPath = join(home, \"auth\", \"audit.jsonl\");\n if (ex(auditPath) && st(auditPath).size > 10_000_000) {\n const lines = rf(auditPath, \"utf-8\").split(\"\\n\");\n wf(auditPath, lines.slice(-1000).join(\"\\n\"));\n fixes.push({ probe: \"retention\", action: \"truncated audit.jsonl\", success: true });\n }\n } catch { /* retention errors non-fatal */ }\n\n // 10. Kill duplicate bridges\n try {\n const lock = readJson(join(home, \"bridge.lock\"));\n const expectedPid = lock?.pid ?? 0;\n const pgrep = spawnSync(\"pgrep\", [\"-f\", \"abtars.*main\"], { encoding: \"utf-8\" });\n if (pgrep.stdout) {\n for (const pid of pgrep.stdout.trim().split(\"\\n\").filter(Boolean).map(Number)) {\n if (pid > 0 && pid !== expectedPid && pid !== process.pid) {\n fix(\"watchdog\", `killed duplicate bridge ${pid}`, () => process.kill(pid, \"SIGTERM\"));\n }\n }\n }\n } catch { /* non-fatal */ }\n\n // 11. Hooks dir perms\n const hooksDir = join(home, \"hooks\");\n if (ex(hooksDir) && (st(hooksDir).mode & 0o777) !== 0o700) {\n fix(\"security\", \"hooks/ \u2192 700\", () => chmodSync(hooksDir, 0o700));\n }\n\n // 12. Install watchdog service if missing\n try {\n const manifest = readJson(join(home, \"manifest.json\"));\n if (manifest?.installMode === \"daemon\") {\n const { platform } = await import(\"node:os\");\n if (platform() === \"darwin\") {\n const plist = `${home}/com.abtars.watchdog.plist`;\n const dst = `${process.env[\"HOME\"]}/Library/LaunchAgents/com.abtars.watchdog.plist`;\n if (ex(plist) && !ex(dst)) {\n fix(\"watchdog\", \"installed LaunchAgent\", () => {\n const { copyFileSync } = require(\"node:fs\");\n copyFileSync(plist, dst);\n spawnSync(\"launchctl\", [\"load\", dst]);\n });\n }\n } else {\n const svc = `${home}/abtars-watchdog.service`;\n const dst = `${process.env[\"HOME\"]}/.config/systemd/user/abtars-watchdog.service`;\n if (ex(svc) && !ex(dst)) {\n fix(\"watchdog\", \"installed systemd unit\", () => {\n mkdirSync(join(process.env[\"HOME\"]!, \".config\", \"systemd\", \"user\"), { recursive: true });\n const { copyFileSync } = require(\"node:fs\");\n copyFileSync(svc, dst);\n spawnSync(\"systemctl\", [\"--user\", \"enable\", \"--now\", \"abtars-watchdog.service\"]);\n });\n }\n }\n }\n } catch { /* non-fatal */ }\n\n return fixes;\n}\n\n// \u2500\u2500 Renderer \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 ICON = { ok: \"\u2713\", failed: \"\u2717\", skipped: \"~\" } as const;\n\nexport function renderHuman(output: DoctorOutput): string {\n const lines: string[] = [];\n for (const [layer, probes] of Object.entries(output.layers) as [string, ProbeResult[]][]) {\n lines.push(`${layer.charAt(0).toUpperCase() + layer.slice(1)}:`);\n for (const p of probes) {\n const ms = p.ms && p.ms > 500 ? ` (${p.ms}ms)` : \"\";\n const detail = p.detail ? ` \u2014 ${p.detail}` : \"\";\n lines.push(` ${ICON[p.status]} ${p.name}${ms}${detail}`);\n }\n }\n const total = Object.values(output.layers).flat();\n const okCount = total.filter(r => r.status === \"ok\").length;\n lines.push(`\\n${okCount}/${total.length} ok (${(output.totalMs / 1000).toFixed(1)}s)`);\n return lines.join(\"\\n\");\n}\n\nexport function renderJson(output: DoctorOutput): string {\n return JSON.stringify(output, null, 2);\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -3,7 +3,7 @@
3
3
  import {
4
4
  init_log_and_swallow,
5
5
  logAndSwallow
6
- } from "./chunk-YSKCQH6E.js";
6
+ } from "./chunk-2IYJ4I66.js";
7
7
  import {
8
8
  abmindHome,
9
9
  abtarsHome,
@@ -70,9 +70,6 @@ function buildPolicy(source, config) {
70
70
  case "peer":
71
71
  base = { allowedTools: [], allowedRead: [], allowedWrite: [], canExecuteBash: false };
72
72
  break;
73
- case "guest":
74
- base = { allowedTools: ["web_fetch"], allowedRead: [], allowedWrite: [], canExecuteBash: false };
75
- break;
76
73
  }
77
74
  if (config) base = { ...base, ...config };
78
75
  return Object.freeze(base);
@@ -128,4 +125,4 @@ export {
128
125
  auditDeny,
129
126
  ToolLoopGuard
130
127
  };
131
- //# sourceMappingURL=chunk-WBTJ2E62.js.map
128
+ //# sourceMappingURL=chunk-P3NODAHF.js.map