abtars 0.1.0-alpha.2 → 0.1.0-alpha.21

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 (386) hide show
  1. package/CHANGELOG.md +64 -0
  2. package/bundle/_registry.generated-KQODGKTQ.js +36 -0
  3. package/bundle/{_registry.generated-M4WY2MMI.js.map → _registry.generated-KQODGKTQ.js.map} +1 -1
  4. package/bundle/abtars-browser.js +8 -7
  5. package/bundle/abtars-browser.js.map +1 -1
  6. package/bundle/abtars-cli.js +646 -73
  7. package/bundle/abtars-cli.js.map +4 -4
  8. package/bundle/abtars-restart.js +7 -6
  9. package/bundle/abtars-rss.js +2 -1
  10. package/bundle/abtars-rss.js.map +1 -1
  11. package/bundle/abtars-task.js +9 -8
  12. package/bundle/abtars-task.js.map +1 -1
  13. package/bundle/abtars.js +103 -96
  14. package/bundle/abtars.js.map +2 -2
  15. package/bundle/{agent-api-rate-limit-OQNFMXTZ.js → agent-api-rate-limit-7R5TX2F2.js} +7 -6
  16. package/bundle/{agent-api-rate-limit-OQNFMXTZ.js.map → agent-api-rate-limit-7R5TX2F2.js.map} +1 -1
  17. package/bundle/agent-registry-5M77ZOMV.js +19 -0
  18. package/bundle/agent-registry-VJMNIQ5W.js +19 -0
  19. package/bundle/{anthropic-adapter-2APTH3LA.js → anthropic-adapter-IBY3NPXW.js} +4 -3
  20. package/bundle/{anthropic-adapter-2APTH3LA.js.map → anthropic-adapter-IBY3NPXW.js.map} +1 -1
  21. package/bundle/{bridge-lock-transport-4AC2G5G6.js → bridge-lock-transport-HO545SBK.js} +9 -8
  22. package/bundle/browse-delivery-64GQIUHG.js +18 -0
  23. package/bundle/browser-EXR5OQGK.js +19 -0
  24. package/bundle/capability-HIE7UGFU.js +18 -0
  25. package/bundle/{chunk-BUUVFUPO.js → chunk-2BY6I4P5.js} +5 -4
  26. package/bundle/{chunk-BUUVFUPO.js.map → chunk-2BY6I4P5.js.map} +1 -1
  27. package/bundle/{chunk-Y6XAEX2Q.js → chunk-2F6XKG7Y.js} +15 -9
  28. package/bundle/chunk-2F6XKG7Y.js.map +7 -0
  29. package/bundle/{chunk-V76TVMCM.js → chunk-3MO2MDXJ.js} +5 -4
  30. package/bundle/{chunk-V76TVMCM.js.map → chunk-3MO2MDXJ.js.map} +1 -1
  31. package/bundle/{chunk-6UCRKRWR.js → chunk-6XX4OAAM.js} +22 -21
  32. package/bundle/chunk-6XX4OAAM.js.map +7 -0
  33. package/bundle/{chunk-XREWVCUO.js → chunk-7CHLS36W.js} +16 -148
  34. package/bundle/chunk-7CHLS36W.js.map +7 -0
  35. package/bundle/{chunk-NWDBD4PA.js → chunk-7K2YZTLD.js} +3 -2
  36. package/bundle/{chunk-JCJS4ZIB.js → chunk-AQVOAQQI.js} +5 -4
  37. package/bundle/{chunk-JCJS4ZIB.js.map → chunk-AQVOAQQI.js.map} +1 -1
  38. package/bundle/chunk-AUQD2PKM.js +136 -0
  39. package/bundle/chunk-AUQD2PKM.js.map +7 -0
  40. package/bundle/{chunk-YOCTDKKL.js → chunk-BYDUMHXT.js} +4 -3
  41. package/bundle/{chunk-YOCTDKKL.js.map → chunk-BYDUMHXT.js.map} +1 -1
  42. package/bundle/{chunk-RVE2N7FA.js → chunk-CELR236Q.js} +5 -4
  43. package/bundle/{chunk-RVE2N7FA.js.map → chunk-CELR236Q.js.map} +1 -1
  44. package/bundle/{chunk-2XU2X4OI.js → chunk-CUQA2AJT.js} +3 -2
  45. package/bundle/{chunk-2XU2X4OI.js.map → chunk-CUQA2AJT.js.map} +1 -1
  46. package/bundle/chunk-DMPR5MYT.js +183 -0
  47. package/bundle/chunk-DMPR5MYT.js.map +7 -0
  48. package/bundle/{chunk-BHMZ4RCC.js → chunk-DY3R7LDW.js} +55 -54
  49. package/bundle/{chunk-BHMZ4RCC.js.map → chunk-DY3R7LDW.js.map} +1 -1
  50. package/bundle/{chunk-AR6GO6YC.js → chunk-ELRAH7VL.js} +5 -4
  51. package/bundle/{chunk-AR6GO6YC.js.map → chunk-ELRAH7VL.js.map} +1 -1
  52. package/bundle/{chunk-FMWKEPM7.js → chunk-EX2SRTUE.js} +5 -4
  53. package/bundle/{chunk-FMWKEPM7.js.map → chunk-EX2SRTUE.js.map} +1 -1
  54. package/bundle/{chunk-JW6RU47G.js → chunk-FVQGP5YO.js} +8 -7
  55. package/bundle/{chunk-JW6RU47G.js.map → chunk-FVQGP5YO.js.map} +1 -1
  56. package/bundle/{chunk-GRNENTPA.js → chunk-G6IXMYIO.js} +4 -3
  57. package/bundle/{chunk-GRNENTPA.js.map → chunk-G6IXMYIO.js.map} +1 -1
  58. package/bundle/{chunk-6NR3OHEW.js → chunk-H2RZ4NEJ.js} +6 -5
  59. package/bundle/{chunk-6NR3OHEW.js.map → chunk-H2RZ4NEJ.js.map} +1 -1
  60. package/bundle/chunk-HVKJN3AG.js +189 -0
  61. package/bundle/chunk-HVKJN3AG.js.map +7 -0
  62. package/bundle/{chunk-265TPOPC.js → chunk-HXJRZWKA.js} +3 -2
  63. package/bundle/{chunk-265TPOPC.js.map → chunk-HXJRZWKA.js.map} +1 -1
  64. package/bundle/chunk-IU3RI5E4.js +645 -0
  65. package/bundle/chunk-IU3RI5E4.js.map +7 -0
  66. package/bundle/{chunk-GST5T3WZ.js → chunk-J5YIMCLT.js} +6 -5
  67. package/bundle/{chunk-GST5T3WZ.js.map → chunk-J5YIMCLT.js.map} +1 -1
  68. package/bundle/chunk-JAJ3DUQ2.js +30 -0
  69. package/bundle/{chunk-OP7BTAWY.js.map → chunk-JAJ3DUQ2.js.map} +1 -1
  70. package/bundle/chunk-JHF25OOG.js +645 -0
  71. package/bundle/chunk-JHF25OOG.js.map +7 -0
  72. package/bundle/{chunk-MPX525QO.js → chunk-JRG4EFMP.js} +5 -4
  73. package/bundle/{chunk-MPX525QO.js.map → chunk-JRG4EFMP.js.map} +1 -1
  74. package/bundle/{chunk-VVEDVGCR.js → chunk-JU3UBWLN.js} +17 -16
  75. package/bundle/{chunk-VVEDVGCR.js.map → chunk-JU3UBWLN.js.map} +1 -1
  76. package/bundle/{chunk-QBGBT5QS.js → chunk-JX3ZZU3O.js} +5 -4
  77. package/bundle/{chunk-QBGBT5QS.js.map → chunk-JX3ZZU3O.js.map} +1 -1
  78. package/bundle/{chunk-6SETMHNN.js → chunk-K7P74UNQ.js} +8 -7
  79. package/bundle/{chunk-6SETMHNN.js.map → chunk-K7P74UNQ.js.map} +1 -1
  80. package/bundle/{chunk-AZJIODTQ.js → chunk-KED3G7HS.js} +6 -5
  81. package/bundle/{chunk-AZJIODTQ.js.map → chunk-KED3G7HS.js.map} +1 -1
  82. package/bundle/chunk-KI2ROWAH.js +3707 -0
  83. package/bundle/chunk-KI2ROWAH.js.map +7 -0
  84. package/bundle/{chunk-UHRP745J.js → chunk-L7YHV5DL.js} +6 -5
  85. package/bundle/{chunk-UHRP745J.js.map → chunk-L7YHV5DL.js.map} +1 -1
  86. package/bundle/{chunk-BSSBCSCL.js → chunk-LD5BMLHG.js} +11 -10
  87. package/bundle/{chunk-BSSBCSCL.js.map → chunk-LD5BMLHG.js.map} +1 -1
  88. package/bundle/{chunk-2UPU3OW6.js → chunk-LYEAHE5V.js} +5 -4
  89. package/bundle/{chunk-2UPU3OW6.js.map → chunk-LYEAHE5V.js.map} +1 -1
  90. package/bundle/{chunk-3B7BBE4F.js → chunk-MCGEXAG5.js} +8 -7
  91. package/bundle/{chunk-3B7BBE4F.js.map → chunk-MCGEXAG5.js.map} +1 -1
  92. package/bundle/{chunk-X76UX47U.js → chunk-MJ6PHMOK.js} +4 -3
  93. package/bundle/{chunk-X76UX47U.js.map → chunk-MJ6PHMOK.js.map} +1 -1
  94. package/bundle/{chunk-LSPKJQCI.js → chunk-MV6CJFWR.js} +3 -2
  95. package/bundle/{chunk-LSPKJQCI.js.map → chunk-MV6CJFWR.js.map} +1 -1
  96. package/bundle/chunk-MZWMYN4O.js +17 -0
  97. package/bundle/{chunk-M6VBAPNT.js.map → chunk-MZWMYN4O.js.map} +1 -1
  98. package/bundle/{chunk-HX7Y7EYP.js → chunk-NIRYBWUW.js} +4 -3
  99. package/bundle/{chunk-HX7Y7EYP.js.map → chunk-NIRYBWUW.js.map} +1 -1
  100. package/bundle/{chunk-3E545J66.js → chunk-OW64RUE5.js} +3 -2
  101. package/bundle/{chunk-3E545J66.js.map → chunk-OW64RUE5.js.map} +1 -1
  102. package/bundle/chunk-P56PLAIC.js +126 -0
  103. package/bundle/chunk-P56PLAIC.js.map +7 -0
  104. package/bundle/{chunk-TZHIDLDS.js → chunk-P6PN34XD.js} +5 -4
  105. package/bundle/{chunk-TZHIDLDS.js.map → chunk-P6PN34XD.js.map} +1 -1
  106. package/bundle/{chunk-2UENBO6M.js → chunk-PF5UQ64X.js} +9 -8
  107. package/bundle/{chunk-2UENBO6M.js.map → chunk-PF5UQ64X.js.map} +1 -1
  108. package/bundle/{chunk-6CPN4IGS.js → chunk-PQ62LZNA.js} +9 -8
  109. package/bundle/{chunk-6CPN4IGS.js.map → chunk-PQ62LZNA.js.map} +1 -1
  110. package/bundle/{chunk-UCQ2WC3B.js → chunk-PQW5QBPY.js} +15 -8
  111. package/bundle/chunk-PQW5QBPY.js.map +7 -0
  112. package/bundle/{chunk-D2DCBO6M.js → chunk-R36WIOYX.js} +3 -2
  113. package/bundle/{chunk-D2DCBO6M.js.map → chunk-R36WIOYX.js.map} +1 -1
  114. package/bundle/chunk-RB3X66KM.js +386 -0
  115. package/bundle/chunk-RB3X66KM.js.map +7 -0
  116. package/bundle/{chunk-GUQVJC3U.js → chunk-RE3F3CFW.js} +7 -6
  117. package/bundle/{chunk-GUQVJC3U.js.map → chunk-RE3F3CFW.js.map} +1 -1
  118. package/bundle/chunk-RWUINZUQ.js +19 -0
  119. package/bundle/chunk-RWUINZUQ.js.map +7 -0
  120. package/bundle/{chunk-NT3OBORC.js → chunk-S54DBUZ4.js} +10 -9
  121. package/bundle/{chunk-NT3OBORC.js.map → chunk-S54DBUZ4.js.map} +1 -1
  122. package/bundle/{chunk-CWOHNFUV.js → chunk-SY67HM2Y.js} +3 -2
  123. package/bundle/{chunk-CWOHNFUV.js.map → chunk-SY67HM2Y.js.map} +1 -1
  124. package/bundle/{chunk-BQ2L4GMG.js → chunk-TBLYGCPQ.js} +4 -3
  125. package/bundle/{chunk-BQ2L4GMG.js.map → chunk-TBLYGCPQ.js.map} +1 -1
  126. package/bundle/chunk-TCBMBX3Z.js +183 -0
  127. package/bundle/chunk-TCBMBX3Z.js.map +7 -0
  128. package/bundle/chunk-TXRWQIQQ.js +3707 -0
  129. package/bundle/chunk-TXRWQIQQ.js.map +7 -0
  130. package/bundle/chunk-U34CSHFS.js +645 -0
  131. package/bundle/chunk-U34CSHFS.js.map +7 -0
  132. package/bundle/{chunk-CEVRHKJY.js → chunk-UDZIZB5F.js} +6 -5
  133. package/bundle/{chunk-CEVRHKJY.js.map → chunk-UDZIZB5F.js.map} +1 -1
  134. package/bundle/{chunk-W6FAL35D.js → chunk-VA5WKN3Z.js} +7 -6
  135. package/bundle/{chunk-W6FAL35D.js.map → chunk-VA5WKN3Z.js.map} +1 -1
  136. package/bundle/{chunk-X6TERNVJ.js → chunk-WX7GHGFX.js} +10 -9
  137. package/bundle/{chunk-X6TERNVJ.js.map → chunk-WX7GHGFX.js.map} +1 -1
  138. package/bundle/{chunk-PNEDC45Y.js → chunk-XETTJVEU.js} +4 -3
  139. package/bundle/{chunk-PNEDC45Y.js.map → chunk-XETTJVEU.js.map} +1 -1
  140. package/bundle/{chunk-PLCY3GFH.js → chunk-XLLSPBBT.js} +5 -4
  141. package/bundle/{chunk-PLCY3GFH.js.map → chunk-XLLSPBBT.js.map} +1 -1
  142. package/bundle/{chunk-ZXPXCDA6.js → chunk-XOCP5BMO.js} +6 -5
  143. package/bundle/{chunk-ZXPXCDA6.js.map → chunk-XOCP5BMO.js.map} +1 -1
  144. package/bundle/chunk-ZEY6YZAB.js +138 -0
  145. package/bundle/chunk-ZEY6YZAB.js.map +7 -0
  146. package/bundle/{chunk-MW6WDLU7.js → chunk-ZZR3JZHR.js} +10 -9
  147. package/bundle/{chunk-MW6WDLU7.js.map → chunk-ZZR3JZHR.js.map} +1 -1
  148. package/bundle/commands-AIL4XOIZ.js +33 -0
  149. package/bundle/commands-K77NVSXZ.js +32 -0
  150. package/bundle/commands-V6RSVC4Y.js +32 -0
  151. package/bundle/completion-buffer-S3LXDZG2.js +14 -0
  152. package/bundle/config-C6VHRJQ7.js +20 -0
  153. package/bundle/{config-show-ERTATR6E.js → config-show-ZTXX27FW.js} +4 -3
  154. package/bundle/{config-show-ERTATR6E.js.map → config-show-ZTXX27FW.js.map} +1 -1
  155. package/bundle/{context-HCEGZNDC.js → context-OCS7HLJP.js} +5 -4
  156. package/bundle/{context-HCEGZNDC.js.map → context-OCS7HLJP.js.map} +1 -1
  157. package/bundle/daemon-NPKYZ3CJ.js +292 -0
  158. package/bundle/daemon-NPKYZ3CJ.js.map +7 -0
  159. package/bundle/delegation-tools-PF7RD2RW.js +28 -0
  160. package/bundle/{deploy-lib-import-32ZFKHWP.js → deploy-lib-import-ODLDL2DB.js} +5 -4
  161. package/bundle/digital-signature-PNY4TR2W.js +14 -0
  162. package/bundle/{direct-api-transport-YR7SXXNN.js → direct-api-transport-EADHM67Z.js} +21 -20
  163. package/bundle/{direct-api-transport-YR7SXXNN.js.map → direct-api-transport-EADHM67Z.js.map} +1 -1
  164. package/bundle/direct-api-transport-SLJ2Z6NX.js +861 -0
  165. package/bundle/direct-api-transport-SLJ2Z6NX.js.map +7 -0
  166. package/bundle/{discord-adapter-YYWVMPPU.js → discord-adapter-FBJOJSTW.js} +25 -24
  167. package/bundle/{discord-adapter-YYWVMPPU.js.map → discord-adapter-FBJOJSTW.js.map} +1 -1
  168. package/bundle/discord-adapter-IJISVHUE.js +585 -0
  169. package/bundle/discord-adapter-IJISVHUE.js.map +7 -0
  170. package/bundle/discord-adapter-UYOCKRDF.js +586 -0
  171. package/bundle/discord-adapter-UYOCKRDF.js.map +7 -0
  172. package/bundle/{dist-MTMKARCP.js → dist-J3T4XVKX.js} +4 -3
  173. package/bundle/{dist-MTMKARCP.js.map → dist-J3T4XVKX.js.map} +1 -1
  174. package/bundle/{dns-wakeup-27M7D2MR.js → dns-wakeup-RYOCQ6GR.js} +6 -5
  175. package/bundle/{dns-wakeup-27M7D2MR.js.map → dns-wakeup-RYOCQ6GR.js.map} +1 -1
  176. package/bundle/{doctor-QNUSDY73.js → doctor-R54GZPKL.js} +10 -9
  177. package/bundle/{doctor-QNUSDY73.js.map → doctor-R54GZPKL.js.map} +1 -1
  178. package/bundle/{ensure-invariants-NMXNS476.js → ensure-invariants-K2ZUZ6NR.js} +7 -6
  179. package/bundle/{ensure-invariants-NMXNS476.js.map → ensure-invariants-K2ZUZ6NR.js.map} +1 -1
  180. package/bundle/ensure-invariants-KUXIW73S.js +50 -0
  181. package/bundle/ensure-invariants-KUXIW73S.js.map +7 -0
  182. package/bundle/env-schema-DGD6QWPA.js +20 -0
  183. package/bundle/{esm-DDP6NCZG.js → esm-PFOJARXA.js} +5 -4
  184. package/bundle/{esm-DDP6NCZG.js.map → esm-PFOJARXA.js.map} +1 -1
  185. package/bundle/{fallback-policy-L4QV2PEJ.js → fallback-policy-SR6ED5I3.js} +4 -3
  186. package/bundle/{fallback-policy-L4QV2PEJ.js.map → fallback-policy-SR6ED5I3.js.map} +1 -1
  187. package/bundle/{health-check-SPA7NT6N.js → health-check-RJ2SUJYL.js} +4 -3
  188. package/bundle/{health-check-SPA7NT6N.js.map → health-check-RJ2SUJYL.js.map} +1 -1
  189. package/bundle/hook-system-POI5VRIX.js +18 -0
  190. package/bundle/hotskills-6ECHLXTJ.js +13 -0
  191. package/bundle/install-24XR5FO5.js +13 -0
  192. package/bundle/install-AJ7VW76P.js +13 -0
  193. package/bundle/{install-log-IAPHYKD4.js → install-log-Q6RUHKWC.js} +4 -3
  194. package/bundle/{install-log-IAPHYKD4.js.map → install-log-Q6RUHKWC.js.map} +1 -1
  195. package/bundle/{install-manifest-SPQRUNXL.js → install-manifest-MCJCAYSR.js} +9 -7
  196. package/bundle/install-manifest-MCJCAYSR.js.map +7 -0
  197. package/bundle/install-manifest-ZETY4AFS.js +104 -0
  198. package/bundle/install-manifest-ZETY4AFS.js.map +7 -0
  199. package/bundle/{install-validate-PVLZXYLQ.js → install-validate-H74LUCE2.js} +4 -3
  200. package/bundle/{install-validate-PVLZXYLQ.js.map → install-validate-H74LUCE2.js.map} +1 -1
  201. package/bundle/{irc-adapter-OI5UZSQF.js → irc-adapter-RKRUSZXB.js} +7 -6
  202. package/bundle/{irc-adapter-OI5UZSQF.js.map → irc-adapter-RKRUSZXB.js.map} +1 -1
  203. package/bundle/{irc-config-55YO6EGB.js → irc-config-6VY67UPQ.js} +8 -7
  204. package/bundle/{irc-config-55YO6EGB.js.map → irc-config-6VY67UPQ.js.map} +1 -1
  205. package/bundle/{logs-ZNYXX5PA.js → logs-EK4HYRKR.js} +4 -3
  206. package/bundle/{logs-ZNYXX5PA.js.map → logs-EK4HYRKR.js.map} +1 -1
  207. package/bundle/{media-utils-XNNDTYFI.js → media-utils-QBY5WBF3.js} +8 -7
  208. package/bundle/{media-utils-XNNDTYFI.js.map → media-utils-QBY5WBF3.js.map} +1 -1
  209. package/bundle/message-pipeline-ANSMPK5O.js +34 -0
  210. package/bundle/message-pipeline-HXZMRGXZ.js +34 -0
  211. package/bundle/message-pipeline-XUUTGPFH.js +35 -0
  212. package/bundle/meta.json +1828 -1650
  213. package/bundle/model-health-registry-7ECZFCW4.js +12 -0
  214. package/bundle/model-health-registry-LDC76RPP.js +12 -0
  215. package/bundle/notification-OJ4YE4VG.js +14 -0
  216. package/bundle/{openrouter-credits-EDY7ETAU.js → openrouter-credits-L45SYKT3.js} +7 -6
  217. package/bundle/{openrouter-credits-EDY7ETAU.js.map → openrouter-credits-L45SYKT3.js.map} +1 -1
  218. package/bundle/{passwd-RRFV4CC5.js → passwd-QSHZJ2CG.js} +4 -3
  219. package/bundle/{passwd-RRFV4CC5.js.map → passwd-QSHZJ2CG.js.map} +1 -1
  220. package/bundle/paths-ZJYIDND2.js +18 -0
  221. package/bundle/{peer-client-52XYMNI7.js → peer-client-T44VI7NB.js} +13 -12
  222. package/bundle/{peer-client-52XYMNI7.js.map → peer-client-T44VI7NB.js.map} +1 -1
  223. package/bundle/peer-config-D5A4454H.js +17 -0
  224. package/bundle/{peer-sessions-EAXTNQ36.js → peer-sessions-MY2YVXHC.js} +4 -3
  225. package/bundle/{peer-sessions-EAXTNQ36.js.map → peer-sessions-MY2YVXHC.js.map} +1 -1
  226. package/bundle/{pending-callback-RIMQZ7FJ.js → pending-callback-6KLBSHLX.js} +4 -3
  227. package/bundle/{pending-callback-RIMQZ7FJ.js.map → pending-callback-6KLBSHLX.js.map} +1 -1
  228. package/bundle/phase-transport-43NP5XBK.js +23 -0
  229. package/bundle/phase-transport-GNUZI6EW.js +23 -0
  230. package/bundle/phase-transport-Q7K6V3VZ.js +23 -0
  231. package/bundle/phase-transport-SLJXIAY5.js +23 -0
  232. package/bundle/{responses-adapter-AAQTY3K4.js → responses-adapter-DAV2JUL7.js} +4 -3
  233. package/bundle/{responses-adapter-AAQTY3K4.js.map → responses-adapter-DAV2JUL7.js.map} +1 -1
  234. package/bundle/{restore-ZE3SEPSS.js → restore-ROJF22R2.js} +5 -4
  235. package/bundle/{restore-ZE3SEPSS.js.map → restore-ROJF22R2.js.map} +1 -1
  236. package/bundle/{self-healer-utils-DMUUXC47.js → self-healer-utils-7NFH22VJ.js} +7 -6
  237. package/bundle/{self-healer-utils-DMUUXC47.js.map → self-healer-utils-7NFH22VJ.js.map} +1 -1
  238. package/bundle/skill-stats-IPVKMWN3.js +23 -0
  239. package/bundle/sleep-4NVWZHVN.js +20 -0
  240. package/bundle/soul-bundle-7EYTEKFE.js +15 -0
  241. package/bundle/soul-loader-7FN7WDHM.js +18 -0
  242. package/bundle/soul-loader-K237NP4T.js +17 -0
  243. package/bundle/soul-loader-K237NP4T.js.map +7 -0
  244. package/bundle/soul-loader-UVJ6HZM3.js +17 -0
  245. package/bundle/soul-loader-UVJ6HZM3.js.map +7 -0
  246. package/bundle/src-Z3WR7SRT.js +9 -0
  247. package/bundle/src-Z3WR7SRT.js.map +7 -0
  248. package/bundle/{sse-parser-anthropic-P7CE2MH2.js → sse-parser-anthropic-H42TTLBD.js} +7 -6
  249. package/bundle/{sse-parser-anthropic-P7CE2MH2.js.map → sse-parser-anthropic-H42TTLBD.js.map} +1 -1
  250. package/bundle/{sse-parser-responses-EQQA5FWN.js → sse-parser-responses-WG2LY2ML.js} +7 -6
  251. package/bundle/{sse-parser-responses-EQQA5FWN.js.map → sse-parser-responses-WG2LY2ML.js.map} +1 -1
  252. package/bundle/{ssrf-guard-FZCBYIVW.js → ssrf-guard-E2KBBC5E.js} +7 -6
  253. package/bundle/{ssrf-guard-FZCBYIVW.js.map → ssrf-guard-E2KBBC5E.js.map} +1 -1
  254. package/bundle/{start-FH3GRMJ4.js → start-4IWBKLWO.js} +4 -3
  255. package/bundle/{start-FH3GRMJ4.js.map → start-4IWBKLWO.js.map} +1 -1
  256. package/bundle/{stream-single-WSG4D53C.js → stream-single-RFJNUTL6.js} +4 -3
  257. package/bundle/{stream-single-WSG4D53C.js.map → stream-single-RFJNUTL6.js.map} +1 -1
  258. package/bundle/stt-CF3CPFDC.js +15 -0
  259. package/bundle/stt-CF3CPFDC.js.map +7 -0
  260. package/bundle/subagent-runtime-P7GCFBM3.js +13 -0
  261. package/bundle/subagent-runtime-P7GCFBM3.js.map +7 -0
  262. package/bundle/subagent-runtime-USNPO4WF.js +13 -0
  263. package/bundle/subagent-runtime-USNPO4WF.js.map +7 -0
  264. package/bundle/subagent-runtime-XS2ZXYOZ.js +13 -0
  265. package/bundle/subagent-runtime-XS2ZXYOZ.js.map +7 -0
  266. package/bundle/{system-message-T5R3EYYN.js → system-message-TALP6GP2.js} +6 -5
  267. package/bundle/{system-message-T5R3EYYN.js.map → system-message-TALP6GP2.js.map} +1 -1
  268. package/bundle/{system-status-KQ6KHFJ6.js → system-status-2CR5OUDY.js} +10 -9
  269. package/bundle/{system-status-KQ6KHFJ6.js.map → system-status-2CR5OUDY.js.map} +1 -1
  270. package/bundle/task-store-KIBFZL5A.js +23 -0
  271. package/bundle/task-store-KIBFZL5A.js.map +7 -0
  272. package/bundle/{telegram-adapter-2V3XUMT5.js → telegram-adapter-ISQRW7PN.js} +34 -33
  273. package/bundle/{telegram-adapter-2V3XUMT5.js.map → telegram-adapter-ISQRW7PN.js.map} +1 -1
  274. package/bundle/telegram-adapter-QCD7AG5D.js +1062 -0
  275. package/bundle/telegram-adapter-QCD7AG5D.js.map +7 -0
  276. package/bundle/telegram-adapter-Y3PVA25S.js +1061 -0
  277. package/bundle/telegram-adapter-Y3PVA25S.js.map +7 -0
  278. package/bundle/telegram-adapter-YAXSK2RT.js +1062 -0
  279. package/bundle/telegram-adapter-YAXSK2RT.js.map +7 -0
  280. package/bundle/tool-registry-DFCCGZCB.js +39 -0
  281. package/bundle/tool-registry-DFCCGZCB.js.map +7 -0
  282. package/bundle/tool-sandbox-OZMXJZLQ.js +21 -0
  283. package/bundle/tool-sandbox-OZMXJZLQ.js.map +7 -0
  284. package/bundle/{transport-config-YLXU33RO.js → transport-config-ANPS2RYT.js} +11 -10
  285. package/bundle/transport-config-ANPS2RYT.js.map +7 -0
  286. package/bundle/update-check-O5MS6B3L.js +13 -0
  287. package/bundle/update-check-O5MS6B3L.js.map +7 -0
  288. package/bundle/usage-tracker-S4Z2G2K5.js +18 -0
  289. package/bundle/usage-tracker-S4Z2G2K5.js.map +7 -0
  290. package/bundle/user-registry-GTAJIW6E.js +17 -0
  291. package/bundle/user-registry-GTAJIW6E.js.map +7 -0
  292. package/config/.env +2 -0
  293. package/config/auto-fix.json +14 -0
  294. package/config/irc.json.example +30 -0
  295. package/config/models.json.example +229 -0
  296. package/config/peers.json.example +12 -0
  297. package/config/schemas/irc.schema.json +42 -0
  298. package/config/schemas/models.schema.json +17 -0
  299. package/config/schemas/peers.schema.json +35 -0
  300. package/config/schemas/transport.schema.json +35 -0
  301. package/config/schemas/users.schema.json +22 -0
  302. package/config/transport.default.json +30 -0
  303. package/config/transport.json.example +102 -0
  304. package/config/users.json.example +11 -0
  305. package/install-manifest.json +148 -0
  306. package/package.json +4 -2
  307. package/scripts/abtars-daemon.service +1 -0
  308. package/scripts/watchdog.sh +1 -1
  309. package/bundle/_registry.generated-M4WY2MMI.js +0 -35
  310. package/bundle/agent-registry-LT4JNQH6.js +0 -18
  311. package/bundle/browse-delivery-JXBY36GK.js +0 -17
  312. package/bundle/browser-ELNDVPLC.js +0 -18
  313. package/bundle/capability-CIL3G4FI.js +0 -17
  314. package/bundle/chunk-5R2ANXQ7.js +0 -510
  315. package/bundle/chunk-5R2ANXQ7.js.map +0 -7
  316. package/bundle/chunk-6UCRKRWR.js.map +0 -7
  317. package/bundle/chunk-M6VBAPNT.js +0 -16
  318. package/bundle/chunk-OP7BTAWY.js +0 -29
  319. package/bundle/chunk-UCQ2WC3B.js.map +0 -7
  320. package/bundle/chunk-XREWVCUO.js.map +0 -7
  321. package/bundle/chunk-Y6XAEX2Q.js.map +0 -7
  322. package/bundle/commands-BHVUOU3V.js +0 -31
  323. package/bundle/completion-buffer-P253ONKF.js +0 -13
  324. package/bundle/config-RGSDAPZN.js +0 -19
  325. package/bundle/delegation-tools-GYTS2D6A.js +0 -27
  326. package/bundle/digital-signature-OFCGSHWO.js +0 -13
  327. package/bundle/env-schema-2KBHBDGN.js +0 -19
  328. package/bundle/hook-system-6Q5YTR53.js +0 -17
  329. package/bundle/hotskills-K7BM4YLB.js +0 -12
  330. package/bundle/install-6HRZVKUM.js +0 -15
  331. package/bundle/install-manifest-SPQRUNXL.js.map +0 -7
  332. package/bundle/message-pipeline-LLH5SYMO.js +0 -33
  333. package/bundle/model-health-registry-35LQNVQR.js +0 -11
  334. package/bundle/notification-Y5S5MMLV.js +0 -13
  335. package/bundle/paths-G33RZWZ7.js +0 -17
  336. package/bundle/peer-config-VK6EDLN5.js +0 -16
  337. package/bundle/phase-transport-KYERDL2O.js +0 -22
  338. package/bundle/skill-stats-LLEXEXLR.js +0 -22
  339. package/bundle/sleep-OYIUOVQD.js +0 -19
  340. package/bundle/soul-loader-54WCVNLJ.js +0 -16
  341. package/bundle/src-JL4PVO23.js +0 -8
  342. package/bundle/stt-2UH3RITX.js +0 -14
  343. package/bundle/subagent-runtime-LE2ZXH3G.js +0 -12
  344. package/bundle/task-store-K7CQDEPI.js +0 -22
  345. package/bundle/tool-registry-MU3OX4UI.js +0 -38
  346. package/bundle/tool-sandbox-VYOK4ZOA.js +0 -20
  347. package/bundle/update-QCW5LXRN.js +0 -13
  348. package/bundle/update-check-27KZSAP6.js +0 -12
  349. package/bundle/usage-tracker-OVVEVMOY.js +0 -17
  350. package/bundle/user-registry-D4SD73UV.js +0 -16
  351. /package/bundle/{agent-registry-LT4JNQH6.js.map → agent-registry-5M77ZOMV.js.map} +0 -0
  352. /package/bundle/{bridge-lock-transport-4AC2G5G6.js.map → agent-registry-VJMNIQ5W.js.map} +0 -0
  353. /package/bundle/{browse-delivery-JXBY36GK.js.map → bridge-lock-transport-HO545SBK.js.map} +0 -0
  354. /package/bundle/{browser-ELNDVPLC.js.map → browse-delivery-64GQIUHG.js.map} +0 -0
  355. /package/bundle/{capability-CIL3G4FI.js.map → browser-EXR5OQGK.js.map} +0 -0
  356. /package/bundle/{chunk-NWDBD4PA.js.map → capability-HIE7UGFU.js.map} +0 -0
  357. /package/bundle/{commands-BHVUOU3V.js.map → chunk-7K2YZTLD.js.map} +0 -0
  358. /package/bundle/{completion-buffer-P253ONKF.js.map → commands-AIL4XOIZ.js.map} +0 -0
  359. /package/bundle/{config-RGSDAPZN.js.map → commands-K77NVSXZ.js.map} +0 -0
  360. /package/bundle/{delegation-tools-GYTS2D6A.js.map → commands-V6RSVC4Y.js.map} +0 -0
  361. /package/bundle/{deploy-lib-import-32ZFKHWP.js.map → completion-buffer-S3LXDZG2.js.map} +0 -0
  362. /package/bundle/{digital-signature-OFCGSHWO.js.map → config-C6VHRJQ7.js.map} +0 -0
  363. /package/bundle/{env-schema-2KBHBDGN.js.map → delegation-tools-PF7RD2RW.js.map} +0 -0
  364. /package/bundle/{hook-system-6Q5YTR53.js.map → deploy-lib-import-ODLDL2DB.js.map} +0 -0
  365. /package/bundle/{hotskills-K7BM4YLB.js.map → digital-signature-PNY4TR2W.js.map} +0 -0
  366. /package/bundle/{install-6HRZVKUM.js.map → env-schema-DGD6QWPA.js.map} +0 -0
  367. /package/bundle/{message-pipeline-LLH5SYMO.js.map → hook-system-POI5VRIX.js.map} +0 -0
  368. /package/bundle/{model-health-registry-35LQNVQR.js.map → hotskills-6ECHLXTJ.js.map} +0 -0
  369. /package/bundle/{notification-Y5S5MMLV.js.map → install-24XR5FO5.js.map} +0 -0
  370. /package/bundle/{paths-G33RZWZ7.js.map → install-AJ7VW76P.js.map} +0 -0
  371. /package/bundle/{peer-config-VK6EDLN5.js.map → message-pipeline-ANSMPK5O.js.map} +0 -0
  372. /package/bundle/{phase-transport-KYERDL2O.js.map → message-pipeline-HXZMRGXZ.js.map} +0 -0
  373. /package/bundle/{skill-stats-LLEXEXLR.js.map → message-pipeline-XUUTGPFH.js.map} +0 -0
  374. /package/bundle/{sleep-OYIUOVQD.js.map → model-health-registry-7ECZFCW4.js.map} +0 -0
  375. /package/bundle/{soul-loader-54WCVNLJ.js.map → model-health-registry-LDC76RPP.js.map} +0 -0
  376. /package/bundle/{src-JL4PVO23.js.map → notification-OJ4YE4VG.js.map} +0 -0
  377. /package/bundle/{stt-2UH3RITX.js.map → paths-ZJYIDND2.js.map} +0 -0
  378. /package/bundle/{subagent-runtime-LE2ZXH3G.js.map → peer-config-D5A4454H.js.map} +0 -0
  379. /package/bundle/{task-store-K7CQDEPI.js.map → phase-transport-43NP5XBK.js.map} +0 -0
  380. /package/bundle/{tool-registry-MU3OX4UI.js.map → phase-transport-GNUZI6EW.js.map} +0 -0
  381. /package/bundle/{tool-sandbox-VYOK4ZOA.js.map → phase-transport-Q7K6V3VZ.js.map} +0 -0
  382. /package/bundle/{transport-config-YLXU33RO.js.map → phase-transport-SLJXIAY5.js.map} +0 -0
  383. /package/bundle/{update-QCW5LXRN.js.map → skill-stats-IPVKMWN3.js.map} +0 -0
  384. /package/bundle/{update-check-27KZSAP6.js.map → sleep-4NVWZHVN.js.map} +0 -0
  385. /package/bundle/{usage-tracker-OVVEVMOY.js.map → soul-bundle-7EYTEKFE.js.map} +0 -0
  386. /package/bundle/{user-registry-D4SD73UV.js.map → soul-loader-7FN7WDHM.js.map} +0 -0
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/cli/commands/update.ts", "../src/cli/update-sources/local.ts", "../src/cli/update-sources/npm.ts", "../src/components/hints.ts"],
4
- "sourcesContent": ["/**\n * `abtars update` \u2014 build current checkout, stage new release, flip symlink.\n *\n * Phase 1 implements --source local only. Other sources error with a\n * \"not yet supported\" stub (Phase 5 will add NpmSource).\n */\n\nimport { logAndSwallow } from \"../../components/log-and-swallow.js\";\nimport { hostname } from 'node:os';\nimport { join } from 'node:path';\nimport { readFileSync, existsSync, mkdirSync } from 'node:fs';\nimport { copyFile, mkdir, chmod, readdir, readFile, writeFile } from 'node:fs/promises';\nimport { makeLocalBuildSource } from '../update-sources/local.js';\nimport { makeNpmSource } from '../update-sources/npm.js';\nimport type { SourceName } from '../update-sources/types.js';\nimport { acquireLock, activate, emptyManifest, hashFile, packagePaths, pruneReleases, readManifest, writeManifest, RETENTION, type PriorRelease } from '../deploy-lib-import.js';\nimport { showHintOnce } from '../../components/hints.js';\n\nfunction readJsonField(file: string, field: string): unknown {\n try { return JSON.parse(readFileSync(file, 'utf-8'))[field]; } catch { return undefined; }\n}\n\nexport interface UpdateOptions {\n readonly source: SourceName;\n readonly fromLocal: boolean;\n readonly allowAbmindMismatch: boolean;\n}\n\nexport async function update(opts: UpdateOptions): Promise<number> {\n if (opts.source !== 'local' && opts.source !== 'npm') {\n process.stderr.write(`--source ${opts.source} is not yet supported.\\nUse --source local (default) or --source npm.\\n`);\n return 2;\n }\n\n const paths = packagePaths('abtars');\n\n // Auto-migrate old flat layout (current/main.js without releases/) \u2192 create releases dir\n if (!existsSync(paths.releases) && existsSync(join(paths.home, 'current'))) {\n process.stdout.write('Migrating old layout \u2192 releases/...\\n');\n mkdirSync(paths.releases, { recursive: true });\n }\n const release = await acquireLock(paths.lock, `update --source ${opts.source}`);\n\n try {\n const source = opts.source === 'npm'\n ? makeNpmSource('abtars')\n : makeLocalBuildSource({ repoRoot: process.cwd(), allowStale: opts.fromLocal });\n if (opts.fromLocal) {\n showHintOnce(\"update-from-local\", \"Building from working copy (--from-local). To sync with remote first: git pull && abtars update\");\n }\n process.stdout.write(`Building from local checkout (${process.cwd()})...\\n`);\n const staged = await source.prepare({\n releasesDir: paths.releases,\n nodeModulesDir: paths.nodeModules,\n home: paths.home,\n allowStale: opts.fromLocal,\n });\n process.stdout.write(`\u2713 staged ${staged.version} at ${staged.stagedPath}\\n`);\n\n // Install external runtime deps at the release dir (#582)\n {\n const pkgPath = join(staged.stagedPath, \"package.json\");\n const { readFileSync, writeFileSync } = await import(\"node:fs\");\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\"));\n const externals: Record<string, string> = { patchright: \"^1.59.4\", \"rettiwt-api\": \"^4.1.3\" };\n pkg.dependencies = { ...pkg.dependencies, ...externals };\n writeFileSync(pkgPath, JSON.stringify(pkg, null, 2) + \"\\n\");\n const { execSync } = await import(\"node:child_process\");\n execSync(\"npm install --omit=dev --ignore-scripts 2>/dev/null\", { cwd: staged.stagedPath, timeout: 60_000 });\n process.stdout.write(`\u2713 external deps installed\\n`);\n } catch (err) {\n process.stdout.write(`\u26A0 external deps install failed: ${err instanceof Error ? err.message : String(err)}\\n`);\n }\n }\n\n // Create stable entry point symlink (main.js \u2192 bundle or dist)\n {\n const { existsSync, unlinkSync, symlinkSync } = await import(\"node:fs\");\n const mainLink = join(staged.stagedPath, \"main.js\");\n try { unlinkSync(mainLink); } catch (err) { logAndSwallow(\"update\", \"op\", err); }\n const entry = existsSync(join(staged.stagedPath, \"bundle\", \"abtars.js\"))\n ? \"bundle/abtars.js\"\n : \"dist/main.js\";\n symlinkSync(entry, mainLink);\n }\n\n // Preserve abmind symlinks from old release (#722)\n const { existsSync: ex2, lstatSync, readlinkSync, symlinkSync: sl2, mkdirSync: mk2 } = await import(\"node:fs\");\n const oldNm = join(paths.home, \"current\", \"node_modules\");\n const preservedLinks: Array<{ name: string; target: string }> = [];\n if (ex2(oldNm)) {\n for (const name of [\"abmind\", \"better-sqlite3\"]) {\n const p = join(oldNm, name);\n try { if (ex2(p) && lstatSync(p).isSymbolicLink()) preservedLinks.push({ name, target: readlinkSync(p) }); } catch { /* skip */ }\n }\n }\n\n // Flip current \u2192 releases/<version>\n await activate(paths.current, staged.version);\n process.stdout.write(`\u2713 current -> releases/${staged.version}\\n`);\n\n // Recreate preserved symlinks in new release\n if (preservedLinks.length > 0) {\n const newNm = join(paths.home, \"current\", \"node_modules\");\n mk2(newNm, { recursive: true });\n for (const { name, target } of preservedLinks) {\n try { sl2(target, join(newNm, name)); } catch { /* best effort */ }\n }\n }\n\n // Update manifest\n const prior = await readManifest(paths.manifest);\n const now = new Date().toISOString();\n const newPriorReleases = prior?.version\n ? [\n {\n version: prior.version,\n commit: prior.commit,\n activatedAt: prior.activatedAt,\n packageLockHash: prior.packageLockHash,\n },\n ...(prior.priorReleases ?? []),\n ].slice(0, RETENTION - 1)\n : prior?.priorReleases ?? [];\n\n await writeManifest(paths.manifest, {\n ...(prior ?? emptyManifest('abtars', hostname())),\n version: staged.version,\n commit: staged.commit,\n branch: staged.branch,\n packageLockHash: staged.packageLockHash,\n activatedAt: now,\n source: 'local',\n priorReleases: newPriorReleases,\n });\n process.stdout.write(`\u2713 manifest updated\\n`);\n\n // Prune old releases\n const pruned = await pruneReleases(\n paths.releases,\n [staged.version, ...newPriorReleases.map((r: PriorRelease) => r.version)],\n staged.version,\n RETENTION,\n );\n if (pruned.length > 0) {\n process.stdout.write(`\u2713 pruned ${pruned.length} old release${pruned.length === 1 ? '' : 's'}: ${pruned.join(', ')}\\n`);\n }\n\n process.stdout.write(`\\nUpdate complete: ${staged.version}\\n`);\n\n // Refresh scripts from repo \u2014 manifest-driven\n const { loadManifest } = await import('../install-manifest.js');\n const installManifest = loadManifest(process.cwd());\n const repoScripts = join(process.cwd(), 'scripts');\n const destScripts = join(paths.home, 'scripts');\n await mkdir(destScripts, { recursive: true });\n const allScriptFiles = await readdir(repoScripts).catch(() => [] as string[]);\n // Filter by manifest include patterns\n const matchesInclude = (name: string): boolean =>\n installManifest.scripts.include.some(pattern => {\n const ext = pattern.replace(\"*\", \"\");\n return name.endsWith(ext);\n });\n const scriptFiles = allScriptFiles.filter(matchesInclude);\n const home = process.env['HOME'] ?? '';\n let serviceChanged = false;\n\n // Resolve install mode \u2014 skip supervisor artifacts in simple mode\n const installMode = (await readManifest(paths.manifest))?.installMode ?? \"supervised\";\n\n const isExecutable = (name: string): boolean => {\n const ext = installManifest.scripts.executable.replace(\"*\", \"\");\n return name.endsWith(ext);\n };\n\n for (const name of scriptFiles) {\n await copyFile(join(repoScripts, name), join(destScripts, name));\n if (isExecutable(name)) await chmod(join(destScripts, name), 0o755);\n // Root-level copies for launcher scripts watchdog/launchd reference directly\n if (isExecutable(name)) {\n await copyFile(join(repoScripts, name), join(paths.home, name));\n await chmod(join(paths.home, name), 0o755);\n }\n // macOS: template + install LaunchAgent plist (supervised only)\n const macService = installManifest.services.supervised.macos;\n if (macService && name === macService.plist && process.platform === 'darwin' && home && installMode === 'supervised') {\n const launchAgentsDir = join(home, 'Library', 'LaunchAgents');\n await mkdir(launchAgentsDir, { recursive: true });\n const dst = join(launchAgentsDir, name);\n const oldContent = await readFile(dst, 'utf-8').catch(() => '');\n let templated = await readFile(join(repoScripts, name), 'utf-8');\n for (const ph of macService.placeholders) templated = templated.replaceAll(ph, home);\n await writeFile(dst, templated);\n if (oldContent !== templated) serviceChanged = true;\n }\n // Linux: install systemd user service (supervised only)\n const linuxService = installManifest.services.supervised.linux;\n if (linuxService?.units.includes(name) && process.platform === 'linux' && home && installMode === 'supervised') {\n const systemdDir = join(home, '.config', 'systemd', 'user');\n await mkdir(systemdDir, { recursive: true });\n const dst = join(systemdDir, name);\n const oldContent = await readFile(dst, 'utf-8').catch(() => '');\n await copyFile(join(repoScripts, name), dst);\n const newContent = await readFile(dst, 'utf-8').catch(() => '');\n if (oldContent !== newContent) serviceChanged = true;\n }\n }\n process.stdout.write(`\u2713 scripts refreshed (${scriptFiles.length} files)\\n`);\n\n // Regenerate CLI bin wrappers (#310) \u2014 keeps wrapper paths in sync with build layout\n const { writeWrapper } = await import('./install.js');\n await mkdir(paths.bin, { recursive: true });\n for (const name of installManifest.cliWrappers) {\n await writeWrapper(paths.bin, name, paths.current, false);\n }\n process.stdout.write(`\u2713 wrappers refreshed (${installManifest.cliWrappers.length} files)\\n`);\n\n // Sync core skills from release to runtime (#438)\n const { rmSync, cpSync, readdirSync } = await import(\"node:fs\");\n const skillsCoreSrc = join(staged.stagedPath, \"core\", \"skills\");\n const skillsCoreDst = join(paths.home, \"skills\", \"core\");\n if (existsSync(skillsCoreSrc)) {\n rmSync(skillsCoreDst, { recursive: true, force: true });\n cpSync(skillsCoreSrc, skillsCoreDst, { recursive: true });\n const files = readdirSync(skillsCoreDst, { recursive: true }) as string[];\n const count = files.filter(f => f.endsWith(\"SKILL.md\")).length;\n process.stdout.write(`\u2713 skills/core synced (${count} skills)\\n`);\n }\n // Ensure other skill dirs exist\n for (const d of [\"custom\", \"downloaded\", \"self\"]) {\n await mkdir(join(paths.home, \"skills\", d), { recursive: true });\n }\n // Migration (#614): remove stale pre-#438 top-level skill dirs (duplicates of core/)\n for (const stale of [\"memory\", \"ops\", \"tools\", \"coding\"]) {\n const p = join(paths.home, \"skills\", stale);\n if (existsSync(p)) { rmSync(p, { recursive: true, force: true }); }\n }\n\n if (serviceChanged) {\n if (process.platform === 'darwin') {\n process.stdout.write(`\u26A0\uFE0F LaunchAgent plist updated \u2014 reload with: launchctl bootout gui/$(id -u)/com.abtars.watchdog && launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.abtars.watchdog.plist\\n`);\n } else {\n process.stdout.write(`\u26A0\uFE0F systemd service updated \u2014 reload with: systemctl --user daemon-reload && systemctl --user restart abtars-watchdog\\n`);\n }\n }\n\n\n // hashFile is unused here but imported to validate the re-export surface;\n // leaving this no-op call removed \u2014 the re-export is exercised by tests.\n void hashFile;\n\n // #426 \u2014 Seed missing config + run config migrations\n const { ensureInstallInvariants } = await import(\"../ensure-invariants.js\");\n const invariantResults = await ensureInstallInvariants(process.cwd(), paths.home);\n if (invariantResults.length > 0) {\n process.stdout.write(`\u2713 invariants: ${invariantResults.join(\", \")}\\n`);\n }\n\n // Native deps (sqlite-vec, better-sqlite3) handled by `abmind install` (#716)\n\n // Run doctor before restart\n const doctorPath = join(paths.home, \"scripts\", \"doctor.sh\");\n if (existsSync(doctorPath)) {\n process.stdout.write(\"\\n\uD83E\uDE7A Health check...\\n\");\n try {\n const { execSync } = await import(\"node:child_process\");\n execSync(`bash \"${doctorPath}\" --fix`, { stdio: \"inherit\", timeout: 30_000 });\n } catch (err) {\n process.stderr.write(`\u26A0\uFE0F doctor --fix failed: ${err instanceof Error ? err.message : String(err)}\\n`);\n }\n }\n\n // Auto-restart bridge on new code\n const manifestForRestart = await readManifest(paths.manifest);\n const restartMode = manifestForRestart?.installMode;\n if (!restartMode) {\n process.stderr.write(\"\u274C installMode not set in manifest.json. Run 'abtars install' first.\\n\");\n return 1;\n }\n\n if (restartMode === \"supervised-daemon\" || restartMode === \"supervised\") {\n // Send USR1 to watchdog for graceful restart (#688)\n process.stdout.write(\"\\nRestarting bridge via watchdog...\\n\");\n const wdLock = join(paths.home, \"watchdog.lock\");\n const wdPid = readJsonField(wdLock, \"pid\") as number | undefined;\n if (wdPid && wdPid > 0) {\n try {\n process.kill(wdPid, \"SIGUSR1\");\n process.stdout.write(`\u267B\uFE0F USR1 sent to watchdog (PID ${wdPid}) \u2014 bridge will restart\\n`);\n } catch {\n process.stdout.write(`\u26A0\uFE0F Could not signal watchdog (PID ${wdPid}). Restart manually:\\n`);\n if (process.platform === \"darwin\") {\n process.stdout.write(` launchctl kickstart -k gui/$(id -u)/com.abtars.watchdog\\n`);\n } else {\n process.stdout.write(` systemctl --user restart abtars-watchdog\\n`);\n }\n }\n } else {\n // No watchdog running \u2014 fall back to cold restart\n process.stdout.write(`\u26A0\uFE0F Watchdog not running. Cold restart...\\n`);\n const { restart } = await import(\"./restart.js\");\n await restart({ cold: true }).catch((err: unknown) => {\n process.stderr.write(`\u26A0\uFE0F Restart failed: ${err instanceof Error ? err.message : String(err)}\\n`);\n });\n }\n } else {\n // simple mode: no watchdog, cold restart\n process.stdout.write(\"\\nRestarting bridge...\\n\");\n const { restart } = await import(\"./restart.js\");\n await restart({ cold: true }).catch((err: unknown) => {\n process.stderr.write(`\u26A0\uFE0F Restart failed: ${err instanceof Error ? err.message : String(err)}\\n`);\n });\n }\n\n const { printHealthSummary } = await import('./health-check.js');\n printHealthSummary(paths.home);\n\n return 0;\n } finally {\n await release();\n }\n}\n", "/**\n * LocalBuildSource: the Phase 1 adapter. Builds the current working-tree\n * checkout and stages the output into releases/<version>/dist/.\n *\n * Staleness guard: runs `git fetch` and refuses to proceed if HEAD is behind\n * origin/<branch>, unless allowStale (--from-local) is passed. Handles the\n * detached-HEAD / no-upstream / unpushed edge cases with a friendly message.\n *\n * Version string: `<package-version>-<short-sha>`, e.g. `0.1.0-28f71ef`.\n * Uniqueness: if the same version is staged twice, the second stage\n * overwrites (rsync --delete semantics via rm + cp). Rare; only happens when\n * operator runs update twice without changing a commit or bumping version.\n */\n\nimport { spawnSync } from 'node:child_process';\nimport { existsSync } from 'node:fs';\nimport { copyFile, cp, mkdir, readFile, rm, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { hashFile } from '../deploy-lib-import.js';\nimport type { PrepareContext, StagedRelease, UpdateSource } from './types.js';\n\nexport class LocalBuildError extends Error {\n constructor(\n message: string,\n public readonly hint?: string,\n ) {\n super(hint ? `${message}\\n\\n${hint}` : message);\n this.name = 'LocalBuildError';\n }\n}\n\nexport interface LocalBuildOptions {\n /** Repository root for the build (defaults to process.cwd()). */\n readonly repoRoot?: string;\n /** If true, skip the behind-origin guard. Operator opt-in. */\n readonly allowStale?: boolean;\n /** If true, skip `npm install` (assume node_modules is already current). */\n readonly skipInstall?: boolean;\n}\n\nfunction runCmd(cmd: string, args: readonly string[], cwd: string): string {\n const r = spawnSync(cmd, args, { cwd, encoding: 'utf-8' });\n if (r.error) throw new LocalBuildError(`${cmd} ${args.join(' ')} failed: ${r.error.message}`);\n if (r.status !== 0) {\n throw new LocalBuildError(\n `${cmd} ${args.join(' ')} exited with status ${r.status}`,\n r.stderr?.trim() || undefined,\n );\n }\n return r.stdout.trim();\n}\n\nfunction tryCmd(cmd: string, args: readonly string[], cwd: string): string | null {\n const r = spawnSync(cmd, args, { cwd, encoding: 'utf-8' });\n if (r.status !== 0) return null;\n return r.stdout.trim();\n}\n\nfunction checkStaleness(repoRoot: string, allowStale: boolean): { commit: string; branch: string | null } {\n const commit = runCmd('git', ['rev-parse', '--short', 'HEAD'], repoRoot);\n const branch = tryCmd('git', ['rev-parse', '--abbrev-ref', 'HEAD'], repoRoot);\n if (allowStale) return { commit, branch: branch === 'HEAD' ? null : branch };\n\n // Detached HEAD / no-branch case\n if (branch === 'HEAD' || branch === null) {\n throw new LocalBuildError(\n 'Working tree is in detached HEAD (no current branch).',\n 'Cannot check for staleness. Pass --from-local to proceed with the current tree.',\n );\n }\n\n // Fetch to refresh origin refs. Not --unshallow; caller may have a shallow clone intentionally.\n runCmd('git', ['fetch', '--quiet'], repoRoot);\n\n // Does the branch have an upstream?\n const upstream = tryCmd('git', ['rev-parse', '--abbrev-ref', `${branch}@{upstream}`], repoRoot);\n if (upstream === null) {\n throw new LocalBuildError(\n `Branch '${branch}' has no upstream configured.`,\n 'Cannot check for staleness. Push the branch, or pass --from-local to proceed with the current tree.',\n );\n }\n\n // How many commits is HEAD behind upstream?\n const behindStr = tryCmd('git', ['rev-list', '--count', `HEAD..${upstream}`], repoRoot);\n const behind = behindStr === null ? null : Number(behindStr);\n if (behind === null || !Number.isFinite(behind)) {\n throw new LocalBuildError(\n `Could not determine how far HEAD is behind ${upstream}.`,\n 'Pass --from-local to proceed anyway.',\n );\n }\n if (behind > 0) {\n throw new LocalBuildError(\n `Current branch: ${branch} (${commit})\\n${upstream} is ahead by ${behind} commit${behind === 1 ? '' : 's'}.`,\n `Run 'git pull' first, or pass --from-local to build from the current tree.`,\n );\n }\n\n return { commit, branch };\n}\n\nasync function readPackageVersion(repoRoot: string): Promise<string> {\n const pkg = JSON.parse(await readFile(join(repoRoot, 'package.json'), 'utf-8')) as { version?: string };\n if (typeof pkg.version !== 'string') {\n throw new LocalBuildError('package.json has no version field.');\n }\n return pkg.version;\n}\n\nexport function makeLocalBuildSource(opts: LocalBuildOptions = {}): UpdateSource {\n const repoRoot = opts.repoRoot ?? process.cwd();\n return {\n name: 'local',\n async prepare(ctx: PrepareContext): Promise<StagedRelease> {\n const { commit, branch } = checkStaleness(repoRoot, opts.allowStale === true || ctx.allowStale);\n const pkgVersion = await readPackageVersion(repoRoot);\n const version = `${pkgVersion}-${commit}`;\n\n // Install deps into the shared node_modules/ (if not skipped).\n if (opts.skipInstall !== true) {\n runCmd('npm', ['install', '--no-audit', '--no-fund'], repoRoot);\n }\n\n // Build: bundle mode (esbuild) or legacy mode (tsc)\n const useBundle = process.env['AGENTBRIDGE_BUILD_MODE'] !== 'tsc';\n\n if (useBundle) {\n // Bundle mode: esbuild \u2192 bundle/ + pruned native deps\n runCmd('npm', ['run', 'bundle'], repoRoot);\n\n const stagedPath = join(ctx.releasesDir, version);\n await rm(stagedPath, { recursive: true, force: true });\n await mkdir(stagedPath, { recursive: true });\n await cp(join(repoRoot, 'bundle'), join(stagedPath, 'bundle'), { recursive: true });\n\n // Copy core skills for runtime sync (#438)\n const coreSkillsSrc = join(repoRoot, 'core', 'skills');\n if (existsSync(coreSkillsSrc)) {\n await cp(coreSkillsSrc, join(stagedPath, 'core', 'skills'), { recursive: true });\n }\n\n // Ensure ESM works without warnings (MODULE_TYPELESS_PACKAGE_JSON)\n await writeFile(join(stagedPath, 'package.json'), JSON.stringify({ type: \"module\", name: \"abtars\", version }, null, 2) + \"\\n\");\n\n // Copy install-manifest.json for doctor reconciliation\n await copyFile(join(repoRoot, 'install-manifest.json'), join(stagedPath, 'install-manifest.json'));\n\n // Native addons (better-sqlite3, sqlite-vec) live at ~/.abmind/lib/node_modules/\n // and are loaded via native-loader.ts from there. No need to copy into release.\n // See #431 (persistent install) + native-loader.ts.\n\n const packageLockHash = await hashFile(join(repoRoot, 'package-lock.json'));\n return { version, stagedPath, commit, branch, packageLockHash, source: 'local' };\n }\n\n // Legacy tsc mode (AGENTBRIDGE_BUILD_MODE=tsc)\n runCmd('npm', ['run', 'build'], repoRoot);\n\n // Stage releases/<version>/dist/\n const stagedPath = join(ctx.releasesDir, version);\n await rm(stagedPath, { recursive: true, force: true });\n await mkdir(stagedPath, { recursive: true });\n await cp(join(repoRoot, 'dist'), join(stagedPath, 'dist'), { recursive: true });\n\n // Copy install-manifest.json for doctor reconciliation\n await copyFile(join(repoRoot, 'install-manifest.json'), join(stagedPath, 'install-manifest.json'));\n\n // Sync node_modules/ to the shared location.\n //\n // Use `rsync -aL` to DEREFERENCE symlinks \u2014 critical because\n // package.json `\"abmind\": \"file:../abmind\"` creates a symlink at\n // node_modules/abmind pointing into the dev workspace. Plain cp\n // preserves the symlink, so the runtime ends up with abmind code\n // served from the developer's working tree (active live edits +\n // test-suite contention on memory.db). We want a materialized copy.\n //\n // Delete destination first so rsync's --delete is unnecessary (and\n // safer \u2014 we don't want to rsync-delete anything outside).\n await rm(ctx.nodeModulesDir, { recursive: true, force: true });\n await mkdir(ctx.nodeModulesDir, { recursive: true });\n const rsyncResult = spawnSync(\n 'rsync',\n ['-aL', '--quiet', `${join(repoRoot, 'node_modules')}/`, `${ctx.nodeModulesDir}/`],\n { stdio: 'inherit' },\n );\n if (rsyncResult.status !== 0) {\n throw new LocalBuildError(\n `rsync of node_modules failed (status ${rsyncResult.status ?? -1})`,\n `Ensure rsync is installed. Falling back to node cp would re-create symlinks.`,\n );\n }\n\n // Note: abmind's nested node_modules/ (rsync'd from its dev workspace)\n // stays in place. Previously deleted to avoid duplicate better-sqlite3\n // native-addon conflict (#230-related), but since f24b33f removed\n // better-sqlite3 from abtars's deps, abmind's nested copy is the\n // only one and must remain \u2014 deleting it breaks module resolution for\n // abmind at runtime ('Cannot find package better-sqlite3').\n\n const packageLockHash = await hashFile(join(repoRoot, 'package-lock.json'));\n\n return { version, stagedPath, commit, branch, packageLockHash, source: 'local' };\n },\n };\n}\n", "/**\n * NpmSource: fetch latest published version from npm registry (#462).\n * Downloads tarball, extracts, installs prod deps, stages.\n */\n\nimport { spawnSync } from \"node:child_process\";\nimport { existsSync, readFileSync, unlinkSync } from \"node:fs\";\nimport { mkdir, rm } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { PrepareContext, StagedRelease, UpdateSource } from \"./types.js\";\n\nconst TIMEOUT_MS = 60_000;\n\nfunction run(cmd: string, args: string[], cwd: string): string {\n const r = spawnSync(cmd, args, { cwd, encoding: \"utf-8\", timeout: TIMEOUT_MS });\n if (r.error) throw new Error(`${cmd} ${args.join(\" \")}: ${r.error.message}`);\n if (r.status !== 0) throw new Error(`${cmd} ${args.join(\" \")} exited ${r.status}: ${r.stderr?.trim()}`);\n return r.stdout.trim();\n}\n\nfunction readLocalVersion(home: string): string | null {\n try {\n const pkg = JSON.parse(readFileSync(join(home, \"current\", \"package.json\"), \"utf-8\"));\n return pkg.version ?? null;\n } catch { return null; }\n}\n\nexport function makeNpmSource(packageName: string): UpdateSource {\n return {\n name: \"npm\",\n async prepare(ctx: PrepareContext): Promise<StagedRelease> {\n const latest = run(\"npm\", [\"view\", packageName, \"version\"], ctx.home);\n const current = readLocalVersion(ctx.home);\n if (latest === current) {\n throw new Error(`Already at latest version (${latest}). Nothing to update.`);\n }\n\n const stagedPath = join(ctx.releasesDir, latest);\n await rm(stagedPath, { recursive: true, force: true });\n await mkdir(stagedPath, { recursive: true });\n\n // Download tarball\n run(\"npm\", [\"pack\", `${packageName}@${latest}`, \"--pack-destination\", stagedPath], stagedPath);\n const tgzName = `${packageName}-${latest}.tgz`.replace(\"@\", \"\").replace(\"/\", \"-\");\n const tgzPath = join(stagedPath, tgzName);\n\n // Extract (strip package/ prefix)\n run(\"tar\", [\"-xzf\", tgzPath, \"--strip-components=1\"], stagedPath);\n\n // Cleanup tarball\n if (existsSync(tgzPath)) unlinkSync(tgzPath);\n\n // Install production deps\n run(\"npm\", [\"install\", \"--omit=dev\", \"--no-audit\", \"--no-fund\"], stagedPath);\n\n return { version: latest, stagedPath, commit: null, branch: null, packageLockHash: null, source: \"npm\" };\n },\n };\n}\n", "/**\n * First-touch hint system \u2014 show a hint once, persist to manifest.\n * Output to stderr with \uD83D\uDCA1 prefix. Never corrupts manifest (atomic write).\n */\n\nimport { existsSync, readFileSync, writeFileSync, renameSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\nfunction manifestPath(): string {\n const home = process.env[\"ABTARS_HOME\"] ?? join(process.env[\"HOME\"] ?? \"\", \".abtars\");\n return join(home, \"manifest.json\");\n}\n\nfunction readManifest(): Record<string, unknown> {\n const path = manifestPath();\n if (!existsSync(path)) return {};\n try { return JSON.parse(readFileSync(path, \"utf-8\")); }\n catch { return {}; }\n}\n\nfunction writeManifestAtomic(data: Record<string, unknown>): void {\n const path = manifestPath();\n const tmp = path + \".tmp\";\n writeFileSync(tmp, JSON.stringify(data, null, 2) + \"\\n\");\n renameSync(tmp, path);\n}\n\nexport function showHintOnce(id: string, text: string): void {\n const manifest = readManifest();\n const seen = (manifest[\"hintsSeen\"] as Record<string, string> | undefined) ?? {};\n if (seen[id]) return;\n\n process.stderr.write(`\\n\uD83D\uDCA1 ${text}\\n\\n`);\n\n seen[id] = new Date().toISOString();\n manifest[\"hintsSeen\"] = seen;\n writeManifestAtomic(manifest);\n}\n"],
5
- "mappings": "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",
6
- "names": ["join", "readFileSync", "existsSync", "copyFile", "mkdir", "readFile", "writeFile", "stagedPath", "packageLockHash", "spawnSync", "existsSync", "mkdir", "rm", "join", "existsSync", "readFileSync", "join", "readManifest", "readFileSync", "existsSync", "join", "writeFileSync", "unlinkSync", "mkdir", "copyFile", "readFile", "writeFile"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/boot/phase-transport.ts", "../src/components/transport/tmux-client.ts", "../src/boot/ctx-start.ts"],
4
- "sourcesContent": ["import { logAndSwallow } from \"../components/log-and-swallow.js\";\nimport { getEnv } from \"../components/env-schema.js\";\n/**\n * phase-transport \u2014 boot phase 3: select, initialize, and wrap the agent transport.\n *\n * Also exports buildTransport/rebuildTransport for /reset to pick up transport.json changes\n * (including provider switches that can't be live-patched).\n */\n\nimport { execSync } from \"node:child_process\";\nimport { TmuxClient } from \"../components/transport/tmux-client.js\";\nimport { createAgentTransport } from \"../components/agent-registry.js\";\nimport { logInfo, logWarn, logError, isLogLevel } from \"../components/logger.js\";\nimport { loadUsers } from \"../components/user-registry.js\";\nimport { updateCtxStart } from \"./ctx-start.js\";\nimport type { BootCtx, PhaseResult } from \"./context.js\";\nimport type { IKiroTransport } from \"../components/transport/kiro-transport.js\";\n\nconst TAG = \"transport\";\n\nexport async function phaseTransport(ctx: BootCtx): Promise<PhaseResult> {\n const { memoryConfig } = ctx;\n\n await buildTransport(ctx);\n\n // Initialize context-window-start for all known users\n if (memoryConfig.memoryEnabled) {\n const reg = loadUsers();\n for (const user of reg.users) updateCtxStart(memoryConfig.memoryDir, user.userId, ctx.startedAt);\n }\n return \"ran\";\n}\n\n/**\n * Construct professor transport from current transport.json + env and attach to ctx.transport.\n * Idempotent: destroys any existing ctx.transport first.\n *\n * #367 \u2014 Validates the resolved provider BEFORE destroying the old transport.\n * If validation fails:\n * - During `/reset` (old transport exists): logs ERROR, keeps the old transport up\n * - At boot (no old transport): falls back to .env config if possible, or throws\n * - In either case: bridge stays alive in degraded mode rather than crash-looping\n */\nexport async function buildTransport(ctx: BootCtx): Promise<PhaseResult> {\n const { config, memoryConfig } = ctx;\n\n let transport: IKiroTransport;\n\n const { resolveAgent, getEnvFallback, loadTransport, resolveHailMary, clearTransportCache, validateProviderReady } = await import(\"../components/transport-config.js\");\n clearTransportCache(); // always re-read (picks up /models change writes)\n const tc = loadTransport();\n const prof = tc ? resolveAgent(\"professor\", tc) : null;\n\n const hm = resolveHailMary(tc);\n if (hm) {\n ctx.hailMary = {\n model: hm.model,\n endpoint: hm.endpoint,\n apiKey: hm.apiKeyEnv ? getEnv().getApiKey(hm.apiKeyEnv) : undefined,\n };\n logInfo(\"main\", `\uD83D\uDEA8 hailMary configured: ${hm.model} (manual /model emergency only)`);\n } else {\n ctx.hailMary = null;\n }\n\n let resolved = prof ?? (() => {\n const fb = getEnvFallback();\n logWarn(\"main\", `\u26A0\uFE0F Using .env fallback: ${fb.model} via ${fb.providerName}`);\n return { model: fb.model, provider: fb.provider, providerName: fb.providerName, contextWindow: fb.contextWindow, maxOutput: fb.maxOutput, fallbacks: [] };\n })();\n\n // #367 \u2014 validate the resolved provider BEFORE destroying the existing transport.\n // If validation fails and an old transport is up, keep it; surface the error.\n // If no old transport (boot time), try .env fallback.\n const validation = validateProviderReady(resolved.providerName, resolved.provider, getEnv());\n if (!validation.ok) {\n const errMsg = `transport.json configures '${resolved.providerName}' but ${validation.reason}. Fix: ${validation.fix}`;\n if (ctx.transport) {\n // Existing transport still good \u2014 keep it. Don't destroy.\n logError(\"main\", `${errMsg} \u2014 keeping existing transport up (skipping rebuild)`);\n return \"ran\";\n }\n // Boot-time: try falling back to .env if we weren't already using it\n if (prof) {\n const fb = getEnvFallback();\n logError(\"main\", `${errMsg} \u2014 falling back to .env config (${fb.model} via ${fb.providerName})`);\n resolved = { model: fb.model, provider: fb.provider, providerName: fb.providerName, contextWindow: fb.contextWindow, maxOutput: fb.maxOutput, fallbacks: [] };\n // Validate fallback too \u2014 if even .env is broken, let the original error bubble\n const fbValidation = validateProviderReady(resolved.providerName, resolved.provider, getEnv());\n if (!fbValidation.ok) {\n logError(\"main\", `.env fallback '${resolved.providerName}' also invalid: ${fbValidation.reason}`);\n throw new Error(`${errMsg} (and .env fallback is also invalid: ${fbValidation.reason})`);\n }\n } else {\n // Already on .env fallback path and it's invalid \u2014 hard error\n throw new Error(errMsg);\n }\n }\n\n // Destroy old (if any) \u2014 now that we know the new config is valid\n if (ctx.transport) {\n try { await ctx.transport.destroy(); } catch (err) {\n logWarn(\"main\", `Old transport destroy failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n ctx.transport = null;\n }\n\n if (resolved.provider.transport === \"tmux\") {\n const defaults = tc?.transportDefaults?.tmux;\n logInfo(\"main\", `\uD83D\uDDA5\uFE0F tmux transport (${resolved.providerName})`);\n transport = new TmuxClient(\n defaults?.session ?? config.transport.tmuxSession,\n defaults?.captureDelaySec ?? config.transport.tmuxCaptureDelaySec,\n defaults?.maxWaitSec ?? config.transport.tmuxMaxWaitSec,\n );\n } else if (resolved.provider.transport === \"api\") {\n const { DirectApiTransport } = await import(\"../components/transport/direct-api-transport.js\");\n const { ModelHealthRegistry } = await import(\"../components/transport/model-health-registry.js\");\n const { FallbackPolicy } = await import(\"../components/transport/fallback-policy.js\");\n const apiKey = getEnv().getApiKey(resolved.provider.apiKeyEnv ?? \"API_KEY\");\n\n const candidates: Array<{ model: string; endpoint: string; apiKey?: string; maxContext: number }> = [\n { endpoint: resolved.provider.endpoint ?? \"http://localhost:11434/v1\", apiKey, model: resolved.model, maxContext: resolved.contextWindow },\n ];\n for (const fb of resolved.fallbacks) {\n const fbResolved = tc ? resolveAgent(\"_fallback\", { ...tc, agents: { ...tc.agents, _fallback: { model: fb.model, provider: fb.provider } } }) : null;\n candidates.push({\n endpoint: fbResolved?.provider.endpoint ?? resolved.provider.endpoint!,\n apiKey: fbResolved?.provider.apiKeyEnv ? getEnv().getApiKey(fbResolved.provider.apiKeyEnv) : apiKey,\n model: fb.model,\n maxContext: fbResolved?.contextWindow ?? resolved.contextWindow,\n });\n }\n\n if (!ctx.modelHealthRegistry) {\n ctx.modelHealthRegistry = new ModelHealthRegistry(tc?.healthPolicy);\n }\n // Wire auto-demotion\n if (!ctx.modelHealthRegistry.onDemote) {\n ctx.modelHealthRegistry.onDemote = (model, _endpoint, reason) => {\n import(\"../components/transport-config.js\").then(({ demoteModel }) => demoteModel(model, reason));\n import(\"../components/notification.js\").then(({ sendNotification }) =>\n sendNotification(ctx, `\u26A0\uFE0F ${model} demoted (${reason}). Next healthy model promoted.`)).catch(err => logAndSwallow(TAG, \"sendNotification model-demote\", err));\n };\n }\n const policy = new FallbackPolicy(candidates, ctx.modelHealthRegistry);\n\n transport = new DirectApiTransport({\n endpoint: resolved.provider.endpoint ?? \"http://localhost:11434/v1\",\n apiKey,\n model: resolved.model,\n maxContext: resolved.contextWindow,\n maxOutput: resolved.maxOutput,\n maxTurns: tc?.maxTurns ?? 50,\n apiFormat: resolved.provider.apiFormat,\n thinking: resolved.provider.thinking,\n }, policy);\n logInfo(\"main\", `\uD83D\uDD0C Direct API transport (${resolved.providerName}, model=${resolved.model}, ${candidates.length} candidates)`);\n } else {\n try { execSync(\"pkill -f 'kiro-cli.*acp.*professor' 2>/dev/null || true\", { timeout: 3000 }); } catch (err) { logAndSwallow(\"phase_transport\", \"op\", err); }\n logInfo(\"main\", `\uD83D\uDD0C ACP transport (${resolved.provider.cli ?? \"kiro-cli\"}, model=${resolved.model})`);\n transport = createAgentTransport(\"professor\", {\n cliPath: resolved.provider.cli ?? config.transport.agentCliPath,\n workingDir: config.transport.workingDir,\n agentCli: resolved.provider.cli ?? \"kiro-cli\",\n model: resolved.model,\n });\n }\n\n await transport.initialize();\n\n if (\"setSystemPrompt\" in transport && typeof (transport as { setSystemPrompt: unknown }).setSystemPrompt === \"function\") {\n const { loadSoulBundle } = await import(\"../components/soul-loader.js\");\n const soul = loadSoulBundle();\n if (soul) (transport as { setSystemPrompt: (p: string) => void }).setSystemPrompt(soul);\n }\n\n if (resolved.fallbacks.length > 0 && resolved.provider.transport !== \"api\") {\n logWarn(\"main\", `\u26A0\uFE0F Fallbacks configured for ${resolved.provider.transport} transport \u2014 only API transport supports model fallback`);\n }\n\n ctx.transport = transport;\n ctx.modelName = resolved.model;\n ctx.modelProvider = resolved.providerName;\n ctx.fallbackChain = resolved.fallbacks.map((f: { model: string }) => f.model);\n\n if (ctx.modelHealthRegistry) {\n ctx.runtime.setRegistry(ctx.modelHealthRegistry);\n }\n ctx.runtime.setMainTransport(transport);\n ctx.runtime.setSessionManager(ctx.sessionManager);\n\n // Wire async delegation tools (#570)\n if (getEnv().enableAsyncDelegation) {\n const { setDelegationDeps } = await import(\"../components/transport/delegation-tools.js\");\n setDelegationDeps(ctx.runtime, ctx.sessionManager);\n }\n\n logInfo(\"main\", \"\u2705 Transport ready\");\n\n if (resolved.provider.transport === \"api\" && ctx.memory) {\n const { setMemoryBackend } = await import(\"../components/transport/tool-registry.js\");\n const { SqliteBackend } = await import(\"abmind\");\n const backend = new SqliteBackend(memoryConfig);\n await backend.initialize();\n setMemoryBackend(backend);\n logInfo(\"main\", \"\uD83E\uDDE0 In-process memory wired to tool registry\");\n\n // Wire context engine for automatic compaction\n const db = ctx.memory.getDb?.() ?? ctx.memory.getDatabase?.();\n if (db && resolved.contextWindow >= 128000) {\n const { ContextEngine } = await import(\"abmind\");\n const { createContextOrchestrator } = await import(\"../components/context/index.js\");\n const contextEngine = new ContextEngine(db);\n const orchestrator = createContextOrchestrator(\n contextEngine,\n async (systemPrompt: string, userPrompt: string) => {\n // Use the transport itself for summarization (same model, same endpoint)\n const { streamSingleCompletion } = await import(\"../components/transport/stream-single.js\");\n return streamSingleCompletion({\n endpoint: resolved.provider.endpoint ?? \"http://localhost:11434/v1\",\n apiKey: getEnv().getApiKey(resolved.provider.apiKeyEnv ?? \"API_KEY\") ?? undefined,\n model: resolved.model,\n systemPrompt,\n userPrompt,\n maxTokens: 4096,\n });\n },\n (_chatId: string) => {\n try { return ctx.memory?.getLastMessageTimestamp(true) ?? null; } catch (err) { logAndSwallow(TAG, \"getLastMessageTimestamp\", err); return null; }\n },\n );\n (transport as import(\"../components/transport/direct-api-transport.js\").DirectApiTransport).contextOrchestrator = orchestrator;\n logInfo(\"main\", \"\uD83D\uDCE6 Context engine wired (auto-compaction active)\");\n }\n }\n\n if (\"onFallback\" in transport) {\n let lastNotifiedModel: string | null = null;\n (transport as unknown as { onFallback: (model: string, ctxPct: number, reason?: string) => void }).onFallback = (model, ctxPct, reason) => {\n const reasonTag = reason ? ` (${reason})` : \"\";\n const msg = `\u26A1 Fallback${reasonTag}: ${model}${ctxPct >= 0 ? ` (ctx: ~${ctxPct}%)` : \"\"}`;\n logInfo(\"main\", msg);\n if (model !== lastNotifiedModel || isLogLevel(\"debug\")) {\n lastNotifiedModel = model;\n import(\"../components/notification.js\").then(({ sendNotification }) => sendNotification(ctx, msg)).catch(err => logAndSwallow(TAG, \"sendNotification fallback\", err));\n }\n };\n }\n return \"ran\";\n}\n\n/**\n * Rebuild professor transport in place (picks up transport.json changes).\n * Patches downstream references that captured the old transport (pipelineDeps, idleSave).\n */\nexport async function rebuildTransport(ctx: BootCtx): Promise<PhaseResult> {\n logInfo(\"main\", \"\uD83D\uDD04 Rebuilding transport...\");\n await buildTransport(ctx);\n if (ctx.pipelineDeps && ctx.transport) {\n (ctx.pipelineDeps as { transport: IKiroTransport }).transport = ctx.transport;\n }\n if (ctx.idleSave && ctx.transport) {\n (ctx.idleSave as unknown as { transport: IKiroTransport }).transport = ctx.transport;\n }\n logInfo(\"main\", \"\u2705 Transport rebuilt\");\n return \"ran\";\n}\n", "import { execSync } from \"node:child_process\";\nimport { writeFileSync, unlinkSync, mkdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { IKiroTransport } from \"./kiro-transport.js\";\nimport { logInfo, logDebug, logWarn } from \"../logger.js\";\nimport { logAndSwallow } from \"../log-and-swallow.js\";\nimport { abtarsHome } from \"../../paths.js\";\n\nconst TAG = \"tmux\";\n\n// Kiro CLI prompt pattern: \"N% >\" or \"N% !>\" where N is a number (context usage percentage)\n// The \"!\" appears in trust-all-tools mode\nconst KIRO_PROMPT_RE = /^\\d+%\\s*!?>/;\n\n// Also match common shell prompts as fallback\nconst SHELL_PROMPT_RE = /[$\u276F%#]\\s*$/;\n\n/**\n * Communicates with kiro-cli running inside a tmux session.\n * Uses `tmux send-keys` to send prompts and `tmux capture-pane`\n * to read responses.\n */\nexport class TmuxClient implements IKiroTransport {\n private readonly sessionName: string;\n private readonly captureDelaySec: number;\n private readonly maxWaitSec: number;\n private ready = false;\n\n /** Optional callback for streaming intermediate responses before final prompt. */\n onIntermediateResponse?: (text: string) => void;\n\n /** Tracks the cumulative text delivered via intermediate chunks (for tail detection). */\n private lastIntermediateDelivered = \"\";\n\n constructor(sessionName: string, captureDelaySec: number, maxWaitSec: number) {\n this.sessionName = sessionName;\n this.captureDelaySec = captureDelaySec;\n this.maxWaitSec = maxWaitSec;\n }\n\n async initialize(): Promise<void> {\n if (!this.sessionExists()) {\n throw new Error(\n `tmux session \"${this.sessionName}\" not found. ` +\n `Run: scripts/tmux-session.sh to start it.`,\n );\n }\n this.ready = true;\n logInfo(\"tmux\", `Session \"${this.sessionName}\" found`);\n }\n\n get isReady(): boolean {\n return this.ready && this.sessionExists();\n }\n\n readonly transportCommands: string[] = [];\n\n async sendPrompt(_sessionKey: string, message: string): Promise<string> {\n if (!this.isReady) {\n throw new Error(\"tmux session not available\");\n }\n\n this.lastIntermediateDelivered = \"\";\n const maxAttempts = 2;\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n // Snapshot pane content before sending\n const before = this.capturePaneRaw();\n if (attempt === 1) {\n logDebug(\"tmux\", `Sending: \"${message.slice(0, 80)}\"`);\n } else {\n logInfo(\"tmux\", `Retry #${attempt}: resending prompt`);\n }\n\n // Send the message \u2014 use temp file for long prompts to avoid tmux command length limit\n try {\n if (message.length > 4000) {\n const tmpDir = join(abtarsHome(), \"tmp\");\n mkdirSync(tmpDir, { recursive: true });\n const tmpFile = join(tmpDir, `prompt-${Date.now()}.txt`);\n writeFileSync(tmpFile, message);\n const readCmd = `My full message is in ${tmpFile} \u2014 please read it and respond.`;\n const escaped = readCmd.replace(/'/g, \"'\\\\''\");\n this.exec(`tmux send-keys -t ${this.sessionName} '${escaped}' Enter`);\n setTimeout(() => { try { unlinkSync(tmpFile); } catch (err) { logAndSwallow(TAG, \"unlink tmpFile\", err); } }, 120_000);\n } else {\n const escaped = message.replace(/'/g, \"'\\\\''\");\n this.exec(`tmux send-keys -t ${this.sessionName} '${escaped}' Enter`);\n }\n } catch (err) {\n logWarn(\"tmux\", `send-keys failed: ${err instanceof Error ? err.message : String(err)}`);\n return \"\u26A0\uFE0F Failed to send message to Kiro session. The tmux session may be in copy mode or unresponsive. Try /reset.\";\n }\n\n // Wait for initial processing\n await sleep(this.captureDelaySec * 1000);\n\n // Poll until Kiro finishes\n const response = await this.pollForResponse(before);\n\n // Check for Kiro transient error \u2014 retry once\n if (response.startsWith(\"Kiro is having trouble\") && attempt < maxAttempts) {\n logInfo(\"tmux\", `Kiro trouble detected, will retry in 5s...`);\n await sleep(5000);\n continue;\n }\n\n logDebug(\"tmux\", `Got response (${response.length} chars)`);\n return response;\n }\n\n // Should not reach here, but just in case\n return \"\u26A0\uFE0F Kiro is having trouble responding. Try again or /reset.\";\n }\n\n async resetSession(_sessionKey: string): Promise<void> {\n if (!this.sessionExists()) return;\n this.exec(`tmux send-keys -t ${this.sessionName} C-c`);\n await sleep(1000);\n this.exec(`tmux send-keys -t ${this.sessionName} '/clear' Enter`);\n await sleep(2000);\n // Kiro asks \"Are you sure? [y/n]:\" \u2014 confirm with 'y'\n this.exec(`tmux send-keys -t ${this.sessionName} 'y' Enter`);\n await sleep(1000);\n }\n\n async restartSession(workingDir: string, kiroModel?: string): Promise<void> {\n // Kill existing tmux session and start fresh\n if (this.sessionExists()) {\n this.exec(`tmux kill-session -t ${this.sessionName}`);\n await sleep(1000);\n }\n let cmd = `kiro-cli chat --trust-all-tools`;\n if (kiroModel) cmd += ` --model ${kiroModel}`;\n this.exec(`tmux new-session -d -s ${this.sessionName} -c '${workingDir}' '${cmd}'`);\n this.exec(`tmux set-option -t ${this.sessionName} history-limit 5000`);\n await sleep(3000);\n // Enable thinking tool\n this.exec(`tmux send-keys -t ${this.sessionName} '/settings chat.enableThinking true' Enter`);\n await sleep(2000);\n this.ready = this.sessionExists();\n logInfo(\"tmux\", `Session restarted (ready=${this.ready})`);\n }\n\n async sendInterrupt(): Promise<void> {\n if (!this.sessionExists()) return;\n logInfo(\"tmux\", \"Sending Ctrl+C interrupt\");\n this.exec(`tmux send-keys -t ${this.sessionName} C-c`);\n }\n\n destroy(): void {\n this.ready = false;\n }\n\n /**\n * Poll capture-pane until Kiro's prompt reappears (N% >).\n * Delivers intermediate purple-line responses via onIntermediateResponse callback\n * so the user sees partial answers while Kiro continues with tools.\n * Only returns when the actual Kiro prompt appears or timeout.\n */\n private async pollForResponse(beforeSnapshot: string): Promise<string> {\n const startTime = Date.now();\n const maxWaitMs = this.maxWaitSec * 1000;\n let lastCapture = \"\";\n let stableCount = 0;\n let lastDeliveredAnswer = \"\";\n\n while (Date.now() - startTime < maxWaitMs) {\n const capture = this.capturePaneRaw();\n\n // Get only the NEW content (diff from before)\n const newContent = this.diffOutput(beforeSnapshot, capture);\n\n if (newContent.length === 0) {\n await sleep(2000);\n continue;\n }\n\n // Check if the last non-empty line is a Kiro prompt (N% >)\n const lines = capture.split(\"\\n\");\n const lastNonEmpty = this.getLastNonEmptyLine(lines);\n const lastClean = this.stripAnsi(lastNonEmpty);\n\n if (KIRO_PROMPT_RE.test(lastClean)) {\n const pctMatch = lastClean.match(/^(\\d+)%/);\n if (pctMatch) {\n this.lastContextPercent = parseInt(pctMatch[1]!, 10);\n logDebug(\"tmux\", `Context window: ${this.lastContextPercent}%`);\n }\n logDebug(\"tmux\", `Detected Kiro prompt: \"${lastClean}\"`);\n return this.extractResponse(newContent);\n }\n\n // Check for shell prompt as fallback\n if (SHELL_PROMPT_RE.test(lastClean) && newContent.length > 10) {\n logDebug(\"tmux\", `Detected shell prompt: \"${lastClean}\"`);\n return this.extractResponse(newContent);\n }\n\n // No prompt yet \u2014 deliver intermediate answer if we have new purple lines\n if (this.onIntermediateResponse && capture !== lastCapture) {\n const intermediateAnswer = this.extractAnswerOnly(newContent);\n if (intermediateAnswer && intermediateAnswer !== lastDeliveredAnswer) {\n const newPart = intermediateAnswer.startsWith(lastDeliveredAnswer)\n ? intermediateAnswer.slice(lastDeliveredAnswer.length).trim()\n : intermediateAnswer;\n if (newPart) {\n logDebug(\"tmux\", `Delivering intermediate chunk (${newPart.length} chars)`);\n this.onIntermediateResponse(newPart);\n lastDeliveredAnswer = intermediateAnswer;\n this.lastIntermediateDelivered = intermediateAnswer;\n }\n }\n }\n\n // Track stabilization but do NOT return on it \u2014 only N% > ends the poll\n if (capture === lastCapture) {\n stableCount++;\n } else {\n stableCount = 0;\n lastCapture = capture;\n }\n\n await sleep(2000);\n }\n\n // Timeout\n const finalCapture = this.capturePaneRaw();\n const finalNew = this.diffOutput(beforeSnapshot, finalCapture);\n if (finalNew.length > 0) {\n return this.extractResponse(finalNew) + \"\\n\\n\u23F1\uFE0F (response may be incomplete \u2014 timed out)\";\n }\n return \"\u23F1\uFE0F Kiro is still processing. Check the tmux session directly.\";\n }\n\n /**\n * Extract the meaningful response from the diff.\n * Removes the echoed user input line and Kiro's prompt lines.\n * Stores the \"answer only\" portion (lines that were \"> \" prefixed)\n * separately for TTS use.\n *\n * Kiro output format:\n * N% > <echoed user input>\n * > <response line 1>\n * > <response line 2>\n * \u25B8 Time: Ns\n * M% >\n */\n private lastAnswerOnly = \"\";\n private lastContextPercent = -1;\n\n /** Get just the Kiro answer lines (\"> \" prefixed) from the last response \u2014 for TTS. */\n get answerOnly(): string {\n return this.lastAnswerOnly;\n }\n get toolCallsSucceeded(): number { return 0; }\n\n /** Get the context window usage percentage from the last Kiro prompt (e.g. 10 for \"10% >\"). Returns -1 if unknown. */\n get contextPercent(): number {\n return this.lastContextPercent;\n }\n /** Get the cumulative text that was delivered via intermediate streaming. */\n get intermediateDeliveredText(): string {\n return this.lastIntermediateDelivered;\n }\n\n /** Extract just the purple \"> \" answer lines from raw tmux output (no side effects). */\n private extractAnswerOnly(raw: string): string {\n const PURPLE_PREFIX = /\\x1b\\[38;5;141m>\\s/;\n const lines = raw.split(\"\\n\");\n\n // Find last contiguous block of purple lines\n let blockStart = -1;\n for (let i = lines.length - 1; i >= 0; i--) {\n if (PURPLE_PREFIX.test(lines[i]!)) {\n blockStart = i;\n while (blockStart > 0 && PURPLE_PREFIX.test(lines[blockStart - 1]!)) blockStart--;\n break;\n }\n }\n if (blockStart < 0) return \"\";\n\n const answerLines: string[] = [];\n for (let i = blockStart; i < lines.length; i++) {\n const clean = this.stripAnsi(lines[i]!).trim();\n if (KIRO_PROMPT_RE.test(clean)) break;\n if (clean.startsWith(\"\u25B8 Time:\")) break;\n if (clean.startsWith(\"> \")) answerLines.push(clean.slice(2));\n else if (clean === \">\") answerLines.push(\"\");\n else if (clean === \"\") answerLines.push(\"\");\n else answerLines.push(clean);\n }\n return answerLines.join(\"\\n\").trim();\n }\n\n private extractResponse(raw: string): string {\n // ANSI color 141 (light purple) marks the \"> \" prefix on actual LLM response lines.\n // We detect these BEFORE stripping ANSI to reliably distinguish LLM output from\n // injected context (gray, color 245) and other noise.\n const PURPLE_PREFIX = /\\x1b\\[38;5;141m>\\s/;\n\n const lines = raw.split(\"\\n\");\n\n // First pass: identify lines that are genuine LLM responses (purple \"> \" prefix)\n const answerLines: string[] = [];\n let lastPurpleBlockStart = -1;\n\n for (let i = 0; i < lines.length; i++) {\n if (PURPLE_PREFIX.test(lines[i]!)) {\n if (lastPurpleBlockStart === -1) lastPurpleBlockStart = i;\n }\n }\n\n // Find the LAST contiguous block of purple \"> \" lines \u2014 that's the real answer.\n // Walk backwards to find the start of the last block.\n let blockStart = -1;\n for (let i = lines.length - 1; i >= 0; i--) {\n if (PURPLE_PREFIX.test(lines[i]!)) {\n blockStart = i;\n // Keep walking back through contiguous purple lines and continuation lines\n while (blockStart > 0) {\n const prev = lines[blockStart - 1]!;\n if (PURPLE_PREFIX.test(prev) || (!KIRO_PROMPT_RE.test(this.stripAnsi(prev).trim()) && !prev.includes(\"\u25B8 Time:\") && this.stripAnsi(prev).trim() !== \"\" && !PURPLE_PREFIX.test(prev) && blockStart === i)) {\n // Only extend back through purple lines\n if (PURPLE_PREFIX.test(prev)) {\n blockStart--;\n } else {\n break;\n }\n } else {\n break;\n }\n }\n break;\n }\n }\n\n if (blockStart >= 0) {\n // Extract from the last purple block to the end, stripping ANSI and \"> \" prefix\n for (let i = blockStart; i < lines.length; i++) {\n const line = lines[i]!;\n const clean = this.stripAnsi(line).trim();\n // Stop at Kiro prompt or Time summary\n if (KIRO_PROMPT_RE.test(clean)) break;\n if (clean.startsWith(\"\u25B8 Time:\") || clean.startsWith(\"\u25B8 Time:\")) break;\n if (clean === \"\") {\n answerLines.push(\"\");\n continue;\n }\n // Strip \"> \" prefix\n if (clean.startsWith(\"> \")) {\n answerLines.push(clean.slice(2));\n } else if (clean === \">\") {\n answerLines.push(\"\");\n } else {\n answerLines.push(clean);\n }\n }\n this.lastAnswerOnly = answerLines.join(\"\\n\").trim();\n } else {\n this.lastAnswerOnly = \"\";\n }\n\n // Full response: strip ANSI, then remove prompt lines and noise (legacy behavior)\n const cleaned = this.stripAnsi(raw);\n const allLines = cleaned.split(\"\\n\");\n const result: string[] = [];\n\n for (const line of allLines) {\n const trimmed = line.trim();\n if (result.length === 0 && trimmed === \"\") continue;\n if (KIRO_PROMPT_RE.test(trimmed)) continue;\n if (trimmed.startsWith(\"\u25B8 Time:\") || trimmed.startsWith(\"\u25B8 Time:\")) continue;\n if (/^-{4,}$/.test(trimmed)) continue;\n result.push(line);\n }\n\n const stripped = result.map((line) => {\n const trimmed = line.trimStart();\n if (trimmed.startsWith(\"> \")) return trimmed.slice(2);\n if (trimmed === \">\") return \"\";\n return line;\n });\n\n const final = stripped.join(\"\\n\").trim();\n logDebug(\"tmux\", `extractResponse: ${result.length} lines \u2192 \"${final.slice(0, 120)}\"`);\n if (this.lastAnswerOnly) {\n logDebug(\"tmux\", `answerOnly (${this.lastAnswerOnly.length} chars): \"${this.lastAnswerOnly.slice(0, 120)}\"`);\n }\n return final;\n }\n\n /** Get new content by diffing before/after snapshots. */\n private diffOutput(before: string, after: string): string {\n const beforeLines = before.split(\"\\n\");\n const afterLines = after.split(\"\\n\");\n\n // Find where the new content starts\n let commonPrefix = 0;\n while (\n commonPrefix < beforeLines.length &&\n commonPrefix < afterLines.length &&\n beforeLines[commonPrefix] === afterLines[commonPrefix]\n ) {\n commonPrefix++;\n }\n\n return afterLines.slice(commonPrefix).join(\"\\n\").trim();\n }\n\n /** Get the last non-empty line from an array. */\n private getLastNonEmptyLine(lines: string[]): string {\n for (let i = lines.length - 1; i >= 0; i--) {\n const trimmed = lines[i]!.trim();\n if (trimmed.length > 0) return trimmed;\n }\n return \"\";\n }\n\n /** Strip ANSI escape codes. */\n private stripAnsi(text: string): string {\n // eslint-disable-next-line no-control-regex\n return text.replace(/\\x1B\\[[0-9;]*[a-zA-Z]/g, \"\")\n .replace(/\\x1B\\][^\\x07]*\\x07/g, \"\"); // OSC sequences\n }\n\n private capturePaneRaw(): string {\n try {\n return this.exec(`tmux capture-pane -t ${this.sessionName} -p -e -S -2000`);\n } catch (err) {\n logAndSwallow(TAG, \"capturePaneRaw\", err);\n return \"\";\n }\n }\n\n private sessionExists(): boolean {\n try {\n this.exec(`tmux has-session -t ${this.sessionName}`);\n return true;\n } catch (err) {\n logAndSwallow(TAG, \"sessionExists check\", err);\n return false;\n }\n }\n\n private exec(command: string): string {\n return execSync(command, {\n encoding: \"utf-8\",\n timeout: 15_000,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n }).trim();\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n", "/**\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": "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",
6
- "names": ["execSync", "writeFileSync", "join", "TAG", "execSync"]
7
- }
@@ -1,16 +0,0 @@
1
- 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);
2
-
3
- // src/utils/local-time.ts
4
- var pad = (n) => String(n).padStart(2, "0");
5
- function localISO(d = /* @__PURE__ */ new Date()) {
6
- return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}T${pad(d.getHours())}:${pad(d.getMinutes())}:${pad(d.getSeconds())}`;
7
- }
8
- function localTime(d = /* @__PURE__ */ new Date()) {
9
- return `${pad(d.getHours())}:${pad(d.getMinutes())}`;
10
- }
11
-
12
- export {
13
- localISO,
14
- localTime
15
- };
16
- //# sourceMappingURL=chunk-M6VBAPNT.js.map
@@ -1,29 +0,0 @@
1
- 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);
2
-
3
- // src/utils/abmind-lazy.ts
4
- var _mod = null;
5
- var _loaded = false;
6
- function resetAbmindCache() {
7
- _mod = null;
8
- _loaded = false;
9
- }
10
- async function loadAbmind() {
11
- if (_loaded) return _mod;
12
- try {
13
- _mod = await import("abmind");
14
- } catch {
15
- _mod = null;
16
- }
17
- _loaded = true;
18
- return _mod;
19
- }
20
- function abmind() {
21
- return _mod;
22
- }
23
-
24
- export {
25
- resetAbmindCache,
26
- loadAbmind,
27
- abmind
28
- };
29
- //# sourceMappingURL=chunk-OP7BTAWY.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/components/soul-loader.ts"],
4
- "sourcesContent": ["import { logAndSwallow } from \"./log-and-swallow.js\";\nimport { getEnv } from \"./env-schema.js\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { logInfo, logDebug, logWarn } from \"./logger.js\";\nimport { abtarsHome } from \"../paths.js\";\nimport { loadUsers, buildUsersBlock } from \"./user-registry.js\";\nimport type { MemoryManager } from \"abmind\";\n\nconst TAG = \"soul-loader\";\nconst HOST_CORE_DIR = join(abtarsHome(), \"core\");\n\n/** Read a single file, return empty string on failure. */\nfunction readOr(path: string): string {\n try { return existsSync(path) ? readFileSync(path, \"utf-8\").trim() : \"\"; } catch { return \"\"; }\n}\n\n/** Build env-gated model behavior directives. Generated at session start. */\nfunction buildModelInstructions(): string {\n const lines: string[] = [];\n if (getEnv().primingModelTopics) {\n lines.push(\"End each response with [TOPICS: kw1, kw2, kw3] \u2014 your top 3 topics from this exchange. Keep them English, lowercase, concise.\");\n }\n return lines.length > 0 ? `# Model Instructions\\n\\n${lines.join(\"\\n\")}` : \"\";\n}\n\n/**\n * Build the session injection bundle: abmind 4 + host 2.\n *\n * abmind files via memory.getSessionBundle() (SOUL, profile, notes, memory-tools).\n * Transition fallback: if memory unavailable or file missing, reads from ~/.abtars/core/.\n * Host files (core_facts.md, skills_catalog.md) always from ~/.abtars/core/.\n * Appends [USERS] block.\n */\nexport function loadSoulBundle(memory?: MemoryManager | null): string | null {\n const parts: string[] = [];\n\n // abmind 4 \u2014 prefer getSessionBundle(), fall back to host core dir\n let bundle: { soul: string; profile: string; notes: string; memoryTools: string; coreFacts: string } | null = null;\n try { bundle = memory?.getSessionBundle() ?? null; } catch (err) { logAndSwallow(\"soul_loader\", \"op\", err); }\n\n const soul = bundle?.soul || readOr(join(HOST_CORE_DIR, \"SOUL.md\"));\n const profile = bundle?.profile || readOr(join(HOST_CORE_DIR, \"user_profile.md\"));\n const notes = bundle?.notes || readOr(join(HOST_CORE_DIR, \"agent_notes.md\"));\n const memoryTools = bundle?.memoryTools || readOr(join(HOST_CORE_DIR, \"TOOLS.md\"));\n const coreFacts = bundle?.coreFacts || readOr(join(HOST_CORE_DIR, \"core_facts.md\"));\n\n if (soul) parts.push(soul);\n if (memoryTools) parts.push(memoryTools);\n if (profile) parts.push(profile);\n if (notes) parts.push(notes);\n if (coreFacts) parts.push(coreFacts);\n\n // Host 2 \u2014 skills_catalog stays in ~/.abtars/core/ (generated by hotskills watcher)\n const skillsCatalog = readOr(join(HOST_CORE_DIR, \"skills_catalog.md\"));\n if (skillsCatalog) parts.push(skillsCatalog);\n\n // Host 3: model-instructions \u2014 env-gated dynamic directives\n const modelInstructions = buildModelInstructions();\n if (modelInstructions) parts.push(modelInstructions);\n\n // [EMOTIONAL CONTEXT] \u2014 topic arcs for tone awareness\n try {\n const arcs = memory?.getEmotionalArcs() ?? [];\n if (arcs.length > 0) {\n const ARC_LABELS: Record<string, string> = { \"\u2191\": \"user sentiment improving\", \"\u2193\": \"user sentiment worsening \u2014 be careful\", \"\u2195\": \"volatile \u2014 user feelings fluctuate\", \"\u2192\": \"stable\" };\n const lines = arcs.map(a => `- ${a.topic}: ${a.arc} (${ARC_LABELS[a.arc] ?? \"unknown\"})`);\n parts.push(`[EMOTIONAL CONTEXT]\\n${lines.join(\"\\n\")}`);\n }\n } catch (err) { logAndSwallow(\"soul_loader\", \"op\", err); }\n\n // [USERS] block\n try {\n const registry = loadUsers();\n if (registry.users.length > 0) parts.push(buildUsersBlock(registry));\n } catch (err) { logAndSwallow(\"soul_loader\", \"op\", err); }\n\n // Current date/time \u2014 prevents model from hallucinating temporal context\n const now = new Date();\n const days = [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"];\n parts.push(`[CURRENT TIME] ${now.toLocaleDateString(\"en-GB\")} ${days[now.getDay()]}, ${now.toLocaleTimeString(\"en-GB\", { hour: \"2-digit\", minute: \"2-digit\" })}`);\n\n if (parts.length === 0) {\n logWarn(TAG, \"No session bundle files found\");\n return null;\n }\n\n logInfo(TAG, `Session bundle: ${parts.length} parts (abmind: ${bundle ? \"API\" : \"fallback\"})`);\n logDebug(TAG, `Bundle parts: soul=${!!soul} profile=${!!profile} notes=${!!notes} memTools=${!!memoryTools} coreFacts=${!!coreFacts} skills=${!!skillsCatalog}`);\n return parts.join(\"\\n\\n---\\n\\n\");\n}\n\n/**\n * Minimal soul for Code sessions (#658): agent_notes + memory-tools + skills + time.\n * No personality, no user_profile, no core_facts, no emotional context.\n */\nexport function loadMinimalSoul(memory?: MemoryManager | null): string | null {\n const parts: string[] = [];\n\n let bundle: { notes: string; memoryTools: string } | null = null;\n try { bundle = memory?.getSessionBundle() ?? null; } catch (err) { logAndSwallow(\"soul_loader\", \"op\", err); }\n\n const notes = bundle?.notes || readOr(join(HOST_CORE_DIR, \"agent_notes.md\"));\n const memoryTools = bundle?.memoryTools || readOr(join(HOST_CORE_DIR, \"TOOLS.md\"));\n\n if (notes) parts.push(notes);\n if (memoryTools) parts.push(memoryTools);\n\n const skillsCatalog = readOr(join(HOST_CORE_DIR, \"skills_catalog.md\"));\n if (skillsCatalog) parts.push(skillsCatalog);\n\n const now = new Date();\n const days = [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"];\n parts.push(`[CURRENT TIME] ${now.toLocaleDateString(\"en-GB\")} ${days[now.getDay()]}, ${now.toLocaleTimeString(\"en-GB\", { hour: \"2-digit\", minute: \"2-digit\" })}`);\n\n if (parts.length === 0) return null;\n logInfo(TAG, `Minimal soul (Code): ${parts.length} parts`);\n return parts.join(\"\\n\\n---\\n\\n\");\n}\n"],
5
- "mappings": "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",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/cli/commands/install.ts"],
4
- "sourcesContent": ["/**\n * `abtars install [--upgrade]` \u2014 first-time setup.\n *\n * Phase 1 behavior:\n * - No existing ~/.abtars: create dirs, seed config/ from .env.example,\n * create PATH symlinks. Does NOT run onboard (Phase 3).\n * - Existing ~/.abtars with flat layout (pre-158): refuse unless\n * --upgrade, then run migration 003-flat-to-releases (Phase 1c).\n * - Existing ~/.abtars with new layout: refuse unless --force (which\n * re-seeds missing config and reconciles symlinks, no code changes).\n */\n\nimport { logAndSwallow } from \"../../components/log-and-swallow.js\";\nimport { mkdir, readFile, stat, symlink, writeFile } from 'node:fs/promises';\nimport { existsSync, readFileSync, readdirSync, copyFileSync, mkdirSync } from 'node:fs';\nimport { hostname, homedir } from 'node:os';\nimport { basename, dirname, join } from 'node:path';\nimport { emptyManifest, packagePaths, readManifest, resolveUserBinDir, writeManifest } from '../deploy-lib-import.js';\n\nexport interface InstallOptions {\n readonly restore?: string;\n readonly force: boolean;\n readonly dryRun: boolean;\n readonly mode?: \"simple\" | \"supervised\" | \"supervised-daemon\";\n}\n\n// CLI wrappers are read from install-manifest.json at runtime.\n// Each is a thin wrapper that invokes `node current/dist/cli/<name>.js \"$@\"`.\n// Regenerated on every install / flat-to-releases migration.\n\nasync function exists(p: string): Promise<boolean> {\n try {\n await stat(p);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * True if `p` exists as any filesystem entry \u2014 regular file, directory,\n * symlink (including dangling). Use this for collision checks in\n * reconcilePathLink, where a dangling symlink still occupies the inode\n * and would cause EEXIST on symlink(). `exists()` above uses stat() which\n * follows symlinks and returns false on dangling ones; that's wrong for\n * collision detection.\n */\nasync function existsAny(p: string): Promise<boolean> {\n try {\n const { lstat } = await import('node:fs/promises');\n await lstat(p);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function isSymlink(p: string): Promise<boolean> {\n try {\n const { lstat } = await import('node:fs/promises');\n const s = await lstat(p);\n return s.isSymbolicLink();\n } catch {\n return false;\n }\n}\n\nasync function createSkeleton(home: string, dryRun: boolean): Promise<void> {\n const { loadManifest } = await import('../install-manifest.js');\n const manifest = loadManifest();\n const dirs = manifest.directories.map(d => join(home, d.path));\n if (dryRun) {\n process.stdout.write(`[dry-run] mkdir -p:\\n ${dirs.join('\\n ')}\\n`);\n return;\n }\n for (const d of manifest.directories) {\n await mkdir(join(home, d.path), { recursive: true, mode: d.mode ? parseInt(d.mode, 8) : undefined });\n }\n}\n\nasync function seedConfig(repoRoot: string, _configDir: string, dryRun: boolean, home: string): Promise<readonly string[]> {\n const { loadManifest } = await import('../install-manifest.js');\n const manifest = loadManifest(repoRoot);\n const seeded: string[] = [];\n for (const seed of manifest.configSeeds) {\n const src = join(repoRoot, seed.source);\n const dst = join(home, seed.dest);\n if (!(await exists(src))) continue;\n if (await exists(dst)) continue;\n if (dryRun) {\n seeded.push(`[dry-run] cp ${src} ${dst}`);\n continue;\n }\n const content = await readFile(src, 'utf-8');\n await mkdir(dirname(dst), { recursive: true });\n await writeFile(dst, content, { mode: seed.mode ? parseInt(seed.mode, 8) : 0o644 });\n seeded.push(basename(dst));\n }\n return seeded;\n}\n\n/**\n * Reconcile a single PATH symlink at ~/.local/bin/<name>.\n * Policy (plan \u00A7\"PATH symlink collision\"):\n * - Missing \u2192 create\n * - Symlink pointing into our own ~/.abtars/bin/ \u2192 overwrite\n * - Anything else \u2192 refuse with message, unless force\n */\nasync function reconcilePathLink(\n binDir: string,\n userBinDir: string,\n name: string,\n force: boolean,\n dryRun: boolean,\n): Promise<{ action: string; message?: string }> {\n const linkPath = join(userBinDir, name);\n const targetPath = join(binDir, name);\n const linkExists = await existsAny(linkPath);\n if (!linkExists) {\n if (dryRun) return { action: `[dry-run] ln -s ${targetPath} ${linkPath}` };\n await symlink(targetPath, linkPath);\n return { action: `created ${linkPath}` };\n }\n if (await isSymlink(linkPath)) {\n const { readlink, unlink } = await import('node:fs/promises');\n const current = await readlink(linkPath);\n // \"We own it\" means: points at THIS install's bin dir, not a fuzzy match\n // on any path containing /.abtars/bin/. A smoke-test install at\n // ABTARS_HOME=~/.cache/ab-smoke-.../ must not clobber the real\n // ~/.abtars symlinks. Compare absolute paths directly.\n const ownsIt = current === targetPath;\n if (ownsIt) {\n if (dryRun) return { action: `[dry-run] overwrite ${linkPath} (we own it)` };\n await unlink(linkPath);\n await symlink(targetPath, linkPath);\n return { action: `updated ${linkPath}` };\n }\n if (force) {\n if (dryRun) return { action: `[dry-run] --force overwrite ${linkPath} (currently -> ${current})` };\n await unlink(linkPath);\n await symlink(targetPath, linkPath);\n return { action: `forced overwrite ${linkPath} (was -> ${current})` };\n }\n return {\n action: 'refused',\n message: `${linkPath} is a symlink to ${current} (not ours). Pass --force to overwrite.`,\n };\n }\n if (force) {\n if (dryRun) return { action: `[dry-run] --force overwrite ${linkPath} (regular file)` };\n const { unlink } = await import('node:fs/promises');\n await unlink(linkPath);\n await symlink(targetPath, linkPath);\n return { action: `forced overwrite ${linkPath} (was regular file)` };\n }\n return {\n action: 'refused',\n message: `${linkPath} exists as a regular file (not our symlink). Pass --force to overwrite.`,\n };\n}\n\nexport async function writeWrapper(binDir: string, name: string, currentLink: string, dryRun: boolean): Promise<void> {\n const bundleFile = name === 'abtars' ? 'abtars-cli.js' : `${name}.js`;\n const target = join(currentLink, 'bundle', bundleFile);\n // Fallback: pre-bundle dist/ layout (tsc build) for installs that haven't migrated yet.\n const distFile = name === 'abtars' ? 'abtars.js' : `${name}.js`;\n const fallback = join(currentLink, 'dist', 'cli', distFile);\n const content = `#!/usr/bin/env bash\nif [ -f \"${target}\" ]; then\n exec node \"${target}\" \"$@\"\nelif [ -f \"${fallback}\" ]; then\n exec node \"${fallback}\" \"$@\"\nelse\n echo \"abtars: no release staged yet. Run 'abtars update' or 'npm run bundle' in the repo checkout.\" >&2\n exit 1\nfi\n`;\n const path = join(binDir, name);\n if (dryRun) {\n process.stdout.write(`[dry-run] write wrapper ${path} -> node ${target} (fallback: ${fallback})\\n`);\n return;\n }\n await writeFile(path, content, { mode: 0o755 });\n}\n\nfunction isPathOnPATH(userBinDir: string): boolean {\n const PATH = process.env['PATH'] ?? '';\n return PATH.split(':').some((p) => p === userBinDir);\n}\n\nfunction isWSL(): boolean {\n try {\n return existsSync(\"/proc/sys/fs/binfmt_misc/WSLInterop\")\n || /microsoft/i.test(readFileSync(\"/proc/version\", \"utf-8\"));\n } catch { return false; }\n}\n\nasync function installSupervisedDaemon(home: string, repoRoot: string, dryRun: boolean): Promise<number> {\n const platform = process.platform;\n\n // WSL: warn but don't block \u2014 systemd works on WSL2 with systemd enabled\n if (platform === 'linux' && isWSL()) {\n process.stderr.write(`\u2139\uFE0F WSL detected \u2014 ensure systemd is enabled (wsl.conf: [boot] systemd=true)\\n`);\n }\n\n // Sudo check \u2014 supervised-daemon requires root for system-scope service install\n const sudoUser = process.env['SUDO_USER'];\n if (process.getuid?.() !== 0) {\n process.stderr.write(\n `supervised-daemon requires sudo for system-scope service install.\\n` +\n `Run: sudo -k abtars install --mode=supervised-daemon\\n`,\n );\n return 2;\n }\n if (!sudoUser) {\n process.stderr.write(\n `Cannot determine target user \u2014 $SUDO_USER is not set.\\n` +\n `Run via: sudo -k abtars install --mode=supervised-daemon\\n` +\n `(Do not use 'su -' \u2014 it doesn't set SUDO_USER.)\\n`,\n );\n return 2;\n }\n\n // Validate that a normal install exists\n const currentLink = join(home, 'current');\n if (!existsSync(currentLink)) {\n process.stderr.write(\n `No release staged at ${currentLink}.\\n` +\n `Run 'abtars install' and 'abtars update' as ${sudoUser} first,\\n` +\n `then re-run with sudo for supervised-daemon.\\n`,\n );\n return 2;\n }\n\n const userGroup = sudoUser; // primary group = username on most systems\n\n if (platform === 'darwin') {\n // Resolve actual primary group on macOS\n const { execSync } = await import('node:child_process');\n let group = userGroup;\n try { group = execSync(`id -gn ${sudoUser}`, { encoding: 'utf-8' }).trim(); } catch (err) { logAndSwallow(\"install\", \"op\", err); }\n\n const plistSrc = join(repoRoot, 'scripts', 'com.abtars.daemon.plist');\n if (!existsSync(plistSrc)) {\n process.stderr.write(`Template not found: ${plistSrc}\\n`);\n return 1;\n }\n let content = readFileSync(plistSrc, 'utf-8');\n content = content.replaceAll('{{USER}}', sudoUser).replaceAll('{{GROUP}}', group);\n const dst = '/Library/LaunchDaemons/com.abtars.daemon.plist';\n\n if (dryRun) {\n process.stdout.write(`[dry-run] write ${dst}\\n[dry-run] launchctl bootstrap system ${dst}\\n`);\n return 0;\n }\n\n // Remove existing user-scope LaunchAgent if present\n const userAgent = join('/Users', sudoUser, 'Library', 'LaunchAgents', 'com.abtars.watchdog.plist');\n if (existsSync(userAgent)) {\n const { execFileSync } = await import('node:child_process');\n try { execFileSync('launchctl', ['bootout', `gui/${process.env['SUDO_UID'] ?? ''}`, userAgent]); } catch (err) { logAndSwallow(\"install\", \"op\", err); }\n process.stdout.write(`\u2713 disabled user-scope LaunchAgent\\n`);\n }\n\n const { writeFileSync, chmodSync } = await import('node:fs');\n writeFileSync(dst, content);\n chmodSync(dst, 0o644);\n const { execFileSync } = await import('node:child_process');\n try { execFileSync('launchctl', ['bootstrap', 'system', dst]); } catch (err) { logAndSwallow(\"install\", \"op\", err); }\n process.stdout.write(`\u2713 LaunchDaemon installed at ${dst}\\n`);\n process.stdout.write(`\u2713 supervised-daemon active \u2014 bridge runs as ${sudoUser}, survives logout + reboot\\n`);\n return 0;\n }\n\n if (platform === 'linux') {\n // systemd check\n const { execSync } = await import('node:child_process');\n try { execSync('systemctl --version', { stdio: 'ignore' }); } catch {\n process.stderr.write(`systemctl not found \u2014 supervised-daemon requires systemd.\\n`);\n return 2;\n }\n\n const unitSrc = join(repoRoot, 'scripts', 'abtars-daemon.service');\n if (!existsSync(unitSrc)) {\n process.stderr.write(`Template not found: ${unitSrc}\\n`);\n return 1;\n }\n let content = readFileSync(unitSrc, 'utf-8');\n content = content.replaceAll('{{USER}}', sudoUser);\n const dst = '/etc/systemd/system/abtars.service';\n\n if (dryRun) {\n process.stdout.write(`[dry-run] write ${dst}\\n[dry-run] systemctl enable --now abtars\\n`);\n return 0;\n }\n\n const { writeFileSync } = await import('node:fs');\n writeFileSync(dst, content);\n const { execFileSync } = await import('node:child_process');\n execFileSync('systemctl', ['daemon-reload']);\n execFileSync('systemctl', ['enable', '--now', 'abtars']);\n process.stdout.write(`\u2713 systemd unit installed at ${dst}\\n`);\n process.stdout.write(`\u2713 supervised-daemon active \u2014 bridge runs as ${sudoUser}, survives logout + reboot\\n`);\n return 0;\n }\n\n process.stderr.write(`supervised-daemon is not supported on ${platform}.\\n`);\n return 2;\n}\n\nexport async function install(opts: InstallOptions): Promise<number> {\n const paths = packagePaths('abtars');\n const home = paths.home;\n const userBinDir = resolveUserBinDir();\n const repoRoot = process.cwd();\n\n // Install log (#718)\n const { initInstallLog, logInstall, logInstallHeader } = await import(\"../install-log.js\");\n initInstallLog(home);\n logInstallHeader(\"install\");\n const _origWrite = process.stdout.write.bind(process.stdout);\n process.stdout.write = ((chunk: any, ...args: any[]) => {\n if (typeof chunk === \"string\" && (chunk.startsWith(\"\u2713\") || chunk.startsWith(\"\u26A0\"))) logInstall(chunk.trimEnd());\n return _origWrite(chunk, ...args);\n }) as typeof process.stdout.write;\n\n const homeExists = await exists(home);\n const manifest = homeExists ? await readManifest(paths.manifest) : null;\n\n if (homeExists && manifest && !opts.force && !opts.restore) {\n process.stderr.write(\n `~/.abtars already installed at version ${manifest.version || '(unset)'}.\\nUse 'abtars update' to upgrade, or --force to re-seed missing config.\\n`,\n );\n return 2;\n }\n\n // Create skeleton (idempotent)\n await createSkeleton(home, opts.dryRun);\n process.stdout.write(`\u2713 skeleton at ${home}\\n`);\n\n // Core templates: abmind seeds its own on first boot (#427 ensureInitialized).\n // No longer seeded by abtars install.\n\n // Create kiro-cli agent config \u2014 ACP transport needs ~/.kiro/agents/professor.json\n const kiroAgentsDir = join(homedir(), '.kiro', 'agents');\n const professorJson = join(kiroAgentsDir, 'professor.json');\n if (!opts.dryRun) {\n await mkdir(kiroAgentsDir, { recursive: true });\n if (!(await exists(professorJson))) {\n await writeFile(professorJson, JSON.stringify({\n name: \"professor\",\n description: \"Abtars bridge agent\",\n tools: [\"*\"],\n allowedTools: [\"@builtin\"],\n toolsSettings: { shell: { autoAllowReadonly: true } },\n includeMcpJson: true,\n }, null, 2) + '\\n');\n process.stdout.write(`\u2713 kiro agent: ${professorJson}\\n`);\n }\n } else {\n process.stdout.write(`[dry-run] create ${professorJson}\\n`);\n }\n\n // Generate Ed25519 identity keypair (skip if already exists)\n const identityKey = join(paths.config, 'identity.key');\n const identityPub = join(paths.config, 'identity.pub');\n if (!opts.dryRun && !(await exists(identityKey))) {\n const { generateKeyPairSync } = await import('node:crypto');\n const { privateKey, publicKey } = generateKeyPairSync('ed25519');\n await writeFile(identityKey, privateKey.export({ format: 'der', type: 'pkcs8' }).toString('base64'));\n await writeFile(identityPub, publicKey.export({ format: 'der', type: 'spki' }).toString('base64'));\n const { chmodSync } = await import('node:fs');\n chmodSync(identityKey, 0o600);\n process.stdout.write(`\u2713 identity keypair generated\\n`);\n }\n\n // Generate self-signed Ed25519 TLS certificate (skip if already exists)\n const identityCrt = join(paths.config, 'identity.crt');\n const identityTlsKey = join(paths.config, 'identity.tls.key');\n if (!opts.dryRun && !(await exists(identityCrt))) {\n const { execSync } = await import('node:child_process');\n const { chmodSync } = await import('node:fs');\n const agentName = hostname();\n try {\n execSync(`openssl req -x509 -newkey ed25519 -keyout identity.tls.key -out identity.crt -days 3650 -nodes -subj \"/CN=${agentName}\"`, { cwd: paths.config, stdio: 'ignore' });\n chmodSync(identityTlsKey, 0o600);\n process.stdout.write(`\u2713 TLS certificate generated (Ed25519, 10yr)\\n`);\n } catch (err) {\n process.stderr.write(`\u26A0 TLS cert generation failed (openssl not found?). Agent-api will start without TLS.\\n`);\n }\n }\n\n // Seed config from examples (only missing ones)\n const seeded = await seedConfig(repoRoot, paths.config, opts.dryRun, home);\n if (seeded.length > 0) {\n process.stdout.write(`\u2713 seeded config: ${seeded.join(', ')}\\n`);\n }\n\n // Write wrappers (always overwrite \u2014 they're regenerable thin shims)\n const { loadManifest: loadInstallManifest } = await import('../install-manifest.js');\n const installManifest = loadInstallManifest(repoRoot);\n if (!opts.dryRun) {\n await mkdir(paths.bin, { recursive: true });\n }\n for (const name of installManifest.cliWrappers) {\n await writeWrapper(paths.bin, name, paths.current, opts.dryRun);\n }\n process.stdout.write(`\u2713 wrappers in ${paths.bin}\\n`);\n\n // Reconcile PATH symlinks\n if (!opts.dryRun) await mkdir(userBinDir, { recursive: true });\n const refused: string[] = [];\n for (const name of installManifest.cliWrappers) {\n const r = await reconcilePathLink(paths.bin, userBinDir, name, opts.force, opts.dryRun);\n if (r.action === 'refused') {\n refused.push(r.message ?? name);\n }\n }\n if (refused.length > 0) {\n process.stderr.write(`\\nPATH symlink conflicts:\\n ${refused.join('\\n ')}\\n`);\n return 4;\n }\n process.stdout.write(`\u2713 PATH symlinks in ${userBinDir}\\n`);\n\n // Warn if ~/.local/bin not on PATH\n if (!isPathOnPATH(userBinDir)) {\n process.stderr.write(\n `\\nWarning: ${userBinDir} is not on $PATH. Add to your shell config:\\n export PATH=\"${userBinDir}:$PATH\"\\n`,\n );\n }\n\n // Initialize manifest if brand-new install AND migration didn't write one.\n // (Migration 003 writes a manifest mid-flow with version + migration record;\n // we must not clobber it here.)\n const manifestAfter = await readManifest(paths.manifest);\n if (manifestAfter === null && !opts.dryRun) {\n await writeManifest(paths.manifest, {\n ...emptyManifest('abtars', hostname()),\n version: '',\n preMigrationBackup: null,\n });\n process.stdout.write(`\u2713 manifest initialized at ${paths.manifest}\\n`);\n }\n\n // Write install mode to manifest. Priority:\n // 1. --mode flag (explicit) \u2014 always wins\n // 2. existing manifest installMode \u2014 preserved (don't clobber on --force)\n // 3. default: supervised\n const manifestForMode = await readManifest(paths.manifest);\n const existingMode = manifestForMode?.installMode;\n const mode = opts.mode ?? existingMode ?? \"supervised\";\n if (manifestForMode) {\n await writeManifest(paths.manifest, { ...manifestForMode, installMode: mode });\n }\n process.stdout.write(`\u2713 install mode: ${mode}\\n`);\n\n // --- supervised-daemon: system-scope service install (additive, does not touch simple/supervised paths) ---\n if (mode === 'supervised-daemon') {\n return installSupervisedDaemon(home, repoRoot, opts.dryRun);\n }\n\n // Restore from backup zip\n if (opts.restore) {\n const { spawnSync } = await import('node:child_process');\n const { existsSync: fileExists } = await import('node:fs');\n const zipPath = opts.restore;\n if (!fileExists(zipPath)) {\n process.stderr.write(`error: backup file not found: ${zipPath}\\n`);\n return 1;\n }\n // Extract to temp dir\n const tmpDir = join(process.env['TMPDIR'] ?? '/tmp', `abtars-restore-${Date.now()}`);\n const unzip = spawnSync('unzip', ['-o', zipPath, '-d', tmpDir], { encoding: 'utf-8' });\n if (unzip.status !== 0) {\n process.stderr.write(`error: unzip failed: ${unzip.stderr}\\n`);\n return 1;\n }\n // Copy abtars files\n const abSrc = join(tmpDir, 'abtars');\n if (fileExists(abSrc)) {\n spawnSync('cp', ['-r', ...readdirSync(abSrc).map(f => join(abSrc, f)), home], { stdio: 'inherit' });\n process.stdout.write(`\u2713 restored abtars config\\n`);\n }\n // Copy abmind files\n const abmindHome = process.env['ABMIND_HOME'] ?? join(dirname(home), '.abmind');\n const abmindSrc = join(tmpDir, 'abmind');\n if (fileExists(abmindSrc)) {\n spawnSync('cp', ['-r', ...readdirSync(abmindSrc).map(f => join(abmindSrc, f)), abmindHome], { stdio: 'inherit' });\n process.stdout.write(`\u2713 restored abmind data\\n`);\n }\n // Cleanup\n spawnSync('rm', ['-rf', tmpDir]);\n process.stdout.write(`\\nRestore complete.\\n`);\n process.stdout.write(`Next: 'abtars update' to build and activate.\\n`);\n return 0;\n }\n\n // --- supervised: load user-scope watchdog (LaunchAgent / systemd user) ---\n if (mode === 'supervised') {\n const { execSync } = await import('node:child_process');\n if (process.platform === 'darwin') {\n const plistSrc = join(home, 'scripts', 'com.abtars.watchdog.plist');\n const plistDst = join(homedir(), 'Library', 'LaunchAgents', 'com.abtars.watchdog.plist');\n if (existsSync(plistSrc)) {\n const content = readFileSync(plistSrc, 'utf-8').replaceAll('{{HOME}}', homedir());\n const { writeFileSync } = await import('node:fs');\n writeFileSync(plistDst, content);\n try { execSync(`launchctl load \"${plistDst}\"`, { stdio: 'ignore' }); } catch { /* already loaded */ }\n process.stdout.write(`\u2713 watchdog LaunchAgent loaded\\n`);\n }\n } else if (process.platform === 'linux') {\n const unitSrc = join(home, 'scripts', 'abtars-watchdog.service');\n const unitDir = join(homedir(), '.config', 'systemd', 'user');\n if (existsSync(unitSrc)) {\n mkdirSync(unitDir, { recursive: true });\n copyFileSync(unitSrc, join(unitDir, 'abtars-watchdog.service'));\n try { execSync('systemctl --user daemon-reload && systemctl --user enable --now abtars-watchdog', { stdio: 'ignore' }); } catch { /* may fail in chroot */ }\n process.stdout.write(`\u2713 watchdog systemd user service enabled\\n`);\n }\n }\n }\n\n process.stdout.write(`\\nInstall complete.\\n`);\n if (!manifestAfter || manifestAfter.version === '') {\n process.stdout.write(`Next: 'abtars update' to build and activate the first release.\\n`);\n } else {\n process.stdout.write(`\\n\u2500\u2500 Next steps \u2500\u2500\\n`);\n process.stdout.write(` 1. Run 'abtars onboard' to configure Telegram token + model provider\\n`);\n process.stdout.write(` 2. (Optional) Install Ollama for memory embeddings: curl -fsSL https://ollama.com/install.sh | sh\\n`);\n process.stdout.write(` 3. Start the bridge: 'abtars restart' or use the watchdog\\n\\n`);\n }\n\n const { printHealthSummary } = await import('./health-check.js');\n printHealthSummary(paths.home);\n\n // #334: Post-install healthcheck \u2014 validate operator channel exists (only on --restore)\n if (!opts.dryRun && opts.restore) {\n const { validateMinimumViability, formatValidationError } = await import('./install-validate.js');\n const validation = validateMinimumViability(paths.config);\n if (!validation.ok) {\n const invocation = `abtars install --restore ${opts.restore}`;\n process.stderr.write(\"\\n\" + formatValidationError(validation, invocation) + \"\\n\");\n return 1;\n }\n }\n\n return 0;\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;AAYA;AACA,SAAS,OAAO,UAAU,MAAM,SAAS,iBAAiB;AAC1D,SAAS,YAAY,cAAc,aAAa,cAAc,iBAAiB;AAC/E,SAAS,UAAU,eAAe;AAClC,SAAS,UAAU,SAAS,YAAY;AAcxC,eAAe,OAAO,GAA6B;AACjD,MAAI;AACF,UAAM,KAAK,CAAC;AACZ,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAUA,eAAe,UAAU,GAA6B;AACpD,MAAI;AACF,UAAM,EAAE,MAAM,IAAI,MAAM,OAAO,kBAAkB;AACjD,UAAM,MAAM,CAAC;AACb,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAe,UAAU,GAA6B;AACpD,MAAI;AACF,UAAM,EAAE,MAAM,IAAI,MAAM,OAAO,kBAAkB;AACjD,UAAM,IAAI,MAAM,MAAM,CAAC;AACvB,WAAO,EAAE,eAAe;AAAA,EAC1B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAe,eAAe,MAAc,QAAgC;AAC1E,QAAM,EAAE,aAAa,IAAI,MAAM,OAAO,gCAAwB;AAC9D,QAAM,WAAW,aAAa;AAC9B,QAAM,OAAO,SAAS,YAAY,IAAI,OAAK,KAAK,MAAM,EAAE,IAAI,CAAC;AAC7D,MAAI,QAAQ;AACV,YAAQ,OAAO,MAAM;AAAA,IAA0B,KAAK,KAAK,MAAM,CAAC;AAAA,CAAI;AACpE;AAAA,EACF;AACA,aAAW,KAAK,SAAS,aAAa;AACpC,UAAM,MAAM,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,WAAW,MAAM,MAAM,EAAE,OAAO,SAAS,EAAE,MAAM,CAAC,IAAI,OAAU,CAAC;AAAA,EACrG;AACF;AAEA,eAAe,WAAW,UAAkB,YAAoB,QAAiB,MAA0C;AACzH,QAAM,EAAE,aAAa,IAAI,MAAM,OAAO,gCAAwB;AAC9D,QAAM,WAAW,aAAa,QAAQ;AACtC,QAAM,SAAmB,CAAC;AAC1B,aAAW,QAAQ,SAAS,aAAa;AACvC,UAAM,MAAM,KAAK,UAAU,KAAK,MAAM;AACtC,UAAM,MAAM,KAAK,MAAM,KAAK,IAAI;AAChC,QAAI,CAAE,MAAM,OAAO,GAAG,EAAI;AAC1B,QAAI,MAAM,OAAO,GAAG,EAAG;AACvB,QAAI,QAAQ;AACV,aAAO,KAAK,gBAAgB,GAAG,IAAI,GAAG,EAAE;AACxC;AAAA,IACF;AACA,UAAM,UAAU,MAAM,SAAS,KAAK,OAAO;AAC3C,UAAM,MAAM,QAAQ,GAAG,GAAG,EAAE,WAAW,KAAK,CAAC;AAC7C,UAAM,UAAU,KAAK,SAAS,EAAE,MAAM,KAAK,OAAO,SAAS,KAAK,MAAM,CAAC,IAAI,IAAM,CAAC;AAClF,WAAO,KAAK,SAAS,GAAG,CAAC;AAAA,EAC3B;AACA,SAAO;AACT;AASA,eAAe,kBACb,QACA,YACA,MACA,OACA,QAC+C;AAC/C,QAAM,WAAW,KAAK,YAAY,IAAI;AACtC,QAAM,aAAa,KAAK,QAAQ,IAAI;AACpC,QAAM,aAAa,MAAM,UAAU,QAAQ;AAC3C,MAAI,CAAC,YAAY;AACf,QAAI,OAAQ,QAAO,EAAE,QAAQ,mBAAmB,UAAU,IAAI,QAAQ,GAAG;AACzE,UAAM,QAAQ,YAAY,QAAQ;AAClC,WAAO,EAAE,QAAQ,WAAW,QAAQ,GAAG;AAAA,EACzC;AACA,MAAI,MAAM,UAAU,QAAQ,GAAG;AAC7B,UAAM,EAAE,UAAU,OAAO,IAAI,MAAM,OAAO,kBAAkB;AAC5D,UAAM,UAAU,MAAM,SAAS,QAAQ;AAKvC,UAAM,SAAS,YAAY;AAC3B,QAAI,QAAQ;AACV,UAAI,OAAQ,QAAO,EAAE,QAAQ,uBAAuB,QAAQ,eAAe;AAC3E,YAAM,OAAO,QAAQ;AACrB,YAAM,QAAQ,YAAY,QAAQ;AAClC,aAAO,EAAE,QAAQ,WAAW,QAAQ,GAAG;AAAA,IACzC;AACA,QAAI,OAAO;AACT,UAAI,OAAQ,QAAO,EAAE,QAAQ,+BAA+B,QAAQ,kBAAkB,OAAO,IAAI;AACjG,YAAM,OAAO,QAAQ;AACrB,YAAM,QAAQ,YAAY,QAAQ;AAClC,aAAO,EAAE,QAAQ,oBAAoB,QAAQ,YAAY,OAAO,IAAI;AAAA,IACtE;AACA,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,SAAS,GAAG,QAAQ,oBAAoB,OAAO;AAAA,IACjD;AAAA,EACF;AACA,MAAI,OAAO;AACT,QAAI,OAAQ,QAAO,EAAE,QAAQ,+BAA+B,QAAQ,kBAAkB;AACtF,UAAM,EAAE,OAAO,IAAI,MAAM,OAAO,kBAAkB;AAClD,UAAM,OAAO,QAAQ;AACrB,UAAM,QAAQ,YAAY,QAAQ;AAClC,WAAO,EAAE,QAAQ,oBAAoB,QAAQ,sBAAsB;AAAA,EACrE;AACA,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,SAAS,GAAG,QAAQ;AAAA,EACtB;AACF;AAEA,eAAsB,aAAa,QAAgB,MAAc,aAAqB,QAAgC;AACpH,QAAM,aAAa,SAAS,WAAW,kBAAkB,GAAG,IAAI;AAChE,QAAM,SAAS,KAAK,aAAa,UAAU,UAAU;AAErD,QAAM,WAAW,SAAS,WAAW,cAAc,GAAG,IAAI;AAC1D,QAAM,WAAW,KAAK,aAAa,QAAQ,OAAO,QAAQ;AAC1D,QAAM,UAAU;AAAA,WACP,MAAM;AAAA,eACF,MAAM;AAAA,aACR,QAAQ;AAAA,eACN,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAMrB,QAAM,OAAO,KAAK,QAAQ,IAAI;AAC9B,MAAI,QAAQ;AACV,YAAQ,OAAO,MAAM,2BAA2B,IAAI,YAAY,MAAM,eAAe,QAAQ;AAAA,CAAK;AAClG;AAAA,EACF;AACA,QAAM,UAAU,MAAM,SAAS,EAAE,MAAM,IAAM,CAAC;AAChD;AAEA,SAAS,aAAa,YAA6B;AACjD,QAAM,OAAO,QAAQ,IAAI,MAAM,KAAK;AACpC,SAAO,KAAK,MAAM,GAAG,EAAE,KAAK,CAAC,MAAM,MAAM,UAAU;AACrD;AAEA,SAAS,QAAiB;AACxB,MAAI;AACF,WAAO,WAAW,qCAAqC,KAClD,aAAa,KAAK,aAAa,iBAAiB,OAAO,CAAC;AAAA,EAC/D,QAAQ;AAAE,WAAO;AAAA,EAAO;AAC1B;AAEA,eAAe,wBAAwB,MAAc,UAAkB,QAAkC;AACvG,QAAM,WAAW,QAAQ;AAGzB,MAAI,aAAa,WAAW,MAAM,GAAG;AACnC,YAAQ,OAAO,MAAM;AAAA,CAAgF;AAAA,EACvG;AAGA,QAAM,WAAW,QAAQ,IAAI,WAAW;AACxC,MAAI,QAAQ,SAAS,MAAM,GAAG;AAC5B,YAAQ,OAAO;AAAA,MACb;AAAA;AAAA;AAAA,IAEF;AACA,WAAO;AAAA,EACT;AACA,MAAI,CAAC,UAAU;AACb,YAAQ,OAAO;AAAA,MACb;AAAA;AAAA;AAAA;AAAA,IAGF;AACA,WAAO;AAAA,EACT;AAGA,QAAM,cAAc,KAAK,MAAM,SAAS;AACxC,MAAI,CAAC,WAAW,WAAW,GAAG;AAC5B,YAAQ,OAAO;AAAA,MACb,wBAAwB,WAAW;AAAA,8CACY,QAAQ;AAAA;AAAA;AAAA,IAEzD;AACA,WAAO;AAAA,EACT;AAEA,QAAM,YAAY;AAElB,MAAI,aAAa,UAAU;AAEzB,UAAM,EAAE,SAAS,IAAI,MAAM,OAAO,oBAAoB;AACtD,QAAI,QAAQ;AACZ,QAAI;AAAE,cAAQ,SAAS,UAAU,QAAQ,IAAI,EAAE,UAAU,QAAQ,CAAC,EAAE,KAAK;AAAA,IAAG,SAAS,KAAK;AAAE,oBAAc,WAAW,MAAM,GAAG;AAAA,IAAG;AAEjI,UAAM,WAAW,KAAK,UAAU,WAAW,yBAAyB;AACpE,QAAI,CAAC,WAAW,QAAQ,GAAG;AACzB,cAAQ,OAAO,MAAM,uBAAuB,QAAQ;AAAA,CAAI;AACxD,aAAO;AAAA,IACT;AACA,QAAI,UAAU,aAAa,UAAU,OAAO;AAC5C,cAAU,QAAQ,WAAW,YAAY,QAAQ,EAAE,WAAW,aAAa,KAAK;AAChF,UAAM,MAAM;AAEZ,QAAI,QAAQ;AACV,cAAQ,OAAO,MAAM,mBAAmB,GAAG;AAAA,uCAA0C,GAAG;AAAA,CAAI;AAC5F,aAAO;AAAA,IACT;AAGA,UAAM,YAAY,KAAK,UAAU,UAAU,WAAW,gBAAgB,2BAA2B;AACjG,QAAI,WAAW,SAAS,GAAG;AACzB,YAAM,EAAE,cAAAA,cAAa,IAAI,MAAM,OAAO,oBAAoB;AAC1D,UAAI;AAAE,QAAAA,cAAa,aAAa,CAAC,WAAW,OAAO,QAAQ,IAAI,UAAU,KAAK,EAAE,IAAI,SAAS,CAAC;AAAA,MAAG,SAAS,KAAK;AAAE,sBAAc,WAAW,MAAM,GAAG;AAAA,MAAG;AACtJ,cAAQ,OAAO,MAAM;AAAA,CAAqC;AAAA,IAC5D;AAEA,UAAM,EAAE,eAAe,UAAU,IAAI,MAAM,OAAO,SAAS;AAC3D,kBAAc,KAAK,OAAO;AAC1B,cAAU,KAAK,GAAK;AACpB,UAAM,EAAE,aAAa,IAAI,MAAM,OAAO,oBAAoB;AAC1D,QAAI;AAAE,mBAAa,aAAa,CAAC,aAAa,UAAU,GAAG,CAAC;AAAA,IAAG,SAAS,KAAK;AAAE,oBAAc,WAAW,MAAM,GAAG;AAAA,IAAG;AACpH,YAAQ,OAAO,MAAM,oCAA+B,GAAG;AAAA,CAAI;AAC3D,YAAQ,OAAO,MAAM,yDAA+C,QAAQ;AAAA,CAA8B;AAC1G,WAAO;AAAA,EACT;AAEA,MAAI,aAAa,SAAS;AAExB,UAAM,EAAE,SAAS,IAAI,MAAM,OAAO,oBAAoB;AACtD,QAAI;AAAE,eAAS,uBAAuB,EAAE,OAAO,SAAS,CAAC;AAAA,IAAG,QAAQ;AAClE,cAAQ,OAAO,MAAM;AAAA,CAA6D;AAClF,aAAO;AAAA,IACT;AAEA,UAAM,UAAU,KAAK,UAAU,WAAW,uBAAuB;AACjE,QAAI,CAAC,WAAW,OAAO,GAAG;AACxB,cAAQ,OAAO,MAAM,uBAAuB,OAAO;AAAA,CAAI;AACvD,aAAO;AAAA,IACT;AACA,QAAI,UAAU,aAAa,SAAS,OAAO;AAC3C,cAAU,QAAQ,WAAW,YAAY,QAAQ;AACjD,UAAM,MAAM;AAEZ,QAAI,QAAQ;AACV,cAAQ,OAAO,MAAM,mBAAmB,GAAG;AAAA;AAAA,CAA6C;AACxF,aAAO;AAAA,IACT;AAEA,UAAM,EAAE,cAAc,IAAI,MAAM,OAAO,SAAS;AAChD,kBAAc,KAAK,OAAO;AAC1B,UAAM,EAAE,aAAa,IAAI,MAAM,OAAO,oBAAoB;AAC1D,iBAAa,aAAa,CAAC,eAAe,CAAC;AAC3C,iBAAa,aAAa,CAAC,UAAU,SAAS,QAAQ,CAAC;AACvD,YAAQ,OAAO,MAAM,oCAA+B,GAAG;AAAA,CAAI;AAC3D,YAAQ,OAAO,MAAM,yDAA+C,QAAQ;AAAA,CAA8B;AAC1G,WAAO;AAAA,EACT;AAEA,UAAQ,OAAO,MAAM,yCAAyC,QAAQ;AAAA,CAAK;AAC3E,SAAO;AACT;AAEA,eAAsB,QAAQ,MAAuC;AACnE,QAAM,QAAQ,aAAa,QAAQ;AACnC,QAAM,OAAO,MAAM;AACnB,QAAM,aAAa,kBAAkB;AACrC,QAAM,WAAW,QAAQ,IAAI;AAG7B,QAAM,EAAE,gBAAgB,YAAY,iBAAiB,IAAI,MAAM,OAAO,2BAAmB;AACzF,iBAAe,IAAI;AACnB,mBAAiB,SAAS;AAC1B,QAAM,aAAa,QAAQ,OAAO,MAAM,KAAK,QAAQ,MAAM;AAC3D,UAAQ,OAAO,QAAS,CAAC,UAAe,SAAgB;AACtD,QAAI,OAAO,UAAU,aAAa,MAAM,WAAW,QAAG,KAAK,MAAM,WAAW,QAAG,GAAI,YAAW,MAAM,QAAQ,CAAC;AAC7G,WAAO,WAAW,OAAO,GAAG,IAAI;AAAA,EAClC;AAEA,QAAM,aAAa,MAAM,OAAO,IAAI;AACpC,QAAM,WAAW,aAAa,MAAM,aAAa,MAAM,QAAQ,IAAI;AAEnE,MAAI,cAAc,YAAY,CAAC,KAAK,SAAS,CAAC,KAAK,SAAS;AAC1D,YAAQ,OAAO;AAAA,MACb,0CAA0C,SAAS,WAAW,SAAS;AAAA;AAAA;AAAA,IACzE;AACA,WAAO;AAAA,EACT;AAGA,QAAM,eAAe,MAAM,KAAK,MAAM;AACtC,UAAQ,OAAO,MAAM,sBAAiB,IAAI;AAAA,CAAI;AAM9C,QAAM,gBAAgB,KAAK,QAAQ,GAAG,SAAS,QAAQ;AACvD,QAAM,gBAAgB,KAAK,eAAe,gBAAgB;AAC1D,MAAI,CAAC,KAAK,QAAQ;AAChB,UAAM,MAAM,eAAe,EAAE,WAAW,KAAK,CAAC;AAC9C,QAAI,CAAE,MAAM,OAAO,aAAa,GAAI;AAClC,YAAM,UAAU,eAAe,KAAK,UAAU;AAAA,QAC5C,MAAM;AAAA,QACN,aAAa;AAAA,QACb,OAAO,CAAC,GAAG;AAAA,QACX,cAAc,CAAC,UAAU;AAAA,QACzB,eAAe,EAAE,OAAO,EAAE,mBAAmB,KAAK,EAAE;AAAA,QACpD,gBAAgB;AAAA,MAClB,GAAG,MAAM,CAAC,IAAI,IAAI;AAClB,cAAQ,OAAO,MAAM,sBAAiB,aAAa;AAAA,CAAI;AAAA,IACzD;AAAA,EACF,OAAO;AACL,YAAQ,OAAO,MAAM,oBAAoB,aAAa;AAAA,CAAI;AAAA,EAC5D;AAGA,QAAM,cAAc,KAAK,MAAM,QAAQ,cAAc;AACrD,QAAM,cAAc,KAAK,MAAM,QAAQ,cAAc;AACrD,MAAI,CAAC,KAAK,UAAU,CAAE,MAAM,OAAO,WAAW,GAAI;AAChD,UAAM,EAAE,oBAAoB,IAAI,MAAM,OAAO,aAAa;AAC1D,UAAM,EAAE,YAAY,UAAU,IAAI,oBAAoB,SAAS;AAC/D,UAAM,UAAU,aAAa,WAAW,OAAO,EAAE,QAAQ,OAAO,MAAM,QAAQ,CAAC,EAAE,SAAS,QAAQ,CAAC;AACnG,UAAM,UAAU,aAAa,UAAU,OAAO,EAAE,QAAQ,OAAO,MAAM,OAAO,CAAC,EAAE,SAAS,QAAQ,CAAC;AACjG,UAAM,EAAE,UAAU,IAAI,MAAM,OAAO,SAAS;AAC5C,cAAU,aAAa,GAAK;AAC5B,YAAQ,OAAO,MAAM;AAAA,CAAgC;AAAA,EACvD;AAGA,QAAM,cAAc,KAAK,MAAM,QAAQ,cAAc;AACrD,QAAM,iBAAiB,KAAK,MAAM,QAAQ,kBAAkB;AAC5D,MAAI,CAAC,KAAK,UAAU,CAAE,MAAM,OAAO,WAAW,GAAI;AAChD,UAAM,EAAE,SAAS,IAAI,MAAM,OAAO,oBAAoB;AACtD,UAAM,EAAE,UAAU,IAAI,MAAM,OAAO,SAAS;AAC5C,UAAM,YAAY,SAAS;AAC3B,QAAI;AACF,eAAS,6GAA6G,SAAS,KAAK,EAAE,KAAK,MAAM,QAAQ,OAAO,SAAS,CAAC;AAC1K,gBAAU,gBAAgB,GAAK;AAC/B,cAAQ,OAAO,MAAM;AAAA,CAA+C;AAAA,IACtE,SAAS,KAAK;AACZ,cAAQ,OAAO,MAAM;AAAA,CAAwF;AAAA,IAC/G;AAAA,EACF;AAGA,QAAM,SAAS,MAAM,WAAW,UAAU,MAAM,QAAQ,KAAK,QAAQ,IAAI;AACzE,MAAI,OAAO,SAAS,GAAG;AACrB,YAAQ,OAAO,MAAM,yBAAoB,OAAO,KAAK,IAAI,CAAC;AAAA,CAAI;AAAA,EAChE;AAGA,QAAM,EAAE,cAAc,oBAAoB,IAAI,MAAM,OAAO,gCAAwB;AACnF,QAAM,kBAAkB,oBAAoB,QAAQ;AACpD,MAAI,CAAC,KAAK,QAAQ;AAChB,UAAM,MAAM,MAAM,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,EAC5C;AACA,aAAW,QAAQ,gBAAgB,aAAa;AAC9C,UAAM,aAAa,MAAM,KAAK,MAAM,MAAM,SAAS,KAAK,MAAM;AAAA,EAChE;AACA,UAAQ,OAAO,MAAM,sBAAiB,MAAM,GAAG;AAAA,CAAI;AAGnD,MAAI,CAAC,KAAK,OAAQ,OAAM,MAAM,YAAY,EAAE,WAAW,KAAK,CAAC;AAC7D,QAAM,UAAoB,CAAC;AAC3B,aAAW,QAAQ,gBAAgB,aAAa;AAC9C,UAAM,IAAI,MAAM,kBAAkB,MAAM,KAAK,YAAY,MAAM,KAAK,OAAO,KAAK,MAAM;AACtF,QAAI,EAAE,WAAW,WAAW;AAC1B,cAAQ,KAAK,EAAE,WAAW,IAAI;AAAA,IAChC;AAAA,EACF;AACA,MAAI,QAAQ,SAAS,GAAG;AACtB,YAAQ,OAAO,MAAM;AAAA;AAAA,IAAgC,QAAQ,KAAK,MAAM,CAAC;AAAA,CAAI;AAC7E,WAAO;AAAA,EACT;AACA,UAAQ,OAAO,MAAM,2BAAsB,UAAU;AAAA,CAAI;AAGzD,MAAI,CAAC,aAAa,UAAU,GAAG;AAC7B,YAAQ,OAAO;AAAA,MACb;AAAA,WAAc,UAAU;AAAA,iBAA+D,UAAU;AAAA;AAAA,IACnG;AAAA,EACF;AAKA,QAAM,gBAAgB,MAAM,aAAa,MAAM,QAAQ;AACvD,MAAI,kBAAkB,QAAQ,CAAC,KAAK,QAAQ;AAC1C,UAAM,cAAc,MAAM,UAAU;AAAA,MAClC,GAAG,cAAc,UAAU,SAAS,CAAC;AAAA,MACrC,SAAS;AAAA,MACT,oBAAoB;AAAA,IACtB,CAAC;AACD,YAAQ,OAAO,MAAM,kCAA6B,MAAM,QAAQ;AAAA,CAAI;AAAA,EACtE;AAMA,QAAM,kBAAkB,MAAM,aAAa,MAAM,QAAQ;AACzD,QAAM,eAAe,iBAAiB;AACtC,QAAM,OAAO,KAAK,QAAQ,gBAAgB;AAC1C,MAAI,iBAAiB;AACnB,UAAM,cAAc,MAAM,UAAU,EAAE,GAAG,iBAAiB,aAAa,KAAK,CAAC;AAAA,EAC/E;AACA,UAAQ,OAAO,MAAM,wBAAmB,IAAI;AAAA,CAAI;AAGhD,MAAI,SAAS,qBAAqB;AAChC,WAAO,wBAAwB,MAAM,UAAU,KAAK,MAAM;AAAA,EAC5D;AAGA,MAAI,KAAK,SAAS;AAChB,UAAM,EAAE,UAAU,IAAI,MAAM,OAAO,oBAAoB;AACvD,UAAM,EAAE,YAAY,WAAW,IAAI,MAAM,OAAO,SAAS;AACzD,UAAM,UAAU,KAAK;AACrB,QAAI,CAAC,WAAW,OAAO,GAAG;AACxB,cAAQ,OAAO,MAAM,iCAAiC,OAAO;AAAA,CAAI;AACjE,aAAO;AAAA,IACT;AAEA,UAAM,SAAS,KAAK,QAAQ,IAAI,QAAQ,KAAK,QAAQ,kBAAkB,KAAK,IAAI,CAAC,EAAE;AACnF,UAAM,QAAQ,UAAU,SAAS,CAAC,MAAM,SAAS,MAAM,MAAM,GAAG,EAAE,UAAU,QAAQ,CAAC;AACrF,QAAI,MAAM,WAAW,GAAG;AACtB,cAAQ,OAAO,MAAM,wBAAwB,MAAM,MAAM;AAAA,CAAI;AAC7D,aAAO;AAAA,IACT;AAEA,UAAM,QAAQ,KAAK,QAAQ,QAAQ;AACnC,QAAI,WAAW,KAAK,GAAG;AACrB,gBAAU,MAAM,CAAC,MAAM,GAAG,YAAY,KAAK,EAAE,IAAI,OAAK,KAAK,OAAO,CAAC,CAAC,GAAG,IAAI,GAAG,EAAE,OAAO,UAAU,CAAC;AAClG,cAAQ,OAAO,MAAM;AAAA,CAA4B;AAAA,IACnD;AAEA,UAAM,aAAa,QAAQ,IAAI,aAAa,KAAK,KAAK,QAAQ,IAAI,GAAG,SAAS;AAC9E,UAAM,YAAY,KAAK,QAAQ,QAAQ;AACvC,QAAI,WAAW,SAAS,GAAG;AACzB,gBAAU,MAAM,CAAC,MAAM,GAAG,YAAY,SAAS,EAAE,IAAI,OAAK,KAAK,WAAW,CAAC,CAAC,GAAG,UAAU,GAAG,EAAE,OAAO,UAAU,CAAC;AAChH,cAAQ,OAAO,MAAM;AAAA,CAA0B;AAAA,IACjD;AAEA,cAAU,MAAM,CAAC,OAAO,MAAM,CAAC;AAC/B,YAAQ,OAAO,MAAM;AAAA;AAAA,CAAuB;AAC5C,YAAQ,OAAO,MAAM;AAAA,CAAgD;AACrE,WAAO;AAAA,EACT;AAGA,MAAI,SAAS,cAAc;AACzB,UAAM,EAAE,SAAS,IAAI,MAAM,OAAO,oBAAoB;AACtD,QAAI,QAAQ,aAAa,UAAU;AACjC,YAAM,WAAW,KAAK,MAAM,WAAW,2BAA2B;AAClE,YAAM,WAAW,KAAK,QAAQ,GAAG,WAAW,gBAAgB,2BAA2B;AACvF,UAAI,WAAW,QAAQ,GAAG;AACxB,cAAM,UAAU,aAAa,UAAU,OAAO,EAAE,WAAW,YAAY,QAAQ,CAAC;AAChF,cAAM,EAAE,cAAc,IAAI,MAAM,OAAO,SAAS;AAChD,sBAAc,UAAU,OAAO;AAC/B,YAAI;AAAE,mBAAS,mBAAmB,QAAQ,KAAK,EAAE,OAAO,SAAS,CAAC;AAAA,QAAG,QAAQ;AAAA,QAAuB;AACpG,gBAAQ,OAAO,MAAM;AAAA,CAAiC;AAAA,MACxD;AAAA,IACF,WAAW,QAAQ,aAAa,SAAS;AACvC,YAAM,UAAU,KAAK,MAAM,WAAW,yBAAyB;AAC/D,YAAM,UAAU,KAAK,QAAQ,GAAG,WAAW,WAAW,MAAM;AAC5D,UAAI,WAAW,OAAO,GAAG;AACvB,kBAAU,SAAS,EAAE,WAAW,KAAK,CAAC;AACtC,qBAAa,SAAS,KAAK,SAAS,yBAAyB,CAAC;AAC9D,YAAI;AAAE,mBAAS,mFAAmF,EAAE,OAAO,SAAS,CAAC;AAAA,QAAG,QAAQ;AAAA,QAA2B;AAC3J,gBAAQ,OAAO,MAAM;AAAA,CAA2C;AAAA,MAClE;AAAA,IACF;AAAA,EACF;AAEA,UAAQ,OAAO,MAAM;AAAA;AAAA,CAAuB;AAC5C,MAAI,CAAC,iBAAiB,cAAc,YAAY,IAAI;AAClD,YAAQ,OAAO,MAAM;AAAA,CAAkE;AAAA,EACzF,OAAO;AACL,YAAQ,OAAO,MAAM;AAAA;AAAA,CAAsB;AAC3C,YAAQ,OAAO,MAAM;AAAA,CAA0E;AAC/F,YAAQ,OAAO,MAAM;AAAA,CAAuG;AAC5H,YAAQ,OAAO,MAAM;AAAA;AAAA,CAAiE;AAAA,EACxF;AAEA,QAAM,EAAE,mBAAmB,IAAI,MAAM,OAAO,4BAAmB;AAC/D,qBAAmB,MAAM,IAAI;AAG7B,MAAI,CAAC,KAAK,UAAU,KAAK,SAAS;AAChC,UAAM,EAAE,0BAA0B,sBAAsB,IAAI,MAAM,OAAO,gCAAuB;AAChG,UAAM,aAAa,yBAAyB,MAAM,MAAM;AACxD,QAAI,CAAC,WAAW,IAAI;AAClB,YAAM,aAAa,4BAA4B,KAAK,OAAO;AAC3D,cAAQ,OAAO,MAAM,OAAO,sBAAsB,YAAY,UAAU,IAAI,IAAI;AAChF,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;",
6
- "names": ["execFileSync"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/components/transport-config.ts"],
4
- "sourcesContent": ["import { logAndSwallow } from \"./log-and-swallow.js\";\nimport { getEnv } from \"./env-schema.js\";\nimport { validateShape, TRANSPORT_SCHEMA } from \"./config-validator.js\";\n/**\n * transport-config.ts \u2014 Load and validate transport.json + models.json.\n * Falls back to .env defaults if JSON is broken.\n */\n\nimport { readFileSync, writeFileSync, existsSync, statSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { abtarsHome } from \"../paths.js\";\nimport { readEnvWithDefault } from \"./env.js\";\nimport { logInfo, logWarn, logError } from \"./logger.js\";\n\nconst TAG = \"transport-config\";\n\n// \u2500\u2500 Types \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type ModelCost = { input: number; output: number };\n\nexport type ModelEntry = {\n contextWindow: number;\n maxOutput: number;\n rank: number;\n cost: ModelCost;\n transports: string[];\n description?: string;\n addedAt?: string;\n validatedAt?: string;\n status?: \"alive\" | \"dead\" | \"untested\";\n};\n\nexport type ModelCatalog = Record<string, ModelEntry>;\n\nexport type AgentAssignment = {\n model: string;\n provider: string;\n fallbacks?: Array<{ model: string; provider: string }>;\n};\n\nexport type ProviderConfig = {\n transport: \"acp\" | \"tmux\" | \"api\";\n cli?: string;\n endpoint?: string;\n apiKeyEnv?: string;\n apiFormat?: \"chat\" | \"responses\" | \"anthropic\";\n thinking?: { style: \"effort\"; default: string } | { style: \"extended\"; default: number };\n defaults?: Record<string, { model: string; fallbacks?: string[] }>;\n fallbackChain?: string[];\n};\n\nexport type TransportDefaults = {\n tmux?: { session?: string; captureDelaySec?: number; maxWaitSec?: number };\n acp?: { permissionTimeoutMs?: number };\n};\n\nimport type { HealthPolicyConfig } from \"./transport/model-health-registry.js\";\n\nexport type TransportConfig = {\n agents: Record<string, AgentAssignment>;\n providers: Record<string, ProviderConfig>;\n transportDefaults?: TransportDefaults;\n maxTurns?: number;\n hailMary?: { model: string; provider: string };\n healthPolicy?: HealthPolicyConfig;\n};\n\nexport type ResolvedAgent = {\n model: string;\n provider: ProviderConfig;\n providerName: string;\n contextWindow: number;\n maxOutput: number;\n fallbacks: Array<{ model: string; provider: string }>;\n};\n\n// \u2500\u2500 Loaders \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 cachedTransport: TransportConfig | null = null;\n\nexport function configDir(): string {\n return join(abtarsHome(), \"config\");\n}\n\nexport function loadModels(): ModelCatalog {\n const p = join(configDir(), getEnv().modelsConfig);\n try {\n return JSON.parse(readFileSync(p, \"utf-8\")) as ModelCatalog;\n } catch (err) {\n logWarn(TAG, `Failed to load models.json: ${err instanceof Error ? err.message : String(err)}`);\n return {};\n }\n}\n\nexport function loadTransport(): TransportConfig | null {\n if (cachedTransport) return cachedTransport;\n const dir = configDir();\n const p = join(dir, getEnv().transportConfig);\n try {\n cachedTransport = JSON.parse(readFileSync(p, \"utf-8\")) as TransportConfig;\n validateShape(cachedTransport, TRANSPORT_SCHEMA, \"transport.json\");\n logInfo(TAG, `Loaded transport config (${Object.keys(cachedTransport.agents).length} agents, ${Object.keys(cachedTransport.providers).length} providers)`);\n const repairs = validateAndRepair(cachedTransport);\n if (repairs.length > 0) {\n for (const r of repairs) logWarn(TAG, `Auto-repaired: ${r.agent} was on ${r.oldProvider} \u2014 ${r.reason}`);\n writeTransportConfig(cachedTransport, `invariant auto-repair (${repairs.length} agents)`);\n pendingRepairs = repairs;\n }\n return cachedTransport;\n } catch (err) {\n logAndSwallow(TAG, \"loadTransport parse\", err);\n // Fallback to transport.default.json\n try {\n cachedTransport = JSON.parse(readFileSync(join(dir, \"transport.default.json\"), \"utf-8\")) as TransportConfig;\n logWarn(TAG, `transport.json missing/corrupt \u2014 loaded transport.default.json`);\n return cachedTransport;\n } catch (err) {\n logError(TAG, `No transport config available: ${err instanceof Error ? err.message : String(err)}`);\n return null;\n }\n }\n}\n\n/** Resolve hailMary from transport.json. Returns null if not configured. */\nexport function resolveHailMary(transport?: TransportConfig | null): { model: string; endpoint: string; apiKeyEnv?: string } | null {\n const tc = transport ?? loadTransport();\n if (!tc?.hailMary) return null;\n const provider = tc.providers[tc.hailMary.provider];\n if (!provider?.endpoint) return null;\n return { model: tc.hailMary.model, endpoint: provider.endpoint, apiKeyEnv: provider.apiKeyEnv };\n}\n\n/** Force re-read on next call (for tests). */\nexport function clearTransportCache(): void {\n cachedTransport = null;\n}\n\n// \u2500\u2500 Invariant validation \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 type RepairEntry = { agent: string; oldProvider: string; reason: string };\n\n/** Stashed repairs from last loadTransport() \u2014 consumed by model-health task. */\nlet pendingRepairs: RepairEntry[] = [];\nexport function consumeRepairs(): RepairEntry[] {\n const r = pendingRepairs;\n pendingRepairs = [];\n return r;\n}\n\n/**\n * Validate transport invariant: all agents must share professor's transport type.\n * For acp/tmux, provider name must also match (single child process).\n * Violations are auto-repaired (subagent reset to professor's assignment).\n */\nexport function validateAndRepair(tc: TransportConfig): RepairEntry[] {\n const profAssignment = tc.agents[\"professor\"];\n if (!profAssignment) return [];\n const profProvider = tc.providers[profAssignment.provider];\n if (!profProvider) return [];\n\n const profType = profProvider.transport;\n const repairs: RepairEntry[] = [];\n\n for (const [agent, assignment] of Object.entries(tc.agents)) {\n if (agent === \"professor\") continue;\n const provider = tc.providers[assignment.provider];\n if (!provider) continue;\n\n const agentType = provider.transport;\n let violation = false;\n\n if (agentType !== profType) {\n // Cross-transport-type violation\n violation = true;\n } else if (profType !== \"api\" && assignment.provider !== profAssignment.provider) {\n // ACP/tmux: must share exact provider (single child process)\n violation = true;\n }\n\n if (violation) {\n repairs.push({ agent, oldProvider: assignment.provider, reason: `${provider.transport} incompatible with professor (${profType}/${profAssignment.provider})` });\n tc.agents[agent] = { model: profAssignment.model, provider: profAssignment.provider };\n }\n }\n\n // Validate professor fallbacks \u2014 must also match professor's transport type\n const fallbacks = profAssignment.fallbacks;\n if (fallbacks) {\n for (let i = fallbacks.length - 1; i >= 0; i--) {\n const fb = fallbacks[i]!;\n const fbProvider = tc.providers[fb.provider];\n if (!fbProvider) continue;\n const fbType = fbProvider.transport;\n if (fbType !== profType || (profType !== \"api\" && fb.provider !== profAssignment.provider)) {\n repairs.push({ agent: `professor_fb${i + 1}`, oldProvider: fb.provider, reason: `fallback ${fbProvider.transport} incompatible with professor (${profType}/${profAssignment.provider})` });\n fallbacks.splice(i, 1);\n }\n }\n }\n\n // hailMary is exempt \u2014 manual emergency override that rebuilds transport\n\n return repairs;\n}\n\n// \u2500\u2500 Resolution \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport function resolveAgent(role: string, transport?: TransportConfig | null, models?: ModelCatalog): ResolvedAgent | null {\n const tc = transport ?? loadTransport();\n if (!tc) return null;\n\n // cron inherits professor\n const effectiveRole = role === \"task\" ? \"professor\" : role;\n const assignment = tc.agents[effectiveRole];\n if (!assignment) {\n logWarn(TAG, `No agent assignment for role \"${role}\"`);\n return null;\n }\n\n const providers = tc.providers;\n // If primary is demoted AND the demoted model matches current, promote first non-demoted fallback\n let effectiveModel = assignment.model;\n let effectiveProvider = assignment.provider;\n const demotedModel = (assignment as any).demotedModel ?? assignment.model;\n if ((assignment as any).demoted && demotedModel === assignment.model) {\n const firstHealthy = (assignment.fallbacks ?? []).find((fb: any) => !fb.demoted);\n if (firstHealthy) {\n effectiveModel = firstHealthy.model;\n effectiveProvider = firstHealthy.provider;\n } else {\n logWarn(TAG, `All models demoted for role \"${role}\" \u2014 using primary anyway`);\n }\n }\n\n const resolvedProvider = providers[effectiveProvider];\n if (!resolvedProvider) {\n logWarn(TAG, `Provider \"${effectiveProvider}\" not found for role \"${role}\"`);\n return null;\n }\n\n const mc = models ?? loadModels();\n const modelEntry = mc[effectiveModel];\n if (!modelEntry && effectiveModel) {\n logWarn(TAG, `Model \"${effectiveModel}\" not in models.json \u2014 using defaults`);\n }\n\n return {\n model: effectiveModel,\n provider: resolvedProvider,\n providerName: effectiveProvider,\n contextWindow: modelEntry?.contextWindow ?? 128000,\n maxOutput: modelEntry?.maxOutput ?? 8192,\n fallbacks: (assignment.fallbacks ?? []).filter((fb: any) => !fb.demoted && fb.model !== effectiveModel),\n };\n}\n\n// \u2500\u2500 Fallback from .env \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 type EnvFallback = {\n provider: ProviderConfig;\n providerName: string;\n model: string;\n contextWindow: number;\n maxOutput: number;\n};\n\nexport function getEnvFallback(): EnvFallback {\n const providerName = readEnvWithDefault(\"DEFAULT_PROVIDER\", \"openrouter\", \"default LLM provider\");\n const transport = getEnv().defaultTransport as \"api\" | \"acp\" | \"tmux\";\n const model = readEnvWithDefault(\"DEFAULT_MODEL\", \"minimax-m2.5:cloud\", \"default LLM model\");\n\n const provider: ProviderConfig = { transport };\n if (transport === \"api\") {\n provider.endpoint = providerName === \"openrouter\"\n ? \"https://openrouter.ai/api/v1\"\n : \"http://localhost:11434/v1\";\n if (providerName === \"openrouter\") provider.apiKeyEnv = \"OPENROUTER_API_KEY\";\n }\n\n return { provider, providerName, model, contextWindow: 128000, maxOutput: 8192 };\n}\n\n// \u2500\u2500 Validation (startup) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport function validateAtStartup(): void {\n const tc = loadTransport();\n if (!tc) return;\n const mc = loadModels();\n\n for (const [role, assignment] of Object.entries(tc.agents)) {\n if (!tc.providers[assignment.provider]) {\n logWarn(TAG, `Agent \"${role}\": provider \"${assignment.provider}\" not defined in providers`);\n }\n const modelEntry = mc[assignment.model];\n if (!modelEntry) {\n logWarn(TAG, `Agent \"${role}\": model \"${assignment.model}\" not in models.json`);\n } else if (!modelEntry.transports.includes(assignment.provider)) {\n logWarn(TAG, `Agent \"${role}\": model \"${assignment.model}\" not listed for provider \"${assignment.provider}\" in models.json`);\n }\n }\n}\n\n// \u2500\u2500 Write \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport function writeTransportConfig(tc: TransportConfig, reason?: string): void {\n // Guard: reject empty model strings before persisting\n for (const [role, agent] of Object.entries(tc.agents)) {\n if (!agent.model?.trim()) {\n logWarn(TAG, `Refusing to write transport.json \u2014 agent \"${role}\" has empty model`);\n return;\n }\n }\n const p = join(configDir(), getEnv().transportConfig);\n // Save current as .old before overwriting (enables /model restore)\n // Only overwrite .old if it's >15min old \u2014 preserves last-known-good during rapid changes\n const oldPath = p.replace(\".json\", \".old.json\");\n try {\n const oldAge = Date.now() - statSync(oldPath).mtimeMs;\n if (oldAge > 15 * 60_000) writeFileSync(oldPath, readFileSync(p, \"utf-8\"), \"utf-8\");\n } catch { try { writeFileSync(oldPath, readFileSync(p, \"utf-8\"), \"utf-8\"); } catch (err) { logAndSwallow(TAG, \"backup transport.old.json\", err); } }\n writeFileSync(p, JSON.stringify(tc, null, 2), \"utf-8\");\n cachedTransport = tc;\n logInfo(TAG, reason ? `transport.json updated \u2014 ${reason}` : \"transport.json updated\");\n}\n\n/** Remove demoted models from config. Called on user-initiated model switch.\n * Models the user just chose are resurrected (demotion cleared). All other demoted entries are deleted. */\nexport function cleanDemotedModels(tc: TransportConfig, chosenModel?: string): void {\n for (const agent of Object.values(tc.agents)) {\n if ((agent as any).demoted) {\n if (agent.model === chosenModel) { delete (agent as any).demoted; delete (agent as any).demotedReason; delete (agent as any).demotedModel; }\n }\n if (agent.fallbacks) {\n for (const fb of agent.fallbacks) {\n if ((fb as any).demoted && fb.model === chosenModel) { delete (fb as any).demoted; delete (fb as any).demotedReason; delete (fb as any).demotedModel; }\n }\n }\n }\n}\n\n/** Mark a model as demoted in transport.json. Skipped by candidate loading. */\nexport function demoteModel(model: string, reason: \"auth\" | \"timeout\"): void {\n const tc = loadTransport();\n if (!tc) return;\n let found = false;\n for (const agent of Object.values(tc.agents)) {\n if (agent.model === model) { (agent as any).demoted = new Date().toISOString(); (agent as any).demotedReason = reason; (agent as any).demotedModel = model; found = true; }\n for (const fb of agent.fallbacks ?? []) {\n if (fb.model === model) { (fb as any).demoted = new Date().toISOString(); (fb as any).demotedReason = reason; (fb as any).demotedModel = model; found = true; }\n }\n }\n if (found) writeTransportConfig(tc, `auto-demote ${model} (${reason})`);\n}\n\n/** Swap transport.json \u2194 transport.json.old (undo last switch). */\nexport function restorePrevious(): { ok: boolean; error?: string } {\n const dir = configDir();\n const activePath = join(dir, getEnv().transportConfig);\n const oldPath = activePath.replace(\".json\", \".old.json\");\n if (!existsSync(oldPath)) return { ok: false, error: \"Nothing to restore \u2014 no previous config saved.\" };\n try {\n const current = readFileSync(activePath, \"utf-8\");\n const old = readFileSync(oldPath, \"utf-8\");\n writeFileSync(activePath, old, \"utf-8\");\n writeFileSync(oldPath, current, \"utf-8\");\n cachedTransport = null;\n logInfo(TAG, \"transport.json swapped with .old (restore)\");\n return { ok: true };\n } catch (err) {\n return { ok: false, error: `Restore failed: ${err instanceof Error ? err.message : String(err)}` };\n }\n}\n\n/** Copy transport.default.json \u2192 transport.json, clear cache. Returns true if successful. */\nexport function resetToDefaults(): boolean {\n const dir = configDir();\n const defaultPath = join(dir, \"transport.default.json\");\n const activePath = join(dir, getEnv().transportConfig);\n try {\n // Backup current before overwriting\n try { writeFileSync(activePath.replace(\".json\", \".old.json\"), readFileSync(activePath, \"utf-8\"), \"utf-8\"); } catch (err) { logAndSwallow(\"transport_config\", \"op\", err); }\n const defaults = readFileSync(defaultPath, \"utf-8\");\n writeFileSync(activePath, defaults, \"utf-8\");\n cachedTransport = null;\n logInfo(TAG, \"transport.json reset to defaults (old saved as .old.json)\");\n return true;\n } catch (err) {\n logWarn(TAG, `No transport.default.json \u2014 keeping current config: ${err instanceof Error ? err.message : String(err)}`);\n return false;\n }\n}\n\n// \u2500\u2500 Provider availability \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport function getAvailableProviders(tc: TransportConfig): Array<{ name: string; config: ProviderConfig }> {\n return Object.entries(tc.providers).map(([name, config]) => ({ name, config }));\n}\n\n/** Load a provider's defaults block. Missing subagents inherit professor's model. */\nexport function loadProviderDefaults(providerName: string, tc?: TransportConfig | null): Record<string, { model: string; fallbacks?: string[] }> | null {\n const config = tc ?? loadTransport();\n if (!config) return null;\n const provider = config.providers[providerName];\n if (!provider?.defaults) return null;\n const defaults = provider.defaults;\n if (!defaults[\"professor\"]) return null;\n const profModel = defaults[\"professor\"].model;\n const result: Record<string, { model: string; fallbacks?: string[] }> = { ...defaults };\n for (const role of [\"dreamy\", \"browsie\", \"coding\"]) {\n if (!result[role]) result[role] = { model: profModel };\n }\n return result;\n}\n\n// \u2500\u2500 Model helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport function getModelsForProvider(providerName: string, models?: ModelCatalog): Array<{ id: string; entry: ModelEntry }> {\n const mc = models ?? loadModels();\n return Object.entries(mc)\n .filter(([, entry]) => entry.transports.includes(providerName))\n .map(([id, entry]) => ({ id, entry }))\n .sort((a, b) => a.entry.rank - b.entry.rank || a.entry.cost.input - b.entry.cost.input);\n}\n\nexport function formatRank(rank: number): string {\n const stars = Math.max(1, Math.min(5, 6 - rank));\n return \"\u2605\".repeat(stars) + \"\u2606\".repeat(5 - stars);\n}\n\nexport function formatCost(cost: ModelCost): string {\n if (cost.input === 0 && cost.output === 0) return \"free\";\n const inp = `$${cost.input}`;\n const out = cost.output != null ? `$${cost.output}` : \"$???\";\n return `${inp}/${out}`;\n}\n\n// \u2500\u2500 Provider readiness validation (#367) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 type ProviderValidationResult =\n | { ok: true }\n | { ok: false; reason: string; fix: string };\n\n/**\n * Minimal env accessor \u2014 just the slice validateProviderReady needs.\n * Matches the shape exposed by getEnv().\n */\nexport type EnvAccessor = {\n getApiKey(envName: string): string | undefined;\n};\n\n/**\n * Validate that a transport provider's prerequisites are in place BEFORE the\n * bridge attempts to switch to it (#367).\n *\n * Contract:\n * - `api` + `apiKeyEnv` declared \u2192 env var must be non-empty\n * - `api` + no `apiKeyEnv` \u2192 always ok (local ollama-style)\n * - `acp` \u2192 `provider.cli` must be runnable (`<cli> --version` within 3s)\n * - `tmux` \u2192 always ok (out of scope)\n *\n * Pure aside from the ACP `execSync` probe. execSync is imported lazily so\n * unit tests can stub it via dependency injection if needed.\n */\nexport function validateProviderReady(\n providerName: string,\n provider: ProviderConfig,\n env: EnvAccessor,\n): ProviderValidationResult {\n if (provider.transport === \"tmux\") return { ok: true };\n\n if (provider.transport === \"api\") {\n if (!provider.apiKeyEnv) return { ok: true };\n const key = env.getApiKey(provider.apiKeyEnv);\n if (!key) {\n return {\n ok: false,\n reason: `${providerName} requires API key from env var '${provider.apiKeyEnv}' but it's not set`,\n fix: `Add ${provider.apiKeyEnv}=... to .env and restart`,\n };\n }\n return { ok: true };\n }\n\n if (provider.transport === \"acp\") {\n const cli = provider.cli;\n if (!cli) {\n return {\n ok: false,\n reason: `ACP provider ${providerName} has no 'cli' field set in transport.json`,\n fix: `Add \\\"cli\\\": \\\"<path-to-cli>\\\" to provider ${providerName} in transport.json`,\n };\n }\n try {\n // Inline require so mocks work in tests and production stays synchronous.\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const { execSync } = require(\"node:child_process\") as typeof import(\"node:child_process\");\n execSync(`${cli} --version`, { timeout: 3000, stdio: \"pipe\" });\n return { ok: true };\n } catch (err) {\n const errMsg = err instanceof Error ? err.message.split(\"\\n\")[0] : String(err);\n return {\n ok: false,\n reason: `ACP provider ${providerName} CLI '${cli}' is not runnable (${errMsg})`,\n fix: `Install ${cli} or update its path in transport.json`,\n };\n }\n }\n\n // Unknown transport \u2014 fail closed with a clear message.\n return {\n ok: false,\n reason: `Unknown transport type '${(provider as ProviderConfig).transport}' for provider ${providerName}`,\n fix: `Use 'api', 'acp', or 'tmux' for provider.transport`,\n };\n}\n\n/** Format a validation failure for user-visible error messages. */\nexport function formatValidationError(providerName: string, result: ProviderValidationResult): string {\n if (result.ok) return \"\";\n return `\u274C Cannot switch to ${providerName}: ${result.reason}\\n Fix: ${result.fix}`;\n}\n"],
5
- "mappings": "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",
6
- "names": ["err"]
7
- }
@@ -1,31 +0,0 @@
1
- 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);
2
- import {
3
- handleCommand,
4
- killWakeInhibit,
5
- registerCommand,
6
- triggerNewSession,
7
- triggerResetSession
8
- } from "./chunk-BHMZ4RCC.js";
9
- import "./chunk-HX7Y7EYP.js";
10
- import "./chunk-V76TVMCM.js";
11
- import "./chunk-X6TERNVJ.js";
12
- import "./chunk-UCQ2WC3B.js";
13
- import "./chunk-GST5T3WZ.js";
14
- import "./chunk-OP7BTAWY.js";
15
- import "./chunk-GRNENTPA.js";
16
- import "./chunk-CEVRHKJY.js";
17
- import "./chunk-PLCY3GFH.js";
18
- import "./chunk-M6VBAPNT.js";
19
- import "./chunk-FMWKEPM7.js";
20
- import "./chunk-JCJS4ZIB.js";
21
- import "./chunk-BUUVFUPO.js";
22
- import "./chunk-X76UX47U.js";
23
- import "./chunk-NWDBD4PA.js";
24
- export {
25
- handleCommand,
26
- killWakeInhibit,
27
- registerCommand,
28
- triggerNewSession,
29
- triggerResetSession
30
- };
31
- //# sourceMappingURL=commands-BHVUOU3V.js.map
@@ -1,13 +0,0 @@
1
- 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);
2
- import {
3
- addCompletion,
4
- drainCompletions,
5
- hasCompletions
6
- } from "./chunk-LSPKJQCI.js";
7
- import "./chunk-NWDBD4PA.js";
8
- export {
9
- addCompletion,
10
- drainCompletions,
11
- hasCompletions
12
- };
13
- //# sourceMappingURL=completion-buffer-P253ONKF.js.map
@@ -1,19 +0,0 @@
1
- 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);
2
- import {
3
- isValidSnowflake,
4
- loadAndValidateConfig
5
- } from "./chunk-2UENBO6M.js";
6
- import "./chunk-GST5T3WZ.js";
7
- import "./chunk-YOCTDKKL.js";
8
- import "./chunk-JCJS4ZIB.js";
9
- import "./chunk-BUUVFUPO.js";
10
- import {
11
- abtarsHome
12
- } from "./chunk-X76UX47U.js";
13
- import "./chunk-NWDBD4PA.js";
14
- export {
15
- abtarsHome,
16
- isValidSnowflake,
17
- loadAndValidateConfig
18
- };
19
- //# sourceMappingURL=config-RGSDAPZN.js.map
@@ -1,27 +0,0 @@
1
- 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);
2
- import {
3
- checkSessionTool,
4
- consumePendingInstruction,
5
- getActiveBackgrounds,
6
- getDelegationTools,
7
- sendToSessionTool,
8
- setDelegationDeps,
9
- spawnSessionTool,
10
- terminateSessionTool
11
- } from "./chunk-UHRP745J.js";
12
- import "./chunk-LSPKJQCI.js";
13
- import "./chunk-JCJS4ZIB.js";
14
- import "./chunk-BUUVFUPO.js";
15
- import "./chunk-X76UX47U.js";
16
- import "./chunk-NWDBD4PA.js";
17
- export {
18
- checkSessionTool,
19
- consumePendingInstruction,
20
- getActiveBackgrounds,
21
- getDelegationTools,
22
- sendToSessionTool,
23
- setDelegationDeps,
24
- spawnSessionTool,
25
- terminateSessionTool
26
- };
27
- //# sourceMappingURL=delegation-tools-GYTS2D6A.js.map