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.
- package/CHANGELOG.md +64 -0
- package/bundle/_registry.generated-KQODGKTQ.js +36 -0
- package/bundle/{_registry.generated-M4WY2MMI.js.map → _registry.generated-KQODGKTQ.js.map} +1 -1
- package/bundle/abtars-browser.js +8 -7
- package/bundle/abtars-browser.js.map +1 -1
- package/bundle/abtars-cli.js +646 -73
- package/bundle/abtars-cli.js.map +4 -4
- package/bundle/abtars-restart.js +7 -6
- package/bundle/abtars-rss.js +2 -1
- package/bundle/abtars-rss.js.map +1 -1
- package/bundle/abtars-task.js +9 -8
- package/bundle/abtars-task.js.map +1 -1
- package/bundle/abtars.js +103 -96
- package/bundle/abtars.js.map +2 -2
- package/bundle/{agent-api-rate-limit-OQNFMXTZ.js → agent-api-rate-limit-7R5TX2F2.js} +7 -6
- package/bundle/{agent-api-rate-limit-OQNFMXTZ.js.map → agent-api-rate-limit-7R5TX2F2.js.map} +1 -1
- package/bundle/agent-registry-5M77ZOMV.js +19 -0
- package/bundle/agent-registry-VJMNIQ5W.js +19 -0
- package/bundle/{anthropic-adapter-2APTH3LA.js → anthropic-adapter-IBY3NPXW.js} +4 -3
- package/bundle/{anthropic-adapter-2APTH3LA.js.map → anthropic-adapter-IBY3NPXW.js.map} +1 -1
- package/bundle/{bridge-lock-transport-4AC2G5G6.js → bridge-lock-transport-HO545SBK.js} +9 -8
- package/bundle/browse-delivery-64GQIUHG.js +18 -0
- package/bundle/browser-EXR5OQGK.js +19 -0
- package/bundle/capability-HIE7UGFU.js +18 -0
- package/bundle/{chunk-BUUVFUPO.js → chunk-2BY6I4P5.js} +5 -4
- package/bundle/{chunk-BUUVFUPO.js.map → chunk-2BY6I4P5.js.map} +1 -1
- package/bundle/{chunk-Y6XAEX2Q.js → chunk-2F6XKG7Y.js} +15 -9
- package/bundle/chunk-2F6XKG7Y.js.map +7 -0
- package/bundle/{chunk-V76TVMCM.js → chunk-3MO2MDXJ.js} +5 -4
- package/bundle/{chunk-V76TVMCM.js.map → chunk-3MO2MDXJ.js.map} +1 -1
- package/bundle/{chunk-6UCRKRWR.js → chunk-6XX4OAAM.js} +22 -21
- package/bundle/chunk-6XX4OAAM.js.map +7 -0
- package/bundle/{chunk-XREWVCUO.js → chunk-7CHLS36W.js} +16 -148
- package/bundle/chunk-7CHLS36W.js.map +7 -0
- package/bundle/{chunk-NWDBD4PA.js → chunk-7K2YZTLD.js} +3 -2
- package/bundle/{chunk-JCJS4ZIB.js → chunk-AQVOAQQI.js} +5 -4
- package/bundle/{chunk-JCJS4ZIB.js.map → chunk-AQVOAQQI.js.map} +1 -1
- package/bundle/chunk-AUQD2PKM.js +136 -0
- package/bundle/chunk-AUQD2PKM.js.map +7 -0
- package/bundle/{chunk-YOCTDKKL.js → chunk-BYDUMHXT.js} +4 -3
- package/bundle/{chunk-YOCTDKKL.js.map → chunk-BYDUMHXT.js.map} +1 -1
- package/bundle/{chunk-RVE2N7FA.js → chunk-CELR236Q.js} +5 -4
- package/bundle/{chunk-RVE2N7FA.js.map → chunk-CELR236Q.js.map} +1 -1
- package/bundle/{chunk-2XU2X4OI.js → chunk-CUQA2AJT.js} +3 -2
- package/bundle/{chunk-2XU2X4OI.js.map → chunk-CUQA2AJT.js.map} +1 -1
- package/bundle/chunk-DMPR5MYT.js +183 -0
- package/bundle/chunk-DMPR5MYT.js.map +7 -0
- package/bundle/{chunk-BHMZ4RCC.js → chunk-DY3R7LDW.js} +55 -54
- package/bundle/{chunk-BHMZ4RCC.js.map → chunk-DY3R7LDW.js.map} +1 -1
- package/bundle/{chunk-AR6GO6YC.js → chunk-ELRAH7VL.js} +5 -4
- package/bundle/{chunk-AR6GO6YC.js.map → chunk-ELRAH7VL.js.map} +1 -1
- package/bundle/{chunk-FMWKEPM7.js → chunk-EX2SRTUE.js} +5 -4
- package/bundle/{chunk-FMWKEPM7.js.map → chunk-EX2SRTUE.js.map} +1 -1
- package/bundle/{chunk-JW6RU47G.js → chunk-FVQGP5YO.js} +8 -7
- package/bundle/{chunk-JW6RU47G.js.map → chunk-FVQGP5YO.js.map} +1 -1
- package/bundle/{chunk-GRNENTPA.js → chunk-G6IXMYIO.js} +4 -3
- package/bundle/{chunk-GRNENTPA.js.map → chunk-G6IXMYIO.js.map} +1 -1
- package/bundle/{chunk-6NR3OHEW.js → chunk-H2RZ4NEJ.js} +6 -5
- package/bundle/{chunk-6NR3OHEW.js.map → chunk-H2RZ4NEJ.js.map} +1 -1
- package/bundle/chunk-HVKJN3AG.js +189 -0
- package/bundle/chunk-HVKJN3AG.js.map +7 -0
- package/bundle/{chunk-265TPOPC.js → chunk-HXJRZWKA.js} +3 -2
- package/bundle/{chunk-265TPOPC.js.map → chunk-HXJRZWKA.js.map} +1 -1
- package/bundle/chunk-IU3RI5E4.js +645 -0
- package/bundle/chunk-IU3RI5E4.js.map +7 -0
- package/bundle/{chunk-GST5T3WZ.js → chunk-J5YIMCLT.js} +6 -5
- package/bundle/{chunk-GST5T3WZ.js.map → chunk-J5YIMCLT.js.map} +1 -1
- package/bundle/chunk-JAJ3DUQ2.js +30 -0
- package/bundle/{chunk-OP7BTAWY.js.map → chunk-JAJ3DUQ2.js.map} +1 -1
- package/bundle/chunk-JHF25OOG.js +645 -0
- package/bundle/chunk-JHF25OOG.js.map +7 -0
- package/bundle/{chunk-MPX525QO.js → chunk-JRG4EFMP.js} +5 -4
- package/bundle/{chunk-MPX525QO.js.map → chunk-JRG4EFMP.js.map} +1 -1
- package/bundle/{chunk-VVEDVGCR.js → chunk-JU3UBWLN.js} +17 -16
- package/bundle/{chunk-VVEDVGCR.js.map → chunk-JU3UBWLN.js.map} +1 -1
- package/bundle/{chunk-QBGBT5QS.js → chunk-JX3ZZU3O.js} +5 -4
- package/bundle/{chunk-QBGBT5QS.js.map → chunk-JX3ZZU3O.js.map} +1 -1
- package/bundle/{chunk-6SETMHNN.js → chunk-K7P74UNQ.js} +8 -7
- package/bundle/{chunk-6SETMHNN.js.map → chunk-K7P74UNQ.js.map} +1 -1
- package/bundle/{chunk-AZJIODTQ.js → chunk-KED3G7HS.js} +6 -5
- package/bundle/{chunk-AZJIODTQ.js.map → chunk-KED3G7HS.js.map} +1 -1
- package/bundle/chunk-KI2ROWAH.js +3707 -0
- package/bundle/chunk-KI2ROWAH.js.map +7 -0
- package/bundle/{chunk-UHRP745J.js → chunk-L7YHV5DL.js} +6 -5
- package/bundle/{chunk-UHRP745J.js.map → chunk-L7YHV5DL.js.map} +1 -1
- package/bundle/{chunk-BSSBCSCL.js → chunk-LD5BMLHG.js} +11 -10
- package/bundle/{chunk-BSSBCSCL.js.map → chunk-LD5BMLHG.js.map} +1 -1
- package/bundle/{chunk-2UPU3OW6.js → chunk-LYEAHE5V.js} +5 -4
- package/bundle/{chunk-2UPU3OW6.js.map → chunk-LYEAHE5V.js.map} +1 -1
- package/bundle/{chunk-3B7BBE4F.js → chunk-MCGEXAG5.js} +8 -7
- package/bundle/{chunk-3B7BBE4F.js.map → chunk-MCGEXAG5.js.map} +1 -1
- package/bundle/{chunk-X76UX47U.js → chunk-MJ6PHMOK.js} +4 -3
- package/bundle/{chunk-X76UX47U.js.map → chunk-MJ6PHMOK.js.map} +1 -1
- package/bundle/{chunk-LSPKJQCI.js → chunk-MV6CJFWR.js} +3 -2
- package/bundle/{chunk-LSPKJQCI.js.map → chunk-MV6CJFWR.js.map} +1 -1
- package/bundle/chunk-MZWMYN4O.js +17 -0
- package/bundle/{chunk-M6VBAPNT.js.map → chunk-MZWMYN4O.js.map} +1 -1
- package/bundle/{chunk-HX7Y7EYP.js → chunk-NIRYBWUW.js} +4 -3
- package/bundle/{chunk-HX7Y7EYP.js.map → chunk-NIRYBWUW.js.map} +1 -1
- package/bundle/{chunk-3E545J66.js → chunk-OW64RUE5.js} +3 -2
- package/bundle/{chunk-3E545J66.js.map → chunk-OW64RUE5.js.map} +1 -1
- package/bundle/chunk-P56PLAIC.js +126 -0
- package/bundle/chunk-P56PLAIC.js.map +7 -0
- package/bundle/{chunk-TZHIDLDS.js → chunk-P6PN34XD.js} +5 -4
- package/bundle/{chunk-TZHIDLDS.js.map → chunk-P6PN34XD.js.map} +1 -1
- package/bundle/{chunk-2UENBO6M.js → chunk-PF5UQ64X.js} +9 -8
- package/bundle/{chunk-2UENBO6M.js.map → chunk-PF5UQ64X.js.map} +1 -1
- package/bundle/{chunk-6CPN4IGS.js → chunk-PQ62LZNA.js} +9 -8
- package/bundle/{chunk-6CPN4IGS.js.map → chunk-PQ62LZNA.js.map} +1 -1
- package/bundle/{chunk-UCQ2WC3B.js → chunk-PQW5QBPY.js} +15 -8
- package/bundle/chunk-PQW5QBPY.js.map +7 -0
- package/bundle/{chunk-D2DCBO6M.js → chunk-R36WIOYX.js} +3 -2
- package/bundle/{chunk-D2DCBO6M.js.map → chunk-R36WIOYX.js.map} +1 -1
- package/bundle/chunk-RB3X66KM.js +386 -0
- package/bundle/chunk-RB3X66KM.js.map +7 -0
- package/bundle/{chunk-GUQVJC3U.js → chunk-RE3F3CFW.js} +7 -6
- package/bundle/{chunk-GUQVJC3U.js.map → chunk-RE3F3CFW.js.map} +1 -1
- package/bundle/chunk-RWUINZUQ.js +19 -0
- package/bundle/chunk-RWUINZUQ.js.map +7 -0
- package/bundle/{chunk-NT3OBORC.js → chunk-S54DBUZ4.js} +10 -9
- package/bundle/{chunk-NT3OBORC.js.map → chunk-S54DBUZ4.js.map} +1 -1
- package/bundle/{chunk-CWOHNFUV.js → chunk-SY67HM2Y.js} +3 -2
- package/bundle/{chunk-CWOHNFUV.js.map → chunk-SY67HM2Y.js.map} +1 -1
- package/bundle/{chunk-BQ2L4GMG.js → chunk-TBLYGCPQ.js} +4 -3
- package/bundle/{chunk-BQ2L4GMG.js.map → chunk-TBLYGCPQ.js.map} +1 -1
- package/bundle/chunk-TCBMBX3Z.js +183 -0
- package/bundle/chunk-TCBMBX3Z.js.map +7 -0
- package/bundle/chunk-TXRWQIQQ.js +3707 -0
- package/bundle/chunk-TXRWQIQQ.js.map +7 -0
- package/bundle/chunk-U34CSHFS.js +645 -0
- package/bundle/chunk-U34CSHFS.js.map +7 -0
- package/bundle/{chunk-CEVRHKJY.js → chunk-UDZIZB5F.js} +6 -5
- package/bundle/{chunk-CEVRHKJY.js.map → chunk-UDZIZB5F.js.map} +1 -1
- package/bundle/{chunk-W6FAL35D.js → chunk-VA5WKN3Z.js} +7 -6
- package/bundle/{chunk-W6FAL35D.js.map → chunk-VA5WKN3Z.js.map} +1 -1
- package/bundle/{chunk-X6TERNVJ.js → chunk-WX7GHGFX.js} +10 -9
- package/bundle/{chunk-X6TERNVJ.js.map → chunk-WX7GHGFX.js.map} +1 -1
- package/bundle/{chunk-PNEDC45Y.js → chunk-XETTJVEU.js} +4 -3
- package/bundle/{chunk-PNEDC45Y.js.map → chunk-XETTJVEU.js.map} +1 -1
- package/bundle/{chunk-PLCY3GFH.js → chunk-XLLSPBBT.js} +5 -4
- package/bundle/{chunk-PLCY3GFH.js.map → chunk-XLLSPBBT.js.map} +1 -1
- package/bundle/{chunk-ZXPXCDA6.js → chunk-XOCP5BMO.js} +6 -5
- package/bundle/{chunk-ZXPXCDA6.js.map → chunk-XOCP5BMO.js.map} +1 -1
- package/bundle/chunk-ZEY6YZAB.js +138 -0
- package/bundle/chunk-ZEY6YZAB.js.map +7 -0
- package/bundle/{chunk-MW6WDLU7.js → chunk-ZZR3JZHR.js} +10 -9
- package/bundle/{chunk-MW6WDLU7.js.map → chunk-ZZR3JZHR.js.map} +1 -1
- package/bundle/commands-AIL4XOIZ.js +33 -0
- package/bundle/commands-K77NVSXZ.js +32 -0
- package/bundle/commands-V6RSVC4Y.js +32 -0
- package/bundle/completion-buffer-S3LXDZG2.js +14 -0
- package/bundle/config-C6VHRJQ7.js +20 -0
- package/bundle/{config-show-ERTATR6E.js → config-show-ZTXX27FW.js} +4 -3
- package/bundle/{config-show-ERTATR6E.js.map → config-show-ZTXX27FW.js.map} +1 -1
- package/bundle/{context-HCEGZNDC.js → context-OCS7HLJP.js} +5 -4
- package/bundle/{context-HCEGZNDC.js.map → context-OCS7HLJP.js.map} +1 -1
- package/bundle/daemon-NPKYZ3CJ.js +292 -0
- package/bundle/daemon-NPKYZ3CJ.js.map +7 -0
- package/bundle/delegation-tools-PF7RD2RW.js +28 -0
- package/bundle/{deploy-lib-import-32ZFKHWP.js → deploy-lib-import-ODLDL2DB.js} +5 -4
- package/bundle/digital-signature-PNY4TR2W.js +14 -0
- package/bundle/{direct-api-transport-YR7SXXNN.js → direct-api-transport-EADHM67Z.js} +21 -20
- package/bundle/{direct-api-transport-YR7SXXNN.js.map → direct-api-transport-EADHM67Z.js.map} +1 -1
- package/bundle/direct-api-transport-SLJ2Z6NX.js +861 -0
- package/bundle/direct-api-transport-SLJ2Z6NX.js.map +7 -0
- package/bundle/{discord-adapter-YYWVMPPU.js → discord-adapter-FBJOJSTW.js} +25 -24
- package/bundle/{discord-adapter-YYWVMPPU.js.map → discord-adapter-FBJOJSTW.js.map} +1 -1
- package/bundle/discord-adapter-IJISVHUE.js +585 -0
- package/bundle/discord-adapter-IJISVHUE.js.map +7 -0
- package/bundle/discord-adapter-UYOCKRDF.js +586 -0
- package/bundle/discord-adapter-UYOCKRDF.js.map +7 -0
- package/bundle/{dist-MTMKARCP.js → dist-J3T4XVKX.js} +4 -3
- package/bundle/{dist-MTMKARCP.js.map → dist-J3T4XVKX.js.map} +1 -1
- package/bundle/{dns-wakeup-27M7D2MR.js → dns-wakeup-RYOCQ6GR.js} +6 -5
- package/bundle/{dns-wakeup-27M7D2MR.js.map → dns-wakeup-RYOCQ6GR.js.map} +1 -1
- package/bundle/{doctor-QNUSDY73.js → doctor-R54GZPKL.js} +10 -9
- package/bundle/{doctor-QNUSDY73.js.map → doctor-R54GZPKL.js.map} +1 -1
- package/bundle/{ensure-invariants-NMXNS476.js → ensure-invariants-K2ZUZ6NR.js} +7 -6
- package/bundle/{ensure-invariants-NMXNS476.js.map → ensure-invariants-K2ZUZ6NR.js.map} +1 -1
- package/bundle/ensure-invariants-KUXIW73S.js +50 -0
- package/bundle/ensure-invariants-KUXIW73S.js.map +7 -0
- package/bundle/env-schema-DGD6QWPA.js +20 -0
- package/bundle/{esm-DDP6NCZG.js → esm-PFOJARXA.js} +5 -4
- package/bundle/{esm-DDP6NCZG.js.map → esm-PFOJARXA.js.map} +1 -1
- package/bundle/{fallback-policy-L4QV2PEJ.js → fallback-policy-SR6ED5I3.js} +4 -3
- package/bundle/{fallback-policy-L4QV2PEJ.js.map → fallback-policy-SR6ED5I3.js.map} +1 -1
- package/bundle/{health-check-SPA7NT6N.js → health-check-RJ2SUJYL.js} +4 -3
- package/bundle/{health-check-SPA7NT6N.js.map → health-check-RJ2SUJYL.js.map} +1 -1
- package/bundle/hook-system-POI5VRIX.js +18 -0
- package/bundle/hotskills-6ECHLXTJ.js +13 -0
- package/bundle/install-24XR5FO5.js +13 -0
- package/bundle/install-AJ7VW76P.js +13 -0
- package/bundle/{install-log-IAPHYKD4.js → install-log-Q6RUHKWC.js} +4 -3
- package/bundle/{install-log-IAPHYKD4.js.map → install-log-Q6RUHKWC.js.map} +1 -1
- package/bundle/{install-manifest-SPQRUNXL.js → install-manifest-MCJCAYSR.js} +9 -7
- package/bundle/install-manifest-MCJCAYSR.js.map +7 -0
- package/bundle/install-manifest-ZETY4AFS.js +104 -0
- package/bundle/install-manifest-ZETY4AFS.js.map +7 -0
- package/bundle/{install-validate-PVLZXYLQ.js → install-validate-H74LUCE2.js} +4 -3
- package/bundle/{install-validate-PVLZXYLQ.js.map → install-validate-H74LUCE2.js.map} +1 -1
- package/bundle/{irc-adapter-OI5UZSQF.js → irc-adapter-RKRUSZXB.js} +7 -6
- package/bundle/{irc-adapter-OI5UZSQF.js.map → irc-adapter-RKRUSZXB.js.map} +1 -1
- package/bundle/{irc-config-55YO6EGB.js → irc-config-6VY67UPQ.js} +8 -7
- package/bundle/{irc-config-55YO6EGB.js.map → irc-config-6VY67UPQ.js.map} +1 -1
- package/bundle/{logs-ZNYXX5PA.js → logs-EK4HYRKR.js} +4 -3
- package/bundle/{logs-ZNYXX5PA.js.map → logs-EK4HYRKR.js.map} +1 -1
- package/bundle/{media-utils-XNNDTYFI.js → media-utils-QBY5WBF3.js} +8 -7
- package/bundle/{media-utils-XNNDTYFI.js.map → media-utils-QBY5WBF3.js.map} +1 -1
- package/bundle/message-pipeline-ANSMPK5O.js +34 -0
- package/bundle/message-pipeline-HXZMRGXZ.js +34 -0
- package/bundle/message-pipeline-XUUTGPFH.js +35 -0
- package/bundle/meta.json +1828 -1650
- package/bundle/model-health-registry-7ECZFCW4.js +12 -0
- package/bundle/model-health-registry-LDC76RPP.js +12 -0
- package/bundle/notification-OJ4YE4VG.js +14 -0
- package/bundle/{openrouter-credits-EDY7ETAU.js → openrouter-credits-L45SYKT3.js} +7 -6
- package/bundle/{openrouter-credits-EDY7ETAU.js.map → openrouter-credits-L45SYKT3.js.map} +1 -1
- package/bundle/{passwd-RRFV4CC5.js → passwd-QSHZJ2CG.js} +4 -3
- package/bundle/{passwd-RRFV4CC5.js.map → passwd-QSHZJ2CG.js.map} +1 -1
- package/bundle/paths-ZJYIDND2.js +18 -0
- package/bundle/{peer-client-52XYMNI7.js → peer-client-T44VI7NB.js} +13 -12
- package/bundle/{peer-client-52XYMNI7.js.map → peer-client-T44VI7NB.js.map} +1 -1
- package/bundle/peer-config-D5A4454H.js +17 -0
- package/bundle/{peer-sessions-EAXTNQ36.js → peer-sessions-MY2YVXHC.js} +4 -3
- package/bundle/{peer-sessions-EAXTNQ36.js.map → peer-sessions-MY2YVXHC.js.map} +1 -1
- package/bundle/{pending-callback-RIMQZ7FJ.js → pending-callback-6KLBSHLX.js} +4 -3
- package/bundle/{pending-callback-RIMQZ7FJ.js.map → pending-callback-6KLBSHLX.js.map} +1 -1
- package/bundle/phase-transport-43NP5XBK.js +23 -0
- package/bundle/phase-transport-GNUZI6EW.js +23 -0
- package/bundle/phase-transport-Q7K6V3VZ.js +23 -0
- package/bundle/phase-transport-SLJXIAY5.js +23 -0
- package/bundle/{responses-adapter-AAQTY3K4.js → responses-adapter-DAV2JUL7.js} +4 -3
- package/bundle/{responses-adapter-AAQTY3K4.js.map → responses-adapter-DAV2JUL7.js.map} +1 -1
- package/bundle/{restore-ZE3SEPSS.js → restore-ROJF22R2.js} +5 -4
- package/bundle/{restore-ZE3SEPSS.js.map → restore-ROJF22R2.js.map} +1 -1
- package/bundle/{self-healer-utils-DMUUXC47.js → self-healer-utils-7NFH22VJ.js} +7 -6
- package/bundle/{self-healer-utils-DMUUXC47.js.map → self-healer-utils-7NFH22VJ.js.map} +1 -1
- package/bundle/skill-stats-IPVKMWN3.js +23 -0
- package/bundle/sleep-4NVWZHVN.js +20 -0
- package/bundle/soul-bundle-7EYTEKFE.js +15 -0
- package/bundle/soul-loader-7FN7WDHM.js +18 -0
- package/bundle/soul-loader-K237NP4T.js +17 -0
- package/bundle/soul-loader-K237NP4T.js.map +7 -0
- package/bundle/soul-loader-UVJ6HZM3.js +17 -0
- package/bundle/soul-loader-UVJ6HZM3.js.map +7 -0
- package/bundle/src-Z3WR7SRT.js +9 -0
- package/bundle/src-Z3WR7SRT.js.map +7 -0
- package/bundle/{sse-parser-anthropic-P7CE2MH2.js → sse-parser-anthropic-H42TTLBD.js} +7 -6
- package/bundle/{sse-parser-anthropic-P7CE2MH2.js.map → sse-parser-anthropic-H42TTLBD.js.map} +1 -1
- package/bundle/{sse-parser-responses-EQQA5FWN.js → sse-parser-responses-WG2LY2ML.js} +7 -6
- package/bundle/{sse-parser-responses-EQQA5FWN.js.map → sse-parser-responses-WG2LY2ML.js.map} +1 -1
- package/bundle/{ssrf-guard-FZCBYIVW.js → ssrf-guard-E2KBBC5E.js} +7 -6
- package/bundle/{ssrf-guard-FZCBYIVW.js.map → ssrf-guard-E2KBBC5E.js.map} +1 -1
- package/bundle/{start-FH3GRMJ4.js → start-4IWBKLWO.js} +4 -3
- package/bundle/{start-FH3GRMJ4.js.map → start-4IWBKLWO.js.map} +1 -1
- package/bundle/{stream-single-WSG4D53C.js → stream-single-RFJNUTL6.js} +4 -3
- package/bundle/{stream-single-WSG4D53C.js.map → stream-single-RFJNUTL6.js.map} +1 -1
- package/bundle/stt-CF3CPFDC.js +15 -0
- package/bundle/stt-CF3CPFDC.js.map +7 -0
- package/bundle/subagent-runtime-P7GCFBM3.js +13 -0
- package/bundle/subagent-runtime-P7GCFBM3.js.map +7 -0
- package/bundle/subagent-runtime-USNPO4WF.js +13 -0
- package/bundle/subagent-runtime-USNPO4WF.js.map +7 -0
- package/bundle/subagent-runtime-XS2ZXYOZ.js +13 -0
- package/bundle/subagent-runtime-XS2ZXYOZ.js.map +7 -0
- package/bundle/{system-message-T5R3EYYN.js → system-message-TALP6GP2.js} +6 -5
- package/bundle/{system-message-T5R3EYYN.js.map → system-message-TALP6GP2.js.map} +1 -1
- package/bundle/{system-status-KQ6KHFJ6.js → system-status-2CR5OUDY.js} +10 -9
- package/bundle/{system-status-KQ6KHFJ6.js.map → system-status-2CR5OUDY.js.map} +1 -1
- package/bundle/task-store-KIBFZL5A.js +23 -0
- package/bundle/task-store-KIBFZL5A.js.map +7 -0
- package/bundle/{telegram-adapter-2V3XUMT5.js → telegram-adapter-ISQRW7PN.js} +34 -33
- package/bundle/{telegram-adapter-2V3XUMT5.js.map → telegram-adapter-ISQRW7PN.js.map} +1 -1
- package/bundle/telegram-adapter-QCD7AG5D.js +1062 -0
- package/bundle/telegram-adapter-QCD7AG5D.js.map +7 -0
- package/bundle/telegram-adapter-Y3PVA25S.js +1061 -0
- package/bundle/telegram-adapter-Y3PVA25S.js.map +7 -0
- package/bundle/telegram-adapter-YAXSK2RT.js +1062 -0
- package/bundle/telegram-adapter-YAXSK2RT.js.map +7 -0
- package/bundle/tool-registry-DFCCGZCB.js +39 -0
- package/bundle/tool-registry-DFCCGZCB.js.map +7 -0
- package/bundle/tool-sandbox-OZMXJZLQ.js +21 -0
- package/bundle/tool-sandbox-OZMXJZLQ.js.map +7 -0
- package/bundle/{transport-config-YLXU33RO.js → transport-config-ANPS2RYT.js} +11 -10
- package/bundle/transport-config-ANPS2RYT.js.map +7 -0
- package/bundle/update-check-O5MS6B3L.js +13 -0
- package/bundle/update-check-O5MS6B3L.js.map +7 -0
- package/bundle/usage-tracker-S4Z2G2K5.js +18 -0
- package/bundle/usage-tracker-S4Z2G2K5.js.map +7 -0
- package/bundle/user-registry-GTAJIW6E.js +17 -0
- package/bundle/user-registry-GTAJIW6E.js.map +7 -0
- package/config/.env +2 -0
- package/config/auto-fix.json +14 -0
- package/config/irc.json.example +30 -0
- package/config/models.json.example +229 -0
- package/config/peers.json.example +12 -0
- package/config/schemas/irc.schema.json +42 -0
- package/config/schemas/models.schema.json +17 -0
- package/config/schemas/peers.schema.json +35 -0
- package/config/schemas/transport.schema.json +35 -0
- package/config/schemas/users.schema.json +22 -0
- package/config/transport.default.json +30 -0
- package/config/transport.json.example +102 -0
- package/config/users.json.example +11 -0
- package/install-manifest.json +148 -0
- package/package.json +4 -2
- package/scripts/abtars-daemon.service +1 -0
- package/scripts/watchdog.sh +1 -1
- package/bundle/_registry.generated-M4WY2MMI.js +0 -35
- package/bundle/agent-registry-LT4JNQH6.js +0 -18
- package/bundle/browse-delivery-JXBY36GK.js +0 -17
- package/bundle/browser-ELNDVPLC.js +0 -18
- package/bundle/capability-CIL3G4FI.js +0 -17
- package/bundle/chunk-5R2ANXQ7.js +0 -510
- package/bundle/chunk-5R2ANXQ7.js.map +0 -7
- package/bundle/chunk-6UCRKRWR.js.map +0 -7
- package/bundle/chunk-M6VBAPNT.js +0 -16
- package/bundle/chunk-OP7BTAWY.js +0 -29
- package/bundle/chunk-UCQ2WC3B.js.map +0 -7
- package/bundle/chunk-XREWVCUO.js.map +0 -7
- package/bundle/chunk-Y6XAEX2Q.js.map +0 -7
- package/bundle/commands-BHVUOU3V.js +0 -31
- package/bundle/completion-buffer-P253ONKF.js +0 -13
- package/bundle/config-RGSDAPZN.js +0 -19
- package/bundle/delegation-tools-GYTS2D6A.js +0 -27
- package/bundle/digital-signature-OFCGSHWO.js +0 -13
- package/bundle/env-schema-2KBHBDGN.js +0 -19
- package/bundle/hook-system-6Q5YTR53.js +0 -17
- package/bundle/hotskills-K7BM4YLB.js +0 -12
- package/bundle/install-6HRZVKUM.js +0 -15
- package/bundle/install-manifest-SPQRUNXL.js.map +0 -7
- package/bundle/message-pipeline-LLH5SYMO.js +0 -33
- package/bundle/model-health-registry-35LQNVQR.js +0 -11
- package/bundle/notification-Y5S5MMLV.js +0 -13
- package/bundle/paths-G33RZWZ7.js +0 -17
- package/bundle/peer-config-VK6EDLN5.js +0 -16
- package/bundle/phase-transport-KYERDL2O.js +0 -22
- package/bundle/skill-stats-LLEXEXLR.js +0 -22
- package/bundle/sleep-OYIUOVQD.js +0 -19
- package/bundle/soul-loader-54WCVNLJ.js +0 -16
- package/bundle/src-JL4PVO23.js +0 -8
- package/bundle/stt-2UH3RITX.js +0 -14
- package/bundle/subagent-runtime-LE2ZXH3G.js +0 -12
- package/bundle/task-store-K7CQDEPI.js +0 -22
- package/bundle/tool-registry-MU3OX4UI.js +0 -38
- package/bundle/tool-sandbox-VYOK4ZOA.js +0 -20
- package/bundle/update-QCW5LXRN.js +0 -13
- package/bundle/update-check-27KZSAP6.js +0 -12
- package/bundle/usage-tracker-OVVEVMOY.js +0 -17
- package/bundle/user-registry-D4SD73UV.js +0 -16
- /package/bundle/{agent-registry-LT4JNQH6.js.map → agent-registry-5M77ZOMV.js.map} +0 -0
- /package/bundle/{bridge-lock-transport-4AC2G5G6.js.map → agent-registry-VJMNIQ5W.js.map} +0 -0
- /package/bundle/{browse-delivery-JXBY36GK.js.map → bridge-lock-transport-HO545SBK.js.map} +0 -0
- /package/bundle/{browser-ELNDVPLC.js.map → browse-delivery-64GQIUHG.js.map} +0 -0
- /package/bundle/{capability-CIL3G4FI.js.map → browser-EXR5OQGK.js.map} +0 -0
- /package/bundle/{chunk-NWDBD4PA.js.map → capability-HIE7UGFU.js.map} +0 -0
- /package/bundle/{commands-BHVUOU3V.js.map → chunk-7K2YZTLD.js.map} +0 -0
- /package/bundle/{completion-buffer-P253ONKF.js.map → commands-AIL4XOIZ.js.map} +0 -0
- /package/bundle/{config-RGSDAPZN.js.map → commands-K77NVSXZ.js.map} +0 -0
- /package/bundle/{delegation-tools-GYTS2D6A.js.map → commands-V6RSVC4Y.js.map} +0 -0
- /package/bundle/{deploy-lib-import-32ZFKHWP.js.map → completion-buffer-S3LXDZG2.js.map} +0 -0
- /package/bundle/{digital-signature-OFCGSHWO.js.map → config-C6VHRJQ7.js.map} +0 -0
- /package/bundle/{env-schema-2KBHBDGN.js.map → delegation-tools-PF7RD2RW.js.map} +0 -0
- /package/bundle/{hook-system-6Q5YTR53.js.map → deploy-lib-import-ODLDL2DB.js.map} +0 -0
- /package/bundle/{hotskills-K7BM4YLB.js.map → digital-signature-PNY4TR2W.js.map} +0 -0
- /package/bundle/{install-6HRZVKUM.js.map → env-schema-DGD6QWPA.js.map} +0 -0
- /package/bundle/{message-pipeline-LLH5SYMO.js.map → hook-system-POI5VRIX.js.map} +0 -0
- /package/bundle/{model-health-registry-35LQNVQR.js.map → hotskills-6ECHLXTJ.js.map} +0 -0
- /package/bundle/{notification-Y5S5MMLV.js.map → install-24XR5FO5.js.map} +0 -0
- /package/bundle/{paths-G33RZWZ7.js.map → install-AJ7VW76P.js.map} +0 -0
- /package/bundle/{peer-config-VK6EDLN5.js.map → message-pipeline-ANSMPK5O.js.map} +0 -0
- /package/bundle/{phase-transport-KYERDL2O.js.map → message-pipeline-HXZMRGXZ.js.map} +0 -0
- /package/bundle/{skill-stats-LLEXEXLR.js.map → message-pipeline-XUUTGPFH.js.map} +0 -0
- /package/bundle/{sleep-OYIUOVQD.js.map → model-health-registry-7ECZFCW4.js.map} +0 -0
- /package/bundle/{soul-loader-54WCVNLJ.js.map → model-health-registry-LDC76RPP.js.map} +0 -0
- /package/bundle/{src-JL4PVO23.js.map → notification-OJ4YE4VG.js.map} +0 -0
- /package/bundle/{stt-2UH3RITX.js.map → paths-ZJYIDND2.js.map} +0 -0
- /package/bundle/{subagent-runtime-LE2ZXH3G.js.map → peer-config-D5A4454H.js.map} +0 -0
- /package/bundle/{task-store-K7CQDEPI.js.map → phase-transport-43NP5XBK.js.map} +0 -0
- /package/bundle/{tool-registry-MU3OX4UI.js.map → phase-transport-GNUZI6EW.js.map} +0 -0
- /package/bundle/{tool-sandbox-VYOK4ZOA.js.map → phase-transport-Q7K6V3VZ.js.map} +0 -0
- /package/bundle/{transport-config-YLXU33RO.js.map → phase-transport-SLJXIAY5.js.map} +0 -0
- /package/bundle/{update-QCW5LXRN.js.map → skill-stats-IPVKMWN3.js.map} +0 -0
- /package/bundle/{update-check-27KZSAP6.js.map → sleep-4NVWZHVN.js.map} +0 -0
- /package/bundle/{usage-tracker-OVVEVMOY.js.map → soul-bundle-7EYTEKFE.js.map} +0 -0
- /package/bundle/{user-registry-D4SD73UV.js.map → soul-loader-7FN7WDHM.js.map} +0 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../node_modules/@andresaya/edge-tts/dist/config/constants.js", "../node_modules/@andresaya/edge-tts/dist/services/EdgeTTS.js", "../node_modules/@andresaya/edge-tts/dist/index.js", "../src/components/commands/registry.ts", "../src/components/message-pipeline.ts", "../src/components/clean-response.ts", "../src/components/reactions.ts", "../src/components/tts.ts", "../src/components/sanitize-outbound.ts", "../src/components/pipeline/middleware.ts", "../src/components/pipeline/voice.ts", "../src/components/pipeline/commands.ts", "../src/components/pipeline/busy-guard.ts", "../src/components/pipeline/prompt-builder.ts", "../src/components/message-interceptor.ts", "../src/components/session-registry.ts", "../src/components/commands/handlers-transport.ts", "../src/components/commands/exec-async.ts", "../src/components/commands/handlers-system.ts", "../src/components/nlm-command-handler.ts", "../src/components/commands/handlers-memory.ts", "../src/components/commands/handlers-sleep.ts", "../src/components/commands/handlers-tasks.ts", "../src/components/commands/handlers-admin.ts", "../src/components/commands/session-handler.ts", "../src/components/session-manager.ts", "../src/components/commands/index.ts"],
|
|
4
|
+
"sourcesContent": ["\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Constants = void 0;\nexports.Constants = {\n TRUSTED_CLIENT_TOKEN: '6A5AA1D4EAFF4E9FB37E23D68491D6F4',\n BASE_URL: 'https://speech.platform.bing.com/consumer/speech/synthesize/readaloud',\n WSS_URL: 'wss://speech.platform.bing.com/consumer/speech/synthesize/readaloud/edge/v1',\n VOICES_URL: 'https://speech.platform.bing.com/consumer/speech/synthesize/readaloud/voices/list',\n CHROMIUM_FULL_VERSION: '143.0.3650.75',\n CHROMIUM_MAJOR_VERSION: '143',\n VERSION_MS_GEC: '1-143.0.3650',\n token32() {\n const bytes = new Uint8Array(16);\n crypto.getRandomValues(bytes);\n return Array.from(bytes)\n .map(b => b.toString(16).padStart(2, '0'))\n .join('')\n .toUpperCase();\n },\n getBaseHeaders() {\n return {\n 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36 Edg/143.0.0.0',\n 'Accept-Encoding': 'gzip, deflate, br, zstd',\n 'Accept-Language': 'en-US,en;q=0.9',\n 'Cookie': 'MUID=' + this.token32()\n };\n },\n WSS_HEADERS: {\n 'Pragma': 'no-cache',\n 'Cache-Control': 'no-cache',\n 'Origin': 'chrome-extension://jdiccldimpdaibmpdkjnbmckianbfold',\n 'Sec-WebSocket-Protocol': 'synthesize',\n 'Sec-WebSocket-Version': '13',\n 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.3650.75 Safari/537.36 Edg/143.0.3650.75'\n },\n VOICE_HEADERS: {\n 'Sec-CH-UA': '\" Not;A Brand\";v=\"99\", \"Microsoft Edge\";v=\"143\", \"Chromium\";v=\"143\"',\n 'Sec-CH-UA-Mobile': '?0',\n 'Accept': '*/*',\n 'Sec-Fetch-Site': 'none',\n 'Sec-Fetch-Mode': 'cors',\n 'Sec-Fetch-Dest': 'empty'\n },\n // https://learn.microsoft.com/en-us/azure/ai-services/speech-service/rest-text-to-speech?tabs=nonstreaming\n OUTPUT_FORMAT: {\n 'AUDIO_24KHZ_48KBITRATE_MONO_MP3': 'audio-24khz-48kbitrate-mono-mp3',\n 'AUDIO_24KHZ_96KBITRATE_MONO_MP3': 'audio-24khz-96kbitrate-mono-mp3',\n 'WEBM_24KHZ_16BIT_MONO_OPUS': 'webm-24khz-16bit-mono-opus',\n }\n};\n", "\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.EdgeTTS = void 0;\nconst ws_1 = __importDefault(require(\"ws\"));\nconst constants_1 = require(\"../config/constants\");\nconst promises_1 = require(\"fs/promises\");\nconst buffer_1 = require(\"buffer\");\nconst https_1 = __importDefault(require(\"https\"));\nfunction ensureBuffer(data) {\n if (buffer_1.Buffer.isBuffer(data)) {\n return data;\n }\n if (data instanceof ArrayBuffer) {\n return buffer_1.Buffer.from(data);\n }\n if (Array.isArray(data)) {\n return buffer_1.Buffer.concat(data);\n }\n if (typeof data === 'string') {\n return buffer_1.Buffer.from(data, 'utf-8');\n }\n throw new Error(`Unsupported RawData type: ${typeof data}`);\n}\nclass EdgeTTS {\n audio_stream = [];\n audio_format = 'mp3';\n output_format = 'audio-24khz-48kbitrate-mono-mp3';\n word_boundaries = [];\n ws;\n async normalizeVoices(data) {\n const out = [];\n for (const v of data || []) {\n const short = v?.ShortName || \"\";\n const locale = v?.Locale || \"\";\n // base: remove locale prefix and Neural/NeuralHD suffix\n let base = short.replace(/^[a-z]{2}-[A-Z]{2}-/, \"\");\n base = base.replace(/NeuralHD$/, \"\").replace(/Neural$/, \"\").trim();\n // VoiceType: if NeuralHD/Neural in Name or ShortName\n const mix = `${v?.Name || \"\"} ${short}`;\n const voiceType = v?.VoiceType || (/NeuralHD/i.test(mix) ? \"NeuralHD\" : \"Neural\");\n // LocaleName: prefer LocaleName -> LanguageName -> locale\n const localeName = v?.LocaleName || (locale || null);\n // DisplayName: prefer DisplayName -> FriendlyName -> base -> short\n let display = v?.DisplayName || v?.FriendlyName || base || short;\n display = display.replace(/^Microsoft\\s+/i, \"\");\n display = display.split(\" - \")[0].trim();\n display = display.replace(/\\s*Online\\s*\\(Natural\\)\\s*/i, \" \");\n display = display.replace(/\\s*Online\\s*/i, \" \");\n display = display.replace(/\\s+/g, \" \").trim();\n // VoiceTag parsing\n const tag = (v?.VoiceTag && typeof v.VoiceTag === \"object\") ? v.VoiceTag : {};\n const tailored = Array.isArray(tag.TailoredScenarios)\n ? tag.TailoredScenarios\n : (Array.isArray(tag.ContentCategories) ? tag.ContentCategories : []);\n const personalities = Array.isArray(tag.VoicePersonalities)\n ? tag.VoicePersonalities\n : [];\n out.push({\n Name: short || (v?.Name || \"\"),\n DisplayName: display,\n LocalName: display,\n ShortName: short || (v?.Name || \"\"),\n Gender: v?.Gender ?? null,\n Locale: locale || null,\n LocaleName: localeName,\n SecondaryLocaleList: Array.isArray(v?.SecondaryLocaleList) ? v.SecondaryLocaleList : [],\n VoiceType: voiceType,\n VoiceTag: {\n TailoredScenarios: tailored,\n VoicePersonalities: personalities,\n },\n FriendlyName: `${display} (${voiceType}) - ${localeName}`,\n });\n }\n return out;\n }\n async getVoices() {\n const secMsGEC = await this.generateSecMsGec(constants_1.Constants.TRUSTED_CLIENT_TOKEN);\n const httpsAgent = new https_1.default.Agent({ rejectUnauthorized: false });\n const url = `${constants_1.Constants.VOICES_URL}` +\n `?TrustedClientToken=${constants_1.Constants.TRUSTED_CLIENT_TOKEN}` +\n `&Sec-MS-GEC=${secMsGEC}` +\n `&Sec-MS-GEC-Version=${constants_1.Constants.VERSION_MS_GEC}`;\n const headers = {\n ...constants_1.Constants.getBaseHeaders(),\n \"Accept-Encoding\": \"identity\", // evita gzip/br/zstd\n };\n const voicesRaw = await new Promise((resolve, reject) => {\n const req = https_1.default.request(url, { method: \"GET\", headers, agent: httpsAgent }, (res) => {\n const chunks = [];\n res.on(\"data\", (chunk) => chunks.push(buffer_1.Buffer.isBuffer(chunk) ? chunk : buffer_1.Buffer.from(chunk)));\n res.on(\"error\", reject);\n res.on(\"end\", () => {\n const body = buffer_1.Buffer.concat(chunks).toString(\"utf8\");\n try {\n const parsed = JSON.parse(body);\n // soporta array directo o { voices: [...] }\n const voices = Array.isArray(parsed)\n ? parsed\n : (parsed.voices || parsed.Voices || []);\n resolve(Array.isArray(voices) ? voices : []);\n }\n catch (e) {\n reject(new Error(\"JSON inv\u00E1lido: \" + (e?.message || String(e))));\n }\n });\n });\n req.on(\"error\", reject);\n req.end();\n });\n return this.normalizeVoices(voicesRaw);\n }\n async getVoicesByLanguage(locale) {\n const voices = await this.getVoices();\n return voices.filter(voice => voice.Locale.startsWith(locale));\n }\n async getVoicesByGender(gender) {\n const voices = await this.getVoices();\n return voices.filter(voice => voice.Gender === gender);\n }\n generateUUID() {\n return 'xxxxxxxx-xxxx-xxxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\n const r = Math.random() * 16 | 0;\n const v = c === 'x' ? r : (r & 0x3 | 0x8);\n return v.toString(16);\n });\n }\n validatePitch(pitch) {\n if (typeof pitch === 'number') {\n return (pitch >= 0 ? `+${pitch}Hz` : `${pitch}Hz`);\n }\n if (!/^[+-]?\\d{1,3}(?:\\.\\d+)?Hz$/.test(pitch)) {\n throw new Error(\"Invalid pitch format. Expected format: '-100Hz to +100Hz' or a number.\");\n }\n return pitch;\n }\n validateRate(rate) {\n let rateValue;\n if (typeof rate === 'string') {\n rateValue = parseFloat(rate.replace('%', ''));\n if (isNaN(rateValue))\n throw new Error(\"Invalid rate format.\");\n }\n else {\n rateValue = rate;\n }\n if (rateValue >= 0) {\n return `+${rateValue}%`;\n }\n return `${rateValue}%`;\n }\n validateVolume(volume) {\n let volumeValue;\n if (typeof volume === 'string') {\n volumeValue = parseInt(volume.replace('%', ''), 10);\n if (isNaN(volumeValue))\n throw new Error(\"Invalid volume format.\");\n }\n else {\n volumeValue = volume;\n }\n if (volumeValue < -100 || volumeValue > 100) {\n throw new Error(\"Volume cannot be negative. Expected a value from -100% to 100% (or more).\");\n }\n return `${volumeValue}%`;\n }\n async synthesize(text, voice = 'en-US-AnaNeural', options = {}) {\n const secMsGEC = await this.generateSecMsGec(constants_1.Constants.TRUSTED_CLIENT_TOKEN);\n return new Promise((resolve, reject) => {\n this.audio_stream = [];\n const reqId = this.generateUUID();\n const url = `${constants_1.Constants.WSS_URL}?TrustedClientToken=${constants_1.Constants.TRUSTED_CLIENT_TOKEN}&Sec-MS-GEC=${secMsGEC}&Sec-MS-GEC-Version=${constants_1.Constants.VERSION_MS_GEC}&ConnectionId=${reqId}`;\n this.ws = new ws_1.default(url, {\n headers: constants_1.Constants.getBaseHeaders(),\n rejectUnauthorized: false\n });\n const SSML_text = this.getSSML(text, voice, options);\n const outputFormat = options.outputFormat || 'audio-24khz-48kbitrate-mono-mp3';\n this.output_format = outputFormat;\n let timedOut = false;\n let inactivityTimeout;\n const resetInactivityTimeout = () => {\n clearTimeout(inactivityTimeout);\n inactivityTimeout = setTimeout(() => {\n timedOut = true;\n if (this.ws && this.ws.readyState === ws_1.default.OPEN) {\n this.ws.close();\n }\n reject(new Error(\"WebSocket inactivity timeout - no response from server\"));\n }, 30000); // 30 seconds of inactivity\n };\n this.ws.on('open', () => {\n resetInactivityTimeout(); // start the inactivity timeout\n const message = this.buildTTSConfigMessage(outputFormat);\n this.ws.send(message);\n const timestamp = this.nowRFC1123();\n const speechMessage = `X-RequestId:${reqId}\\r\\nContent-Type:application/ssml+xml\\r\\nX-Timestamp:${timestamp}\\r\\nPath:ssml\\r\\n\\r\\n${SSML_text}`;\n this.ws.send(speechMessage);\n });\n this.ws.on('message', (data) => {\n resetInactivityTimeout(); // restart inactivity timeout\n this.processAudioData(data);\n });\n this.ws.on('error', (err) => {\n clearTimeout(inactivityTimeout);\n if (this.ws && this.ws.readyState === ws_1.default.OPEN) {\n this.ws.close();\n }\n reject(err);\n });\n this.ws.on('close', () => {\n clearTimeout(inactivityTimeout);\n if (!timedOut) {\n resolve();\n }\n });\n });\n }\n escapeXML(text) {\n return text\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n }\n getSSML(content, voice, options = {}) {\n const pitch = this.validatePitch(options.pitch ?? 0);\n const rate = this.validateRate(options.rate ?? 0);\n const volume = this.validateVolume(options.volume ?? 0);\n const escapedText = this.escapeXML(content);\n return `<speak version=\"1.0\" xmlns=\"http://www.w3.org/2001/10/synthesis\" xmlns:mstts=\"https://www.w3.org/2001/mstts\" xml:lang=\"en-US\">\r\n <voice name=\"${voice}\">\r\n <prosody pitch=\"${pitch}\" rate=\"${rate}\" volume=\"${volume}\">\r\n ${escapedText}\r\n </prosody>\r\n </voice>\r\n </speak>\r\n `;\n }\n nowRFC1123(timeZone = 'UTC') {\n const now = new Date();\n const options = {\n weekday: 'short',\n year: 'numeric',\n month: 'short',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n timeZone,\n timeZoneName: 'short'\n };\n return now.toLocaleString('en-US', options);\n }\n parseRFC1123(rfcStr) {\n return new Date(rfcStr);\n }\n buildTTSConfigMessage(outputFormat = 'audio-24khz-48kbitrate-mono-mp3') {\n const timestamp = this.nowRFC1123();\n return `X-Timestamp:${timestamp}\\r\\nContent-Type:application/json; charset=utf-8\\r\\nPath:speech.config\\r\\n\\r\\n` +\n `{\"context\":{\"synthesis\":{\"audio\":{\"metadataoptions\":{\"sentenceBoundaryEnabled\":false,\"wordBoundaryEnabled\":true},\"outputFormat\":\"${outputFormat}\"}}}}`;\n }\n async *synthesizeStream(text, voice = 'en-US-AnaNeural', options = {}) {\n this.audio_stream = [];\n const reqId = this.generateUUID();\n const secMsGEC = await this.generateSecMsGec(constants_1.Constants.TRUSTED_CLIENT_TOKEN);\n const url = `${constants_1.Constants.WSS_URL}?TrustedClientToken=${constants_1.Constants.TRUSTED_CLIENT_TOKEN}&Sec-MS-GEC=${secMsGEC}&Sec-MS-GEC-Version=${constants_1.Constants.VERSION_MS_GEC}&ConnectionId=${reqId}`;\n this.ws = new ws_1.default(url, {\n headers: constants_1.Constants.getBaseHeaders(),\n rejectUnauthorized: false\n });\n const SSML_text = this.getSSML(text, voice, options);\n const outputFormat = options.outputFormat || 'audio-24khz-48kbitrate-mono-mp3';\n this.output_format = outputFormat;\n const queue = [];\n let done = false;\n let error = null;\n let notify = null;\n const push = (chunk) => {\n queue.push(chunk);\n if (notify) {\n notify();\n notify = null;\n }\n };\n let timedOut = false;\n let inactivityTimeout;\n const resetInactivityTimeout = () => {\n clearTimeout(inactivityTimeout);\n inactivityTimeout = setTimeout(() => {\n timedOut = true;\n error = new Error(\"WebSocket inactivity timeout - no response from server\");\n done = true;\n if (this.ws && this.ws.readyState === ws_1.default.OPEN) {\n this.ws.close();\n }\n if (notify) {\n notify();\n notify = null;\n }\n }, 30000); // 30 seconds of inactivity\n };\n this.ws.on('open', () => {\n resetInactivityTimeout(); // start the inactivity timeout\n const message = this.buildTTSConfigMessage(outputFormat);\n this.ws.send(message);\n const timestamp = this.nowRFC1123();\n const speechMessage = `X-RequestId:${reqId}\\r\\nContent-Type:application/ssml+xml\\r\\nX-Timestamp:${timestamp}\\r\\nPath:ssml\\r\\n\\r\\n${SSML_text}`;\n this.ws.send(speechMessage);\n });\n this.ws.on('message', (data) => {\n resetInactivityTimeout(); // restart inactivity timeout\n const buffer = ensureBuffer(data);\n const needle = buffer_1.Buffer.from('Path:audio\\r\\n');\n const audioStartIndex = buffer.indexOf(new Uint8Array(needle));\n if (audioStartIndex !== -1) {\n const audioChunk = buffer.subarray(audioStartIndex + needle.length);\n const chunk = new Uint8Array(audioChunk);\n this.audio_stream.push(chunk);\n push(chunk);\n }\n if (buffer.toString().includes(\"Path:audio.metadata\")) {\n const metadataStart = buffer.indexOf(\"\\r\\n\\r\\n\") + 4;\n const metadataJson = buffer.toString().substring(metadataStart);\n const meta = this.parseMetadata(metadataJson);\n if (meta !== null) {\n this.word_boundaries.push(meta);\n }\n return;\n }\n if (buffer.toString().includes('Path:turn.end')) {\n this.ws?.close();\n }\n });\n this.ws.on('error', (err) => {\n clearTimeout(inactivityTimeout);\n error = err;\n done = true;\n if (notify) {\n notify();\n notify = null;\n }\n });\n this.ws.on('close', () => {\n clearTimeout(inactivityTimeout);\n done = true;\n if (notify) {\n notify();\n notify = null;\n }\n });\n while (!done || queue.length > 0) {\n if (queue.length === 0) {\n await new Promise(resolve => (notify = resolve));\n continue;\n }\n const chunk = queue.shift();\n if (chunk) {\n yield chunk;\n }\n }\n if (error) {\n throw error;\n }\n }\n processAudioData(data) {\n const buffer = ensureBuffer(data);\n const needle = buffer_1.Buffer.from(\"Path:audio\\r\\n\");\n const audioStartIndex = buffer.indexOf(new Uint8Array(needle));\n if (audioStartIndex !== -1) {\n const audioChunk = buffer.subarray(audioStartIndex + needle.length);\n this.audio_stream.push(new Uint8Array(audioChunk));\n }\n if (buffer.toString().includes(\"Path:audio.metadata\")) {\n const metadataStart = buffer.indexOf(\"\\r\\n\\r\\n\") + 4;\n const metadataJson = buffer.toString().substring(metadataStart);\n const meta = this.parseMetadata(metadataJson);\n if (meta !== null) {\n this.word_boundaries.push(meta);\n }\n return;\n }\n if (buffer.toString().includes(\"Path:turn.end\")) {\n this.ws?.close();\n }\n }\n parseMetadata(data, offsetCompensation = 0) {\n let metadata;\n try {\n metadata = JSON.parse(data);\n }\n catch {\n return null;\n }\n if (!metadata.Metadata) {\n return null;\n }\n for (const metaObj of metadata.Metadata) {\n if (metaObj.Type === \"WordBoundary\") {\n const currentOffset = metaObj.Data.Offset + offsetCompensation;\n const currentDuration = metaObj.Data.Duration;\n return {\n type: \"WordBoundary\",\n offset: currentOffset,\n duration: currentDuration,\n text: metaObj.Data.text?.Text,\n };\n }\n }\n return null;\n }\n generateSecMsGec = async (trustedClientToken) => {\n const now = this.nowRFC1123();\n const fixedDate = this.parseRFC1123(now);\n const ticks = Math.floor(fixedDate.getTime() / 1000) + 11644473600;\n const rounded = ticks - (ticks % 300);\n const windowsTicks = rounded * 10_000_000;\n const encoder = new TextEncoder();\n const data = encoder.encode(`${windowsTicks}${trustedClientToken}`);\n const hashBuffer = await crypto.subtle.digest('SHA-256', data);\n return Array.from(new Uint8Array(hashBuffer))\n .map(b => b.toString(16).padStart(2, '0'))\n .join('')\n .toUpperCase();\n };\n getDuration() {\n if (this.audio_stream.length === 0) {\n throw new Error(\"No audio data available\");\n }\n // Estimate duration based on the size of the audio stream\n const bufferSize = this.toBuffer().length;\n const estimatedDuration = bufferSize / (24000 * 3); // 24000 Hz sample rate, 3 bytes per sample (16-bit stereo)\n return estimatedDuration;\n }\n getFileExtension(format) {\n if (format.includes('mp3'))\n return 'mp3';\n if (format.includes('opus') && format.includes('webm'))\n return 'webm';\n if (format.includes('opus') && format.includes('ogg'))\n return 'ogg';\n if (format.includes('wav') || format.includes('riff'))\n return 'wav';\n if (format.includes('pcm') && format.includes('raw'))\n return 'pcm';\n if (format.includes('alaw'))\n return 'alaw';\n if (format.includes('mulaw'))\n return 'mulaw';\n if (format.includes('truesilk'))\n return 'silk';\n if (format.includes('g722'))\n return 'g722';\n if (format.includes('amr'))\n return 'amr';\n return 'audio';\n }\n getAudioInfo() {\n const buffer = this.toBuffer();\n return {\n size: buffer.length,\n format: this.getFileExtension(this.output_format),\n estimatedDuration: this.getDuration()\n };\n }\n async toFile(outputPath, format) {\n if (!format) {\n format = this.getFileExtension(this.output_format);\n }\n const audioBuffer = this.toBuffer();\n const finalPath = `${outputPath}.${format}`;\n await (0, promises_1.writeFile)(finalPath, new Uint8Array(audioBuffer));\n return finalPath;\n }\n toRaw() {\n return this.toBase64();\n }\n toBase64() {\n return this.toBuffer().toString('base64');\n }\n toBuffer() {\n if (this.audio_stream.length === 0) {\n throw new Error(\"No audio data available. Did you run synthesize() first?\");\n }\n return buffer_1.Buffer.concat(this.audio_stream);\n }\n async saveMetadata(outputPath) {\n if (this.word_boundaries.length === 0) {\n throw new Error(\"No metadata available to save.\");\n }\n const json = JSON.stringify(this.word_boundaries, null, 4);\n await (0, promises_1.writeFile)(outputPath, json);\n }\n getWordBoundaries() {\n return this.word_boundaries;\n }\n}\nexports.EdgeTTS = EdgeTTS;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Constants = exports.EdgeTTS = void 0;\nvar EdgeTTS_1 = require(\"./services/EdgeTTS\");\nObject.defineProperty(exports, \"EdgeTTS\", { enumerable: true, get: function () { return EdgeTTS_1.EdgeTTS; } });\nvar constants_1 = require(\"./config/constants\");\nObject.defineProperty(exports, \"Constants\", { enumerable: true, get: function () { return constants_1.Constants; } });\n", "import { logInfo } from \"../logger.js\";\nimport { resetAndPrepare } from \"../message-pipeline.js\";\nimport { logAndSwallow } from \"../log-and-swallow.js\";\nimport type { CommandContext, CommandHandler } from \"./types.js\";\n\nconst TAG = \"cmd_registry\";\n\nconst exactCommands: Record<string, CommandHandler> = {};\nconst prefixCommands: Array<{ prefix: string; handler: CommandHandler }> = [];\nconst KNOWN_COMMANDS = new Set<string>();\n\nconst NON_MASTER_COMMANDS = new Set([\"/new\", \"/reset\", \"/stop\", \"/ctrlc\", \"/status\", \"/help\", \"/whoami\"]);\n\nexport function registerExact(name: string, handler: CommandHandler): void {\n exactCommands[name] = handler;\n KNOWN_COMMANDS.add(name);\n}\n\nexport function registerPrefix(prefix: string, handler: CommandHandler): void {\n prefixCommands.push({ prefix, handler });\n KNOWN_COMMANDS.add(prefix.split(\" \")[0]!);\n}\n\n/** Register an additional exact-match command (used by capability system). */\nexport function registerCommand(name: string, handler: CommandHandler): void {\n registerExact(name, handler);\n}\n\n/** Returns true if command was handled. */\nexport async function handleCommand(text: string, ctx: CommandContext): Promise<boolean> {\n const isMaster = !ctx.userId || ctx.userId === \"master\" ||\n (await import(\"../user-registry.js\")).loadUsers().byUserId.get(ctx.userId)?.role === \"master\";\n\n if (!isMaster) {\n const cmd = text.split(/\\s/)[0]!;\n if (cmd.startsWith(\"/\") && !NON_MASTER_COMMANDS.has(cmd)) {\n await ctx.reply(\"\u26D4 Owner-only command.\");\n return true;\n }\n }\n\n const exact = exactCommands[text];\n if (exact) return exact(text, ctx);\n\n for (const { prefix, handler } of prefixCommands) {\n if (text.startsWith(prefix)) return handler(text, ctx);\n }\n\n const firstWord = text.split(/\\s/)[0]!;\n if (text !== firstWord) {\n const byFirstWord = exactCommands[firstWord];\n if (byFirstWord) return byFirstWord(text, ctx);\n }\n\n if (text.startsWith(\"/\") && /^\\/\\w+/.test(text) && !text.startsWith(\"//\")) {\n const cmd = text.split(/\\s/)[0]!;\n if (!KNOWN_COMMANDS.has(cmd)) {\n await ctx.reply(`\u2753 Unknown command: ${cmd}\\nType /help for available commands.`);\n return true;\n }\n }\n\n return false;\n}\n\n/** Core new-session logic \u2014 reusable from model-switch paths. */\nexport async function triggerNewSession(ctx: CommandContext, reason = \"new-session\"): Promise<void> {\n const { hasHooks, fire: fireHook } = await import(\"../hooks/hook-system.js\");\n if (hasHooks(\"SessionEnd\")) {\n await fireHook(\"SessionEnd\", { event: \"SessionEnd\", timestamp: new Date().toISOString(), sessionKey: ctx.sessionKey, platform: ctx.platform, userId: ctx.userId, reason }).catch(err => logAndSwallow(TAG, \"fireHook session\", err));\n }\n await ctx.idleSave.save(ctx.sessionKey, ctx.chatId);\n await resetAndPrepare({\n transport: ctx.transport, sessionKey: ctx.sessionKey,\n reason, sessions: ctx.sessions, conversationBuffer: ctx.conversationBuffer, bufKey: ctx.bufKey,\n });\n if (ctx.memoryConfig.memoryEnabled) ctx.updateCtxStart(ctx.memoryConfig.memoryDir, ctx.userId);\n if (hasHooks(\"SessionStart\")) {\n await fireHook(\"SessionStart\", { event: \"SessionStart\", timestamp: new Date().toISOString(), sessionKey: ctx.sessionKey, platform: ctx.platform, userId: ctx.userId, reason }).catch(err => logAndSwallow(TAG, \"fireHook session\", err));\n }\n}\n\n/** Core reset-session logic \u2014 clears cache, rebuilds transport, resets session. */\nexport async function triggerResetSession(ctx: CommandContext): Promise<void> {\n const { hasHooks, fire: fireHook } = await import(\"../hooks/hook-system.js\");\n if (hasHooks(\"SessionEnd\")) {\n await fireHook(\"SessionEnd\", { event: \"SessionEnd\", timestamp: new Date().toISOString(), sessionKey: ctx.sessionKey, platform: ctx.platform, userId: ctx.userId, reason: \"reset-transport\" }).catch(err => logAndSwallow(TAG, \"fireHook session\", err));\n }\n await ctx.idleSave.save(ctx.sessionKey, ctx.chatId);\n const { clearTransportCache } = await import(\"../transport-config.js\");\n clearTransportCache();\n if (ctx.rebuildTransport) await ctx.rebuildTransport();\n await resetAndPrepare({\n transport: ctx.transport, sessionKey: ctx.sessionKey,\n reason: \"reset-transport\", sessions: ctx.sessions, conversationBuffer: ctx.conversationBuffer, bufKey: ctx.bufKey,\n });\n if (ctx.memoryConfig.memoryEnabled) ctx.updateCtxStart(ctx.memoryConfig.memoryDir, ctx.userId);\n if (hasHooks(\"SessionStart\")) {\n await fireHook(\"SessionStart\", { event: \"SessionStart\", timestamp: new Date().toISOString(), sessionKey: ctx.sessionKey, platform: ctx.platform, userId: ctx.userId, reason: \"reset-transport\" }).catch(err => logAndSwallow(TAG, \"fireHook session\", err));\n }\n}\n\nlet _wakeInhibitPid: number | null = null;\n\n/** Kill the wake inhibitor process (called before hw sleep). */\nexport function killWakeInhibit(): void {\n if (_wakeInhibitPid) {\n try { process.kill(_wakeInhibitPid); } catch (err) { logAndSwallow(\"command_handlers\", \"op\", err); }\n logInfo(\"wakeup\", `Killed wake inhibitor pid=${_wakeInhibitPid}`);\n _wakeInhibitPid = null;\n }\n}\n\nexport function setWakeInhibitPid(pid: number): void {\n _wakeInhibitPid = pid;\n}\n", "/**\n * Shared message-handling pipeline for all platforms.\n * Handles: command dispatch \u2192 sleep check \u2192 prompt build \u2192 transport \u2192\n * streaming \u2192 response delivery \u2192 memory \u2192 auto-compact.\n */\n\nimport { logInfo, logWarn, logError, logDebug } from \"./logger.js\";\nimport { logAndSwallow } from \"./log-and-swallow.js\";\nimport { cleanResponse } from \"./clean-response.js\";\nimport { loadUsers } from \"./user-registry.js\";\nimport { tryReaction } from \"./reactions.js\";\nimport { SessionRegistry } from \"./session-registry.js\";\nimport { ModelNotFoundError } from \"./transport/acp-transport.js\";\nimport type { SttConfig } from \"./stt.js\";\nimport { synthesizeSpeech, type TtsConfig } from \"./tts.js\";\n\n/** Retry a send operation on transient network errors (fetch failed, timeout, 5xx). */\nasync function retrySend<T>(fn: () => Promise<T>, attempts = 3): Promise<T> {\n for (let i = 0; i < attempts; i++) {\n try { return await fn(); }\n catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n const transient = msg.includes(\"fetch failed\") || msg.includes(\"ETIMEDOUT\") || msg.includes(\"ECONNRESET\") || /^5\\d\\d/.test(msg);\n if (!transient || i === attempts - 1) throw err;\n const delay = 1000 * Math.pow(3, i);\n logWarn(\"pipeline\", `Delivery failed (attempt ${i + 1}/${attempts}), retrying in ${delay}ms: ${msg}`);\n await new Promise(r => setTimeout(r, delay));\n }\n }\n throw new Error(\"unreachable\");\n}\nimport type { IKiroTransport } from \"./transport/kiro-transport.js\";\nimport type { MemoryManager } from \"abmind\";\nimport type { IdleSave } from \"./idle-save.js\";\nimport type { ConversationBuffer } from \"./conversation-buffer.js\";\nimport type { RunningJob } from \"./tasks/task-queue.js\";\nimport type { InboundMessage, PlatformAdapter } from \"../types/platform.js\";\nimport { updateBridgeLockField } from \"./transport/bridge-lock-transport.js\";\nimport { createMessageContext, runPipeline, voiceMiddleware, commandMiddleware, busyGuardMiddleware } from \"./pipeline/index.js\";\nimport { hasHooks, fire as fireHook } from \"./hooks/hook-system.js\";\nimport { buildPrompt, buildSessionStartPrompt } from \"./pipeline/prompt-builder.js\";\n\nimport { getEnv } from \"./env-schema.js\";\n\nconst TAG = \"pipeline\";\nconst PRIMING_MAX = 8;\n\nconst STOPWORDS = new Set([\"the\",\"a\",\"an\",\"is\",\"are\",\"was\",\"were\",\"be\",\"been\",\n \"have\",\"has\",\"had\",\"do\",\"does\",\"did\",\"will\",\"would\",\"could\",\"should\",\"can\",\n \"may\",\"might\",\"shall\",\"it\",\"its\",\"this\",\"that\",\"what\",\"how\",\"when\",\"where\",\n \"who\",\"which\",\"why\",\"about\",\"for\",\"with\",\"from\",\"into\",\"just\",\"also\",\"very\",\n \"not\",\"but\",\"and\",\"or\",\"if\",\"so\",\"too\",\"let\",\"lets\",\"dont\",\"you\",\"we\",\n \"my\",\"your\",\"our\",\"me\",\"us\",\"them\",\"they\",\"he\",\"she\"]);\n\nfunction extractKeywords(text: string): string[] {\n return text.toLowerCase()\n .replace(/[^\\p{L}\\p{N}\\s]/gu, \" \")\n .split(/\\s+/)\n .filter(w => w.length >= 3 && !STOPWORDS.has(w))\n .slice(0, 3);\n}\nexport { SessionRegistry } from \"./session-registry.js\";\n/** Reset by bridge-app on inbound message to re-enable floating compaction. */\nexport let resetIdleCompactFlag: (() => void) | null = null;\nexport function setIdleCompactReset(fn: () => void): void { resetIdleCompactFlag = fn; }\n\n/** Shared session reset: reset transport, clear buffer, delete session entry. */\nexport async function resetAndPrepare(opts: {\n transport: IKiroTransport;\n sessionKey: string;\n reason: string;\n sessions: SessionRegistry;\n conversationBuffer?: { clear: (key: string) => void };\n bufKey?: string;\n}): Promise<void> {\n await opts.transport.resetSession(opts.sessionKey);\n if (opts.conversationBuffer && opts.bufKey) opts.conversationBuffer.clear(opts.bufKey);\n opts.sessions.delete(opts.sessionKey);\n opts.sessions.getOrCreate(opts.sessionKey).pendingStart = true;\n // #254: clear emergency mode on reset \u2014 next session starts fresh\n const t = opts.transport as unknown as { setEmergencyMode?: (o: null) => void };\n t.setEmergencyMode?.(null);\n}\n\n/** Transport + agent runtime deps. */\nexport interface TransportDeps {\n transport: IKiroTransport;\n config: { workingDir: string };\n startedAt: number;\n maxContext?: number;\n}\n\n/** Memory system deps. */\nexport interface MemoryDeps {\n memory: MemoryManager | null;\n memoryConfig: { memoryEnabled: boolean; memoryDir: string };\n conversationBuffer: ConversationBuffer;\n idleSave: IdleSave;\n nlmConfig: { enabled: boolean; [k: string]: unknown };\n updateCtxStart: (memoryDir: string, userId: string) => void;\n}\n\n/** Voice processing deps. */\nexport interface VoiceDeps {\n sttConfig: SttConfig | null;\n ttsConfig: TtsConfig | null;\n}\n\n/** Pipeline dependencies \u2014 composed from focused interfaces. */\nexport interface PipelineDeps extends TransportDeps, MemoryDeps, VoiceDeps {\n sessions: SessionRegistry;\n sessionManager: import(\"./session-manager.js\").SessionManager;\n cronCurrentJob?: () => RunningJob | null;\n enqueueCron?: (entryId: string, manual?: boolean) => string | null;\n requestShutdown?: (code?: number) => void;\n sleepProgress?: () => { percent: number; step: string } | null;\n loadedCapabilities?: string[];\n selfHealerTask?: { enabled: boolean } | null;\n hailMary?: { model: string; endpoint: string; apiKey?: string } | null;\n /** Rebuild professor transport in place (used by /reset to pick up provider changes). */\n rebuildTransport?: () => Promise<void>;\n /** Boot-time phase health (#331). */\n phaseHealth?: Map<string, { status: \"ok\" | \"failed\" | \"skipped\"; error?: string }>;\n /** Service registry for live state (#331). */\n registry?: { getStates(): Record<string, import(\"./service-registry.js\").ServiceState> };\n /** bridge.lock path for heartbeat liveness check. */\n bridgeLockPath?: string;\n}\n\n/**\n * Process an inbound message through the full pipeline.\n * The adapter has already handled platform-specific pre-processing\n * (voice transcription, mention stripping, group filtering, security).\n */\nexport async function handleInboundMessage(\n msg: InboundMessage,\n adapter: PlatformAdapter,\n deps: PipelineDeps,\n): Promise<void> {\n // Run early middleware (voice \u2192 commands \u2192 busy guard)\n const ctx = createMessageContext(msg, adapter, deps);\n await runPipeline(ctx, [voiceMiddleware, commandMiddleware, busyGuardMiddleware]);\n if (ctx.handled) return;\n\n // --- BeforeMessage hook ---\n if (hasHooks(\"BeforeMessage\")) {\n const result = await fireHook(\"BeforeMessage\", {\n event: \"BeforeMessage\", timestamp: new Date().toISOString(),\n sessionKey: \"\", platform: msg.platform, userId: msg.userId,\n chatId: String(ctx.chatId), text: ctx.text,\n });\n if (result?.decision === \"block\") {\n logInfo(TAG, `BeforeMessage hook blocked: ${result.reason ?? \"no reason\"}`);\n return;\n }\n }\n\n // --- Core transport/response handling (will become middleware incrementally) ---\n const {\n transport, memory, memoryConfig,\n idleSave, conversationBuffer,\n ttsConfig,\n sessions,\n } = deps;\n\n const { channelId, isVoice } = msg;\n const chatId = ctx.chatId;\n const text = ctx.text;\n\n const registry = loadUsers();\n const userId = msg.userId;\n\n // Resolve active transport session via session manager (#510)\n const activeSessionId = deps.sessionManager.getActiveSessionId(userId, msg.platform);\n\n const busyEntry = sessions.getOrCreate(activeSessionId);\n let typingInterval: ReturnType<typeof setInterval> | undefined;\n let typingTtlTimer: ReturnType<typeof setTimeout> | undefined;\n let toolElapsedTimer: ReturnType<typeof setInterval> | undefined;\n let streamMsgId: number | string | undefined; // tool indicator message (editable)\n try {\n busyEntry.busy = true;\n resetIdleCompactFlag?.(); // re-enable floating compaction on next idle\n const ctxPct = transport.contextPercent;\n logInfo(TAG, `\u2190 [${msg.platform}] ${isVoice ? \"\uD83C\uDFA4 \" : \"\"}\"${text.slice(0, 60)}\"${ctxPct >= 0 ? ` (ctx: ${ctxPct}%)` : \"\"}`);\n // --- Sleep: main transport is available during sleep (sleep uses its own) ---\n // No queueing needed\n\n // --- Build prompt ---\n const { prompt: builtPrompt, imageContent } = await buildPrompt(msg, text, {\n memory, memoryConfig, sessions, sessionManager: deps.sessionManager, conversationBuffer, contextPercent: ctxPct, maxContext: deps.maxContext,\n isAcp: !(\"agentLoop\" in transport),\n }, registry);\n\n if (builtPrompt === \"__INJECTION_BLOCKED__\") {\n await adapter.sendMessage(channelId, \"\u26D4 Message blocked \u2014 suspicious content detected.\", { threadId: msg.threadId });\n return;\n }\n\n let prompt = builtPrompt;\n\n // --- Auto-notify: inject background session completions (#570) ---\n const { drainCompletions } = await import(\"./completion-buffer.js\");\n const completions = drainCompletions(activeSessionId);\n if (completions.length > 0) {\n const notes = completions.map(c => {\n const cost = c.inputTokens + c.outputTokens > 0 ? ` [${((c.inputTokens + c.outputTokens) / 1000).toFixed(1)}k tokens]` : \"\";\n return `[SYSTEM] Background session ${c.sessionId} ${c.status}\\nGoal: ${c.goal}\\nResult: ${c.result}${cost}`;\n }).join(\"\\n\\n\");\n prompt = `${notes}\\n\\n---\\n\\n${prompt}`;\n }\n\n // --- Send to transport ---\n const activeSession = deps.sessionManager.getActiveSession(userId, msg.platform);\n const agentSession = activeSession.agentSession;\n logDebug(TAG, `Route: session=${activeSessionId} type=${activeSession.type} agentSession=${agentSession ? \"yes\" : \"no\"}`);\n\n // #681: attach sandbox policy (owner for now \u2014 peer/guest in #678)\n if (\"sandboxPolicy\" in transport) {\n const { buildPolicy } = await import(\"./tool-sandbox.js\");\n (transport as any).sandboxPolicy = buildPolicy(\"owner\");\n }\n // Wire cooperative pause check (#539) \u2014 agent loop checks this between tool calls\n if (\"isPaused\" in transport) {\n (transport as any).isPaused = () => activeSession.paused;\n }\n\n // Wire /wait steer injection (#655) \u2014 agent loop drains this between tool rounds\n if (\"getPendingInstruction\" in transport) {\n const sessionEntry = deps.sessions.getOrCreate(activeSessionId);\n (transport as any).getPendingInstruction = () => {\n const pending = sessionEntry.pendingWait;\n if (!pending) return undefined;\n sessionEntry.pendingWait = undefined;\n return pending;\n };\n }\n\n const responsePromise = agentSession\n ? agentSession.sendPrompt(activeSessionId, prompt, imageContent)\n : transport.sendPrompt(activeSessionId, prompt, imageContent, userId);\n\n // --- Typing + reaction ---\n if (!isVoice && adapter.setReaction && msg.messageId) {\n await adapter.setReaction(channelId, msg.messageId, \"\uD83D\uDC40\");\n }\n if (adapter.sendTyping) {\n await adapter.sendTyping(channelId, msg.threadId);\n typingInterval = setInterval(() => {\n adapter.sendTyping!(channelId, msg.threadId).catch(err => logAndSwallow(TAG, \"adapter call\", err));\n }, 8000);\n }\n\n // --- Typing TTL ---\n const TYPING_TTL_MS = getEnv().typingTtlMs;\n\n typingTtlTimer = setTimeout(() => {\n if (typingInterval) { clearInterval(typingInterval); typingInterval = undefined; }\n }, TYPING_TTL_MS);\n\n // Per-tool-call progress \u2014 show tool name + elapsed time\n let lastToolNotifyAt = 0;\n let toolBatch: string[] = [];\n let toolBatchTimer: ReturnType<typeof setTimeout> | undefined;\n let currentToolName = \"\";\n let toolStartAt = 0;\n let toolCallCount = 0;\n let totalToolStartAt = 0;\n\n transport.onToolCallStart = (toolName: string) => {\n toolCallCount++;\n if (!totalToolStartAt) totalToolStartAt = Date.now();\n currentToolName = toolName;\n toolStartAt = Date.now();\n adapter.sendTyping?.(channelId, msg.threadId).catch(err => logAndSwallow(TAG, \"adapter call\", err));\n\n // Clear previous elapsed timer\n if (toolElapsedTimer) { clearInterval(toolElapsedTimer); toolElapsedTimer = undefined; }\n\n // Batch tool names within 500ms, emit once\n toolBatch.push(toolName);\n if (!toolBatchTimer) {\n toolBatchTimer = setTimeout(async () => {\n const now = Date.now();\n if (now - lastToolNotifyAt >= 10000) {\n const names = toolBatch.join(\", \");\n const status = `\uD83D\uDD27 ${names}...`;\n if (streamMsgId && adapter.editMessage) {\n adapter.editMessage(channelId, streamMsgId, status + \"...\").catch(err => logAndSwallow(TAG, \"adapter call\", err));\n } else {\n const id = await adapter.sendMessage(channelId, status, { threadId: msg.threadId }).catch(err => { logAndSwallow(TAG, \"sendMessage tool status\", err); return undefined; });\n if (id && adapter.editMessage) streamMsgId = id;\n }\n lastToolNotifyAt = now;\n }\n toolBatch = [];\n toolBatchTimer = undefined;\n }, 500);\n }\n\n // Start elapsed timer \u2014 update every 10s during long tool execution\n toolElapsedTimer = setInterval(() => {\n const elapsed = Math.round((Date.now() - toolStartAt) / 1000);\n const elapsedStr = elapsed >= 60 ? `${Math.floor(elapsed / 60)}m${elapsed % 60}s` : `${elapsed}s`;\n const status = `\uD83D\uDD27 ${currentToolName} (${elapsedStr})...`;\n if (streamMsgId && adapter.editMessage) {\n adapter.editMessage(channelId, streamMsgId, status + \"...\").catch(err => logAndSwallow(TAG, \"adapter call\", err));\n }\n }, 10_000);\n };\n\n // --- Fallback notification inline ---\n if (\"onFallback\" in transport) {\n const prev = (transport as any).onFallback;\n (transport as any).onFallback = (model: string, _ctxPct: number, reason?: string) => {\n prev?.(model, _ctxPct, reason);\n };\n }\n\n // --- Segment break: deliver pre-tool text immediately ---\n let fullResponseSegments: string[] = [];\n transport.onSegmentBreak = (text: string) => {\n fullResponseSegments.push(text);\n if (streamMsgId && adapter.editMessage) {\n adapter.editMessage(channelId, streamMsgId, text).catch(err => logAndSwallow(TAG, \"adapter call\", err));\n } else if (text) {\n adapter.sendMessage(channelId, text, { threadId: msg.threadId }).catch(err => logAndSwallow(TAG, \"adapter call\", err));\n }\n streamMsgId = undefined;\n };\n\n // --- Tool/segment state (used by tool indicators + segment breaks above) ---\n // No edit-in-place streaming timer. Final response delivered as chunks after completion (#583).\n\n const response = await responsePromise;\n\n clearTimeout(toolBatchTimer);\n transport.onIntermediateResponse = undefined;\n logDebug(TAG, `Response (${response.length} chars): \"${response.trim().slice(0, 120)}\"`);\n\n // --- Extract clean answer ---\n const cleanAnswer = transport.answerOnly;\n const rawResponse = sessions.get(activeSessionId)?.fullMode ? response : (cleanAnswer || response);\n const { text: cleanedText, reactionEmoji, noReply, topics } = cleanResponse(rawResponse);\n let userResponse = cleanedText;\n\n // --- Secret redaction (belt-and-suspenders for #436) ---\n for (const [key, val] of Object.entries(process.env)) {\n if (key.startsWith(\"SECRET_\") && val && userResponse.includes(val)) {\n userResponse = userResponse.replaceAll(val, `[REDACTED:$${key}]`);\n logWarn(TAG, `Redacted leaked secret $${key} from response`);\n }\n }\n\n // --- Empty response ---\n if (!userResponse) {\n if (noReply) {\n logDebug(TAG, \"LLM returned [NO_REPLY], dropping silently\");\n return;\n }\n if (reactionEmoji) {\n if (adapter.setReaction && msg.messageId) {\n try { await adapter.setReaction(channelId, msg.messageId, reactionEmoji); }\n catch { await adapter.sendMessage(channelId, reactionEmoji, { threadId: msg.threadId }); }\n } else {\n await adapter.sendMessage(channelId, reactionEmoji, { threadId: msg.threadId });\n }\n return;\n }\n if (transport.toolCallsSucceeded > 0) {\n logDebug(TAG, `Empty text but ${transport.toolCallsSucceeded} tool call(s) succeeded \u2014 suppressing fallback`);\n if (adapter.setReaction && msg.messageId) await adapter.setReaction(channelId, msg.messageId, \"\").catch(err => logAndSwallow(TAG, \"adapter call\", err));\n } else {\n logWarn(TAG, \"Empty response from transport\");\n if (adapter.setReaction && msg.messageId) await adapter.setReaction(channelId, msg.messageId, \"\uD83E\uDD37\");\n await adapter.sendMessage(channelId, \"\uD83E\uDD37 Model returned an empty response. Try again or /reset.\", { threadId: msg.threadId });\n }\n return;\n }\n\n // --- Clear \uD83D\uDC40 reaction ---\n if (adapter.setReaction && msg.messageId) {\n await adapter.setReaction(channelId, msg.messageId, \"\").catch(err => logAndSwallow(TAG, \"adapter call\", err));\n }\n\n // --- Standalone emoji \u2192 try reaction, fallback to message ---\n const trimmed = userResponse.trim();\n const isEmojiOnly = /^[\\p{Emoji_Presentation}\\p{Extended_Pictographic}]{1,2}$/u.test(trimmed);\n if (isEmojiOnly) {\n await tryReaction(adapter, channelId, msg.messageId, trimmed, msg.threadId);\n return;\n }\n\n // --- Deliver response \u2014 always chunk and send (#583) ---\n let lastSentMsgId: number | string | undefined;\n const chunks = adapter.chunkResponse(userResponse);\n logDebug(TAG, `Sending ${chunks.length} chunk(s)`);\n for (const chunk of chunks) {\n // #652: defense-in-depth \u2014 strip leaked metadata tags before delivery\n const clean = chunk.replace(/\\[TOPICS:\\s*.+?\\]/gi, \"\").replace(/\\[REACT:.+?\\]/gi, \"\").trim();\n if (clean) {\n await adapter.sendTyping?.(channelId, msg.threadId);\n lastSentMsgId = await retrySend(() => adapter.sendMessage(channelId, clean, { threadId: msg.threadId }));\n }\n }\n\n // --- Send reaction emoji as separate message (if extracted by cleanResponse) ---\n if (reactionEmoji) {\n if (adapter.setReaction && msg.messageId) {\n try { await adapter.setReaction(channelId, msg.messageId, reactionEmoji); }\n catch { await adapter.sendMessage(channelId, reactionEmoji, { threadId: msg.threadId }); }\n } else {\n await adapter.sendMessage(channelId, reactionEmoji, { threadId: msg.threadId });\n }\n }\n\n // --- Update priming buffer ---\n if (getEnv().activeMemory) {\n const modelTopics = getEnv().primingModelTopics && topics ? topics : [];\n const regexKw = extractKeywords(text);\n const existing = sessions.get(activeSessionId)?.primingTerms ?? [];\n sessions.getOrCreate(activeSessionId).primingTerms = [...new Set([...modelTopics, ...regexKw, ...existing])].slice(0, PRIMING_MAX);\n }\n\n // --- Record to memory (skip for guests) ---\n const isGuest = registry.byUserId.get(userId)?.role === \"guest\";\n if (memory && !isGuest) {\n memory.recordMessage({\n role: \"assistant\", content: cleanAnswer || response,\n timestamp: Date.now(), userId, sessionId: activeSessionId,\n platformMessageId: typeof lastSentMsgId === \"number\" ? lastSentMsgId : undefined,\n });\n }\n\n // --- TTS for voice notes ---\n if (isVoice && ttsConfig && !sessions.get(activeSessionId)?.fullMode && adapter.sendVoice) {\n try {\n await adapter.sendTyping?.(channelId, msg.threadId);\n const audio = await synthesizeSpeech(cleanAnswer || response, ttsConfig);\n if (audio) {\n await adapter.sendVoice(channelId, audio, { threadId: msg.threadId });\n logInfo(TAG, `\uD83D\uDD0A Voice reply sent (${audio.length} bytes)`);\n }\n } catch (err) {\n logWarn(TAG, `TTS failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n // --- Clear reaction ---\n if (adapter.setReaction && msg.messageId) {\n await adapter.setReaction(channelId, msg.messageId, \"\");\n }\n\n const ctxAfter = transport.contextPercent;\n logInfo(TAG, `\u2192 [${msg.platform}] Response delivered${ctxAfter >= 0 ? ` (ctx: ${ctxAfter}%)` : \"\"}`);\n updateBridgeLockField(\"lastPromptAt\", Date.now());\n\n // --- AfterMessage hook ---\n if (hasHooks(\"AfterMessage\")) {\n fireHook(\"AfterMessage\", {\n event: \"AfterMessage\", timestamp: new Date().toISOString(),\n sessionKey: activeSessionId, platform: msg.platform, userId,\n chatId: String(chatId), text: text,\n response: userResponse, model: (\"currentModel\" in transport ? String((transport as Record<string, unknown>).currentModel) : \"unknown\"), success: true,\n }).catch(err => logAndSwallow(TAG, \"adapter call\", err));\n }\n } catch (err) {\n // #287: model not found \u2014 surface actionable message to user\n if (err instanceof ModelNotFoundError) {\n logWarn(TAG, `Model not found for ${activeSessionId}: ${err.message}`);\n await adapter.sendMessage(channelId, `\u274C ${err.message}\\nUse /model to switch.`, { threadId: msg.threadId });\n } else {\n logError(TAG, `Error for ${activeSessionId} \u2014 ${err instanceof Error ? err.message : JSON.stringify(err)}`);\n }\n if (adapter.setReaction && msg.messageId) {\n await adapter.setReaction(channelId, msg.messageId, \"\").catch(err => logAndSwallow(TAG, \"adapter call\", err));\n }\n\n // AfterMessage hook on error\n if (hasHooks(\"AfterMessage\")) {\n fireHook(\"AfterMessage\", {\n event: \"AfterMessage\", timestamp: new Date().toISOString(),\n sessionKey: activeSessionId, platform: msg.platform, userId,\n chatId: String(chatId), text: text, success: false,\n error: err instanceof Error ? err.message : String(err),\n }).catch(err => logAndSwallow(TAG, \"adapter call\", err));\n }\n\n // Auto-reset on context window overflow (ValidationException or actual context errors)\n const errStr = String(err instanceof Error ? err.message : JSON.stringify(err));\n const isContextOverflow = errStr.includes(\"ValidationException\")\n || (errStr.includes(\"context window\") || errStr.includes(\"token limit\") || errStr.includes(\"maximum context\"));\n const isTimeout = errStr.includes(\"timed out\") || errStr.includes(\"Prompt already in progress\");\n\n if (isContextOverflow) {\n logWarn(TAG, `Context overflow detected \u2014 auto-resetting session`);\n await resetAndPrepare({ transport, sessionKey: activeSessionId, reason: `ctx-overflow: ${errStr.slice(0, 100)}`, sessions });\n await adapter.sendMessage(channelId, \"\uD83D\uDD04 Context window full \u2014 session reset. Send your message again.\", { threadId: msg.threadId }).catch(err => logAndSwallow(TAG, \"adapter call\", err));\n } else if (isTimeout) {\n logWarn(TAG, `Request timeout \u2014 not resetting session`);\n await adapter.sendMessage(channelId, \"\u274C Model timed out.\", { threadId: msg.threadId }).catch(err => logAndSwallow(TAG, \"adapter call\", err));\n } else {\n const reason = errStr.includes(\"rate\") || errStr.includes(\"429\") ? \"Rate limited.\"\n : errStr.includes(\"auth\") || errStr.includes(\"401\") || errStr.includes(\"403\") ? \"Authentication failed.\"\n : errStr.includes(\"connect\") || errStr.includes(\"ECONNREFUSED\") ? \"Connection lost.\"\n : errStr.includes(\"exhausted\") || errStr.includes(\"no candidates\") ? \"All models exhausted.\"\n : \"Something went wrong.\";\n await adapter.sendMessage(channelId, `\u274C ${reason}`, { threadId: msg.threadId }).catch(err => logAndSwallow(TAG, \"adapter call\", err));\n }\n } finally {\n clearInterval(typingInterval);\n clearTimeout(typingTtlTimer);\n if (toolElapsedTimer) clearInterval(toolElapsedTimer);\n transport.onToolCallStart = undefined;\n transport.onSegmentBreak = undefined;\n busyEntry.busy = false;\n idleSave.reset(activeSessionId, chatId);\n\n // Drain queued messages\n const entry = sessions.get(activeSessionId);\n if (entry?.queue.length) {\n const next = entry.queue.shift()!;\n logInfo(TAG, `Draining queued message for ${activeSessionId} (${entry.queue.length} remaining)`);\n handleInboundMessage(next.msg, next.adapter, deps).catch(e => logError(TAG, \"Queue drain error\", e));\n }\n }\n}\n\n/** Build session-start prompt with SOUL + context + greeting, send to transport, push response to adapter. */\nexport async function startSession(\n transport: IKiroTransport,\n memory: MemoryManager,\n userId: string,\n sessionKey: string,\n greeting: string,\n sendResponse: (text: string) => Promise<unknown>,\n): Promise<void> {\n const prompt = buildSessionStartPrompt(greeting, memory, userId, sessionKey);\n logInfo(TAG, `Session start for ${sessionKey} \u2014 prompt ${prompt.length} chars`);\n const response = await transport.sendPrompt(sessionKey, prompt, undefined, userId);\n if (response?.trim() && response.trim() !== \"[NO_REPLY]\" && response.trim() !== \"(no response)\") {\n await sendResponse(response);\n }\n}\n\n\n", "/**\n * Strip LLM response tags and echoed internal context from responses.\n * Single source of truth \u2014 used by message pipeline, startup greeting, and any other response path.\n */\n\nconst REACT_RE = /\\[REACT:(.+?)\\]/;\nconst NO_REPLY_RE = /\\s*\\[NO[-_]REPLY\\]\\s*/gi;\nconst LANG_TAG_RE = /^\\[lang:\\w{2}\\]\\s*/i;\nconst TOPICS_RE = /\\[TOPICS:\\s*(.+?)\\]/i;\n\n// Internal context markers \u2014 strip if model echoes them back\nconst CONTEXT_BLOCK_RE = /\\[CONTEXT[^\\]]*\\][\\s\\S]*?\\[\\/CONTEXT\\]/gi;\nconst MEMORY_BLOCK_RE = /\\[MEMORY CONTEXT[^\\]]*\\][\\s\\S]*?\\[\\/MEMORY CONTEXT\\]/gi;\nconst COMPACT_BLOCK_RE = /\\[COMPACTED CONVERSATION\\][\\s\\S]*?\\[\\/COMPACTED CONVERSATION\\]/gi;\nconst SESSION_REASON_RE = /\\[SESSION START REASON\\][^\\n]*/gi;\nconst CURRENT_USER_RE = /\\[CURRENT USER\\][^\\[]*/gi;\nconst FLASHBACK_RE = /\\[Flashback\\][^\\n]*/gi;\nconst CURRENT_TIME_RE = /\\[Current time:[^\\]]*\\]/gi;\n\nexport interface CleanedResponse {\n /** Text with all tags stripped. May be empty. */\n text: string;\n /** Emoji extracted from [REACT:emoji], if present. */\n reactionEmoji?: string;\n /** True if [NO_REPLY] was present in the original. */\n noReply: boolean;\n /** Keywords extracted from [TOPICS: kw1, kw2, kw3], if present. */\n topics?: string[];\n}\n\n/** Strip known LLM tags and echoed internal context from a response string. */\nexport function cleanResponse(raw: string): CleanedResponse {\n const noReply = NO_REPLY_RE.test(raw);\n NO_REPLY_RE.lastIndex = 0;\n let text = raw.replace(NO_REPLY_RE, \"\").replace(LANG_TAG_RE, \"\").trim();\n\n // Extract structured tags before stripping\n let reactionEmoji: string | undefined;\n let topics: string[] | undefined;\n const reactMatch = text.match(REACT_RE);\n if (reactMatch) {\n reactionEmoji = reactMatch[1]!;\n text = text.replace(reactMatch[0], \"\").trim();\n }\n const topicsMatch = text.match(TOPICS_RE);\n if (topicsMatch) {\n topics = topicsMatch[1]!.split(\",\").map(t => t.trim().toLowerCase()).filter(t => t.length >= 2);\n text = text.replace(topicsMatch[0], \"\").trim();\n }\n\n // Strip echoed internal context \u2014 model should never output these\n text = text\n .replace(CONTEXT_BLOCK_RE, \"\")\n .replace(MEMORY_BLOCK_RE, \"\")\n .replace(COMPACT_BLOCK_RE, \"\")\n .replace(SESSION_REASON_RE, \"\")\n .replace(CURRENT_USER_RE, \"\")\n .replace(FLASHBACK_RE, \"\")\n .replace(CURRENT_TIME_RE, \"\")\n .replace(/\\n{3,}/g, \"\\n\\n\")\n .trim();\n\n return { text, reactionEmoji, noReply, topics };\n}\n", "/**\n * reactions.ts \u2014 Unified reaction handling.\n * Merged from: reaction-router.ts, reaction-signal.ts, reaction-handler.ts.\n * Allowed list, fallback map, routing, formatting, API call + text fallback.\n */\n\nimport { logAndSwallow } from \"./log-and-swallow.js\";\nimport type { PlatformAdapter, Platform } from \"../types/index.js\";\nimport { logDebug } from \"./logger.js\";\n\nconst TAG = \"reaction\";\n\n// \u2500\u2500 Telegram allowed reactions (API rejects anything not in this set) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport const TELEGRAM_ALLOWED_REACTIONS = new Set([\n \"\uD83D\uDC4D\",\"\uD83D\uDC4E\",\"\u2764\",\"\uD83D\uDD25\",\"\uD83E\uDD70\",\"\uD83D\uDC4F\",\"\uD83D\uDE01\",\"\uD83E\uDD14\",\"\uD83E\uDD2F\",\"\uD83D\uDE31\",\"\uD83E\uDD2C\",\"\uD83D\uDE22\",\"\uD83C\uDF89\",\"\uD83E\uDD29\",\"\uD83E\uDD2E\",\"\uD83D\uDCA9\",\n \"\uD83D\uDE4F\",\"\uD83D\uDC4C\",\"\uD83D\uDD4A\",\"\uD83E\uDD21\",\"\uD83E\uDD71\",\"\uD83E\uDD74\",\"\uD83D\uDE0D\",\"\uD83D\uDC33\",\"\u2764\uD83D\uDD25\",\"\uD83C\uDF1A\",\"\uD83C\uDF2D\",\"\uD83D\uDCAF\",\"\uD83E\uDD23\",\"\u26A1\",\"\uD83C\uDF4C\",\n \"\uD83C\uDFC6\",\"\uD83D\uDC94\",\"\uD83E\uDD28\",\"\uD83D\uDE10\",\"\uD83C\uDF53\",\"\uD83C\uDF7E\",\"\uD83D\uDC8B\",\"\uD83D\uDD95\",\"\uD83D\uDE08\",\"\uD83D\uDE34\",\"\uD83D\uDE2D\",\"\uD83E\uDD13\",\"\uD83D\uDC7B\",\"\uD83D\uDC68\uD83D\uDCBB\",\"\uD83D\uDC40\",\n \"\uD83C\uDF83\",\"\uD83D\uDE48\",\"\uD83D\uDE07\",\"\uD83D\uDE28\",\"\uD83E\uDD1D\",\"\u270D\",\"\uD83E\uDD17\",\"\uD83E\uDEE1\",\"\uD83C\uDF85\",\"\uD83C\uDF84\",\"\u2603\",\"\uD83D\uDC85\",\"\uD83E\uDD2A\",\"\uD83D\uDDFF\",\"\uD83C\uDD92\",\n \"\uD83D\uDC98\",\"\uD83D\uDE49\",\"\uD83E\uDD84\",\"\uD83D\uDE18\",\"\uD83D\uDC8A\",\"\uD83D\uDE4A\",\"\uD83D\uDE0E\",\"\uD83D\uDC7E\",\"\uD83E\uDD37\u2642\",\"\uD83E\uDD37\",\"\uD83E\uDD37\u2640\",\"\uD83D\uDE21\",\n]);\n\nexport const REACTION_FALLBACK_MAP: Record<string, string> = {\n \"\uD83D\uDE05\": \"\uD83E\uDD23\", \"\uD83D\uDE02\": \"\uD83E\uDD23\", \"\uD83D\uDE06\": \"\uD83D\uDE01\", \"\uD83D\uDE04\": \"\uD83D\uDE01\", \"\uD83D\uDE03\": \"\uD83D\uDE01\",\n \"\uD83D\uDE42\": \"\uD83D\uDE01\", \"\uD83D\uDE0A\": \"\uD83D\uDE01\", \"\u263A\": \"\uD83D\uDE01\", \"\uD83D\uDE09\": \"\uD83D\uDE01\", \"\uD83E\uDEE0\": \"\uD83E\uDD2A\",\n \"\uD83D\uDE1E\": \"\uD83D\uDE22\", \"\uD83D\uDE14\": \"\uD83D\uDE22\", \"\uD83D\uDE1F\": \"\uD83D\uDE22\", \"\uD83D\uDE15\": \"\uD83E\uDD14\", \"\uD83E\uDEE4\": \"\uD83E\uDD28\",\n \"\uD83D\uDE24\": \"\uD83D\uDE21\", \"\uD83D\uDE20\": \"\uD83D\uDE21\", \"\uD83D\uDCAA\": \"\uD83D\uDC4F\", \"\uD83E\uDD1E\": \"\uD83D\uDE4F\", \"\u2705\": \"\uD83D\uDC4D\",\n \"\u274C\": \"\uD83D\uDC4E\", \"\uD83D\uDE2C\": \"\uD83D\uDE48\", \"\uD83E\uDEE3\": \"\uD83D\uDE48\", \"\uD83E\uDD2D\": \"\uD83D\uDE4A\", \"\uD83D\uDC80\": \"\uD83D\uDC7B\",\n};\n\n// \u2500\u2500 Routing \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 ReactionRouteResult = \"transport\" | \"buffer\" | \"discard\";\n\nexport function routeReaction(isAuthorized: boolean, chatType: string): ReactionRouteResult {\n if (!isAuthorized) return \"discard\";\n if (chatType === \"group\" || chatType === \"supergroup\") return \"buffer\";\n return \"transport\";\n}\n\n// \u2500\u2500 Formatting \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 formatReactionSignal(senderName: string, emojis: string[]): string {\n return `[${senderName} reaction: ${emojis.join(\" \")}]`;\n}\n\n// \u2500\u2500 Try reaction (platform-aware) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Try to set an emoji reaction on a message. Platform-aware:\n * - Telegram: checks allowed list + fallback map, falls back to text.\n * - Discord: passes any emoji through directly (accepts all Unicode).\n * - No setReaction API: sends emoji as text message.\n */\nexport async function tryReaction(\n adapter: PlatformAdapter,\n channelId: string,\n messageId: number | string | undefined,\n emoji: string,\n threadId?: string,\n platform?: Platform,\n): Promise<boolean> {\n if (!adapter.setReaction || !messageId) {\n await adapter.sendMessage(channelId, emoji, { threadId });\n logDebug(TAG, `No reaction API \u2014 sent ${emoji} as text`);\n return true;\n }\n\n // Discord: any emoji works, pass through directly\n if (platform && platform !== \"telegram\") {\n try {\n await adapter.setReaction(channelId, messageId, emoji);\n logDebug(TAG, `Reaction: ${emoji}`);\n return true;\n } catch {\n await adapter.sendMessage(channelId, emoji, { threadId });\n return true;\n }\n }\n\n // Telegram: check allowed list + fallback map\n const fallback = TELEGRAM_ALLOWED_REACTIONS.has(emoji) ? emoji : (REACTION_FALLBACK_MAP[emoji] ?? null);\n if (fallback) {\n try {\n await adapter.setReaction(channelId, messageId, fallback);\n logDebug(TAG, `Reaction: ${emoji}${emoji !== fallback ? ` \u2192 ${fallback}` : \"\"}`);\n return true;\n } catch (err) { logAndSwallow(\"reactions\", \"op\", err); }\n }\n\n await adapter.sendMessage(channelId, emoji, { threadId });\n logDebug(TAG, `Reaction ${emoji} not supported \u2014 sent as text`);\n return true;\n}\n", "import { EdgeTTS, Constants } from \"@andresaya/edge-tts\";\nimport { logInfo, logDebug, logWarn } from \"./logger.js\";\n\nexport interface TtsConfig {\n voice: string;\n voiceMap?: Record<string, string>; // lang code \u2192 voice name\n}\n\nconst MAX_TTS_CHARS = 4000;\n\nconst DEFAULT_VOICE_MAP: Record<string, string> = {\n hu: \"hu-HU-TamasNeural\",\n en: \"en-US-AndrewMultilingualNeural\",\n};\n\n/** Extract [lang:xx] tag from text, return { lang, text } */\nexport function extractLangTag(text: string): { lang: string | null; text: string } {\n const m = text.match(/^\\[lang:(\\w{2})\\]\\s*/i);\n if (m) return { lang: m[1]!.toLowerCase(), text: text.slice(m[0].length) };\n return { lang: null, text };\n}\n\n/**\n * Synthesize text to OGG Opus audio buffer using Microsoft Edge TTS.\n * Returns null if synthesis fails or text is too short/empty.\n */\nexport async function synthesizeSpeech(\n text: string,\n config: TtsConfig,\n): Promise<Buffer | null> {\n const { lang, text: stripped } = extractLangTag(text);\n const cleaned = cleanForTts(stripped).trim();\n if (!cleaned || cleaned.length < 5) {\n logDebug(\"tts\", `Text too short for TTS (${cleaned.length} chars)`);\n return null;\n }\n\n const voiceMap = { ...DEFAULT_VOICE_MAP, ...config.voiceMap };\n const voice = (lang && voiceMap[lang]) || config.voice;\n\n // Truncate very long responses\n const input = cleaned.length > MAX_TTS_CHARS\n ? cleaned.slice(0, MAX_TTS_CHARS) + \"... (truncated)\"\n : cleaned;\n\n logInfo(\"tts\", `Synthesizing ${input.length} chars with voice ${voice}${lang ? ` (lang:${lang})` : \"\"}`);\n\n try {\n const tts = new EdgeTTS();\n await tts.synthesize(input, voice, {\n rate: \"+0%\",\n pitch: \"+0Hz\",\n outputFormat: Constants.OUTPUT_FORMAT.WEBM_24KHZ_16BIT_MONO_OPUS,\n });\n const audioBuffer = tts.toBuffer();\n\n if (!audioBuffer || audioBuffer.length === 0) {\n logWarn(\"tts\", \"Edge TTS returned empty audio\");\n return null;\n }\n\n logInfo(\"tts\", `Audio generated: ${audioBuffer.length} bytes`);\n return audioBuffer;\n } catch (err) {\n logWarn(\"tts\", `TTS synthesis failed: ${err instanceof Error ? err.message : String(err)}`);\n return null;\n }\n}\n\n/** Strip reasoning, tool noise, HTML tags, markdown, and emojis for cleaner TTS output. */\nexport function cleanForTts(text: string): string {\n let result = text\n // --- HTML tags ---\n .replace(/<br\\s*\\/?>/gi, \"\\n\") // <br> \u2192 newline\n .replace(/<[^>]+>/g, \"\") // strip all HTML tags\n // --- Kiro reasoning / tool noise (line-level) ---\n .replace(/^.*\\(using tool:\\s*\\w+\\).*$/gm, \"\") // \"... (using tool: web_search)\"\n .replace(/^.*\\[mode:.*$/gm, \"\") // \"[mode:...\" truncated tool lines\n .replace(/^(Fetching content from|Searching the web|Searching for|Reading file|Writing to|Running command|Executing|Looking at|Checking).*$/gm, \"\")\n .replace(/^(Let me|I'll|I will|I need to|I'm going to|I should)\\b.*$/gm, \"\")\n .replace(/^- Completed in \\d+(\\.\\d+)?s.*$/gm, \"\") // \"- Completed in 0.0s\"\n .replace(/^WARNING:.*$/gm, \"\") // \"WARNING: Retry #2, retrying within...\"\n .replace(/^https?:\\/\\/\\S+$/gm, \"\") // URL-only lines\n .replace(/^\\s*\\[.*?\\]\\s*$/gm, \"\") // [tool output] lines\n // --- Markdown ---\n .replace(/```[\\s\\S]*?```/g, \" (code block omitted) \") // code blocks\n .replace(/`[^`]+`/g, \"\") // inline code\n .replace(/\\[([^\\]]+)\\]\\([^)]+\\)/g, \"$1\") // links \u2192 text\n .replace(/[*_~]{1,3}/g, \"\") // bold/italic/strike\n .replace(/^#{1,6}\\s+/gm, \"\") // headings\n .replace(/^[-*+]\\s+/gm, \"\") // list markers\n .replace(/^\\d+\\.\\s+/gm, \"\"); // numbered lists\n\n // --- Emoji filtering ---\n try {\n result = result.replace(/\\p{Extended_Pictographic}/gu, \"\");\n } catch (err) {\n logWarn(\"tts\", `Emoji filter failed, using unfiltered text: ${err instanceof Error ? err.message : String(err)}`);\n }\n\n // --- Cleanup ---\n return result\n .replace(/\\n{3,}/g, \"\\n\\n\") // excess newlines\n .trim();\n}\n\n", "/**\n * sanitize-outbound.ts \u2014 Strip internal tags before delivering to user.\n */\nconst STRIP = [\n /\\s*\\[TOPICS:\\s*.+?\\]/gi,\n /\\s*\\[NO_REPLY\\]\\s*/gi,\n /\\s*\\[REACT:.+?\\]\\s*/gi,\n];\n\nexport function sanitizeOutbound(text: string): string {\n let out = text;\n for (const re of STRIP) { re.lastIndex = 0; out = out.replace(re, \"\"); }\n return out.trim();\n}\n", "/**\n * Message pipeline middleware system.\n *\n * Each middleware receives a MessageContext and a next() function.\n * Call next() to continue the pipeline, or return early to short-circuit.\n * Middleware can modify ctx before/after calling next().\n */\n\nimport type { PlatformAdapter, InboundMessage } from \"../../types/platform.js\";\nimport type { PipelineDeps } from \"../message-pipeline.js\";\nimport type { Reply } from \"../commands/types.js\";\nimport { sanitizeOutbound } from \"../sanitize-outbound.js\";\n\n/** Mutable context flowing through the middleware pipeline. */\nexport interface MessageContext {\n readonly msg: InboundMessage;\n readonly adapter: PlatformAdapter;\n readonly deps: PipelineDeps;\n /** Current text (may be modified by voice transcription). */\n text: string;\n /** Chat ID parsed from channelId. */\n readonly chatId: number;\n /** User ID resolved from user registry. */\n readonly userId: string;\n /** Reply helper bound to the message's channel/thread. */\n readonly reply: Reply;\n /** Set to true by any middleware that fully handled the message. */\n handled: boolean;\n /** Set to true when a specific deferred-command reply has fired \u2014 busy-guard skips its generic queue notification. */\n deferReply?: boolean;\n /** Response from transport (set by transport middleware). */\n response?: string;\n /** Clean answer extracted from response. */\n cleanAnswer?: string;\n /** ID of the last sent message (for reactions, memory recording). */\n lastSentMsgId?: number;\n /** Whether intermediate streaming already delivered content. */\n intermediateDelivered?: boolean;\n /** ID of the streaming message (for edit-in-place). */\n streamMsgId?: number;\n}\n\n/** A middleware function in the message pipeline. */\nexport type Middleware = (ctx: MessageContext, next: () => Promise<void>) => Promise<void>;\n\n/** Run a list of middleware in order. Each calls next() to continue. */\nexport async function runPipeline(ctx: MessageContext, middlewares: readonly Middleware[]): Promise<void> {\n let index = 0;\n const next = async (): Promise<void> => {\n if (ctx.handled || index >= middlewares.length) return;\n const mw = middlewares[index++]!;\n await mw(ctx, next);\n };\n await next();\n}\n\n/** Create a MessageContext from an inbound message. */\nexport function createMessageContext(\n msg: InboundMessage,\n adapter: PlatformAdapter,\n deps: PipelineDeps,\n): MessageContext {\n const reply: Reply = (text, opts) => {\n const clean = sanitizeOutbound(text);\n if (!clean) return Promise.resolve(undefined);\n return adapter.sendMessage(msg.channelId, clean, { threadId: msg.threadId, ...opts });\n };\n const chatId = parseInt(msg.channelId, 10) || 0;\n const userId = msg.userId;\n return {\n msg,\n adapter,\n deps,\n text: msg.text,\n chatId,\n userId,\n reply,\n handled: false,\n };\n}\n", "/**\n * Voice transcription middleware \u2014 converts voice notes to text.\n */\n\nimport type { Middleware } from \"./middleware.js\";\nimport { transcribeAudio } from \"../stt.js\";\nimport { logError } from \"../logger.js\";\n\nexport const voiceMiddleware: Middleware = async (ctx, next) => {\n const { msg, adapter, deps } = ctx;\n\n if (msg.isVoice && msg.voiceFileId && adapter.downloadVoice && deps.sttConfig) {\n try {\n if (adapter.setReaction && msg.messageId) {\n await adapter.setReaction(msg.channelId, msg.messageId, \"\uD83D\uDC40\");\n }\n const audioBuffer = await adapter.downloadVoice(msg.voiceFileId);\n const { text: transcript, language } = await transcribeAudio(audioBuffer, \"voice.ogg\", deps.sttConfig);\n if (!transcript) {\n if (adapter.setReaction && msg.messageId) await adapter.setReaction(msg.channelId, msg.messageId, \"\");\n await ctx.reply(\"\uD83E\uDD37 Couldn't transcribe the voice note.\");\n ctx.handled = true;\n return;\n }\n const langTag = language ? `, ${language}` : \"\";\n ctx.text = `[\uD83C\uDFA4 voice${langTag}] ${transcript}`;\n } catch (err) {\n logError(\"voice-mw\", \"Voice transcription failed\", err);\n if (adapter.setReaction && msg.messageId) await adapter.setReaction(msg.channelId, msg.messageId, \"\");\n await ctx.reply(\"\u274C Voice transcription failed.\");\n ctx.handled = true;\n return;\n }\n } else if (msg.isVoice && !deps.sttConfig) {\n await ctx.reply(\"\uD83C\uDFA4 Voice notes require STT (set GROQ_API_KEY).\");\n ctx.handled = true;\n return;\n }\n\n await next();\n};\n", "/**\n * Command middleware \u2014 handles slash commands and transport commands.\n *\n * Interrupt commands (/stop, /new, /reset, /restart) run immediately even when busy.\n * All other commands defer to the busy guard when the chat is busy.\n * Non-master: leading bangs stripped (#157), injection scanned pre-sendPrompt.\n */\n\nimport type { Middleware } from \"./middleware.js\";\nimport { handleCommand } from \"../commands/index.js\";\nimport type { CommandContext } from \"../commands/types.js\";\nimport { logInfo } from \"../logger.js\";\nimport { loadUsers } from \"../user-registry.js\";\n\nconst BANG_PREFIX = /^[!\uFF01\u01C3\u2757\u2755\u203C\u2049]+/u;\n\nconst INTERRUPT_COMMANDS = new Set([\"/stop\", \"/ctrlc\", \"/new\", \"/reset\", \"/restart\"]);\nconst DESTRUCTIVE_COMMANDS = new Set([\"/stop\", \"/ctrlc\", \"/new\", \"/reset\", \"/restart\", \"/compact\", \"/coding\", \"/default\"]);\n\nexport const commandMiddleware: Middleware = async (ctx, next) => {\n const { msg, deps } = ctx;\n const { transport, config, startedAt, memory, memoryConfig, nlmConfig,\n idleSave, sessions, sessionManager,\n updateCtxStart, conversationBuffer } = deps;\n\n // #157: strip leading bangs for non-master (kiro-cli executes ! as shell)\n const registry = loadUsers();\n const resolvedUserId = msg.userId;\n const user = registry.byUserId.get(resolvedUserId);\n const isMaster = user?.role === \"master\";\n if (!isMaster && BANG_PREFIX.test(ctx.text)) {\n const original = ctx.text;\n ctx.text = ctx.text.replace(BANG_PREFIX, \"\");\n logInfo(\"commands\", `Defanged bang prefix from ${user?.userId ?? \"unknown\"}: \"${original.slice(0, 25)}\"`);\n if (!ctx.text.trim()) {\n ctx.handled = true;\n return;\n }\n }\n\n const trimmed = ctx.text.trim();\n const cmd = trimmed.split(/\\s/)[0]!.toLowerCase();\n\n // Interrupt commands: kill in-progress response first, then handle\n const activeId = sessionManager.getActiveSessionId(msg.userId, msg.platform);\n if (INTERRUPT_COMMANDS.has(cmd) && sessions.get(activeId)?.busy) {\n logInfo(\"commands\", `Interrupt command ${cmd} while busy \u2014 stopping current response`);\n await transport.sendInterrupt();\n sessions.getOrCreate(activeId).busy = false;\n }\n\n // Non-interrupt destructive commands while busy: defer to busy guard (will be queued)\n if (!INTERRUPT_COMMANDS.has(cmd) && DESTRUCTIVE_COMMANDS.has(cmd) && sessions.get(activeId)?.busy) {\n const deferredWording: Record<string, string> = {\n \"/compact\": \"\u23F3 Will /compact after current response finishes.\",\n \"/coding\": \"\u23F3 Will switch to coding mode after current response finishes.\",\n \"/default\": \"\u23F3 Will switch to default mode after current response finishes.\",\n };\n const specific = deferredWording[cmd];\n if (specific) {\n await ctx.reply(specific);\n ctx.deferReply = true;\n }\n await next();\n return;\n }\n\n const { adapter } = ctx;\n const editReply = adapter.editMessage\n ? async (messageId: number | string, text: string): Promise<void> => { await adapter.editMessage!(msg.channelId, messageId, text); }\n : undefined;\n\n const cmdCtx: CommandContext = {\n sessionKey: activeId, chatId: ctx.chatId, userId: ctx.userId ?? \"master\", platform: msg.platform, reply: ctx.reply,\n editReply,\n transport, config, startedAt,\n memory, memoryConfig, nlmConfig,\n idleSave,\n sessions,\n sessionManager: deps.sessionManager,\n updateCtxStart,\n cronCurrentJob: deps.cronCurrentJob?.() ?? null,\n enqueueCron: deps.enqueueCron,\n requestShutdown: deps.requestShutdown,\n sleepProgress: deps.sleepProgress,\n loadedCapabilities: deps.loadedCapabilities,\n selfHealerTask: deps.selfHealerTask,\n hailMary: deps.hailMary,\n rebuildTransport: deps.rebuildTransport,\n phaseHealth: deps.phaseHealth,\n registry: deps.registry,\n bridgeLockPath: deps.bridgeLockPath,\n conversationBuffer: msg.isGroup ? conversationBuffer : undefined,\n bufKey: msg.isGroup ? `${msg.platform}:${msg.channelId}` : undefined,\n };\n\n if (await handleCommand(ctx.text, cmdCtx)) {\n ctx.handled = true;\n return;\n }\n\n // // prefix \u2192 pass-through (strip one /)\n if (ctx.text.startsWith(\"//\")) {\n ctx.text = ctx.text.slice(1);\n }\n\n // Transport-specific commands\n if (transport.transportCommands.includes(cmd) && transport.executeCommand) {\n const result = await transport.executeCommand(ctx.text);\n await ctx.reply(result);\n ctx.handled = true;\n return;\n }\n\n await next();\n};\n", "/**\n * Busy guard middleware \u2014 queues messages when transport is busy.\n */\n\nimport type { Middleware } from \"./middleware.js\";\nimport { logInfo, logDebug, logWarn } from \"../logger.js\";\n\nconst MAX_QUEUE_DEPTH = 20;\n\nexport const busyGuardMiddleware: Middleware = async (ctx, next) => {\n const { msg, adapter, deps } = ctx;\n const userId = msg.userId;\n const activeId = deps.sessionManager.getActiveSessionId(userId, msg.platform);\n const entry = deps.sessions.getOrCreate(activeId);\n\n if (entry.busy) {\n const text = ctx.text.trim();\n const lower = text.toLowerCase();\n\n // /stop or /ctrlc \u2014 hard interrupt\n if (lower === \"/stop\" || lower === \"/ctrlc\") {\n logInfo(\"busy-guard\", `STOP interrupt for ${activeId}`);\n await deps.transport.sendInterrupt();\n entry.busy = false;\n try { await adapter.sendMessage(msg.channelId, \"\uD83D\uDED1 Stopped.\", { threadId: msg.threadId }); } catch { /* */ }\n ctx.handled = true;\n return;\n }\n\n // /wait or /steer \u2014 non-interrupting injection\n if (lower.startsWith(\"/wait\") || lower.startsWith(\"/steer\")) {\n const body = text.replace(/^\\/(wait|steer)\\s*/i, \"\").trim();\n const steer = body ? `[USER] Wait! ${body}` : \"[USER] Wait!\";\n entry.pendingWait = entry.pendingWait ? entry.pendingWait + \"\\n\" + steer : steer;\n logInfo(\"busy-guard\", `Steer queued for ${activeId}: \"${body || \"(no message)\"}\"`);\n try { await adapter.sendMessage(msg.channelId, \"\uD83D\uDCCC Noted.\", { threadId: msg.threadId }); } catch { /* */ }\n ctx.handled = true;\n return;\n }\n\n // Legacy: bare \"wait\" \u2014 treat as /stop for backward compat\n if (lower === \"wait\") {\n logInfo(\"busy-guard\", `Legacy WAIT interrupt for ${activeId}`);\n await deps.transport.sendInterrupt();\n entry.busy = false;\n try { await adapter.sendMessage(msg.channelId, \"\uD83D\uDED1 Stopped.\", { threadId: msg.threadId }); } catch { /* */ }\n ctx.handled = true;\n return;\n }\n\n // Default: queue the message\n if (entry.queue.length >= MAX_QUEUE_DEPTH) {\n const dropped = entry.queue.length - MAX_QUEUE_DEPTH + 1;\n entry.queue.splice(0, dropped);\n logWarn(\"busy-guard\", `Queue overflow for ${activeId} \u2014 dropped ${dropped} oldest message(s)`);\n }\n entry.queue.push({ msg, adapter });\n logDebug(\"busy-guard\", `Queued \"${ctx.text.slice(0, 40)}\" for ${activeId} (${entry.queue.length} pending)`);\n if (!ctx.deferReply) {\n if (entry.compacting) {\n try { await adapter.sendMessage(msg.channelId, \"\u2615 Hold on, just tidying up my thoughts over coffee... I'll get to you in a moment!\", { threadId: msg.threadId }); }\n catch { /* */ }\n }\n logDebug(\"busy-guard\", `Queue: ${entry.compacting ? \"compacting\" : `queued (${entry.queue.length})`} for ${activeId}`);\n }\n ctx.handled = true;\n return;\n }\n\n await next();\n};\n", "/**\n * prompt-builder.ts \u2014 Build the augmented prompt for a user message.\n * Handles: timestamp, media path, group context, session-start injection,\n * active recall, large-message interception, injection scan.\n */\n\nimport { logAndSwallow } from \"../log-and-swallow.js\";\nimport { logInfo, logDebug, logTrace, logWarn } from \"../logger.js\";\nimport { localTime } from \"../../utils/local-time.js\";\nimport { interceptLargeMessage } from \"../message-interceptor.js\";\nimport { loadSoulBundle, loadMinimalSoul } from \"../soul-loader.js\";\nimport { loadUsers } from \"../user-registry.js\";\nimport { abmind } from \"../../utils/abmind-lazy.js\";\nimport { getEnv } from \"../env-schema.js\";\nimport { readAndClearRestartReason } from \"../transport/bridge-lock-transport.js\";\nimport type { SessionRegistry } from \"../session-registry.js\";\nimport type { MemoryManager } from \"abmind\";\nimport type { ConversationBuffer } from \"../conversation-buffer.js\";\nimport type { InboundMessage } from \"../../types/platform.js\";\nimport type { UserRegistry } from \"../user-registry.js\";\n\nconst TAG = \"pipeline\";\nconst ACTIVE_MEMORY_LIMIT = 5;\n\nexport interface BuildPromptDeps {\n memory: MemoryManager | null;\n memoryConfig: { memoryEnabled: boolean; memoryDir: string };\n sessions: SessionRegistry;\n sessionManager: import(\"../session-manager.js\").SessionManager;\n conversationBuffer: ConversationBuffer;\n contextPercent: number;\n maxContext?: number;\n isAcp?: boolean;\n}\n\nexport interface BuildPromptResult {\n prompt: string;\n isSessionStart: boolean;\n imageContent?: { mime: string; base64: string; path: string };\n}\n\nexport async function buildPrompt(\n msg: InboundMessage,\n text: string,\n deps: BuildPromptDeps,\n registry: UserRegistry,\n): Promise<BuildPromptResult> {\n const { memory, sessions, conversationBuffer, contextPercent } = deps;\n const { channelId, isGroup } = msg;\n const userId = msg.userId;\n const sessionKey = deps.sessionManager.getActiveSessionId(userId, msg.platform);\n const bufKey = `${msg.platform}:${channelId}`;\n\n // --- Timestamp prefix ---\n let prompt = `[${localTime()}] ${text}`;\n let imageContent: { mime: string; base64: string; path: string } | undefined;\n if (msg.mediaPath) {\n if (deps.isAcp) {\n // ACP: agent reads files itself \u2014 just provide the path, no I/O\n prompt += `\\nImage saved at: ${msg.mediaPath}`;\n } else {\n // DirectApi: encode for API\n const { readFileSync } = await import(\"node:fs\");\n const ext = msg.mediaPath.split(\".\").pop()?.toLowerCase();\n const visionMimes: Record<string, string> = { jpg: \"image/jpeg\", jpeg: \"image/jpeg\", png: \"image/png\", gif: \"image/gif\", webp: \"image/webp\" };\n const mime = ext ? visionMimes[ext] : undefined;\n if (mime) {\n try {\n const buf = readFileSync(msg.mediaPath);\n const b64 = buf.toString(\"base64\");\n const maxCtxPct = parseInt(process.env[\"IMAGE_MAX_CONTEXT_PCT\"] ?? \"30\", 10);\n const maxContext = deps.maxContext ?? 128000;\n const imgTokens = Math.ceil(b64.length / 4);\n if (imgTokens <= maxContext * (maxCtxPct / 100)) {\n imageContent = { mime, base64: b64, path: msg.mediaPath };\n } else {\n prompt += `\\n\u26A0\uFE0F Image too large. Saved at: ${msg.mediaPath}`;\n }\n } catch {\n prompt += `\\nFile saved at: ${msg.mediaPath}`;\n }\n } else {\n prompt += `\\nFile saved at: ${msg.mediaPath}`;\n }\n }\n }\n\n // --- Group buffer drain ---\n if (isGroup) {\n const context = conversationBuffer.drain(bufKey);\n if (context) {\n prompt = context + text;\n logDebug(TAG, \"Prepended group context to prompt\");\n }\n }\n\n // --- Session-start injection ---\n const entry = sessions.getOrCreate(sessionKey);\n const isSessionStart = entry.pendingStart || !entry.seen;\n logTrace(TAG, `session-state: key=${sessionKey} seen=${entry.seen} pendingStart=${entry.pendingStart} isSessionStart=${isSessionStart}`);\n if (isSessionStart && memory) {\n prompt = buildSessionStartPrompt(prompt, memory, userId, sessionKey, deps.maxContext);\n }\n entry.seen = true;\n entry.pendingStart = false;\n\n // Record user message to memory\n const userRole = registry.byUserId.get(userId)?.role;\n if (memory && userRole !== \"guest\") {\n const numericMsgId = typeof msg.messageId === \"number\" ? msg.messageId : undefined;\n memory.recordMessage({ role: \"user\", content: text, timestamp: Date.now(), userId, sessionId: sessionKey, platformMessageId: numericMsgId });\n }\n\n // --- Active recall ---\n if (getEnv().activeMemory && memory) {\n const userEntry = registry.byUserId.get(userId);\n if (userEntry?.role !== \"guest\" && (contextPercent < 0 || contextPercent < getEnv().ctxCompactPct)) {\n try {\n const t0 = performance.now();\n const priming = sessions.get(sessionKey)?.primingTerms ?? [];\n const now = new Date();\n const recall = await memory.recallSearch({\n translated: [...new Set([text, ...priming])],\n original: text,\n userId,\n limit: ACTIVE_MEMORY_LIMIT,\n maxClassification: userEntry?.maxClass ?? 0,\n stages: [\"Sf\", \"Ss\"],\n currentContext: { hour: now.getHours(), dayOfWeek: now.getDay() },\n });\n const TRIVIAL_TTL_MS = 36 * 60 * 60_000;\n const nowMs = Date.now();\n const hits = recall.results.filter(h => {\n if (h.score <= 0.70) return false;\n // Stale trivial fact: old + no signal + weak match \u2192 filter\n if (h.memoryType === \"fact\" && h.score < 1.0 && h.createdAt && nowMs - h.createdAt > TRIVIAL_TTL_MS) {\n if (!h.emotionTags && !h.importanceFlags) return false;\n }\n return true;\n });\n if (hits.length > 0) {\n const lines = hits.map(h => abmind()!.renderMemory({\n content_en: h.content,\n topic: h.topic ?? undefined,\n emotion_tags: h.emotionTags ?? undefined,\n importance_flags: h.importanceFlags ?? undefined,\n memory_type: h.memoryType ?? undefined,\n confidence: h.confidence ?? undefined,\n createdAt: h.createdAt,\n }));\n const block = `[MEMORY CONTEXT \u2014 auto-recalled, do not repeat verbatim]\\n${lines.join(\"\\n\")}\\n[/MEMORY CONTEXT]\\n\\n`;\n prompt = block + prompt;\n logDebug(TAG, `Active recall: ${hits.length} hits, ${block.length} chars, ${Math.round(performance.now() - t0)}ms`);\n logTrace(TAG, `recall content: ${block}`);\n }\n } catch (err) {\n logDebug(TAG, `Active recall failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n }\n\n // --- Intercept oversized prompts (skip on session-start \u2014 those are expected to be large) ---\n if (!isSessionStart) {\n prompt = interceptLargeMessage(prompt).text;\n }\n\n // --- Injection scan for non-master ---\n if (userRole !== \"master\" && text.length > 10) {\n const scanForInjection = abmind()!.scanForInjection;\n const scan = scanForInjection(text);\n if (!scan.safe) {\n logInfo(TAG, `Injection blocked from ${userId}: ${scan.flags.map(f => f.category).join(\", \")}`);\n // Return a sentinel \u2014 caller checks and sends the block message\n return { prompt: \"__INJECTION_BLOCKED__\", isSessionStart, imageContent: undefined };\n }\n }\n\n return { prompt, isSessionStart, imageContent };\n}\n\n/** Single path for session-start injection: SOUL + memory wake-up + context + user identity + restart reason. */\nexport function buildSessionStartPrompt(\n prompt: string,\n memory: MemoryManager,\n userId: string,\n sessionKey?: string,\n maxContext?: number,\n): string {\n const contextParts: string[] = [];\n\n const reason = readAndClearRestartReason();\n if (reason) {\n contextParts.push(`[SESSION START REASON] ${reason}`);\n logInfo(TAG, `Injected restart reason: ${reason}`);\n }\n\n // Session identity (#624)\n let sessionType = \"A\"; // default Main\n if (sessionKey) {\n const parts = sessionKey.split(\"_\");\n if (parts.length === 3) {\n sessionType = parts[1]!;\n const typeMap: Record<string, string> = { A: \"Main\", B: \"Browse\", C: \"Code\", T: \"Task\" };\n const type = typeMap[sessionType] ?? sessionType;\n const index = parseInt(parts[2]!, 10);\n contextParts.push(`[SESSION] #${index} (${type})`);\n }\n }\n\n const isCodeSession = sessionType === \"C\";\n\n // Soul bundle: full for Main, minimal for Code (#658)\n if (isCodeSession) {\n const minimal = loadMinimalSoul(memory);\n if (minimal) {\n contextParts.push(minimal);\n logInfo(TAG, `Injected minimal soul for Code session (${minimal.length} chars)`);\n }\n } else {\n const soul = loadSoulBundle(memory);\n if (soul) {\n contextParts.push(soul);\n logInfo(TAG, `Injected soul bundle (${soul.length} chars)`);\n } else {\n contextParts.push(\"[\u26A0\uFE0F SOUL BUNDLE MISSING] Your persona files failed to load. Alert the user immediately and request a /reset.\");\n logWarn(TAG, \"Soul bundle empty \u2014 injected missing-soul warning\");\n }\n }\n\n if (sessionKey) {\n try {\n const registry = loadUsers();\n const user = registry.byUserId.get(userId);\n if (user) {\n const CLASS_NAMES = [\"UNCLASSIFIED\", \"RESTRICTED\", \"CONFIDENTIAL\", \"SECRET\"];\n const lang = user.languages?.length ? `\\nTheir languages: ${user.languages.join(\", \")}. Respond ONLY in these languages.` : \"\";\n const userBlock = `[CURRENT USER]\\nYou are now talking to ${user.userId} (${user.role}, ${CLASS_NAMES[user.maxClass] ?? `class ${user.maxClass}`} clearance).${lang}`;\n contextParts.push(userBlock);\n logInfo(TAG, `Injected [CURRENT USER] for ${user.userId} (${user.role})`);\n } else {\n logInfo(TAG, `[CURRENT USER] skipped \u2014 userId \"${userId}\" not found in registry (${registry.byUserId.size} users loaded)`);\n }\n } catch (err) { logAndSwallow(\"prompt_builder\", \"op\", err); }\n } else {\n logInfo(TAG, `[CURRENT USER] skipped \u2014 no sessionKey`);\n }\n\n const compSummary = null; // Legacy compaction removed \u2014 context engine handles summaries\n if (compSummary && sessionKey) {\n // Dead path \u2014 kept for type safety during transition\n } else {\n const ctxOpts = isCodeSession ? { skipDailies: true, maxAgeMs: 48 * 60 * 60 * 1000 } : undefined;\n const ctx = abmind()?.buildSessionStartContext(memory, userId, maxContext, ctxOpts);\n if (ctx) {\n contextParts.push(ctx);\n logInfo(TAG, `Injected session-start context (${ctx.length} chars${isCodeSession ? \", Code mode\" : \"\"})`);\n logTrace(TAG, `session-start content: ${ctx}`);\n }\n\n try {\n const userRole = loadUsers().byUserId.get(userId)?.role ?? \"master\";\n if (userRole === \"guest\") {\n contextParts.push(\"Hi! How can I help?\");\n } else if (userRole === \"user\") {\n contextParts.push(\"[SESSION START] Returning user. Be friendly and helpful.\");\n } else if (!isCodeSession) {\n // Wake-up only for Main sessions\n const wakeUp = memory.buildWakeUp();\n if (wakeUp) {\n contextParts.push(wakeUp);\n logInfo(TAG, `Injected ABM wake-up (${wakeUp.length} chars)`);\n logTrace(TAG, `wake-up content: ${wakeUp}`);\n }\n\n // #646 \u2014 system status (skip for Code sessions)\n if (sessionKey && !sessionKey.includes(\"_C_\")) {\n const status = abmind()!.buildStatusBlock(memory);\n if (status) contextParts.push(status);\n }\n }\n } catch (err) { logAndSwallow(\"prompt_builder\", \"op\", err); }\n }\n\n const contextBlock = contextParts.length > 0\n ? `[CONTEXT \u2014 do not respond to this section]\\n${contextParts.join(\"\\n\\n\")}\\n[/CONTEXT]\\n\\n`\n : \"\";\n\n const result = contextBlock + prompt;\n logTrace(TAG, `session-start assembled: ${contextParts.length} parts, context=${contextBlock.length} chars, prompt=${prompt.length} chars, total=${result.length} chars`);\n if (result.length < 5000) {\n logInfo(TAG, `Session-start prompt suspiciously small (${result.length} chars) \u2014 SOUL may be missing`);\n }\n if (maxContext && contextBlock.length > maxContext * 0.15) {\n logWarn(TAG, `\u26A0\uFE0F Session injection is ${Math.round(contextBlock.length / maxContext * 100)}% of context window \u2014 consider reducing SESSION_HISTORY_PCT`);\n }\n return result;\n}\n", "/**\n * Oversized payload interception \u2014 safety net for A2A / Browsie responses.\n * NOT for session-start or SOUL injection (those are expected to be large).\n *\n * If a message exceeds the threshold, the full content is written to a file\n * and the message body is replaced with a truncated preview + file path.\n */\nimport { mkdirSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { abtarsHome } from \"../paths.js\";\nimport { logInfo } from \"./logger.js\";\n\nconst TAG = \"MessageInterceptor\";\nconst OVERFLOW_DIR = join(abtarsHome(), \"overflow\");\nconst DEFAULT_THRESHOLD = 8000;\nconst PREVIEW_LENGTH = 500;\n\nexport interface InterceptResult {\n text: string;\n intercepted: boolean;\n filePath?: string;\n}\n\n/**\n * If `text` exceeds `threshold` chars, write full content to a file and\n * return a truncated preview with the file path. Otherwise return as-is.\n */\nexport function interceptLargeMessage(\n text: string,\n threshold = DEFAULT_THRESHOLD,\n): InterceptResult {\n if (text.length <= threshold) {\n return { text, intercepted: false };\n }\n\n mkdirSync(OVERFLOW_DIR, { recursive: true });\n const filename = `overflow_${Date.now()}.md`;\n const filePath = join(OVERFLOW_DIR, filename);\n writeFileSync(filePath, text, \"utf-8\");\n\n const preview = text.slice(0, PREVIEW_LENGTH);\n const replaced = `${preview}\\n\\n---\\n\u26A0\uFE0F Message truncated (${text.length} chars). Full content saved to: ${filePath}`;\n\n logInfo(TAG, `Intercepted oversized message (${text.length} chars) \u2192 ${filePath}`);\n return { text: replaced, intercepted: true, filePath };\n}\n", "/**\n * session-registry.ts \u2014 Single source of truth for per-session mutable state.\n * Replaces 8 scattered Sets/Maps keyed by sessionKey.\n */\nimport type { InboundMessage } from \"../types/platform.js\";\nimport type { PlatformAdapter } from \"../types/platform.js\";\n\nexport interface QueuedMessage {\n msg: InboundMessage;\n adapter: PlatformAdapter;\n}\n\nexport interface SessionEntry {\n busy: boolean;\n queue: QueuedMessage[];\n fullMode: boolean;\n pendingStart: boolean;\n seen: boolean;\n compacting: boolean;\n ctxWarned: boolean;\n compactFailures: number;\n primingTerms: string[];\n lastActiveAt: number;\n pendingWait?: string;\n}\n\nfunction createEntry(): SessionEntry {\n return {\n busy: false,\n queue: [],\n fullMode: false,\n pendingStart: false,\n seen: false,\n compacting: false,\n ctxWarned: false,\n compactFailures: 0,\n primingTerms: [],\n lastActiveAt: Date.now(),\n };\n}\n\nexport class SessionRegistry {\n private readonly entries = new Map<string, SessionEntry>();\n\n get(key: string): SessionEntry | undefined {\n return this.entries.get(key);\n }\n\n getOrCreate(key: string): SessionEntry {\n let entry = this.entries.get(key);\n if (!entry) {\n entry = createEntry();\n this.entries.set(key, entry);\n }\n entry.lastActiveAt = Date.now();\n return entry;\n }\n\n delete(key: string): void {\n this.entries.delete(key);\n }\n\n /** Mark every tracked session as needing session-start injection on its next message. */\n has(key: string): boolean {\n return this.entries.has(key);\n }\n\n keys(): IterableIterator<string> {\n return this.entries.keys();\n }\n\n get size(): number {\n return this.entries.size;\n }\n\n /** JSON-serializable snapshot for dashboard. */\n snapshot(): Record<string, SessionEntry> {\n return Object.fromEntries(this.entries);\n }\n\n /** Remove idle entries older than maxAgeMs. Returns count pruned. */\n prune(maxAgeMs: number): number {\n const cutoff = Date.now() - maxAgeMs;\n let pruned = 0;\n for (const [key, entry] of this.entries) {\n if (entry.lastActiveAt < cutoff && !entry.busy && !entry.compacting && entry.queue.length === 0) {\n this.entries.delete(key);\n pruned++;\n }\n }\n return pruned;\n }\n}\n", "import { logInfo, logError } from \"../logger.js\";\nimport { logAndSwallow } from \"../log-and-swallow.js\";\nimport type { CommandContext } from \"./types.js\";\nimport { triggerResetSession} from \"./registry.js\";\n\nconst TAG = \"cmd\";\n\nexport async function handleNewReset(text: string, ctx: CommandContext): Promise<boolean> {\n const isResetDefault = text.trim().toLowerCase() === \"/reset default\";\n\n if (isResetDefault) {\n const { resetToDefaults } = await import(\"../transport-config.js\");\n resetToDefaults();\n } else {\n try {\n await triggerResetSession(ctx);\n } catch (err) {\n await ctx.reply(`\u26A0\uFE0F Transport rebuild failed: ${err instanceof Error ? err.message : String(err)}`);\n return true;\n }\n }\n\n // End active session via session manager \u2192 fresh Main\n ctx.sessionManager.endSession(ctx.userId, ctx.platform);\n const activeId = ctx.sessionManager.getActiveSessionId(ctx.userId, ctx.platform);\n await ctx.transport.resetSession(activeId);\n\n const label = isResetDefault ? \"\uD83D\uDD04 Reset to defaults.\" : \"\uD83D\uDD04 Transport reloaded.\";\n await ctx.reply(label);\n\n logInfo(TAG, `Reset session \u2192 ${activeId} (${ctx.platform})`);\n return true;\n}\n\nexport async function handleCompact(_text: string, ctx: CommandContext): Promise<boolean> {\n try {\n // Context engine compaction \u2014 force compact via transport's orchestrator\n const transport = ctx.transport as { contextOrchestrator?: { forceCompact(chatId: string, budget: number): Promise<boolean> }; config?: { maxContext: number } };\n if (transport.contextOrchestrator) {\n const budget = (transport as any).config?.maxContext ?? 200000;\n const success = await transport.contextOrchestrator.forceCompact(ctx.sessionKey, budget);\n await ctx.reply(success ? \"\uD83D\uDCE6 Compaction complete.\" : \"\uD83D\uDCE6 Nothing to compact.\");\n } else {\n await ctx.reply(\"\uD83D\uDCE6 Context engine not active for this transport.\");\n }\n } catch (err) {\n logError(TAG, \"Manual compaction failed\", err);\n await ctx.reply(\"\u274C Compaction failed.\");\n }\n return true;\n}\n\nexport async function handleEmergencyAlias(_text: string, ctx: CommandContext): Promise<boolean> {\n return handleModels(\"/model emergency\", ctx);\n}\n\nexport async function handleModels(text: string, ctx: CommandContext): Promise<boolean> {\n const { loadTransport, resolveAgent, getModelsForProvider, writeTransportConfig } = await import(\"../transport-config.js\");\n const tc = loadTransport();\n const prof = tc ? resolveAgent(\"professor\", tc) : null;\n const currentModel = (\"currentModel\" in ctx.transport\n ? (ctx.transport as unknown as { currentModel: string }).currentModel\n : undefined) ?? prof?.model ?? \"unknown\";\n\n const arg = text.replace(/^\\/(models?)\\s*/i, \"\").trim().toLowerCase();\n\n // /model emergency \u2014 activate hailMary (paid) until /model restore, /reset, or wake-up\n if (arg === \"emergency\" || arg === \"hailmary\") {\n if (!ctx.hailMary) { await ctx.reply(\"\u274C hailMary not configured in transport.json\"); return true; }\n const t = ctx.transport as unknown as { setEmergencyMode?: (o: { endpoint: string; apiKey?: string; model: string; maxContext: number } | null) => void };\n if (!t.setEmergencyMode) { await ctx.reply(\"\u274C Transport does not support emergency mode\"); return true; }\n\n // #367 \u2014 validate hailMary's provider is ready before switching.\n if (tc) {\n const hmProvider = tc.hailMary ? tc.providers[tc.hailMary.provider] : undefined;\n if (hmProvider) {\n const { validateProviderReady, formatValidationError } = await import(\"../transport-config.js\");\n const { getEnv } = await import(\"../env-schema.js\");\n const result = validateProviderReady(tc.hailMary!.provider, hmProvider, getEnv());\n if (!result.ok) { await ctx.reply(formatValidationError(tc.hailMary!.provider, result)); return true; }\n }\n }\n\n t.setEmergencyMode({ ...ctx.hailMary, maxContext: 1_000_000 });\n await ctx.reply(`\uD83D\uDEA8 EMERGENCY MODE: using ${ctx.hailMary.model} (paid). Clears on /model restore, /reset, or wake-up.`);\n return true;\n }\n\n // /models restore \u2014 swap transport.json \u2194 transport.json.old (undo last switch)\n if (arg === \"restore\") {\n const { restorePrevious } = await import(\"../transport-config.js\");\n const result = restorePrevious();\n if (!result.ok) { await ctx.reply(`\u274C ${result.error}`); return true; }\n const t = ctx.transport as unknown as { setEmergencyMode?: (o: null) => void };\n t.setEmergencyMode?.(null);\n await ctx.reply(\"\uD83D\uDD04 Restored previous config.\");\n return true;\n }\n\n // /models default \u2014 factory reset from transport.default.json\n if (arg === \"default\") {\n const { resetToDefaults } = await import(\"../transport-config.js\");\n if (!resetToDefaults()) { await ctx.reply(\"\u274C Factory config not found \u2014 run abtars install to restore.\"); return true; }\n await ctx.reply(\"\uD83D\uDD04 Factory config restored.\");\n return true;\n }\n\n // /models health reset \u2014 reset model health buckets + clear emergency mode\n if (arg === \"health reset\" || arg === \"primary\") {\n const t = ctx.transport as unknown as {\n policy?: { registry: { resetAll: () => void } };\n setEmergencyMode?: (o: null) => void;\n isEmergencyMode?: boolean;\n };\n const wasEmergency = t.isEmergencyMode;\n t.setEmergencyMode?.(null);\n if (t.policy?.registry) {\n t.policy.registry.resetAll();\n await ctx.reply(wasEmergency\n ? \"\uD83D\uDD0C Emergency mode cleared + model health reset \u2014 free models active.\"\n : \"\uD83D\uDD0C Model health reset \u2014 all models available.\");\n } else {\n await ctx.reply(\"\uD83D\uDD0C No fallback policy configured.\");\n }\n return true;\n }\n\n // /model doctor \u2014 probe all models under current transport\n if (arg === \"doctor\") {\n if (!prof) { await ctx.reply(\"\u274C No transport configured.\"); return true; }\n const endpoint = prof.provider.endpoint ?? \"http://localhost:11434/v1\";\n const apiKey = prof.provider.apiKeyEnv ? (await import(\"../env-schema.js\")).getEnv().getApiKey(prof.provider.apiKeyEnv) : undefined;\n\n // Collect all models under this provider\n const models = new Set<string>();\n for (const [, agent] of Object.entries(tc!.agents)) {\n if (agent.provider === prof.providerName) models.add(agent.model);\n for (const fb of agent.fallbacks ?? []) {\n if (fb.provider === prof.providerName) models.add(fb.model);\n }\n }\n if (tc!.hailMary?.provider === prof.providerName) models.add(tc!.hailMary.model);\n\n await ctx.reply(`\uD83E\uDE7A Checking ${models.size} models on ${prof.providerName}...`);\n const results: string[] = [];\n const { loadModels } = await import(\"../transport-config.js\");\n const catalog = loadModels();\n\n for (const model of models) {\n try {\n const res = await fetch(`${endpoint}/chat/completions`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\", ...(apiKey ? { Authorization: `Bearer ${apiKey}` } : {}) },\n body: JSON.stringify({ model, messages: [{ role: \"user\", content: \"hi\" }], max_tokens: 1 }),\n signal: AbortSignal.timeout(10_000),\n });\n if (res.ok) {\n results.push(`\u2705 ${model} \u2014 alive`);\n if (catalog[model]) catalog[model]!.status = \"alive\";\n } else {\n const body = await res.text().catch(err => { logAndSwallow(TAG, \"read model probe error body\", err); return \"\"; });\n const short = body.slice(0, 80).replace(/\\n/g, \" \");\n const status = res.status === 404 ? \"dead\" : res.status === 403 ? \"subscription\" : res.status === 429 ? \"rate_limited\" : \"error\";\n results.push(`\u274C ${model} \u2014 ${status} (${res.status}: ${short})`);\n if (catalog[model]) { catalog[model]!.status = status as any; (catalog[model] as any).error = `${res.status}: ${short}`; }\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n results.push(`\u26A0\uFE0F ${model} \u2014 timeout/error (${msg.slice(0, 60)})`);\n if (catalog[model]) { catalog[model]!.status = \"dead\" as any; (catalog[model] as any).error = msg.slice(0, 80); }\n }\n if (catalog[model]) (catalog[model] as any).lastChecked = new Date().toISOString();\n }\n\n // Write updated catalog\n const { writeFileSync } = await import(\"node:fs\");\n const { join } = await import(\"node:path\");\n const { configDir } = await import(\"../transport-config.js\");\n writeFileSync(join(configDir(), \"models.json\"), JSON.stringify(catalog, null, 2) + \"\\n\");\n\n await ctx.reply(`\uD83E\uDE7A Model Health:\\n${results.join(\"\\n\")}`);\n return true;\n }\n\n // /models quick <model> \u2014 instant switch\n if (arg.startsWith(\"quick \") || arg.startsWith(\"switch \")) {\n const newModel = arg.split(\" \").slice(1).join(\" \").trim();\n if (!newModel) { await ctx.reply(\"Usage: /models quick <model>\"); return true; }\n if (!tc || !prof) { await ctx.reply(\"\u274C transport.json not loaded\"); return true; }\n\n // Check if model is available on current provider\n const models = getModelsForProvider(prof.providerName);\n const match = models.find(m => m.id === newModel);\n if (!match) {\n await ctx.reply(`\u274C ${newModel} not available on ${prof.providerName}. Use /models change to switch provider.`);\n return true;\n }\n\n // #367 \u2014 validate the provider (same one we're on) is still ready.\n {\n const { validateProviderReady, formatValidationError } = await import(\"../transport-config.js\");\n const { getEnv } = await import(\"../env-schema.js\");\n const result = validateProviderReady(prof.providerName, prof.provider, getEnv());\n if (!result.ok) { await ctx.reply(formatValidationError(prof.providerName, result)); return true; }\n }\n\n // Write + switch\n tc.agents[\"professor\"]!.model = newModel;\n const { cleanDemotedModels } = await import(\"../transport-config.js\");\n cleanDemotedModels(tc, newModel);\n writeTransportConfig(tc, `professor model \u2192 ${newModel}`);\n if (\"setModel\" in ctx.transport) {\n await (ctx.transport as unknown as { setModel: (m: string) => Promise<void> }).setModel(newModel);\n }\n await ctx.reply(`\u2705 Switched to ${newModel}`);\n return true;\n }\n\n // /models list [provider] \u2014 text-based discovery for all platforms\n if (arg === \"list\" || arg.startsWith(\"list \")) {\n const providerArg = arg.slice(5).trim();\n const { getAvailableProviders, getModelsForProvider: getModels } = await import(\"../transport-config.js\");\n if (!tc) { await ctx.reply(\"\u274C transport.json not loaded\"); return true; }\n\n if (!providerArg) {\n // List all providers\n const providers = getAvailableProviders(tc);\n const lines = [\"\uD83D\uDD0C Providers:\"];\n for (const p of providers) {\n const count = getModels(p.name).length;\n lines.push(` \u2022 ${p.name} (${p.config.transport})${count > 0 ? ` \u2014 ${count} models` : \"\"}`);\n }\n lines.push(\"\\nUse /model list <provider> to see models.\");\n await ctx.reply(lines.join(\"\\n\"));\n } else {\n // List models for a specific provider\n const models = getModels(providerArg);\n if (models.length === 0) { await ctx.reply(`\u274C No models found for provider \"${providerArg}\"`); return true; }\n const lines = [`\uD83D\uDCCB Models on ${providerArg}:`];\n for (const m of models) {\n const current = m.id === currentModel ? \" \u2705\" : \"\";\n lines.push(` \u2022 ${m.id}${current}`);\n }\n lines.push(`\\nUse /model quick <name> to switch.`);\n await ctx.reply(lines.join(\"\\n\"));\n }\n return true;\n }\n\n // /models change \u2014 4-stage picker (agent\u2192provider\u2192slot\u2192model)\n if (arg === \"change\") {\n if (ctx.platform !== \"telegram\") {\n await ctx.reply(\"\uD83E\uDD16 Use /model list to discover, /model quick <model> to switch.\");\n return true;\n }\n const AGENT_LABELS: Array<{ key: string; label: string }> = [\n { key: \"professor\", label: \"Professor\" },\n { key: \"dreamy\", label: \"Dreamy (sleep)\" },\n { key: \"browsie\", label: \"Browsie (browse)\" },\n { key: \"coding\", label: \"Cody (coding)\" },\n ];\n const buttons = AGENT_LABELS.map(a => [{ text: a.label, callback_data: `mslot:${a.key}` }]);\n buttons.push([{ text: \"\u2190 Cancel\", callback_data: \"mb:\" }]);\n await ctx.reply(\"\uD83E\uDD16 Which agent to change?\", { reply_markup: { inline_keyboard: buttons } });\n return true;\n }\n\n // /model provider <name> \u2014 global provider switch (replaces old picker \"Provider\" option)\n if (arg.startsWith(\"provider \")) {\n const providerName = arg.slice(9).trim();\n if (!tc || !prof) { await ctx.reply(\"\u274C transport.json not loaded\"); return true; }\n const provider = tc.providers[providerName];\n if (!provider) { await ctx.reply(`\u274C Provider \"${providerName}\" not found. Available: ${Object.keys(tc.providers).join(\", \")}`); return true; }\n const { validateProviderReady, formatValidationError, loadProviderDefaults } = await import(\"../transport-config.js\");\n const { getEnv } = await import(\"../env-schema.js\");\n const validation = validateProviderReady(providerName, provider, getEnv());\n if (!validation.ok) { await ctx.reply(formatValidationError(providerName, validation)); return true; }\n const defaults = loadProviderDefaults(providerName);\n if (defaults?.professor) {\n tc.agents[\"professor\"] = { model: defaults.professor.model, provider: providerName, fallbacks: defaults.professor.fallbacks?.map(m => ({ model: m, provider: providerName })) };\n for (const role of [\"dreamy\", \"browsie\", \"coding\"] as const) {\n tc.agents[role] = { model: defaults[role]?.model ?? defaults.professor.model, provider: providerName };\n }\n } else {\n for (const role of Object.keys(tc.agents)) {\n tc.agents[role] = { ...tc.agents[role]!, provider: providerName };\n }\n }\n writeTransportConfig(tc, `global provider \u2192 ${providerName}`);\n await ctx.reply(`\u2705 All agents \u2192 ${providerName}. Use /reset to apply.`);\n return true;\n }\n\n // /models (no arg) \u2014 merged status: model + transport + agents\n const transportStatus = ctx.transport.isReady ? \"\u2713 Connected\" : \"\u274C Disconnected\";\n const ctxPct = ctx.transport.contextPercent >= 0 ? `${ctx.transport.contextPercent}%` : \"n/a\";\n const mode = prof?.provider.transport?.toUpperCase() ?? \"ACP\";\n const provider = prof?.providerName ?? \"unknown\";\n const isEmergency = (ctx.transport as unknown as { isEmergencyMode?: boolean }).isEmergencyMode === true;\n\n const lines = [\n `\uD83D\uDD0C Transport: ${mode} (${provider}) \u2014 ${transportStatus}`,\n isEmergency ? `\uD83D\uDEA8 EMERGENCY MODE: ${currentModel} (paid)` : `\uD83E\uDD16 Model: ${currentModel}`,\n `\uD83D\uDCCA Context: ${ctxPct}`,\n \"\",\n \"\uD83D\uDCCB Agents:\",\n ];\n const agents = [\"professor\", \"dreamy\", \"browsie\", \"coding\"] as const;\n const names: Record<string, string> = { professor: \"Professor\", dreamy: \"Dreamy\", browsie: \"Browsie\", coding: \"Cody\" };\n for (const a of agents) {\n const r = tc ? resolveAgent(a, tc) : null;\n let line = ` ${names[a]}: ${r?.model ?? \"unknown\"} (${r?.providerName ?? \"?\"}, ${r?.provider.transport ?? \"?\"})`;\n if (a === \"professor\" && r?.fallbacks.length) {\n line += \"\\n\" + r.fallbacks.map((f, i) => ` \u21B3 fb${i + 1}: ${f.model} (${f.provider})`).join(\"\\n\");\n }\n lines.push(line);\n }\n lines.push(\" Cron: inherits Professor\");\n if (prof?.provider.fallbackChain?.length) {\n lines.push(`\\n\uD83D\uDEDF Fallback chain: ${prof.provider.fallbackChain.join(\" \u2192 \")}`);\n }\n if (ctx.hailMary) {\n lines.push(`\uD83D\uDEA8 hailMary: ${ctx.hailMary.model} `);\n }\n lines.push(\"\\nUse /models change to switch.\");\n await ctx.reply(lines.join(\"\\n\"));\n return true;\n}\n", "import { execFile } from \"node:child_process\";\n\n/** Run a command with timeout, resolve stdout or null on error. */\nexport function execAsync(cmd: string, args: string[], timeoutMs: number): Promise<string | null> {\n return new Promise((resolve) => {\n const child = execFile(cmd, args, { timeout: timeoutMs, encoding: \"utf-8\" }, (err, stdout) => {\n resolve(err ? null : stdout.trim());\n });\n child.stderr?.resume();\n });\n}\n", "import { execAsync } from \"./exec-async.js\";\nimport { readFileSync, readdirSync} from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir} from \"node:os\";\nimport { logInfo} from \"../logger.js\";\nimport { logAndSwallow } from \"../log-and-swallow.js\";\nimport { readEntries as cronReadEntries } from \"../tasks/task-store.js\";\nimport { abtarsHome } from \"../../paths.js\";\nimport type { CommandContext } from \"./types.js\";\n\nconst TAG = \"cmd\";\n\nexport async function handleDoctor(_text: string, ctx: CommandContext): Promise<boolean> {\n const arg = _text.replace(/^\\/doctor\\s*/i, \"\").trim().toLowerCase();\n\n // /doctor fix \u2192 run doctor.sh --fix\n if (arg === \"fix\" || arg === \"fix-full\") {\n const flag = arg === \"fix-full\" ? \"--fix-full\" : \"--fix\";\n try {\n const raw = await execAsync(\"bash\", [join(abtarsHome(), \"scripts\", \"doctor.sh\"), flag], 30000);\n await ctx.reply(`\uD83E\uDE7A doctor.sh ${flag}:\\n${raw || \"(no output)\"}`);\n } catch (err) {\n await ctx.reply(`\u274C doctor.sh failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n return true;\n }\n\n const { getDoctorReport, renderDoctorText } = await import(\"../doctor/index.js\");\n const force = arg === \"force\";\n const svcStates = ctx.registry?.getStates() ?? {};\n const report = await getDoctorReport({\n memory: ctx.memory,\n transport: ctx.transport,\n telegramRunning: svcStates.telegram?.running ?? false,\n discordRunning: svcStates.discord?.running ?? false,\n phaseHealth: ctx.phaseHealth,\n }, { force });\n await ctx.reply(renderDoctorText(report));\n return true;\n}\n\nexport async function handleStatus(_text: string, ctx: CommandContext): Promise<boolean> {\n if (ctx.phaseHealth && ctx.registry) {\n const { getSystemStatus, renderStatusText } = await import(\"../system-status.js\");\n const status = await getSystemStatus({\n phaseHealth: ctx.phaseHealth,\n registry: ctx.registry,\n transport: ctx.transport,\n startedAt: ctx.startedAt,\n bridgeLockPath: ctx.bridgeLockPath ?? \"\",\n heartbeat: { intervalMs: Math.max(60, parseInt(process.env[\"HEARTBEAT_INTERVAL_SEC\"] ?? \"60\", 10)) * 1000 },\n });\n let text = renderStatusText(status);\n // #255: append sanitized env dump on /status full\n if (_text.trim().toLowerCase() === \"full\") {\n const { envDump } = await import(\"../env-schema.js\");\n const dump = envDump();\n const envLines = Object.entries(dump).slice(0, 30).map(([k, v]) => ` ${k}: ${v}`);\n text += \"\\n\\n\uD83D\uDCCB Config (top 30):\\n\" + envLines.join(\"\\n\");\n }\n await ctx.reply(text);\n } else {\n const lines = await buildStatusLines(ctx);\n await ctx.reply(lines.join(\"\\n\"));\n }\n return true;\n}\n\nexport async function handleWait(text: string, ctx: CommandContext): Promise<boolean> {\n // When idle, /wait is a no-op (nothing running to steer). Inform user.\n const body = text.replace(/^\\/(wait|steer)\\s*/i, \"\").trim();\n if (!body) { await ctx.reply(\"Nothing running. Send a message to start.\"); return true; }\n // Has a message body but idle \u2014 just pass it as a normal prompt (return false = not handled)\n return false;\n}\n\nexport async function handleStop(_text: string, ctx: CommandContext): Promise<boolean> {\n await ctx.transport.sendInterrupt();\n ctx.sessions.getOrCreate(ctx.sessionKey).busy = false;\n await ctx.reply(\"\uD83D\uDED1 Ctrl+C sent.\");\n logInfo(TAG, \"Ctrl+C interrupt sent\");\n return true;\n}\n\nexport async function handleRestart(_text: string, ctx: CommandContext): Promise<boolean> {\n await ctx.reply(\"\u267B\uFE0F Restarting bridge...\");\n setTimeout(() => ctx.requestShutdown?.(0), 500);\n return true;\n}\n\nexport async function handleHeartbeat(_text: string, ctx: CommandContext): Promise<boolean> {\n const cronInfo = ctx.memory?.getCronInfo();\n if (!cronInfo) { await ctx.reply(\"\uD83D\uDC93 Heartbeat not available.\"); return true; }\n\n const mins = Math.round(cronInfo.intervalMs / 60000);\n const lines = [\n `\uD83D\uDC93 Heartbeat: ${cronInfo.heartbeatRunning ? \"running\" : \"stopped\"} (${mins}min interval)`,\n \"\",\n ];\n\n // Task statuses\n if (cronInfo.taskStatuses.size > 0) {\n lines.push(\"Tasks (last tick):\");\n for (const [name, status] of cronInfo.taskStatuses) {\n lines.push(` ${status} ${name}`);\n }\n }\n\n // Last tick age\n try {\n const lock = JSON.parse(readFileSync(join(abtarsHome(), \"bridge.lock\"), \"utf-8\"));\n if (lock.lastHeartbeat > 0) {\n const agoMin = Math.round((Date.now() - lock.lastHeartbeat) / 60000);\n lines.push(\"\", `\uD83E\uDEC0 Last tick: ${agoMin}min ago`);\n }\n } catch (err) { logAndSwallow(\"command_handlers\", \"op\", err); }\n\n await ctx.reply(lines.join(\"\\n\"));\n return true;\n}\n\nexport async function handleHealing(text: string, ctx: CommandContext): Promise<boolean> {\n if (!ctx.selfHealerTask) { await ctx.reply(\"\uD83E\uDE7A Self-healer not available.\"); return true; }\n const arg = text.replace(/^\\/healing\\s*/, \"\").trim().toLowerCase();\n if (arg === \"on\") {\n ctx.selfHealerTask.enabled = true;\n } else if (arg === \"off\") {\n ctx.selfHealerTask.enabled = false;\n } else if (arg === \"reset\") {\n ctx.selfHealerTask.resetCircuitBreaker?.();\n await ctx.reply(\"\uD83E\uDE7A Circuit breaker reset \u2014 all paused rules re-enabled.\");\n return true;\n }\n const status = ctx.selfHealerTask.enabled ? \"ON\" : \"OFF\";\n const paused = ctx.selfHealerTask.pausedRules?.() ?? 0;\n const pausedText = paused > 0 ? ` (${paused} rule${paused > 1 ? \"s\" : \"\"} paused)` : \"\";\n await ctx.reply(`\uD83E\uDE7A Self-healing: ${status}${pausedText}`);\n if (arg === \"on\" || arg === \"off\") logInfo(TAG, `Self-healer ${status} by user`);\n return true;\n}\n\nexport async function handleFull(_text: string, ctx: CommandContext): Promise<boolean> {\n if (ctx.platform !== \"telegram\") { await ctx.reply(\"\uD83D\uDCFA Full mode is only available on Telegram.\"); return true; }\n ctx.sessions.getOrCreate(ctx.sessionKey).fullMode = true;\n await ctx.reply(\"\uD83D\uDCFA Full mode \u2014 sending raw output, TTS disabled.\");\n return true;\n}\n\nexport async function handleShort(_text: string, ctx: CommandContext): Promise<boolean> {\n if (ctx.platform !== \"telegram\") { await ctx.reply(\"\u2702\uFE0F Short mode is only available on Telegram.\"); return true; }\n ctx.sessions.getOrCreate(ctx.sessionKey).fullMode = false;\n await ctx.reply(\"\u2702\uFE0F Short mode \u2014 clean responses, TTS enabled.\");\n return true;\n}\n\nasync function buildStatusLines(ctx: CommandContext): Promise<string[]> {\n let version = \"?\";\n let buildInfo = \"\";\n try {\n const pkgPath = join(import.meta.dirname, \"..\", \"..\", \"..\", \"package.json\");\n version = JSON.parse(readFileSync(pkgPath, \"utf-8\")).version;\n } catch (err) { logAndSwallow(\"command_handlers\", \"op\", err); }\n try {\n const biPath = join(import.meta.dirname, \"..\", \"..\", \"build-info.json\");\n const bi = JSON.parse(readFileSync(biPath, \"utf-8\")) as { hash: string; date: string };\n buildInfo = ` (${bi.hash} ${bi.date.slice(0, 10)})`;\n } catch (err) { logAndSwallow(\"command_handlers\", \"op\", err); }\n\n let model = \"unknown\";\n if (\"currentModel\" in ctx.transport) {\n model = (ctx.transport as unknown as { currentModel: string }).currentModel;\n } else {\n const { loadTransport, resolveAgent } = await import(\"../transport-config.js\");\n const tc = loadTransport();\n const prof = tc ? resolveAgent(\"professor\", tc) : null;\n model = prof?.model ?? \"unknown\";\n }\n\n const transportStatus = ctx.transport.isReady ? \"\u2713 Connected\" : \"\u274C Disconnected\";\n const uptime = formatUptime(Date.now() - ctx.startedAt);\n const ctxPct = ctx.transport.contextPercent >= 0\n ? `${ctx.transport.contextPercent}%`\n : \"n/a\";\n const cronInfo = ctx.memory?.getCronInfo();\n\n // Transport details from transport.json\n const { loadTransport: lt, resolveAgent: ra } = await import(\"../transport-config.js\");\n const tc = lt();\n const prof = tc ? ra(\"professor\", tc) : null;\n const provider = prof?.providerName ?? \"unknown\";\n const mode = prof?.provider.transport?.toUpperCase() ?? \"ACP\";\n const transportLine = `\uD83D\uDD0C Transport: ${mode} (${provider}) \u2014 ${transportStatus}`;\n\n // Fallbacks from transport.json\n const fallbackModels = prof?.fallbacks.map(f => `${f.model} (${f.provider})`) ?? [];\n\n const lines = [\n `Abtars v${version}${buildInfo}`,\n transportLine,\n `\uD83E\uDD16 Model: ${model}`,\n ...(fallbackModels.length > 0 ? [` Fallbacks: ${fallbackModels.join(\", \")}`] : []),\n `\uD83D\uDCCA Context window: ${ctxPct}`,\n `\u23F1\uFE0F Uptime: ${uptime}`,\n ];\n if (cronInfo) {\n const mins = Math.round(cronInfo.intervalMs / 60000);\n lines.push(\n `\uD83D\uDC93 Heartbeat: ${cronInfo.heartbeatRunning ? \"running\" : \"stopped\"} (${mins}min)`,\n );\n if (ctx.loadedCapabilities?.length) {\n lines.push(`\uD83D\uDD0C Capabilities: ${ctx.loadedCapabilities.join(\", \")}`);\n }\n lines.push(`\uD83D\uDE34 Last sleep: ${cronInfo.lastSleepAudit ?? \"(never)\"}`);\n const sp = ctx.sleepProgress?.();\n if (sp) {\n lines.push(`\uD83D\uDE34 Sleep: ${sp.percent}% (${sp.step})`);\n }\n try {\n const lock = JSON.parse(readFileSync(join(abtarsHome(), \"bridge.lock\"), \"utf-8\"));\n if (lock.lastHeartbeat > 0) lines.push(`\uD83E\uDEC0 Last tick: ${Math.round((Date.now() - lock.lastHeartbeat) / 60000)}min ago`);\n } catch (err) { logAndSwallow(\"command_handlers\", \"op\", err); }\n try {\n const ce = cronReadEntries();\n const r = ce.filter(e => e.schedule && !e.paused).length;\n const p = ce.filter(e => !e.fired && !e.schedule).length;\n const pa = ce.filter(e => e.paused).length;\n lines.push(`\u23F0 Tasks: ${r} recurring, ${p} pending${pa ? `, ${pa} paused` : \"\"}`);\n } catch (err) { logAndSwallow(\"command_handlers\", \"op\", err); }\n try {\n const bd = join(homedir(), \".backup-abtars\");\n const bk = readdirSync(bd).filter(f => f.startsWith(\"abtars-\")).sort();\n if (bk.length > 0) lines.push(`\uD83D\uDCBE Last backup: ${bk[bk.length - 1]}`);\n } catch (err) { logAndSwallow(\"command_handlers\", \"op\", err); }\n }\n\n lines.push(\"\");\n lines.push(\"Use /mcp for MCP server status.\");\n\n return lines;\n}\n\nfunction formatUptime(ms: number): string {\n const h = Math.floor(ms / 3600000);\n const m = Math.floor((ms % 3600000) / 60000);\n return h > 0 ? `${h}h ${m}m` : `${m}m`;\n}\n\n// \u2500\u2500 /users command \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n// \u2500\u2500 /usage command \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport async function handleUsage(_text: string, ctx: CommandContext): Promise<boolean> {\n const { readUsage, resetUsage } = await import(\"../usage-tracker.js\");\n const { loadModels } = await import(\"../transport-config.js\");\n\n const arg = _text.replace(\"/usage\", \"\").trim();\n\n if (arg === \"reset\") {\n resetUsage();\n await ctx.reply(\"\u2713 Usage stats reset.\");\n return true;\n }\n\n const models = loadModels();\n const costTable = new Map<string, { input: number; output: number }>();\n for (const [id, entry] of Object.entries(models)) {\n costTable.set(id, entry.cost);\n }\n\n const now = Date.now();\n const startOfToday = new Date().setHours(0, 0, 0, 0);\n const startOfYesterday = startOfToday - 86_400_000;\n const startOfDayBefore = startOfYesterday - 86_400_000;\n\n const today = readUsage(startOfToday, costTable);\n const yesterday = readUsage(startOfYesterday, costTable);\n const dayBefore = readUsage(startOfDayBefore, costTable);\n const week = readUsage(now - 7 * 86_400_000, costTable);\n const month = readUsage(now - 30 * 86_400_000, costTable);\n\n // Subtract to get single-day values\n const yIn = yesterday.inputTokens - today.inputTokens;\n const yOut = yesterday.outputTokens - today.outputTokens;\n const yCost = yesterday.cost - today.cost;\n const dbIn = dayBefore.inputTokens - yesterday.inputTokens;\n const dbOut = dayBefore.outputTokens - yesterday.outputTokens;\n const dbCost = dayBefore.cost - yesterday.cost;\n\n const fmt = (n: number): string => n >= 1_000_000 ? `${(n / 1_000_000).toFixed(1)}M` : n >= 1000 ? `${(n / 1000).toFixed(1)}k` : String(n);\n const fmtCost = (c: number): string => c < 0.01 ? `$${c.toFixed(4)}` : `$${c.toFixed(2)}`;\n\n let msg = `\uD83D\uDCCA Token usage\\n\\n`;\n msg += `Today: ${fmt(today.inputTokens)} / ${fmt(today.outputTokens)} \u2014 ${fmtCost(today.cost)}\\n`;\n msg += `Yesterday: ${fmt(yIn)} / ${fmt(yOut)} \u2014 ${fmtCost(yCost)}\\n`;\n msg += `Day before: ${fmt(dbIn)} / ${fmt(dbOut)} \u2014 ${fmtCost(dbCost)}\\n`;\n msg += `Last 7d: ${fmt(week.inputTokens)} / ${fmt(week.outputTokens)} \u2014 ${fmtCost(week.cost)}\\n`;\n msg += `Last 30d: ${fmt(month.inputTokens)} / ${fmt(month.outputTokens)} \u2014 ${fmtCost(month.cost)}\\n`;\n\n if (arg === \"detail\") {\n msg += `\\n\uD83D\uDCCB Today by model:\\n`;\n for (const [model, stats] of today.byModel) {\n msg += ` ${model}: ${fmt(stats.in)}/${fmt(stats.out)} \u2014 ${fmtCost(stats.cost)}\\n`;\n }\n }\n\n // OpenRouter credits\n const { fetchOpenRouterCredits } = await import(\"../openrouter-credits.js\");\n const credits = await fetchOpenRouterCredits();\n if (credits) {\n msg += `\\n\uD83D\uDCB3 OpenRouter: $${credits.remaining.toFixed(2)} remaining ($${credits.purchased.toFixed(2)} purchased, $${credits.used.toFixed(2)} used)`;\n }\n\n await ctx.reply(msg.trim());\n return true;\n}\n\n// \u2500\u2500 /openrouter command \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport async function handleOpenRouter(_text: string, ctx: CommandContext): Promise<boolean> {\n const { fetchOpenRouterCredits } = await import(\"../openrouter-credits.js\");\n const credits = await fetchOpenRouterCredits();\n if (!credits) {\n await ctx.reply(\"\u274C OpenRouter API key not set or request failed.\");\n return true;\n }\n await ctx.reply(\n `\uD83D\uDCB3 OpenRouter credits\\n\\nPurchased: $${credits.purchased.toFixed(2)}\\nUsed: $${credits.used.toFixed(2)}\\nRemaining: $${credits.remaining.toFixed(2)}`,\n );\n return true;\n}\n\n// \u2500\u2500 /whoami command \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport async function handleWhoami(_text: string, ctx: CommandContext): Promise<boolean> {\n const { loadUsers } = await import(\"../user-registry.js\");\n const reg = loadUsers();\n const CLASS_NAMES = [\"UNCLASSIFIED\", \"RESTRICTED\", \"CONFIDENTIAL\", \"SECRET\"];\n const user = ctx.userId ? reg.byUserId.get(ctx.userId) : undefined;\n if (user) {\n const clearance = CLASS_NAMES[user.maxClass] ?? `class ${user.maxClass}`;\n await ctx.reply(`${user.displayName ?? user.userId} (${user.role}, ${clearance} clearance)`);\n } else {\n await ctx.reply(`${ctx.userId ?? \"unknown\"} (unregistered)`);\n }\n return true;\n}\n", "import { getEnv } from \"./env-schema.js\";\n/**\n * Telegram /nlm command handler \u2014 calls `nlm` CLI directly.\n *\n * Subcommands:\n * /nlm list \u2014 List notebooks\n * /nlm create <name> \u2014 Create a new notebook\n * /nlm sources <notebook> \u2014 List sources in a notebook\n * /nlm query <question> \u2014 Query the default notebook\n */\n\nimport { execFile } from \"node:child_process\";\nimport { logError, logDebug, logInfo } from \"./logger.js\";\nimport { logAndSwallow } from \"./log-and-swallow.js\";\n\nconst TAG = \"NLMCommand\";\nconst TIMEOUT_MS = 120_000; // 2 minutes \u2014 NLM queries can be slow\n\nexport type NLMCommandResult = { text: string };\n\nexport type NLMConfig = {\n enabled: boolean;\n defaultNotebook: string; // notebook ID (not name)\n};\n\nexport function loadNLMConfig(): NLMConfig {\n const raw = String(getEnv().notebooklmEnabled);\n return {\n enabled: raw === \"true\" || raw === \"1\",\n defaultNotebook: getEnv().notebooklmDefaultNotebook,\n };\n}\n\n/** Execute `nlm` CLI and return stdout. */\nfunction nlmExec(args: string[]): Promise<{ ok: true; data: string } | { ok: false; error: string }> {\n const start = Date.now();\n logDebug(TAG, `nlm ${args.join(\" \")}`);\n\n return new Promise((resolve) => {\n const ac = new AbortController();\n const timer = setTimeout(() => ac.abort(), TIMEOUT_MS);\n\n try {\n execFile(\"nlm\", args, { signal: ac.signal, maxBuffer: 10 * 1024 * 1024 }, (err, stdout, stderr) => {\n clearTimeout(timer);\n logDebug(TAG, `nlm completed in ${Date.now() - start}ms`);\n\n if (err) {\n if (err.name === \"AbortError\" || (err as NodeJS.ErrnoException).code === \"ABORT_ERR\") {\n resolve({ ok: false, error: `Timeout after ${TIMEOUT_MS / 1000}s` });\n return;\n }\n resolve({ ok: false, error: stderr?.trim() || err.message });\n return;\n }\n resolve({ ok: true, data: stdout.trim() });\n });\n } catch (err) {\n clearTimeout(timer);\n resolve({ ok: false, error: err instanceof Error ? err.message : String(err) });\n }\n });\n}\n\nexport async function handleNLMCommand(args: string, config: NLMConfig): Promise<NLMCommandResult> {\n if (!config.enabled) {\n return { text: \"\uD83D\uDCDA Knowledge base is disabled.\" };\n }\n\n const parts = args.split(/\\s+/).filter(Boolean);\n const sub = parts[0] ?? \"\";\n\n try {\n switch (sub) {\n case \"list\": return await handleList();\n case \"create\": return await handleCreate(parts.slice(1).join(\" \"));\n case \"sources\": return await handleSources(parts[1] ?? \"\");\n case \"query\": return await handleQuery(parts.slice(1).join(\" \"), config);\n default:\n return { text: \"Usage: /nlm list | /nlm create <name> | /nlm sources <notebook-id> | /nlm query <question>\" };\n }\n } catch (err) {\n logError(TAG, \"NLM command failed\", err);\n return { text: `\u274C NLM error: ${err instanceof Error ? err.message : String(err)}` };\n }\n}\n\nasync function handleList(): Promise<NLMCommandResult> {\n const result = await nlmExec([\"notebook\", \"list\", \"--json\"]);\n if (!result.ok) return { text: `\u274C ${result.error}` };\n\n try {\n const notebooks = JSON.parse(result.data);\n if (!Array.isArray(notebooks) || notebooks.length === 0) return { text: \"\uD83D\uDCDA No notebooks found.\" };\n const lines = notebooks.map((n: Record<string, unknown>) =>\n `\u2022 ${n.title ?? n.name ?? \"?\"} (${n.id ?? n.notebook_id ?? \"?\"})`\n );\n return { text: `\uD83D\uDCDA Notebooks:\\n\\n${lines.join(\"\\n\")}` };\n } catch (err) {\n logAndSwallow(TAG, \"JSON.parse notebook list\", err);\n return { text: `\uD83D\uDCDA ${result.data}` };\n }\n}\n\nasync function handleCreate(name: string): Promise<NLMCommandResult> {\n if (!name) return { text: \"Usage: /nlm create <name>\" };\n const result = await nlmExec([\"notebook\", \"create\", name, \"--json\"]);\n if (!result.ok) return { text: `\u274C ${result.error}` };\n\n try {\n const parsed = JSON.parse(result.data);\n const id = parsed.notebook_id ?? parsed.id ?? \"?\";\n logInfo(TAG, `Created notebook \"${name}\" \u2192 ${id}`);\n return { text: `\u2705 Notebook \"${name}\" created (${id})` };\n } catch (err) {\n logAndSwallow(TAG, \"JSON.parse notebook create\", err);\n return { text: `\u2705 ${result.data}` };\n }\n}\n\nasync function handleSources(notebookId: string): Promise<NLMCommandResult> {\n if (!notebookId) return { text: \"Usage: /nlm sources <notebook-id>\" };\n const result = await nlmExec([\"source\", \"list\", notebookId, \"--json\"]);\n if (!result.ok) return { text: `\u274C ${result.error}` };\n\n try {\n const sources = JSON.parse(result.data);\n if (!Array.isArray(sources) || sources.length === 0) return { text: `\uD83D\uDCC4 No sources in notebook.` };\n const lines = sources.map((s: Record<string, unknown>) =>\n `\u2022 [${s.type ?? s.source_type ?? \"?\"}] ${s.title ?? s.name ?? \"?\"}`\n );\n return { text: `\uD83D\uDCC4 Sources:\\n\\n${lines.join(\"\\n\")}` };\n } catch (err) {\n logAndSwallow(TAG, \"JSON.parse source list\", err);\n return { text: `\uD83D\uDCC4 ${result.data}` };\n }\n}\n\nasync function handleQuery(question: string, config: NLMConfig): Promise<NLMCommandResult> {\n if (!question) return { text: \"Usage: /nlm query <question>\" };\n const nbId = config.defaultNotebook;\n if (!nbId) return { text: \"\u274C No default notebook configured (NOTEBOOKLM_DEFAULT_NOTEBOOK).\" };\n\n const result = await nlmExec([\"notebook\", \"query\", nbId, question, \"--json\"]);\n if (!result.ok) return { text: `\u274C ${result.error}` };\n\n try {\n const parsed = JSON.parse(result.data);\n const answer = parsed.answer ?? parsed.response ?? result.data;\n const sources = parsed.sources_used ?? parsed.citations ?? [];\n const citations = Array.isArray(sources) && sources.length > 0\n ? `\\n\\n\uD83D\uDCCE Sources: ${sources.map((s: Record<string, unknown>) => s.title ?? s.name ?? s.source_name ?? \"?\").join(\", \")}`\n : \"\";\n logInfo(TAG, `Query OK \u2014 answerLen=${String(answer).length}`);\n return { text: `\uD83D\uDCDA ${answer}${citations}` };\n } catch (err) {\n logAndSwallow(TAG, \"JSON.parse query result\", err);\n return { text: `\uD83D\uDCDA ${result.data}` };\n }\n}\n", "import { handleNLMCommand } from \"../nlm-command-handler.js\";\nimport type { CommandContext } from \"./types.js\";\n\n\nexport async function handleMemory(_text: string, ctx: CommandContext): Promise<boolean> {\n if (!ctx.memory) { await ctx.reply(\"\uD83E\uDDE0 Memory is disabled.\"); return true; }\n const stats = ctx.memory.getStats(ctx.userId);\n if (!stats) { await ctx.reply(\"\u26A0\uFE0F Could not retrieve memory stats.\"); return true; }\n const dbMb = (stats.dbSizeBytes / (1024 * 1024)).toFixed(1);\n const types = Object.entries(stats.extractedByType).map(([t, n]) => ` ${t}: ${n}`).join(\"\\n\") || \" (none)\";\n const msg = [\n \"\uD83E\uDDE0 Memory Status\", \"\",\n `\uD83D\uDCAC Raw messages: ${stats.totalMessages}`,\n `\uD83E\uDDE9 Extracted memories: ${stats.extractedMemories}`, types,\n `\uD83D\uDD11 Preserved keywords: ${stats.preservedKeywords}`, \"\",\n `\uD83D\uDCC4 Consolidations:`,\n ` daily: ${stats.consolidationFiles.daily}`,\n ` weekly: ${stats.consolidationFiles.weekly}`,\n ` quarterly: ${stats.consolidationFiles.quarterly}`, \"\",\n `\uD83D\uDCC4 Ingested documents: ${stats.ingestedDocuments}`,\n `\uD83D\uDC93 Heartbeat: ${stats.heartbeatRunning ? \"running\" : \"stopped\"}`,\n `\uD83D\uDCBE DB size: ${dbMb} MB`, \"\",\n `\uD83D\uDCDA Layer 6 (NotebookLM): ${ctx.nlmConfig.enabled ? \"enabled\" : \"disabled\"}`,\n ].join(\"\\n\");\n await ctx.reply(msg);\n return true;\n}\n\nexport async function handleFacts(_text: string, ctx: CommandContext): Promise<boolean> {\n if (ctx.memory) {\n const facts = ctx.memory.readCoreKnowledge();\n await ctx.reply(facts ? `\uD83D\uDCCB Core knowledge:\\n\\n${facts}` : \"\uD83D\uDCCB No core knowledge yet.\");\n } else {\n await ctx.reply(\"\uD83E\uDDE0 Memory is disabled.\");\n }\n return true;\n}\n\nexport async function handleNlm(text: string, ctx: CommandContext): Promise<boolean> {\n const args = text.slice(\"/nlm\".length).trim();\n const result = await handleNLMCommand(args, ctx.nlmConfig as any);\n await ctx.reply(result.text);\n return true;\n}\n", "import { spawn } from \"node:child_process\";\nimport { readFileSync, readdirSync, unlinkSync} from \"node:fs\";\nimport { join } from \"node:path\";\nimport { platform } from \"node:os\";\nimport { logInfo} from \"../logger.js\";\nimport { logAndSwallow } from \"../log-and-swallow.js\";\nimport { getEnv } from \"../env-schema.js\";\nimport { writeSleepStatus, readBridgeLockField, writeForceSleep } from \"../transport/bridge-lock-transport.js\";\nimport type { CommandContext } from \"./types.js\";\nimport { setWakeInhibitPid } from \"./registry.js\";\n\nconst TAG = \"cmd\";\n\nexport async function handleSleep(_text: string, ctx: CommandContext): Promise<boolean> {\n const sleepStatus = readBridgeLockField<string>(\"sleepStatus\") ?? \"awake\";\n const progress = ctx.sleepProgress?.();\n const force = readBridgeLockField<string>(\"forceSleep\");\n const bedTime = getEnv().bedTime.raw;\n const auditDir = ctx.memoryConfig?.memoryDir ? join(ctx.memoryConfig.memoryDir, \"sleep\") : \"\";\n const lock = auditDir ? readLatestSleepLock(auditDir) : null;\n\n const lines: string[] = [\"\uD83D\uDE34 Sleep status\"];\n const stateLabel = progress ? `\uD83E\uDDE0 Sleep cycle running (${progress.step}, ${progress.percent}%)` : sleepStatus === \"sleeping\" ? \"\uD83D\uDE34 Asleep (idle)\" : sleepStatus === \"hw_sleep\" ? \"\uD83D\uDE34 Hardware sleep\" : \"\uD83D\uDC4B Awake\";\n lines.push(` State: ${stateLabel}`);\n if (lock) {\n const counts = Object.values(lock.steps);\n const ok = counts.filter(s => s.status === \"ok\").length;\n const failed = counts.filter(s => s.status === \"failed\").length;\n const skipped = counts.filter(s => s.status === \"skipped\").length;\n lines.push(` Last cycle: ${lock.date} \u2014 ${ok} ok, ${failed} failed, ${skipped} skipped (${lock.status}, ${lock.llmCalls} LLM calls)`);\n } else {\n lines.push(\" Last cycle: (none found)\");\n }\n lines.push(` Schedule: BED_TIME=${bedTime}`);\n if (force) lines.push(` Force-trigger: ${force}`);\n lines.push(\"\");\n lines.push(\"/sleep resume \u2014 retry failed steps\");\n lines.push(\"/sleep now \u2014 full fresh cycle\");\n await ctx.reply(lines.join(\"\\n\"));\n return true;\n}\n\nexport async function handleSleepSub(text: string, ctx: CommandContext): Promise<boolean> {\n const sub = text.replace(/^\\/sleep\\s+/i, \"\").trim().toLowerCase();\n const sleepStatus = readBridgeLockField<string>(\"sleepStatus\") ?? \"awake\";\n\n if (sleepStatus === \"sleeping\") {\n await ctx.reply(\"\uD83D\uDE34 Sleep already running.\");\n return true;\n }\n\n const auditDir = ctx.memoryConfig?.memoryDir ? join(ctx.memoryConfig.memoryDir, \"sleep\") : \"\";\n\n if (sub === \"resume\") {\n const lock = auditDir ? readLatestSleepLock(auditDir) : null;\n const hasFailed = lock && Object.values(lock.steps).some(s => s.status === \"failed\");\n if (!lock || lock.status === \"completed\" || !hasFailed) {\n await ctx.reply(\"No failed sleep cycle to resume \u2014 use /sleep now for a fresh run.\");\n return true;\n }\n writeForceSleep(\"resume via /sleep resume\");\n await ctx.reply(\"Sleep resume queued\");\n logInfo(TAG, \"Sleep resume triggered via /sleep resume\");\n return true;\n }\n\n if (sub === \"now\") {\n if (auditDir) {\n try { unlinkSync(todayLockPath(auditDir)); } catch (err) { logAndSwallow(\"command_handlers\", \"op\", err); }\n }\n writeForceSleep(\"fresh via /sleep now\");\n await ctx.reply(\"\u26A1 Fresh sleep cycle queued \u2014 starts on next heartbeat tick (\u22645min)\");\n logInfo(TAG, \"Fresh sleep triggered via /sleep now\");\n return true;\n }\n\n await ctx.reply(\"Unknown subcommand. Use /sleep, /sleep resume, or /sleep now.\");\n return true;\n}\n\nexport async function handleWakeup(_text: string, ctx: CommandContext): Promise<boolean> {\n if (readBridgeLockField(\"sleepStatus\") !== \"hw_sleep\") {\n await ctx.reply(\"Already awake.\");\n return true;\n }\n const os = platform();\n let child: ReturnType<typeof spawn> | null = null;\n if (os === \"darwin\") {\n child = spawn(\"caffeinate\", [\"-su\"], { stdio: \"ignore\", detached: true });\n } else if (os === \"linux\") {\n child = spawn(\"systemd-inhibit\", [\"--what=idle:sleep\", \"sleep\", \"infinity\"], { stdio: \"ignore\", detached: true });\n }\n if (child?.pid) {\n child.unref();\n setWakeInhibitPid(child.pid);\n writeSleepStatus(\"awake\");\n const bedTime = getEnv().bedTime.raw;\n await ctx.reply(`\u2600\uFE0F Awake! Will sleep again at ${bedTime} or when requested.`);\n logInfo(\"wakeup\", `Emergency wake \u2014 inhibit pid=${child.pid}`);\n } else {\n writeSleepStatus(\"awake\");\n await ctx.reply(\"\u2600\uFE0F Awake! (sleep inhibitor not available on this platform)\");\n }\n return true;\n}\n\n// \u2500\u2500 /sleep \u2014 status + force-trigger \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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\nfunction readLatestSleepLock(auditDir: string): { date: string; status: string; llmCalls: number; steps: Record<string, { status: string }> } | null {\n try {\n const files = readdirSync(auditDir).filter(f => f.startsWith(\"sleep_\") && f.endsWith(\".lock\")).sort();\n if (files.length === 0) return null;\n const latest = files[files.length - 1]!;\n const raw = JSON.parse(readFileSync(join(auditDir, latest), \"utf-8\"));\n const dateMatch = latest.match(/sleep_(\\d{4})(\\d{2})(\\d{2})/);\n const date = dateMatch ? `${dateMatch[1]}-${dateMatch[2]}-${dateMatch[3]}` : \"unknown\";\n return { date, status: raw.status ?? \"unknown\", llmCalls: raw.llmCalls ?? 0, steps: raw.steps ?? {} };\n } catch (err) { logAndSwallow(TAG, \"readLastSleepAudit\", err); return null; }\n}\n\nfunction todayLockPath(auditDir: string): string {\n const d = new Date();\n const ds = `${d.getFullYear()}${String(d.getMonth() + 1).padStart(2, \"0\")}${String(d.getDate()).padStart(2, \"0\")}`;\n return join(auditDir, `sleep_${ds}.lock`);\n}\n", "import { execAsync } from \"./exec-async.js\";\nimport { logError } from \"../logger.js\";\nimport { logAndSwallow } from \"../log-and-swallow.js\";\nimport type { CommandContext } from \"./types.js\";\n\nconst TAG = \"cmd_tasks\";\n\n\nexport async function handleTasksList(_text: string, ctx: CommandContext): Promise<boolean> {\n const tz = process.env[\"TZ\"] || Intl.DateTimeFormat().resolvedOptions().timeZone;\n const now = new Date().toLocaleString(\"en-GB\", { timeZone: tz, dateStyle: \"medium\", timeStyle: \"medium\" });\n let listing: string;\n try {\n const { readEntries } = await import(\"../tasks/task-store.js\");\n const entries = readEntries();\n const active = entries.filter((e: any) => !e.fired);\n active.sort((a: any, b: any) => {\n const timeOf = (e: any): number => {\n const s = e.schedule;\n if (!s) return e.fireAt ?? 0;\n const parts = s.split(\" \");\n return (parseInt(parts[1] ?? \"0\", 10) * 60) + parseInt(parts[0] ?? \"0\", 10);\n };\n return timeOf(a) - timeOf(b);\n });\n const today = new Date();\n const dow = today.getDay();\n const lines = active.map((e: any) => {\n const sched = e.schedule ?? \"one-shot\";\n let runsToday = true;\n if (sched !== \"one-shot\") {\n const parts = sched.split(\" \");\n const dowField = parts[4] ?? \"*\";\n if (dowField !== \"*\") {\n const allowed = new Set<number>();\n for (const seg of dowField.split(\",\")) {\n if (seg.includes(\"-\")) {\n const [a, b] = seg.split(\"-\").map(Number);\n for (let i = a; i <= b; i++) allowed.add(i);\n } else allowed.add(Number(seg));\n }\n runsToday = allowed.has(dow);\n }\n }\n const succeeded = e.history?.some((h: any) => h.exitCode === 0 && new Date(h.ts).toDateString() === today.toDateString());\n const failed = e.history?.some((h: any) => h.exitCode !== undefined && h.exitCode !== 0 && new Date(h.ts).toDateString() === today.toDateString());\n const started = e.lastRanAt && new Date(e.lastRanAt).toDateString() === today.toDateString();\n const running = ctx.cronCurrentJob?.entryId === e.id;\n const tick = e.paused ? \"\u23F8\" : !runsToday ? \"\u2014\" : succeeded ? \"\u2713\" : running ? \"~\" : failed ? \"\u2717\" : started ? \"\u2717\" : \"+\";\n const label = e.title || e.message.split(\"\\n\")[0].replace(/[~\\/][\\w.\\/-]+\\//g, \"\").slice(0, 30);\n return `${tick} ${e.id.padEnd(22)}${sched.padEnd(16)}${label}`;\n });\n listing = lines.length > 0 ? \"<pre>\" + lines.join(\"\\n\") + \"</pre>\" : \"(no active entries)\";\n } catch (err) {\n logError(\"tasks\", `Failed to read cron: ${err instanceof Error ? err.message : String(err)}`);\n listing = \"(no active entries)\";\n }\n let running = \"\";\n if (ctx.cronCurrentJob) {\n const j = ctx.cronCurrentJob;\n const ago = Math.round((Date.now() - j.startedAt) / 1000);\n running = `\\n\u25B6 Running: ${j.type} (pid ${j.pid}, ${ago}s ago)\\n ${j.entryId}`;\n }\n await ctx.reply(`\u23F0 ${now}\\n\\n${listing}${running}`, { parseMode: \"HTML\" });\n return true;\n}\n\nexport async function handleTasksTrigger(text: string, ctx: CommandContext): Promise<boolean> {\n const id = text.replace(/^\\/(tasks?|cron) run /, \"\").trim();\n if (!id) { await ctx.reply(\"Usage: /task run <cron-id>\"); return true; }\n const err = ctx.enqueueCron?.(id, true);\n await ctx.reply(err ?? `\u23F3 Running: ${id}`);\n return true;\n}\n\nexport async function handleTasksLog(text: string, ctx: CommandContext): Promise<boolean> {\n const id = text.replace(/^\\/(tasks?|cron) log /, \"\").trim();\n const placeholderId = await ctx.reply(\"\uD83D\uDCCB Loading task log...\");\n try {\n const raw = await execAsync(\"abtars-task\", [\"history\", id], 5000);\n if (!raw) throw new Error(\"empty\");\n const data = JSON.parse(raw);\n if (!data.ok) {\n const msg = `\u274C ${data.error}`;\n if (placeholderId !== undefined && ctx.editReply) await ctx.editReply(placeholderId, msg);\n else await ctx.reply(msg);\n return true;\n }\n const runs = (data.runs as { ranAt: string; exitCode?: number }[]).slice(-5);\n const lines = runs.map(r => `${r.ranAt} exit=${r.exitCode ?? \"?\"}`);\n const body = `\uD83D\uDCCB ${data.message}\\n\\n\\`\\`\\`\\n${lines.join(\"\\n\") || \"(no runs)\"}\\n\\`\\`\\``;\n if (placeholderId !== undefined && ctx.editReply) await ctx.editReply(placeholderId, body);\n else await ctx.reply(body, { parseMode: \"Markdown\" });\n } catch (err) {\n logAndSwallow(TAG, \"read task history\", err);\n const msg = \"\u274C Failed to read history\";\n if (placeholderId !== undefined && ctx.editReply) await ctx.editReply(placeholderId, msg);\n else await ctx.reply(msg);\n }\n return true;\n}\n\nexport async function handleTaskPause(text: string, ctx: CommandContext): Promise<boolean> {\n const match = text.match(/^\\/(tasks?|cron)\\s+(pause|resume)\\s+(.+)/i);\n if (!match) { await ctx.reply(\"Usage: /task pause|resume <id>\"); return true; }\n const action = match[2]!.toLowerCase();\n const id = match[3]!.trim();\n try {\n const raw = await execAsync(\"abtars-task\", [action, id], 5000);\n const data = JSON.parse(raw || \"{}\");\n await ctx.reply(data.ok ? `\u2713 ${id} ${action}d` : `\u274C ${data.error ?? \"unknown error\"}`);\n } catch (err) {\n await ctx.reply(`\u274C Failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n return true;\n}\n", "import { execAsync } from \"./exec-async.js\";\nimport { readdirSync} from \"node:fs\";\nimport { join } from \"node:path\";\nimport { logAndSwallow } from \"../log-and-swallow.js\";\nimport { abtarsHome } from \"../../paths.js\";\nimport type { CommandContext } from \"./types.js\";\n\nconst TAG = \"cmd_admin\";\n\n\nexport async function handleUsers(text: string, ctx: CommandContext): Promise<boolean> {\n const { loadUsers } = await import(\"../user-registry.js\");\n const parts = text.trim().split(/\\s+/);\n const sub = parts[1];\n\n if (sub === \"approve\" && parts[2]) {\n const platformId = parts[2];\n const { writeFileSync, readFileSync } = await import(\"node:fs\");\n const { join } = await import(\"node:path\");\n const { abtarsHome } = await import(\"../../paths.js\");\n const configPath = join(abtarsHome(), \"config\", \"users.json\");\n try {\n const raw = JSON.parse(readFileSync(configPath, \"utf-8\"));\n const users = Array.isArray(raw.users) ? raw.users : [];\n if (users.some((u: { platforms?: { telegram?: number } }) => String(u.platforms?.telegram) === platformId)) {\n await ctx.reply(`User with platform ID ${platformId} already exists.`);\n return true;\n }\n const guestId = `guest-${platformId}`;\n users.push({ userId: guestId, role: \"guest\", maxClass: 0, tools: [], platforms: { telegram: parseInt(platformId, 10) || 0 } });\n writeFileSync(configPath, JSON.stringify({ users }, null, 2), \"utf-8\");\n await ctx.reply(`\u2705 Approved guest: ${guestId} (platform ID: ${platformId})`);\n } catch (err) {\n await ctx.reply(`\u274C Failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n return true;\n }\n\n if (sub === \"revoke\" && parts[2]) {\n const targetUserId = parts[2];\n const { writeFileSync, readFileSync } = await import(\"node:fs\");\n const { join } = await import(\"node:path\");\n const { abtarsHome } = await import(\"../../paths.js\");\n const configPath = join(abtarsHome(), \"config\", \"users.json\");\n try {\n const raw = JSON.parse(readFileSync(configPath, \"utf-8\"));\n const users = (Array.isArray(raw.users) ? raw.users : []).filter((u: { userId: string }) => u.userId !== targetUserId);\n writeFileSync(configPath, JSON.stringify({ users }, null, 2), \"utf-8\");\n await ctx.reply(`\u2705 Revoked: ${targetUserId}`);\n } catch (err) {\n await ctx.reply(`\u274C Failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n return true;\n }\n\n // List users\n const registry = loadUsers();\n const CLASS_NAMES = [\"UNCLASSIFIED\", \"RESTRICTED\", \"CONFIDENTIAL\", \"SECRET\"];\n const lines = registry.users.map(u =>\n `\u2022 ${u.userId} (${u.role}, ${CLASS_NAMES[u.maxClass] ?? `class ${u.maxClass}`}) \u2014 tools: ${u.tools.join(\", \") || \"none\"}`\n );\n await ctx.reply(`\uD83D\uDC65 Users (${registry.users.length}):\\n${lines.join(\"\\n\")}\\n\\n/users approve <platformId>\\n/users revoke <userId>`);\n return true;\n}\n\nexport async function handleSkills(_text: string, ctx: CommandContext): Promise<boolean> {\n const base = join(abtarsHome(), \"skills\");\n const groups = [\"core\", \"personal\", \"auto\", \"downloaded\"] as const;\n const sections: string[] = [];\n let total = 0;\n for (const group of groups) {\n const dir = join(base, group);\n try {\n const files = readdirSync(dir, { recursive: true })\n .map(f => String(f))\n .filter(f => f.endsWith(\".md\") && !f.endsWith(\"TOOLS.md\"))\n .sort();\n if (files.length > 0) {\n total += files.length;\n sections.push(`${group} (${files.length}):\\n${files.map(f => ` \u2022 ${f.replace(/\\.md$/, \"\")}`).join(\"\\n\")}`);\n }\n } catch (err) { logAndSwallow(\"command_handlers\", \"op\", err); }\n }\n await ctx.reply(total > 0 ? `\uD83D\uDCDA Skills (${total}):\\n\\n${sections.join(\"\\n\\n\")}` : \"\uD83D\uDCDA No skills found.\");\n return true;\n}\n\nexport async function handleHooks(_text: string, ctx: CommandContext): Promise<boolean> {\n const { getHookSummary } = await import(\"../hooks/hook-system.js\");\n const summary = getHookSummary();\n const lines = [\"\uD83E\uDE9D Hooks:\"];\n for (const { event, hooks } of summary) {\n if (hooks.length === 0) {\n lines.push(` ${event}: (none)`);\n } else {\n lines.push(` ${event}: ${hooks.map(h => `${h.name} (${h.timeout ?? 5000}ms)`).join(\", \")}`);\n }\n }\n await ctx.reply(lines.join(\"\\n\"));\n return true;\n}\n\nexport async function handleMcp(_text: string, ctx: CommandContext): Promise<boolean> {\n const arg = _text.replace(/^\\/mcp\\s*/i, \"\").trim().toLowerCase();\n\n // /mcp start \u2014 master only, start daemon manually\n if (arg === \"start\") {\n const { loadUsers } = await import(\"../user-registry.js\");\n const registry = loadUsers();\n const user = registry.byUserId.get(ctx.userId);\n if (user?.role !== \"master\") { await ctx.reply(\"\u274C /mcp start is master-only.\"); return true; }\n const result = await execAsync(\"mcporter\", [\"daemon\", \"start\"], 10_000);\n await ctx.reply(result ? `\uD83D\uDCE6 mcporter daemon started.\\n${result}` : \"\uD83D\uDCE6 mcporter daemon start failed.\");\n return true;\n }\n\n // Preflight: is mcporter installed? Fast check before placeholder.\n let version = await execAsync(\"mcporter\", [\"--version\"], 2000);\n if (version === null) {\n await ctx.reply(\"\uD83D\uDCE6 mcporter not installed\");\n return true;\n }\n if (!version) version = \"unknown\";\n\n const placeholderId = await ctx.reply(\"\uD83D\uDCE6 Checking MCP servers...\");\n const raw = await execAsync(\"mcporter\", [\"list\", \"--json\"], 15_000);\n\n let body: string;\n if (!raw) {\n body = `\uD83D\uDCE6 MCP: mcporter installed (${version.split(\"\\n\")[0]}) but list failed`;\n } else {\n try {\n const data = JSON.parse(raw) as { servers?: Array<{ name?: string; status?: string; tools?: unknown; prompts?: number; error?: string }> };\n const servers = data.servers ?? [];\n const ok = servers.filter(s => s.status === \"ok\").length;\n const lines = [\n \"\uD83D\uDCE6 MCP status\",\n ` mcporter: installed (${version.split(\"\\n\")[0]})`,\n ` Servers: ${ok}/${servers.length} online`,\n ];\n for (const s of servers) {\n const mark = s.status === \"ok\" ? \"\u2713\" : \"\u2717\";\n const toolCount = Array.isArray(s.tools) ? s.tools.length : (s.tools ?? 0);\n const detail = s.status === \"ok\"\n ? `tools: ${toolCount}${s.prompts ? `, prompts: ${s.prompts}` : \"\"}`\n : (s.error ?? s.status ?? \"error\");\n lines.push(` ${mark} ${s.name ?? \"?\"} (${detail})`);\n }\n body = lines.join(\"\\n\");\n } catch (err) {\n logAndSwallow(TAG, \"JSON.parse mcp list\", err);\n body = \"\uD83D\uDCE6 MCP: installed, list output unparseable\";\n }\n }\n\n if (placeholderId !== undefined && ctx.editReply) {\n await ctx.editReply(placeholderId, body);\n } else {\n await ctx.reply(body);\n }\n return true;\n}\n\n// \u2500\u2500 Local helpers (not exported) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n\nexport async function handleHelp(_text: string, ctx: CommandContext): Promise<boolean> {\n const cmds = [\n \"/reset \u2014 Reload transport + fresh session\",\n \"/reset default \u2014 Restore transport.default.json + fresh session\",\n \"/compact \u2014 Compact context window (summarize + fresh session)\",\n \"/status \u2014 Bridge status, transport, heartbeat\",\n \"/doctor \u2014 Deep probe all subsystems\",\n \"/doctor fix \u2014 Run safe auto-repairs\",\n \"/doctor fix-full \u2014 Full repair (+ FTS rebuild, WAL checkpoint)\",\n \"/mcp \u2014 MCP server status\",\n \"/hooks \u2014 List configured hooks\",\n \"/stop, /ctrlc \u2014 Stop current response\",\n \"/memory \u2014 Memory storage statistics\",\n \"/heartbeat \u2014 Heartbeat diagnostics (tasks, last tick)\",\n \"/models \u2014 Model, transport & agent status\",\n \"/models change \u2014 Switch model/provider (any agent)\",\n \"/models quick <model> \u2014 Instant switch on same provider\",\n \"/models list [provider] \u2014 List providers or models on a provider\",\n \"/models restore \u2014 Undo last model/provider switch\",\n \"/models default \u2014 Factory reset (transport.default.json)\",\n \"/models emergency \u2014 \uD83D\uDEA8 Activate paid hailMary model (manual)\",\n \"/emergency \u2014 Shortcut for /models emergency\",\n \"/models health reset \u2014 Reset model health buckets\",\n \"/tasks \u2014 Scheduled tasks\",\n \"/tasks log <id> \u2014 Last 5 runs for a task\",\n \"/task run <id> \u2014 Manually fire a task\",\n \"/task pause <id> \u2014 Pause a task\",\n \"/task resume <id> \u2014 Resume a paused task\",\n \"/facts \u2014 Core knowledge (user profile + agent notes)\",\n \"/skills \u2014 List loaded skills\",\n \"/session \u2014 List sessions\",\n \"/session new [browse|code|task] \u2014 New session\",\n \"/session <#> \u2014 Switch session\",\n \"/session end [#] \u2014 End session (keep messages)\",\n \"/session kill <#> \u2014 Kill session (wipe messages)\",\n \"/default \u2014 Switch back to default agent\",\n \"/nlm \u2014 Knowledge base (list/create/sources/query)\",\n \"/restart \u2014 Restart CLI session\",\n \"/wakeup \u2014 Wake Mac from sleep (cancel hw_sleep)\",\n \"/sleep \u2014 Sleep status\",\n \"/sleep resume \u2014 Retry failed sleep steps\",\n \"/sleep now \u2014 Full fresh sleep cycle\",\n \"/skill reload \u2014 Regenerate skills catalog\",\n ];\n if (ctx.platform === \"telegram\") {\n cmds.push(\"/full \u2014 Raw output, TTS disabled\", \"/short \u2014 Clean responses (default)\", \"/healing \u2014 Toggle self-healer on/off\");\n }\n cmds.push(\"/help \u2014 Show this help\");\n cmds.push(\"/skills \u2014 List available skills\");\n await ctx.reply(`\uD83D\uDCCB Available commands:\\n\\n${cmds.join(\"\\n\")}`);\n return true;\n}\n", "/**\n * /session command handler (#510).\n */\nimport { logInfo } from \"../logger.js\";\nimport { logAndSwallow } from \"../log-and-swallow.js\";\nimport { parseSessionType, typeLabel } from \"../session-manager.js\";\nimport type { CommandContext } from \"./types.js\";\n\nconst TAG = \"cmd:session\";\n\nexport async function handleSession(text: string, ctx: CommandContext): Promise<boolean> {\n const args = text.replace(/^\\/session\\s*/i, \"\").trim();\n\n // /session (no args) \u2192 list\n if (!args) {\n await ctx.reply(ctx.sessionManager.formatList(ctx.userId, ctx.platform));\n return true;\n }\n\n // /session new [type]\n if (args.startsWith(\"new\")) {\n const typeArg = args.slice(3).trim();\n const type = typeArg ? parseSessionType(typeArg) : \"A\";\n if (!type) {\n await ctx.reply(`Unknown session type: ${typeArg}. Available: browse, code, task`);\n return true;\n }\n const result = ctx.sessionManager.createSession(ctx.userId, ctx.platform, type);\n if (typeof result === \"string\") { await ctx.reply(`\u274C ${result}`); return true; }\n // Init agent session for non-Main types (coding, browse)\n await ctx.sessionManager.initAgentSession(result);\n await ctx.reply(`\u2705 Session #${result.shortIndex} (${typeLabel(result.type)}) created.`);\n logInfo(TAG, `New session ${result.id} for ${ctx.userId}`);\n return true;\n }\n\n // /session end [#]\n if (args.startsWith(\"end\")) {\n const indexStr = args.slice(3).trim();\n const index = indexStr ? parseInt(indexStr, 10) : undefined;\n if (indexStr && isNaN(index!)) { await ctx.reply(\"Usage: /session end [#]\"); return true; }\n const result = ctx.sessionManager.endSession(ctx.userId, ctx.platform, index);\n if (typeof result === \"string\") { await ctx.reply(`\u274C ${result}`); return true; }\n await ctx.reply(`\u2705 Session #${result.shortIndex} (${typeLabel(result.type)}) ended.`);\n logInfo(TAG, `Ended session ${result.id}`);\n return true;\n }\n\n // /session kill #\n if (args.startsWith(\"kill\")) {\n const indexStr = args.slice(4).trim();\n const index = parseInt(indexStr, 10);\n if (isNaN(index)) { await ctx.reply(\"Usage: /session kill <#>\"); return true; }\n const result = ctx.sessionManager.killSession(ctx.userId, ctx.platform, index);\n if (typeof result === \"string\") { await ctx.reply(`\u274C ${result}`); return true; }\n // Wipe messages from abmind\n if (ctx.memory) {\n try {\n const db = (ctx.memory as any).db;\n if (db) db.prepare(\"DELETE FROM messages WHERE session_id = ?\").run(result.id);\n } catch (err) { logAndSwallow(TAG, \"delete session messages\", err); }\n }\n await ctx.reply(`\uD83D\uDDD1\uFE0F Session #${result.shortIndex} (${typeLabel(result.type)}) killed.`);\n logInfo(TAG, `Killed session ${result.id}`);\n return true;\n }\n\n // /session pause [#]\n if (args.startsWith(\"pause\")) {\n const indexStr = args.slice(5).trim();\n const index = indexStr ? parseInt(indexStr, 10) : undefined;\n if (indexStr && isNaN(index!)) { await ctx.reply(\"Usage: /session pause [#]\"); return true; }\n const result = ctx.sessionManager.pauseSession(ctx.userId, ctx.platform, index);\n if (typeof result === \"string\") { await ctx.reply(`\u274C ${result}`); return true; }\n await ctx.reply(`\u23F8 Session #${result.shortIndex} (${typeLabel(result.type)}) paused.`);\n logInfo(TAG, `Paused session ${result.id}`);\n return true;\n }\n\n // /session resume [#]\n if (args.startsWith(\"resume\")) {\n const indexStr = args.slice(6).trim();\n const index = indexStr ? parseInt(indexStr, 10) : undefined;\n if (indexStr && isNaN(index!)) { await ctx.reply(\"Usage: /session resume [#]\"); return true; }\n const result = ctx.sessionManager.resumeSession(ctx.userId, ctx.platform, index);\n if (typeof result === \"string\") { await ctx.reply(`\u274C ${result}`); return true; }\n await ctx.reply(`\u25B6\uFE0F Session #${result.shortIndex} (${typeLabel(result.type)}) resumed.`);\n logInfo(TAG, `Resumed session ${result.id}`);\n return true;\n }\n\n // /session <#> \u2192 switch\n const index = parseInt(args, 10);\n if (!isNaN(index)) {\n const result = ctx.sessionManager.switchSession(ctx.userId, ctx.platform, index);\n if (typeof result === \"string\") { await ctx.reply(`\u274C ${result}`); return true; }\n await ctx.reply(`\uD83D\uDD00 Switched to session #${result.shortIndex} (${typeLabel(result.type)}).`);\n logInfo(TAG, `Switched to session ${result.id}`);\n return true;\n }\n\n await ctx.reply(\"Usage: /session [new [browse|code|task] | end [#] | kill <#> | pause [#] | resume [#] | <#>]\");\n return true;\n}\n", "/**\n * session-manager.ts \u2014 Per-user per-platform session state (#510).\n *\n * Two layers:\n * Transport session: actual ConversationSession (context switch on manual /session commands)\n * Storage session ID: tag written to abmind (changes for both manual and auto-spawn)\n */\n\nimport type { Platform } from \"../types/platform.js\";\nimport type { SubagentRuntime, AgentSession, AgentName } from \"./subagent-runtime.js\";\n\nexport type SessionType = \"A\" | \"B\" | \"C\" | \"T\" | \"P\" | \"S\";\n\nexport interface ManagedSession {\n id: string; // \"1747563282_A_01\"\n shortIndex: number; // 1, 2, 3...\n type: SessionType; // A=Main, B=Browse, C=Code, T=Task\n createdAt: number; // epoch ms\n isTransport: boolean; // true = has own ConversationSession, false = storage tag only\n ended: boolean; // gracefully ended (messages kept)\n paused: boolean; // cooperative interrupt \u2014 agent loop stops between tool calls\n motherId?: string; // session ID of the session that spawned this one (lineage)\n agentSession?: import(\"./subagent-runtime.js\").AgentSession; // sub-transport for C/B/T\n}\n\ninterface PlatformState {\n sessions: ManagedSession[];\n activeIndex: number; // shortIndex of active transport session\n nextIndex: number; // monotonic counter\n}\n\nconst TYPE_LABELS: Record<SessionType, string> = { A: \"Main\", B: \"Browse\", C: \"Code\", T: \"Task\", P: \"Peer\", S: \"System\" };\nconst TYPE_AGENT: Partial<Record<SessionType, AgentName>> = { C: \"coding\", B: \"browsie\", P: \"coding\", S: \"coding\" };\n\nexport function typeLabel(t: SessionType): string { return TYPE_LABELS[t]; }\n\nexport function parseSessionType(input: string): SessionType | null {\n switch (input.toLowerCase()) {\n case \"browse\": return \"B\";\n case \"code\": return \"C\";\n case \"task\": return \"T\";\n default: return null;\n }\n}\n\nexport class SessionManager {\n private readonly states = new Map<string, PlatformState>(); // key = \"userId:platform\"\n private readonly maxSessions: number;\n private runtime: SubagentRuntime | null = null;\n\n constructor(maxSessions = 10) {\n this.maxSessions = maxSessions;\n }\n\n /** Set runtime (called after boot phase creates it). */\n setRuntime(runtime: SubagentRuntime): void {\n this.runtime = runtime;\n }\n\n private stateKey(userId: string, platform: Platform): string {\n return `${userId}:${platform}`;\n }\n\n private getOrCreateState(userId: string, platform: Platform): PlatformState {\n const key = this.stateKey(userId, platform);\n let state = this.states.get(key);\n if (!state) {\n state = { sessions: [], activeIndex: 1, nextIndex: 1 };\n this.states.set(key, state);\n // Create initial main session\n const main = this.allocateSession(state, \"A\", true);\n state.activeIndex = main.shortIndex;\n }\n return state;\n }\n\n private allocateSession(state: PlatformState, type: SessionType, isTransport: boolean, motherId?: string): ManagedSession {\n const idx = state.nextIndex++;\n const ts = Math.floor(Date.now() / 1000);\n const session: ManagedSession = {\n id: `${ts}_${type}_${String(idx).padStart(2, \"0\")}`,\n shortIndex: idx,\n type,\n createdAt: Date.now(),\n isTransport,\n ended: false,\n paused: false,\n motherId,\n };\n state.sessions.push(session);\n return session;\n }\n\n /** Get or create the initial main session. Returns its session ID. */\n getActiveSessionId(userId: string, platform: Platform): string {\n const state = this.getOrCreateState(userId, platform);\n const active = state.sessions.find(s => s.shortIndex === state.activeIndex && !s.ended);\n return active?.id ?? state.sessions[0]!.id;\n }\n\n /** Get the active session entry. */\n getActiveSession(userId: string, platform: Platform): ManagedSession {\n const state = this.getOrCreateState(userId, platform);\n return state.sessions.find(s => s.shortIndex === state.activeIndex && !s.ended) ?? state.sessions[0]!;\n }\n\n /** Initialize agent session for non-Main types. Returns the AgentSession or null. */\n async initAgentSession(session: ManagedSession): Promise<AgentSession | null> {\n const agentName = TYPE_AGENT[session.type];\n if (!agentName || !this.runtime) return null;\n if (session.agentSession) return session.agentSession;\n session.agentSession = await this.runtime.session(agentName);\n return session.agentSession;\n }\n\n /** Create a new transport session. Returns the session or error string. */\n createSession(userId: string, platform: Platform, type: SessionType): ManagedSession | string {\n const state = this.getOrCreateState(userId, platform);\n const alive = state.sessions.filter(s => !s.ended);\n if (alive.length >= this.maxSessions) {\n return `Max sessions reached (${this.maxSessions}). End or kill a session first.`;\n }\n const session = this.allocateSession(state, type, true);\n state.activeIndex = session.shortIndex;\n return session;\n }\n\n /** Create a sub-session ID for auto-spawn (storage tag only, no transport switch). */\n createSubSession(userId: string, platform: Platform, type: SessionType): ManagedSession | string {\n const state = this.getOrCreateState(userId, platform);\n const alive = state.sessions.filter(s => !s.ended);\n if (alive.length >= this.maxSessions) {\n return `Max sessions reached \u2014 auto-spawn skipped.`;\n }\n const active = state.sessions.find(s => s.shortIndex === state.activeIndex && !s.ended);\n return this.allocateSession(state, type, false, active?.id);\n }\n\n /** Switch active transport session. Returns session or error. */\n switchSession(userId: string, platform: Platform, index: number): ManagedSession | string {\n const state = this.getOrCreateState(userId, platform);\n const target = state.sessions.find(s => s.shortIndex === index && !s.ended && s.isTransport);\n if (!target) return `Session #${index} not found or not switchable.`;\n state.activeIndex = target.shortIndex;\n return target;\n }\n\n /** Gracefully end a session (keeps messages). Returns ended session or error. */\n endSession(userId: string, platform: Platform, index?: number): ManagedSession | string {\n const state = this.getOrCreateState(userId, platform);\n const targetIdx = index ?? state.activeIndex;\n const target = state.sessions.find(s => s.shortIndex === targetIdx && !s.ended);\n if (!target) return `Session #${targetIdx} not found.`;\n\n // If ending the last Main session, create a replacement\n const aliveMains = state.sessions.filter(s => s.type === \"A\" && !s.ended);\n if (target.type === \"A\" && aliveMains.length <= 1) {\n target.ended = true;\n const newMain = this.allocateSession(state, \"A\", true);\n state.activeIndex = newMain.shortIndex;\n return target;\n }\n\n target.ended = true;\n // If ending active, switch to main\n if (state.activeIndex === targetIdx) {\n const main = state.sessions.find(s => s.type === \"A\" && !s.ended);\n state.activeIndex = main?.shortIndex ?? 1;\n }\n return target;\n }\n\n /** Kill a session (wipe messages). Returns killed session or error. */\n killSession(userId: string, platform: Platform, index: number): ManagedSession | string {\n const state = this.getOrCreateState(userId, platform);\n const target = state.sessions.find(s => s.shortIndex === index && !s.ended);\n if (!target) return `Session #${index} not found.`;\n\n // If killing active, switch to main first\n if (state.activeIndex === index) {\n const otherMain = state.sessions.find(s => s.type === \"A\" && !s.ended && s.shortIndex !== index);\n if (otherMain) {\n state.activeIndex = otherMain.shortIndex;\n } else {\n // Last Main \u2014 kill it but auto-spawn replacement\n target.ended = true;\n const newMain = this.allocateSession(state, \"A\", true);\n state.activeIndex = newMain.shortIndex;\n return target;\n }\n } else {\n // Killing non-active last Main \u2014 still auto-spawn replacement\n const aliveMains = state.sessions.filter(s => s.type === \"A\" && !s.ended);\n if (target.type === \"A\" && aliveMains.length <= 1) {\n target.ended = true;\n this.allocateSession(state, \"A\", true);\n return target;\n }\n }\n\n target.ended = true;\n return target;\n }\n\n /** List all sessions for a user+platform. */\n listSessions(userId: string, platform: Platform): { sessions: ManagedSession[]; activeIndex: number } {\n const state = this.getOrCreateState(userId, platform);\n return { sessions: state.sessions.filter(s => !s.ended), activeIndex: state.activeIndex };\n }\n\n /** Find a session by ID across all platforms. */\n getSessionById(sessionId: string): ManagedSession | undefined {\n for (const state of this.states.values()) {\n const found = state.sessions.find(s => s.id === sessionId);\n if (found) return found;\n }\n return undefined;\n }\n\n /** Pause a session (cooperative interrupt \u2014 agent loop stops between tool calls). */\n pauseSession(userId: string, platform: Platform, index?: number): ManagedSession | string {\n const state = this.getOrCreateState(userId, platform);\n const targetIdx = index ?? state.activeIndex;\n const target = state.sessions.find(s => s.shortIndex === targetIdx && !s.ended);\n if (!target) return `Session #${targetIdx} not found.`;\n if (target.paused) return `Session #${targetIdx} is already paused.`;\n target.paused = true;\n return target;\n }\n\n /** Resume a paused session. */\n resumeSession(userId: string, platform: Platform, index?: number): ManagedSession | string {\n const state = this.getOrCreateState(userId, platform);\n const targetIdx = index ?? state.activeIndex;\n const target = state.sessions.find(s => s.shortIndex === targetIdx && !s.ended);\n if (!target) return `Session #${targetIdx} not found.`;\n if (!target.paused) return `Session #${targetIdx} is not paused.`;\n target.paused = false;\n return target;\n }\n\n /** End auto-spawn sessions that have been inactive. */\n expireAutoSessions(timeoutMs: number): ManagedSession[] {\n const expired: ManagedSession[] = [];\n const cutoff = Date.now() - timeoutMs;\n for (const state of this.states.values()) {\n for (const s of state.sessions) {\n if (!s.ended && !s.isTransport && s.createdAt < cutoff) {\n s.ended = true;\n expired.push(s);\n }\n }\n }\n return expired;\n }\n\n /** Clear all sessions for a platform (transport destruction). */\n clearPlatform(userId: string, platform: Platform): void {\n this.states.delete(this.stateKey(userId, platform));\n }\n\n /** Clear everything (bridge restart). */\n clearAll(): void {\n this.states.clear();\n }\n\n /** Format session list for display. */\n formatList(userId: string, platform: Platform): string {\n const { sessions, activeIndex } = this.listSessions(userId, platform);\n if (sessions.length === 0) return \"No active sessions.\";\n const lines = sessions.map(s => {\n const marker = s.shortIndex === activeIndex ? \" *\" : \"\";\n const transport = s.isTransport ? \"\" : \" (sub)\";\n const paused = s.paused ? \" \u23F8\" : \"\";\n const mother = s.motherId ? ` \u2190 #${this.getSessionById(s.motherId)?.shortIndex ?? \"?\"}` : \"\";\n const time = new Date(s.createdAt).toLocaleTimeString(\"en-GB\", { hour: \"2-digit\", minute: \"2-digit\" });\n return `#${s.shortIndex} ${typeLabel(s.type)}${transport}${mother} \u2014 ${time}${paused}${marker}`;\n });\n return lines.join(\"\\n\");\n }\n}\n", "/**\n * Unified command handlers for all platforms (Telegram, Discord).\n * Split from the original monolithic command-handlers.ts.\n */\n\nexport type { Reply, CommandContext, CommandHandler, Platform } from \"./types.js\";\nexport { registerCommand, handleCommand, triggerNewSession, triggerResetSession, killWakeInhibit } from \"./registry.js\";\nimport { registerExact, registerPrefix } from \"./registry.js\";\nimport {\n handleNewReset, handleCompact,\n handleStatus, handleDoctor, handleStop, handleWait, handleRestart,\n handleFull, handleShort, handleHealing, handleFacts,\n handleTasksList, handleTasksTrigger, handleTasksLog, handleTaskPause,\n handleEmergencyAlias, handleModels, handleHeartbeat,\n handleMemory, handleNlm, handleWakeup,\n handleSleep, handleSleepSub, handleHelp, handleSkills,\n handleHooks, handleMcp, handleUsers, handleUsage, handleOpenRouter, handleWhoami,\n} from \"./handlers.js\";\nimport { handleSession } from \"./session-handler.js\";\n\n// \u2500\u2500 Exact-match commands \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nregisterExact(\"/reset\", handleNewReset);\nregisterExact(\"/compact\", handleCompact);\nregisterExact(\"/status\", handleStatus);\nregisterExact(\"/doctor\", handleDoctor);\nregisterExact(\"/stop\", handleStop);\nregisterExact(\"/ctrlc\", handleStop);\nregisterExact(\"/wait\", handleWait);\nregisterExact(\"/steer\", handleWait);\nregisterExact(\"/restart\", handleRestart);\nregisterExact(\"/full\", handleFull);\nregisterExact(\"/short\", handleShort);\nregisterExact(\"/healing\", handleHealing);\nregisterExact(\"/facts\", handleFacts);\nregisterExact(\"/tasks\", handleTasksList);\nregisterExact(\"/task\", handleTasksList);\nregisterExact(\"/cron\", handleTasksList);\nregisterExact(\"/memory\", handleMemory);\nregisterExact(\"/heartbeat\", handleHeartbeat);\nregisterExact(\"/models\", handleModels);\nregisterExact(\"/model\", handleModels);\nregisterExact(\"/change\", (_, ctx) => handleModels(\"/model change\", ctx));\nregisterExact(\"/emergency\", handleEmergencyAlias);\nregisterExact(\"/help\", handleHelp);\nregisterExact(\"/users\", handleUsers);\nregisterExact(\"/skills\", handleSkills);\nregisterExact(\"/skill\", handleSkills);\nregisterExact(\"/wakeup\", handleWakeup);\nregisterExact(\"/sleep\", handleSleep);\nregisterExact(\"/mcp\", handleMcp);\nregisterExact(\"/hooks\", handleHooks);\nregisterExact(\"/usage\", handleUsage);\nregisterExact(\"/openrouter\", handleOpenRouter);\nregisterExact(\"/whoami\", handleWhoami);\nregisterExact(\"/session\", handleSession);\n\n// \u2500\u2500 Prefix-match commands \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nregisterPrefix(\"/session \", handleSession);\nregisterPrefix(\"/tasks run \", handleTasksTrigger);\nregisterPrefix(\"/task run \", handleTasksTrigger);\nregisterPrefix(\"/cron run \", handleTasksTrigger);\nregisterPrefix(\"/tasks log \", handleTasksLog);\nregisterPrefix(\"/task log \", handleTasksLog);\nregisterPrefix(\"/cron log \", handleTasksLog);\nregisterPrefix(\"/nlm\", handleNlm);\nregisterPrefix(\"/sleep \", handleSleepSub);\nregisterPrefix(\"/usage \", handleUsage);\nregisterPrefix(\"/task pause \", handleTaskPause);\nregisterPrefix(\"/task resume \", handleTaskPause);\nregisterPrefix(\"/tasks pause \", handleTaskPause);\nregisterPrefix(\"/tasks resume \", handleTaskPause);\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["EdgeTTS", "platform", "TAG", "TAG", "readFileSync", "TAG", "text", "err", "TAG", "hasHooks", "TAG", "getEnv", "writeFileSync", "join", "lines", "provider", "join", "TAG", "join", "tc", "prof", "loadUsers", "execFile", "TAG", "readFileSync", "readdirSync", "join", "TAG", "join", "readdirSync", "readFileSync", "TAG", "readEntries", "running", "readdirSync", "join", "TAG", "loadUsers", "writeFileSync", "readFileSync", "abtarsHome", "platform", "TAG", "index"]
|
|
7
|
+
}
|