abtars 0.2.1-alpha.8 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +98 -42
- package/bundle/{_registry.generated-ADOYFJJ4.js → _registry.generated-FNJOX7VV.js} +19 -16
- package/bundle/{_registry.generated-ADOYFJJ4.js.map → _registry.generated-FNJOX7VV.js.map} +1 -1
- package/bundle/abtars-browser.js +5 -6
- package/bundle/abtars-browser.js.map +2 -2
- package/bundle/abtars-cli.js +339 -271
- package/bundle/abtars-cli.js.map +4 -4
- package/bundle/abtars-restart.js +4 -4
- package/bundle/abtars-rss.js +25 -81
- package/bundle/abtars-rss.js.map +2 -2
- package/bundle/abtars-task.js +4 -5
- package/bundle/abtars-task.js.map +2 -2
- package/bundle/abtars-todo.js +133 -0
- package/bundle/abtars-todo.js.map +7 -0
- package/bundle/abtars.js +239 -155
- package/bundle/abtars.js.map +3 -3
- package/bundle/action-gate-DYV2XQBP.js +191 -0
- package/bundle/action-gate-DYV2XQBP.js.map +7 -0
- package/bundle/{agent-api-rate-limit-C25WGSFF.js → agent-api-rate-limit-R2OFAQ3N.js} +4 -4
- package/bundle/{agent-registry-SYUFNSVB.js → agent-registry-S2MNHQYQ.js} +8 -8
- package/bundle/{bridge-lock-transport-HO545SBK.js → bridge-lock-transport-N6OGDOSE.js} +5 -5
- package/bundle/{browse-delivery-VTLEAVYA.js → browse-delivery-DXGMDMXA.js} +8 -7
- package/bundle/{browser-REIXOJ6S.js → browser-QMYGSP5W.js} +11 -10
- package/bundle/{capability-ILW3D5HS.js → capability-733TLH4W.js} +6 -6
- package/bundle/{chunk-ZVDVNSXK.js → chunk-2SWKJX64.js} +7 -7
- package/bundle/{chunk-PZE3J7ER.js → chunk-3OXQWII3.js} +2 -2
- package/bundle/{chunk-R36WIOYX.js → chunk-3X6VGRL6.js} +33 -6
- package/bundle/chunk-3X6VGRL6.js.map +7 -0
- package/bundle/{chunk-4KJ76TTE.js → chunk-4XW7YA3K.js} +3 -3
- package/bundle/{chunk-Q62SXS73.js → chunk-BBDKU4EH.js} +9 -9
- package/bundle/{chunk-EX2SRTUE.js → chunk-CYSGXNBY.js} +2 -2
- package/bundle/{chunk-LYEAHE5V.js → chunk-DCY7DGMT.js} +2 -2
- package/bundle/chunk-DGS7J4P6.js +13 -0
- package/bundle/chunk-DGS7J4P6.js.map +7 -0
- package/bundle/{chunk-LDKSCXGL.js → chunk-DHPFI7OF.js} +8 -6
- package/bundle/{chunk-LDKSCXGL.js.map → chunk-DHPFI7OF.js.map} +1 -1
- package/bundle/{chunk-G6IXMYIO.js → chunk-DO4INSXE.js} +2 -2
- package/bundle/{chunk-VA5WKN3Z.js → chunk-EGA6JQVV.js} +4 -4
- package/bundle/chunk-EKHNWFEQ.js +85 -0
- package/bundle/chunk-EKHNWFEQ.js.map +7 -0
- package/bundle/{chunk-URAQLQ2U.js → chunk-F3HMZFIL.js} +4 -4
- package/bundle/{chunk-OOKLEC6V.js → chunk-FY3QUO2L.js} +7 -7
- package/bundle/{chunk-2BY6I4P5.js → chunk-GUTRAMK3.js} +2 -2
- package/bundle/{chunk-GPL57SRN.js → chunk-H7RX7UCR.js} +3 -3
- package/bundle/{chunk-BYDUMHXT.js → chunk-HAF2AFBW.js} +2 -2
- package/bundle/{chunk-A5OJYQNU.js → chunk-HCYENZAB.js} +49 -22
- package/bundle/chunk-HCYENZAB.js.map +7 -0
- package/bundle/{chunk-OZ4IZFV4.js → chunk-HJQZP5CK.js} +9 -9
- package/bundle/{chunk-OZ4IZFV4.js.map → chunk-HJQZP5CK.js.map} +2 -2
- package/bundle/{chunk-HEHD3GG5.js → chunk-ITB2K6LI.js} +6 -13
- package/bundle/{chunk-HEHD3GG5.js.map → chunk-ITB2K6LI.js.map} +3 -3
- package/bundle/{chunk-KSEIWT4T.js → chunk-JFKOPNKL.js} +10 -10
- package/bundle/chunk-JFKOPNKL.js.map +7 -0
- package/bundle/{chunk-4BUOO6WI.js → chunk-KL5QRHHK.js} +31 -11
- package/bundle/chunk-KL5QRHHK.js.map +7 -0
- package/bundle/{chunk-KFENC7BM.js → chunk-L33WNMCP.js} +2 -2
- package/bundle/{chunk-JRG4EFMP.js → chunk-LBMETTUP.js} +3 -3
- package/bundle/{chunk-TYVI3ZWA.js → chunk-LJAG2URA.js} +10 -7
- package/bundle/chunk-LJAG2URA.js.map +7 -0
- package/bundle/{chunk-RV54J75Q.js → chunk-MHK4UPM6.js} +13 -12
- package/bundle/chunk-MHK4UPM6.js.map +7 -0
- package/bundle/chunk-NIYVCGBC.js +330 -0
- package/bundle/chunk-NIYVCGBC.js.map +7 -0
- package/bundle/{chunk-P2BZSLJJ.js → chunk-OGZXYN6E.js} +392 -125
- package/bundle/chunk-OGZXYN6E.js.map +7 -0
- package/bundle/{chunk-TOUZC6NR.js → chunk-OKMN6J4Z.js} +3 -3
- package/bundle/{chunk-CELR236Q.js → chunk-Q7CH5DA3.js} +2 -2
- package/bundle/{chunk-XZSYMCLF.js → chunk-QIAFGDRL.js} +7 -7
- package/bundle/chunk-RITEGAW6.js +138 -0
- package/bundle/chunk-RITEGAW6.js.map +7 -0
- package/bundle/{chunk-UDZIZB5F.js → chunk-RTL7HO3N.js} +3 -3
- package/bundle/{chunk-ITG6XGBS.js → chunk-SA44ITVX.js} +10 -10
- package/bundle/{chunk-3MO2MDXJ.js → chunk-SA6YEFNG.js} +3 -3
- package/bundle/{chunk-GBBTK6H2.js → chunk-SRFEIZQT.js} +4 -4
- package/bundle/{chunk-ELRAH7VL.js → chunk-VXUVKC66.js} +3 -3
- package/bundle/{chunk-X5FBUA53.js → chunk-WLAVZSVZ.js} +69 -30
- package/bundle/chunk-WLAVZSVZ.js.map +7 -0
- package/bundle/{chunk-RSWUPUNA.js → chunk-WMWI3SJ7.js} +30 -6
- package/bundle/chunk-WMWI3SJ7.js.map +7 -0
- package/bundle/{chunk-MJ6PHMOK.js → chunk-WW5F2DCO.js} +11 -2
- package/bundle/chunk-WW5F2DCO.js.map +7 -0
- package/bundle/chunk-YWZPKBO6.js +22 -0
- package/bundle/chunk-YWZPKBO6.js.map +7 -0
- package/bundle/{chunk-KWBGYWDO.js → chunk-Z4SWEFIY.js} +12 -14
- package/bundle/chunk-Z4SWEFIY.js.map +7 -0
- package/bundle/chunk-ZAA7B5BN.js +22 -0
- package/bundle/chunk-ZAA7B5BN.js.map +7 -0
- package/bundle/{commands-WUGPBPHI.js → commands-AXW7L2MZ.js} +15 -14
- package/bundle/{config-DQIGDX4W.js → config-NDEYF4AQ.js} +7 -7
- package/bundle/{daemon-NPKYZ3CJ.js → daemon-WOQXCKNL.js} +4 -4
- package/bundle/{delegation-tools-6FICZQ5G.js → delegation-tools-Z5OM3TXS.js} +5 -5
- package/bundle/{deploy-lib-import-SBKXDD3F.js → deploy-lib-import-6VJTYXEG.js} +2 -2
- package/bundle/{deps-HN6CEXA4.js → deps-65V7XXG4.js} +4 -4
- package/bundle/{direct-api-transport-TRV45NO6.js → direct-api-transport-LSAUIP5S.js} +27 -15
- package/bundle/direct-api-transport-LSAUIP5S.js.map +7 -0
- package/bundle/{discord-adapter-WA2MFRK3.js → discord-adapter-LNWTIOUK.js} +27 -24
- package/bundle/discord-adapter-LNWTIOUK.js.map +7 -0
- package/bundle/{dns-wakeup-RYOCQ6GR.js → dns-wakeup-N46RPU5E.js} +3 -3
- package/bundle/{doctor-R54GZPKL.js → doctor-PIPSGI3H.js} +18 -7
- package/bundle/{doctor-R54GZPKL.js.map → doctor-PIPSGI3H.js.map} +2 -2
- package/bundle/{ensure-invariants-BJIEOSJ2.js → ensure-invariants-3NOBCYWS.js} +4 -4
- package/bundle/{env-schema-XCPAJ6IZ.js → env-schema-T43X43BU.js} +4 -4
- package/bundle/{hook-system-POI5VRIX.js → hook-system-ZCVOFFRD.js} +4 -4
- package/bundle/hotskills-DTROJY6G.js +17 -0
- package/bundle/{install-GEXWJYJC.js → install-FZT43PTH.js} +3 -3
- package/bundle/{install-manifest-QRWID3KZ.js → install-manifest-KBYD7SAY.js} +3 -3
- package/bundle/{irc-adapter-AIEP6OX6.js → irc-adapter-HXO5D4SW.js} +3 -3
- package/bundle/{irc-config-6VY67UPQ.js → irc-config-XN5VW2V4.js} +5 -5
- package/bundle/{lazy-require-UFYFFX2R.js → lazy-require-R3JYCV5M.js} +4 -4
- package/bundle/{media-utils-MOE36VWY.js → media-utils-W7XW3SVV.js} +4 -4
- package/bundle/{message-pipeline-2MBT44FO.js → message-pipeline-QX272U5X.js} +17 -14
- package/bundle/meta.json +2965 -2294
- package/bundle/{notification-U6F5ZBSG.js → notification-ULESRDHB.js} +7 -6
- package/bundle/{openrouter-credits-7XXO6QGQ.js → openrouter-credits-PLIKRY5D.js} +4 -4
- package/bundle/{paths-ZJYIDND2.js → paths-QQM74XYT.js} +4 -2
- package/bundle/{peer-client-T44VI7NB.js → peer-client-D2F5QWRV.js} +8 -8
- package/bundle/{peer-config-D5A4454H.js → peer-config-5SUIBJLG.js} +5 -5
- package/bundle/{phase-transport-FEZ4SIJJ.js → phase-transport-BSGROTHY.js} +10 -10
- package/bundle/restore-Z6MF54HS.js +151 -0
- package/bundle/restore-Z6MF54HS.js.map +7 -0
- package/bundle/{install-SH4UVUXQ.js → rollback-5RXXLUD6.js} +5 -7
- package/bundle/{self-healer-utils-7NFH22VJ.js → self-healer-utils-WPKOVXJD.js} +4 -4
- package/bundle/{skill-stats-IPVKMWN3.js → skill-stats-NHNH47QW.js} +5 -5
- package/bundle/{sleep-BPWX3FCN.js → sleep-K7EXAFGW.js} +8 -8
- package/bundle/{soul-bundle-BRIUDEQ2.js → soul-bundle-QTPWDJB2.js} +7 -7
- package/bundle/{soul-loader-GBXJ7EBH.js → soul-loader-LCPTN4PK.js} +8 -8
- package/bundle/{sse-parser-anthropic-H42TTLBD.js → sse-parser-anthropic-PYDJM3UC.js} +4 -4
- package/bundle/{sse-parser-responses-WG2LY2ML.js → sse-parser-responses-FYT7A5WT.js} +4 -4
- package/bundle/{ssrf-guard-E2KBBC5E.js → ssrf-guard-R4P5OCTO.js} +4 -4
- package/bundle/{start-CBVKNEAT.js → start-4DNURGIY.js} +1 -1
- package/bundle/{stt-CF3CPFDC.js → stt-YN77NND6.js} +5 -5
- package/bundle/{subagent-runtime-4MTYUBIZ.js → subagent-runtime-FQAT3564.js} +5 -5
- package/bundle/system-event-buffer-OEPPNUGK.js +17 -0
- package/bundle/system-event-buffer-OEPPNUGK.js.map +7 -0
- package/bundle/{system-message-TALP6GP2.js → system-message-BRU267FW.js} +3 -3
- package/bundle/{system-status-GLYXXDE3.js → system-status-7K2QTH3J.js} +58 -51
- package/bundle/system-status-7K2QTH3J.js.map +7 -0
- package/bundle/{hotskills-6ECHLXTJ.js → task-failure-buffer-DPM5MWZ5.js} +8 -7
- package/bundle/{task-store-LC7ZMS72.js → task-store-VCBHAB43.js} +5 -5
- package/bundle/{telegram-adapter-BJJYXN7J.js → telegram-adapter-LXLSG4SK.js} +51 -33
- package/bundle/telegram-adapter-LXLSG4SK.js.map +7 -0
- package/bundle/{tool-registry-T7XLTI2Q.js → tool-registry-5PXNSYOI.js} +12 -9
- package/bundle/{tool-sandbox-OZMXJZLQ.js → tool-sandbox-TLAL55QP.js} +5 -5
- package/bundle/{transport-config-G5NKQXPJ.js → transport-config-JIKHB7GT.js} +8 -8
- package/bundle/update-check-AJMIBQGQ.js +81 -0
- package/bundle/update-check-AJMIBQGQ.js.map +7 -0
- package/bundle/{user-registry-NUVNEHJU.js → user-registry-PEFDZ5AV.js} +5 -5
- package/core/skills/tools/rss/SKILL.md +51 -0
- package/install-manifest.json +4 -2
- package/package.json +4 -4
- package/scripts/build-and-deploy.sh +28 -0
- package/scripts/daily-backup.sh +1 -79
- package/scripts/doctor.sh +38 -0
- package/scripts/emergency-deploy.sh +95 -0
- package/scripts/watchdog.sh +51 -5
- package/bundle/chunk-4BUOO6WI.js.map +0 -7
- package/bundle/chunk-A5OJYQNU.js.map +0 -7
- package/bundle/chunk-JX3ZZU3O.js +0 -82
- package/bundle/chunk-JX3ZZU3O.js.map +0 -7
- package/bundle/chunk-KJOCXWJ5.js +0 -131
- package/bundle/chunk-KJOCXWJ5.js.map +0 -7
- package/bundle/chunk-KSEIWT4T.js.map +0 -7
- package/bundle/chunk-KWBGYWDO.js.map +0 -7
- package/bundle/chunk-MJ6PHMOK.js.map +0 -7
- package/bundle/chunk-P2BZSLJJ.js.map +0 -7
- package/bundle/chunk-R36WIOYX.js.map +0 -7
- package/bundle/chunk-RE3F3CFW.js +0 -300
- package/bundle/chunk-RE3F3CFW.js.map +0 -7
- package/bundle/chunk-RJJWPMUZ.js +0 -411
- package/bundle/chunk-RJJWPMUZ.js.map +0 -7
- package/bundle/chunk-RSWUPUNA.js.map +0 -7
- package/bundle/chunk-RV54J75Q.js.map +0 -7
- package/bundle/chunk-RVERPUHT.js +0 -289
- package/bundle/chunk-RVERPUHT.js.map +0 -7
- package/bundle/chunk-TYVI3ZWA.js.map +0 -7
- package/bundle/chunk-X5FBUA53.js.map +0 -7
- package/bundle/deploy-lib-import-HCMZCKZD.js +0 -50
- package/bundle/direct-api-transport-TRV45NO6.js.map +0 -7
- package/bundle/discord-adapter-WA2MFRK3.js.map +0 -7
- package/bundle/restore-ROJF22R2.js +0 -47
- package/bundle/restore-ROJF22R2.js.map +0 -7
- package/bundle/system-status-GLYXXDE3.js.map +0 -7
- package/bundle/telegram-adapter-BJJYXN7J.js.map +0 -7
- package/bundle/update-check-O5MS6B3L.js +0 -13
- package/bundle/user-registry-NUVNEHJU.js.map +0 -7
- /package/bundle/{agent-api-rate-limit-C25WGSFF.js.map → agent-api-rate-limit-R2OFAQ3N.js.map} +0 -0
- /package/bundle/{agent-registry-SYUFNSVB.js.map → agent-registry-S2MNHQYQ.js.map} +0 -0
- /package/bundle/{bridge-lock-transport-HO545SBK.js.map → bridge-lock-transport-N6OGDOSE.js.map} +0 -0
- /package/bundle/{browse-delivery-VTLEAVYA.js.map → browse-delivery-DXGMDMXA.js.map} +0 -0
- /package/bundle/{browser-REIXOJ6S.js.map → browser-QMYGSP5W.js.map} +0 -0
- /package/bundle/{capability-ILW3D5HS.js.map → capability-733TLH4W.js.map} +0 -0
- /package/bundle/{chunk-ZVDVNSXK.js.map → chunk-2SWKJX64.js.map} +0 -0
- /package/bundle/{chunk-PZE3J7ER.js.map → chunk-3OXQWII3.js.map} +0 -0
- /package/bundle/{chunk-4KJ76TTE.js.map → chunk-4XW7YA3K.js.map} +0 -0
- /package/bundle/{chunk-Q62SXS73.js.map → chunk-BBDKU4EH.js.map} +0 -0
- /package/bundle/{chunk-EX2SRTUE.js.map → chunk-CYSGXNBY.js.map} +0 -0
- /package/bundle/{chunk-LYEAHE5V.js.map → chunk-DCY7DGMT.js.map} +0 -0
- /package/bundle/{chunk-G6IXMYIO.js.map → chunk-DO4INSXE.js.map} +0 -0
- /package/bundle/{chunk-VA5WKN3Z.js.map → chunk-EGA6JQVV.js.map} +0 -0
- /package/bundle/{chunk-URAQLQ2U.js.map → chunk-F3HMZFIL.js.map} +0 -0
- /package/bundle/{chunk-OOKLEC6V.js.map → chunk-FY3QUO2L.js.map} +0 -0
- /package/bundle/{chunk-2BY6I4P5.js.map → chunk-GUTRAMK3.js.map} +0 -0
- /package/bundle/{chunk-GPL57SRN.js.map → chunk-H7RX7UCR.js.map} +0 -0
- /package/bundle/{chunk-BYDUMHXT.js.map → chunk-HAF2AFBW.js.map} +0 -0
- /package/bundle/{chunk-KFENC7BM.js.map → chunk-L33WNMCP.js.map} +0 -0
- /package/bundle/{chunk-JRG4EFMP.js.map → chunk-LBMETTUP.js.map} +0 -0
- /package/bundle/{chunk-TOUZC6NR.js.map → chunk-OKMN6J4Z.js.map} +0 -0
- /package/bundle/{chunk-CELR236Q.js.map → chunk-Q7CH5DA3.js.map} +0 -0
- /package/bundle/{chunk-XZSYMCLF.js.map → chunk-QIAFGDRL.js.map} +0 -0
- /package/bundle/{chunk-UDZIZB5F.js.map → chunk-RTL7HO3N.js.map} +0 -0
- /package/bundle/{chunk-ITG6XGBS.js.map → chunk-SA44ITVX.js.map} +0 -0
- /package/bundle/{chunk-3MO2MDXJ.js.map → chunk-SA6YEFNG.js.map} +0 -0
- /package/bundle/{chunk-GBBTK6H2.js.map → chunk-SRFEIZQT.js.map} +0 -0
- /package/bundle/{chunk-ELRAH7VL.js.map → chunk-VXUVKC66.js.map} +0 -0
- /package/bundle/{commands-WUGPBPHI.js.map → commands-AXW7L2MZ.js.map} +0 -0
- /package/bundle/{config-DQIGDX4W.js.map → config-NDEYF4AQ.js.map} +0 -0
- /package/bundle/{daemon-NPKYZ3CJ.js.map → daemon-WOQXCKNL.js.map} +0 -0
- /package/bundle/{delegation-tools-6FICZQ5G.js.map → delegation-tools-Z5OM3TXS.js.map} +0 -0
- /package/bundle/{deploy-lib-import-HCMZCKZD.js.map → deploy-lib-import-6VJTYXEG.js.map} +0 -0
- /package/bundle/{deps-HN6CEXA4.js.map → deps-65V7XXG4.js.map} +0 -0
- /package/bundle/{dns-wakeup-RYOCQ6GR.js.map → dns-wakeup-N46RPU5E.js.map} +0 -0
- /package/bundle/{ensure-invariants-BJIEOSJ2.js.map → ensure-invariants-3NOBCYWS.js.map} +0 -0
- /package/bundle/{deploy-lib-import-SBKXDD3F.js.map → env-schema-T43X43BU.js.map} +0 -0
- /package/bundle/{env-schema-XCPAJ6IZ.js.map → hook-system-ZCVOFFRD.js.map} +0 -0
- /package/bundle/{hook-system-POI5VRIX.js.map → hotskills-DTROJY6G.js.map} +0 -0
- /package/bundle/{hotskills-6ECHLXTJ.js.map → install-FZT43PTH.js.map} +0 -0
- /package/bundle/{install-manifest-QRWID3KZ.js.map → install-manifest-KBYD7SAY.js.map} +0 -0
- /package/bundle/{irc-adapter-AIEP6OX6.js.map → irc-adapter-HXO5D4SW.js.map} +0 -0
- /package/bundle/{irc-config-6VY67UPQ.js.map → irc-config-XN5VW2V4.js.map} +0 -0
- /package/bundle/{install-GEXWJYJC.js.map → lazy-require-R3JYCV5M.js.map} +0 -0
- /package/bundle/{media-utils-MOE36VWY.js.map → media-utils-W7XW3SVV.js.map} +0 -0
- /package/bundle/{install-SH4UVUXQ.js.map → message-pipeline-QX272U5X.js.map} +0 -0
- /package/bundle/{lazy-require-UFYFFX2R.js.map → notification-ULESRDHB.js.map} +0 -0
- /package/bundle/{openrouter-credits-7XXO6QGQ.js.map → openrouter-credits-PLIKRY5D.js.map} +0 -0
- /package/bundle/{message-pipeline-2MBT44FO.js.map → paths-QQM74XYT.js.map} +0 -0
- /package/bundle/{peer-client-T44VI7NB.js.map → peer-client-D2F5QWRV.js.map} +0 -0
- /package/bundle/{notification-U6F5ZBSG.js.map → peer-config-5SUIBJLG.js.map} +0 -0
- /package/bundle/{paths-ZJYIDND2.js.map → phase-transport-BSGROTHY.js.map} +0 -0
- /package/bundle/{peer-config-D5A4454H.js.map → rollback-5RXXLUD6.js.map} +0 -0
- /package/bundle/{self-healer-utils-7NFH22VJ.js.map → self-healer-utils-WPKOVXJD.js.map} +0 -0
- /package/bundle/{phase-transport-FEZ4SIJJ.js.map → skill-stats-NHNH47QW.js.map} +0 -0
- /package/bundle/{skill-stats-IPVKMWN3.js.map → sleep-K7EXAFGW.js.map} +0 -0
- /package/bundle/{sleep-BPWX3FCN.js.map → soul-bundle-QTPWDJB2.js.map} +0 -0
- /package/bundle/{soul-bundle-BRIUDEQ2.js.map → soul-loader-LCPTN4PK.js.map} +0 -0
- /package/bundle/{sse-parser-anthropic-H42TTLBD.js.map → sse-parser-anthropic-PYDJM3UC.js.map} +0 -0
- /package/bundle/{sse-parser-responses-WG2LY2ML.js.map → sse-parser-responses-FYT7A5WT.js.map} +0 -0
- /package/bundle/{ssrf-guard-E2KBBC5E.js.map → ssrf-guard-R4P5OCTO.js.map} +0 -0
- /package/bundle/{start-CBVKNEAT.js.map → start-4DNURGIY.js.map} +0 -0
- /package/bundle/{soul-loader-GBXJ7EBH.js.map → stt-YN77NND6.js.map} +0 -0
- /package/bundle/{stt-CF3CPFDC.js.map → subagent-runtime-FQAT3564.js.map} +0 -0
- /package/bundle/{system-message-TALP6GP2.js.map → system-message-BRU267FW.js.map} +0 -0
- /package/bundle/{subagent-runtime-4MTYUBIZ.js.map → task-failure-buffer-DPM5MWZ5.js.map} +0 -0
- /package/bundle/{task-store-LC7ZMS72.js.map → task-store-VCBHAB43.js.map} +0 -0
- /package/bundle/{tool-registry-T7XLTI2Q.js.map → tool-registry-5PXNSYOI.js.map} +0 -0
- /package/bundle/{tool-sandbox-OZMXJZLQ.js.map → tool-sandbox-TLAL55QP.js.map} +0 -0
- /package/bundle/{transport-config-G5NKQXPJ.js.map → transport-config-JIKHB7GT.js.map} +0 -0
- /package/bundle/{update-check-O5MS6B3L.js.map → user-registry-PEFDZ5AV.js.map} +0 -0
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { createRequire as __bundleCreateRequire } from 'node:module'; import { fileURLToPath as __bundleFileURLToPath } from 'node:url'; import { dirname as __bundleDirname } from 'node:path'; const require = __bundleCreateRequire(import.meta.url); const __chunk_filename = __bundleFileURLToPath(import.meta.url); const __chunk_dirname = __bundleDirname(__chunk_filename);
|
|
3
|
+
|
|
4
|
+
// src/utils/date.ts
|
|
5
|
+
function localDate() {
|
|
6
|
+
const d = /* @__PURE__ */ new Date();
|
|
7
|
+
return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, "0")}-${String(d.getDate()).padStart(2, "0")}`;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export {
|
|
11
|
+
localDate
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=chunk-DGS7J4P6.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/utils/date.ts"],
|
|
4
|
+
"sourcesContent": ["/** Local date as YYYY-MM-DD (not UTC). */\nexport function localDate(): string {\n const d = new Date();\n return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, \"0\")}-${String(d.getDate()).padStart(2, \"0\")}`;\n}\n"],
|
|
5
|
+
"mappings": ";;;;AACO,SAAS,YAAoB;AAClC,QAAM,IAAI,oBAAI,KAAK;AACnB,SAAO,GAAG,EAAE,YAAY,CAAC,IAAI,OAAO,EAAE,SAAS,IAAI,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC,IAAI,OAAO,EAAE,QAAQ,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC;AAChH;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -2,22 +2,24 @@
|
|
|
2
2
|
import { createRequire as __bundleCreateRequire } from 'node:module'; import { fileURLToPath as __bundleFileURLToPath } from 'node:url'; import { dirname as __bundleDirname } from 'node:path'; const require = __bundleCreateRequire(import.meta.url); const __chunk_filename = __bundleFileURLToPath(import.meta.url); const __chunk_dirname = __bundleDirname(__chunk_filename);
|
|
3
3
|
import {
|
|
4
4
|
appendReminder,
|
|
5
|
-
localDate,
|
|
6
5
|
require_main
|
|
7
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-ITB2K6LI.js";
|
|
8
7
|
import {
|
|
9
8
|
init_log_and_swallow,
|
|
10
9
|
logAndSwallow
|
|
11
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-CYSGXNBY.js";
|
|
12
11
|
import {
|
|
13
12
|
init_logger,
|
|
14
13
|
logInfo,
|
|
15
14
|
logWarn
|
|
16
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-GUTRAMK3.js";
|
|
16
|
+
import {
|
|
17
|
+
localDate
|
|
18
|
+
} from "./chunk-DGS7J4P6.js";
|
|
17
19
|
import {
|
|
18
20
|
abtarsHome,
|
|
19
21
|
init_paths
|
|
20
|
-
} from "./chunk-
|
|
22
|
+
} from "./chunk-WW5F2DCO.js";
|
|
21
23
|
import {
|
|
22
24
|
__toESM
|
|
23
25
|
} from "./chunk-7K2YZTLD.js";
|
|
@@ -204,4 +206,4 @@ export {
|
|
|
204
206
|
deliverBrowseResult,
|
|
205
207
|
checkBrowseTasks
|
|
206
208
|
};
|
|
207
|
-
//# sourceMappingURL=chunk-
|
|
209
|
+
//# sourceMappingURL=chunk-DHPFI7OF.js.map
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/capabilities/browser/browse-delivery.ts", "../src/capabilities/browser/abtars-browse.ts"],
|
|
4
4
|
"sourcesContent": ["/**\n * Browse task delivery \u2014 write report + notify user via reminder.\n * Called from runtime.spawn() onComplete/onError callbacks.\n */\n\nimport { writeFileSync, mkdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { abtarsHome } from \"../../paths.js\";\nimport { logInfo, logWarn } from \"../../components/logger.js\";\nimport { localDate } from \"../../utils/date.js\";\nimport { appendReminder } from \"../../components/tasks/task-checker.js\";\nimport { readPendingBrowse, writePendingBrowse } from \"./abtars-browse.js\";\nimport type { PendingBrowseEntry } from \"./abtars-browse.js\";\n\nconst TAG = \"browse-delivery\";\n\nconst subagentsDir = (): string => join(abtarsHome(), \"subagents\");\n\n/** Deliver result for a browse task. Called by runtime.spawn() callback. */\nexport function deliverBrowseResult(entry: PendingBrowseEntry, result: string): void {\n const dir = subagentsDir();\n mkdirSync(dir, { recursive: true });\n const date = localDate();\n const reportPath = join(dir, `browse_${entry.taskId}_${date}.md`);\n writeFileSync(reportPath, result || \"(no output captured)\", \"utf-8\");\n\n const taskLabel = entry.task.length > 200 ? entry.task.slice(0, 200) + \"\u2026\" : entry.task;\n const msg = `\uD83C\uDF10 Browse task complete: ${taskLabel}\\nReport: ${reportPath}`;\n appendReminder({ chatId: entry.chatId, message: msg, createdAt: Date.now(), threadId: entry.threadId });\n logInfo(TAG, `\uD83C\uDF10 Browse \"${taskLabel}\" finished \u2014 ${reportPath}`);\n}\n\n/** Safety net: check for stale pending entries (runtime handles timeouts, this catches orphans). */\nexport function checkBrowseTasks(): void {\n const entries = readPendingBrowse();\n if (entries.length === 0) return;\n\n const now = Date.now();\n const remaining: PendingBrowseEntry[] = [];\n\n for (const entry of entries) {\n const elapsed = now - entry.startedAt;\n if (elapsed > entry.timeoutMs + 60_000) {\n // Stale entry \u2014 runtime should have cleaned up, remove orphan\n const taskLabel = entry.task.length > 200 ? entry.task.slice(0, 200) + \"\u2026\" : entry.task;\n logWarn(TAG, `Removing stale browse entry: ${taskLabel} (${Math.round(elapsed / 1000)}s old)`);\n } else {\n remaining.push(entry);\n }\n }\n\n if (remaining.length !== entries.length) writePendingBrowse(remaining);\n}\n", "#!/usr/bin/env node\n/**\n * abtars-browse \u2014 spawn a browser subagent for autonomous web tasks.\n *\n * Usage:\n * abtars-browse --task \"check X notifications\" --chat-id 7773842843\n * abtars-browse --task \"post on FB\" --chat-id 123 --timeout 600\n * abtars-browse --task \"research topic\" --chat-id 123 --dry-run\n *\n * Returns immediately. The subagent runs detached and results are delivered\n * via pending_reminders.json \u2192 bridge picks up \u2192 sends to chat.\n */\nimport { readFileSync, writeFileSync, existsSync, mkdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { abtarsHome } from \"../../paths.js\";\nimport { logAndSwallow } from \"../../components/log-and-swallow.js\";\n\nconst TAG = \"browse\";\nimport { randomBytes } from \"node:crypto\";\nimport { config as loadDotenv } from \"dotenv\";\nimport { localDate } from \"../../utils/date.js\";\n\n// --- Types ---\n\nexport interface BrowseArgs {\n task?: string;\n chatId?: string;\n threadId?: string;\n timeout?: string;\n engine?: string;\n dryRun: boolean;\n}\n\nexport interface PendingBrowseEntry {\n taskId: string;\n task: string;\n chatId: number;\n threadId?: number;\n pid: number;\n startedAt: number;\n timeoutMs: number;\n logFile: string;\n}\n\n// --- Arg parsing ---\n\nexport function parseArgs(argv: string[]): BrowseArgs {\n const args = argv.slice(2);\n const parsed: BrowseArgs = { dryRun: false };\n for (let i = 0; i < args.length; i++) {\n switch (args[i]) {\n case \"--task\": parsed.task = args[++i] ?? \"\"; break;\n case \"--chat-id\": parsed.chatId = args[++i] ?? \"\"; break;\n case \"--thread-id\": parsed.threadId = args[++i] ?? \"\"; break;\n case \"--timeout\": parsed.timeout = args[++i] ?? \"\"; break;\n case \"--engine\": parsed.engine = args[++i] ?? \"\"; break;\n case \"--dry-run\": parsed.dryRun = true; break;\n }\n }\n return parsed;\n}\n\nexport function validateArgs(args: BrowseArgs): { ok: true; task: string; chatId: number; threadId?: number; timeoutMs: number } | { ok: false; error: string } {\n if (!args.task) return { ok: false, error: \"--task is required\" };\n if (!args.chatId) return { ok: false, error: \"--chat-id is required\" };\n const chatId = parseInt(args.chatId, 10);\n if (!Number.isFinite(chatId)) return { ok: false, error: \"invalid --chat-id\" };\n const threadId = args.threadId ? parseInt(args.threadId, 10) : undefined;\n const timeoutMs = args.timeout ? parseInt(args.timeout, 10) * 1000 : 5 * 60 * 1000;\n if (!Number.isFinite(timeoutMs)) return { ok: false, error: \"invalid --timeout\" };\n const task = args.task.length > 2000 ? args.task.slice(0, 2000) + \"\u2026\" : args.task;\n return { ok: true, task, chatId, threadId, timeoutMs };\n}\n\n// --- Prompt loading ---\n\nexport function loadBrowsePrompt(task: string, _chatId: number, taskId?: string): string {\n const path = join(abtarsHome(), \"prompts\", \"browsing_prompt.md\");\n\n if (!existsSync(path)) {\n throw new Error(`browsing_prompt.md not found at ${path}`);\n }\n const template = readFileSync(path, \"utf-8\");\n\n const date = localDate();\n const reportFile = `browse_${taskId ?? \"unknown\"}_${date}.md`;\n\n const vars: Record<string, string> = {\n TASK: task,\n TASK_ID: taskId ?? \"unknown\",\n DATE: date,\n REPORT_FILE: reportFile,\n };\n\n let result = template;\n for (const [key, value] of Object.entries(vars)) {\n result = result.replaceAll(`\\${${key}}`, value);\n }\n return result;\n}\n\n// --- Pending browse file ---\n\nconst pendingPath = (): string => join(abtarsHome(), \"workspace\", \"browse\", \"pending_browse.json\");\n\nexport function readPendingBrowse(): PendingBrowseEntry[] {\n const p = pendingPath();\n if (!existsSync(p)) return [];\n try { return JSON.parse(readFileSync(p, \"utf-8\")) as PendingBrowseEntry[]; }\n catch (err) { logAndSwallow(TAG, \"readPendingBrowse\", err); return []; }\n}\n\nexport function writePendingBrowse(entries: PendingBrowseEntry[]): void {\n const dir = join(abtarsHome(), \"workspace\", \"browse\");\n mkdirSync(dir, { recursive: true });\n writeFileSync(pendingPath(), JSON.stringify(entries, null, 2), \"utf-8\");\n}\n\n// --- Main ---\n\nexport async function main(argv: string[] = process.argv): Promise<void> {\n if (argv.includes(\"--help\")) {\n console.log(`abtars-browse \u2014 delegate a browser task to the Browsie agent.\n\nUsage:\n abtars-browse --task \"check X notifications\" --chat-id ID\n abtars-browse --task \"research topic\" --chat-id ID --timeout 600\n abtars-browse --task \"research topic\" --chat-id ID --dry-run`);\n process.exit(0);\n }\n\n loadDotenv({ path: join(abtarsHome(), \".env\") });\n const raw = parseArgs(argv);\n const validation = validateArgs(raw);\n\n if (!validation.ok) {\n console.log(JSON.stringify({ ok: false, error: validation.error }));\n process.exit(1);\n }\n\n const { task, chatId, threadId, timeoutMs } = validation;\n const taskId = randomBytes(3).toString(\"hex\");\n\n // Dry-run: print prompt and exit\n if (raw.dryRun) {\n const prompt = loadBrowsePrompt(task, chatId, taskId);\n process.stdout.write(prompt + \"\\n\");\n return;\n }\n\n mkdirSync(join(abtarsHome(), \"subagents\"), { recursive: true });\n\n const prompt = loadBrowsePrompt(task, chatId, taskId);\n\n // Send spawn request to bridge via IPC\n const spawnSocket = join(abtarsHome(), \"browser-socket\", \"browse-spawn.sock\");\n const net = await import(\"node:net\");\n const result = await new Promise<{ ok: boolean; taskId?: string; error?: string }>((resolve, reject) => {\n const conn = net.createConnection(spawnSocket);\n conn.on(\"connect\", () => {\n conn.write(JSON.stringify({ taskId, task, prompt, chatId, threadId, timeoutMs }) + \"\\n\");\n });\n let buf = \"\";\n conn.on(\"data\", (chunk) => {\n buf += chunk.toString();\n const nl = buf.indexOf(\"\\n\");\n if (nl === -1) return;\n conn.end();\n try { resolve(JSON.parse(buf.slice(0, nl))); } catch (e) { reject(e); }\n });\n conn.on(\"error\", reject);\n conn.setTimeout(10_000, () => { conn.destroy(); reject(new Error(\"IPC timeout\")); });\n });\n\n console.log(JSON.stringify(result));\n}\n\nconst isDirectRun = process.argv[1]?.endsWith(\"abtars-browse.ts\") ||\n process.argv[1]?.endsWith(\"abtars-browse.js\");\nif (isDirectRun) main();\n"],
|
|
5
|
-
"mappings": "
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["writeFileSync", "mkdirSync", "join", "loadDotenv", "prompt", "TAG", "join", "mkdirSync", "writeFileSync"]
|
|
7
7
|
}
|
|
@@ -5,7 +5,7 @@ import {
|
|
|
5
5
|
logDebug,
|
|
6
6
|
logInfo,
|
|
7
7
|
logWarn
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-GUTRAMK3.js";
|
|
9
9
|
|
|
10
10
|
// src/components/hooks/hook-system.ts
|
|
11
11
|
init_logger();
|
|
@@ -143,4 +143,4 @@ export {
|
|
|
143
143
|
getHookSummary,
|
|
144
144
|
fire
|
|
145
145
|
};
|
|
146
|
-
//# sourceMappingURL=chunk-
|
|
146
|
+
//# sourceMappingURL=chunk-DO4INSXE.js.map
|
|
@@ -4,16 +4,16 @@ import {
|
|
|
4
4
|
PEERS_SCHEMA,
|
|
5
5
|
init_config_validator,
|
|
6
6
|
validateShape
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-DCY7DGMT.js";
|
|
8
8
|
import {
|
|
9
9
|
init_logger,
|
|
10
10
|
logInfo,
|
|
11
11
|
logWarn
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-GUTRAMK3.js";
|
|
13
13
|
import {
|
|
14
14
|
abtarsHome,
|
|
15
15
|
init_paths
|
|
16
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-WW5F2DCO.js";
|
|
17
17
|
import {
|
|
18
18
|
__esm,
|
|
19
19
|
__export
|
|
@@ -100,4 +100,4 @@ export {
|
|
|
100
100
|
peer_config_exports,
|
|
101
101
|
init_peer_config
|
|
102
102
|
};
|
|
103
|
-
//# sourceMappingURL=chunk-
|
|
103
|
+
//# sourceMappingURL=chunk-EGA6JQVV.js.map
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { createRequire as __bundleCreateRequire } from 'node:module'; import { fileURLToPath as __bundleFileURLToPath } from 'node:url'; import { dirname as __bundleDirname } from 'node:path'; const require = __bundleCreateRequire(import.meta.url); const __chunk_filename = __bundleFileURLToPath(import.meta.url); const __chunk_dirname = __bundleDirname(__chunk_filename);
|
|
3
|
+
import {
|
|
4
|
+
acquireLock,
|
|
5
|
+
healthProbe,
|
|
6
|
+
packagePaths,
|
|
7
|
+
readManifest,
|
|
8
|
+
writeManifest
|
|
9
|
+
} from "./chunk-WMWI3SJ7.js";
|
|
10
|
+
|
|
11
|
+
// src/cli/commands/rollback.ts
|
|
12
|
+
import { existsSync, renameSync, rmSync } from "node:fs";
|
|
13
|
+
import { join } from "node:path";
|
|
14
|
+
async function rollback(opts) {
|
|
15
|
+
const paths = packagePaths("abtars");
|
|
16
|
+
const manifest = await readManifest(paths.manifest);
|
|
17
|
+
const slot = opts?.to ?? 1;
|
|
18
|
+
if (slot < 1 || slot > 3) {
|
|
19
|
+
process.stderr.write(`Invalid --to value: ${slot}. Must be 1-3.
|
|
20
|
+
`);
|
|
21
|
+
return 2;
|
|
22
|
+
}
|
|
23
|
+
const prevDir = join(paths.home, `app.prev.${slot}`);
|
|
24
|
+
const legacyPrev = paths.appPrev;
|
|
25
|
+
if (slot === 1 && !existsSync(prevDir) && existsSync(legacyPrev)) {
|
|
26
|
+
renameSync(legacyPrev, prevDir);
|
|
27
|
+
}
|
|
28
|
+
if (!existsSync(prevDir)) {
|
|
29
|
+
process.stderr.write(`Nothing to roll back to (no app.prev.${slot}/ found).
|
|
30
|
+
`);
|
|
31
|
+
return 2;
|
|
32
|
+
}
|
|
33
|
+
if (!manifest?.version) {
|
|
34
|
+
process.stderr.write(`No active release in manifest; nothing to roll back.
|
|
35
|
+
`);
|
|
36
|
+
return 2;
|
|
37
|
+
}
|
|
38
|
+
const release = await acquireLock(paths.lock, "rollback");
|
|
39
|
+
try {
|
|
40
|
+
const brokenDir = join(paths.home, "app.broken");
|
|
41
|
+
rmSync(brokenDir, { recursive: true, force: true });
|
|
42
|
+
renameSync(paths.app, brokenDir);
|
|
43
|
+
renameSync(prevDir, paths.app);
|
|
44
|
+
rmSync(brokenDir, { recursive: true, force: true });
|
|
45
|
+
process.stdout.write(`\u2713 rolled back: app.prev.${slot}/ \u2192 app/
|
|
46
|
+
`);
|
|
47
|
+
if (manifest.previousVersion) {
|
|
48
|
+
await writeManifest(paths.manifest, {
|
|
49
|
+
...manifest,
|
|
50
|
+
version: manifest.previousVersion,
|
|
51
|
+
commit: manifest.previousCommit,
|
|
52
|
+
activatedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
53
|
+
previousVersion: manifest.version,
|
|
54
|
+
previousCommit: manifest.commit
|
|
55
|
+
});
|
|
56
|
+
process.stdout.write(`\u2713 manifest: ${manifest.version} \u2192 ${manifest.previousVersion}
|
|
57
|
+
`);
|
|
58
|
+
}
|
|
59
|
+
const restartTs = Date.now();
|
|
60
|
+
const { restart } = await import("./abtars-restart.js");
|
|
61
|
+
process.stdout.write(`\u267B\uFE0F Restarting bridge...
|
|
62
|
+
`);
|
|
63
|
+
await restart({ cold: true }).catch(() => {
|
|
64
|
+
});
|
|
65
|
+
const health = await healthProbe(paths.home, restartTs, 6e4);
|
|
66
|
+
if (health.healthy) {
|
|
67
|
+
process.stdout.write(`\u2713 Bridge healthy (PID ${health.pid})
|
|
68
|
+
`);
|
|
69
|
+
} else {
|
|
70
|
+
process.stderr.write(`\u26A0\uFE0F Bridge may not have started. Check logs.
|
|
71
|
+
`);
|
|
72
|
+
}
|
|
73
|
+
process.stdout.write(`
|
|
74
|
+
Rollback complete.
|
|
75
|
+
`);
|
|
76
|
+
return 0;
|
|
77
|
+
} finally {
|
|
78
|
+
await release();
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
export {
|
|
83
|
+
rollback
|
|
84
|
+
};
|
|
85
|
+
//# sourceMappingURL=chunk-EKHNWFEQ.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/cli/commands/rollback.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * `abtars rollback` \u2014 swap app/ with a prior version, restart, health-verify.\n * --to N (1-3, default 1) selects which prior to restore.\n */\n\nimport { existsSync, renameSync, rmSync } from 'node:fs';\nimport { join } from 'node:path';\nimport {\n acquireLock,\n healthProbe,\n packagePaths,\n readManifest,\n writeManifest,\n} from '../deploy-lib-import.js';\n\nexport async function rollback(opts?: { to?: number }): Promise<number> {\n const paths = packagePaths('abtars');\n const manifest = await readManifest(paths.manifest);\n const slot = opts?.to ?? 1;\n\n if (slot < 1 || slot > 3) {\n process.stderr.write(`Invalid --to value: ${slot}. Must be 1-3.\\n`);\n return 2;\n }\n\n const prevDir = join(paths.home, `app.prev.${slot}`);\n\n // Backward compat: check old app.prev/ if slot 1 and new format doesn't exist\n const legacyPrev = paths.appPrev;\n if (slot === 1 && !existsSync(prevDir) && existsSync(legacyPrev)) {\n renameSync(legacyPrev, prevDir);\n }\n\n if (!existsSync(prevDir)) {\n process.stderr.write(`Nothing to roll back to (no app.prev.${slot}/ found).\\n`);\n return 2;\n }\n\n if (!manifest?.version) {\n process.stderr.write(`No active release in manifest; nothing to roll back.\\n`);\n return 2;\n }\n\n const release = await acquireLock(paths.lock, 'rollback');\n try {\n // Swap: app/ \u2192 app.broken/, app.prev.N/ \u2192 app/\n const brokenDir = join(paths.home, 'app.broken');\n rmSync(brokenDir, { recursive: true, force: true });\n renameSync(paths.app, brokenDir);\n renameSync(prevDir, paths.app);\n rmSync(brokenDir, { recursive: true, force: true });\n process.stdout.write(`\u2713 rolled back: app.prev.${slot}/ \u2192 app/\\n`);\n\n // Update manifest (swap version \u2194 previousVersion)\n if (manifest.previousVersion) {\n await writeManifest(paths.manifest, {\n ...manifest,\n version: manifest.previousVersion,\n commit: manifest.previousCommit,\n activatedAt: new Date().toISOString(),\n previousVersion: manifest.version,\n previousCommit: manifest.commit,\n });\n process.stdout.write(`\u2713 manifest: ${manifest.version} \u2192 ${manifest.previousVersion}\\n`);\n }\n\n // Restart bridge\n const restartTs = Date.now();\n const { restart } = await import('./restart.js');\n process.stdout.write(`\u267B\uFE0F Restarting bridge...\\n`);\n await restart({ cold: true }).catch(() => {});\n\n // Health probe\n const health = await healthProbe(paths.home, restartTs, 60_000);\n if (health.healthy) {\n process.stdout.write(`\u2713 Bridge healthy (PID ${health.pid})\\n`);\n } else {\n process.stderr.write(`\u26A0\uFE0F Bridge may not have started. Check logs.\\n`);\n }\n\n process.stdout.write(`\\nRollback complete.\\n`);\n return 0;\n } finally {\n await release();\n }\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;AAKA,SAAS,YAAY,YAAY,cAAc;AAC/C,SAAS,YAAY;AASrB,eAAsB,SAAS,MAAyC;AACtE,QAAM,QAAQ,aAAa,QAAQ;AACnC,QAAM,WAAW,MAAM,aAAa,MAAM,QAAQ;AAClD,QAAM,OAAO,MAAM,MAAM;AAEzB,MAAI,OAAO,KAAK,OAAO,GAAG;AACxB,YAAQ,OAAO,MAAM,uBAAuB,IAAI;AAAA,CAAkB;AAClE,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,KAAK,MAAM,MAAM,YAAY,IAAI,EAAE;AAGnD,QAAM,aAAa,MAAM;AACzB,MAAI,SAAS,KAAK,CAAC,WAAW,OAAO,KAAK,WAAW,UAAU,GAAG;AAChE,eAAW,YAAY,OAAO;AAAA,EAChC;AAEA,MAAI,CAAC,WAAW,OAAO,GAAG;AACxB,YAAQ,OAAO,MAAM,wCAAwC,IAAI;AAAA,CAAa;AAC9E,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,UAAU,SAAS;AACtB,YAAQ,OAAO,MAAM;AAAA,CAAwD;AAC7E,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,MAAM,YAAY,MAAM,MAAM,UAAU;AACxD,MAAI;AAEF,UAAM,YAAY,KAAK,MAAM,MAAM,YAAY;AAC/C,WAAO,WAAW,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAClD,eAAW,MAAM,KAAK,SAAS;AAC/B,eAAW,SAAS,MAAM,GAAG;AAC7B,WAAO,WAAW,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAClD,YAAQ,OAAO,MAAM,gCAA2B,IAAI;AAAA,CAAY;AAGhE,QAAI,SAAS,iBAAiB;AAC5B,YAAM,cAAc,MAAM,UAAU;AAAA,QAClC,GAAG;AAAA,QACH,SAAS,SAAS;AAAA,QAClB,QAAQ,SAAS;AAAA,QACjB,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,QACpC,iBAAiB,SAAS;AAAA,QAC1B,gBAAgB,SAAS;AAAA,MAC3B,CAAC;AACD,cAAQ,OAAO,MAAM,oBAAe,SAAS,OAAO,WAAM,SAAS,eAAe;AAAA,CAAI;AAAA,IACxF;AAGA,UAAM,YAAY,KAAK,IAAI;AAC3B,UAAM,EAAE,QAAQ,IAAI,MAAM,OAAO,qBAAc;AAC/C,YAAQ,OAAO,MAAM;AAAA,CAA2B;AAChD,UAAM,QAAQ,EAAE,MAAM,KAAK,CAAC,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAG5C,UAAM,SAAS,MAAM,YAAY,MAAM,MAAM,WAAW,GAAM;AAC9D,QAAI,OAAO,SAAS;AAClB,cAAQ,OAAO,MAAM,8BAAyB,OAAO,GAAG;AAAA,CAAK;AAAA,IAC/D,OAAO;AACL,cAAQ,OAAO,MAAM;AAAA,CAA+C;AAAA,IACtE;AAEA,YAAQ,OAAO,MAAM;AAAA;AAAA,CAAwB;AAC7C,WAAO;AAAA,EACT,UAAE;AACA,UAAM,QAAQ;AAAA,EAChB;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
import {
|
|
4
4
|
init_log_and_swallow,
|
|
5
5
|
logAndSwallow
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-CYSGXNBY.js";
|
|
7
7
|
|
|
8
8
|
// src/cli/commands/restart.ts
|
|
9
9
|
init_log_and_swallow();
|
|
@@ -139,13 +139,13 @@ async function restart(opts) {
|
|
|
139
139
|
}
|
|
140
140
|
if (bridgeAlive) await killBridge(bridgePid);
|
|
141
141
|
killPortHolder(3100);
|
|
142
|
-
const { updateBridgeLockField } = await import("./bridge-lock-transport-
|
|
142
|
+
const { updateBridgeLockField } = await import("./bridge-lock-transport-N6OGDOSE.js");
|
|
143
143
|
updateBridgeLockField("restartRequested", null);
|
|
144
144
|
const argv = [];
|
|
145
145
|
return spawnLauncher(home, argv);
|
|
146
146
|
}
|
|
147
147
|
if (bridgeAlive) {
|
|
148
|
-
const { writeRestartRequested } = await import("./bridge-lock-transport-
|
|
148
|
+
const { writeRestartRequested } = await import("./bridge-lock-transport-N6OGDOSE.js");
|
|
149
149
|
writeRestartRequested("restart");
|
|
150
150
|
process.stdout.write(`\u267B\uFE0F Restart requested (PID ${bridgePid}) \u2014 bridge will restart within 30s
|
|
151
151
|
`);
|
|
@@ -158,4 +158,4 @@ async function restart(opts) {
|
|
|
158
158
|
export {
|
|
159
159
|
restart
|
|
160
160
|
};
|
|
161
|
-
//# sourceMappingURL=chunk-
|
|
161
|
+
//# sourceMappingURL=chunk-F3HMZFIL.js.map
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { createRequire as __bundleCreateRequire } from 'node:module'; import { fileURLToPath as __bundleFileURLToPath } from 'node:url'; import { dirname as __bundleDirname } from 'node:path'; const require = __bundleCreateRequire(import.meta.url); const __chunk_filename = __bundleFileURLToPath(import.meta.url); const __chunk_dirname = __bundleDirname(__chunk_filename);
|
|
3
|
-
import {
|
|
4
|
-
init_log_and_swallow,
|
|
5
|
-
logAndSwallow
|
|
6
|
-
} from "./chunk-EX2SRTUE.js";
|
|
7
3
|
import {
|
|
8
4
|
getEnv,
|
|
9
5
|
init_env_schema
|
|
10
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-3OXQWII3.js";
|
|
7
|
+
import {
|
|
8
|
+
init_log_and_swallow,
|
|
9
|
+
logAndSwallow
|
|
10
|
+
} from "./chunk-CYSGXNBY.js";
|
|
11
11
|
import {
|
|
12
12
|
init_logger,
|
|
13
13
|
logError
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-GUTRAMK3.js";
|
|
15
15
|
|
|
16
16
|
// src/capabilities/capability.ts
|
|
17
17
|
init_env_schema();
|
|
@@ -86,4 +86,4 @@ export {
|
|
|
86
86
|
createCapabilityApi,
|
|
87
87
|
discoverCapabilities
|
|
88
88
|
};
|
|
89
|
-
//# sourceMappingURL=chunk-
|
|
89
|
+
//# sourceMappingURL=chunk-FY3QUO2L.js.map
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
import {
|
|
4
4
|
abtarsHome,
|
|
5
5
|
init_paths
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-WW5F2DCO.js";
|
|
7
7
|
import {
|
|
8
8
|
__esm
|
|
9
9
|
} from "./chunk-7K2YZTLD.js";
|
|
@@ -155,4 +155,4 @@ export {
|
|
|
155
155
|
logTrace,
|
|
156
156
|
init_logger
|
|
157
157
|
};
|
|
158
|
-
//# sourceMappingURL=chunk-
|
|
158
|
+
//# sourceMappingURL=chunk-GUTRAMK3.js.map
|
|
@@ -3,11 +3,11 @@
|
|
|
3
3
|
import {
|
|
4
4
|
init_log_and_swallow,
|
|
5
5
|
logAndSwallow
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-CYSGXNBY.js";
|
|
7
7
|
import {
|
|
8
8
|
abtarsHome,
|
|
9
9
|
init_paths
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-WW5F2DCO.js";
|
|
11
11
|
|
|
12
12
|
// src/components/tasks/task-store.ts
|
|
13
13
|
init_paths();
|
|
@@ -75,4 +75,4 @@ export {
|
|
|
75
75
|
recordRun,
|
|
76
76
|
closeDb
|
|
77
77
|
};
|
|
78
|
-
//# sourceMappingURL=chunk-
|
|
78
|
+
//# sourceMappingURL=chunk-H7RX7UCR.js.map
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
import {
|
|
4
4
|
init_logger,
|
|
5
5
|
logTrace
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-GUTRAMK3.js";
|
|
7
7
|
|
|
8
8
|
// src/components/env.ts
|
|
9
9
|
init_logger();
|
|
@@ -26,4 +26,4 @@ export {
|
|
|
26
26
|
readEnv,
|
|
27
27
|
readEnvWithDefault
|
|
28
28
|
};
|
|
29
|
-
//# sourceMappingURL=chunk-
|
|
29
|
+
//# sourceMappingURL=chunk-HAF2AFBW.js.map
|
|
@@ -2,18 +2,18 @@
|
|
|
2
2
|
import { createRequire as __bundleCreateRequire } from 'node:module'; import { fileURLToPath as __bundleFileURLToPath } from 'node:url'; import { dirname as __bundleDirname } from 'node:path'; const require = __bundleCreateRequire(import.meta.url); const __chunk_filename = __bundleFileURLToPath(import.meta.url); const __chunk_dirname = __bundleDirname(__chunk_filename);
|
|
3
3
|
import {
|
|
4
4
|
createAgentTransport
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-2SWKJX64.js";
|
|
6
6
|
import {
|
|
7
7
|
loadUsers
|
|
8
|
-
} from "./chunk-
|
|
9
|
-
import {
|
|
10
|
-
init_log_and_swallow,
|
|
11
|
-
logAndSwallow
|
|
12
|
-
} from "./chunk-EX2SRTUE.js";
|
|
8
|
+
} from "./chunk-SRFEIZQT.js";
|
|
13
9
|
import {
|
|
14
10
|
getEnv,
|
|
15
11
|
init_env_schema
|
|
16
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-3OXQWII3.js";
|
|
13
|
+
import {
|
|
14
|
+
init_log_and_swallow,
|
|
15
|
+
logAndSwallow
|
|
16
|
+
} from "./chunk-CYSGXNBY.js";
|
|
17
17
|
import {
|
|
18
18
|
init_logger,
|
|
19
19
|
isLogLevel,
|
|
@@ -21,11 +21,11 @@ import {
|
|
|
21
21
|
logError,
|
|
22
22
|
logInfo,
|
|
23
23
|
logWarn
|
|
24
|
-
} from "./chunk-
|
|
24
|
+
} from "./chunk-GUTRAMK3.js";
|
|
25
25
|
import {
|
|
26
26
|
abtarsHome,
|
|
27
27
|
init_paths
|
|
28
|
-
} from "./chunk-
|
|
28
|
+
} from "./chunk-WW5F2DCO.js";
|
|
29
29
|
|
|
30
30
|
// src/boot/phase-transport.ts
|
|
31
31
|
init_log_and_swallow();
|
|
@@ -439,7 +439,7 @@ async function phaseTransport(ctx) {
|
|
|
439
439
|
async function buildTransport(ctx) {
|
|
440
440
|
const { config, memoryConfig } = ctx;
|
|
441
441
|
let transport;
|
|
442
|
-
const { resolveAgent, getEnvFallback, loadTransport, resolveHailMary, clearTransportCache, validateProviderReady } = await import("./transport-config-
|
|
442
|
+
const { resolveAgent, getEnvFallback, loadTransport, resolveHailMary, clearTransportCache, validateProviderReady } = await import("./transport-config-JIKHB7GT.js");
|
|
443
443
|
clearTransportCache();
|
|
444
444
|
const tc = loadTransport();
|
|
445
445
|
const prof = tc ? resolveAgent("professor", tc) : null;
|
|
@@ -496,7 +496,7 @@ async function buildTransport(ctx) {
|
|
|
496
496
|
defaults?.maxWaitSec ?? config.transport.tmuxMaxWaitSec
|
|
497
497
|
);
|
|
498
498
|
} else if (resolved.provider.transport === "api") {
|
|
499
|
-
const { DirectApiTransport } = await import("./direct-api-transport-
|
|
499
|
+
const { DirectApiTransport } = await import("./direct-api-transport-LSAUIP5S.js");
|
|
500
500
|
const { ModelHealthRegistry } = await import("./model-health-registry-7ECZFCW4.js");
|
|
501
501
|
const { FallbackPolicy } = await import("./fallback-policy-SR6ED5I3.js");
|
|
502
502
|
const apiKey = getEnv().getApiKey(resolved.provider.apiKeyEnv ?? "API_KEY");
|
|
@@ -517,8 +517,8 @@ async function buildTransport(ctx) {
|
|
|
517
517
|
}
|
|
518
518
|
if (!ctx.modelHealthRegistry.onDemote) {
|
|
519
519
|
ctx.modelHealthRegistry.onDemote = (model, _endpoint, reason) => {
|
|
520
|
-
import("./transport-config-
|
|
521
|
-
import("./notification-
|
|
520
|
+
import("./transport-config-JIKHB7GT.js").then(({ demoteModel }) => demoteModel(model, reason));
|
|
521
|
+
import("./notification-ULESRDHB.js").then(({ sendNotification }) => sendNotification(ctx, `\u26A0\uFE0F ${model} demoted (${reason}). Next healthy model promoted.`)).catch((err) => logAndSwallow(TAG2, "sendNotification model-demote", err));
|
|
522
522
|
};
|
|
523
523
|
}
|
|
524
524
|
const policy = new FallbackPolicy(candidates, ctx.modelHealthRegistry);
|
|
@@ -549,7 +549,7 @@ async function buildTransport(ctx) {
|
|
|
549
549
|
}
|
|
550
550
|
await transport.initialize();
|
|
551
551
|
if ("setSystemPrompt" in transport && typeof transport.setSystemPrompt === "function") {
|
|
552
|
-
const { loadSoulBundle } = await import("./soul-loader-
|
|
552
|
+
const { loadSoulBundle } = await import("./soul-loader-LCPTN4PK.js");
|
|
553
553
|
const soul = loadSoulBundle();
|
|
554
554
|
if (soul) transport.setSystemPrompt(soul);
|
|
555
555
|
}
|
|
@@ -566,17 +566,44 @@ async function buildTransport(ctx) {
|
|
|
566
566
|
ctx.runtime.setMainTransport(transport);
|
|
567
567
|
ctx.runtime.setSessionManager(ctx.sessionManager);
|
|
568
568
|
if (getEnv().enableAsyncDelegation) {
|
|
569
|
-
const { setDelegationDeps } = await import("./delegation-tools-
|
|
569
|
+
const { setDelegationDeps } = await import("./delegation-tools-Z5OM3TXS.js");
|
|
570
570
|
setDelegationDeps(ctx.runtime, ctx.sessionManager);
|
|
571
571
|
}
|
|
572
572
|
logInfo("main", "\u2705 Transport ready");
|
|
573
|
+
const { join: join3 } = await import("node:path");
|
|
574
|
+
const { abtarsHome: abtarsHome2 } = await import("./paths-QQM74XYT.js");
|
|
575
|
+
const { ActionGate } = await import("./action-gate-DYV2XQBP.js");
|
|
576
|
+
const { setActionGate } = await import("./tool-registry-5PXNSYOI.js");
|
|
577
|
+
const authDir = join3(abtarsHome2(), "auth");
|
|
578
|
+
ctx.actionGate = new ActionGate(authDir);
|
|
579
|
+
setActionGate(ctx.actionGate);
|
|
580
|
+
logDebug("main", "\u{1F512} ActionGate wired");
|
|
573
581
|
if (resolved.provider.transport === "api" && ctx.memory?.available) {
|
|
574
|
-
const { setMemoryBackend } = await import("./tool-registry-
|
|
575
|
-
const
|
|
576
|
-
const backend =
|
|
577
|
-
|
|
582
|
+
const { setMemoryBackend } = await import("./tool-registry-5PXNSYOI.js");
|
|
583
|
+
const mm = ctx.memory;
|
|
584
|
+
const backend = {
|
|
585
|
+
initialize: async () => {
|
|
586
|
+
},
|
|
587
|
+
close: () => {
|
|
588
|
+
},
|
|
589
|
+
instantStore: (p) => mm.editor.instantStore(p),
|
|
590
|
+
editMemory: (p) => mm.editor.editMemory(p),
|
|
591
|
+
reclassifyMemory: (id, level, uo) => {
|
|
592
|
+
mm.editor.reclassifyMemory(id, level, uo);
|
|
593
|
+
return Promise.resolve();
|
|
594
|
+
},
|
|
595
|
+
adjustRelevance: (id, delta) => {
|
|
596
|
+
mm.editor.adjustRelevance(id, delta);
|
|
597
|
+
return Promise.resolve();
|
|
598
|
+
},
|
|
599
|
+
mergeMemories: (a, b) => mm.editor.mergeMemories(a, b),
|
|
600
|
+
cascadeDelete: (ids, uid) => mm.editor.cascadeDelete(ids, uid),
|
|
601
|
+
recall: (p) => mm.recallSearch(p),
|
|
602
|
+
rebuildFtsIndexes: () => mm.rebuildFtsIndexes()
|
|
603
|
+
};
|
|
578
604
|
setMemoryBackend(backend);
|
|
579
|
-
logInfo("main", "\u{1F9E0} In-process memory wired to tool registry");
|
|
605
|
+
logInfo("main", "\u{1F9E0} In-process memory wired to tool registry (shared handle)");
|
|
606
|
+
transport.memoryBackend = ctx.memory;
|
|
580
607
|
const db = ctx.memory.getDb?.() ?? ctx.memory.getDatabase?.();
|
|
581
608
|
if (db && resolved.contextWindow >= 128e3) {
|
|
582
609
|
const { ContextEngine } = await import("abmind");
|
|
@@ -616,7 +643,7 @@ async function buildTransport(ctx) {
|
|
|
616
643
|
logInfo("main", msg);
|
|
617
644
|
if (model !== lastNotifiedModel || isLogLevel("debug")) {
|
|
618
645
|
lastNotifiedModel = model;
|
|
619
|
-
import("./notification-
|
|
646
|
+
import("./notification-ULESRDHB.js").then(({ sendNotification }) => sendNotification(ctx, msg)).catch((err) => logAndSwallow(TAG2, "sendNotification fallback", err));
|
|
620
647
|
}
|
|
621
648
|
};
|
|
622
649
|
}
|
|
@@ -642,4 +669,4 @@ export {
|
|
|
642
669
|
buildTransport,
|
|
643
670
|
rebuildTransport
|
|
644
671
|
};
|
|
645
|
-
//# sourceMappingURL=chunk-
|
|
672
|
+
//# sourceMappingURL=chunk-HCYENZAB.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
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 { logDebug, 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 // Wire ActionGate for auth-required commands\n const { join } = await import(\"node:path\");\n const { abtarsHome } = await import(\"../paths.js\");\n const { ActionGate } = await import(\"../components/action-gate.js\");\n const { setActionGate } = await import(\"../components/transport/tool-registry.js\");\n const authDir = join(abtarsHome(), \"auth\");\n ctx.actionGate = new ActionGate(authDir);\n setActionGate(ctx.actionGate);\n logDebug(\"main\", \"\uD83D\uDD12 ActionGate wired\");\n\n if (resolved.provider.transport === \"api\" && (ctx.memory as any)?.available) {\n const { setMemoryBackend } = await import(\"../components/transport/tool-registry.js\");\n // #860: Use the SAME MemoryManager instance \u2014 don't create a second SqliteBackend.\n // Two separate DB connections to the same WAL-mode file corrupt each other's handles.\n const mm = ctx.memory!;\n const backend = {\n initialize: async () => {},\n close: () => {},\n instantStore: (p: any) => mm.editor.instantStore(p),\n editMemory: (p: any) => mm.editor.editMemory(p),\n reclassifyMemory: (id: number, level: number, uo: boolean) => { mm.editor.reclassifyMemory(id, level, uo); return Promise.resolve(); },\n adjustRelevance: (id: number, delta: number) => { mm.editor.adjustRelevance(id, delta); return Promise.resolve(); },\n mergeMemories: (a: number, b: number) => mm.editor.mergeMemories(a, b),\n cascadeDelete: (ids: number[], uid: string) => mm.editor.cascadeDelete(ids, uid),\n recall: (p: any) => mm.recallSearch(p),\n rebuildFtsIndexes: () => mm.rebuildFtsIndexes(),\n };\n setMemoryBackend(backend as any);\n logInfo(\"main\", \"\uD83E\uDDE0 In-process memory wired to tool registry (shared handle)\");\n\n // #843: Wire memory to transport for session hydration on restart\n (transport as import(\"../components/transport/direct-api-transport.js\").DirectApiTransport).memoryBackend = ctx.memory!;\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", "join", "abtarsHome"]
|
|
7
|
+
}
|