abtars 0.3.4-alpha.0 → 0.3.4-alpha.2

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 (392) hide show
  1. package/bundle/{_registry.generated-7DRCE4V6.js → _registry.generated-RC6PEH6Z.js} +16 -15
  2. package/bundle/{_registry.generated-7DRCE4V6.js.map → _registry.generated-RC6PEH6Z.js.map} +1 -1
  3. package/bundle/abtars-browser.js +6 -5
  4. package/bundle/abtars-browser.js.map +1 -1
  5. package/bundle/abtars-cli.js +73 -46
  6. package/bundle/abtars-cli.js.map +3 -3
  7. package/bundle/abtars-restart.js +7 -7
  8. package/bundle/abtars-rss.js +2 -1
  9. package/bundle/abtars-rss.js.map +2 -2
  10. package/bundle/abtars-task.js +6 -5
  11. package/bundle/abtars-task.js.map +1 -1
  12. package/bundle/abtars-todo.js +2 -1
  13. package/bundle/abtars-todo.js.map +1 -1
  14. package/bundle/abtars.js +307 -212
  15. package/bundle/abtars.js.map +4 -4
  16. package/bundle/{acp-raw-client-AZJCEB6S.js → acp-raw-client-E6FM45NC.js} +4 -3
  17. package/bundle/{acp-raw-client-AZJCEB6S.js.map → acp-raw-client-E6FM45NC.js.map} +1 -1
  18. package/bundle/{action-gate-QYJL57IX.js → action-gate-G2V47NHW.js} +4 -3
  19. package/bundle/{action-gate-QYJL57IX.js.map → action-gate-G2V47NHW.js.map} +1 -1
  20. package/bundle/{agent-api-adapter-PYMNQXHE.js → agent-api-adapter-PTJYZKQK.js} +5 -4
  21. package/bundle/{agent-api-adapter-PYMNQXHE.js.map → agent-api-adapter-PTJYZKQK.js.map} +1 -1
  22. package/bundle/{agent-api-rate-limit-4GEZ4YN5.js → agent-api-rate-limit-WCFXJMGY.js} +6 -5
  23. package/bundle/{agent-registry-563P4EUJ.js → agent-registry-GU7ABOK5.js} +9 -8
  24. package/bundle/bootstrap-POWWTU6I.js +63 -0
  25. package/bundle/bootstrap-POWWTU6I.js.map +7 -0
  26. package/bundle/{bridge-lock-transport-LXCF2IVN.js → bridge-lock-transport-4ZH7QTJP.js} +6 -5
  27. package/bundle/{browser-2VZOGOGX.js → browser-EJNS35NT.js} +8 -7
  28. package/bundle/{budget-PPA7WY3D.js → budget-45QOBDWA.js} +5 -4
  29. package/bundle/{budget-PPA7WY3D.js.map → budget-45QOBDWA.js.map} +1 -1
  30. package/bundle/{capability-WXEA2WFK.js → capability-JFWX3IQF.js} +7 -6
  31. package/bundle/{chunk-CB6S3ZRF.js → chunk-2FAZIA37.js} +3 -3
  32. package/bundle/{chunk-VJATH7AN.js → chunk-2KC5G3EA.js} +9 -8
  33. package/bundle/chunk-2KC5G3EA.js.map +7 -0
  34. package/bundle/{chunk-OY2HAK33.js → chunk-36ZEYDKZ.js} +1 -1
  35. package/bundle/chunk-36ZEYDKZ.js.map +7 -0
  36. package/bundle/{chunk-2FZJDMAF.js → chunk-3CACHBDI.js} +10 -10
  37. package/bundle/{chunk-O4GKI3Q3.js → chunk-4S554KLW.js} +4 -4
  38. package/bundle/{chunk-3QW2K53E.js → chunk-5GCLBUBS.js} +11 -19
  39. package/bundle/chunk-5GCLBUBS.js.map +7 -0
  40. package/bundle/{chunk-RJX45XIC.js → chunk-5HDSQFT6.js} +9 -4
  41. package/bundle/chunk-5HDSQFT6.js.map +7 -0
  42. package/bundle/{chunk-EDZGF6BC.js → chunk-5NY2YULC.js} +11 -4
  43. package/bundle/chunk-5NY2YULC.js.map +7 -0
  44. package/bundle/{chunk-LE23VPN3.js → chunk-63A7ZRIH.js} +4 -4
  45. package/bundle/{chunk-LE23VPN3.js.map → chunk-63A7ZRIH.js.map} +1 -1
  46. package/bundle/{chunk-SSCGWDIC.js → chunk-65VCEC32.js} +2 -2
  47. package/bundle/{chunk-V2QIAXWZ.js → chunk-7BSQ5UQO.js} +3 -3
  48. package/bundle/{chunk-E7MV7WFT.js → chunk-7Z3HBPRY.js} +6 -6
  49. package/bundle/{chunk-TY26WMQY.js → chunk-AFREM7FX.js} +2 -2
  50. package/bundle/{chunk-GCFIK6OB.js → chunk-AO32N2VB.js} +92 -20
  51. package/bundle/chunk-AO32N2VB.js.map +7 -0
  52. package/bundle/{chunk-N5VROZ7A.js → chunk-B6ZN6COK.js} +5 -5
  53. package/bundle/{chunk-M6Q3IQ4H.js → chunk-BFDBGESM.js} +259 -122
  54. package/bundle/chunk-BFDBGESM.js.map +7 -0
  55. package/bundle/{chunk-YEOZN5IE.js → chunk-DYBW4XXL.js} +2 -2
  56. package/bundle/{chunk-56D3Y44D.js → chunk-EFJVUJBE.js} +10 -10
  57. package/bundle/{chunk-S6HEHCCG.js → chunk-EQSG2CRM.js} +83 -46
  58. package/bundle/chunk-EQSG2CRM.js.map +7 -0
  59. package/bundle/{chunk-FIAVVKGN.js → chunk-EUZDKV3C.js} +3 -3
  60. package/bundle/{chunk-2LKQV2ND.js → chunk-FRKW6LWB.js} +3 -3
  61. package/bundle/{chunk-H2K23MOF.js → chunk-GALQBVKO.js} +21 -5
  62. package/bundle/chunk-GALQBVKO.js.map +7 -0
  63. package/bundle/{chunk-DNDYD5SL.js → chunk-GP4XUKI5.js} +3 -3
  64. package/bundle/{chunk-SXNY6HC4.js → chunk-GPZNXY2U.js} +6 -6
  65. package/bundle/chunk-GPZNXY2U.js.map +7 -0
  66. package/bundle/{chunk-W726UGI6.js → chunk-GRVWZO4C.js} +3 -3
  67. package/bundle/{chunk-IXKQ4JMX.js → chunk-GVM5YU5I.js} +33 -17
  68. package/bundle/chunk-GVM5YU5I.js.map +7 -0
  69. package/bundle/{chunk-OOKNHOCB.js → chunk-GWILHZPT.js} +2 -2
  70. package/bundle/{chunk-3LQOJVTB.js → chunk-HFOCNYEO.js} +1842 -1220
  71. package/bundle/{chunk-3LQOJVTB.js.map → chunk-HFOCNYEO.js.map} +4 -4
  72. package/bundle/{chunk-NP72ZB7P.js → chunk-HMKVL7AX.js} +53 -47
  73. package/bundle/chunk-HMKVL7AX.js.map +7 -0
  74. package/bundle/{chunk-BNBC4T45.js → chunk-HT2BPTZY.js} +3 -3
  75. package/bundle/{chunk-BU7LTI2W.js → chunk-HZDLFLRP.js} +6 -7
  76. package/bundle/chunk-HZDLFLRP.js.map +7 -0
  77. package/bundle/{chunk-FVUL44T4.js → chunk-IJT4KWXT.js} +2 -2
  78. package/bundle/{chunk-IK4R3RBZ.js → chunk-JNIHEDKF.js} +3 -3
  79. package/bundle/{chunk-J5NOL4DB.js → chunk-JQDJPUHM.js} +16 -6
  80. package/bundle/chunk-JQDJPUHM.js.map +7 -0
  81. package/bundle/{chunk-SESM4GBM.js → chunk-KTYGKPYM.js} +52 -25
  82. package/bundle/chunk-KTYGKPYM.js.map +7 -0
  83. package/bundle/chunk-LME23AA2.js +37 -0
  84. package/bundle/chunk-LME23AA2.js.map +7 -0
  85. package/bundle/{chunk-4PIVWXUJ.js → chunk-LUNA6PM5.js} +2 -2
  86. package/bundle/{chunk-37EX63K4.js → chunk-LUW62WGO.js} +6998 -3621
  87. package/bundle/chunk-LUW62WGO.js.map +7 -0
  88. package/bundle/{chunk-MV5KOWOR.js → chunk-NDCRWEEJ.js} +7 -7
  89. package/bundle/{chunk-7WHXTCVD.js → chunk-NRUSRJXR.js} +8 -3
  90. package/bundle/chunk-NRUSRJXR.js.map +7 -0
  91. package/bundle/{chunk-C3EYYJN3.js → chunk-O7KQG6ME.js} +17 -5
  92. package/bundle/chunk-O7KQG6ME.js.map +7 -0
  93. package/bundle/{chunk-ZOCEBV62.js → chunk-OKAQICWY.js} +3 -3
  94. package/bundle/{chunk-TCI6FZTP.js → chunk-OLAURO5G.js} +9 -9
  95. package/bundle/{chunk-YME7NRGP.js → chunk-OXTSWQCX.js} +2 -2
  96. package/bundle/{chunk-HDOFJVFS.js → chunk-PEDX56EL.js} +3 -3
  97. package/bundle/{chunk-7RAGSHSH.js → chunk-PROPYS3P.js} +12 -10
  98. package/bundle/chunk-PROPYS3P.js.map +7 -0
  99. package/bundle/{chunk-ASYX43OU.js → chunk-Q32H6VPU.js} +26 -26
  100. package/bundle/{chunk-P5O6QZDC.js → chunk-QROWBWLL.js} +10 -6
  101. package/bundle/chunk-QROWBWLL.js.map +7 -0
  102. package/bundle/{chunk-S7ZIGIR5.js → chunk-R76K6L6H.js} +27 -27
  103. package/bundle/{chunk-S7ZIGIR5.js.map → chunk-R76K6L6H.js.map} +1 -1
  104. package/bundle/{chunk-MQJG7OJX.js → chunk-RIHQ37U5.js} +38 -36
  105. package/bundle/chunk-RIHQ37U5.js.map +7 -0
  106. package/bundle/{chunk-IQKADER4.js → chunk-RWRRGE4U.js} +2 -2
  107. package/bundle/{chunk-72T2Q7IG.js → chunk-S5GD5EJ5.js} +271 -282
  108. package/bundle/chunk-S5GD5EJ5.js.map +7 -0
  109. package/bundle/{chunk-ULO2PX3T.js → chunk-TEFZ4JA4.js} +3 -3
  110. package/bundle/{chunk-2RGR3LSV.js → chunk-TMUYFERL.js} +2 -2
  111. package/bundle/{chunk-KBPVJGD7.js → chunk-URQPDCK5.js} +3 -3
  112. package/bundle/chunk-UUIHL65U.js +77 -0
  113. package/bundle/chunk-UUIHL65U.js.map +7 -0
  114. package/bundle/{chunk-FJF42RZY.js → chunk-VUIX5AGB.js} +3 -3
  115. package/bundle/{chunk-5V4VHKEA.js → chunk-WBTJ2E62.js} +5 -4
  116. package/bundle/chunk-WBTJ2E62.js.map +7 -0
  117. package/bundle/{chunk-ZY6DH2S4.js → chunk-WTIGZO3N.js} +80 -70
  118. package/bundle/chunk-WTIGZO3N.js.map +7 -0
  119. package/bundle/{chunk-4HNCOQSK.js → chunk-WYHGNI56.js} +7 -7
  120. package/bundle/{chunk-24V4A6RP.js → chunk-XX6BGTPO.js} +4 -4
  121. package/bundle/{chunk-T7TAWGBX.js → chunk-Y76VUJSF.js} +2 -2
  122. package/bundle/{chunk-TVSPVZTX.js → chunk-YDY6QVWJ.js} +3 -3
  123. package/bundle/{chunk-V6CV3QPH.js → chunk-YRSMGJFP.js} +2 -2
  124. package/bundle/{chunk-WP7FZHMI.js → chunk-YSKCQH6E.js} +2 -2
  125. package/bundle/{chunk-NGZVJ52F.js → chunk-ZKJOFASV.js} +7 -7
  126. package/bundle/{chunk-WGWM4IZM.js → chunk-ZT5ZBGWS.js} +4 -4
  127. package/bundle/{chunk-WGWM4IZM.js.map → chunk-ZT5ZBGWS.js.map} +1 -1
  128. package/bundle/{chunk-43DKPXTP.js → chunk-ZV4IWKDJ.js} +4 -4
  129. package/bundle/{commands-XXFU2ZF7.js → commands-EWA4HNCM.js} +20 -20
  130. package/bundle/{config-EWDZ234X.js → config-M3P5IOAI.js} +8 -7
  131. package/bundle/{config-show-6J33O4TE.js → config-show-3DHPP26D.js} +5 -5
  132. package/bundle/{context-OCS7HLJP.js → context-5P7IYYU2.js} +5 -2
  133. package/bundle/{context-OCS7HLJP.js.map → context-5P7IYYU2.js.map} +1 -1
  134. package/bundle/{daemon-LTDAXNA2.js → daemon-TB23FFWY.js} +7 -7
  135. package/bundle/{delegation-tools-YDTWQMZD.js → delegation-tools-P2SCNL23.js} +14 -11
  136. package/bundle/{registry-client-VN2MM2HI.js → deploy-YYUCGGP3.js} +10 -6
  137. package/bundle/{deploy-lib-import-RGZJ3CGC.js → deploy-lib-import-T3UP4G6G.js} +5 -3
  138. package/bundle/{deps-PHSLIA77.js → deps-WVK553KF.js} +21 -19
  139. package/bundle/deps-WVK553KF.js.map +7 -0
  140. package/bundle/{direct-api-transport-OAKYQBJR.js → direct-api-transport-WQ6HA5OX.js} +30 -28
  141. package/bundle/direct-api-transport-WQ6HA5OX.js.map +7 -0
  142. package/bundle/{discord-adapter-WUNYPTDE.js → discord-adapter-4TTETYDI.js} +26 -26
  143. package/bundle/{dist-7HEHHQI2.js → dist-KMK7TZGN.js} +376 -348
  144. package/bundle/dist-KMK7TZGN.js.map +7 -0
  145. package/bundle/{dns-wakeup-F55ALHXJ.js → dns-wakeup-IDOJIXBX.js} +4 -3
  146. package/bundle/{dns-wakeup-F55ALHXJ.js.map → dns-wakeup-IDOJIXBX.js.map} +1 -1
  147. package/bundle/{doctor-probes-3SLIUGKS.js → doctor-probes-VDWFJKUB.js} +4 -3
  148. package/bundle/{env-schema-MSDP2YBO.js → env-schema-4JXQUOH4.js} +5 -4
  149. package/bundle/{gossip-CS3G3447.js → gossip-3C3BSNPN.js} +7 -6
  150. package/bundle/{guardrails-24XK2COI.js → guardrails-DL7ZSWVN.js} +6 -5
  151. package/bundle/{health-check-FRUNRVNQ.js → health-check-YKWFD2LZ.js} +5 -6
  152. package/bundle/{health-check-FRUNRVNQ.js.map → health-check-YKWFD2LZ.js.map} +2 -2
  153. package/bundle/{heartbeat-system-G4IFQXT6.js → heartbeat-system-TDDIOVTC.js} +7 -6
  154. package/bundle/{heartbeat-tier3-3ZO3EVXP.js → heartbeat-tier3-55T2HUNE.js} +45 -44
  155. package/bundle/heartbeat-tier3-55T2HUNE.js.map +7 -0
  156. package/bundle/{hook-system-X6INNJGV.js → hook-system-M3POLUIB.js} +5 -4
  157. package/bundle/{hotskills-6FQYTJIO.js → hotskills-FWX4QI7V.js} +7 -6
  158. package/bundle/{install-ZAHTZ5M5.js → install-4MXBYIUG.js} +23 -20
  159. package/bundle/install-4MXBYIUG.js.map +7 -0
  160. package/bundle/{install-manifest-QX7KVDCA.js → install-manifest-5PPWMD2W.js} +4 -3
  161. package/bundle/{install-manifest-QX7KVDCA.js.map → install-manifest-5PPWMD2W.js.map} +1 -1
  162. package/bundle/{irc-adapter-IEJQKKJF.js → irc-adapter-PTTZD32W.js} +5 -4
  163. package/bundle/{irc-adapter-IEJQKKJF.js.map → irc-adapter-PTTZD32W.js.map} +1 -1
  164. package/bundle/{irc-config-TTWNYFLH.js → irc-config-CP7ZMUOX.js} +6 -5
  165. package/bundle/{irc-config-TTWNYFLH.js.map → irc-config-CP7ZMUOX.js.map} +1 -1
  166. package/bundle/{kanban-board-J6RO3ZU7.js → kanban-board-M326B2XJ.js} +7 -5
  167. package/bundle/{kanban-channel-5EIXBFSA.js → kanban-channel-IJ52OMNA.js} +8 -6
  168. package/bundle/{lazy-require-V6EFUATC.js → lazy-require-KCRVT4SI.js} +11 -6
  169. package/bundle/{logger-Y3VILPRH.js → logger-OWCSNYCA.js} +4 -3
  170. package/bundle/{logs-YS3GDURO.js → logs-FXS4SCEM.js} +5 -5
  171. package/bundle/{main-chat-YLZDNQPO.js → main-chat-ZNUZCTNS.js} +6 -5
  172. package/bundle/{master-user-Z4M7KCJE.js → master-user-HSKM4ZFN.js} +7 -6
  173. package/bundle/{media-utils-P6RZ2K3U.js → media-utils-3ZYOD7SK.js} +44 -43
  174. package/bundle/{media-utils-P6RZ2K3U.js.map → media-utils-3ZYOD7SK.js.map} +2 -2
  175. package/bundle/{message-pipeline-MHEBDJLH.js → message-pipeline-KSONH4MT.js} +20 -20
  176. package/bundle/meta.json +9327 -8582
  177. package/bundle/{migrate-layout-RJJQLVGR.js → migrate-layout-IJIEJY3A.js} +8 -4
  178. package/bundle/migrate-layout-IJIEJY3A.js.map +7 -0
  179. package/bundle/{nerve-VZNMFDGY.js → nerve-IGSXBKZZ.js} +5 -4
  180. package/bundle/{notification-VV2OR6NW.js → notification-BFSIEECG.js} +8 -7
  181. package/bundle/{openrouter-credits-LXC7P4G6.js → openrouter-credits-NTVZDRYM.js} +5 -4
  182. package/bundle/{openrouter-credits-LXC7P4G6.js.map → openrouter-credits-NTVZDRYM.js.map} +1 -1
  183. package/bundle/{orc-KC4USP55.js → orc-EIGVTHAV.js} +4 -4
  184. package/bundle/{orc-tools-CHRSXSAS.js → orc-tools-A3G7WCSJ.js} +5 -4
  185. package/bundle/{paths-EDK6KWHG.js → paths-3ZVW3NFL.js} +6 -2
  186. package/bundle/{paths-RZF6WDMG.js → paths-X4LRYUI6.js} +3 -2
  187. package/bundle/{peer-auth-SRONOLNG.js → peer-auth-QC4EF2PM.js} +9 -8
  188. package/bundle/{peer-client-VOF77T6C.js → peer-client-RGEU5HOK.js} +9 -8
  189. package/bundle/{peer-client-VOF77T6C.js.map → peer-client-RGEU5HOK.js.map} +1 -1
  190. package/bundle/{peer-config-FRWLEYQ5.js → peer-config-TN55LFDC.js} +6 -5
  191. package/bundle/{peer-jwt-XY3XRIA2.js → peer-jwt-NCCPXJRX.js} +6 -5
  192. package/bundle/{peer-transport-UBBXTDRP.js → peer-transport-I6JPLFZ2.js} +8 -7
  193. package/bundle/{phase-transport-4NQHZX75.js → phase-transport-2BRWACDF.js} +18 -16
  194. package/bundle/public/css/dashboard.css +542 -0
  195. package/bundle/public/index.html +180 -0
  196. package/bundle/public/js/app.js +437 -0
  197. package/bundle/public/memory-universe.js +384 -0
  198. package/bundle/{reconcile-2EUXJ6W5.js → reconcile-CTFCLQRN.js} +5 -4
  199. package/bundle/{reconciler-FFQGV4DO.js → reconciler-FHESO6OC.js} +14 -11
  200. package/bundle/{reconciler-FFQGV4DO.js.map → reconciler-FHESO6OC.js.map} +1 -1
  201. package/bundle/{restore-NFDE2RG6.js → restore-IFHPI7I7.js} +13 -9
  202. package/bundle/{restore-NFDE2RG6.js.map → restore-IFHPI7I7.js.map} +3 -3
  203. package/bundle/{rollback-MVZ53XS4.js → rollback-ANRI3T5Z.js} +5 -5
  204. package/bundle/{chunk-SKY6656M.js → sandbox-runtime-QROWHDCS.js} +11 -28
  205. package/bundle/{chunk-SKY6656M.js.map → sandbox-runtime-QROWHDCS.js.map} +1 -1
  206. package/bundle/{self-healer-utils-KD6LV63S.js → self-healer-utils-IFAYOQO2.js} +5 -4
  207. package/bundle/{self-healer-utils-KD6LV63S.js.map → self-healer-utils-IFAYOQO2.js.map} +1 -1
  208. package/bundle/{sha-tracker-2DB4R2TW.js → sha-tracker-ZWBP6CIJ.js} +5 -4
  209. package/bundle/{skill-session-BPDVA6ZG.js → skill-session-AXBDQSLQ.js} +5 -4
  210. package/bundle/{skill-session-BPDVA6ZG.js.map → skill-session-AXBDQSLQ.js.map} +1 -1
  211. package/bundle/{skill-stats-TPD2NROA.js → skill-stats-JORH5DGM.js} +6 -5
  212. package/bundle/{skill-watcher-D7QYYYON.js → skill-watcher-E4MGLKLS.js} +6 -5
  213. package/bundle/{sleep-GH6DLBJJ.js → sleep-SRCSXY6T.js} +10 -9
  214. package/bundle/{soul-bundle-GXLMDBCC.js → soul-bundle-VWAVHCZ6.js} +10 -9
  215. package/bundle/{spin-4DBYHS3E.js → spin-IMW2MZOH.js} +13 -10
  216. package/bundle/{spin-notifications-IKYJPER5.js → spin-notifications-SE2HVZI7.js} +7 -5
  217. package/bundle/{spin-notifications-IKYJPER5.js.map → spin-notifications-SE2HVZI7.js.map} +1 -1
  218. package/bundle/{spin-types-PLJH3SIK.js → spin-types-BLPYAETA.js} +5 -4
  219. package/bundle/{src-SUFZ27S5.js → src-6BTCMOD3.js} +4 -4
  220. package/bundle/{sse-parser-anthropic-U7ILHOY5.js → sse-parser-anthropic-A6R4Z2TB.js} +5 -4
  221. package/bundle/{sse-parser-anthropic-U7ILHOY5.js.map → sse-parser-anthropic-A6R4Z2TB.js.map} +1 -1
  222. package/bundle/{sse-parser-responses-OI73R3AH.js → sse-parser-responses-HSZY3QGJ.js} +5 -4
  223. package/bundle/{sse-parser-responses-OI73R3AH.js.map → sse-parser-responses-HSZY3QGJ.js.map} +1 -1
  224. package/bundle/{ssrf-guard-6GP4QYVA.js → ssrf-guard-O6SHIK6Q.js} +5 -4
  225. package/bundle/{ssrf-guard-6GP4QYVA.js.map → ssrf-guard-O6SHIK6Q.js.map} +1 -1
  226. package/bundle/{start-JT2BPMSW.js → start-7QZIWO3S.js} +5 -5
  227. package/bundle/start-7QZIWO3S.js.map +7 -0
  228. package/bundle/{stt-KD3AABKG.js → stt-LGVPXMVR.js} +6 -5
  229. package/bundle/{subagent-runtime-LVECAUPV.js → subagent-runtime-3UJB4HUB.js} +6 -5
  230. package/bundle/system-status-ATGKRRQI.js +349 -0
  231. package/bundle/system-status-ATGKRRQI.js.map +7 -0
  232. package/bundle/{task-store-2XRDM3AW.js → task-store-W5BFIAIH.js} +6 -5
  233. package/bundle/{telegram-adapter-UJ3RYYV6.js → telegram-adapter-7G773NII.js} +35 -35
  234. package/bundle/{tool-registry-YU6WBXPA.js → tool-registry-J6TE3I2T.js} +25 -23
  235. package/bundle/{tool-sandbox-RNNPDR5M.js → tool-sandbox-4UC6GAKA.js} +6 -5
  236. package/bundle/{transport-config-OK3MZPJK.js → transport-config-KBF5W2DP.js} +9 -8
  237. package/bundle/{update-ENNPRW7Y.js → update-424ZZQQ6.js} +6 -6
  238. package/bundle/{update-check-SJB6GV3A.js → update-check-7UWKBJOP.js} +3 -2
  239. package/bundle/{update-check-SJB6GV3A.js.map → update-check-7UWKBJOP.js.map} +1 -1
  240. package/bundle/{usage-tracker-HRSGC7QC.js → usage-tracker-NXD364VX.js} +2 -2
  241. package/bundle/{user-registry-6PUJJ5J2.js → user-registry-35BW4XKM.js} +6 -5
  242. package/bundle/{wrapper-WLHLG4MI.js → wrapper-W66YICNZ.js} +3 -3
  243. package/bundle/{ws-peer-client-WHW3RJTD.js → ws-peer-client-AIXCXF7V.js} +15 -14
  244. package/bundle/{ws-peer-client-WHW3RJTD.js.map → ws-peer-client-AIXCXF7V.js.map} +2 -2
  245. package/package.json +4 -8
  246. package/scripts/emergency-deploy.sh +11 -8
  247. package/scripts/emergency-update.sh +156 -23
  248. package/templates/config/.env +1 -1
  249. package/templates/config/models.json +13 -0
  250. package/bundle/chunk-37EX63K4.js.map +0 -7
  251. package/bundle/chunk-3QW2K53E.js.map +0 -7
  252. package/bundle/chunk-5V4VHKEA.js.map +0 -7
  253. package/bundle/chunk-72T2Q7IG.js.map +0 -7
  254. package/bundle/chunk-7RAGSHSH.js.map +0 -7
  255. package/bundle/chunk-7WHXTCVD.js.map +0 -7
  256. package/bundle/chunk-BU7LTI2W.js.map +0 -7
  257. package/bundle/chunk-C3EYYJN3.js.map +0 -7
  258. package/bundle/chunk-CAOIIVFP.js +0 -110
  259. package/bundle/chunk-CAOIIVFP.js.map +0 -7
  260. package/bundle/chunk-EDZGF6BC.js.map +0 -7
  261. package/bundle/chunk-GCFIK6OB.js.map +0 -7
  262. package/bundle/chunk-H2K23MOF.js.map +0 -7
  263. package/bundle/chunk-HAZHNBBY.js +0 -156
  264. package/bundle/chunk-HAZHNBBY.js.map +0 -7
  265. package/bundle/chunk-IXKQ4JMX.js.map +0 -7
  266. package/bundle/chunk-J5NOL4DB.js.map +0 -7
  267. package/bundle/chunk-JAJ3DUQ2.js +0 -30
  268. package/bundle/chunk-JAJ3DUQ2.js.map +0 -7
  269. package/bundle/chunk-KMFR5AVY.js +0 -45
  270. package/bundle/chunk-KMFR5AVY.js.map +0 -7
  271. package/bundle/chunk-M6Q3IQ4H.js.map +0 -7
  272. package/bundle/chunk-MQJG7OJX.js.map +0 -7
  273. package/bundle/chunk-NP72ZB7P.js.map +0 -7
  274. package/bundle/chunk-OY2HAK33.js.map +0 -7
  275. package/bundle/chunk-P5O6QZDC.js.map +0 -7
  276. package/bundle/chunk-RJX45XIC.js.map +0 -7
  277. package/bundle/chunk-S6HEHCCG.js.map +0 -7
  278. package/bundle/chunk-SESM4GBM.js.map +0 -7
  279. package/bundle/chunk-SXNY6HC4.js.map +0 -7
  280. package/bundle/chunk-VJATH7AN.js.map +0 -7
  281. package/bundle/chunk-ZY6DH2S4.js.map +0 -7
  282. package/bundle/deps-PHSLIA77.js.map +0 -7
  283. package/bundle/direct-api-transport-OAKYQBJR.js.map +0 -7
  284. package/bundle/dist-7HEHHQI2.js.map +0 -7
  285. package/bundle/heartbeat-tier3-3ZO3EVXP.js.map +0 -7
  286. package/bundle/install-ZAHTZ5M5.js.map +0 -7
  287. package/bundle/migrate-layout-RJJQLVGR.js.map +0 -7
  288. package/bundle/phase-config-V4XETN5F.js +0 -18
  289. package/bundle/sandbox-runtime-WHACQLLN.js +0 -22
  290. package/bundle/start-JT2BPMSW.js.map +0 -7
  291. package/bundle/system-status-XXJWTVJN.js +0 -243
  292. package/bundle/system-status-XXJWTVJN.js.map +0 -7
  293. package/bundle/user-registry-6PUJJ5J2.js.map +0 -7
  294. package/bundle/wrapper-WLHLG4MI.js.map +0 -7
  295. /package/bundle/{agent-api-rate-limit-4GEZ4YN5.js.map → agent-api-rate-limit-WCFXJMGY.js.map} +0 -0
  296. /package/bundle/{agent-registry-563P4EUJ.js.map → agent-registry-GU7ABOK5.js.map} +0 -0
  297. /package/bundle/{bridge-lock-transport-LXCF2IVN.js.map → bridge-lock-transport-4ZH7QTJP.js.map} +0 -0
  298. /package/bundle/{browser-2VZOGOGX.js.map → browser-EJNS35NT.js.map} +0 -0
  299. /package/bundle/{capability-WXEA2WFK.js.map → capability-JFWX3IQF.js.map} +0 -0
  300. /package/bundle/{chunk-CB6S3ZRF.js.map → chunk-2FAZIA37.js.map} +0 -0
  301. /package/bundle/{chunk-2FZJDMAF.js.map → chunk-3CACHBDI.js.map} +0 -0
  302. /package/bundle/{chunk-O4GKI3Q3.js.map → chunk-4S554KLW.js.map} +0 -0
  303. /package/bundle/{chunk-SSCGWDIC.js.map → chunk-65VCEC32.js.map} +0 -0
  304. /package/bundle/{chunk-V2QIAXWZ.js.map → chunk-7BSQ5UQO.js.map} +0 -0
  305. /package/bundle/{chunk-E7MV7WFT.js.map → chunk-7Z3HBPRY.js.map} +0 -0
  306. /package/bundle/{chunk-TY26WMQY.js.map → chunk-AFREM7FX.js.map} +0 -0
  307. /package/bundle/{chunk-N5VROZ7A.js.map → chunk-B6ZN6COK.js.map} +0 -0
  308. /package/bundle/{chunk-YEOZN5IE.js.map → chunk-DYBW4XXL.js.map} +0 -0
  309. /package/bundle/{chunk-56D3Y44D.js.map → chunk-EFJVUJBE.js.map} +0 -0
  310. /package/bundle/{chunk-FIAVVKGN.js.map → chunk-EUZDKV3C.js.map} +0 -0
  311. /package/bundle/{chunk-2LKQV2ND.js.map → chunk-FRKW6LWB.js.map} +0 -0
  312. /package/bundle/{chunk-DNDYD5SL.js.map → chunk-GP4XUKI5.js.map} +0 -0
  313. /package/bundle/{chunk-W726UGI6.js.map → chunk-GRVWZO4C.js.map} +0 -0
  314. /package/bundle/{chunk-OOKNHOCB.js.map → chunk-GWILHZPT.js.map} +0 -0
  315. /package/bundle/{chunk-BNBC4T45.js.map → chunk-HT2BPTZY.js.map} +0 -0
  316. /package/bundle/{chunk-FVUL44T4.js.map → chunk-IJT4KWXT.js.map} +0 -0
  317. /package/bundle/{chunk-IK4R3RBZ.js.map → chunk-JNIHEDKF.js.map} +0 -0
  318. /package/bundle/{chunk-4PIVWXUJ.js.map → chunk-LUNA6PM5.js.map} +0 -0
  319. /package/bundle/{chunk-MV5KOWOR.js.map → chunk-NDCRWEEJ.js.map} +0 -0
  320. /package/bundle/{chunk-ZOCEBV62.js.map → chunk-OKAQICWY.js.map} +0 -0
  321. /package/bundle/{chunk-TCI6FZTP.js.map → chunk-OLAURO5G.js.map} +0 -0
  322. /package/bundle/{chunk-YME7NRGP.js.map → chunk-OXTSWQCX.js.map} +0 -0
  323. /package/bundle/{chunk-HDOFJVFS.js.map → chunk-PEDX56EL.js.map} +0 -0
  324. /package/bundle/{chunk-ASYX43OU.js.map → chunk-Q32H6VPU.js.map} +0 -0
  325. /package/bundle/{chunk-IQKADER4.js.map → chunk-RWRRGE4U.js.map} +0 -0
  326. /package/bundle/{chunk-ULO2PX3T.js.map → chunk-TEFZ4JA4.js.map} +0 -0
  327. /package/bundle/{chunk-2RGR3LSV.js.map → chunk-TMUYFERL.js.map} +0 -0
  328. /package/bundle/{chunk-KBPVJGD7.js.map → chunk-URQPDCK5.js.map} +0 -0
  329. /package/bundle/{chunk-FJF42RZY.js.map → chunk-VUIX5AGB.js.map} +0 -0
  330. /package/bundle/{chunk-4HNCOQSK.js.map → chunk-WYHGNI56.js.map} +0 -0
  331. /package/bundle/{chunk-24V4A6RP.js.map → chunk-XX6BGTPO.js.map} +0 -0
  332. /package/bundle/{chunk-T7TAWGBX.js.map → chunk-Y76VUJSF.js.map} +0 -0
  333. /package/bundle/{chunk-TVSPVZTX.js.map → chunk-YDY6QVWJ.js.map} +0 -0
  334. /package/bundle/{chunk-V6CV3QPH.js.map → chunk-YRSMGJFP.js.map} +0 -0
  335. /package/bundle/{chunk-WP7FZHMI.js.map → chunk-YSKCQH6E.js.map} +0 -0
  336. /package/bundle/{chunk-NGZVJ52F.js.map → chunk-ZKJOFASV.js.map} +0 -0
  337. /package/bundle/{chunk-43DKPXTP.js.map → chunk-ZV4IWKDJ.js.map} +0 -0
  338. /package/bundle/{commands-XXFU2ZF7.js.map → commands-EWA4HNCM.js.map} +0 -0
  339. /package/bundle/{config-EWDZ234X.js.map → config-M3P5IOAI.js.map} +0 -0
  340. /package/bundle/{config-show-6J33O4TE.js.map → config-show-3DHPP26D.js.map} +0 -0
  341. /package/bundle/{daemon-LTDAXNA2.js.map → daemon-TB23FFWY.js.map} +0 -0
  342. /package/bundle/{delegation-tools-YDTWQMZD.js.map → delegation-tools-P2SCNL23.js.map} +0 -0
  343. /package/bundle/{deploy-lib-import-RGZJ3CGC.js.map → deploy-YYUCGGP3.js.map} +0 -0
  344. /package/bundle/{doctor-probes-3SLIUGKS.js.map → deploy-lib-import-T3UP4G6G.js.map} +0 -0
  345. /package/bundle/{discord-adapter-WUNYPTDE.js.map → discord-adapter-4TTETYDI.js.map} +0 -0
  346. /package/bundle/{env-schema-MSDP2YBO.js.map → doctor-probes-VDWFJKUB.js.map} +0 -0
  347. /package/bundle/{gossip-CS3G3447.js.map → env-schema-4JXQUOH4.js.map} +0 -0
  348. /package/bundle/{guardrails-24XK2COI.js.map → gossip-3C3BSNPN.js.map} +0 -0
  349. /package/bundle/{heartbeat-system-G4IFQXT6.js.map → guardrails-DL7ZSWVN.js.map} +0 -0
  350. /package/bundle/{hook-system-X6INNJGV.js.map → heartbeat-system-TDDIOVTC.js.map} +0 -0
  351. /package/bundle/{hotskills-6FQYTJIO.js.map → hook-system-M3POLUIB.js.map} +0 -0
  352. /package/bundle/{kanban-board-J6RO3ZU7.js.map → hotskills-FWX4QI7V.js.map} +0 -0
  353. /package/bundle/{kanban-channel-5EIXBFSA.js.map → kanban-board-M326B2XJ.js.map} +0 -0
  354. /package/bundle/{lazy-require-V6EFUATC.js.map → kanban-channel-IJ52OMNA.js.map} +0 -0
  355. /package/bundle/{logger-Y3VILPRH.js.map → lazy-require-KCRVT4SI.js.map} +0 -0
  356. /package/bundle/{main-chat-YLZDNQPO.js.map → logger-OWCSNYCA.js.map} +0 -0
  357. /package/bundle/{logs-YS3GDURO.js.map → logs-FXS4SCEM.js.map} +0 -0
  358. /package/bundle/{master-user-Z4M7KCJE.js.map → main-chat-ZNUZCTNS.js.map} +0 -0
  359. /package/bundle/{message-pipeline-MHEBDJLH.js.map → master-user-HSKM4ZFN.js.map} +0 -0
  360. /package/bundle/{nerve-VZNMFDGY.js.map → message-pipeline-KSONH4MT.js.map} +0 -0
  361. /package/bundle/{notification-VV2OR6NW.js.map → nerve-IGSXBKZZ.js.map} +0 -0
  362. /package/bundle/{orc-tools-CHRSXSAS.js.map → notification-BFSIEECG.js.map} +0 -0
  363. /package/bundle/{orc-KC4USP55.js.map → orc-EIGVTHAV.js.map} +0 -0
  364. /package/bundle/{paths-EDK6KWHG.js.map → orc-tools-A3G7WCSJ.js.map} +0 -0
  365. /package/bundle/{paths-RZF6WDMG.js.map → paths-3ZVW3NFL.js.map} +0 -0
  366. /package/bundle/{peer-auth-SRONOLNG.js.map → paths-X4LRYUI6.js.map} +0 -0
  367. /package/bundle/{peer-config-FRWLEYQ5.js.map → peer-auth-QC4EF2PM.js.map} +0 -0
  368. /package/bundle/{peer-jwt-XY3XRIA2.js.map → peer-config-TN55LFDC.js.map} +0 -0
  369. /package/bundle/{peer-transport-UBBXTDRP.js.map → peer-jwt-NCCPXJRX.js.map} +0 -0
  370. /package/bundle/{phase-config-V4XETN5F.js.map → peer-transport-I6JPLFZ2.js.map} +0 -0
  371. /package/bundle/{phase-transport-4NQHZX75.js.map → phase-transport-2BRWACDF.js.map} +0 -0
  372. /package/bundle/{reconcile-2EUXJ6W5.js.map → reconcile-CTFCLQRN.js.map} +0 -0
  373. /package/bundle/{registry-client-VN2MM2HI.js.map → rollback-ANRI3T5Z.js.map} +0 -0
  374. /package/bundle/{rollback-MVZ53XS4.js.map → sha-tracker-ZWBP6CIJ.js.map} +0 -0
  375. /package/bundle/{sandbox-runtime-WHACQLLN.js.map → skill-stats-JORH5DGM.js.map} +0 -0
  376. /package/bundle/{sha-tracker-2DB4R2TW.js.map → skill-watcher-E4MGLKLS.js.map} +0 -0
  377. /package/bundle/{skill-stats-TPD2NROA.js.map → sleep-SRCSXY6T.js.map} +0 -0
  378. /package/bundle/{skill-watcher-D7QYYYON.js.map → soul-bundle-VWAVHCZ6.js.map} +0 -0
  379. /package/bundle/{sleep-GH6DLBJJ.js.map → spin-IMW2MZOH.js.map} +0 -0
  380. /package/bundle/{soul-bundle-GXLMDBCC.js.map → spin-types-BLPYAETA.js.map} +0 -0
  381. /package/bundle/{spin-4DBYHS3E.js.map → src-6BTCMOD3.js.map} +0 -0
  382. /package/bundle/{spin-types-PLJH3SIK.js.map → stt-LGVPXMVR.js.map} +0 -0
  383. /package/bundle/{src-SUFZ27S5.js.map → subagent-runtime-3UJB4HUB.js.map} +0 -0
  384. /package/bundle/{stt-KD3AABKG.js.map → task-store-W5BFIAIH.js.map} +0 -0
  385. /package/bundle/{telegram-adapter-UJ3RYYV6.js.map → telegram-adapter-7G773NII.js.map} +0 -0
  386. /package/bundle/{subagent-runtime-LVECAUPV.js.map → tool-registry-J6TE3I2T.js.map} +0 -0
  387. /package/bundle/{task-store-2XRDM3AW.js.map → tool-sandbox-4UC6GAKA.js.map} +0 -0
  388. /package/bundle/{tool-registry-YU6WBXPA.js.map → transport-config-KBF5W2DP.js.map} +0 -0
  389. /package/bundle/{tool-sandbox-RNNPDR5M.js.map → update-424ZZQQ6.js.map} +0 -0
  390. /package/bundle/{transport-config-OK3MZPJK.js.map → usage-tracker-NXD364VX.js.map} +0 -0
  391. /package/bundle/{update-ENNPRW7Y.js.map → user-registry-35BW4XKM.js.map} +0 -0
  392. /package/bundle/{usage-tracker-HRSGC7QC.js.map → wrapper-W66YICNZ.js.map} +0 -0
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/components/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 } from \"./logger.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 } from \"./spin-types.js\";\nimport { typeAgent, sessionType } from \"./spin-types.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\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 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 {} 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 {} }\n }\n if (this.orcSession) { try { this.orcSession.destroy(); } catch {} this.orcSession = null; }\n this.sessions.clear();\n this.nextIndex = 0;\n logInfo(TAG, \"All sessions destroyed (shutdown)\");\n }\n\n // \u2500\u2500 inject() \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 async inject(userId: string, prompt: string, opts?: { deliver?: boolean }): Promise<string | 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 const numericChatId = typeof chatId === \"number\" ? chatId : parseInt(String(chatId), 10);\n\n try {\n const session = await this.resolveSession(userId, platform, numericChatId);\n if (!session.transport) { logWarn(TAG, `inject: no transport for ${userId}`); return null; }\n const response = await session.transport.sendPrompt(`${userId}:inject`, prompt, undefined, userId);\n session.messageCount++;\n pushLog(session, `inject (deliver=${opts?.deliver ?? true})`);\n logInfo(TAG, `inject delivered to ${userId} (${response.length} chars, deliver=${opts?.deliver ?? true})`);\n return (opts?.deliver ?? true) ? response : null;\n } catch (err) {\n logWarn(TAG, `inject failed for ${userId}: ${err instanceof Error ? err.message : String(err)}`);\n return null;\n }\n }\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 async sendUserToOrc(message: string): Promise<string | null> {\n const orc = this.getOrcSession();\n if (!orc) return null;\n const response = await orc.sendPrompt(\"orc:user\", `[USER] ${message}`);\n return response;\n }\n\n private async getOrCreateOrc(): Promise<AgentSession> {\n if (this.orcSession?.isReady) return this.orcSession;\n logInfo(TAG, \"Spawning persistent Orc session\");\n this.orcSession = await this.runtime!.session(\"browsie\");\n return this.orcSession;\n }\n\n // \u2500\u2500 Dispatch \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 /** #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 dispatch(request: SpinRequest): { cardId: number; sessionId?: string } {\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 if (!this.canDispatch(request.type, cardId)) {\n logInfo(TAG, `${request.type} card:${cardId} queued (concurrency gate)`);\n return { cardId };\n }\n\n this.markRunning(request.type, cardId);\n kanbanRunning(cardId);\n\n const masterUserId = getMasterUserId();\n const session = this.getOrCreateVisibleSession(masterUserId, request.type);\n if (session) { session.name = request.title?.slice(0, 20); pushLog(session, `dispatch card:${cardId}`); }\n\n const timeout = request.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n this.execute(request, cardId, timeout)\n .then(result => {\n const { drainArtifacts } = require(\"./transport/artifact-tools.js\") as typeof import(\"./transport/artifact-tools.js\");\n const artifacts = drainArtifacts(cardId);\n kanbanComplete(cardId, null, result.slice(0, 500));\n if (request.callbackPeer) {\n const card = kanbanGetCard(cardId);\n fireCallback(request.callbackPeer, cardId, \"done\", result.slice(0, 500), undefined, artifacts, card?.tokens_used ?? 0);\n }\n })\n .catch(err => {\n const msg = (err instanceof Error ? err.message : String(err)).slice(0, 1000);\n logWarn(TAG, `${request.type} card:${cardId} failed: ${msg}`);\n kanbanRetryOrFail(cardId, msg);\n if (request.callbackPeer) fireCallback(request.callbackPeer, cardId, \"failed\", undefined, msg);\n })\n .finally(() => {\n this.markDone(request.type, cardId);\n if (session) { session.status = \"ended\"; session.active = false; pushLog(session, \"completed\"); }\n this.drainQueued();\n });\n\n return { cardId, sessionId: session?.id };\n }\n\n async dispatchAwait(request: SpinRequest): Promise<{ cardId: number; result: string }> {\n // #987: enforce concurrency + cooldown gates (same as dispatch)\n if (!this.canDispatch(request.type, 0)) {\n throw new Error(`${request.type} session busy or in cooldown \u2014 skipping`);\n }\n\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 chatId: request.chatId,\n });\n\n this.markRunning(request.type, cardId);\n kanbanRunning(cardId);\n\n const masterUserId = getMasterUserId();\n const session = this.getOrCreateVisibleSession(masterUserId, request.type);\n if (session) { session.name = request.title?.slice(0, 20); pushLog(session, `dispatchAwait card:${cardId}`); }\n\n const timeout = request.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n try {\n const result = await this.execute(request, cardId, timeout);\n return { cardId, result };\n } finally {\n this.markDone(request.type, cardId);\n // O-type: session stays alive until Orc idle timeout (visible in /session)\n if (session && request.type !== \"O\") { session.status = \"ended\"; session.active = false; pushLog(session, \"completed\"); }\n this.drainQueued();\n }\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 }\n\n private checkStaleWorkers(): void {\n const STALE_MS = parseInt(process.env[\"WORKER_STALE_MS\"] || \"300000\", 10);\n const now = Date.now();\n for (const [, cardIds] of this.running) {\n for (const cardId of cardIds) {\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 }\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 {}\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 private async execute(request: SpinRequest, cardId: number, timeoutMs: number): Promise<string> {\n if (!this.runtime) throw new Error(\"Spin: runtime not set\");\n if (request.type === \"O\") return this.executeOrc(request, cardId, timeoutMs);\n\n const agentName = request.agent ?? typeAgent(request.type);\n logInfo(TAG, `\u25B6 ${request.type} card:${cardId} agent=${agentName}`);\n\n const staleMs = parseInt(process.env[\"WORKER_STALE_MS\"] ?? \"300000\", 10);\n let lastActivityAt = Date.now();\n\n const timer = setTimeout(() => {\n logWarn(TAG, `\u23F1\uFE0F ${request.type} card:${cardId} timed out`);\n this.runtime?.interruptSpawn(`spin-${cardId}`);\n }, timeoutMs);\n\n const staleCheck = setInterval(() => {\n if (Date.now() - lastActivityAt > staleMs) {\n clearInterval(staleCheck);\n logWarn(TAG, `\u23F1\uFE0F ${request.type} card:${cardId} stale (no activity ${staleMs / 1000}s)`);\n this.runtime?.interruptSpawn(`spin-${cardId}`);\n }\n }, 60_000);\n\n try {\n const { buildSoulBundle } = await import(\"./soul-bundle.js\");\n const bundle = buildSoulBundle(request.type);\n let fullPrompt = bundle ? `${bundle}\\n\\n---\\n\\n${request.goal}` : request.goal;\n\n // #891: auto-inject channel messages for W/O sessions\n if (request.type === \"W\" || request.type === \"T\") {\n const { channelUnread } = await import(\"./tasks/kanban-channel.js\");\n const workerName = `Worker-${String(cardId).padStart(2, \"0\")}`;\n const parentCard = request.parentCardId ?? cardId;\n const msgs = channelUnread(parentCard, workerName);\n if (msgs.length > 0) {\n const lines = msgs.map(m => `[${m.from_agent}\u2192${m.to_agent}]${m.directive ? \" \u26A1\" : \"\"} ${m.message}`);\n fullPrompt = `[CHANNEL \u2014 ${msgs.length} message(s) for ${workerName}]\\n${lines.join(\"\\n\")}\\n[/CHANNEL]\\n\\n${fullPrompt}`;\n }\n }\n\n const result = (await this.runtime.complete(agentName, fullPrompt, { timeoutMs, session: \"fresh\" })) || \"(no output)\";\n if (this.memory) {\n const sid = `${request.type}_card${cardId}`;\n this.memory.recordMessage({ role: \"user\", content: request.goal, timestamp: Date.now(), userId: \"system\", sessionId: sid });\n this.memory.recordMessage({ role: \"assistant\", content: result, timestamp: Date.now(), userId: \"system\", sessionId: sid });\n }\n return result;\n } finally { clearTimeout(timer); clearInterval(staleCheck); }\n }\n\n private async executeOrc(request: SpinRequest, cardId: number, timeoutMs: number): Promise<string> {\n const { updateBridgeLockField } = await import(\"./transport/bridge-lock-transport.js\");\n const { setActiveOrcCard } = await import(\"./transport/orc-tools.js\");\n updateBridgeLockField(\"orc_active\", cardId);\n setActiveOrcCard(cardId);\n const orc = await this.getOrCreateOrc();\n logInfo(TAG, `\u25B6 O card:${cardId} (persistent Orc)`);\n\n // #993: Attach Orc transport to visible session \u2014 user can sneak in\n let orcSessionKey = \"orc:project\"; // fallback\n for (const [, s] of this.sessions) {\n if (s.id.includes(\"_O_\") && s.status !== \"ended\") {\n s.transport = orc.transport as any;\n s.status = \"ready\";\n orcSessionKey = s.id; // use proper ManagedSession ID as ACP session key\n break;\n }\n }\n const timer = setTimeout(() => { logWarn(TAG, `\u23F1\uFE0F O card:${cardId} timed out`); }, timeoutMs);\n try {\n const { buildSoulBundle } = await import(\"./soul-bundle.js\");\n const bundle = buildSoulBundle(\"O\");\n\n // #1005: CONTEXT wrapper (same pattern as Main)\n const { localDateTime } = await import(\"../utils/local-time.js\");\n const context = `[CONTEXT \u2014 do not respond to this section]\\n[PROJECT] card #${cardId}\\n[CURRENT TIME] ${localDateTime()}\\n[/CONTEXT]\\n\\n`;\n\n let fullPrompt = context + (bundle ? `${bundle}\\n\\n---\\n\\n${request.goal}` : request.goal);\n const { drainOrcNotifications } = await import(\"./spin-notifications.js\");\n const notifications = drainOrcNotifications(cardId);\n if (notifications.length) fullPrompt = notifications.join(\"\\n\") + \"\\n\\n\" + fullPrompt;\n\n // #891: Orc sees ALL channel messages on its card\n const { channelUnread } = await import(\"./tasks/kanban-channel.js\");\n const orcMsgs = channelUnread(cardId, \"Orc\");\n if (orcMsgs.length > 0) {\n const lines = orcMsgs.map(m => `[${m.from_agent}\u2192${m.to_agent}]${m.directive ? \" \u26A1\" : \"\"} ${m.message}`);\n fullPrompt = `[CHANNEL \u2014 ${orcMsgs.length} message(s)]\\n${lines.join(\"\\n\")}\\n[/CHANNEL]\\n\\n${fullPrompt}`;\n }\n\n const result = (await orc.sendPrompt(orcSessionKey, fullPrompt)) || \"(no output)\";\n if (this.memory) {\n this.memory.recordMessage({ role: \"user\", content: request.goal, timestamp: Date.now(), userId: \"system\", sessionId: orcSessionKey });\n this.memory.recordMessage({ role: \"assistant\", content: result, timestamp: Date.now(), userId: \"system\", sessionId: orcSessionKey });\n }\n return result;\n } finally { clearTimeout(timer); updateBridgeLockField(\"orc_active\", null); setActiveOrcCard(null); }\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"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/paths.ts"],
4
- "sourcesContent": ["import { resolve, join, relative } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { mkdirSync, readFileSync, realpathSync, existsSync } from \"node:fs\";\n\n/** Base directory for all Abtars runtime data. Override with ABTARS_HOME env var. */\nexport function abtarsHome(): string {\n return process.env.ABTARS_HOME ?? resolve(homedir(), \".abtars\");\n}\n\n/** Base directory for abmind runtime data. Override with ABMIND_HOME env var. */\nexport function abmindHome(): string {\n return process.env.ABMIND_HOME ?? resolve(homedir(), \".abmind\");\n}\n\nlet _abtarsRootCache: string | null = null;\n\n/**\n * Root of the active release (code, prompts, scripts, templates).\n * Resolves ~/.abtars-releases/current symlink. Falls back to legacy layout.\n * Override with ABTARS_ROOT env var (always re-read, not cached).\n */\nexport function abtarsRoot(): string {\n if (process.env.ABTARS_ROOT) return process.env.ABTARS_ROOT;\n if (_abtarsRootCache) return _abtarsRootCache;\n const releasesDir = resolve(homedir(), \".abtars-releases\", \"current\");\n if (existsSync(releasesDir)) { _abtarsRootCache = realpathSync(releasesDir); return _abtarsRootCache; }\n // Legacy fallback: app/ inside abtarsHome (pre-#1089)\n const legacyApp = join(abtarsHome(), \"app\");\n if (existsSync(legacyApp)) { _abtarsRootCache = legacyApp; return _abtarsRootCache; }\n // Ultimate fallback: relative to this file (npm package layout)\n _abtarsRootCache = resolve(__dirname, \"..\");\n return _abtarsRootCache;\n}\n\n/** Single source of truth for deployed version. Reads ~/.abtars/manifest.json. */\nexport function getDeployedVersion(): { version: string; commit: string } {\n try {\n const manifest = JSON.parse(readFileSync(join(abtarsHome(), \"manifest.json\"), \"utf-8\"));\n return { version: manifest.version ?? \"?\", commit: manifest.commit ?? \"\" };\n } catch { return { version: \"?\", commit: \"\" }; }\n}\n\n// \u2500\u2500 Lazy directory creation \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nlet lazyRootsCache: string[] | null = null;\n\n/** Set allowed lazy roots (called once at boot from manifest). */\nexport function setLazyRoots(roots: string[]): void { lazyRootsCache = roots; }\n\n/**\n * Create a directory under abtarsHome if it doesn't exist.\n * If lazyRoots are configured, warns on undeclared paths.\n */\nexport function ensureDir(absPath: string): void {\n const home = abtarsHome();\n const rel = relative(home, absPath);\n if (lazyRootsCache && !rel.startsWith(\"..\") && rel !== \"\") {\n const allowed = lazyRootsCache.some(root => rel === root || rel.startsWith(root + \"/\"));\n if (!allowed) {\n // Check if it's an eager dir (those are always allowed)\n const isEager = [\"config\", \"logs\", \"scripts\", \"bin\", \"releases\"].some(d => rel === d || rel.startsWith(d + \"/\"));\n if (!isEager) {\n // eslint-disable-next-line no-console\n console.warn(`[manifest] ensureDir: \"${rel}\" is not under a declared lazyRoot or eager directory`);\n }\n }\n }\n mkdirSync(absPath, { recursive: true });\n}\n\n\n"],
5
- "mappings": ";;;;;;;AAAA,SAAS,SAAS,MAAM,gBAAgB;AACxC,SAAS,eAAe;AACxB,SAAS,WAAW,cAAc,cAAc,kBAAkB;AAG3D,SAAS,aAAqB;AACnC,SAAO,QAAQ,IAAI,eAAe,QAAQ,QAAQ,GAAG,SAAS;AAChE;AAGO,SAAS,aAAqB;AACnC,SAAO,QAAQ,IAAI,eAAe,QAAQ,QAAQ,GAAG,SAAS;AAChE;AASO,SAAS,aAAqB;AACnC,MAAI,QAAQ,IAAI,YAAa,QAAO,QAAQ,IAAI;AAChD,MAAI,iBAAkB,QAAO;AAC7B,QAAM,cAAc,QAAQ,QAAQ,GAAG,oBAAoB,SAAS;AACpE,MAAI,WAAW,WAAW,GAAG;AAAE,uBAAmB,aAAa,WAAW;AAAG,WAAO;AAAA,EAAkB;AAEtG,QAAM,YAAY,KAAK,WAAW,GAAG,KAAK;AAC1C,MAAI,WAAW,SAAS,GAAG;AAAE,uBAAmB;AAAW,WAAO;AAAA,EAAkB;AAEpF,qBAAmB,QAAQ,iBAAW,IAAI;AAC1C,SAAO;AACT;AAGO,SAAS,qBAA0D;AACxE,MAAI;AACF,UAAM,WAAW,KAAK,MAAM,aAAa,KAAK,WAAW,GAAG,eAAe,GAAG,OAAO,CAAC;AACtF,WAAO,EAAE,SAAS,SAAS,WAAW,KAAK,QAAQ,SAAS,UAAU,GAAG;AAAA,EAC3E,QAAQ;AAAE,WAAO,EAAE,SAAS,KAAK,QAAQ,GAAG;AAAA,EAAG;AACjD;AAOO,SAAS,aAAa,OAAuB;AAAE,mBAAiB;AAAO;AAMvE,SAAS,UAAU,SAAuB;AAC/C,QAAM,OAAO,WAAW;AACxB,QAAM,MAAM,SAAS,MAAM,OAAO;AAClC,MAAI,kBAAkB,CAAC,IAAI,WAAW,IAAI,KAAK,QAAQ,IAAI;AACzD,UAAM,UAAU,eAAe,KAAK,UAAQ,QAAQ,QAAQ,IAAI,WAAW,OAAO,GAAG,CAAC;AACtF,QAAI,CAAC,SAAS;AAEZ,YAAM,UAAU,CAAC,UAAU,QAAQ,WAAW,OAAO,UAAU,EAAE,KAAK,OAAK,QAAQ,KAAK,IAAI,WAAW,IAAI,GAAG,CAAC;AAC/G,UAAI,CAAC,SAAS;AAEZ,gBAAQ,KAAK,0BAA0B,GAAG,uDAAuD;AAAA,MACnG;AAAA,IACF;AAAA,EACF;AACA,YAAU,SAAS,EAAE,WAAW,KAAK,CAAC;AACxC;AApEA,IAcI,kBA8BA;AA5CJ;AAAA;AAcA,IAAI,mBAAkC;AA8BtC,IAAI,iBAAkC;AAAA;AAAA;",
6
- "names": []
7
- }
@@ -1,156 +0,0 @@
1
- #!/usr/bin/env node
2
- import { createRequire as __bundleCreateRequire } from 'node:module'; import { fileURLToPath as __bundleFileURLToPath } from 'node:url'; import { dirname as __bundleDirname } from 'node:path'; const require = __bundleCreateRequire(import.meta.url); const __chunk_filename = __bundleFileURLToPath(import.meta.url); const __chunk_dirname = __bundleDirname(__chunk_filename);
3
- import {
4
- getEnv,
5
- init_env_schema
6
- } from "./chunk-SSCGWDIC.js";
7
- import {
8
- init_log_and_swallow,
9
- logAndSwallow
10
- } from "./chunk-WP7FZHMI.js";
11
- import {
12
- init_logger,
13
- logDebug,
14
- logError,
15
- logInfo
16
- } from "./chunk-OOKNHOCB.js";
17
-
18
- // src/components/nlm-command-handler.ts
19
- init_env_schema();
20
- init_logger();
21
- init_log_and_swallow();
22
- import { execFile } from "node:child_process";
23
- var TAG = "NLMCommand";
24
- var TIMEOUT_MS = 12e4;
25
- function loadNLMConfig() {
26
- const raw = String(getEnv().notebooklmEnabled);
27
- return {
28
- enabled: raw === "true" || raw === "1",
29
- defaultNotebook: getEnv().notebooklmDefaultNotebook
30
- };
31
- }
32
- function nlmExec(args) {
33
- const start = Date.now();
34
- logDebug(TAG, `nlm ${args.join(" ")}`);
35
- return new Promise((resolve) => {
36
- const ac = new AbortController();
37
- const timer = setTimeout(() => ac.abort(), TIMEOUT_MS);
38
- try {
39
- execFile("nlm", args, { signal: ac.signal, maxBuffer: 10 * 1024 * 1024 }, (err, stdout, stderr) => {
40
- clearTimeout(timer);
41
- logDebug(TAG, `nlm completed in ${Date.now() - start}ms`);
42
- if (err) {
43
- if (err.name === "AbortError" || err.code === "ABORT_ERR") {
44
- resolve({ ok: false, error: `Timeout after ${TIMEOUT_MS / 1e3}s` });
45
- return;
46
- }
47
- resolve({ ok: false, error: stderr?.trim() || err.message });
48
- return;
49
- }
50
- resolve({ ok: true, data: stdout.trim() });
51
- });
52
- } catch (err) {
53
- clearTimeout(timer);
54
- resolve({ ok: false, error: err instanceof Error ? err.message : String(err) });
55
- }
56
- });
57
- }
58
- async function handleNLMCommand(args, config) {
59
- if (!config.enabled) {
60
- return { text: "\u{1F4DA} Knowledge base is disabled." };
61
- }
62
- const parts = args.split(/\s+/).filter(Boolean);
63
- const sub = parts[0] ?? "";
64
- try {
65
- switch (sub) {
66
- case "list":
67
- return await handleList();
68
- case "create":
69
- return await handleCreate(parts.slice(1).join(" "));
70
- case "sources":
71
- return await handleSources(parts[1] ?? "");
72
- case "query":
73
- return await handleQuery(parts.slice(1).join(" "), config);
74
- default:
75
- return { text: "Usage: /nlm list | /nlm create <name> | /nlm sources <notebook-id> | /nlm query <question>" };
76
- }
77
- } catch (err) {
78
- logError(TAG, "NLM command failed", err);
79
- return { text: `\u274C NLM error: ${err instanceof Error ? err.message : String(err)}` };
80
- }
81
- }
82
- async function handleList() {
83
- const result = await nlmExec(["notebook", "list", "--json"]);
84
- if (!result.ok) return { text: `\u274C ${result.error}` };
85
- try {
86
- const notebooks = JSON.parse(result.data);
87
- if (!Array.isArray(notebooks) || notebooks.length === 0) return { text: "\u{1F4DA} No notebooks found." };
88
- const lines = notebooks.map(
89
- (n) => `\u2022 ${n.title ?? n.name ?? "?"} (${n.id ?? n.notebook_id ?? "?"})`
90
- );
91
- return { text: `\u{1F4DA} Notebooks:
92
-
93
- ${lines.join("\n")}` };
94
- } catch (err) {
95
- logAndSwallow(TAG, "JSON.parse notebook list", err);
96
- return { text: `\u{1F4DA} ${result.data}` };
97
- }
98
- }
99
- async function handleCreate(name) {
100
- if (!name) return { text: "Usage: /nlm create <name>" };
101
- const result = await nlmExec(["notebook", "create", name, "--json"]);
102
- if (!result.ok) return { text: `\u274C ${result.error}` };
103
- try {
104
- const parsed = JSON.parse(result.data);
105
- const id = parsed.notebook_id ?? parsed.id ?? "?";
106
- logInfo(TAG, `Created notebook "${name}" \u2192 ${id}`);
107
- return { text: `\u2713 Notebook "${name}" created (${id})` };
108
- } catch (err) {
109
- logAndSwallow(TAG, "JSON.parse notebook create", err);
110
- return { text: `\u2713 ${result.data}` };
111
- }
112
- }
113
- async function handleSources(notebookId) {
114
- if (!notebookId) return { text: "Usage: /nlm sources <notebook-id>" };
115
- const result = await nlmExec(["source", "list", notebookId, "--json"]);
116
- if (!result.ok) return { text: `\u274C ${result.error}` };
117
- try {
118
- const sources = JSON.parse(result.data);
119
- if (!Array.isArray(sources) || sources.length === 0) return { text: `\u{1F4C4} No sources in notebook.` };
120
- const lines = sources.map(
121
- (s) => `\u2022 [${s.type ?? s.source_type ?? "?"}] ${s.title ?? s.name ?? "?"}`
122
- );
123
- return { text: `\u{1F4C4} Sources:
124
-
125
- ${lines.join("\n")}` };
126
- } catch (err) {
127
- logAndSwallow(TAG, "JSON.parse source list", err);
128
- return { text: `\u{1F4C4} ${result.data}` };
129
- }
130
- }
131
- async function handleQuery(question, config) {
132
- if (!question) return { text: "Usage: /nlm query <question>" };
133
- const nbId = config.defaultNotebook;
134
- if (!nbId) return { text: "\u274C No default notebook configured (NOTEBOOKLM_DEFAULT_NOTEBOOK)." };
135
- const result = await nlmExec(["notebook", "query", nbId, question, "--json"]);
136
- if (!result.ok) return { text: `\u274C ${result.error}` };
137
- try {
138
- const parsed = JSON.parse(result.data);
139
- const answer = parsed.answer ?? parsed.response ?? result.data;
140
- const sources = parsed.sources_used ?? parsed.citations ?? [];
141
- const citations = Array.isArray(sources) && sources.length > 0 ? `
142
-
143
- \u{1F4CE} Sources: ${sources.map((s) => s.title ?? s.name ?? s.source_name ?? "?").join(", ")}` : "";
144
- logInfo(TAG, `Query OK \u2014 answerLen=${String(answer).length}`);
145
- return { text: `\u{1F4DA} ${answer}${citations}` };
146
- } catch (err) {
147
- logAndSwallow(TAG, "JSON.parse query result", err);
148
- return { text: `\u{1F4DA} ${result.data}` };
149
- }
150
- }
151
-
152
- export {
153
- loadNLMConfig,
154
- handleNLMCommand
155
- };
156
- //# sourceMappingURL=chunk-HAZHNBBY.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/components/nlm-command-handler.ts"],
4
- "sourcesContent": ["import { getEnv } from \"./env-schema.js\";\n/**\n * Telegram /nlm command handler \u2014 calls `nlm` CLI directly.\n *\n * Subcommands:\n * /nlm list \u2014 List notebooks\n * /nlm create <name> \u2014 Create a new notebook\n * /nlm sources <notebook> \u2014 List sources in a notebook\n * /nlm query <question> \u2014 Query the default notebook\n */\n\nimport { execFile } from \"node:child_process\";\nimport { logError, logDebug, logInfo } from \"./logger.js\";\nimport { logAndSwallow } from \"./log-and-swallow.js\";\n\nconst TAG = \"NLMCommand\";\nconst TIMEOUT_MS = 120_000; // 2 minutes \u2014 NLM queries can be slow\n\nexport type NLMCommandResult = { text: string };\n\nexport type NLMConfig = {\n enabled: boolean;\n defaultNotebook: string; // notebook ID (not name)\n};\n\nexport function loadNLMConfig(): NLMConfig {\n const raw = String(getEnv().notebooklmEnabled);\n return {\n enabled: raw === \"true\" || raw === \"1\",\n defaultNotebook: getEnv().notebooklmDefaultNotebook,\n };\n}\n\n/** Execute `nlm` CLI and return stdout. */\nfunction nlmExec(args: string[]): Promise<{ ok: true; data: string } | { ok: false; error: string }> {\n const start = Date.now();\n logDebug(TAG, `nlm ${args.join(\" \")}`);\n\n return new Promise((resolve) => {\n const ac = new AbortController();\n const timer = setTimeout(() => ac.abort(), TIMEOUT_MS);\n\n try {\n execFile(\"nlm\", args, { signal: ac.signal, maxBuffer: 10 * 1024 * 1024 }, (err, stdout, stderr) => {\n clearTimeout(timer);\n logDebug(TAG, `nlm completed in ${Date.now() - start}ms`);\n\n if (err) {\n if (err.name === \"AbortError\" || (err as NodeJS.ErrnoException).code === \"ABORT_ERR\") {\n resolve({ ok: false, error: `Timeout after ${TIMEOUT_MS / 1000}s` });\n return;\n }\n resolve({ ok: false, error: stderr?.trim() || err.message });\n return;\n }\n resolve({ ok: true, data: stdout.trim() });\n });\n } catch (err) {\n clearTimeout(timer);\n resolve({ ok: false, error: err instanceof Error ? err.message : String(err) });\n }\n });\n}\n\nexport async function handleNLMCommand(args: string, config: NLMConfig): Promise<NLMCommandResult> {\n if (!config.enabled) {\n return { text: \"\uD83D\uDCDA Knowledge base is disabled.\" };\n }\n\n const parts = args.split(/\\s+/).filter(Boolean);\n const sub = parts[0] ?? \"\";\n\n try {\n switch (sub) {\n case \"list\": return await handleList();\n case \"create\": return await handleCreate(parts.slice(1).join(\" \"));\n case \"sources\": return await handleSources(parts[1] ?? \"\");\n case \"query\": return await handleQuery(parts.slice(1).join(\" \"), config);\n default:\n return { text: \"Usage: /nlm list | /nlm create <name> | /nlm sources <notebook-id> | /nlm query <question>\" };\n }\n } catch (err) {\n logError(TAG, \"NLM command failed\", err);\n return { text: `\u274C NLM error: ${err instanceof Error ? err.message : String(err)}` };\n }\n}\n\nasync function handleList(): Promise<NLMCommandResult> {\n const result = await nlmExec([\"notebook\", \"list\", \"--json\"]);\n if (!result.ok) return { text: `\u274C ${result.error}` };\n\n try {\n const notebooks = JSON.parse(result.data);\n if (!Array.isArray(notebooks) || notebooks.length === 0) return { text: \"\uD83D\uDCDA No notebooks found.\" };\n const lines = notebooks.map((n: Record<string, unknown>) =>\n `\u2022 ${n.title ?? n.name ?? \"?\"} (${n.id ?? n.notebook_id ?? \"?\"})`\n );\n return { text: `\uD83D\uDCDA Notebooks:\\n\\n${lines.join(\"\\n\")}` };\n } catch (err) {\n logAndSwallow(TAG, \"JSON.parse notebook list\", err);\n return { text: `\uD83D\uDCDA ${result.data}` };\n }\n}\n\nasync function handleCreate(name: string): Promise<NLMCommandResult> {\n if (!name) return { text: \"Usage: /nlm create <name>\" };\n const result = await nlmExec([\"notebook\", \"create\", name, \"--json\"]);\n if (!result.ok) return { text: `\u274C ${result.error}` };\n\n try {\n const parsed = JSON.parse(result.data);\n const id = parsed.notebook_id ?? parsed.id ?? \"?\";\n logInfo(TAG, `Created notebook \"${name}\" \u2192 ${id}`);\n return { text: `\u2713 Notebook \"${name}\" created (${id})` };\n } catch (err) {\n logAndSwallow(TAG, \"JSON.parse notebook create\", err);\n return { text: `\u2713 ${result.data}` };\n }\n}\n\nasync function handleSources(notebookId: string): Promise<NLMCommandResult> {\n if (!notebookId) return { text: \"Usage: /nlm sources <notebook-id>\" };\n const result = await nlmExec([\"source\", \"list\", notebookId, \"--json\"]);\n if (!result.ok) return { text: `\u274C ${result.error}` };\n\n try {\n const sources = JSON.parse(result.data);\n if (!Array.isArray(sources) || sources.length === 0) return { text: `\uD83D\uDCC4 No sources in notebook.` };\n const lines = sources.map((s: Record<string, unknown>) =>\n `\u2022 [${s.type ?? s.source_type ?? \"?\"}] ${s.title ?? s.name ?? \"?\"}`\n );\n return { text: `\uD83D\uDCC4 Sources:\\n\\n${lines.join(\"\\n\")}` };\n } catch (err) {\n logAndSwallow(TAG, \"JSON.parse source list\", err);\n return { text: `\uD83D\uDCC4 ${result.data}` };\n }\n}\n\nasync function handleQuery(question: string, config: NLMConfig): Promise<NLMCommandResult> {\n if (!question) return { text: \"Usage: /nlm query <question>\" };\n const nbId = config.defaultNotebook;\n if (!nbId) return { text: \"\u274C No default notebook configured (NOTEBOOKLM_DEFAULT_NOTEBOOK).\" };\n\n const result = await nlmExec([\"notebook\", \"query\", nbId, question, \"--json\"]);\n if (!result.ok) return { text: `\u274C ${result.error}` };\n\n try {\n const parsed = JSON.parse(result.data);\n const answer = parsed.answer ?? parsed.response ?? result.data;\n const sources = parsed.sources_used ?? parsed.citations ?? [];\n const citations = Array.isArray(sources) && sources.length > 0\n ? `\\n\\n\uD83D\uDCCE Sources: ${sources.map((s: Record<string, unknown>) => s.title ?? s.name ?? s.source_name ?? \"?\").join(\", \")}`\n : \"\";\n logInfo(TAG, `Query OK \u2014 answerLen=${String(answer).length}`);\n return { text: `\uD83D\uDCDA ${answer}${citations}` };\n } catch (err) {\n logAndSwallow(TAG, \"JSON.parse query result\", err);\n return { text: `\uD83D\uDCDA ${result.data}` };\n }\n}\n"],
5
- "mappings": "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",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/utils/lazy-require.ts"],
4
- "sourcesContent": ["/**\n * lazy-require.ts \u2014 Install optional deps on first use.\n * Installs into ~/.abtars-releases/deps/node_modules/. Falls back gracefully.\n */\nimport { existsSync, mkdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { logInfo, logWarn } from \"../components/logger.js\";\nimport { abtarsHome } from \"../paths.js\";\n\nconst TAG = \"deps\";\n\nexport interface OptionalDep {\n readonly packages: readonly string[];\n readonly label: string;\n readonly postInstall?: string;\n}\n\nexport const OPTIONAL_DEPS: Record<string, OptionalDep> = {\n browser: { packages: [\"cloakbrowser\"], label: \"CloakBrowser (stealth Chromium)\" },\n twitter: { packages: [\"rettiwt-api\"], label: \"Twitter/X integration\" },\n pdf: { packages: [\"pdf-parse\"], label: \"PDF reading\" },\n youtube: { packages: [\"youtube-transcript\"], label: \"YouTube transcripts\" },\n image: { packages: [\"jimp\"], label: \"Image processing\" },\n};\n\nexport interface SystemDep {\n readonly bin: string;\n readonly label: string;\n readonly installHint: string;\n readonly platform?: \"linux\" | \"darwin\";\n}\n\nexport const SYSTEM_DEPS: Record<string, SystemDep> = {\n bwrap: { bin: \"bwrap\", label: \"Seatbelt sandbox (Linux)\", installHint: \"apt install bubblewrap\", platform: \"linux\" },\n lightpanda: { bin: \"lightpanda\", label: \"Web-fetch level 3\", installHint: \"see https://lightpanda.io\" },\n ollama: { bin: \"ollama\", label: \"Local embeddings\", installHint: \"curl -fsSL https://ollama.ai/install.sh | sh\" },\n};\n\nfunction libDir(): string {\n const d = join(homedir(), \".local\", \"lib\");\n mkdirSync(d, { recursive: true });\n return d;\n}\n\nfunction libNodeModules(): string {\n return join(libDir(), \"node_modules\");\n}\n\n/** Check if a package is installed in ~/.abtars-releases/deps/ */\nexport function isInstalled(pkg: string): boolean {\n return existsSync(join(libNodeModules(), pkg));\n}\n\n/** Install packages into ~/.abtars-releases/deps/ */\nexport function installPackages(packages: readonly string[]): void {\n const { execSync } = require(\"node:child_process\");\n const dir = libDir();\n execSync(`npm install --prefix \"${dir}\" ${packages.join(\" \")} --no-audit --no-fund`, { stdio: \"pipe\" });\n}\n\n/**\n * Lazy import \u2014 tries normal import, falls back to ~/.abtars/lib/, auto-installs if missing.\n */\nexport async function lazyRequire<T = any>(pkg: string, label?: string): Promise<T> {\n // Try normal resolution first (globally installed or in bundle)\n try { return await import(pkg); } catch { /* not found normally */ }\n\n // Try from ~/.abtars/lib/\n const libNm = libNodeModules();\n const pkgPath = join(libNm, pkg);\n if (existsSync(pkgPath)) {\n try { return await import(pkgPath); } catch { /* broken install */ }\n }\n\n // Auto-install\n logInfo(TAG, `Installing ${label ?? pkg}...`);\n try {\n installPackages([pkg]);\n return await import(join(libNm, pkg));\n } catch (err) {\n logWarn(TAG, `Failed to install ${pkg}: ${err instanceof Error ? err.message : String(err)}`);\n throw new Error(`Optional dependency \"${pkg}\" not available. Install with: abtars deps install ${label ?? pkg}`);\n }\n}\n"],
5
- "mappings": ";;;;;;;;;;;;AAOA;AAHA,SAAS,YAAY,iBAAiB;AACtC,SAAS,YAAY;AACrB,SAAS,eAAe;AAIxB,IAAM,MAAM;AAQL,IAAM,gBAA6C;AAAA,EACxD,SAAS,EAAE,UAAU,CAAC,cAAc,GAAG,OAAO,kCAAkC;AAAA,EAChF,SAAS,EAAE,UAAU,CAAC,aAAa,GAAG,OAAO,wBAAwB;AAAA,EACrE,KAAK,EAAE,UAAU,CAAC,WAAW,GAAG,OAAO,cAAc;AAAA,EACrD,SAAS,EAAE,UAAU,CAAC,oBAAoB,GAAG,OAAO,sBAAsB;AAAA,EAC1E,OAAO,EAAE,UAAU,CAAC,MAAM,GAAG,OAAO,mBAAmB;AACzD;AASO,IAAM,cAAyC;AAAA,EACpD,OAAY,EAAE,KAAK,SAAc,OAAO,4BAA4B,aAAa,0BAA0B,UAAU,QAAQ;AAAA,EAC7H,YAAY,EAAE,KAAK,cAAc,OAAO,qBAA4B,aAAa,4BAA4B;AAAA,EAC7G,QAAY,EAAE,KAAK,UAAc,OAAO,oBAA4B,aAAa,+CAA+C;AAClI;AAEA,SAAS,SAAiB;AACxB,QAAM,IAAI,KAAK,QAAQ,GAAG,UAAU,KAAK;AACzC,YAAU,GAAG,EAAE,WAAW,KAAK,CAAC;AAChC,SAAO;AACT;AAEA,SAAS,iBAAyB;AAChC,SAAO,KAAK,OAAO,GAAG,cAAc;AACtC;AAGO,SAAS,YAAY,KAAsB;AAChD,SAAO,WAAW,KAAK,eAAe,GAAG,GAAG,CAAC;AAC/C;AAGO,SAAS,gBAAgB,UAAmC;AACjE,QAAM,EAAE,SAAS,IAAI,UAAQ,oBAAoB;AACjD,QAAM,MAAM,OAAO;AACnB,WAAS,yBAAyB,GAAG,KAAK,SAAS,KAAK,GAAG,CAAC,yBAAyB,EAAE,OAAO,OAAO,CAAC;AACxG;AAKA,eAAsB,YAAqB,KAAa,OAA4B;AAElF,MAAI;AAAE,WAAO,MAAM,OAAO;AAAA,EAAM,QAAQ;AAAA,EAA2B;AAGnE,QAAM,QAAQ,eAAe;AAC7B,QAAM,UAAU,KAAK,OAAO,GAAG;AAC/B,MAAI,WAAW,OAAO,GAAG;AACvB,QAAI;AAAE,aAAO,MAAM,OAAO;AAAA,IAAU,QAAQ;AAAA,IAAuB;AAAA,EACrE;AAGA,UAAQ,KAAK,cAAc,SAAS,GAAG,KAAK;AAC5C,MAAI;AACF,oBAAgB,CAAC,GAAG,CAAC;AACrB,WAAO,MAAM,OAAO,KAAK,OAAO,GAAG;AAAA,EACrC,SAAS,KAAK;AACZ,YAAQ,KAAK,qBAAqB,GAAG,KAAK,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,EAAE;AAC5F,UAAM,IAAI,MAAM,wBAAwB,GAAG,sDAAsD,SAAS,GAAG,EAAE;AAAA,EACjH;AACF;",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/boot/ctx-start.ts"],
4
- "sourcesContent": ["/**\n * Context-window-start persistence \u2014 per-user timestamps tracking when the\n * current context window began. Used by recall fallback stages.\n *\n * Called from phase-transport (initialize at boot), phase-sleep-cycle (reset\n * after sleep), and message-pipeline (update on session turn).\n */\n\nimport { logAndSwallow } from \"../components/log-and-swallow.js\";\nimport { readFileSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\n/** Update context-window-start timestamp for a chat. */\nexport function updateCtxStart(memoryDir: string, userId: string, ts = Date.now()): void {\n const p = join(memoryDir, \"context-window-start.json\");\n let data: Record<string, number> = {};\n try { data = JSON.parse(readFileSync(p, \"utf-8\")); } catch (err) { logAndSwallow(\"ctx_start\", \"op\", err); }\n data[userId] = ts;\n writeFileSync(p, JSON.stringify(data), \"utf-8\");\n}\n\n/** Set all context-window-start entries to now (called after sleep). */\nexport function resetAllCtxStarts(memoryDir: string): void {\n const p = join(memoryDir, \"context-window-start.json\");\n let data: Record<string, number> = {};\n try { data = JSON.parse(readFileSync(p, \"utf-8\")); } catch (err) { logAndSwallow(\"ctx_start\", \"read ctx-start json\", err); return; }\n const now = Date.now();\n for (const key of Object.keys(data)) data[key] = now;\n writeFileSync(p, JSON.stringify(data), \"utf-8\");\n}\n"],
5
- "mappings": ";;;;;;;;AAQA;AACA,SAAS,cAAc,qBAAqB;AAC5C,SAAS,YAAY;AAGd,SAAS,eAAe,WAAmB,QAAgB,KAAK,KAAK,IAAI,GAAS;AACvF,QAAM,IAAI,KAAK,WAAW,2BAA2B;AACrD,MAAI,OAA+B,CAAC;AACpC,MAAI;AAAE,WAAO,KAAK,MAAM,aAAa,GAAG,OAAO,CAAC;AAAA,EAAG,SAAS,KAAK;AAAE,kBAAc,aAAa,MAAM,GAAG;AAAA,EAAG;AAC1G,OAAK,MAAM,IAAI;AACf,gBAAc,GAAG,KAAK,UAAU,IAAI,GAAG,OAAO;AAChD;AAGO,SAAS,kBAAkB,WAAyB;AACzD,QAAM,IAAI,KAAK,WAAW,2BAA2B;AACrD,MAAI,OAA+B,CAAC;AACpC,MAAI;AAAE,WAAO,KAAK,MAAM,aAAa,GAAG,OAAO,CAAC;AAAA,EAAG,SAAS,KAAK;AAAE,kBAAc,aAAa,uBAAuB,GAAG;AAAG;AAAA,EAAQ;AACnI,QAAM,MAAM,KAAK,IAAI;AACrB,aAAW,OAAO,OAAO,KAAK,IAAI,EAAG,MAAK,GAAG,IAAI;AACjD,gBAAc,GAAG,KAAK,UAAU,IAAI,GAAG,OAAO;AAChD;",
6
- "names": []
7
- }
@@ -1,30 +0,0 @@
1
- #!/usr/bin/env node
2
- import { createRequire as __bundleCreateRequire } from 'node:module'; import { fileURLToPath as __bundleFileURLToPath } from 'node:url'; import { dirname as __bundleDirname } from 'node:path'; const require = __bundleCreateRequire(import.meta.url); const __chunk_filename = __bundleFileURLToPath(import.meta.url); const __chunk_dirname = __bundleDirname(__chunk_filename);
3
-
4
- // src/utils/abmind-lazy.ts
5
- var _mod = null;
6
- var _loaded = false;
7
- function resetAbmindCache() {
8
- _mod = null;
9
- _loaded = false;
10
- }
11
- async function loadAbmind() {
12
- if (_loaded) return _mod;
13
- try {
14
- _mod = await import("abmind");
15
- } catch {
16
- _mod = null;
17
- }
18
- _loaded = true;
19
- return _mod;
20
- }
21
- function abmind() {
22
- return _mod;
23
- }
24
-
25
- export {
26
- resetAbmindCache,
27
- loadAbmind,
28
- abmind
29
- };
30
- //# sourceMappingURL=chunk-JAJ3DUQ2.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/utils/abmind-lazy.ts"],
4
- "sourcesContent": ["/**\n * Lazy abmind loader \u2014 pre-loaded once at boot, then available synchronously.\n * ALL runtime access to abmind goes through here.\n * If abmind is not installed, abmind() returns null.\n */\n\ntype AbmindModule = typeof import(\"abmind\");\n\nlet _mod: AbmindModule | null = null;\nlet _loaded = false;\n\n/** Reset cache \u2014 called on in-process restart. */\nexport function resetAbmindCache(): void {\n _mod = null;\n _loaded = false;\n}\n\n/** Call once at boot (phase-memory). Caches the module. */\nexport async function loadAbmind(): Promise<AbmindModule | null> {\n if (_loaded) return _mod;\n try {\n _mod = await import(\"abmind\");\n } catch {\n _mod = null;\n }\n _loaded = true;\n return _mod;\n}\n\n/** Synchronous access after loadAbmind() has been called. Returns null if unavailable. */\nexport function abmind(): AbmindModule | null {\n return _mod;\n}\n"],
5
- "mappings": ";;;;AAQA,IAAI,OAA4B;AAChC,IAAI,UAAU;AAGP,SAAS,mBAAyB;AACvC,SAAO;AACP,YAAU;AACZ;AAGA,eAAsB,aAA2C;AAC/D,MAAI,QAAS,QAAO;AACpB,MAAI;AACF,WAAO,MAAM,OAAO,QAAQ;AAAA,EAC9B,QAAQ;AACN,WAAO;AAAA,EACT;AACA,YAAU;AACV,SAAO;AACT;AAGO,SAAS,SAA8B;AAC5C,SAAO;AACT;",
6
- "names": []
7
- }
@@ -1,45 +0,0 @@
1
- #!/usr/bin/env node
2
- import { createRequire as __bundleCreateRequire } from 'node:module'; import { fileURLToPath as __bundleFileURLToPath } from 'node:url'; import { dirname as __bundleDirname } from 'node:path'; const require = __bundleCreateRequire(import.meta.url); const __chunk_filename = __bundleFileURLToPath(import.meta.url); const __chunk_dirname = __bundleDirname(__chunk_filename);
3
-
4
- // src/cli/update-sources/registry-client.ts
5
- import { writeFileSync } from "node:fs";
6
- var REGISTRY = "https://registry.npmjs.org";
7
- var METADATA_TIMEOUT_MS = 3e4;
8
- var TARBALL_TIMEOUT_MS = 12e4;
9
- async function resolveVersion(packageName, tag) {
10
- const controller = new AbortController();
11
- const timer = setTimeout(() => controller.abort(), METADATA_TIMEOUT_MS);
12
- try {
13
- const res = await fetch(`${REGISTRY}/${packageName}`, {
14
- headers: { Accept: "application/vnd.npm.install-v1+json" },
15
- signal: controller.signal
16
- });
17
- if (!res.ok) throw new Error(`Registry returned ${res.status} for ${packageName}`);
18
- const data = await res.json();
19
- const version = data["dist-tags"]?.[tag];
20
- if (!version) throw new Error(`No dist-tag '${tag}' for ${packageName}`);
21
- const tarballUrl = data.versions?.[version]?.dist?.tarball;
22
- if (!tarballUrl) throw new Error(`No tarball URL for ${packageName}@${version}`);
23
- return { version, tarballUrl };
24
- } finally {
25
- clearTimeout(timer);
26
- }
27
- }
28
- async function downloadTarball(url, destPath) {
29
- const controller = new AbortController();
30
- const timer = setTimeout(() => controller.abort(), TARBALL_TIMEOUT_MS);
31
- try {
32
- const res = await fetch(url, { signal: controller.signal });
33
- if (!res.ok) throw new Error(`Tarball download failed: ${res.status} ${url}`);
34
- const buf = Buffer.from(await res.arrayBuffer());
35
- writeFileSync(destPath, buf);
36
- } finally {
37
- clearTimeout(timer);
38
- }
39
- }
40
-
41
- export {
42
- resolveVersion,
43
- downloadTarball
44
- };
45
- //# sourceMappingURL=chunk-KMFR5AVY.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/cli/update-sources/registry-client.ts"],
4
- "sourcesContent": ["/**\n * registry-client.ts \u2014 Direct npm registry HTTP fetch (#1176).\n * No npm/pnpm CLI dependency. Pure fetch() + tar.\n */\nimport { writeFileSync } from \"node:fs\";\n\nconst REGISTRY = \"https://registry.npmjs.org\";\nconst METADATA_TIMEOUT_MS = 30_000;\nconst TARBALL_TIMEOUT_MS = 120_000;\n\nexport interface ResolvedVersion {\n version: string;\n tarballUrl: string;\n}\n\n/** Resolve a dist-tag (alpha, latest) to a concrete version + tarball URL. */\nexport async function resolveVersion(packageName: string, tag: string): Promise<ResolvedVersion> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), METADATA_TIMEOUT_MS);\n try {\n const res = await fetch(`${REGISTRY}/${packageName}`, {\n headers: { Accept: \"application/vnd.npm.install-v1+json\" },\n signal: controller.signal,\n });\n if (!res.ok) throw new Error(`Registry returned ${res.status} for ${packageName}`);\n const data = await res.json() as { \"dist-tags\"?: Record<string, string>; versions?: Record<string, { dist?: { tarball?: string } }> };\n const version = data[\"dist-tags\"]?.[tag];\n if (!version) throw new Error(`No dist-tag '${tag}' for ${packageName}`);\n const tarballUrl = data.versions?.[version]?.dist?.tarball;\n if (!tarballUrl) throw new Error(`No tarball URL for ${packageName}@${version}`);\n return { version, tarballUrl };\n } finally {\n clearTimeout(timer);\n }\n}\n\n/** Download a tarball to a local file path. */\nexport async function downloadTarball(url: string, destPath: string): Promise<void> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), TARBALL_TIMEOUT_MS);\n try {\n const res = await fetch(url, { signal: controller.signal });\n if (!res.ok) throw new Error(`Tarball download failed: ${res.status} ${url}`);\n const buf = Buffer.from(await res.arrayBuffer());\n writeFileSync(destPath, buf);\n } finally {\n clearTimeout(timer);\n }\n}\n"],
5
- "mappings": ";;;;AAIA,SAAS,qBAAqB;AAE9B,IAAM,WAAW;AACjB,IAAM,sBAAsB;AAC5B,IAAM,qBAAqB;AAQ3B,eAAsB,eAAe,aAAqB,KAAuC;AAC/F,QAAM,aAAa,IAAI,gBAAgB;AACvC,QAAM,QAAQ,WAAW,MAAM,WAAW,MAAM,GAAG,mBAAmB;AACtE,MAAI;AACF,UAAM,MAAM,MAAM,MAAM,GAAG,QAAQ,IAAI,WAAW,IAAI;AAAA,MACpD,SAAS,EAAE,QAAQ,sCAAsC;AAAA,MACzD,QAAQ,WAAW;AAAA,IACrB,CAAC;AACD,QAAI,CAAC,IAAI,GAAI,OAAM,IAAI,MAAM,qBAAqB,IAAI,MAAM,QAAQ,WAAW,EAAE;AACjF,UAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,UAAM,UAAU,KAAK,WAAW,IAAI,GAAG;AACvC,QAAI,CAAC,QAAS,OAAM,IAAI,MAAM,gBAAgB,GAAG,SAAS,WAAW,EAAE;AACvE,UAAM,aAAa,KAAK,WAAW,OAAO,GAAG,MAAM;AACnD,QAAI,CAAC,WAAY,OAAM,IAAI,MAAM,sBAAsB,WAAW,IAAI,OAAO,EAAE;AAC/E,WAAO,EAAE,SAAS,WAAW;AAAA,EAC/B,UAAE;AACA,iBAAa,KAAK;AAAA,EACpB;AACF;AAGA,eAAsB,gBAAgB,KAAa,UAAiC;AAClF,QAAM,aAAa,IAAI,gBAAgB;AACvC,QAAM,QAAQ,WAAW,MAAM,WAAW,MAAM,GAAG,kBAAkB;AACrE,MAAI;AACF,UAAM,MAAM,MAAM,MAAM,KAAK,EAAE,QAAQ,WAAW,OAAO,CAAC;AAC1D,QAAI,CAAC,IAAI,GAAI,OAAM,IAAI,MAAM,4BAA4B,IAAI,MAAM,IAAI,GAAG,EAAE;AAC5E,UAAM,MAAM,OAAO,KAAK,MAAM,IAAI,YAAY,CAAC;AAC/C,kBAAc,UAAU,GAAG;AAAA,EAC7B,UAAE;AACA,iBAAa,KAAK;AAAA,EACpB;AACF;",
6
- "names": []
7
- }