abtars 0.3.4-alpha.8 → 0.3.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundle/{_registry.generated-YP5GLSG7.js → _registry.generated-AVR7DK2A.js} +15 -15
- package/bundle/{abmind-lazy-7Z44NODV.js → abmind-lazy-E3YCFKQ5.js} +15 -5
- package/bundle/abtars-browser.js +4 -4
- package/bundle/abtars-cli.js +23 -13
- package/bundle/abtars-cli.js.map +2 -2
- package/bundle/abtars-restart.js +3 -3
- package/bundle/abtars-task.js +3 -3
- package/bundle/abtars.js +385 -466
- package/bundle/abtars.js.map +4 -4
- package/bundle/{acp-raw-client-E6FM45NC.js → acp-raw-client-UCNK3OTU.js} +2 -2
- package/bundle/{action-gate-G2V47NHW.js → action-gate-V4FCBHFB.js} +2 -2
- package/bundle/{agent-api-adapter-WRGEQ6DV.js → agent-api-adapter-7HEPYSIN.js} +3 -3
- package/bundle/{agent-api-rate-limit-WCFXJMGY.js → agent-api-rate-limit-RZSAM3SW.js} +4 -4
- package/bundle/{agent-registry-GHNG2PH3.js → agent-registry-46A2R5KP.js} +7 -7
- package/bundle/{bootstrap-PZIDBPEJ.js → bootstrap-MIHJJSWU.js} +2 -2
- package/bundle/{bridge-lock-transport-4ZH7QTJP.js → bridge-lock-transport-7RSN7OLJ.js} +4 -4
- package/bundle/{browser-D3LZV7ZK.js → browser-F6BCWJWW.js} +6 -6
- package/bundle/{budget-45QOBDWA.js → budget-WUM3SPKW.js} +3 -3
- package/bundle/{capability-JFWX3IQF.js → capability-QVRKGRFC.js} +5 -5
- package/bundle/{chunk-YSKCQH6E.js → chunk-2IYJ4I66.js} +2 -2
- package/bundle/{chunk-W2R2HFOQ.js → chunk-2NLUT5S2.js} +6 -6
- package/bundle/chunk-3BG3AIDP.js +191 -0
- package/bundle/chunk-3BG3AIDP.js.map +7 -0
- package/bundle/{chunk-OKAQICWY.js → chunk-3GQX34S2.js} +3 -3
- package/bundle/{chunk-QROWBWLL.js → chunk-3XZ773BS.js} +2 -2
- package/bundle/{chunk-DYBW4XXL.js → chunk-467SRLLR.js} +2 -2
- package/bundle/{chunk-374NCXFZ.js → chunk-4AILRHUI.js} +10 -8
- package/bundle/chunk-4AILRHUI.js.map +7 -0
- package/bundle/{chunk-GPZNXY2U.js → chunk-4S3H4OK7.js} +4 -4
- package/bundle/{chunk-NDCRWEEJ.js → chunk-4Y5MJQRE.js} +6 -6
- package/bundle/{chunk-FRKW6LWB.js → chunk-55UWKI5C.js} +3 -3
- package/bundle/{chunk-7JN2MMU7.js → chunk-5PNJFDSW.js} +8 -8
- package/bundle/{chunk-LUNA6PM5.js → chunk-5RVOEFGT.js} +4 -2
- package/bundle/{chunk-LUNA6PM5.js.map → chunk-5RVOEFGT.js.map} +2 -2
- package/bundle/{chunk-OXTSWQCX.js → chunk-5Y3FJ2Y7.js} +2 -2
- package/bundle/{chunk-TMUYFERL.js → chunk-6B5ZFUPD.js} +2 -2
- package/bundle/{chunk-65VCEC32.js → chunk-6PA5JBUU.js} +2 -2
- package/bundle/{chunk-C7K6VZNY.js → chunk-BNXV7SZI.js} +21 -12
- package/bundle/chunk-BNXV7SZI.js.map +7 -0
- package/bundle/{chunk-AFREM7FX.js → chunk-CK7YTA2F.js} +2 -2
- package/bundle/{chunk-NRUSRJXR.js → chunk-DZJ5QZFD.js} +2 -2
- package/bundle/{chunk-YRSMGJFP.js → chunk-E67KESEG.js} +2 -2
- package/bundle/{chunk-ZV4IWKDJ.js → chunk-E7XD5UGB.js} +3 -3
- package/bundle/{chunk-CXXU3HAU.js → chunk-EAX5ZZUL.js} +63 -39
- package/bundle/chunk-EAX5ZZUL.js.map +7 -0
- package/bundle/{chunk-PEDX56EL.js → chunk-EFGBM555.js} +2 -2
- package/bundle/{chunk-EQSG2CRM.js → chunk-FGYDIX54.js} +22 -15
- package/bundle/chunk-FGYDIX54.js.map +7 -0
- package/bundle/{chunk-YPAQEQSC.js → chunk-GF6NVNA7.js} +15 -5
- package/bundle/chunk-GF6NVNA7.js.map +7 -0
- package/bundle/{chunk-UNM3OXHB.js → chunk-HGSHCQ5F.js} +110 -72
- package/bundle/{chunk-UNM3OXHB.js.map → chunk-HGSHCQ5F.js.map} +2 -2
- package/bundle/{chunk-VXCETPZU.js → chunk-IMIGG5EO.js} +39 -39
- package/bundle/chunk-IMIGG5EO.js.map +7 -0
- package/bundle/{chunk-P2K2K6XL.js → chunk-ITOFPJAV.js} +44 -32
- package/bundle/chunk-ITOFPJAV.js.map +7 -0
- package/bundle/{chunk-75ATTOW4.js → chunk-IY6UKLPS.js} +3 -3
- package/bundle/{chunk-EUZDKV3C.js → chunk-J4RUFAPK.js} +3 -3
- package/bundle/{chunk-HZDLFLRP.js → chunk-J7DRPVMU.js} +35 -5
- package/bundle/chunk-J7DRPVMU.js.map +7 -0
- package/bundle/{chunk-EGL6UMAO.js → chunk-JG4BKXBN.js} +7 -1
- package/bundle/chunk-JG4BKXBN.js.map +7 -0
- package/bundle/{chunk-N4EB6LA7.js → chunk-JLWYPGWI.js} +5 -5
- package/bundle/{chunk-5QUTMUIK.js → chunk-JXYWDAHD.js} +12 -12
- package/bundle/{chunk-GRVWZO4C.js → chunk-KOSFXW2S.js} +24 -3
- package/bundle/{chunk-GRVWZO4C.js.map → chunk-KOSFXW2S.js.map} +1 -1
- package/bundle/{chunk-M3JEX6L4.js → chunk-L72RIPEC.js} +9 -9
- package/bundle/{chunk-TEFZ4JA4.js → chunk-NHPLD3C7.js} +2 -2
- package/bundle/{chunk-2KC5G3EA.js → chunk-OWUO5RS3.js} +5 -5
- package/bundle/{chunk-4MULJ5SS.js → chunk-OY4Q6AMY.js} +71 -49
- package/bundle/chunk-OY4Q6AMY.js.map +7 -0
- package/bundle/{chunk-WBTJ2E62.js → chunk-P3NODAHF.js} +2 -5
- package/bundle/{chunk-WBTJ2E62.js.map → chunk-P3NODAHF.js.map} +2 -2
- package/bundle/{chunk-SMPHE3ZM.js → chunk-PB5GF4FG.js} +215 -163
- package/bundle/chunk-PB5GF4FG.js.map +7 -0
- package/bundle/{chunk-WYHGNI56.js → chunk-PMD5BLFS.js} +6 -6
- package/bundle/{chunk-URQPDCK5.js → chunk-Q66LQMMZ.js} +3 -3
- package/bundle/{chunk-IHYKTDIP.js → chunk-SC2Y5NR2.js} +36 -119
- package/bundle/chunk-SC2Y5NR2.js.map +7 -0
- package/bundle/chunk-SFL4EPCZ.js +555 -0
- package/bundle/chunk-SFL4EPCZ.js.map +7 -0
- package/bundle/{chunk-LDUOOKQY.js → chunk-SJPUNDZ3.js} +5 -5
- package/bundle/{chunk-LDUOOKQY.js.map → chunk-SJPUNDZ3.js.map} +1 -1
- package/bundle/{chunk-JQDJPUHM.js → chunk-TWB2ZGVH.js} +2 -2
- package/bundle/{chunk-IJT4KWXT.js → chunk-U4U47YE7.js} +2 -2
- package/bundle/{chunk-2FAZIA37.js → chunk-W546CU3A.js} +3 -3
- package/bundle/chunk-WC5O5KOE.js +211 -0
- package/bundle/chunk-WC5O5KOE.js.map +7 -0
- package/bundle/{chunk-JNIHEDKF.js → chunk-XPWYDNWL.js} +2 -2
- package/bundle/{chunk-GWILHZPT.js → chunk-XRTXYN66.js} +10 -7
- package/bundle/{chunk-GWILHZPT.js.map → chunk-XRTXYN66.js.map} +2 -2
- package/bundle/{chunk-EFJVUJBE.js → chunk-Y5FEFKGM.js} +6 -6
- package/bundle/chunk-YJZE4OK3.js +169 -0
- package/bundle/chunk-YJZE4OK3.js.map +7 -0
- package/bundle/{chunk-GVM5YU5I.js → chunk-Z4FZPB42.js} +2 -2
- package/bundle/{chunk-7BSQ5UQO.js → chunk-ZSIDQ66D.js} +3 -3
- package/bundle/{chunk-XX6BGTPO.js → chunk-ZZZCJJEO.js} +4 -4
- package/bundle/{commands-OIISYHTD.js → commands-2ZW6CMLC.js} +17 -16
- package/bundle/{config-M3P5IOAI.js → config-YMY5YHKN.js} +6 -6
- package/bundle/{context-2RJHC2LE.js → context-CL2RSLII.js} +7 -5
- package/bundle/context-CL2RSLII.js.map +7 -0
- package/bundle/{daemon-TB23FFWY.js → daemon-D7SU63OY.js} +3 -3
- package/bundle/{delegation-tools-YATZFKYO.js → delegation-tools-WS7Z56KZ.js} +12 -12
- package/bundle/{deploy-T6R45OZJ.js → deploy-AMTVKIMU.js} +2 -2
- package/bundle/{deps-WVK553KF.js → deps-T63AVJKJ.js} +3 -3
- package/bundle/{direct-api-transport-S2RDH2I7.js → direct-api-transport-QNNY2WWP.js} +51 -32
- package/bundle/direct-api-transport-QNNY2WWP.js.map +7 -0
- package/bundle/{discord-adapter-UTXUWX3A.js → discord-adapter-ABAD56Y2.js} +21 -20
- package/bundle/{discord-adapter-UTXUWX3A.js.map → discord-adapter-ABAD56Y2.js.map} +1 -1
- package/bundle/{dns-wakeup-IDOJIXBX.js → dns-wakeup-V3LEFXPE.js} +9 -33
- package/bundle/dns-wakeup-V3LEFXPE.js.map +7 -0
- package/bundle/{doctor-probes-B54JFIW3.js → doctor-probes-O6YI6XSZ.js} +6 -2
- package/bundle/{env-schema-4JXQUOH4.js → env-schema-B5RB32DC.js} +3 -3
- package/bundle/{gossip-3C3BSNPN.js → gossip-SKRCPOBS.js} +9 -5
- package/bundle/{guardrails-DL7ZSWVN.js → guardrails-64GQ5Y5K.js} +4 -4
- package/bundle/{heartbeat-system-MVTRS4GP.js → heartbeat-system-X4MUTKJD.js} +6 -6
- package/bundle/{heartbeat-tier3-6KH45CL6.js → heartbeat-tier3-2PTPWEQQ.js} +53 -76
- package/bundle/heartbeat-tier3-2PTPWEQQ.js.map +7 -0
- package/bundle/{hook-system-M3POLUIB.js → hook-system-YB635OC4.js} +3 -3
- package/bundle/{hotskills-FWX4QI7V.js → hotskills-Q75D2DK3.js} +5 -5
- package/bundle/{install-OS3CU7NF.js → install-RFKKFSGS.js} +17 -30
- package/bundle/install-RFKKFSGS.js.map +7 -0
- package/bundle/{install-manifest-5PPWMD2W.js → install-manifest-J7ICPCJN.js} +2 -2
- package/bundle/{irc-adapter-PTTZD32W.js → irc-adapter-TVEV4R6H.js} +3 -3
- package/bundle/{irc-config-CP7ZMUOX.js → irc-config-M676FOFI.js} +4 -4
- package/bundle/{kanban-board-M326B2XJ.js → kanban-board-DLEJUCNN.js} +9 -7
- package/bundle/{kanban-channel-IJ52OMNA.js → kanban-channel-XOLUHJZJ.js} +6 -6
- package/bundle/kanban-delivery-C4QPBNPX.js +45 -0
- package/bundle/kanban-delivery-C4QPBNPX.js.map +7 -0
- package/bundle/{lazy-require-KCRVT4SI.js → lazy-require-JKQSALXN.js} +3 -3
- package/bundle/{logger-OWCSNYCA.js → logger-3EGHBD4R.js} +2 -2
- package/bundle/{main-chat-ZNUZCTNS.js → main-chat-3H63REKK.js} +4 -4
- package/bundle/{master-user-HSKM4ZFN.js → master-user-MUBUP3KD.js} +5 -5
- package/bundle/{media-utils-3ZYOD7SK.js → media-utils-HUUIALAJ.js} +3 -3
- package/bundle/{message-pipeline-AUIUNM5R.js → message-pipeline-GRDRWONR.js} +17 -16
- package/bundle/meta.json +2773 -2241
- package/bundle/{metrics-collector-L3VPEHII.js → metrics-collector-YMUGY3PI.js} +31 -2
- package/bundle/metrics-collector-YMUGY3PI.js.map +7 -0
- package/bundle/{model-health-registry-MLEIZSTV.js → model-health-registry-QADMFQFQ.js} +2 -2
- package/bundle/{nerve-IGSXBKZZ.js → nerve-QPAEBRKX.js} +3 -3
- package/bundle/{notification-BFSIEECG.js → notification-3JICGXWU.js} +6 -6
- package/bundle/{openrouter-credits-NTVZDRYM.js → openrouter-credits-7NEIPYJN.js} +3 -3
- package/bundle/{orc-tools-TOD4WHTM.js → orc-tools-UZVPONKY.js} +5 -3
- package/bundle/{peer-auth-QC4EF2PM.js → peer-auth-RI43DKJE.js} +24 -15
- package/bundle/{peer-client-RGEU5HOK.js → peer-client-UITTMWJ2.js} +34 -29
- package/bundle/peer-client-UITTMWJ2.js.map +7 -0
- package/bundle/{peer-config-TN55LFDC.js → peer-config-URM7DCW6.js} +9 -4
- package/bundle/{peer-transport-5VKK2I7P.js → peer-transport-SI7I72DB.js} +12 -10
- package/bundle/{phase-transport-FS6NL4A5.js → phase-transport-ESWWACZI.js} +17 -17
- package/bundle/{reconcile-CTFCLQRN.js → reconcile-GFDQYNBD.js} +3 -3
- package/bundle/{reconciler-NZ4O4BCP.js → reconciler-IEUJXJN2.js} +12 -12
- package/bundle/{restore-IFHPI7I7.js → restore-FARTGLQQ.js} +3 -3
- package/bundle/{rollback-ANRI3T5Z.js → rollback-GEWPZABG.js} +2 -2
- package/bundle/{sandbox-runtime-QROWHDCS.js → sandbox-runtime-DV6E25J6.js} +2 -2
- package/bundle/{self-healer-utils-IFAYOQO2.js → self-healer-utils-P4SKNNEM.js} +3 -3
- package/bundle/{sha-tracker-ZWBP6CIJ.js → sha-tracker-77SHLYNY.js} +3 -3
- package/bundle/{skill-session-VJXTKOKL.js → skill-session-5HSMXY54.js} +3 -3
- package/bundle/{skill-stats-JORH5DGM.js → skill-stats-MI3RSWWL.js} +4 -4
- package/bundle/{skill-watcher-E4MGLKLS.js → skill-watcher-5L7JE6TN.js} +4 -4
- package/bundle/{sleep-BEWAUFCL.js → sleep-I4JFASCY.js} +11 -11
- package/bundle/{soul-bundle-VWAVHCZ6.js → soul-bundle-522C3IRH.js} +9 -8
- package/bundle/{spin-E3ZDEDKT.js → spin-VHNGNWTD.js} +11 -11
- package/bundle/{spin-notifications-SE2HVZI7.js → spin-notifications-7NC5XZEM.js} +5 -5
- package/bundle/{spin-types-OIE67MJK.js → spin-types-C5KOQOPD.js} +7 -3
- package/bundle/{sse-parser-anthropic-A6R4Z2TB.js → sse-parser-anthropic-MMTVWHLI.js} +3 -3
- package/bundle/{sse-parser-responses-HSZY3QGJ.js → sse-parser-responses-3AOFN64C.js} +3 -3
- package/bundle/{ssrf-guard-O6SHIK6Q.js → ssrf-guard-U2JA72TC.js} +3 -3
- package/bundle/{start-7QZIWO3S.js → start-H5IUFAWF.js} +4 -2
- package/bundle/{start-7QZIWO3S.js.map → start-H5IUFAWF.js.map} +2 -2
- package/bundle/{stt-LGVPXMVR.js → stt-PSOPPBV4.js} +4 -4
- package/bundle/{system-status-FAVNIUFJ.js → system-status-4LYGOFNO.js} +38 -24
- package/bundle/system-status-4LYGOFNO.js.map +7 -0
- package/bundle/{task-store-W5BFIAIH.js → task-store-MNCW42BW.js} +4 -4
- package/bundle/{telegram-adapter-4TX7QWKC.js → telegram-adapter-O6KIZDY6.js} +62 -45
- package/bundle/telegram-adapter-O6KIZDY6.js.map +7 -0
- package/bundle/{tool-registry-7FK3OQGL.js → tool-registry-JJMWCQKZ.js} +26 -24
- package/bundle/{tool-sandbox-4UC6GAKA.js → tool-sandbox-CNL6V6IH.js} +4 -4
- package/bundle/{transport-config-KBF5W2DP.js → transport-config-6MB2K2XC.js} +7 -7
- package/bundle/tribe-GDTFYJTK.js +111 -0
- package/bundle/tribe-GDTFYJTK.js.map +7 -0
- package/bundle/{update-CKFP6LBE.js → update-HGQAOC5L.js} +3 -3
- package/bundle/{usage-tracker-NXD364VX.js → usage-tracker-SR4BI6ZT.js} +2 -2
- package/bundle/{user-registry-35BW4XKM.js → user-registry-4PACZJIJ.js} +4 -4
- package/bundle/wire-platform-KKPWNNNQ.js +88 -0
- package/bundle/wire-platform-KKPWNNNQ.js.map +7 -0
- package/bundle/ws-peer-client-U3NNPOK7.js +370 -0
- package/bundle/ws-peer-client-U3NNPOK7.js.map +7 -0
- package/package.json +1 -1
- package/scripts/abtars-watchdog.sh +1 -5
- package/scripts/emergency-deploy.sh +2 -2
- package/scripts/emergency-update.sh +36 -37
- package/bundle/chunk-374NCXFZ.js.map +0 -7
- package/bundle/chunk-4MULJ5SS.js.map +0 -7
- package/bundle/chunk-4S554KLW.js +0 -105
- package/bundle/chunk-4S554KLW.js.map +0 -7
- package/bundle/chunk-C7K6VZNY.js.map +0 -7
- package/bundle/chunk-CXXU3HAU.js.map +0 -7
- package/bundle/chunk-EGL6UMAO.js.map +0 -7
- package/bundle/chunk-EQSG2CRM.js.map +0 -7
- package/bundle/chunk-HT2BPTZY.js +0 -241
- package/bundle/chunk-HT2BPTZY.js.map +0 -7
- package/bundle/chunk-HZDLFLRP.js.map +0 -7
- package/bundle/chunk-IHYKTDIP.js.map +0 -7
- package/bundle/chunk-IKUZPMVA.js +0 -82
- package/bundle/chunk-IKUZPMVA.js.map +0 -7
- package/bundle/chunk-P2K2K6XL.js.map +0 -7
- package/bundle/chunk-PU5HSKWH.js +0 -257
- package/bundle/chunk-PU5HSKWH.js.map +0 -7
- package/bundle/chunk-RWRRGE4U.js +0 -72
- package/bundle/chunk-RWRRGE4U.js.map +0 -7
- package/bundle/chunk-SMPHE3ZM.js.map +0 -7
- package/bundle/chunk-VUIX5AGB.js +0 -65
- package/bundle/chunk-VUIX5AGB.js.map +0 -7
- package/bundle/chunk-VXCETPZU.js.map +0 -7
- package/bundle/chunk-YPAQEQSC.js.map +0 -7
- package/bundle/context-2RJHC2LE.js.map +0 -7
- package/bundle/direct-api-transport-S2RDH2I7.js.map +0 -7
- package/bundle/dns-wakeup-IDOJIXBX.js.map +0 -7
- package/bundle/heartbeat-tier3-6KH45CL6.js.map +0 -7
- package/bundle/install-OS3CU7NF.js.map +0 -7
- package/bundle/metrics-collector-L3VPEHII.js.map +0 -7
- package/bundle/peer-client-RGEU5HOK.js.map +0 -7
- package/bundle/peer-jwt-NCCPXJRX.js +0 -18
- package/bundle/stream-single-RFJNUTL6.js +0 -34
- package/bundle/stream-single-RFJNUTL6.js.map +0 -7
- package/bundle/system-status-FAVNIUFJ.js.map +0 -7
- package/bundle/telegram-adapter-4TX7QWKC.js.map +0 -7
- package/bundle/user-registry-35BW4XKM.js.map +0 -7
- package/bundle/ws-peer-client-AIXCXF7V.js +0 -173
- package/bundle/ws-peer-client-AIXCXF7V.js.map +0 -7
- /package/bundle/{_registry.generated-YP5GLSG7.js.map → _registry.generated-AVR7DK2A.js.map} +0 -0
- /package/bundle/{abmind-lazy-7Z44NODV.js.map → abmind-lazy-E3YCFKQ5.js.map} +0 -0
- /package/bundle/{acp-raw-client-E6FM45NC.js.map → acp-raw-client-UCNK3OTU.js.map} +0 -0
- /package/bundle/{action-gate-G2V47NHW.js.map → action-gate-V4FCBHFB.js.map} +0 -0
- /package/bundle/{agent-api-adapter-WRGEQ6DV.js.map → agent-api-adapter-7HEPYSIN.js.map} +0 -0
- /package/bundle/{agent-api-rate-limit-WCFXJMGY.js.map → agent-api-rate-limit-RZSAM3SW.js.map} +0 -0
- /package/bundle/{agent-registry-GHNG2PH3.js.map → agent-registry-46A2R5KP.js.map} +0 -0
- /package/bundle/{bootstrap-PZIDBPEJ.js.map → bootstrap-MIHJJSWU.js.map} +0 -0
- /package/bundle/{bridge-lock-transport-4ZH7QTJP.js.map → bridge-lock-transport-7RSN7OLJ.js.map} +0 -0
- /package/bundle/{browser-D3LZV7ZK.js.map → browser-F6BCWJWW.js.map} +0 -0
- /package/bundle/{budget-45QOBDWA.js.map → budget-WUM3SPKW.js.map} +0 -0
- /package/bundle/{capability-JFWX3IQF.js.map → capability-QVRKGRFC.js.map} +0 -0
- /package/bundle/{chunk-YSKCQH6E.js.map → chunk-2IYJ4I66.js.map} +0 -0
- /package/bundle/{chunk-W2R2HFOQ.js.map → chunk-2NLUT5S2.js.map} +0 -0
- /package/bundle/{chunk-OKAQICWY.js.map → chunk-3GQX34S2.js.map} +0 -0
- /package/bundle/{chunk-QROWBWLL.js.map → chunk-3XZ773BS.js.map} +0 -0
- /package/bundle/{chunk-DYBW4XXL.js.map → chunk-467SRLLR.js.map} +0 -0
- /package/bundle/{chunk-GPZNXY2U.js.map → chunk-4S3H4OK7.js.map} +0 -0
- /package/bundle/{chunk-NDCRWEEJ.js.map → chunk-4Y5MJQRE.js.map} +0 -0
- /package/bundle/{chunk-FRKW6LWB.js.map → chunk-55UWKI5C.js.map} +0 -0
- /package/bundle/{chunk-7JN2MMU7.js.map → chunk-5PNJFDSW.js.map} +0 -0
- /package/bundle/{chunk-OXTSWQCX.js.map → chunk-5Y3FJ2Y7.js.map} +0 -0
- /package/bundle/{chunk-TMUYFERL.js.map → chunk-6B5ZFUPD.js.map} +0 -0
- /package/bundle/{chunk-65VCEC32.js.map → chunk-6PA5JBUU.js.map} +0 -0
- /package/bundle/{chunk-AFREM7FX.js.map → chunk-CK7YTA2F.js.map} +0 -0
- /package/bundle/{chunk-NRUSRJXR.js.map → chunk-DZJ5QZFD.js.map} +0 -0
- /package/bundle/{chunk-YRSMGJFP.js.map → chunk-E67KESEG.js.map} +0 -0
- /package/bundle/{chunk-ZV4IWKDJ.js.map → chunk-E7XD5UGB.js.map} +0 -0
- /package/bundle/{chunk-PEDX56EL.js.map → chunk-EFGBM555.js.map} +0 -0
- /package/bundle/{chunk-75ATTOW4.js.map → chunk-IY6UKLPS.js.map} +0 -0
- /package/bundle/{chunk-EUZDKV3C.js.map → chunk-J4RUFAPK.js.map} +0 -0
- /package/bundle/{chunk-N4EB6LA7.js.map → chunk-JLWYPGWI.js.map} +0 -0
- /package/bundle/{chunk-5QUTMUIK.js.map → chunk-JXYWDAHD.js.map} +0 -0
- /package/bundle/{chunk-M3JEX6L4.js.map → chunk-L72RIPEC.js.map} +0 -0
- /package/bundle/{chunk-TEFZ4JA4.js.map → chunk-NHPLD3C7.js.map} +0 -0
- /package/bundle/{chunk-2KC5G3EA.js.map → chunk-OWUO5RS3.js.map} +0 -0
- /package/bundle/{chunk-WYHGNI56.js.map → chunk-PMD5BLFS.js.map} +0 -0
- /package/bundle/{chunk-URQPDCK5.js.map → chunk-Q66LQMMZ.js.map} +0 -0
- /package/bundle/{chunk-JQDJPUHM.js.map → chunk-TWB2ZGVH.js.map} +0 -0
- /package/bundle/{chunk-IJT4KWXT.js.map → chunk-U4U47YE7.js.map} +0 -0
- /package/bundle/{chunk-2FAZIA37.js.map → chunk-W546CU3A.js.map} +0 -0
- /package/bundle/{chunk-JNIHEDKF.js.map → chunk-XPWYDNWL.js.map} +0 -0
- /package/bundle/{chunk-EFJVUJBE.js.map → chunk-Y5FEFKGM.js.map} +0 -0
- /package/bundle/{chunk-GVM5YU5I.js.map → chunk-Z4FZPB42.js.map} +0 -0
- /package/bundle/{chunk-7BSQ5UQO.js.map → chunk-ZSIDQ66D.js.map} +0 -0
- /package/bundle/{chunk-XX6BGTPO.js.map → chunk-ZZZCJJEO.js.map} +0 -0
- /package/bundle/{commands-OIISYHTD.js.map → commands-2ZW6CMLC.js.map} +0 -0
- /package/bundle/{config-M3P5IOAI.js.map → config-YMY5YHKN.js.map} +0 -0
- /package/bundle/{daemon-TB23FFWY.js.map → daemon-D7SU63OY.js.map} +0 -0
- /package/bundle/{delegation-tools-YATZFKYO.js.map → delegation-tools-WS7Z56KZ.js.map} +0 -0
- /package/bundle/{deploy-T6R45OZJ.js.map → deploy-AMTVKIMU.js.map} +0 -0
- /package/bundle/{deps-WVK553KF.js.map → deps-T63AVJKJ.js.map} +0 -0
- /package/bundle/{doctor-probes-B54JFIW3.js.map → doctor-probes-O6YI6XSZ.js.map} +0 -0
- /package/bundle/{env-schema-4JXQUOH4.js.map → env-schema-B5RB32DC.js.map} +0 -0
- /package/bundle/{gossip-3C3BSNPN.js.map → gossip-SKRCPOBS.js.map} +0 -0
- /package/bundle/{guardrails-DL7ZSWVN.js.map → guardrails-64GQ5Y5K.js.map} +0 -0
- /package/bundle/{heartbeat-system-MVTRS4GP.js.map → heartbeat-system-X4MUTKJD.js.map} +0 -0
- /package/bundle/{hook-system-M3POLUIB.js.map → hook-system-YB635OC4.js.map} +0 -0
- /package/bundle/{hotskills-FWX4QI7V.js.map → hotskills-Q75D2DK3.js.map} +0 -0
- /package/bundle/{install-manifest-5PPWMD2W.js.map → install-manifest-J7ICPCJN.js.map} +0 -0
- /package/bundle/{irc-adapter-PTTZD32W.js.map → irc-adapter-TVEV4R6H.js.map} +0 -0
- /package/bundle/{irc-config-CP7ZMUOX.js.map → irc-config-M676FOFI.js.map} +0 -0
- /package/bundle/{kanban-board-M326B2XJ.js.map → kanban-board-DLEJUCNN.js.map} +0 -0
- /package/bundle/{kanban-channel-IJ52OMNA.js.map → kanban-channel-XOLUHJZJ.js.map} +0 -0
- /package/bundle/{lazy-require-KCRVT4SI.js.map → lazy-require-JKQSALXN.js.map} +0 -0
- /package/bundle/{logger-OWCSNYCA.js.map → logger-3EGHBD4R.js.map} +0 -0
- /package/bundle/{main-chat-ZNUZCTNS.js.map → main-chat-3H63REKK.js.map} +0 -0
- /package/bundle/{master-user-HSKM4ZFN.js.map → master-user-MUBUP3KD.js.map} +0 -0
- /package/bundle/{media-utils-3ZYOD7SK.js.map → media-utils-HUUIALAJ.js.map} +0 -0
- /package/bundle/{message-pipeline-AUIUNM5R.js.map → message-pipeline-GRDRWONR.js.map} +0 -0
- /package/bundle/{model-health-registry-MLEIZSTV.js.map → model-health-registry-QADMFQFQ.js.map} +0 -0
- /package/bundle/{nerve-IGSXBKZZ.js.map → nerve-QPAEBRKX.js.map} +0 -0
- /package/bundle/{notification-BFSIEECG.js.map → notification-3JICGXWU.js.map} +0 -0
- /package/bundle/{openrouter-credits-NTVZDRYM.js.map → openrouter-credits-7NEIPYJN.js.map} +0 -0
- /package/bundle/{orc-tools-TOD4WHTM.js.map → orc-tools-UZVPONKY.js.map} +0 -0
- /package/bundle/{peer-auth-QC4EF2PM.js.map → peer-auth-RI43DKJE.js.map} +0 -0
- /package/bundle/{peer-config-TN55LFDC.js.map → peer-config-URM7DCW6.js.map} +0 -0
- /package/bundle/{peer-jwt-NCCPXJRX.js.map → peer-transport-SI7I72DB.js.map} +0 -0
- /package/bundle/{peer-transport-5VKK2I7P.js.map → phase-transport-ESWWACZI.js.map} +0 -0
- /package/bundle/{phase-transport-FS6NL4A5.js.map → reconcile-GFDQYNBD.js.map} +0 -0
- /package/bundle/{reconciler-NZ4O4BCP.js.map → reconciler-IEUJXJN2.js.map} +0 -0
- /package/bundle/{restore-IFHPI7I7.js.map → restore-FARTGLQQ.js.map} +0 -0
- /package/bundle/{reconcile-CTFCLQRN.js.map → rollback-GEWPZABG.js.map} +0 -0
- /package/bundle/{sandbox-runtime-QROWHDCS.js.map → sandbox-runtime-DV6E25J6.js.map} +0 -0
- /package/bundle/{self-healer-utils-IFAYOQO2.js.map → self-healer-utils-P4SKNNEM.js.map} +0 -0
- /package/bundle/{rollback-ANRI3T5Z.js.map → sha-tracker-77SHLYNY.js.map} +0 -0
- /package/bundle/{skill-session-VJXTKOKL.js.map → skill-session-5HSMXY54.js.map} +0 -0
- /package/bundle/{sha-tracker-ZWBP6CIJ.js.map → skill-stats-MI3RSWWL.js.map} +0 -0
- /package/bundle/{skill-stats-JORH5DGM.js.map → skill-watcher-5L7JE6TN.js.map} +0 -0
- /package/bundle/{skill-watcher-E4MGLKLS.js.map → sleep-I4JFASCY.js.map} +0 -0
- /package/bundle/{sleep-BEWAUFCL.js.map → soul-bundle-522C3IRH.js.map} +0 -0
- /package/bundle/{soul-bundle-VWAVHCZ6.js.map → spin-VHNGNWTD.js.map} +0 -0
- /package/bundle/{spin-notifications-SE2HVZI7.js.map → spin-notifications-7NC5XZEM.js.map} +0 -0
- /package/bundle/{spin-E3ZDEDKT.js.map → spin-types-C5KOQOPD.js.map} +0 -0
- /package/bundle/{sse-parser-anthropic-A6R4Z2TB.js.map → sse-parser-anthropic-MMTVWHLI.js.map} +0 -0
- /package/bundle/{sse-parser-responses-HSZY3QGJ.js.map → sse-parser-responses-3AOFN64C.js.map} +0 -0
- /package/bundle/{ssrf-guard-O6SHIK6Q.js.map → ssrf-guard-U2JA72TC.js.map} +0 -0
- /package/bundle/{spin-types-OIE67MJK.js.map → stt-PSOPPBV4.js.map} +0 -0
- /package/bundle/{stt-LGVPXMVR.js.map → task-store-MNCW42BW.js.map} +0 -0
- /package/bundle/{task-store-W5BFIAIH.js.map → tool-registry-JJMWCQKZ.js.map} +0 -0
- /package/bundle/{tool-registry-7FK3OQGL.js.map → tool-sandbox-CNL6V6IH.js.map} +0 -0
- /package/bundle/{tool-sandbox-4UC6GAKA.js.map → transport-config-6MB2K2XC.js.map} +0 -0
- /package/bundle/{transport-config-KBF5W2DP.js.map → update-HGQAOC5L.js.map} +0 -0
- /package/bundle/{update-CKFP6LBE.js.map → usage-tracker-SR4BI6ZT.js.map} +0 -0
- /package/bundle/{usage-tracker-NXD364VX.js.map → user-registry-4PACZJIJ.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/tts.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/soul-loader.ts", "../src/components/commands/handlers-transport.ts", "../src/components/commands/handlers-system.ts", "../src/components/spawn-safe.ts", "../src/components/nlm-command-handler.ts", "../src/components/commands/handlers-memory.ts", "../src/components/commands/handlers-sleep.ts", "../src/components/commands/exec-async.ts", "../src/components/commands/handlers-tasks.ts", "../src/components/commands/handlers-admin.ts", "../src/components/commands/session-handler.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([\n \"/status\", \"/help\", \"/whoami\", \"/doctor\", \"/software\", \"/update\",\n \"/models\", \"/model\", \"/skills\", \"/skill\", \"/facts\", \"/tasks\", \"/task\",\n \"/usage\", \"/openrouter\", \"/session\", \"/hooks\", \"/memory\", \"/kanban\",\n \"/heartbeat\", \"/reset\", \"/stop\", \"/ctrlc\",\n]);\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 // Fuzzy match: auto-execute if Levenshtein \u2264 2\n const match = fuzzyMatch(cmd);\n if (match) {\n const corrected = text.replace(cmd, match);\n return handleCommand(corrected, ctx);\n }\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, 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\", 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\nfunction levenshtein(a: string, b: string): number {\n const m = a.length, n = b.length;\n const d: number[] = Array.from({ length: n + 1 }, (_, i) => i);\n for (let i = 1; i <= m; i++) {\n let prev = i - 1;\n d[0] = i;\n for (let j = 1; j <= n; j++) {\n const tmp = d[j]!;\n d[j] = a[i - 1] === b[j - 1] ? prev : 1 + Math.min(prev, d[j]!, d[j - 1]!);\n prev = tmp;\n }\n }\n return d[n]!;\n}\n\nfunction fuzzyMatch(cmd: string): string | null {\n let best: string | null = null;\n let bestDist = 3; // threshold: \u2264 2\n for (const known of KNOWN_COMMANDS) {\n const dist = levenshtein(cmd, known);\n if (dist < bestDist) { best = known; bestDist = dist; }\n }\n return best;\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 { 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 { releaseBusy } from \"./pipeline/busy-guard.js\";\nimport { hasHooks, fire as fireHook } from \"./hooks/hook-system.js\";\nimport { buildPrompt } from \"./pipeline/prompt-builder.js\";\n\nimport { getEnv } from \"./env-schema.js\";\nimport { sanitizeOutbound } from \"./sanitize-outbound.js\";\nimport { abmind } from \"../utils/abmind-lazy.js\";\n\nconst TAG = \"pipeline\";\nconst PRIMING_MAX = 8;\n\n// #824: Track which recalled memory IDs were active per agent message (for emoji feedback)\n// Map<platform_message_id, recalled_memory_ids[]> with 1h TTL\nconst recalledIdsPerMessage = new Map<number, number[]>();\nconst RECALL_MAP_TTL = 60 * 60_000;\nsetInterval(() => { /* prune entries older than TTL \u2014 best-effort, no timestamp tracking needed for small maps */ if (recalledIdsPerMessage.size > 200) recalledIdsPerMessage.clear(); }, RECALL_MAP_TTL);\n\n/** Look up recalled memory IDs for a given platform message (for reaction-based feedback). */\nexport function getRecalledIdsForMessage(platformMsgId: number): number[] | undefined {\n return recalledIdsPerMessage.get(platformMsgId);\n}\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}\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, mark pendingStart. */\nexport async function resetAndPrepare(opts: {\n transport: IKiroTransport;\n sessionKey: string;\n reason: string;\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 const { spin } = await import(\"./spin.js\");\n const pSession = spin.getSessionById(opts.sessionKey);\n if (pSession) {\n pSession.seen = false;\n pSession.pendingStart = true;\n pSession.busy = false;\n pSession.queue = [];\n }\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 sessionManager: import(\"./spin.js\").Spin;\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 // --- #993: If user switched to a non-Main session with live transport, route there directly ---\n const { spin } = await import(\"./spin.js\");\n const { sessionType } = await import(\"./spin-types.js\");\n const switchedSession = spin.getActiveSession(msg.userId, msg.platform);\n const switchedToLive = switchedSession?.transport && sessionType(switchedSession) !== \"A\" && switchedSession.status === \"ready\";\n if (switchedToLive) {\n ctx.transport = switchedSession.transport!;\n ctx.delivery = switchedSession.delivery;\n // Mark seen so isSessionStart doesn't inject full soul bundle (Orc already has its context)\n switchedSession.seen = true;\n switchedSession.lastActiveAt = Date.now();\n } else {\n // --- #936: Resolve session via Spin (sets per-user transport + delivery mode) ---\n try {\n const userSession = await spin.resolveSession(msg.userId, msg.platform, ctx.chatId);\n if (userSession.status === \"ready\" && userSession.transport) {\n ctx.transport = userSession.transport;\n ctx.delivery = userSession.delivery;\n }\n } catch (err) {\n logWarn(TAG, `resolveSession failed for ${msg.userId}: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n // --- Core transport/response handling (will become middleware incrementally) ---\n const {\n memory, memoryConfig,\n idleSave, conversationBuffer,\n ttsConfig,\n } = deps;\n const transport = ctx.transport;\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 pSession = spin.getSessionById(activeSessionId)!;\n const busyEntry = pSession;\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, recalledHits } = await buildPrompt(msg, text, {\n memory, memoryConfig, 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 // --- Auto-notify: inject task failures (#646) ---\n const { drainTaskFailures } = await import(\"./tasks/task-failure-buffer.js\");\n const failures = drainTaskFailures();\n if (failures.length > 0) {\n const lines = failures.map(f => `[SYSTEM] Task \"${f.taskName}\" failed (exit ${f.exitCode}${f.error ? `: ${f.error}` : \"\"}). ${f.consecutiveFailures > 1 ? `${f.consecutiveFailures} consecutive failures.` : \"\"}`);\n prompt = `${lines.join(\"\\n\")}\\n\\n${prompt}`;\n }\n\n // --- Auto-notify: inject buffered system events (#844) ---\n const { drainSystemEvents } = await import(\"./system-event-buffer.js\");\n const events = drainSystemEvents();\n if (events.length > 0) {\n prompt = `${events.map(e => `[SYSTEM] ${e}`).join(\"\\n\")}\\n\\n${prompt}`;\n }\n\n // --- Send to transport ---\n const activeSession = deps.sessionManager.getActiveSession(userId, msg.platform);\n const sessionTransport = activeSession.transport ?? transport;\n logDebug(TAG, `Route: session=${activeSessionId} type=${sessionType(activeSession)} transport=${activeSession.transport ? \"session\" : \"main\"}`);\n\n // #681: attach sandbox policy (owner for now \u2014 peer/guest in #678)\n if (\"sandboxPolicy\" in sessionTransport) {\n const { buildPolicy } = await import(\"./tool-sandbox.js\");\n (sessionTransport as any).sandboxPolicy = buildPolicy(\"owner\");\n }\n // Wire cooperative pause check (#539) \u2014 agent loop checks this between tool calls\n if (\"isPaused\" in sessionTransport) {\n (sessionTransport as any).isPaused = () => activeSession.status === \"paused\";\n }\n\n // Wire /wait steer injection (#655) \u2014 agent loop drains this between tool rounds\n if (\"getPendingInstruction\" in transport) {\n (transport as any).getPendingInstruction = () => {\n const pending = pSession.pendingWait;\n if (!pending) return undefined;\n pSession.pendingWait = undefined;\n return pending;\n };\n }\n\n // #1271: pipeline main turn goes through spin(spec) (model-call chokepoint).\n // Streaming/tool callbacks remain pipeline-owned (set on the transport before,\n // reset in the finally below). spin() sends via the session's own transport.\n const responsePromise = deps.sessionManager.spin({\n type: sessionType(activeSession),\n sessionId: activeSessionId,\n prompt,\n imageContent,\n userId,\n await: true,\n }).then(r => r.result ?? \"\");\n // #1292: the model call is started early to overlap with the setReaction/sendTyping\n // round-trips below, but is not awaited until later in this try block. Without this\n // guard, a fast provider-down rejection (403 / all models exhausted) floats as an\n // unhandled rejection during those awaits and crashes the bridge. Marking the promise\n // handled here: the real rejection still propagates when `await responsePromise` runs\n // and is caught by this try/catch, which renders the graceful error to the user.\n void responsePromise.catch(() => {});\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 activeSession.lastActiveAt = Date.now(); // #1198: keep session alive during tool execution\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 const clean = sanitizeOutbound(text);\n if (!clean) return;\n fullResponseSegments.push(clean);\n if (streamMsgId && adapter.editMessage) {\n adapter.editMessage(channelId, streamMsgId, clean).catch(err => logAndSwallow(TAG, \"adapter call\", err));\n } else {\n adapter.sendMessage(channelId, clean, { 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 = pSession.fullMode ? response : (cleanAnswer || response);\n const { text: cleanedText, reactionEmoji, noReply, topics } = cleanResponse(rawResponse);\n let userResponse = cleanedText;\n\n // #869: strip <think>/<thinking> blocks unless user opted in via /reasoning show\n const reasoningSession = transport.getActiveSession?.();\n if (!reasoningSession?.showReasoning) {\n userResponse = userResponse.replace(/<think(?:ing)?>[\\s\\S]*?<\\/think(?:ing)?>\\s*/g, \"\");\n userResponse = userResponse.replace(/<\\/think(?:ing)?>\\s*/g, \"\");\n }\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 // --- #936: Simple delivery (non-master sessions) ---\n if (ctx.delivery === \"simple\") {\n if (!userResponse && noReply) return;\n if (userResponse) {\n const chunks = adapter.chunkResponse(userResponse);\n for (const chunk of chunks) {\n const clean = chunk.replace(/\\[TOPICS:\\s*.+?\\]/gi, \"\").replace(/\\[REACT:.+?\\]/gi, \"\").trim();\n if (clean) await retrySend(() => adapter.sendMessage(channelId, clean, { threadId: msg.threadId }));\n }\n }\n // Record assistant response to memory\n if (memory && registry.byUserId.get(userId)?.role !== \"guest\" && !text.startsWith(\"[SESSION START]\")) {\n memory.recordMessage({ role: \"assistant\", content: cleanAnswer || response, timestamp: Date.now(), userId, sessionId: activeSessionId });\n }\n if (isVoice && ttsConfig && adapter.sendVoice) {\n try {\n const audio = await synthesizeSpeech(cleanAnswer || response, ttsConfig);\n if (audio) await adapter.sendVoice(channelId, audio, { threadId: msg.threadId });\n } catch (err) { logAndSwallow(TAG, \"TTS\", err); }\n }\n logInfo(TAG, `\u2192 [${msg.platform}] Simple delivery (${userResponse.length} chars)`);\n // #938: Update session metrics\n activeSession.messageCount = (activeSession.messageCount ?? 0) + 1;\n activeSession.contextPercent = transport.contextPercent >= 0 ? transport.contextPercent : undefined;\n activeSession.toolCallCount = (activeSession.toolCallCount ?? 0) + (transport.toolCallsSucceeded ?? 0);\n return;\n }\n\n // --- Empty response ---\n if (!userResponse && reactionEmoji) {\n userResponse = reactionEmoji; // emoji IS the response \u2014 deliver normally\n }\n if (!userResponse) {\n if (noReply) {\n logDebug(TAG, \"LLM returned [NO_REPLY], dropping silently\");\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 // --- 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 = pSession.primingTerms ?? [];\n pSession.primingTerms = [...new Set([...modelTopics, ...regexKw, ...existing])].slice(0, PRIMING_MAX);\n }\n\n // --- Record to memory (skip for guests and greeting injects) ---\n const isGuest = registry.byUserId.get(userId)?.role === \"guest\";\n if (memory && !isGuest && !text.startsWith(\"[SESSION START]\")) {\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 && !pSession.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 // #938: Update session metrics\n activeSession.messageCount = (activeSession.messageCount ?? 0) + 1;\n activeSession.contextPercent = ctxAfter >= 0 ? ctxAfter : undefined;\n activeSession.toolCallCount = (activeSession.toolCallCount ?? 0) + (transport.toolCallsSucceeded ?? 0);\n\n // --- #824: Citation detection \u2014 did the agent use the recalled memories? ---\n if (recalledHits && recalledHits.length > 0 && memoryConfig.memoryEnabled && memory) {\n try {\n const mod = abmind();\n if (mod) {\n const { detectCitations } = mod;\n const citedIds = detectCitations(userResponse, recalledHits);\n if (citedIds.length > 0) memory.bumpCitedCount(citedIds);\n logDebug(TAG, `Citation: ${citedIds.length}/${recalledHits.length} recalled memories cited`);\n // Track recalledIds for emoji reaction feedback (1h TTL)\n if (lastSentMsgId != null) {\n recalledIdsPerMessage.set(Number(lastSentMsgId), recalledHits.map(h => h.id));\n }\n }\n } catch (err) {\n logWarn(TAG, `Citation detection failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\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)}${(err as any)?.code ? ` (code=${(err as any).code})` : \"\"}`);\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 // #1294 + #1298: Synthetic internal prompts are system-initiated, not user requests.\n // If they fail (e.g. models exhausted), don't surface an \u274C error reply \u2014 the user sees\n // errors on their own messages, and deliver/announce notifications are queryable via /kanban.\n const SYNTHETIC_PREFIXES = [\"[SESSION START]\", \"[SYSTEM]\", \"[TASK COMPLETE]\"];\n const notifyUser = !SYNTHETIC_PREFIXES.some(p => text.startsWith(p));\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)}` });\n if (notifyUser) 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 if (notifyUser) await adapter.sendMessage(channelId, \"\u274C Model timed out.\", { threadId: msg.threadId }).catch(err => logAndSwallow(TAG, \"adapter call\", err));\n } else {\n logError(TAG, `Pipeline error: ${errStr.slice(0, 500)}`);\n const reason = errStr.includes(\"credits\") ? \"OpenRouter credits exhausted \u2014 top up at openrouter.ai/credits\"\n : 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 : errStr.includes(\"aborted\") || errStr.includes(\"code=20\") ? \"Request aborted \u2014 model connection dropped.\"\n : `Error: ${errStr.slice(0, 80)}`;\n if (notifyUser) 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 releaseBusy(pSession, (m, a) => handleInboundMessage(m, a, deps));\n idleSave.reset(activeSessionId, chatId);\n }\n}\n\n/** Build session-start prompt with SOUL + context + greeting, send to transport, push response to adapter. */\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", "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 * 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 { IKiroTransport } from \"../transport/kiro-transport.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 /** Resolved transport for this message (defaults to deps.transport, overridden by Spin per-user). */\n transport: IKiroTransport;\n /** Delivery mode for this session. */\n delivery: \"streaming\" | \"simple\";\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 transport: deps.transport,\n delivery: \"streaming\",\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\", \"/reset\", \"/restart\"]);\nconst DESTRUCTIVE_COMMANDS = new Set([\"/stop\", \"/ctrlc\", \"/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, sessionManager,\n updateCtxStart, conversationBuffer } = deps;\n const { spin } = await import(\"../spin.js\");\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) && spin.getSessionById(activeId)?.busy) {\n logInfo(\"commands\", `Interrupt command ${cmd} while busy \u2014 stopping current response`);\n await transport.sendInterrupt();\n const s = spin.getSessionById(activeId);\n if (s) s.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) && spin.getSessionById(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 ?? \"unknown\", platform: msg.platform, reply: ctx.reply,\n editReply,\n transport, config, startedAt,\n memory, memoryConfig, nlmConfig,\n idleSave,\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\";\nimport { logAndSwallow } from \"../log-and-swallow.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 { spin } = await import(\"../spin.js\");\n const entry = spin.getSessionById(activeId);\n if (!entry) { await next(); return; }\n\n if (entry.busy) {\n const text = ctx.text.trim();\n const lower = text.toLowerCase();\n\n // Read-only commands bypass busy guard \u2014 produce independent messages (#766)\n const firstWord = lower.split(/\\s/)[0]!;\n const READONLY = [\"/memory\", \"/models\", \"/status\", \"/help\", \"/tasks\", \"/usage\", \"/sleep\", \"/sessions\", \"/session\", \"/whoami\", \"/model\"];\n if (READONLY.includes(firstWord)) {\n await next();\n return;\n }\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 logInfo(\"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/**\n * Release busy flag and drain next queued message.\n * Called from message-pipeline finally block.\n */\nexport function releaseBusy(\n session: { busy: boolean; queue: Array<{ msg: any; adapter: any }>; lastActiveAt: number },\n pipeline: (msg: any, adapter: any) => Promise<void>,\n): void {\n session.busy = false;\n session.lastActiveAt = Date.now();\n if (session.queue.length) {\n const next = session.queue.shift()!;\n pipeline(next.msg, next.adapter).catch((err) => { logAndSwallow(\"busy-guard\", \"drain\", err); });\n }\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 { 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 sessionManager: import(\"../spin.js\").Spin;\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 recalledHits?: Array<{ id: number; contentEn: 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, 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 const { spin } = await import(\"../spin.js\");\n const pSession = spin.getSessionById(sessionKey);\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 = pSession;\n const isSessionStart = !entry || 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, msg.platform);\n }\n if (entry) {\n entry.seen = true;\n entry.pendingStart = false;\n }\n\n // Record user message to memory\n const userRole = registry.byUserId.get(userId)?.role;\n logTrace(TAG, `recordMessage gate: memory=${!!memory} userId=${userId} userRole=${userRole}`);\n if (memory && userRole !== \"guest\" && !text.startsWith(\"[SESSION START]\")) {\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 let recalledHits: Array<{ id: number; contentEn: string }> | undefined;\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 = pSession?.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 // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const hits = recall.results.filter((h: any) => {\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 // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const lines = hits.map((h: any) => 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 // #824: track recalled hits for citation detection\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n recalledHits = hits.filter((h: any) => h.id != null).map((h: any) => ({ id: h.id as number, contentEn: h.content as string }));\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 scanFn = abmind()?.scanForInjection;\n if (scanFn) {\n const scan = scanFn(text);\n if (!scan.safe) {\n logInfo(TAG, `Injection blocked from ${userId}: ${scan.flags.map((f: { category: string }) => f.category).join(\", \")}`);\n // Return a sentinel \u2014 caller checks and sends the block message\n return { prompt: \"__INJECTION_BLOCKED__\", isSessionStart, imageContent: undefined, recalledHits: undefined };\n }\n }\n }\n\n return { prompt, isSessionStart, imageContent, recalledHits };\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 platform?: string,\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 logInfo(TAG, `Injected session identity: #${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 // Platform capabilities (#834 \u2192 #646)\n if (platform) {\n const CAPS: Record<string, string> = { telegram: \"voice, reactions, typing, TTS, groups\", discord: \"reactions, typing, threads\", irc: \"text only\" };\n contextParts.push(`[SYSTEM] Platform: ${platform} (${CAPS[platform] ?? \"unknown\"})`);\n logInfo(TAG, `Injected platform: ${platform}`);\n }\n\n // Runtime identity (#879) \u2014 prevent agent misidentifying itself\n const transportType = getEnv().defaultTransport === \"acp\" ? \"ACP\" : \"Direct API\";\n const runtimeLine = `[SYSTEM] Runtime: abtars bridge (${transportType}). All registered bridge tools are available.`;\n contextParts.push(runtimeLine);\n logInfo(TAG, `Injected runtime identity: ${transportType}`);\n\n {\n const ctxOpts = isCodeSession ? { skipDailies: true, maxAgeMs: 48 * 60 * 60 * 1000 } : undefined;\n const ctxResult = memory.available !== false ? abmind()?.buildSessionStartContext(memory, userId, maxContext, ctxOpts) : null;\n const ctx = ctxResult?.text ?? null;\n if (ctx) {\n contextParts.push(ctx);\n const s = ctxResult!.stats;\n const ctxPct = maxContext ? Math.round(ctx.length / maxContext * 100) : -1;\n logInfo(TAG, `Session start: ${s.messages} messages + ${s.dailies}d ${s.weeklies}w ${s.quarterlies}q (${(s.usedBytes / 1024).toFixed(1)}KB / ${(s.budget / 1024).toFixed(0)}KB budget, ${ctxPct}% ctx${isCodeSession ? \", Code\" : \"\"})`);\n logDebug(TAG, `Session context: ${s.messages} msgs, ${s.dailies}d ${s.weeklies}w ${s.quarterlies}q, ${s.usedBytes}B / ${s.budget}B budget, ${ctxPct}% ctx`);\n logTrace(TAG, `session-start content: ${ctx.slice(0, 500)}...`);\n }\n\n try {\n const userRole = loadUsers().byUserId.get(userId)?.role ?? \"guest\";\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 && memory.available !== false) {\n // Wake-up only for Main sessions with live memory\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); logInfo(TAG, `Injected system status (${status.length} chars)`); }\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 logTrace(TAG, `session-start injections:\\n${contextParts.filter(p => p.startsWith(\"[\")).map(p => \" \" + p.slice(0, 120)).join(\"\\n\")}`);\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 * soul-loader.ts \u2014 Thin wrapper around soul-bundle for backward compatibility.\n * All logic lives in soul-bundle.ts now.\n */\nimport { buildSoulBundle } from \"./soul-bundle.js\";\nimport type { MemoryManager } from \"abmind\";\n\nexport function loadSoulBundle(memory?: MemoryManager | null): string | null {\n return buildSoulBundle(\"A\", memory);\n}\n\nexport function loadMinimalSoul(memory?: MemoryManager | null): string | null {\n return buildSoulBundle(\"C\", memory);\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 // Greet in the new session (#968)\n const newSession = ctx.sessionManager.getActiveSession(ctx.userId, ctx.platform);\n ctx.sessionManager.greetSession(newSession, ctx.chatId, ctx.userId);\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 // #1022: compaction only for A/C session types (hard requirement).\n const { isCompactable } = await import(\"../spin-types.js\");\n if (!isCompactable(ctx.sessionKey)) {\n await ctx.reply(\"Compaction not available for this session.\");\n return true;\n }\n // Context engine compaction \u2014 force compact via transport's orchestrator\n const transport = ctx.transport as { contextOrchestrator?: { forceCompact(chatId: string, budget: number): Promise<import(\"abmind\").CompactionResult> }; config?: { maxContext: number } };\n if (transport.contextOrchestrator) {\n const budget = (transport as any).config?.maxContext ?? 200000;\n const result = await transport.contextOrchestrator.forceCompact(ctx.sessionKey, budget);\n if (result.skipped) {\n await ctx.reply(\"Compaction skipped (recent passes saved little \u2014 retry in ~30 min).\");\n } else if (result.ok) {\n const pct = Math.round(result.savingsPct * 100);\n await ctx.reply(`Compaction complete. ${result.tokensBefore}\u2192${result.tokensAfter} tokens (${pct}% saved).`);\n } else {\n await ctx.reply(\"Nothing to compact.\");\n }\n } else {\n await ctx.reply(\"Context engine not active for this transport.\");\n }\n } catch (err) {\n logError(TAG, \"Manual compaction failed\", err);\n await ctx.reply(\"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 / primary / reset \u2014 reset model health buckets + clear emergency mode\n if (arg === \"health reset\" || arg === \"primary\" || arg === \"reset\") {\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 ? \"Model health reset + emergency mode cleared \u2014 primary model active.\"\n : \"Model health reset \u2014 all models available (sticky credits/auth cleared).\");\n } else {\n await ctx.reply(\"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(`\u2713 ${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(`\u2713 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 ? \" \u2713\" : \"\";\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(`\u2713 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 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\nexport async function handleReasoning(text: string, ctx: CommandContext): Promise<boolean> {\n const arg = text.replace(/^\\/(reasoning)\\s*/i, \"\").trim().toLowerCase();\n const session = ctx.transport.getActiveSession?.();\n if (!session) { await ctx.reply(\"No active session.\"); return true; }\n\n if (arg === \"show\" || arg === \"on\") {\n session.showReasoning = true;\n await ctx.reply(\"Reasoning display: on\");\n } else if (arg === \"hide\" || arg === \"off\") {\n session.showReasoning = false;\n await ctx.reply(\"Reasoning display: off\");\n } else if ([\"none\", \"low\", \"medium\", \"high\"].includes(arg)) {\n session.reasoningEffort = arg === \"none\" ? null : arg as \"low\" | \"medium\" | \"high\";\n await ctx.reply(`Reasoning effort: ${arg}`);\n } else {\n await ctx.reply(`Reasoning: effort=${session.reasoningEffort ?? \"default\"}, display=${session.showReasoning ? \"show\" : \"hide\"}`);\n }\n return true;\n}\n\nexport async function handleContinue(_text: string, ctx: CommandContext): Promise<boolean> {\n // #1271: /continue goes through spin() continuation (model-call chokepoint)\n const { result: response } = await ctx.sessionManager.spin({\n type: \"A\", sessionId: ctx.sessionKey,\n prompt: \"[SYSTEM] Something went wrong during your previous response. Continue from where you left off.\",\n userId: ctx.userId, await: true,\n });\n if (response) await ctx.reply(response);\n return true;\n}\n", "import { readFileSync, readdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { logInfo, logWarn } from \"../logger.js\";\nimport { logAndSwallow } from \"../log-and-swallow.js\";\nimport { spawnDetached } from \"../spawn-safe.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|health)\\s*/i, \"\").trim().toLowerCase();\n\n // /doctor fix \u2192 run fixes\n if (arg === \"fix\" || arg === \"fix-full\") {\n try {\n const { runFixes, runAllProbes, renderHuman } = await import(\"../../cli/commands/doctor-probes.js\");\n const fixes = await runFixes();\n const fixLines = fixes.map(f => ` ${f.success ? \"+\" : \"x\"} ${f.action}`).join(\"\\n\");\n const output = await runAllProbes();\n await ctx.reply(`\uD83E\uDE7A Fix:\\n${fixLines || \"(nothing to fix)\"}\\n\\n${renderHuman(output)}`);\n } catch (err) {\n await ctx.reply(`x doctor fix failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n return true;\n }\n\n await ctx.reply(\"\uD83E\uDE7A Running diagnostics...\");\n const { runAllProbes, renderHuman } = await import(\"../../cli/commands/doctor-probes.js\");\n const output = await runAllProbes();\n await ctx.reply(renderHuman(output));\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 const { spin } = await import(\"../spin.js\");\n const s = spin.getSessionById(ctx.sessionKey);\n if (s) s.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 const { writeFileSync } = await import(\"node:fs\");\n const { join } = await import(\"node:path\");\n const home = process.env[\"ABTARS_HOME\"] ?? join(process.env[\"HOME\"] ?? \"/tmp\", \".abtars\");\n writeFileSync(join(home, \".start-reason\"), \"user-restart\");\n\n const arg = _text.replace(/^\\/restart\\s*/i, \"\").trim().toLowerCase();\n if (arg === \"cold\") {\n await ctx.reply(\"+ Cold restart...\");\n setTimeout(() => process.exit(0), 500);\n return true;\n }\n await ctx.reply(\"+ 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 { getHeartbeatInstance } = await import(\"../heartbeat-system.js\");\n const hb = getHeartbeatInstance();\n if (!hb) { await ctx.reply(\"\uD83D\uDC93 Heartbeat not available.\"); return true; }\n\n const mins = Math.round(hb.intervalMs / 60000);\n const lines = [\n `\uD83D\uDC93 Heartbeat: ${hb.isRunning ? \"running\" : \"stopped\"} (${mins}min interval)`,\n \"\",\n ];\n\n // Task statuses\n const statuses = hb.getTaskStatuses();\n if (statuses.size > 0) {\n lines.push(\"Tasks (last tick):\");\n for (const [name, status] of statuses) {\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 const arg = text.replace(/^\\/healing\\s*/, \"\").trim();\n const cmd = arg.toLowerCase().split(/\\s+/)[0] ?? \"\";\n\n if (cmd === \"on\") {\n if (ctx.selfHealerTask) ctx.selfHealerTask.enabled = true;\n await ctx.reply(\"\uD83E\uDE7A Self-healing: ON\");\n logInfo(TAG, \"Self-healer ON by user\");\n return true;\n }\n if (cmd === \"off\") {\n if (ctx.selfHealerTask) ctx.selfHealerTask.enabled = false;\n await ctx.reply(\"\uD83E\uDE7A Self-healing: OFF\");\n logInfo(TAG, \"Self-healer OFF by user\");\n return true;\n }\n if (cmd === \"reset\") {\n const { resetAutofixState } = await import(\"../sha-tracker.js\");\n resetAutofixState();\n await ctx.reply(\"\uD83E\uDE7A Autofix state reset \u2014 all suppressed faults re-enabled.\");\n return true;\n }\n if (cmd === \"list\") {\n const { loadFixes } = await import(\"../sha-tracker.js\");\n const { readFileSync } = await import(\"node:fs\");\n const { join } = await import(\"node:path\");\n const fixes = loadFixes();\n if (fixes.length === 0) { await ctx.reply(\"\uD83E\uDE7A No fix rules configured.\"); return true; }\n let state: Record<string, { totalRuns?: number }> = {};\n try { state = JSON.parse(readFileSync(join(process.env[\"ABTARS_HOME\"] || join(process.env[\"HOME\"] || \"~\", \".abtars\"), \"state\", \"sha-state.json\"), \"utf-8\")); } catch {}\n const lines = fixes.map(f => {\n const v = f.verified === false ? \" \u26A0\uFE0F\" : \"\";\n const src = f.createdAt ? \"(self)\" : \"(core)\";\n const runs = state[`autofix-known:${f.pattern}`]?.totalRuns ?? 0;\n const runsText = runs > 0 ? ` [${runs}x]` : \"\";\n return `\u2022 \"${f.pattern.slice(0, 20)}\" \u2192 ${f.command?.[0] ?? \"?\"} ${src}${v}${runsText}`;\n });\n await ctx.reply(`\uD83E\uDE7A Fix rules (${fixes.length}):\\n${lines.join(\"\\n\")}`);\n return true;\n }\n if (cmd === \"approve\") {\n const pattern = arg.slice(8).trim();\n if (!pattern) { await ctx.reply(\"Usage: /healing approve <pattern>\"); return true; }\n const { approveFix } = await import(\"../sha-tracker.js\");\n const ok = approveFix(pattern);\n await ctx.reply(ok ? `\u2713 Approved: \"${pattern}\"` : `\u274C Pattern not found in self-rules.`);\n return true;\n }\n if (cmd === \"disable\") {\n const pattern = arg.slice(8).trim();\n if (!pattern) { await ctx.reply(\"Usage: /healing disable <pattern>\"); return true; }\n const { disableFix } = await import(\"../sha-tracker.js\");\n const ok = disableFix(pattern);\n await ctx.reply(ok ? `\u2713 Disabled: \"${pattern}\"` : `\u274C Pattern not found in self-rules.`);\n return true;\n }\n\n // Default: show status\n const status = ctx.selfHealerTask?.enabled ? \"ON\" : \"OFF\";\n await ctx.reply(`\uD83E\uDE7A Self-healing: ${status}\\nCommands: /healing [on|off|list|reset|approve|disable]`);\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 const { spin } = await import(\"../spin.js\");\n const s = spin.getSessionById(ctx.sessionKey);\n if (s) s.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 const { spin } = await import(\"../spin.js\");\n const s = spin.getSessionById(ctx.sessionKey);\n if (s) s.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 { getHeartbeatInstance } = await import(\"../heartbeat-system.js\");\n const hb = getHeartbeatInstance();\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 (hb) {\n const mins = Math.round(hb.intervalMs / 60000);\n lines.push(\n `\uD83D\uDC93 Heartbeat: ${hb.isRunning ? \"running\" : \"stopped\"} (${mins}min)`,\n );\n if (ctx.loadedCapabilities?.length) {\n lines.push(`\uD83D\uDD0C Capabilities: ${ctx.loadedCapabilities.join(\", \")}`);\n }\n // Last sleep audit from filesystem\n try {\n const { readdirSync, existsSync } = await import(\"node:fs\");\n const { abmindHome } = await import(\"../../paths.js\");\n const sleepDir = join(abmindHome(), \"memory\", \"sleep\");\n if (!existsSync(sleepDir)) { lines.push(\"\uD83D\uDE34 Last sleep: (never)\"); }\n else {\n const files = readdirSync(sleepDir).filter((f: string) => f.startsWith(\"sleep_\")).sort();\n lines.push(`\uD83D\uDE34 Last sleep: ${files.length > 0 ? files[files.length - 1] : \"(never)\"}`);\n }\n } catch { lines.push(\"\uD83D\uDE34 Last sleep: (unknown)\"); } 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 // Budget status\n const { getBudgetStatus } = await import(\"../budget.js\");\n const budgetItems = getBudgetStatus();\n if (budgetItems.length > 0) {\n msg += `\\n\\n\uD83D\uDCCB Budget (today):`;\n for (const { agent, used, limit } of budgetItems) {\n const tokStr = limit.tokens ? `${Math.round(used.tokens / 1000)}K/${limit.tokens}K` : \"unlimited\";\n const callStr = limit.calls ? `${used.calls}/${limit.calls}` : \"unlimited\";\n msg += `\\n ${agent}: ${tokStr} tokens, ${callStr} calls`;\n }\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})\\nClearance: ${clearance}\\nchatId: ${ctx.chatId}`);\n } else {\n await ctx.reply(`${ctx.userId ?? \"unknown\"} (unregistered)\\nchatId: ${ctx.chatId}`);\n }\n return true;\n}\n\n// \u2500\u2500 /update dev routine (#1277) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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// Extracted so it can be unit-tested with an injected exec helper.\n//\n// Safety contract: this function MUST NOT stop the running bridge unless\n// build.ok === true. On any pre-deploy failure \u2192 report + return, bridge untouched.\n// DO NOT re-add auto-invocation of emergency-update.sh here \u2014 that script stops the\n// watchdog and must only be called manually.\nexport type ExecHelper = (cmd: string, args: string[], opts: { cwd?: string; timeout: number }) => Promise<{ stdout: string; stderr: string; ok: boolean }>;\n\nexport function makeExecHelper(spawnFn: typeof import(\"node:child_process\").spawn): ExecHelper {\n return (cmd, args, opts) =>\n new Promise((resolve) => {\n let stdout = \"\", stderr = \"\";\n const proc = spawnFn(cmd, args, { cwd: opts.cwd, stdio: [\"ignore\", \"pipe\", \"pipe\"] });\n proc.stdout?.on(\"data\", (d: Buffer) => { stdout += d.toString(); });\n proc.stderr?.on(\"data\", (d: Buffer) => { stderr += d.toString(); });\n const timer = setTimeout(() => {\n proc.kill(\"SIGKILL\");\n resolve({ stdout, stderr: stderr + \"\\n[timed out]\", ok: false });\n }, opts.timeout);\n proc.on(\"close\", (code) => { clearTimeout(timer); resolve({ stdout, stderr, ok: code === 0 }); });\n proc.on(\"error\", (e) => { clearTimeout(timer); resolve({ stdout, stderr: String(e), ok: false }); });\n });\n}\n\nexport async function runDevUpdate(\n ctx: CommandContext,\n spawnFn: typeof import(\"node:child_process\").spawn,\n execHelper?: ExecHelper,\n): Promise<void> {\n const releasesRoot = join(process.env[\"HOME\"] ?? \"\", \".abtars-releases\", \"src\");\n const abtarsDir = join(releasesRoot, \"abtars\");\n const execP = execHelper ?? makeExecHelper(spawnFn);\n\n // \u2500\u2500 1. Fetch \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 await ctx.reply(\"Checking for updates...\");\n const fetchResult = await execP(\"git\", [\"-C\", abtarsDir, \"fetch\", \"origin\", \"dev\"], { timeout: 30_000 });\n if (!fetchResult.ok) {\n const detail = (fetchResult.stderr || fetchResult.stdout).slice(-300);\n logWarn(\"update\", `git fetch failed: ${detail}`);\n await ctx.reply(`x git fetch failed \u2014 bridge left running. Retry /update dev.\\n${detail}`);\n return;\n }\n\n // \u2500\u2500 2. Up-to-date check vs DEPLOYED commit (not source HEAD) (#1277 3b) \u2500\u2500\u2500\n // gate on manifest.json.commit vs origin/dev to stay correct even when a\n // prior failed build advanced HEAD without deploying anything.\n const originSha = (await execP(\"git\", [\"-C\", abtarsDir, \"rev-parse\", \"--short\", \"origin/dev\"], { timeout: 5_000 })).stdout.trim();\n let deployedCommit = \"\";\n try {\n const mf = JSON.parse(readFileSync(join(abtarsHome(), \"manifest.json\"), \"utf-8\")) as { commit?: string };\n deployedCommit = mf.commit ?? \"\";\n } catch { /* first install or missing manifest \u2014 treat as needs-update */ }\n\n if (originSha && deployedCommit && originSha === deployedCommit) {\n await ctx.reply(\"Already up to date.\");\n return;\n }\n\n // Show commit range relative to deployed version\n const range = deployedCommit ? `${deployedCommit}..origin/dev` : \"HEAD..origin/dev\";\n const logResult = await execP(\"git\", [\"-C\", abtarsDir, \"log\", \"--oneline\", range], { timeout: 5_000 });\n const commits = logResult.stdout.trim();\n const header = commits\n ? `${commits.split(\"\\n\").length} new commit(s):\\n${commits.slice(0, 300)}\\n\\n`\n : \"\";\n await ctx.reply(`${header}Deploying...`);\n logInfo(\"update\", \"git update requested\");\n\n // \u2500\u2500 3. Checkout + build \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 // On any failure: report error, leave the running bridge untouched.\n // Timeout raised to 180s (#1277): cold esbuild on WSL can exceed 60s.\n try {\n const co = await execP(\"git\", [\"-C\", abtarsDir, \"checkout\", \"origin/dev\"], { timeout: 10_000 });\n if (!co.ok) throw new Error(`checkout failed: ${co.stderr.slice(-300) || co.stdout.slice(-300)}`);\n\n const build = await execP(\"node\", [\"esbuild.config.js\"], { cwd: abtarsDir, timeout: 180_000 });\n if (!build.ok) throw new Error(`build failed: ${build.stderr.slice(-400) || build.stdout.slice(-400)}`);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n logWarn(\"update\", `update aborted: ${msg}`);\n await ctx.reply(`x Update aborted \u2014 bridge left running (old build still active). Retry /update dev.\\n${msg.slice(-400)}`);\n return;\n }\n\n // \u2500\u2500 4. Deploy from fresh bundle (detached \u2014 survives bridge restart) \u2500\u2500\u2500\u2500\u2500\u2500\n // Only reached when build.ok === true.\n const bundleCli = join(abtarsDir, \"bundle\", \"abtars-cli.js\");\n const deployProc = spawnFn(\"node\", [bundleCli, \"update\", \"--dev\", abtarsDir], { detached: true, stdio: \"ignore\" });\n deployProc.on(\"error\", (err) => logWarn(\"update\", `spawn deploy process failed (non-fatal): ${err.message}`));\n deployProc.unref();\n}\n\nexport async function handleSoftware(_text: string, ctx: CommandContext): Promise<boolean> {\n const { existsSync } = await import(\"node:fs\");\n const { abtarsHome } = await import(\"../../paths.js\");\n const home = abtarsHome();\n const arg = _text.replace(/^\\/(software|update)\\s*/i, \"\").trim();\n\n // Master-only gate for destructive subcommands\n const { loadUsers } = await import(\"../user-registry.js\");\n const user = loadUsers().byUserId.get(ctx.userId);\n const isMaster = user?.role === \"master\";\n\n // /software rollback <version|slot>\n if (arg.startsWith(\"rollback\")) {\n if (!isMaster) { await ctx.reply(\"\u274C Requires master role.\"); return true; }\n const targetVersion = arg.replace(/^rollback\\s*/, \"\").trim();\n if (!targetVersion) {\n await ctx.reply(\"Usage: /software rollback <slot 1-3>\\nUse /software to see available versions.\");\n return true;\n }\n\n const asSlot = parseInt(targetVersion);\n if (!(asSlot >= 1 && asSlot <= 3) || String(asSlot) !== targetVersion) {\n await ctx.reply(`\u274C Invalid slot: ${targetVersion}. Use 1, 2, or 3.`);\n return true;\n }\n\n await ctx.reply(`\u26A0\uFE0F Rolling back to slot ${asSlot}...`);\n try {\n const { rollback } = await import(\"../../cli/commands/rollback.js\");\n const code = await rollback({ to: asSlot });\n if (code !== 0) {\n await ctx.reply(`\u274C Rollback failed (exit ${code}).`);\n }\n } catch (err) {\n await ctx.reply(`\u274C Rollback failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n return true;\n }\n\n // /update abmind \u2014 pull + build + install abmind from dev (#1308)\n if (arg === \"abmind\" || arg === \"update abmind\") {\n if (!isMaster) { await ctx.reply(\"Requires master role.\"); return true; }\n await ctx.reply(\"Updating abmind from dev (pull + build + install)...\");\n logInfo(\"update\", \"abmind dev update requested\");\n const { spawn } = await import(\"node:child_process\");\n // Non-detached spawn + piped stderr + on(\"close\") reply \u2014 mirrors the\n // alpha/stable branches. Non-blocking (event-driven), and the reply is\n // what surfaces failure to chat (the silent-failure gap #1308 closes).\n const child = spawn(\"abmind\", [\"update\", \"--dev\"], { stdio: [\"ignore\", \"pipe\", \"pipe\"] });\n let stderr = \"\";\n child.on(\"error\", (err) => logWarn(\"update\", `spawn abmind failed (non-fatal): ${err.message}`));\n child.stderr?.on(\"data\", (d: Buffer) => { stderr += d.toString(); });\n child.on(\"close\", (code) => {\n if (code !== 0 && code !== null) ctx.reply(`x abmind update failed (exit ${code}):\\n${stderr.slice(-300)}`).catch(() => {});\n else ctx.reply(\"+ abmind update complete \u2014 check /software\").catch(() => {});\n });\n return true;\n }\n\n // /update dev | alpha | stable\n if (arg === \"update\" || arg === \"update dev\" || arg === \"dev\" ||\n arg === \"update git\" || arg === \"git\" ||\n arg === \"update alpha\" || arg === \"alpha\" ||\n arg === \"update stable\" || arg === \"stable\" ||\n arg === \"update deploy\" || arg === \"deploy\" || arg === \"update pull\" || arg === \"pull\" || arg === \"update build\" || arg === \"build\") {\n // /update with no args \u2192 show usage\n if (arg === \"update\") {\n await ctx.reply(\"Usage: /update dev | alpha | stable\");\n return true;\n }\n // dev + hidden aliases (git, pull, deploy, build)\n const channel = (arg === \"dev\" || arg === \"update dev\" || arg === \"git\" || arg === \"update git\" || arg === \"update pull\" || arg === \"pull\" || arg === \"update deploy\" || arg === \"deploy\" || arg === \"update build\" || arg === \"build\")\n ? \"dev\"\n : (arg === \"alpha\" || arg === \"update alpha\") ? \"alpha\" : \"stable\";\n\n if (!isMaster) { await ctx.reply(\"Requires master role.\"); return true; }\n\n if (channel === \"dev\") {\n const { spawn } = await import(\"node:child_process\");\n await runDevUpdate(ctx, spawn);\n } else if (channel === \"alpha\") {\n await ctx.reply(\"Updating from npm (alpha)...\");\n logInfo(\"update\", \"npm alpha update requested\");\n const { spawn } = await import(\"node:child_process\");\n const child = spawn(\"abtars\", [\"update\", \"--source\", \"npm\", \"--tag\", \"alpha\"], { stdio: [\"ignore\", \"pipe\", \"pipe\"] });\n let stderr = \"\";\n child.on(\"error\", (err) => logWarn(\"update\", `spawn abtars failed (non-fatal): ${err.message}`));\n child.stderr?.on(\"data\", (d: Buffer) => { stderr += d.toString(); });\n child.on(\"close\", (code) => { if (code !== 0 && code !== null) ctx.reply(`x Update failed (exit ${code}):\\n${stderr.slice(-300)}`).catch(() => {}); });\n } else {\n await ctx.reply(\"Updating from npm (stable)...\");\n logInfo(\"update\", \"npm stable update requested\");\n const { spawn } = await import(\"node:child_process\");\n const child = spawn(\"abtars\", [\"update\", \"--source\", \"npm\"], { stdio: [\"ignore\", \"pipe\", \"pipe\"] });\n let stderr = \"\";\n child.on(\"error\", (err) => logWarn(\"update\", `spawn abtars failed (non-fatal): ${err.message}`));\n child.stderr?.on(\"data\", (d: Buffer) => { stderr += d.toString(); });\n child.on(\"close\", (code) => { if (code !== 0 && code !== null) ctx.reply(`x Update failed (exit ${code}):\\n${stderr.slice(-300)}`).catch(() => {}); });\n }\n return true;\n }\n\n if ((arg as string) === \"npm\" || (arg as string) === \"update npm\") {\n // Legacy: /update npm \u2192 alpha\n if (!isMaster) { await ctx.reply(\"Requires master role.\"); return true; }\n logInfo(\"update\", \"npm alpha update (legacy /update npm)\");\n await ctx.reply(\"Updating from npm (alpha)...\");\n spawnDetached(\"abtars\", [\"update\", \"--source\", \"npm\", \"--tag\", \"alpha\"], \"update\");\n return true;\n }\n\n // /software check \u2014 force-refresh npm registry\n if (arg === \"check\") {\n await ctx.reply(\"\uD83D\uDD0D Checking npm registry...\");\n try {\n const { spawnSync } = await import(\"node:child_process\");\n const abtarsLatest = spawnSync(\"npm\", [\"view\", \"abtars\", \"dist-tags\", \"--json\"], { encoding: \"utf-8\", timeout: 10_000 });\n const abmindLatest = spawnSync(\"npm\", [\"view\", \"abmind\", \"dist-tags\", \"--json\"], { encoding: \"utf-8\", timeout: 10_000 });\n const abt = abtarsLatest.status === 0 ? JSON.parse(abtarsLatest.stdout) : null;\n const abm = abmindLatest.status === 0 ? JSON.parse(abmindLatest.stdout) : null;\n const lines = [\"\uD83D\uDCE6 npm registry (fresh):\"];\n if (abt) lines.push(` abtars: latest=${abt.latest ?? \"?\"} alpha=${abt.alpha ?? \"?\"}`);\n if (abm) lines.push(` abmind: latest=${abm.latest ?? \"?\"} alpha=${abm.alpha ?? \"?\"}`);\n if (!abt && !abm) lines.push(\" \u26A0\uFE0F npm unreachable\");\n await ctx.reply(lines.join(\"\\n\"));\n } catch {\n await ctx.reply(\"\u274C npm check failed (timeout or network error)\");\n }\n return true;\n }\n\n // /software \u2014 show deployment info (default)\n const lines: string[] = [\"\uD83D\uDD27 Software\"];\n\n // abtars block\n try {\n const { getDeployedVersion } = await import(\"../../paths.js\");\n const ver = getDeployedVersion();\n const manifest = existsSync(join(home, \"manifest.json\"))\n ? JSON.parse(readFileSync(join(home, \"manifest.json\"), \"utf-8\"))\n : null;\n const deployed = manifest?.activatedAt ? new Date(manifest.activatedAt).toLocaleString() : \"unknown\";\n lines.push(` abtars: ${ver.version}${ver.commit && !ver.version.includes(ver.commit) ? \"-\" + ver.commit : \"\"} (deployed ${deployed})`);\n if (manifest?.source) lines.push(` source: ${manifest.source === \"local\" ? \"local\" : \"npm\"}`);\n try {\n const { execFileSync } = await import(\"node:child_process\");\n const raw = execFileSync(\"npm\", [\"view\", \"abtars\", \"dist-tags\", \"--json\"], { encoding: \"utf-8\", timeout: 5000 });\n const latest = JSON.parse(raw).alpha ?? JSON.parse(raw).latest;\n if (latest) lines.push(` npm latest: abtars@${latest} ${latest === ver.version || ver.version.startsWith(latest) ? \"\u2713\" : \"\u26A0\uFE0F\"}`);\n } catch { /* timeout or offline \u2014 skip */ }\n } catch {\n lines.push(\" abtars: unknown\");\n }\n\n // abmind block\n lines.push(\"\");\n // Only show abmind if configured as memory provider (#1162)\n const { getEnv } = await import(\"../env-schema.js\");\n const memoryProvider = getEnv().memory;\n if (memoryProvider === \"abmind\" || memoryProvider === \"auto\") {\n // Try deployed copy first (always up to date), fall back to ~/.abmind/manifest.json\n const abmindBundlePkg = join(home, \"app\", \"bundle\", \"node_modules\", \"abmind\", \"package.json\");\n const abmindAppPkg = join(home, \"app\", \"node_modules\", \"abmind\", \"package.json\");\n const { abmindHome: resolveAbmind } = await import(\"../../paths.js\");\n const abmHome = resolveAbmind();\n const abmindManifest = join(abmHome, \"manifest.json\");\n const abmindPkgPath = existsSync(abmindBundlePkg) ? abmindBundlePkg : existsSync(abmindAppPkg) ? abmindAppPkg : null;\n if (abmindPkgPath) {\n try {\n const pkg = JSON.parse(readFileSync(abmindPkgPath, \"utf-8\"));\n const manifest = existsSync(abmindManifest) ? JSON.parse(readFileSync(abmindManifest, \"utf-8\")) : null;\n const deployed = manifest?.activatedAt ? new Date(manifest.activatedAt).toLocaleString() : \"unknown\";\n lines.push(` abmind: ${pkg.version ?? \"?\"} (deployed ${deployed})`);\n lines.push(` source: local`);\n try {\n const { execFileSync } = await import(\"node:child_process\");\n const raw = execFileSync(\"npm\", [\"view\", \"abmind\", \"dist-tags\", \"--json\"], { encoding: \"utf-8\", timeout: 5000 });\n const latest = JSON.parse(raw).alpha ?? JSON.parse(raw).latest;\n if (latest) lines.push(` npm latest: abmind@${latest} ${latest === pkg.version || pkg.version.startsWith(latest) ? \"\u2713\" : \"\u26A0\uFE0F\"}`);\n } catch { /* timeout or offline \u2014 skip */ }\n } catch { lines.push(\" abmind: installed (version unknown)\"); }\n } else if (existsSync(abmindManifest)) {\n try {\n const m = JSON.parse(readFileSync(abmindManifest, \"utf-8\"));\n const deployed = m.activatedAt ? new Date(m.activatedAt).toLocaleString() : \"unknown\";\n lines.push(` abmind: ${m.version ?? \"?\"} (deployed ${deployed})`);\n lines.push(` source: npm`);\n try {\n const { execFileSync } = await import(\"node:child_process\");\n const raw = execFileSync(\"npm\", [\"view\", \"abmind\", \"dist-tags\", \"--json\"], { encoding: \"utf-8\", timeout: 5000 });\n const latest = JSON.parse(raw).alpha ?? JSON.parse(raw).latest;\n if (latest) lines.push(` npm latest: abmind@${latest} ${latest === m.version || m.version.startsWith(latest) ? \"\u2713\" : \"\u26A0\uFE0F\"}`);\n } catch { /* timeout or offline \u2014 skip */ }\n } catch { lines.push(\" abmind: installed (version unknown)\"); }\n } else {\n lines.push(\" abmind: not installed\");\n }\n } // end memoryProvider gate\n\n // Rollback slots\n lines.push(\"\");\n lines.push(\" Rollback:\");\n try {\n const { resolve } = await import(\"node:path\");\n const { homedir } = await import(\"node:os\");\n const historyPath = resolve(homedir(), \".abtars-releases\", \"history.json\");\n const history: string[] = JSON.parse(readFileSync(historyPath, \"utf-8\"));\n const prev = history.slice(1, 4); // skip current (index 0)\n for (let i = 0; i < 3; i++) {\n lines.push(` ${i + 1}: ${prev[i] ?? \"(empty)\"}`);\n }\n } catch {\n for (let i = 1; i <= 3; i++) {\n const pkgPath = join(home, `app.prev.${i}`, \"package.json\");\n try {\n const ver = JSON.parse(readFileSync(pkgPath, \"utf-8\")).version;\n lines.push(` ${i}: ${ver}`);\n } catch {\n lines.push(` ${i}: (empty)`);\n }\n }\n }\n\n // Deploy state (#878)\n try {\n const stateRaw = readFileSync(join(home, \"deploy.state\"), \"utf-8\");\n const ds = JSON.parse(stateRaw);\n if (ds.status === \"running\") {\n const ago = Math.round((Date.now() - new Date(ds.startedAt).getTime()) / 60_000);\n lines.push(`\\n \uD83D\uDD04 Deploy in progress (${ago}min ago)`);\n } else if (ds.status === \"failed\") {\n lines.push(`\\n \u274C Last deploy failed: ${ds.error}\\n Log: ~/.abtars/logs/${ds.logFile}`);\n } else if (ds.status === \"partial\") {\n lines.push(`\\n \u26A0\uFE0F Last deploy incomplete: missing ${ds.missing?.join(\", \")}`);\n }\n } catch { /* no state file = normal */ }\n\n lines.push(\"\");\n lines.push(\" /update [dev|alpha|stable] | /software rollback <version>\");\n await ctx.reply(lines.join(\"\\n\"));\n return true;\n}\n\nexport async function handleRollback(text: string, ctx: CommandContext): Promise<boolean> {\n const arg = text.replace(/^\\/rollback\\s*/i, \"\").trim();\n const slot = parseInt(arg) || 1;\n if (slot < 1 || slot > 3) {\n await ctx.reply(\"Slot must be 1-3. Usage: /rollback 1\");\n return true;\n }\n await ctx.reply(`Rolling back to slot ${slot}...`);\n const { rollback } = await import(\"../../cli/commands/rollback.js\");\n const code = await rollback({ to: slot });\n await ctx.reply(code === 0 ? `+ Rolled back to slot ${slot}` : `x Rollback failed (code ${code})`);\n return true;\n}\n\n/** #832: /metrics \u2014 structured observability summary. */\nexport async function handleMetrics(_text: string, ctx: CommandContext): Promise<boolean> {\n const { getMetricsSummary } = await import(\"../metrics-collector.js\");\n const s = getMetricsSummary();\n\n const lines: string[] = [\"Metrics (recent window):\"];\n\n // LLM\n const models = Object.entries(s.llm);\n if (models.length > 0) {\n lines.push(\"\\nLLM latency:\");\n for (const [model, m] of models) {\n lines.push(` ${model}: p50=${m.p50}ms p95=${m.p95}ms max=${m.max}ms | ${m.calls} calls, ${m.failures} fails`);\n }\n } else { lines.push(\"\\nLLM: no data yet\"); }\n\n // Recall\n if (s.recall) {\n lines.push(`\\nRecall: p50=${s.recall.p50}ms p95=${s.recall.p95}ms (${s.recall.calls} calls)`);\n }\n\n // Sleep\n if (s.sleep) {\n const rate = s.sleep.calls > 0 ? Math.round((1 - s.sleep.failures / s.sleep.calls) * 100) : 100;\n lines.push(`\\nSleep: ${s.sleep.calls} runs, ${rate}% success`);\n }\n\n // Compaction (#1022)\n if (s.compaction) {\n lines.push(`\\nCompaction: ${s.compaction.count} passes (${s.compaction.failures} failed), p50=${s.compaction.p50}ms p95=${s.compaction.p95}ms, avg ${s.compaction.avgSavingsPct}% saved`);\n }\n\n // Cron\n lines.push(`\\nCron depth: avg=${s.cronDepth.avg} max=${s.cronDepth.max}`);\n\n await ctx.reply(lines.join(\"\\n\"));\n return true;\n}\n", "/**\n * spawn-safe.ts \u2014 fire-and-forget detached spawn with mandatory error handler (#1281).\n *\n * A spawn(\"binary\") call with no .on(\"error\") handler will emit an unhandled error event\n * when the binary is not found (ENOENT), which bubbles to uncaughtException and kills the\n * bridge. This helper makes the correct pattern the only pattern.\n */\n\nimport { spawn } from \"node:child_process\";\nimport { logWarn } from \"./logger.js\";\n\n/**\n * Spawn a detached child process that the bridge does not need to track.\n * If the binary is not found (ENOENT) or spawn fails for any reason, logs a warning\n * and continues \u2014 never crashes the bridge.\n */\nexport function spawnDetached(cmd: string, args: string[], tag: string): void {\n const child = spawn(cmd, args, { detached: true, stdio: \"ignore\" });\n child.on(\"error\", (err) => logWarn(tag, `spawn ${cmd} failed (non-fatal): ${err.message}`));\n child.unref();\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: `\u2713 Notebook \"${name}\" created (${id})` };\n } catch (err) {\n logAndSwallow(TAG, \"JSON.parse notebook create\", err);\n return { text: `\u2713 ${result.data}` };\n }\n}\n\nasync function handleSources(notebookId: string): Promise<NLMCommandResult> {\n if (!notebookId) return { text: \"Usage: /nlm sources <notebook-id>\" };\n const result = await nlmExec([\"source\", \"list\", notebookId, \"--json\"]);\n if (!result.ok) return { text: `\u274C ${result.error}` };\n\n try {\n const sources = JSON.parse(result.data);\n if (!Array.isArray(sources) || sources.length === 0) return { text: `\uD83D\uDCC4 No sources in notebook.` };\n const lines = sources.map((s: Record<string, unknown>) =>\n `\u2022 [${s.type ?? s.source_type ?? \"?\"}] ${s.title ?? s.name ?? \"?\"}`\n );\n return { text: `\uD83D\uDCC4 Sources:\\n\\n${lines.join(\"\\n\")}` };\n } catch (err) {\n logAndSwallow(TAG, \"JSON.parse source list\", err);\n return { text: `\uD83D\uDCC4 ${result.data}` };\n }\n}\n\nasync function handleQuery(question: string, config: NLMConfig): Promise<NLMCommandResult> {\n if (!question) return { text: \"Usage: /nlm query <question>\" };\n const nbId = config.defaultNotebook;\n if (!nbId) return { text: \"\u274C No default notebook configured (NOTEBOOKLM_DEFAULT_NOTEBOOK).\" };\n\n const result = await nlmExec([\"notebook\", \"query\", nbId, question, \"--json\"]);\n if (!result.ok) return { text: `\u274C ${result.error}` };\n\n try {\n const parsed = JSON.parse(result.data);\n const answer = parsed.answer ?? parsed.response ?? result.data;\n const sources = parsed.sources_used ?? parsed.citations ?? [];\n const citations = Array.isArray(sources) && sources.length > 0\n ? `\\n\\n\uD83D\uDCCE Sources: ${sources.map((s: Record<string, unknown>) => s.title ?? s.name ?? s.source_name ?? \"?\").join(\", \")}`\n : \"\";\n logInfo(TAG, `Query OK \u2014 answerLen=${String(answer).length}`);\n return { text: `\uD83D\uDCDA ${answer}${citations}` };\n } catch (err) {\n logAndSwallow(TAG, \"JSON.parse query result\", err);\n return { text: `\uD83D\uDCDA ${result.data}` };\n }\n}\n", "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\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, logWarn } 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 let stateLabel: string;\n if (progress) {\n stateLabel = `\uD83E\uDDE0 Sleep cycle running (${progress.step}, ${progress.percent}%)`;\n } else if (sleepStatus === \"sleeping\") {\n stateLabel = \"\uD83D\uDCA4 Dreaming\";\n // Show progress from lock file\n if (lock && lock.status === \"ongoing\") {\n const steps = Object.entries(lock.steps);\n const done = steps.filter(([, s]) => s.status === \"ok\" || s.status === \"skipped\").length;\n const current = steps.find(([, s]) => s.status === \"pending\" || s.status === \"ongoing\");\n const startedAt = lock.startedAt ? new Date(lock.startedAt).toISOString().replace(\"T\", \" \").slice(0, 16) : \"\";\n if (startedAt) stateLabel += ` (since ${startedAt})`;\n if (current) stateLabel += `\\n Step: ${current[0]} (${done}/${steps.length})`;\n }\n } else if (sleepStatus === \"hw_sleep\") {\n stateLabel = \"\uD83D\uDE34 Hardware sleep\";\n } else {\n stateLabel = \"\uD83D\uDC4B Awake\";\n }\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 hasIncomplete = lock && Object.values(lock.steps).some(s => s.status === \"failed\" || s.status === \"pending\");\n if (!lock || lock.status === \"completed\" || !hasIncomplete) {\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 const lock = readLatestSleepLock(auditDir);\n if (!lock || lock.status === \"completed\") {\n try { unlinkSync(todayLockPath(auditDir)); } catch (err) { logAndSwallow(\"command_handlers\", \"op\", err); }\n }\n }\n writeForceSleep(\"fresh via /sleep now\");\n await ctx.reply(\"\uD83D\uDCA4 Full sleep cycle initiated\");\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 child.on(\"error\", (err) => logWarn(\"wakeup\", `spawn caffeinate failed (non-fatal): ${err.message}`));\n } else if (os === \"linux\") {\n child = spawn(\"systemd-inhibit\", [\"--what=idle:sleep\", \"sleep\", \"infinity\"], { stdio: \"ignore\", detached: true });\n child.on(\"error\", (err) => logWarn(\"wakeup\", `spawn systemd-inhibit failed (non-fatal): ${err.message}`));\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; startedAt?: 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, startedAt: raw.startedAt, 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 { 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 { 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 const name = label.length > 18 ? label.slice(0, 18) : label;\n return `${tick} ${name.padEnd(20)}${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 const name = (j.message.split(\"\\n\")[0] ?? \"\").slice(0, 30);\n running = `\\n~ Running: ${name} (${ago}s)`;\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 raw = text.replace(/^\\/(tasks?|cron) run /, \"\").trim();\n if (!raw) { await ctx.reply(\"Usage: /task run <cron-id>\"); return true; }\n\n // Resolve ID: try exact, then normalized (spaces\u2192hyphens, lowercase), then title match\n let id = raw;\n const { readEntry, readEntries } = await import(\"../tasks/task-store.js\");\n if (!readEntry(id)) {\n const normalized = raw.toLowerCase().replace(/\\s+/g, \"-\");\n if (readEntry(normalized)) {\n id = normalized;\n } else {\n const byTitle = readEntries().find(e => e.title?.toLowerCase() === raw.toLowerCase());\n if (byTitle) id = byTitle.id;\n }\n }\n\n const err = ctx.enqueueCron?.(id, true);\n if (err) { await ctx.reply(err); return true; }\n // Resolve display name\n let name = id;\n try {\n const entry = readEntry(id);\n if (entry) name = entry.title || (entry.message.split(\"\\n\")[0] ?? \"\").slice(0, 30);\n } catch { /* fallback to id */ }\n await ctx.reply(`Running task: ${name}`);\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\nexport async function handleKanban(text: string, ctx: CommandContext): Promise<boolean> {\n try {\n const { kanbanList, kanbanGetCard, kanbanSearch } = await import(\"../tasks/kanban-board.js\");\n\n // Normalize curly quotes \u2192 straight (mobile keyboards autocorrect)\n const arg = text.replace(/^\\/kanban\\s*/i, \"\").trim()\n .replace(/[\\u201C\\u201D\\u201E\\u201F]/g, '\"');\n\n // /kanban \u2014 default list (active cards)\n if (!arg) {\n const cards = kanbanList();\n if (cards.length === 0) { await ctx.reply(\"Kanban board is empty.\"); return true; }\n await ctx.reply(renderList(cards));\n return true;\n }\n\n // /kanban all \u2014 everything\n if (arg === \"all\") {\n const cards = kanbanList(\"*\");\n if (cards.length === 0) { await ctx.reply(\"Kanban board is empty.\"); return true; }\n await ctx.reply(renderList(cards));\n return true;\n }\n\n // /kanban <id> \u2014 full ticket detail\n if (/^\\d+$/.test(arg)) {\n const card = kanbanGetCard(Number(arg));\n if (!card) { await ctx.reply(`No card #${arg}.`); return true; }\n await ctx.reply(renderDetail(card));\n return true;\n }\n\n // /kanban \"<term>\" \u2014 LIKE search (quotes mandatory)\n if (/^\".*\"$/.test(arg)) {\n const term = arg.slice(1, -1).trim();\n if (!term) { await ctx.reply(`Usage: /kanban \"<search term>\"`); return true; }\n const cards = kanbanSearch(term);\n if (cards.length === 0) { await ctx.reply(`No cards matching \"${term}\".`); return true; }\n await ctx.reply(renderList(cards));\n return true;\n }\n\n // Anything else \u2014 usage hint\n await ctx.reply(`Usage:\\n /kanban \u2014 active cards\\n /kanban all \u2014 all cards\\n /kanban <id> \u2014 ticket detail\\n /kanban \"<term>\" \u2014 search`);\n } catch (err) {\n await ctx.reply(`Failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n return true;\n}\n\nfunction renderList(cards: Awaited<ReturnType<typeof import(\"../tasks/kanban-board.js\").kanbanList>>): string {\n const lines = cards.map(c => {\n const icon = c.status === \"delivered\" ? \"\u2713\" : c.status === \"done\" ? \"+\" : c.status === \"running\" ? \"~\" : c.status === \"failed\" ? \"\u2717\" : \"-\";\n const due = c.due_at ? ` due:${c.due_at.slice(0, 10)}` : \"\";\n const doneAt = c.delivered_at ? ` ${c.delivered_at.slice(2, 10).replace(/-/g, \"\")}:${c.delivered_at.slice(11, 16).replace(\":\", \"\")}` : \"\";\n const title = c.title.length > 20 ? c.title.slice(0, 17) + \"\u2026\" : c.title;\n return `${icon} #${c.id} ${title} (${c.source}/${c.priority})${doneAt}${due}`;\n });\n const header = `Kanban Board (${cards.length}):\\n`;\n let body = \"\";\n for (const line of lines) {\n if (header.length + body.length + line.length + 1 > 3900) {\n body += `\\n\u2026 +${cards.length - body.split(\"\\n\").length} more`;\n break;\n }\n body += (body ? \"\\n\" : \"\") + line;\n }\n return header + body;\n}\n\nfunction renderDetail(c: Awaited<ReturnType<typeof import(\"../tasks/kanban-board.js\").kanbanGetCard>>): string {\n if (!c) return \"(not found)\";\n const icon = c.status === \"delivered\" ? \"\u2713\" : c.status === \"done\" ? \"+\" : c.status === \"running\" ? \"~\" : c.status === \"failed\" ? \"\u2717\" : \"-\";\n const lines = [\n `${icon} #${c.id}: ${c.title}`,\n `Status: ${c.status} | Priority: ${c.priority} | Source: ${c.source}`,\n ];\n if (c.type) lines.push(`Type: ${c.type}`);\n if (c.labels) lines.push(`Labels: ${c.labels}`);\n if (c.assignee && c.assignee !== \"professor\") lines.push(`Assignee: ${c.assignee}`);\n if (c.due_at) lines.push(`Due: ${c.due_at.slice(0, 10)}`);\n lines.push(`Created: ${c.created_at.slice(0, 16)}`);\n if (c.completed_at) lines.push(`Completed:${c.completed_at.slice(0, 16)}`);\n if (c.delivered_at) lines.push(`Delivered:${c.delivered_at.slice(0, 16)}`);\n if (c.result_path) lines.push(`File: ${c.result_path}`);\n if (c.result_summary) lines.push(`Result: ${c.result_summary.slice(0, 300)}${c.result_summary.length > 300 ? \"\u2026\" : \"\"}`);\n if (c.error) lines.push(`Error: ${c.error.slice(0, 200)}`);\n if (c.notes) lines.push(`Notes: ${c.notes.slice(0, 100)}`);\n return lines.join(\"\\n\");\n}\n\n/** /channel command \u2014 master visibility into agent discussions (#891). */\nexport async function handleChannel(text: string, ctx: CommandContext): Promise<boolean> {\n const args = text.replace(/^\\/channel\\s*/i, \"\").trim();\n\n const { channelRead, channelPost } = await import(\"../tasks/kanban-channel.js\");\n\n // /channel (no args) \u2014 list active channels\n if (!args) {\n const { kanbanList } = await import(\"../tasks/kanban-board.js\");\n const active = kanbanList(\"running\");\n if (active.length === 0) { await ctx.reply(\"No active channels.\"); return true; }\n const lines = active.map((c: any) => {\n const msgs = channelRead(c.id);\n return `#${c.id} \"${c.title}\" \u2014 ${msgs.length} msg${msgs.length !== 1 ? \"s\" : \"\"}`;\n });\n await ctx.reply(`\uD83D\uDCE1 Active channels:\\n${lines.join(\"\\n\")}`);\n return true;\n }\n\n // /channel <card_id> [message] or /channel <card_id> @Worker msg\n const match = args.match(/^(\\d+)\\s*(.*)?$/);\n if (!match) { await ctx.reply(\"Usage: /channel [card_id] [message]\"); return true; }\n\n const cardId = parseInt(match[1]!, 10);\n const rest = (match[2] ?? \"\").trim();\n\n // /channel <card_id> \u2014 show discussion\n if (!rest) {\n const msgs = channelRead(cardId);\n if (msgs.length === 0) { await ctx.reply(`Channel #${cardId}: empty.`); return true; }\n const lines = msgs.map(m => {\n const remote = m.remote_peer ? `[${m.remote_peer}] ` : \"\";\n const type = m.msg_type && m.msg_type !== \"progress\" ? `[${m.msg_type}] ` : \"\";\n return `${remote}[${m.from_agent}\u2192${m.to_agent}]${m.directive ? \" \u26A1\" : \"\"} ${type}${m.message}`;\n });\n await ctx.reply(`\uD83D\uDCE1 Channel #${cardId} (${msgs.length} msgs):\\n${lines.join(\"\\n\")}`);\n return true;\n }\n\n // /channel <card_id> @Worker-01 msg \u2014 targeted post\n const atMatch = rest.match(/^@(\\S+)\\s+(.+)$/);\n const to = atMatch ? atMatch[1]! : \"ALL\";\n const message = atMatch ? atMatch[2]! : rest;\n channelPost(cardId, \"master\", to, message, true);\n await ctx.reply(`\u2713 Posted to card:${cardId} [master\u2192${to}]`);\n return true;\n}\n\nexport async function handleTodo(_text: string, ctx: CommandContext): Promise<boolean> {\n const { existsSync, readFileSync } = await import(\"node:fs\");\n const { join } = await import(\"node:path\");\n const { abtarsHome } = await import(\"../../paths.js\");\n const todoPath = join(abtarsHome(), \"workspace\", \"todo\", \"todo.md\");\n if (!existsSync(todoPath)) { await ctx.reply(\"Todo list is empty.\"); return true; }\n const content = readFileSync(todoPath, \"utf-8\").trim();\n if (!content || content === \"# Todo List\") { await ctx.reply(\"Todo list is empty.\"); return true; }\n await ctx.reply(content);\n return true;\n}\n", "import { execAsync } from \"./exec-async.js\";\nimport { logAndSwallow } from \"../log-and-swallow.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(`\u2713 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(`\u2713 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 // #1141: /skill run <name>, /skill stop, /skill list (runnable)\n const args = text.replace(/^\\/skills?\\s*/, \"\").trim();\n if (args.startsWith(\"run \")) {\n const skillName = args.slice(4).trim();\n if (!skillName) { await ctx.reply(\"Usage: /skill run <name>\"); return true; }\n const { launchSkill } = await import(\"../skill-session.js\");\n const err = await launchSkill(skillName, ctx.userId, String(ctx.chatId));\n await ctx.reply(err ?? `* Skill \"${skillName}\" started.`);\n return true;\n }\n if (args === \"stop\") {\n const { endSkillSession } = await import(\"../skill-session.js\");\n const ended = await endSkillSession(String(ctx.chatId));\n await ctx.reply(ended ? \"* Skill session ended.\" : \"No active skill session.\");\n return true;\n }\n if (args === \"list\") {\n const { listRunnableSkills } = await import(\"../skill-session.js\");\n const skills = listRunnableSkills();\n if (skills.length === 0) { await ctx.reply(\"No runnable skills (no skill.json found).\"); return true; }\n const lines = skills.map(s => ` ${s.interactive ? \"~\" : \"*\"} ${s.name}${s.description ? ` \u2014 ${s.description}` : \"\"}`);\n await ctx.reply(`Runnable skills:\\n${lines.join(\"\\n\")}\\n\\nUse: /skill run <name>`);\n return true;\n }\n\n if (text.includes(\"reload\")) {\n const { reloadCatalog } = await import(\"../../capabilities/hotskills/index.js\");\n const count = reloadCatalog();\n await ctx.reply(`Reloaded \u2014 ${count} skills available.`);\n return true;\n }\n const { getSkillCache } = await import(\"../../capabilities/hotskills/index.js\");\n const skills = getSkillCache();\n if (skills.length === 0) { await ctx.reply(\"\uD83D\uDCDA No skills loaded.\"); return true; }\n\n const active = skills.filter(s => !s.skipped);\n const skipped = skills.filter(s => s.skipped);\n const groups = new Map<string, Array<typeof skills[number]>>();\n for (const s of skills) {\n const list = groups.get(s.group) ?? [];\n list.push(s);\n groups.set(s.group, list);\n }\n\n const header = `\uD83D\uDCDA Skills: ${active.length} active${skipped.length ? `, ${skipped.length} skipped` : \"\"}`;\n const sections: string[] = [];\n for (const [group, items] of [...groups.entries()].sort((a, b) => a[0].localeCompare(b[0]))) {\n const lines = items.map(s => s.skipped ? ` \u2717 ${s.name} (${s.skipped})` : ` \u2713 ${s.name}`);\n sections.push(`${group} (${items.length}):\\n${lines.join(\"\\n\")}`);\n }\n\n await ctx.reply(`${header}\\n\\n${sections.join(\"\\n\\n\")}`);\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 Operational health (PID, uptime, platforms, context)\",\n \"/software \u2014 Version info, deploy date, npm check, rollback\",\n \"/software update [pull|deploy] \u2014 Pull & build from git\",\n \"/software update npm \u2014 Update from npm registry\",\n \"/software rollback <version|slot> \u2014 Roll back to previous version or slot (1-3)\",\n \"/update \u2014 Alias for /software update pull\",\n \"/update abmind \u2014 Update abmind from dev (pull + build + install)\",\n \"/model \u2014 Model configuration (provider, context, fallbacks)\",\n \"/model set <name> \u2014 Switch model\",\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 \"/wait [msg] \u2014 Inject message mid-run (non-interrupting)\",\n \"/continue \u2014 Nudge model to continue after failure\",\n \"/usage \u2014 Token usage & cost this session\",\n \"/memory \u2014 Memory storage statistics\",\n \"/heartbeat \u2014 Heartbeat diagnostics (tasks, last tick)\",\n \"/models \u2014 Model, transport & agent status (legacy)\",\n \"/models change \u2014 Switch model/provider (any agent)\",\n \"/models quick <model> \u2014 Instant switch on same provider\",\n \"/emergency \u2014 \uD83D\uDEA8 Activate paid hailMary model\",\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 / /task resume <id> \u2014 Resume\",\n \"/todo \u2014 Todo list\",\n \"/facts \u2014 Core knowledge (user profile + agent notes)\",\n \"/skills \u2014 List active/skipped skills\",\n \"/session \u2014 List sessions\",\n \"/session new [browse|code|task] \u2014 New session\",\n \"/session <#> \u2014 Switch / /session end [#] \u2014 End / /session kill <#> \u2014 Kill\",\n \"/nlm \u2014 Knowledge base (list/create/sources/query)\",\n \"/restart \u2014 Restart bridge\",\n \"/wakeup \u2014 Wake Mac from sleep\",\n \"/sleep \u2014 Sleep status / /sleep resume / /sleep now\",\n \"/whoami \u2014 Your user info & clearance\",\n \"/reasoning \u2014 Reasoning effort (low/medium/high/none) + show/hide thinking\",\n \"/kanban \u2014 Kanban board\",\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 await ctx.reply(`\uD83D\uDCCB Available commands:\\n\\n${cmds.join(\"\\n\")}`);\n return true;\n}\n\nexport async function handlePeers(_text: string, ctx: CommandContext): Promise<boolean> {\n const { getPeerTable } = await import(\"../peer-transport/gossip.js\");\n const peers = getPeerTable(true);\n if (peers.length === 0) {\n await ctx.reply(\"No peers configured or gossip not started.\");\n return true;\n }\n const now = Date.now();\n const lines = peers\n .sort((a, b) => (a.alive === b.alive ? a.name.localeCompare(b.name) : a.alive ? -1 : 1))\n .map(p => {\n const age = Math.round((now - p.lastSeen) / 1000);\n const ageStr = age < 60 ? `${age}s ago` : `${Math.round(age / 60)}min ago`;\n const icon = p.alive ? \"\uD83D\uDFE2\" : \"\uD83D\uDD34\";\n const caps = p.capabilities.length ? ` [${p.capabilities.join(\", \")}]` : \"\";\n return `${icon} **${p.name}** (${ageStr}) \u2014 load ${p.load}${caps}`;\n });\n const alive = peers.filter(p => p.alive).length;\n lines.push(`\\n${peers.length} peer(s) (${alive} alive, ${peers.length - alive} dead)`);\n await ctx.reply(lines.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, sessionType } from \"../spin-types.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 const { getMasterUserId } = await import(\"../master-user.js\");\n const isMaster = ctx.userId === getMasterUserId();\n await ctx.reply(ctx.sessionManager.formatList(ctx.userId, ctx.platform, isMaster));\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 await ctx.reply(`\u2713 Session #${result.shortIndex} (${typeLabel(sessionType(result))}) created.`);\n ctx.sessionManager.greetSession(result, ctx.chatId, ctx.userId);\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(`\u2713 Session #${result.shortIndex} (${typeLabel(sessionType(result))}) 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(sessionType(result))}) 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(sessionType(result))}) 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(sessionType(result))}) 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(sessionType(result))}).`);\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 * 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, handleKanban,\n handleChannel, handleTodo,\n handleEmergencyAlias, handleModels, handleHeartbeat, handleReasoning, handleContinue,\n handleMemory, handleNlm, handleWakeup,\n handleSleep, handleSleepSub, handleHelp, handleSkills,\n handleHooks, handleMcp, handleUsers, handleUsage, handleOpenRouter, handleWhoami,\n handleSoftware, handlePeers, handleMetrics,\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(\"/health\", 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);\nregisterPrefix(\"/healing \", handleHealing);\nregisterExact(\"/software\", handleSoftware);\nregisterExact(\"/update\", handleSoftware);\nregisterExact(\"/facts\", handleFacts);\nregisterExact(\"/tasks\", handleTasksList);\nregisterExact(\"/task\", handleTasksList);\nregisterExact(\"/todo\", handleTodo);\nregisterExact(\"/kanban\", handleKanban);\nregisterPrefix(\"/kanban \", handleKanban);\nregisterExact(\"/channel\", handleChannel);\nregisterPrefix(\"/channel \", handleChannel);\nregisterExact(\"/memory\", handleMemory);\nregisterExact(\"/heartbeat\", handleHeartbeat);\nregisterExact(\"/models\", handleModels);\nregisterExact(\"/model\", handleModels);\nregisterExact(\"/change\", (_, ctx) => handleModels(\"/model change\", ctx));\nregisterExact(\"/reasoning\", handleReasoning);\nregisterExact(\"/continue\", handleContinue);\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(\"/peers\", handlePeers);\nregisterExact(\"/metrics\", handleMetrics);\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(\"/tasks log \", handleTasksLog);\nregisterPrefix(\"/task 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", "TAG", "readFileSync", "platform", "sessionType", "TAG", "sessionType", "text", "chunks", "err", "TAG", "hasHooks", "TAG", "getEnv", "writeFileSync", "join", "lines", "provider", "join", "TAG", "runAllProbes", "renderHuman", "output", "writeFileSync", "join", "readFileSync", "tc", "prof", "readdirSync", "loadUsers", "abtarsHome", "spawn", "lines", "getEnv", "homedir", "TAG", "spawn", "readFileSync", "readdirSync", "join", "TAG", "join", "spawn", "readdirSync", "readFileSync", "execFile", "TAG", "readEntries", "running", "readFileSync", "join", "abtarsHome", "TAG", "loadUsers", "writeFileSync", "readFileSync", "join", "abtarsHome", "skills", "TAG", "index"]
|
|
7
|
+
}
|