abtars 0.3.4-alpha.7 → 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-WGR4WOPT.js → _registry.generated-AVR7DK2A.js} +17 -14
- package/bundle/{_registry.generated-WGR4WOPT.js.map → _registry.generated-AVR7DK2A.js.map} +1 -1
- 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-task.js.map +2 -2
- package/bundle/abtars.js +610 -455
- 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-YAHKQMMZ.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-GI6CLT3Z.js → agent-registry-46A2R5KP.js} +7 -7
- package/bundle/{bootstrap-X2QYIZIJ.js → bootstrap-MIHJJSWU.js} +2 -2
- package/bundle/{bridge-lock-transport-4ZH7QTJP.js → bridge-lock-transport-7RSN7OLJ.js} +4 -4
- package/bundle/{browser-DMARZJIN.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-KTYGKPYM.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-LGP6TYFI.js → chunk-4AILRHUI.js} +97 -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-4UL3KINB.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-BNXV7SZI.js +195 -0
- 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-GXL7HJPT.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-XWRADSXO.js → chunk-GF6NVNA7.js} +15 -5
- package/bundle/chunk-GF6NVNA7.js.map +7 -0
- package/bundle/{chunk-SIFPBTI4.js → chunk-HGSHCQ5F.js} +113 -73
- package/bundle/chunk-HGSHCQ5F.js.map +7 -0
- package/bundle/{chunk-YRU2K3O6.js → chunk-IMIGG5EO.js} +39 -39
- package/bundle/chunk-IMIGG5EO.js.map +7 -0
- package/bundle/{chunk-W4EA4GCA.js → chunk-ITOFPJAV.js} +43 -31
- package/bundle/chunk-ITOFPJAV.js.map +7 -0
- package/bundle/{chunk-UPRZDU6T.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-5B5B6EHL.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-ONBF5DDU.js → chunk-L72RIPEC.js} +248 -182
- package/bundle/chunk-L72RIPEC.js.map +7 -0
- 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-BROFMHC2.js → chunk-PB5GF4FG.js} +334 -237
- 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-HKRSMUXJ.js → chunk-SC2Y5NR2.js} +71 -132
- 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-XYEGVUZF.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-QKNYQGTQ.js → delegation-tools-WS7Z56KZ.js} +12 -12
- package/bundle/{deploy-EPDWNHJU.js → deploy-AMTVKIMU.js} +2 -2
- package/bundle/{deps-WVK553KF.js → deps-T63AVJKJ.js} +3 -3
- package/bundle/{direct-api-transport-E3LNDBJT.js → direct-api-transport-QNNY2WWP.js} +56 -33
- package/bundle/direct-api-transport-QNNY2WWP.js.map +7 -0
- package/bundle/{discord-adapter-IT3KP3VB.js → discord-adapter-ABAD56Y2.js} +21 -20
- package/bundle/{discord-adapter-IT3KP3VB.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-ABWL3P7M.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-P5GAQU4Z.js → message-pipeline-GRDRWONR.js} +17 -16
- package/bundle/meta.json +3699 -3138
- 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-4CHEFWSN.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-I6JPLFZ2.js → peer-transport-SI7I72DB.js} +12 -10
- package/bundle/{phase-transport-PGKU2KD4.js → phase-transport-ESWWACZI.js} +17 -17
- package/bundle/{reconcile-CTFCLQRN.js → reconcile-GFDQYNBD.js} +3 -3
- package/bundle/{reconciler-EBKH3JNU.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-BMSRQSHV.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-36XS6MHJ.js → sleep-I4JFASCY.js} +11 -8
- package/bundle/{soul-bundle-VWAVHCZ6.js → soul-bundle-522C3IRH.js} +9 -8
- package/bundle/{spin-TI3TSVVT.js → spin-VHNGNWTD.js} +11 -11
- package/bundle/{spin-notifications-SE2HVZI7.js → spin-notifications-7NC5XZEM.js} +5 -5
- package/bundle/{spin-types-BLPYAETA.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-JZU5FO7B.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-H6PMFPMB.js → telegram-adapter-O6KIZDY6.js} +69 -46
- package/bundle/telegram-adapter-O6KIZDY6.js.map +7 -0
- package/bundle/{tool-registry-IZX2IOBM.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-MESYO4LO.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.service +2 -1
- package/scripts/abtars-watchdog.sh +1 -5
- package/scripts/emergency-deploy.sh +2 -2
- package/scripts/emergency-update.sh +88 -41
- package/bundle/chunk-3AAENI2K.js +0 -210
- package/bundle/chunk-3AAENI2K.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-5GCLBUBS.js +0 -257
- package/bundle/chunk-5GCLBUBS.js.map +0 -7
- package/bundle/chunk-BROFMHC2.js.map +0 -7
- package/bundle/chunk-EGL6UMAO.js.map +0 -7
- package/bundle/chunk-EQSG2CRM.js.map +0 -7
- package/bundle/chunk-GXL7HJPT.js.map +0 -7
- package/bundle/chunk-HKRSMUXJ.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-IKUZPMVA.js +0 -82
- package/bundle/chunk-IKUZPMVA.js.map +0 -7
- package/bundle/chunk-LGP6TYFI.js.map +0 -7
- package/bundle/chunk-ONBF5DDU.js.map +0 -7
- package/bundle/chunk-RWRRGE4U.js +0 -72
- package/bundle/chunk-RWRRGE4U.js.map +0 -7
- package/bundle/chunk-SIFPBTI4.js.map +0 -7
- package/bundle/chunk-VUIX5AGB.js +0 -65
- package/bundle/chunk-VUIX5AGB.js.map +0 -7
- package/bundle/chunk-W4EA4GCA.js.map +0 -7
- package/bundle/chunk-XWRADSXO.js.map +0 -7
- package/bundle/chunk-Y76VUJSF.js +0 -75
- package/bundle/chunk-Y76VUJSF.js.map +0 -7
- package/bundle/chunk-YRU2K3O6.js.map +0 -7
- package/bundle/context-2RJHC2LE.js.map +0 -7
- package/bundle/direct-api-transport-E3LNDBJT.js.map +0 -7
- package/bundle/dns-wakeup-IDOJIXBX.js.map +0 -7
- package/bundle/heartbeat-tier3-ABWL3P7M.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/public/css/dashboard.css +0 -542
- package/bundle/public/index.html +0 -180
- package/bundle/public/js/app.js +0 -437
- package/bundle/public/memory-universe.js +0 -384
- package/bundle/stream-single-RFJNUTL6.js +0 -34
- package/bundle/stream-single-RFJNUTL6.js.map +0 -7
- package/bundle/subagent-runtime-5QUVES3W.js +0 -14
- package/bundle/system-status-JZU5FO7B.js.map +0 -7
- package/bundle/telegram-adapter-H6PMFPMB.js.map +0 -7
- package/bundle/usage-tracker-NXD364VX.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/{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-YAHKQMMZ.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-GI6CLT3Z.js.map → agent-registry-46A2R5KP.js.map} +0 -0
- /package/bundle/{bootstrap-X2QYIZIJ.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-DMARZJIN.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-KTYGKPYM.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-4UL3KINB.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-UPRZDU6T.js.map → chunk-IY6UKLPS.js.map} +0 -0
- /package/bundle/{chunk-EUZDKV3C.js.map → chunk-J4RUFAPK.js.map} +0 -0
- /package/bundle/{chunk-5B5B6EHL.js.map → chunk-JLWYPGWI.js.map} +0 -0
- /package/bundle/{chunk-5QUTMUIK.js.map → chunk-JXYWDAHD.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-XYEGVUZF.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-QKNYQGTQ.js.map → delegation-tools-WS7Z56KZ.js.map} +0 -0
- /package/bundle/{deploy-EPDWNHJU.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-P5GAQU4Z.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-4CHEFWSN.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-I6JPLFZ2.js.map → phase-transport-ESWWACZI.js.map} +0 -0
- /package/bundle/{phase-transport-PGKU2KD4.js.map → reconcile-GFDQYNBD.js.map} +0 -0
- /package/bundle/{reconciler-EBKH3JNU.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-BMSRQSHV.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-36XS6MHJ.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-TI3TSVVT.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-BLPYAETA.js.map → stt-PSOPPBV4.js.map} +0 -0
- /package/bundle/{stt-LGVPXMVR.js.map → task-store-MNCW42BW.js.map} +0 -0
- /package/bundle/{subagent-runtime-5QUVES3W.js.map → tool-registry-JJMWCQKZ.js.map} +0 -0
- /package/bundle/{task-store-W5BFIAIH.js.map → tool-sandbox-CNL6V6IH.js.map} +0 -0
- /package/bundle/{tool-registry-IZX2IOBM.js.map → transport-config-6MB2K2XC.js.map} +0 -0
- /package/bundle/{tool-sandbox-4UC6GAKA.js.map → update-HGQAOC5L.js.map} +0 -0
- /package/bundle/{transport-config-KBF5W2DP.js.map → usage-tracker-SR4BI6ZT.js.map} +0 -0
- /package/bundle/{update-MESYO4LO.js.map → user-registry-4PACZJIJ.js.map} +0 -0
|
@@ -8,45 +8,46 @@ import {
|
|
|
8
8
|
emojiToTag,
|
|
9
9
|
formatReactionSignal,
|
|
10
10
|
routeReaction
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-W546CU3A.js";
|
|
12
12
|
import {
|
|
13
13
|
cleanResponse,
|
|
14
14
|
handleInboundMessage,
|
|
15
15
|
resetAndPrepare
|
|
16
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-PB5GF4FG.js";
|
|
17
17
|
import "./chunk-63A7ZRIH.js";
|
|
18
|
-
import "./chunk-
|
|
19
|
-
import "./chunk-
|
|
20
|
-
import "./chunk-
|
|
18
|
+
import "./chunk-3GQX34S2.js";
|
|
19
|
+
import "./chunk-JXYWDAHD.js";
|
|
20
|
+
import "./chunk-DZJ5QZFD.js";
|
|
21
|
+
import "./chunk-BNXV7SZI.js";
|
|
21
22
|
import "./chunk-YWZPKBO6.js";
|
|
22
|
-
import "./chunk-
|
|
23
|
-
import "./chunk-
|
|
23
|
+
import "./chunk-YJZE4OK3.js";
|
|
24
|
+
import "./chunk-Y5FEFKGM.js";
|
|
24
25
|
import {
|
|
25
26
|
init_user_registry,
|
|
26
27
|
loadUsers
|
|
27
|
-
} from "./chunk-
|
|
28
|
-
import "./chunk-Y76VUJSF.js";
|
|
29
|
-
import "./chunk-4S554KLW.js";
|
|
30
|
-
import "./chunk-LUNA6PM5.js";
|
|
28
|
+
} from "./chunk-E7XD5UGB.js";
|
|
31
29
|
import "./chunk-R76K6L6H.js";
|
|
32
|
-
import "./chunk-
|
|
33
|
-
import "./chunk-
|
|
30
|
+
import "./chunk-KOSFXW2S.js";
|
|
31
|
+
import "./chunk-3BG3AIDP.js";
|
|
32
|
+
import "./chunk-5RVOEFGT.js";
|
|
33
|
+
import "./chunk-WC5O5KOE.js";
|
|
34
|
+
import "./chunk-EFGBM555.js";
|
|
34
35
|
import "./chunk-N5KN3LGD.js";
|
|
35
36
|
import {
|
|
36
37
|
getEnv,
|
|
37
38
|
init_env_schema
|
|
38
|
-
} from "./chunk-
|
|
39
|
+
} from "./chunk-6PA5JBUU.js";
|
|
39
40
|
import {
|
|
40
41
|
init_log_and_swallow,
|
|
41
42
|
logAndSwallow
|
|
42
|
-
} from "./chunk-
|
|
43
|
+
} from "./chunk-2IYJ4I66.js";
|
|
43
44
|
import {
|
|
44
45
|
init_logger,
|
|
45
46
|
logDebug,
|
|
46
47
|
logError,
|
|
47
48
|
logInfo,
|
|
48
49
|
logWarn
|
|
49
|
-
} from "./chunk-
|
|
50
|
+
} from "./chunk-XRTXYN66.js";
|
|
50
51
|
import {
|
|
51
52
|
abtarsHome,
|
|
52
53
|
init_paths
|
|
@@ -98,7 +99,7 @@ var TelegramApi = class _TelegramApi {
|
|
|
98
99
|
/** Send a text message. Returns the sent message_id. */
|
|
99
100
|
async sendMessage(chatId, text, options) {
|
|
100
101
|
const body = { chat_id: chatId, text, ...options };
|
|
101
|
-
const res = await this.call("sendMessage", body);
|
|
102
|
+
const res = await this.call("sendMessage", body, void 0, _TelegramApi.WRITE_TIMEOUT_MS, false);
|
|
102
103
|
return res.message_id;
|
|
103
104
|
}
|
|
104
105
|
/** Edit an existing message's text. */
|
|
@@ -156,7 +157,7 @@ var TelegramApi = class _TelegramApi {
|
|
|
156
157
|
};
|
|
157
158
|
const response = await this.fetchWithRetry(
|
|
158
159
|
(signal) => fetch(`${this.baseUrl}/sendDocument`, { method: "POST", body: makeForm(), signal }),
|
|
159
|
-
{ method: "sendDocument", timeoutMs: getEnv().telegramFileTimeoutMs }
|
|
160
|
+
{ method: "sendDocument", timeoutMs: getEnv().telegramFileTimeoutMs, retryOnTimeout: false }
|
|
160
161
|
);
|
|
161
162
|
const json = await response.json();
|
|
162
163
|
if (!json.ok) throw new Error("Telegram API sendDocument returned ok=false");
|
|
@@ -182,6 +183,12 @@ var TelegramApi = class _TelegramApi {
|
|
|
182
183
|
}
|
|
183
184
|
static MAX_ATTEMPTS = 3;
|
|
184
185
|
static BACKOFF = [1e3, 3e3, 9e3];
|
|
186
|
+
/**
|
|
187
|
+
* #1294: Longer response-wait budget for non-idempotent writes. The global timeout (10s) was
|
|
188
|
+
* tripping on slow-but-successful sends during boot, causing a retry that double-delivered.
|
|
189
|
+
* A generous 30s lets slow sends complete instead of falsely timing out.
|
|
190
|
+
*/
|
|
191
|
+
static WRITE_TIMEOUT_MS = 3e4;
|
|
185
192
|
static PERMANENT_ERRORS = [
|
|
186
193
|
/chat not found/i,
|
|
187
194
|
/bot was blocked/i,
|
|
@@ -227,6 +234,8 @@ var TelegramApi = class _TelegramApi {
|
|
|
227
234
|
const msg = err instanceof Error ? err.message : String(err);
|
|
228
235
|
if (_TelegramApi.isPermanent(msg) || opts.outerSignal?.aborted) throw err;
|
|
229
236
|
if (!opts.retryable4xx && /failed \([4]\d\d\)/.test(msg)) throw err;
|
|
237
|
+
const isResponseWaitTimeout = /telegram timeout/i.test(msg);
|
|
238
|
+
if (isResponseWaitTimeout && opts.retryOnTimeout === false) throw err;
|
|
230
239
|
if (attempt < _TelegramApi.MAX_ATTEMPTS - 1 && _TelegramApi.isTransient(msg)) {
|
|
231
240
|
logDebug(TAG, `${opts.method} attempt ${attempt + 1}/${_TelegramApi.MAX_ATTEMPTS} \u2014 ${msg.slice(0, 80)}`);
|
|
232
241
|
await new Promise((r) => setTimeout(r, _TelegramApi.BACKOFF[attempt]));
|
|
@@ -239,7 +248,7 @@ var TelegramApi = class _TelegramApi {
|
|
|
239
248
|
}
|
|
240
249
|
throw new Error(`Telegram API ${opts.method}: unreachable`);
|
|
241
250
|
}
|
|
242
|
-
async call(method, body, signal, timeoutMs) {
|
|
251
|
+
async call(method, body, signal, timeoutMs, retryOnTimeout) {
|
|
243
252
|
const response = await this.fetchWithRetry(
|
|
244
253
|
(composed) => fetch(`${this.baseUrl}/${method}`, {
|
|
245
254
|
method: "POST",
|
|
@@ -247,7 +256,7 @@ var TelegramApi = class _TelegramApi {
|
|
|
247
256
|
body: JSON.stringify(body),
|
|
248
257
|
signal: composed
|
|
249
258
|
}),
|
|
250
|
-
{ method, timeoutMs, outerSignal: signal }
|
|
259
|
+
{ method, timeoutMs, outerSignal: signal, ...retryOnTimeout === false ? { retryOnTimeout: false } : {} }
|
|
251
260
|
);
|
|
252
261
|
const json = await response.json();
|
|
253
262
|
if (!json.ok) throw new Error(`Telegram API ${method} returned ok=false`);
|
|
@@ -292,7 +301,22 @@ var TelegramPoller = class {
|
|
|
292
301
|
}
|
|
293
302
|
/** Inject a synthetic update into the handler (used for queued messages after sleep). */
|
|
294
303
|
injectUpdate(update) {
|
|
295
|
-
|
|
304
|
+
this.dispatch(update);
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* Dispatch one update to the handler with a rejection guard. Fire-and-forget:
|
|
308
|
+
* the handler runs in the background so /stop stays responsive; a rejection is
|
|
309
|
+
* logged, never allowed to float into an unhandled rejection. (#1292)
|
|
310
|
+
*/
|
|
311
|
+
dispatch(update) {
|
|
312
|
+
try {
|
|
313
|
+
const result = this.onUpdate(update);
|
|
314
|
+
if (result instanceof Promise) {
|
|
315
|
+
result.catch((err) => logError("poller", "Error in update handler", err));
|
|
316
|
+
}
|
|
317
|
+
} catch (err) {
|
|
318
|
+
logError("poller", "Error in update handler (sync)", err);
|
|
319
|
+
}
|
|
296
320
|
}
|
|
297
321
|
async poll() {
|
|
298
322
|
let failures = 0;
|
|
@@ -310,14 +334,7 @@ var TelegramPoller = class {
|
|
|
310
334
|
const sorted = [...updates].sort((a, b) => a.update_id - b.update_id);
|
|
311
335
|
for (const update of sorted) {
|
|
312
336
|
if (update.update_id <= this.lastProcessedId) continue;
|
|
313
|
-
|
|
314
|
-
const result = this.onUpdate(update);
|
|
315
|
-
if (result instanceof Promise) {
|
|
316
|
-
result.catch((err) => logError("poller", "Error in update handler", err));
|
|
317
|
-
}
|
|
318
|
-
} catch (err) {
|
|
319
|
-
logError("poller", "Error in update handler (sync)", err);
|
|
320
|
-
}
|
|
337
|
+
this.dispatch(update);
|
|
321
338
|
}
|
|
322
339
|
this.lastProcessedId = sorted[sorted.length - 1].update_id;
|
|
323
340
|
this.offset = sorted[sorted.length - 1].update_id + 1;
|
|
@@ -409,7 +426,7 @@ async function handleModelPickerCallback(data, chatId, api, state, deps) {
|
|
|
409
426
|
}
|
|
410
427
|
if (target.startsWith("p:")) {
|
|
411
428
|
const agent = target.slice(2);
|
|
412
|
-
const { loadTransport, resolveAgent, getAvailableProviders, getModelsForProvider } = await import("./transport-config-
|
|
429
|
+
const { loadTransport, resolveAgent, getAvailableProviders, getModelsForProvider } = await import("./transport-config-6MB2K2XC.js");
|
|
413
430
|
const tc = loadTransport();
|
|
414
431
|
if (!tc) {
|
|
415
432
|
await api.sendMessage(chatId, "\u274C transport.json not loaded");
|
|
@@ -434,7 +451,7 @@ async function handleModelPickerCallback(data, chatId, api, state, deps) {
|
|
|
434
451
|
if (target.startsWith("s:")) {
|
|
435
452
|
const slot = target.slice(2);
|
|
436
453
|
state._pendingSlot = slot;
|
|
437
|
-
const { loadTransport, resolveAgent, getAvailableProviders, getModelsForProvider } = await import("./transport-config-
|
|
454
|
+
const { loadTransport, resolveAgent, getAvailableProviders, getModelsForProvider } = await import("./transport-config-6MB2K2XC.js");
|
|
438
455
|
const tc = loadTransport();
|
|
439
456
|
if (!tc) {
|
|
440
457
|
await api.sendMessage(chatId, "\u274C transport.json not loaded");
|
|
@@ -454,7 +471,7 @@ async function handleModelPickerCallback(data, chatId, api, state, deps) {
|
|
|
454
471
|
}
|
|
455
472
|
} else if (data.startsWith("mslot:")) {
|
|
456
473
|
const agent = data.slice(6);
|
|
457
|
-
const { loadTransport, resolveAgent, getAvailableProviders, getModelsForProvider } = await import("./transport-config-
|
|
474
|
+
const { loadTransport, resolveAgent, getAvailableProviders, getModelsForProvider } = await import("./transport-config-6MB2K2XC.js");
|
|
458
475
|
const tc = loadTransport();
|
|
459
476
|
if (!tc) {
|
|
460
477
|
await api.sendMessage(chatId, "\u274C transport.json not loaded");
|
|
@@ -492,7 +509,7 @@ async function handleModelPickerCallback(data, chatId, api, state, deps) {
|
|
|
492
509
|
await api.sendMessage(chatId, `\u{1F50C} Pick provider:`, { reply_markup: { inline_keyboard: buttons } });
|
|
493
510
|
} else if (data.startsWith("mprov:")) {
|
|
494
511
|
const [, agent, providerName] = data.split(":");
|
|
495
|
-
const { loadTransport, getModelsForProvider, formatRank, formatCost } = await import("./transport-config-
|
|
512
|
+
const { loadTransport, getModelsForProvider, formatRank, formatCost } = await import("./transport-config-6MB2K2XC.js");
|
|
496
513
|
const tc = loadTransport();
|
|
497
514
|
let models = getModelsForProvider(providerName);
|
|
498
515
|
const providerConfig = tc?.providers[providerName];
|
|
@@ -508,7 +525,7 @@ async function handleModelPickerCallback(data, chatId, api, state, deps) {
|
|
|
508
525
|
await api.sendMessage(chatId, `\u{1F4CB} Models on ${providerName}:`, { reply_markup: { inline_keyboard: buttons } });
|
|
509
526
|
} else if (data.startsWith("mpos:")) {
|
|
510
527
|
const [, , , slot] = data.split(":");
|
|
511
|
-
const { loadTransport, resolveAgent, getAvailableProviders, getModelsForProvider } = await import("./transport-config-
|
|
528
|
+
const { loadTransport, resolveAgent, getAvailableProviders, getModelsForProvider } = await import("./transport-config-6MB2K2XC.js");
|
|
512
529
|
const tc = loadTransport();
|
|
513
530
|
if (!tc) {
|
|
514
531
|
await api.sendMessage(chatId, "\u274C transport.json not loaded");
|
|
@@ -539,7 +556,7 @@ async function handleModelPickerCallback(data, chatId, api, state, deps) {
|
|
|
539
556
|
await api.sendMessage(chatId, `\u{1F50C} Provider for ${slotLabel}:`, { reply_markup: { inline_keyboard: buttons } });
|
|
540
557
|
} else if (data.startsWith("mprov2:")) {
|
|
541
558
|
const [, slot, providerName] = data.split(":");
|
|
542
|
-
const { getModelsForProvider, formatRank, formatCost, loadTransport } = await import("./transport-config-
|
|
559
|
+
const { getModelsForProvider, formatRank, formatCost, loadTransport } = await import("./transport-config-6MB2K2XC.js");
|
|
543
560
|
const tc = loadTransport();
|
|
544
561
|
const providerConfig = tc?.providers[providerName];
|
|
545
562
|
let models = getModelsForProvider(providerName);
|
|
@@ -562,7 +579,7 @@ async function handleModelPickerCallback(data, chatId, api, state, deps) {
|
|
|
562
579
|
const slot = state._pendingSlot ?? "professor";
|
|
563
580
|
state._pendingSlot = void 0;
|
|
564
581
|
state._modelPickerCache = [];
|
|
565
|
-
const { loadTransport, writeTransportConfig, resolveAgent, getModelsForProvider, validateProviderReady, formatValidationError } = await import("./transport-config-
|
|
582
|
+
const { loadTransport, writeTransportConfig, resolveAgent, getModelsForProvider, validateProviderReady, formatValidationError } = await import("./transport-config-6MB2K2XC.js");
|
|
566
583
|
const tc = loadTransport();
|
|
567
584
|
if (!tc) {
|
|
568
585
|
await api.sendMessage(chatId, "\u274C transport.json not loaded");
|
|
@@ -606,14 +623,14 @@ async function handleModelPickerCallback(data, chatId, api, state, deps) {
|
|
|
606
623
|
if (!tc.agents["professor"]) tc.agents["professor"] = { model: "", provider: "" };
|
|
607
624
|
if (!tc.agents["professor"].fallbacks) tc.agents["professor"].fallbacks = [];
|
|
608
625
|
tc.agents["professor"].fallbacks[fbIndex] = { model, provider: providerName };
|
|
609
|
-
const { cleanDemotedModels } = await import("./transport-config-
|
|
626
|
+
const { cleanDemotedModels } = await import("./transport-config-6MB2K2XC.js");
|
|
610
627
|
cleanDemotedModels(tc, model);
|
|
611
628
|
writeTransportConfig(tc, `professor fallback ${fbIndex + 1} \u2192 ${model} (${providerName})`);
|
|
612
629
|
await api.sendMessage(chatId, `\u2713 Fallback ${fbIndex + 1} \u2192 ${model} (${providerName})`);
|
|
613
630
|
} else {
|
|
614
631
|
const oldProvider = tc.agents[agentKey]?.provider;
|
|
615
632
|
tc.agents[agentKey] = { ...tc.agents[agentKey], model, provider: providerName };
|
|
616
|
-
const { cleanDemotedModels } = await import("./transport-config-
|
|
633
|
+
const { cleanDemotedModels } = await import("./transport-config-6MB2K2XC.js");
|
|
617
634
|
cleanDemotedModels(tc, model);
|
|
618
635
|
writeTransportConfig(tc, `${agentKey} \u2192 ${model} (${providerName})`);
|
|
619
636
|
const providerChanged = oldProvider !== providerName;
|
|
@@ -645,7 +662,7 @@ async function handleModelPickerCallback(data, chatId, api, state, deps) {
|
|
|
645
662
|
} else if (isProfessor && providerChanged && oldType === newType && "switchProvider" in deps.transport) {
|
|
646
663
|
try {
|
|
647
664
|
const { FallbackPolicy } = await import("./fallback-policy-SR6ED5I3.js");
|
|
648
|
-
const { ModelHealthRegistry } = await import("./model-health-registry-
|
|
665
|
+
const { ModelHealthRegistry } = await import("./model-health-registry-QADMFQFQ.js");
|
|
649
666
|
const apiKey = getEnv().getApiKey(newResolved?.provider.apiKeyEnv ?? "API_KEY");
|
|
650
667
|
const candidates = [{ endpoint: newResolved.provider.endpoint, apiKey, model, maxContext: newResolved.contextWindow }];
|
|
651
668
|
for (const fb of tc.agents["professor"]?.fallbacks ?? []) {
|
|
@@ -890,7 +907,7 @@ var TelegramAdapter = class {
|
|
|
890
907
|
await this.setReaction(String(chatId), messageId, "\u{1F440}");
|
|
891
908
|
const voiceFile = message.voice || message.audio;
|
|
892
909
|
const audioBuffer = await this.downloadVoice(voiceFile.file_id);
|
|
893
|
-
const { transcribeAudio } = await import("./stt-
|
|
910
|
+
const { transcribeAudio } = await import("./stt-PSOPPBV4.js");
|
|
894
911
|
const result = await transcribeAudio(audioBuffer, "voice.ogg", this.deps.pipeline.sttConfig);
|
|
895
912
|
const transcript = result.text;
|
|
896
913
|
if (!transcript) {
|
|
@@ -943,7 +960,7 @@ var TelegramAdapter = class {
|
|
|
943
960
|
let mediaPath;
|
|
944
961
|
if ((hasPhoto || hasDocument) && this.securityGate.authorizeById(String(message.from?.id))) {
|
|
945
962
|
try {
|
|
946
|
-
const { saveInboundMedia } = await import("./media-utils-
|
|
963
|
+
const { saveInboundMedia } = await import("./media-utils-HUUIALAJ.js");
|
|
947
964
|
let fileId;
|
|
948
965
|
let extHint;
|
|
949
966
|
let claimedMime;
|
|
@@ -977,7 +994,7 @@ ${text}`;
|
|
|
977
994
|
}
|
|
978
995
|
if (reply?.photo?.length && !mediaPath && this.securityGate.authorizeById(String(message.from?.id))) {
|
|
979
996
|
try {
|
|
980
|
-
const { saveInboundMedia } = await import("./media-utils-
|
|
997
|
+
const { saveInboundMedia } = await import("./media-utils-HUUIALAJ.js");
|
|
981
998
|
const photo = reply.photo[reply.photo.length - 1];
|
|
982
999
|
const buf = await this.downloadVoice(photo.file_id);
|
|
983
1000
|
const saved = await saveInboundMedia(buf, chatId, { extHint: ".jpg" });
|
|
@@ -1036,7 +1053,7 @@ ${text}`;
|
|
|
1036
1053
|
const tag = emojiToTag(emojis[0]);
|
|
1037
1054
|
const updated = this.deps.memory.updateEmotionByPlatformId(loadUsers().byPlatformId.get(`telegram:${chatId}`)?.userId ?? "master", reaction.message_id, score, tag);
|
|
1038
1055
|
if (updated) logDebug(TAG4, `Emotion score ${score} set on platform msg ${reaction.message_id}`);
|
|
1039
|
-
const { getRecalledIdsForMessage } = await import("./message-pipeline-
|
|
1056
|
+
const { getRecalledIdsForMessage } = await import("./message-pipeline-GRDRWONR.js");
|
|
1040
1057
|
const recalledIds = getRecalledIdsForMessage(reaction.message_id);
|
|
1041
1058
|
if (recalledIds && recalledIds.length > 0) {
|
|
1042
1059
|
if (score < 0) {
|
|
@@ -1059,14 +1076,20 @@ ${text}`;
|
|
|
1059
1076
|
} else {
|
|
1060
1077
|
const reactionUser = loadUsers().byPlatformId.get("telegram:" + user.id)?.userId ?? "unknown";
|
|
1061
1078
|
const activeId = this.deps.sessionManager.getActiveSessionId(reactionUser, "telegram");
|
|
1062
|
-
const { spin } = await import("./spin-
|
|
1079
|
+
const { spin } = await import("./spin-VHNGNWTD.js");
|
|
1063
1080
|
const entry = spin.getSessionById(activeId);
|
|
1064
1081
|
if (entry?.busy) {
|
|
1065
1082
|
entry.queue.push({ msg: { userId: reactionUser, channelId: String(chatId), senderName, senderId: String(user.id), text: signal, messageId: reaction.message_id, platform: "telegram", timestamp: Date.now(), isGroup: false, isVoice: false }, adapter: this });
|
|
1066
1083
|
logDebug(TAG4, `Queued reaction signal for busy ${activeId} (${entry.queue.length} pending)`);
|
|
1067
1084
|
} else {
|
|
1068
1085
|
try {
|
|
1069
|
-
const response = await
|
|
1086
|
+
const { result: response } = await spin.spin({
|
|
1087
|
+
type: "A",
|
|
1088
|
+
sessionId: activeId,
|
|
1089
|
+
prompt: signal,
|
|
1090
|
+
userId: reactionUser,
|
|
1091
|
+
await: true
|
|
1092
|
+
});
|
|
1070
1093
|
logDebug(TAG4, `Sent reaction signal to transport for chat ${chatId}`);
|
|
1071
1094
|
if (response) {
|
|
1072
1095
|
const { text, reactionEmoji, noReply } = cleanResponse(response);
|
|
@@ -1092,4 +1115,4 @@ export {
|
|
|
1092
1115
|
TELEGRAM_CAPABILITIES,
|
|
1093
1116
|
TelegramAdapter
|
|
1094
1117
|
};
|
|
1095
|
-
//# sourceMappingURL=telegram-adapter-
|
|
1118
|
+
//# sourceMappingURL=telegram-adapter-O6KIZDY6.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/platforms/telegram/telegram-adapter.ts", "../src/platforms/telegram/telegram-api.ts", "../src/platforms/telegram/telegram-poller.ts", "../src/platforms/telegram/offset-store.ts", "../src/platforms/telegram/telegram-model-picker.ts"],
|
|
4
|
+
"sourcesContent": ["import { BOT_COMMANDS } from \"../../components/command-registry.js\";\nimport { abtarsHome } from \"../../paths.js\";\n/**\n * Telegram platform adapter \u2014 wraps TelegramApi, TelegramPoller, SecurityGate.\n * Handles Telegram-specific pre-processing (voice, reactions, groups, mentions)\n * then delegates to the shared message pipeline.\n */\n\nimport { TelegramApi } from \"./telegram-api.js\";\nimport { TelegramPoller } from \"./telegram-poller.js\";\nimport { createFileOffsetStore } from \"./offset-store.js\";\nimport { SecurityGate } from \"../../components/security-gate.js\";\nimport { ResponseFormatter } from \"../../components/response-formatter.js\";\nimport { formatReactionSignal, routeReaction } from \"../../components/reactions.js\";\nimport { cleanResponse } from \"../../components/clean-response.js\";\n\nexport const TELEGRAM_CAPABILITIES: PlatformCapabilities = { voice: true, reactions: true, typing: true, threads: true };\nimport { emojiToScore, emojiToTag } from \"../../utils/emoji-score.js\";\nimport { logInfo, logWarn, logError, logDebug } from \"../../components/logger.js\";\nimport { logAndSwallow } from \"../../components/log-and-swallow.js\";\nimport { handleInboundMessage, resetAndPrepare, type PipelineDeps } from \"../../components/message-pipeline.js\";\nimport type { PlatformAdapter, PlatformCapabilities, InboundMessage, SendOpts } from \"../../types/platform.js\";\nimport type { TelegramUpdate } from \"../../types/index.js\";\nimport type { ConversationBuffer } from \"../../components/conversation-buffer.js\";\nimport type { IKiroTransport } from \"../../components/transport/kiro-transport.js\";\nimport type { IMemorySystem } from \"abmind\";\nimport { loadUsers } from \"../../components/user-registry.js\";\nimport { isModelPickerCallback, handleModelPickerCallback } from \"./telegram-model-picker.js\";\n\nconst TAG = \"telegram\";\n\nexport interface TelegramAdapterConfig {\n botToken: string;\n allowedUserIds: Set<number>;\n pollTimeoutS: number;\n}\n\nexport interface TelegramAdapterDeps {\n pipeline: PipelineDeps;\n conversationBuffer: ConversationBuffer;\n transport: IKiroTransport;\n memory: IMemorySystem | null;\n sessionManager: { getActiveSessionId(userId: string, platform: string): string };\n actionGate?: { handleCallback(data: string): boolean } | null;\n}\n\nexport class TelegramAdapter implements PlatformAdapter {\n readonly name = \"telegram\" as const;\n readonly capabilities: PlatformCapabilities = TELEGRAM_CAPABILITIES;\n\n private readonly api: TelegramApi;\n private readonly securityGate: SecurityGate;\n private readonly formatter = new ResponseFormatter();\n private readonly config: TelegramAdapterConfig;\n private deps: TelegramAdapterDeps;\n private poller: TelegramPoller | null = null;\n private botUsername = \"\";\n _pendingSlot: string | undefined;\n _modelPickerCache: string[] = [];\n\n constructor(config: TelegramAdapterConfig, deps: TelegramAdapterDeps) {\n this.api = new TelegramApi(config.botToken);\n this.securityGate = new SecurityGate(loadUsers());\n this.config = config;\n this.deps = deps;\n }\n\n /** Late-bind: replace pipeline deps after construction (used by graph boot). */\n setMessageHandler(deps: TelegramAdapterDeps): void { this.deps = deps; }\n\n /** Send a system notification to a chat (fire-and-forget). */\n sendNotification(chatId: string, text: string): void {\n this.api.sendMessage(parseInt(chatId, 10), text).catch(err => logAndSwallow(TAG, \"sendNotification\", err));\n }\n\n /** Reset session after model switch \u2014 saves idle state, clears buffer, marks pendingStart. */\n private async resetSessionForModelSwitch(chatId: number, reason = \"model-switch\"): Promise<void> {\n await this.api.sendMessage(chatId, \"Resetting session\u2026\");\n const p = this.deps.pipeline;\n const sessionKey = `telegram:${chatId}`;\n const bufKey = `telegram:${chatId}`;\n await p.idleSave.save(sessionKey, chatId);\n await resetAndPrepare({\n transport: this.deps.transport, sessionKey, reason,\n conversationBuffer: this.deps.conversationBuffer, bufKey,\n });\n if (p.memoryConfig.memoryEnabled) {\n const reg = loadUsers();\n const user = reg.byPlatformId.get(String(chatId));\n if (user) p.updateCtxStart(p.memoryConfig.memoryDir, user.userId);\n }\n }\n\n async start(): Promise<void> {\n const botInfo = await this.api.getMe();\n this.botUsername = botInfo.username?.toLowerCase() ?? \"\";\n logInfo(TAG, `\uD83E\uDD16 Bot: @${botInfo.username}`);\n\n await this.api.setMyCommands(BOT_COMMANDS.map(c => ({ command: c.name, description: c.description })))\n .catch((err) => logWarn(TAG, `setMyCommands failed: ${err instanceof Error ? err.message : String(err)}`));\n\n const home = abtarsHome();\n const offsetStore = createFileOffsetStore(`${home}/state/telegram-offset`);\n this.poller = new TelegramPoller(this.api, this.config.pollTimeoutS, (u) => this.handleUpdate(u), offsetStore);\n await this.poller.start();\n }\n\n stop(): void {\n this.poller?.stop();\n this.poller = null;\n }\n\n authorize(msg: InboundMessage): boolean {\n return this.securityGate.authorizeById(msg.senderId);\n }\n\n async sendMessage(channelId: string, text: string, opts?: SendOpts): Promise<number | undefined> {\n const chatId = parseInt(channelId, 10);\n const sendOpts: Record<string, unknown> = {};\n if (opts?.threadId) sendOpts.message_thread_id = parseInt(opts.threadId, 10);\n if (opts?.parseMode) sendOpts.parse_mode = opts.parseMode;\n if (opts?.reply_markup) sendOpts.reply_markup = opts.reply_markup;\n return this.api.sendMessage(chatId, text, sendOpts);\n }\n\n async editMessage(channelId: string, messageId: number, text: string): Promise<void> {\n const chatId = parseInt(channelId, 10);\n await this.api.editMessageText(chatId, messageId, text);\n }\n\n chunkResponse(text: string): string[] {\n return this.formatter.chunkText(text);\n }\n\n async sendTyping(channelId: string, threadId?: string): Promise<void> {\n await this.api.sendChatAction(parseInt(channelId, 10), \"typing\", threadId ? parseInt(threadId, 10) : undefined);\n }\n\n async setReaction(channelId: string, messageId: number, emoji: string): Promise<void> {\n if (messageId <= 0) return;\n try {\n const reaction = emoji ? [{ type: \"emoji\" as const, emoji }] : [];\n await this.api.setMessageReaction(parseInt(channelId, 10), messageId, reaction);\n } catch (err) {\n logDebug(TAG, `React failed (${emoji || \"remove\"}): ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n async downloadVoice(fileId: string): Promise<Buffer> {\n const fileInfo = await this.api.getFile(fileId);\n if (!fileInfo.file_path) throw new Error(\"No file_path returned\");\n return this.api.downloadFile(fileInfo.file_path);\n }\n\n async sendVoice(channelId: string, audio: Buffer, opts?: SendOpts): Promise<void> {\n const sendOpts: Record<string, unknown> = {};\n if (opts?.threadId) sendOpts.message_thread_id = parseInt(opts.threadId, 10);\n await this.api.sendVoice(parseInt(channelId, 10), audio, sendOpts);\n }\n\n /** Send a file from disk as a Telegram document. */\n async sendDocument(channelId: string, filePath: string, caption?: string, opts?: SendOpts): Promise<number> {\n const sendOpts: { message_thread_id?: number } = {};\n if (opts?.threadId) sendOpts.message_thread_id = parseInt(opts.threadId, 10);\n return this.api.sendDocument(parseInt(channelId, 10), filePath, caption, sendOpts);\n }\n\n injectMessage(msg: InboundMessage): void {\n if (!this.poller) return;\n this.poller.injectUpdate({\n update_id: 0,\n message: {\n message_id: 0,\n from: { id: parseInt(msg.channelId, 10), is_bot: false, first_name: \"queued\" },\n chat: { id: parseInt(msg.channelId, 10), type: \"private\" },\n date: Math.floor(Date.now() / 1000),\n text: msg.text,\n ...(msg.threadId ? { message_thread_id: parseInt(msg.threadId, 10) } : {}),\n },\n });\n }\n\n // --- Internal: Telegram update handler ---\n\n private async handleUpdate(update: TelegramUpdate): Promise<void> {\n logDebug(TAG, `Update: ${JSON.stringify(update).slice(0, 200)}`);\n\n if (update.callback_query) {\n const data = update.callback_query.data ?? \"\";\n const chatId = update.callback_query.message?.chat?.id;\n this.api.answerCallbackQuery(update.callback_query.id).catch(err => logAndSwallow(TAG, \"answerCallbackQuery\", err));\n if (!chatId) return;\n\n try {\n if (isModelPickerCallback(data)) {\n await handleModelPickerCallback(data, chatId, this.api, this, {\n transport: this.deps.transport as any,\n pipeline: this.deps.pipeline as any,\n resetSessionForModelSwitch: (cid, reason) => this.resetSessionForModelSwitch(cid, reason),\n });\n } else if (data.startsWith(\"model:\")) {\n // Legacy callback \u2014 direct model switch\n const newModel = data.slice(6);\n const transport = this.deps.transport;\n if (\"setModel\" in transport && typeof (transport as { setModel: unknown }).setModel === \"function\") {\n try {\n await (transport as { setModel: (m: string) => Promise<void> | void }).setModel(newModel);\n await this.resetSessionForModelSwitch(chatId);\n if (chatId) await this.api.sendMessage(chatId, `\uD83E\uDD16 Model switched \u2192 ${newModel}`);\n } catch (err) {\n if (chatId) await this.api.sendMessage(chatId, `\u274C Model switch failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n } else if (data.startsWith(\"auth:\")) {\n // ActionGate authorization callback\n if (this.deps.actionGate?.handleCallback(data)) {\n await this.api.sendMessage(chatId, \"\u2713 Responded.\");\n }\n }\n } catch (err) {\n logWarn(TAG, `Callback handler error: ${err instanceof Error ? err.message : String(err)}`);\n this.api.sendMessage(chatId, `\u26A0\uFE0F Action failed \u2014 try again.`).catch(err2 => logAndSwallow(TAG, \"sendMessage action failed\", err2));\n }\n return;\n }\n\n if (update.message_reaction) {\n await this.handleReaction(update);\n return;\n }\n\n const message = update.message ?? (update.edited_message?.text?.startsWith(\"/\") ? update.edited_message : undefined);\n if (!message?.from) return;\n\n const hasText = Boolean(message.text);\n const hasVoice = Boolean(message.voice || message.audio);\n const hasPhoto = Boolean(message.photo?.length);\n const hasDocument = Boolean(message.document);\n if (!hasText && !hasVoice && !hasPhoto && !hasDocument) return;\n\n const chatId = message.chat.id;\n const isGroup = message.chat.type === \"group\" || message.chat.type === \"supergroup\";\n const threadId = isGroup ? message.message_thread_id : undefined;\n const messageId = message.message_id;\n const senderName = message.from.first_name || message.from.username || `id:${message.from.id}`;\n const bufKey = threadId != null ? `tg:${chatId}:${threadId}` : `tg:${chatId}`;\n\n let text = message.text ?? \"\";\n let isVoiceNote = false;\n let voiceFileId: string | undefined;\n\n // --- Voice note pre-processing ---\n if (hasVoice && !hasText) {\n if (!this.deps.pipeline.sttConfig) {\n if (isGroup) {\n this.deps.conversationBuffer.push(bufKey, senderName, \"[voice note - STT disabled]\");\n } else if (this.securityGate.authorizeById(String(message.from?.id))) {\n await this.api.sendMessage(chatId, \"\uD83C\uDFA4 Voice notes require STT (set GROQ_API_KEY).\", { message_thread_id: threadId });\n }\n return;\n }\n\n if (!this.securityGate.authorizeById(String(message.from?.id))) {\n if (isGroup) this.deps.conversationBuffer.push(bufKey, senderName, \"[voice note]\");\n return;\n }\n\n // For groups: we need to transcribe first to check for bot mention\n if (isGroup) {\n try {\n await this.setReaction(String(chatId), messageId, \"\uD83D\uDC40\");\n const voiceFile = message.voice || message.audio;\n const audioBuffer = await this.downloadVoice(voiceFile!.file_id);\n const { transcribeAudio } = await import(\"../../components/stt.js\");\n const result = await transcribeAudio(audioBuffer, \"voice.ogg\", this.deps.pipeline.sttConfig!);\n const transcript = result.text;\n\n if (!transcript) {\n await this.setReaction(String(chatId), messageId, \"\");\n this.deps.conversationBuffer.push(bufKey, senderName, \"[voice note - empty]\");\n return;\n }\n\n const mentionRe = new RegExp(`@?${this.botUsername}\\\\b`, \"i\");\n if (!mentionRe.test(transcript) && !transcript.startsWith(\"/\")) {\n await this.setReaction(String(chatId), messageId, \"\");\n this.deps.conversationBuffer.push(bufKey, senderName, `[voice] ${transcript}`);\n logDebug(TAG, `Buffered voice transcript: \"${transcript.slice(0, 60)}\"`);\n return;\n }\n text = transcript.replace(mentionRe, \"\").trim();\n isVoiceNote = true;\n if (!text) { await this.setReaction(String(chatId), messageId, \"\"); return; }\n } catch (err) {\n logError(TAG, \"Voice transcription failed\", err);\n await this.setReaction(String(chatId), messageId, \"\");\n return;\n }\n } else {\n // DM voice: let pipeline handle STT\n isVoiceNote = true;\n voiceFileId = (message.voice || message.audio)!.file_id;\n }\n }\n\n // --- Group text filtering ---\n if (!isVoiceNote && isGroup) {\n const mentionRe = new RegExp(`@${this.botUsername}\\\\b`, \"i\");\n const isMention = mentionRe.test(text);\n const isCommand = text.startsWith(\"/\");\n\n if (!isMention && !isCommand) {\n this.deps.conversationBuffer.push(bufKey, senderName, text);\n logDebug(TAG, `Buffered group msg from ${senderName}: \"${text.slice(0, 60)}\"`);\n return;\n }\n\n if (isMention) {\n text = text.replace(mentionRe, \"\").trim();\n if (!text) return;\n }\n }\n\n // --- Security ---\n if (!isVoiceNote && !this.securityGate.authorizeById(String(message.from?.id))) {\n if (isGroup) this.deps.conversationBuffer.push(bufKey, senderName, text);\n logWarn(TAG, `Unauthorized user ${message.from.id}`);\n return;\n }\n\n // --- Photo/document handling ---\n let mediaPath: string | undefined;\n\n if ((hasPhoto || hasDocument) && this.securityGate.authorizeById(String(message.from?.id))) {\n try {\n const { saveInboundMedia } = await import(\"../../components/media-utils.js\");\n let fileId: string;\n let extHint: string | undefined;\n let claimedMime: string | undefined;\n\n if (hasPhoto) {\n const photo = message.photo![message.photo!.length - 1]!;\n fileId = photo.file_id;\n extHint = \".jpg\";\n } else {\n fileId = message.document!.file_id;\n extHint = message.document!.file_name ? \".\" + (message.document!.file_name.split(\".\").pop() ?? \"\") : undefined;\n claimedMime = message.document!.mime_type;\n }\n\n const buf = await this.downloadVoice(fileId); // reuse file download\n const saved = await saveInboundMedia(buf, chatId, { extHint, claimedMime });\n if (saved) {\n mediaPath = saved.path;\n if (!text) text = message.caption ?? `User sent a ${saved.isImage ? \"photo\" : \"file\"}.`;\n } else {\n if (!text) text = \"\u26A0\uFE0F File too large (max 16MB).\";\n }\n } catch (err) {\n logWarn(TAG, `Media download failed: ${err instanceof Error ? err.message : String(err)}`);\n if (!text) text = \"\u26A0\uFE0F Failed to download media.\";\n }\n }\n\n // --- Reply context ---\n const reply = message.reply_to_message;\n if (reply?.text) {\n const replyFrom = reply.from?.first_name ?? \"someone\";\n text = `[Replying to ${replyFrom}: \"${reply.text.slice(0, 500)}\"]\\n${text}`;\n }\n\n // --- Reply-to-photo: re-download and inject (#668) ---\n if (reply?.photo?.length && !mediaPath && this.securityGate.authorizeById(String(message.from?.id))) {\n try {\n const { saveInboundMedia } = await import(\"../../components/media-utils.js\");\n const photo = reply.photo[reply.photo.length - 1]!;\n const buf = await this.downloadVoice(photo.file_id);\n const saved = await saveInboundMedia(buf, chatId, { extHint: \".jpg\" });\n if (saved) mediaPath = saved.path;\n } catch (err) {\n logWarn(TAG, `Reply-to-photo download failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n // --- Dispatch to pipeline ---\n const resolvedUser = loadUsers().byPlatformId.get(\"telegram:\" + message.from.id)?.userId ?? \"unknown\";\n const inbound: InboundMessage = {\n platform: \"telegram\",\n channelId: String(chatId),\n userId: resolvedUser,\n senderId: String(message.from.id),\n senderName,\n text,\n timestamp: message.date * 1000,\n threadId: threadId != null ? String(threadId) : undefined,\n messageId,\n isGroup,\n isVoice: isVoiceNote,\n voiceFileId,\n mediaPath,\n rawPlatformData: message,\n };\n\n // /stop, /ctrlc, /restart now handled in commandMiddleware (platform-agnostic)\n\n // #512: commands bypass the sequential await \u2014 execute immediately even if agent is mid-stream\n if (text.startsWith(\"/\") && !text.startsWith(\"//\")) {\n if (!this.deps.pipeline?.sessionManager) return; // pipeline not wired yet\n handleInboundMessage(inbound, this, this.deps.pipeline).catch((err) => {\n logError(TAG, `Command dispatch error: ${err instanceof Error ? err.message : String(err)}`);\n });\n return;\n }\n\n if (!this.deps.pipeline?.sessionManager) return; // pipeline not wired yet\n await handleInboundMessage(inbound, this, this.deps.pipeline);\n }\n\n private async handleReaction(update: TelegramUpdate): Promise<void> {\n const reaction = update.message_reaction!;\n const user = reaction.user;\n if (!user) { logDebug(TAG, \"Reaction update missing user field\"); return; }\n if (user.is_bot) return;\n\n const oldEmojis = new Set(reaction.old_reaction.map((r) => r.emoji));\n const added = reaction.new_reaction.filter((r) => !oldEmojis.has(r.emoji));\n if (added.length === 0) return;\n\n const senderName = user.first_name || user.username || `id:${user.id}`;\n const emojis = added.map((r) => r.emoji);\n logInfo(TAG, `Reaction ${emojis.join(\"\")} from ${senderName} on msg ${reaction.message_id}`);\n\n const isAuthorized = this.securityGate.authorizeById(String(user.id));\n const signal = formatReactionSignal(senderName, emojis);\n const chatId = reaction.chat.id;\n const route = routeReaction(isAuthorized, reaction.chat.type);\n\n if (isAuthorized && this.deps.memory) {\n const score = emojiToScore(emojis[0]!);\n const tag = emojiToTag(emojis[0]!);\n const updated = this.deps.memory.updateEmotionByPlatformId(loadUsers().byPlatformId.get(`telegram:${chatId}`)?.userId ?? \"master\", reaction.message_id, score, tag);\n if (updated) logDebug(TAG, `Emotion score ${score} set on platform msg ${reaction.message_id}`);\n\n // #824: Emoji reaction as recall quality feedback\n const { getRecalledIdsForMessage } = await import(\"../../components/message-pipeline.js\");\n const recalledIds = getRecalledIdsForMessage(reaction.message_id);\n if (recalledIds && recalledIds.length > 0) {\n if (score < 0) {\n this.deps.memory.bumpRejectedCount(recalledIds);\n logDebug(TAG, `Recall rejection: ${recalledIds.length} memories penalized (emoji ${emojis[0]})`);\n } else if (score > 0) {\n this.deps.memory.bumpCitedCount(recalledIds);\n logDebug(TAG, `Recall confirmed: ${recalledIds.length} memories boosted (emoji ${emojis[0]})`);\n }\n }\n }\n\n if (route === \"discard\") {\n logDebug(TAG, `Unauthorized reaction from user ${user.id}, discarding`);\n return;\n }\n\n if (route === \"buffer\") {\n const bufKey = `tg:${chatId}`;\n this.deps.conversationBuffer.push(bufKey, senderName, signal);\n logDebug(TAG, `Buffered reaction signal for group ${chatId}`);\n } else {\n const reactionUser = loadUsers().byPlatformId.get(\"telegram:\" + user.id)?.userId ?? \"unknown\";\n const activeId = this.deps.sessionManager.getActiveSessionId(reactionUser, \"telegram\");\n const { spin } = await import(\"../../components/spin.js\");\n const entry = spin.getSessionById(activeId);\n if (entry?.busy) {\n entry.queue.push({ msg: { userId: reactionUser, channelId: String(chatId), senderName, senderId: String(user.id), text: signal, messageId: reaction.message_id, platform: \"telegram\", timestamp: Date.now(), isGroup: false, isVoice: false }, adapter: this });\n logDebug(TAG, `Queued reaction signal for busy ${activeId} (${entry.queue.length} pending)`);\n } else {\n try {\n // #1271: reaction signal goes through spin() (model-call chokepoint)\n const { result: response } = await spin.spin({\n type: \"A\", sessionId: activeId, prompt: signal,\n userId: reactionUser, await: true,\n });\n logDebug(TAG, `Sent reaction signal to transport for chat ${chatId}`);\n if (response) {\n const { text, reactionEmoji, noReply } = cleanResponse(response);\n if (noReply) { /* silent */ }\n else if (reactionEmoji) {\n try { await this.api.setMessageReaction(chatId, reaction.message_id, [{ type: \"emoji\", emoji: reactionEmoji }]); }\n catch { await this.sendMessage(String(chatId), reactionEmoji); }\n } else if (text.trim()) {\n await this.sendMessage(String(chatId), text.trim());\n }\n }\n } catch (err) {\n logError(TAG, `Failed to send reaction signal for chat ${chatId}`, err);\n }\n }\n }\n }\n}\n", "import { getEnv } from \"../../components/env-schema.js\";\nimport { logDebug } from \"../../components/logger.js\";\nimport { logAndSwallow } from \"../../components/log-and-swallow.js\";\nimport type {\n TelegramUpdate,\n TelegramInlineKeyboardMarkup,\n} from \"../../types/index.js\";\nimport { readFileSync } from \"node:fs\";\nimport { basename } from \"node:path\";\n\ntype SendMessageOptions = {\n parse_mode?: \"MarkdownV2\" | \"HTML\";\n reply_markup?: TelegramInlineKeyboardMarkup;\n message_thread_id?: number;\n};\n\nconst TAG = \"telegram-api\";\n\n/** Options for fetchWithRetry. */\ninterface FetchRetryOpts {\n method: string;\n timeoutMs?: number;\n outerSignal?: AbortSignal;\n /** Retry on 4xx responses. Default false \u2014 4xx usually permanent (404 expired, 403 auth). */\n retryable4xx?: boolean;\n /**\n * #1294: Retry when OUR response-wait timeout fires. Default true (safe for idempotent reads\n * like getUpdates long-poll). Set false for non-idempotent writes (sendMessage/sendDocument):\n * a response-wait timeout means Telegram may have already accepted the request, so retrying\n * would double-deliver. We accept an occasional lost message over a visible duplicate.\n * Note: this ONLY gates our own \"telegram timeout\" abort \u2014 hard network errors (ETIMEDOUT\n * connect, ECONNRESET, ECONNREFUSED, 5xx, 429) still retry, since nothing was delivered.\n */\n retryOnTimeout?: boolean;\n}\n\n/**\n * Thin wrapper around the Telegram Bot API using native fetch.\n * All methods throw on HTTP errors.\n */\nexport class TelegramApi {\n private readonly baseUrl: string;\n private readonly token: string;\n\n constructor(botToken: string) {\n this.token = botToken;\n this.baseUrl = `https://api.telegram.org/bot${botToken}`;\n }\n\n /** Get bot info. */\n async getMe(): Promise<{ id: number; username?: string }> {\n const res = await this.call(\"getMe\", {});\n return res as { id: number; username?: string };\n }\n\n async getChat(chatId: number): Promise<{ id: number; first_name?: string; username?: string }> {\n const res = await this.call(\"getChat\", { chat_id: chatId });\n return res as { id: number; first_name?: string; username?: string };\n }\n\n /** Get file path for downloading. */\n async getFile(fileId: string): Promise<{ file_id: string; file_path?: string; file_size?: number }> {\n const res = await this.call(\"getFile\", { file_id: fileId });\n return res as { file_id: string; file_path?: string; file_size?: number };\n }\n\n /** Download a file by its file_path (from getFile). Returns the raw buffer. */\n async downloadFile(filePath: string): Promise<Buffer> {\n const url = `https://api.telegram.org/file/bot${this.token}/${filePath}`;\n // 4xx = expired file / bad path / wrong token \u2192 permanent, don't retry\n const response = await this.fetchWithRetry(\n (signal) => fetch(url, { signal }),\n { method: \"downloadFile\", timeoutMs: getEnv().telegramFileTimeoutMs, retryable4xx: false },\n );\n const arrayBuffer = await response.arrayBuffer();\n return Buffer.from(arrayBuffer);\n }\n\n /** Send a text message. Returns the sent message_id. */\n async sendMessage(\n chatId: number,\n text: string,\n options?: SendMessageOptions,\n ): Promise<number> {\n const body: Record<string, unknown> = { chat_id: chatId, text, ...options };\n // #1294: non-idempotent write \u2014 longer timeout + never retry on response-wait timeout\n // (a retry after ambiguous delivery would double-send).\n const res = await this.call(\"sendMessage\", body, undefined, TelegramApi.WRITE_TIMEOUT_MS, false);\n return (res as { message_id: number }).message_id;\n }\n\n /** Edit an existing message's text. */\n async editMessageText(\n chatId: number,\n messageId: number,\n text: string,\n options?: { parse_mode?: string },\n ): Promise<void> {\n await this.call(\"editMessageText\", { chat_id: chatId, message_id: messageId, text, ...options });\n }\n\n /** Acknowledge a callback query (inline keyboard press). */\n async answerCallbackQuery(callbackQueryId: string): Promise<void> {\n await this.call(\"answerCallbackQuery\", { callback_query_id: callbackQueryId });\n }\n\n /** Send a chat action (typing indicator, etc.). */\n async sendChatAction(chatId: number, action: string = \"typing\", messageThreadId?: number): Promise<void> {\n const body: Record<string, unknown> = { chat_id: chatId, action };\n if (messageThreadId) body.message_thread_id = messageThreadId;\n await this.call(\"sendChatAction\", body);\n }\n\n /** Set an emoji reaction on a message. Pass empty array to remove. */\n async setMessageReaction(\n chatId: number,\n messageId: number,\n reaction: Array<{ type: \"emoji\"; emoji: string }>,\n ): Promise<void> {\n await this.call(\"setMessageReaction\", {\n chat_id: chatId,\n message_id: messageId,\n reaction,\n });\n }\n\n /** Send a voice note (OGG Opus). Returns the sent message_id. */\n async sendVoice(\n chatId: number,\n audioBuffer: Buffer,\n options?: { message_thread_id?: number },\n ): Promise<number> {\n // Factory rebuilds FormData per attempt \u2014 FormData is single-use in some runtimes.\n const makeForm = (): FormData => {\n const form = new FormData();\n form.append(\"chat_id\", String(chatId));\n const blob = new Blob([audioBuffer], { type: \"audio/webm\" });\n form.append(\"voice\", blob, \"voice.webm\");\n if (options?.message_thread_id) form.append(\"message_thread_id\", String(options.message_thread_id));\n return form;\n };\n const response = await this.fetchWithRetry(\n (signal) => fetch(`${this.baseUrl}/sendVoice`, { method: \"POST\", body: makeForm(), signal }),\n { method: \"sendVoice\" },\n );\n const json = (await response.json()) as { ok: boolean; result: { message_id: number } };\n if (!json.ok) throw new Error(\"Telegram API sendVoice returned ok=false\");\n return json.result.message_id;\n }\n\n /** Send a file from disk as a Telegram document. Returns the sent message_id. */\n async sendDocument(\n chatId: number,\n filePath: string,\n caption?: string,\n options?: { message_thread_id?: number },\n ): Promise<number> {\n const buf = readFileSync(filePath);\n const fileName = basename(filePath);\n // Factory rebuilds FormData per attempt \u2014 FormData is single-use in some runtimes.\n const makeForm = (): FormData => {\n const form = new FormData();\n form.append(\"chat_id\", String(chatId));\n const blob = new Blob([buf], { type: \"text/markdown\" });\n form.append(\"document\", blob, fileName);\n if (caption) form.append(\"caption\", caption.slice(0, 1024));\n if (options?.message_thread_id) form.append(\"message_thread_id\", String(options.message_thread_id));\n return form;\n };\n const response = await this.fetchWithRetry(\n (signal) => fetch(`${this.baseUrl}/sendDocument`, { method: \"POST\", body: makeForm(), signal }),\n { method: \"sendDocument\", timeoutMs: getEnv().telegramFileTimeoutMs, retryOnTimeout: false },\n );\n const json = (await response.json()) as { ok: boolean; result: { message_id: number } };\n if (!json.ok) throw new Error(\"Telegram API sendDocument returned ok=false\");\n return json.result.message_id;\n }\n\n /** Register bot command menu (shown when user types /). */\n async setMyCommands(commands: Array<{ command: string; description: string }>): Promise<void> {\n await this.call(\"setMyCommands\", { commands });\n }\n\n /** Long-poll for updates. */\n async getUpdates(\n offset: number,\n timeout: number,\n signal?: AbortSignal,\n ): Promise<TelegramUpdate[]> {\n const body = {\n offset,\n timeout,\n allowed_updates: [\n \"message\",\n \"edited_message\",\n \"callback_query\",\n \"message_reaction\",\n ],\n };\n return (await this.call(\"getUpdates\", body, signal, (timeout + 10) * 1000)) as TelegramUpdate[];\n }\n\n private static readonly MAX_ATTEMPTS = 3;\n private static readonly BACKOFF = [1000, 3000, 9000];\n\n /**\n * #1294: Longer response-wait budget for non-idempotent writes. The global timeout (10s) was\n * tripping on slow-but-successful sends during boot, causing a retry that double-delivered.\n * A generous 30s lets slow sends complete instead of falsely timing out.\n */\n private static readonly WRITE_TIMEOUT_MS = 30_000;\n\n private static readonly PERMANENT_ERRORS = [\n /chat not found/i, /bot was blocked/i, /user is deactivated/i,\n /chat_id is empty/i, /forbidden/i, /not enough rights/i,\n /CHAT_WRITE_FORBIDDEN/i, /have no rights/i,\n /wrong file_path/i, /file is temporarily unavailable/i,\n ];\n\n private static isPermanent(msg: string): boolean {\n return this.PERMANENT_ERRORS.some(re => re.test(msg));\n }\n\n private static isTransient(msg: string): boolean {\n return /429|5\\d\\d|bad gateway|service unavailable|timeout|timed out|ETIMEDOUT|ECONNRESET|ECONNREFUSED|socket hang up|network/i.test(msg);\n }\n\n /**\n * Retry + timeout wrapper for any Telegram fetch. Returns the Response on 2xx,\n * throws on non-OK or transient-exhaustion. Factory MUST build a fresh request\n * per attempt (required for FormData; single-use in some runtimes).\n */\n private async fetchWithRetry(\n requestFn: (signal: AbortSignal) => Promise<Response>,\n opts: FetchRetryOpts,\n ): Promise<Response> {\n const timeoutMs = opts.timeoutMs ?? getEnv().telegramTimeoutMs;\n for (let attempt = 0; attempt < TelegramApi.MAX_ATTEMPTS; attempt++) {\n const ctrl = new AbortController();\n const timer = setTimeout(() => ctrl.abort(new Error(\"telegram timeout\")), timeoutMs);\n const composed = opts.outerSignal\n ? AbortSignal.any([opts.outerSignal, ctrl.signal])\n : ctrl.signal;\n\n try {\n const response = await requestFn(composed);\n if (!response.ok) {\n const text = await response.text().catch(err2 => { logAndSwallow(TAG, \"read TG API error body\", err2); return \"\"; });\n const err = new Error(`Telegram API ${opts.method} failed (${response.status}): ${text}`);\n // 4xx treated as permanent unless caller opts in\n if (response.status >= 400 && response.status < 500 && !opts.retryable4xx) throw err;\n throw err;\n }\n return response;\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n if (TelegramApi.isPermanent(msg) || opts.outerSignal?.aborted) throw err;\n // Non-retryable 4xx (when retryable4xx is false) \u2014 already thrown above with status code\n if (!opts.retryable4xx && /failed \\([4]\\d\\d\\)/.test(msg)) throw err;\n // #1294: OUR response-wait timeout (\"telegram timeout\" abort) means delivery is\n // ambiguous \u2014 the request may have already been accepted. For non-idempotent writes\n // (retryOnTimeout=false) we give up instead of double-delivering. Hard network errors\n // (ETIMEDOUT, ECONNRESET, 5xx, 429) do NOT match this and still retry below.\n const isResponseWaitTimeout = /telegram timeout/i.test(msg);\n if (isResponseWaitTimeout && opts.retryOnTimeout === false) throw err;\n if (attempt < TelegramApi.MAX_ATTEMPTS - 1 && TelegramApi.isTransient(msg)) {\n logDebug(TAG, `${opts.method} attempt ${attempt + 1}/${TelegramApi.MAX_ATTEMPTS} \u2014 ${msg.slice(0, 80)}`);\n await new Promise(r => setTimeout(r, TelegramApi.BACKOFF[attempt]!));\n continue;\n }\n throw err;\n } finally {\n clearTimeout(timer);\n }\n }\n throw new Error(`Telegram API ${opts.method}: unreachable`);\n }\n\n private async call(\n method: string,\n body: Record<string, unknown>,\n signal?: AbortSignal,\n timeoutMs?: number,\n retryOnTimeout?: boolean,\n ): Promise<unknown> {\n const response = await this.fetchWithRetry(\n (composed) => fetch(`${this.baseUrl}/${method}`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n signal: composed,\n }),\n { method, timeoutMs, outerSignal: signal, ...(retryOnTimeout === false ? { retryOnTimeout: false } : {}) },\n );\n const json = (await response.json()) as { ok: boolean; result: unknown };\n if (!json.ok) throw new Error(`Telegram API ${method} returned ok=false`);\n return json.result;\n }\n}\n", "import type { TelegramUpdate } from \"../../types/index.js\";\nimport type { TelegramApi } from \"./telegram-api.js\";\nimport type { OffsetStore } from \"./offset-store.js\";\nimport { logError, logWarn } from \"../../components/logger.js\";\n\n/**\n * Long-polls the Telegram Bot API for updates. Never self-terminates \u2014\n * uses exponential backoff with jitter on transient errors.\n *\n * Offset is advanced per-update AFTER the handler settles (success only).\n * Handlers run fire-and-forget to keep /stop responsive; the disk offset\n * only advances once the contiguous prefix of settled handlers is known.\n */\nexport class TelegramPoller {\n private readonly api: TelegramApi;\n private readonly pollTimeout: number;\n private readonly onUpdate: (update: TelegramUpdate) => void | Promise<void>;\n private readonly offsetStore: OffsetStore;\n private offset = 0;\n private lastProcessedId = 0;\n private running = false;\n private abortController: AbortController | null = null;\n\n /** Timestamp of last successful poll cycle. */\n lastPollAt = Date.now();\n\n constructor(\n api: TelegramApi,\n pollTimeoutS: number,\n onUpdate: (update: TelegramUpdate) => void | Promise<void>,\n offsetStore?: OffsetStore,\n ) {\n this.api = api;\n this.pollTimeout = pollTimeoutS;\n this.onUpdate = onUpdate;\n this.offsetStore = offsetStore ?? { read: async () => 0, write: async () => {} };\n }\n\n /** Start the long-poll loop. Non-blocking \u2014 runs in background. */\n async start(): Promise<void> {\n if (this.running) return;\n this.offset = await this.offsetStore.read();\n this.running = true;\n this.poll().catch((err) => {\n logError(\"poller\", \"Fatal error in poll loop\", err);\n });\n }\n\n /** Stop polling. Cancels any in-flight request. */\n stop(): void {\n this.running = false;\n this.abortController?.abort();\n this.abortController = null;\n }\n\n /** Inject a synthetic update into the handler (used for queued messages after sleep). */\n injectUpdate(update: TelegramUpdate): void {\n this.dispatch(update);\n }\n\n /**\n * Dispatch one update to the handler with a rejection guard. Fire-and-forget:\n * the handler runs in the background so /stop stays responsive; a rejection is\n * logged, never allowed to float into an unhandled rejection. (#1292)\n */\n private dispatch(update: TelegramUpdate): void {\n try {\n const result = this.onUpdate(update);\n if (result instanceof Promise) {\n result.catch((err: unknown) => logError(\"poller\", \"Error in update handler\", err));\n }\n } catch (err) {\n logError(\"poller\", \"Error in update handler (sync)\", err);\n }\n }\n\n private async poll(): Promise<void> {\n let failures = 0;\n\n while (this.running) {\n try {\n this.abortController = new AbortController();\n const updates = await this.api.getUpdates(\n this.offset,\n this.pollTimeout,\n this.abortController.signal,\n );\n\n failures = 0;\n this.lastPollAt = Date.now();\n\n // Process each update: dispatch handler, advance offset only on success.\n // Handlers run in background (fire-and-forget) so /stop stays responsive.\n // We track settlements and advance the disk offset for the contiguous\n // prefix of successfully-handled updates.\n if (updates.length > 0) {\n const sorted = [...updates].sort((a, b) => a.update_id - b.update_id);\n\n for (const update of sorted) {\n if (update.update_id <= this.lastProcessedId) continue;\n this.dispatch(update);\n }\n\n this.lastProcessedId = sorted[sorted.length - 1]!.update_id;\n this.offset = sorted[sorted.length - 1]!.update_id + 1;\n await this.offsetStore.write(this.offset);\n }\n } catch (err) {\n if (!this.running) break;\n\n failures++;\n const baseDelay = Math.min(2 ** failures * 1000, 60_000);\n const jitter = Math.random() * baseDelay;\n const delay = baseDelay + jitter;\n const is409 = String(err).includes(\"409\") || String(err).includes(\"terminated by other getUpdates\");\n const log = is409 ? (failures >= 50 ? logError : logWarn) : (failures < 3 ? logWarn : logError);\n if (is409 && failures < 50) {\n log(\"poller\", `409 conflict (attempt ${failures}) \u2014 another instance running, backing off`);\n } else {\n log(\"poller\", `Error (attempt ${failures}), retrying in ${Math.round(delay)}ms`, err);\n }\n await sleep(delay);\n }\n }\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n", "/**\n * Atomic offset store for Telegram poller.\n * Persists the last-acked update_id to disk so crash recovery resumes\n * from the correct position. Writes atomically (temp + rename).\n */\n\nimport { readFile, writeFile, rename, mkdir } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport { logAndSwallow } from \"../../components/log-and-swallow.js\";\n\nconst TAG = \"offset_store\";\n\nexport interface OffsetStore {\n read(): Promise<number>;\n write(offset: number): Promise<void>;\n}\n\n/** File-backed offset store with atomic writes. */\nexport function createFileOffsetStore(filePath: string): OffsetStore {\n let pending: Promise<void> = Promise.resolve();\n\n return {\n async read(): Promise<number> {\n try {\n const raw = await readFile(filePath, \"utf-8\");\n const val = parseInt(raw.trim(), 10);\n return Number.isFinite(val) ? val : 0;\n } catch (err) {\n logAndSwallow(TAG, \"read offset file\", err);\n return 0;\n }\n },\n write(offset: number): Promise<void> {\n // Serialize writes via promise chain (async mutex).\n pending = pending.then(async () => {\n const tmp = filePath + \".tmp\";\n await mkdir(dirname(filePath), { recursive: true });\n await writeFile(tmp, String(offset), \"utf-8\");\n await rename(tmp, filePath);\n }).catch(err => logAndSwallow(TAG, \"write offset file\", err));\n return pending;\n },\n };\n}\n\n/** In-memory offset store for tests. */\nexport function createMemoryOffsetStore(initial = 0): OffsetStore & { value: number } {\n const store = {\n value: initial,\n async read(): Promise<number> { return store.value; },\n async write(offset: number): Promise<void> { store.value = offset; },\n };\n return store;\n}\n", "/**\n * telegram-model-picker.ts \u2014 Extracted model picker callback handlers.\n * Handles: mb:, mslot:, mprov:, mpos:, mprov2:, mset:, model: prefixes.\n */\nimport type { TelegramApi } from \"./telegram-api.js\";\nimport { getEnv } from \"../../components/env-schema.js\";\nimport { logAndSwallow } from \"../../components/log-and-swallow.js\";\n\nconst TAG = \"telegram\";\n\nexport interface PickerState {\n _pendingSlot: string | undefined;\n _modelPickerCache: string[];\n}\n\nexport interface PickerDeps {\n transport: { setModel?: (m: string) => Promise<void> | void; switchProvider?: (o: unknown) => void; [k: string]: unknown };\n pipeline: { rebuildTransport?: () => Promise<void>; [k: string]: unknown };\n resetSessionForModelSwitch: (chatId: number, reason?: string) => Promise<void>;\n}\n\nconst MODEL_PREFIXES = [\"mb:\", \"mslot:\", \"mprov:\", \"mpos:\", \"mprov2:\", \"mset:\", \"model:\"];\n\nexport function isModelPickerCallback(data: string): boolean {\n return MODEL_PREFIXES.some(p => data.startsWith(p));\n}\n\nexport async function handleModelPickerCallback(\n data: string, chatId: number, api: TelegramApi, state: PickerState, deps: PickerDeps,\n): Promise<void> {\n\n if (data.startsWith(\"mb:\")) {\n const target = data.slice(3);\n if (!target) { await api.sendMessage(chatId, \"\uD83D\uDC4C Cancelled.\"); return; }\n if (target === \"a\") {\n const AGENT_LABELS = [\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 api.sendMessage(chatId, \"\uD83E\uDD16 Which agent to change?\", { reply_markup: { inline_keyboard: buttons } });\n return;\n }\n if (target.startsWith(\"p:\")) {\n const agent = target.slice(2);\n const { loadTransport, resolveAgent, getAvailableProviders, getModelsForProvider } = await import(\"../../components/transport-config.js\");\n const tc = loadTransport();\n if (!tc) { await api.sendMessage(chatId, \"\u274C transport.json not loaded\"); return; }\n let providers = getAvailableProviders(tc).filter(p => p.config.transport !== \"tmux\");\n if (providers.length === 0) { await api.sendMessage(chatId, \"\u274C No compatible providers\"); return; }\n const currentProvider = resolveAgent(agent, tc)?.providerName;\n const prefix = agent === \"professor\" ? \"mprov2:professor\" : `mprov:${agent}`;\n const buttons = providers.map(p => {\n const count = getModelsForProvider(p.name).length;\n const label = p.name === currentProvider ? `\u2713 ${p.name} (${count})` : `${p.name} (${count})`;\n return [{ text: label, callback_data: `${prefix}:${p.name}` }];\n });\n buttons.push([{ text: \"\u2190 Back\", callback_data: \"mb:a\" }]);\n await api.sendMessage(chatId, `\uD83D\uDD0C Pick provider:`, { reply_markup: { inline_keyboard: buttons } });\n return;\n }\n if (target.startsWith(\"s:\")) {\n const slot = target.slice(2);\n state._pendingSlot = slot;\n const { loadTransport, resolveAgent, getAvailableProviders, getModelsForProvider } = await import(\"../../components/transport-config.js\");\n const tc = loadTransport();\n if (!tc) { await api.sendMessage(chatId, \"\u274C transport.json not loaded\"); return; }\n let providers = getAvailableProviders(tc).filter(p => p.config.transport !== \"tmux\");\n const currentProvider = resolveAgent(\"professor\", tc)?.providerName;\n const slotLabel = slot === \"professor\" ? \"Main\" : slot.replace(\"professor_fb\", \"Fb\");\n const buttons = providers.map(p => {\n const count = getModelsForProvider(p.name).length;\n const label = p.name === currentProvider ? `\u2713 ${p.name} (${count})` : `${p.name} (${count})`;\n return [{ text: label, callback_data: `mprov2:${slot}:${p.name}` }];\n });\n buttons.push([{ text: \"\u2190 Back\", callback_data: \"mslot:professor\" }]);\n await api.sendMessage(chatId, `\uD83D\uDD0C Provider for ${slotLabel}:`, { reply_markup: { inline_keyboard: buttons } });\n return;\n }\n } else if (data.startsWith(\"mslot:\")) {\n const agent = data.slice(6);\n const { loadTransport, resolveAgent, getAvailableProviders, getModelsForProvider } = await import(\"../../components/transport-config.js\");\n const tc = loadTransport();\n if (!tc) { await api.sendMessage(chatId, \"\u274C transport.json not loaded\"); return; }\n\n if (agent === \"professor\") {\n const profResolved = resolveAgent(\"professor\", tc);\n const fallbacks = tc.agents[\"professor\"]?.fallbacks ?? [];\n const slots: Array<{ label: string; key: string }> = [\n { label: `\u2605 Main: ${profResolved?.model ?? \"?\"}`, key: `mpos:professor::professor` },\n ];\n for (let i = 0; i < fallbacks.length; i++) {\n slots.push({ label: `\u21B3 Fb${i + 1}: ${fallbacks[i]!.model}`, key: `mpos:professor::professor_fb${i + 1}` });\n }\n if (fallbacks.length < 3) {\n slots.push({ label: `\u21B3 Fb${fallbacks.length + 1}: (add)`, key: `mpos:professor::professor_fb${fallbacks.length + 1}` });\n }\n const buttons = slots.map(s => [{ text: s.label, callback_data: s.key }]);\n buttons.push([{ text: \"\u2190 Back\", callback_data: \"mb:a\" }]);\n await api.sendMessage(chatId, `\uD83C\uDFAF Which slot?`, { reply_markup: { inline_keyboard: buttons } });\n return;\n }\n\n let providers = getAvailableProviders(tc).filter(p => p.config.transport !== \"tmux\");\n if (providers.length === 0) { await api.sendMessage(chatId, \"\u274C No compatible providers\"); return; }\n const currentProvider = resolveAgent(agent, tc)?.providerName;\n const buttons = providers.map(p => {\n const count = getModelsForProvider(p.name).length;\n const label = p.name === currentProvider ? `\u2713 ${p.name} (${count})` : `${p.name} (${count})`;\n return [{ text: label, callback_data: `mprov:${agent}:${p.name}` }];\n });\n buttons.push([{ text: \"\u2190 Back\", callback_data: \"mb:a\" }]);\n await api.sendMessage(chatId, `\uD83D\uDD0C Pick provider:`, { reply_markup: { inline_keyboard: buttons } });\n\n } else if (data.startsWith(\"mprov:\")) {\n const [, agent, providerName] = data.split(\":\");\n const { loadTransport, getModelsForProvider, formatRank, formatCost } = await import(\"../../components/transport-config.js\");\n const tc = loadTransport();\n let models = getModelsForProvider(providerName!);\n const providerConfig = tc?.providers[providerName!];\n if (providerConfig?.transport === \"api\") models = models.filter(m => !m.entry.status || m.entry.status === \"alive\");\n if (models.length === 0) { await api.sendMessage(chatId, `\u274C No alive models for ${providerName}`); return; }\n state._pendingSlot = agent;\n state._modelPickerCache = models.map(m => m.id);\n const buttons = models.map((m, i) => [{ text: `${m.id} (${formatRank(m.entry.rank)}, ${formatCost(m.entry.cost)})`, callback_data: `mset:${providerName}:${i}` }]);\n buttons.push([{ text: \"\u2190 Back\", callback_data: `mb:p:${agent}` }]);\n await api.sendMessage(chatId, `\uD83D\uDCCB Models on ${providerName}:`, { reply_markup: { inline_keyboard: buttons } });\n\n } else if (data.startsWith(\"mpos:\")) {\n const [, , , slot] = data.split(\":\");\n const { loadTransport, resolveAgent, getAvailableProviders, getModelsForProvider } = await import(\"../../components/transport-config.js\");\n const tc = loadTransport();\n if (!tc) { await api.sendMessage(chatId, \"\u274C transport.json not loaded\"); return; }\n let providers = getAvailableProviders(tc).filter(p => p.config.transport !== \"tmux\");\n const profResolved = resolveAgent(\"professor\", tc);\n const mainTransport = profResolved?.provider.transport;\n if (slot && slot.startsWith(\"professor_fb\") && mainTransport) {\n if (mainTransport === \"api\") { providers = providers.filter(p => p.config.transport === \"api\"); }\n else { providers = providers.filter(p => p.name === profResolved!.providerName); }\n }\n if (providers.length === 0) { await api.sendMessage(chatId, \"\u274C No compatible providers for this slot\"); return; }\n const currentProvider = profResolved?.providerName;\n const slotLabel = slot === \"professor\" ? \"Main\" : slot!.replace(\"professor_fb\", \"Fb\");\n const buttons = providers.map(p => {\n const count = getModelsForProvider(p.name).length;\n const label = p.name === currentProvider ? `\u2713 ${p.name} (${count})` : `${p.name} (${count})`;\n return [{ text: label, callback_data: `mprov2:${slot}:${p.name}` }];\n });\n buttons.push([{ text: \"\u2190 Back\", callback_data: \"mslot:professor\" }]);\n await api.sendMessage(chatId, `\uD83D\uDD0C Provider for ${slotLabel}:`, { reply_markup: { inline_keyboard: buttons } });\n\n } else if (data.startsWith(\"mprov2:\")) {\n const [, slot, providerName] = data.split(\":\");\n const { getModelsForProvider, formatRank, formatCost, loadTransport } = await import(\"../../components/transport-config.js\");\n const tc = loadTransport();\n const providerConfig = tc?.providers[providerName!];\n let models = getModelsForProvider(providerName!);\n if (providerConfig?.transport === \"api\") models = models.filter(m => !m.entry.status || m.entry.status === \"alive\");\n if (models.length === 0) { await api.sendMessage(chatId, `\u274C No alive models for ${providerName}`); return; }\n state._pendingSlot = slot;\n const slotLabel = slot === \"professor\" ? \"Main\" : slot!.replace(\"professor_fb\", \"Fb\");\n state._modelPickerCache = models.map(m => m.id);\n const buttons = models.map((m, i) => [{ text: `${m.id} (${formatRank(m.entry.rank)}, ${formatCost(m.entry.cost)})`, callback_data: `mset:${providerName}:${i}` }]);\n buttons.push([{ text: \"\u2190 Back\", callback_data: `mb:s:${slot}` }]);\n await api.sendMessage(chatId, `\uD83D\uDCCB Pick model for ${slotLabel}:`, { reply_markup: { inline_keyboard: buttons } });\n\n } else if (data.startsWith(\"mset:\")) {\n const parts = data.split(\":\");\n const providerName = parts[1]!;\n const modelIdx = parseInt(parts[2]!, 10);\n const model = Number.isFinite(modelIdx) && state._modelPickerCache[modelIdx]\n ? state._modelPickerCache[modelIdx]!\n : parts.slice(2).join(\":\");\n const slot = state._pendingSlot ?? \"professor\";\n state._pendingSlot = undefined;\n state._modelPickerCache = [];\n const { loadTransport, writeTransportConfig, resolveAgent, getModelsForProvider, validateProviderReady, formatValidationError } = await import(\"../../components/transport-config.js\");\n const tc = loadTransport();\n if (!tc) { await api.sendMessage(chatId, \"\u274C transport.json not loaded\"); return; }\n\n const validModels = getModelsForProvider(providerName);\n if (!validModels.some(m => m.id === model)) { await api.sendMessage(chatId, `\u274C ${model} is not available on ${providerName}. Pick another.`); return; }\n\n const providerConfig = tc.providers[providerName];\n if (!providerConfig) { await api.sendMessage(chatId, `\u274C Provider ${providerName} not found`); return; }\n const validation = validateProviderReady(providerName, providerConfig, getEnv());\n if (!validation.ok) { await api.sendMessage(chatId, formatValidationError(providerName, validation)); return; }\n\n if (providerConfig?.transport === \"api\") {\n try {\n const endpoint = providerConfig.endpoint ?? \"\";\n const apiKey = getEnv().getApiKey(providerConfig.apiKeyEnv ?? \"API_KEY\");\n const headers: Record<string, string> = {};\n if (apiKey) headers[\"Authorization\"] = `Bearer ${apiKey}`;\n const res = await fetch(`${endpoint}/models`, { headers, signal: AbortSignal.timeout(5000) });\n if (!res.ok) { await api.sendMessage(chatId, `\u26A0\uFE0F ${providerName} unreachable (${res.status}). Try another?`); return; }\n } catch (err) { logAndSwallow(TAG, \"provider reachability check\", err); await api.sendMessage(chatId, `\u26A0\uFE0F ${providerName} unreachable. Try another?`); return; }\n }\n\n const agentKey = slot.startsWith(\"professor_fb\") ? \"professor\" : slot;\n const fbIndex = slot === \"professor_fb1\" ? 0 : slot === \"professor_fb2\" ? 1 : slot === \"professor_fb3\" ? 2 : -1;\n\n if (fbIndex >= 0) {\n if (!tc.agents[\"professor\"]) tc.agents[\"professor\"] = { model: \"\", provider: \"\" };\n if (!tc.agents[\"professor\"]!.fallbacks) tc.agents[\"professor\"]!.fallbacks = [];\n tc.agents[\"professor\"]!.fallbacks[fbIndex] = { model, provider: providerName };\n const { cleanDemotedModels } = await import(\"../../components/transport-config.js\");\n cleanDemotedModels(tc, model);\n writeTransportConfig(tc, `professor fallback ${fbIndex + 1} \u2192 ${model} (${providerName})`);\n await api.sendMessage(chatId, `\u2713 Fallback ${fbIndex + 1} \u2192 ${model} (${providerName})`);\n } else {\n const oldProvider = tc.agents[agentKey]?.provider;\n tc.agents[agentKey] = { ...tc.agents[agentKey]!, model, provider: providerName };\n const { cleanDemotedModels } = await import(\"../../components/transport-config.js\");\n cleanDemotedModels(tc, model);\n writeTransportConfig(tc, `${agentKey} \u2192 ${model} (${providerName})`);\n\n const providerChanged = oldProvider !== providerName;\n const isProfessor = agentKey === \"professor\";\n\n let oldType: string | undefined;\n let newType: string | undefined;\n let newResolved: ReturnType<typeof resolveAgent> | undefined;\n if (isProfessor && providerChanged) {\n const oldResolved = resolveAgent(\"_old\", { ...tc, agents: { ...tc.agents, _old: { model: \"\", provider: oldProvider! } } });\n newResolved = resolveAgent(\"_new\", { ...tc, agents: { ...tc.agents, _new: { model, provider: providerName } } });\n oldType = oldResolved?.provider.transport ?? \"api\";\n newType = newResolved?.provider.transport ?? \"api\";\n if (oldType !== newType) {\n const resetAgents: string[] = [];\n for (const [a, assignment] of Object.entries(tc.agents)) {\n if (a === \"professor\") continue;\n const ap = tc.providers[assignment.provider];\n if (ap && ap.transport !== newType) { tc.agents[a] = { model, provider: providerName }; resetAgents.push(a); }\n }\n if (resetAgents.length > 0) writeTransportConfig(tc, `cascade: ${resetAgents.join(\", \")} \u2192 ${providerName}`);\n }\n }\n\n if (isProfessor && !providerChanged && \"setModel\" in deps.transport) {\n await (deps.transport as unknown as { setModel: (m: string) => Promise<void> }).setModel(model);\n await api.sendMessage(chatId, `\u2713 Switched to ${model}`);\n } else if (isProfessor && providerChanged && oldType === newType && \"switchProvider\" in deps.transport) {\n try {\n const { FallbackPolicy } = await import(\"../../components/transport/fallback-policy.js\");\n const { ModelHealthRegistry } = await import(\"../../components/transport/model-health-registry.js\");\n const apiKey = getEnv().getApiKey(newResolved?.provider.apiKeyEnv ?? \"API_KEY\");\n const candidates = [{ endpoint: newResolved!.provider.endpoint!, apiKey, model, maxContext: newResolved!.contextWindow }];\n for (const fb of (tc.agents[\"professor\"]?.fallbacks ?? [])) {\n const fbRes = resolveAgent(\"_fb\", { ...tc, agents: { ...tc.agents, _fb: { model: fb.model, provider: fb.provider } } });\n if (fbRes) candidates.push({ endpoint: fbRes.provider.endpoint!, apiKey: fbRes.provider.apiKeyEnv ? getEnv().getApiKey(fbRes.provider.apiKeyEnv) : apiKey, model: fb.model, maxContext: fbRes.contextWindow });\n }\n const registry = (deps.transport as unknown as { policy?: { registry: InstanceType<typeof ModelHealthRegistry> } }).policy?.registry ?? new ModelHealthRegistry();\n const policy = new FallbackPolicy(candidates, registry);\n (deps.transport as unknown as { switchProvider: (o: unknown) => void }).switchProvider({ endpoint: newResolved!.provider.endpoint!, apiKey, model, maxContext: newResolved!.contextWindow, policy });\n } catch (err) {\n await api.sendMessage(chatId, `\u26A0\uFE0F Hot swap failed: ${err instanceof Error ? err.message : String(err)}. Use /reset to apply.`);\n return;\n }\n try { await api.sendMessage(chatId, `\u2713 Switched to ${model} (${providerName})`); } catch (err) { logAndSwallow(TAG, \"sendMessage model switch confirm\", err); }\n } else if (isProfessor && providerChanged) {\n const cascadeNote = oldType !== newType ? \" Subagents also reset.\" : \"\";\n try {\n if (deps.pipeline.rebuildTransport) await deps.pipeline.rebuildTransport();\n await deps.resetSessionForModelSwitch(chatId, \"cross-transport-switch\");\n await api.sendMessage(chatId, `\uD83D\uDD04 Switched to ${model} (${providerName}). Transport rebuilt.${cascadeNote}`);\n } catch (err) {\n await api.sendMessage(chatId, `\u26A0\uFE0F Transport rebuild failed: ${err instanceof Error ? err.message : String(err)}. Try /reset manually.`);\n }\n } else {\n await api.sendMessage(chatId, `\u2713 ${agentKey} \u2192 ${model} (${providerName})`);\n }\n }\n } else if (data.startsWith(\"model:\")) {\n const newModel = data.slice(6);\n if (\"setModel\" in deps.transport && typeof deps.transport.setModel === \"function\") {\n try {\n await deps.transport.setModel(newModel);\n await deps.resetSessionForModelSwitch(chatId);\n await api.sendMessage(chatId, `\uD83E\uDD16 Model switched \u2192 ${newModel}`);\n } catch (err) {\n await api.sendMessage(chatId, `\u274C Model switch failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["TAG", "TAG", "buttons", "TAG", "chatId"]
|
|
7
|
+
}
|
|
@@ -13,30 +13,32 @@ import {
|
|
|
13
13
|
setPeerActivityCallback,
|
|
14
14
|
setSeatbelt,
|
|
15
15
|
setSendDocument
|
|
16
|
-
} from "./chunk-
|
|
17
|
-
import "./chunk-
|
|
18
|
-
import "./chunk-
|
|
19
|
-
import "./chunk-URQPDCK5.js";
|
|
16
|
+
} from "./chunk-ITOFPJAV.js";
|
|
17
|
+
import "./chunk-5PNJFDSW.js";
|
|
18
|
+
import "./chunk-Q66LQMMZ.js";
|
|
20
19
|
import "./chunk-VOLAZHA2.js";
|
|
21
|
-
import "./chunk-
|
|
22
|
-
import "./chunk-
|
|
23
|
-
import "./chunk-
|
|
24
|
-
import "./chunk-
|
|
25
|
-
import "./chunk-
|
|
26
|
-
import "./chunk-
|
|
27
|
-
import "./chunk-
|
|
28
|
-
import "./chunk-
|
|
29
|
-
import "./chunk-
|
|
30
|
-
import "./chunk-
|
|
31
|
-
import "./chunk-
|
|
32
|
-
import "./chunk-
|
|
33
|
-
import "./chunk-
|
|
34
|
-
import "./chunk-
|
|
35
|
-
import "./chunk-
|
|
36
|
-
import "./chunk-
|
|
37
|
-
import "./chunk-
|
|
38
|
-
import "./chunk-
|
|
39
|
-
import "./chunk-
|
|
20
|
+
import "./chunk-L72RIPEC.js";
|
|
21
|
+
import "./chunk-BNXV7SZI.js";
|
|
22
|
+
import "./chunk-P3NODAHF.js";
|
|
23
|
+
import "./chunk-YJZE4OK3.js";
|
|
24
|
+
import "./chunk-NHPLD3C7.js";
|
|
25
|
+
import "./chunk-MV6CJFWR.js";
|
|
26
|
+
import "./chunk-2NLUT5S2.js";
|
|
27
|
+
import "./chunk-GF6NVNA7.js";
|
|
28
|
+
import "./chunk-CK7YTA2F.js";
|
|
29
|
+
import "./chunk-E7XD5UGB.js";
|
|
30
|
+
import "./chunk-SFL4EPCZ.js";
|
|
31
|
+
import "./chunk-KOSFXW2S.js";
|
|
32
|
+
import "./chunk-FGYDIX54.js";
|
|
33
|
+
import "./chunk-Z4FZPB42.js";
|
|
34
|
+
import "./chunk-5Y3FJ2Y7.js";
|
|
35
|
+
import "./chunk-3BG3AIDP.js";
|
|
36
|
+
import "./chunk-5RVOEFGT.js";
|
|
37
|
+
import "./chunk-WC5O5KOE.js";
|
|
38
|
+
import "./chunk-N5KN3LGD.js";
|
|
39
|
+
import "./chunk-6PA5JBUU.js";
|
|
40
|
+
import "./chunk-2IYJ4I66.js";
|
|
41
|
+
import "./chunk-XRTXYN66.js";
|
|
40
42
|
import "./chunk-GALQBVKO.js";
|
|
41
43
|
import "./chunk-O7KQG6ME.js";
|
|
42
44
|
import "./chunk-7K2YZTLD.js";
|
|
@@ -54,4 +56,4 @@ export {
|
|
|
54
56
|
setSeatbelt,
|
|
55
57
|
setSendDocument
|
|
56
58
|
};
|
|
57
|
-
//# sourceMappingURL=tool-registry-
|
|
59
|
+
//# sourceMappingURL=tool-registry-JJMWCQKZ.js.map
|
|
@@ -6,9 +6,9 @@ import {
|
|
|
6
6
|
buildPolicy,
|
|
7
7
|
checkPath,
|
|
8
8
|
checkTool
|
|
9
|
-
} from "./chunk-
|
|
10
|
-
import "./chunk-
|
|
11
|
-
import "./chunk-
|
|
9
|
+
} from "./chunk-P3NODAHF.js";
|
|
10
|
+
import "./chunk-2IYJ4I66.js";
|
|
11
|
+
import "./chunk-XRTXYN66.js";
|
|
12
12
|
import "./chunk-GALQBVKO.js";
|
|
13
13
|
import "./chunk-O7KQG6ME.js";
|
|
14
14
|
import "./chunk-7K2YZTLD.js";
|
|
@@ -19,4 +19,4 @@ export {
|
|
|
19
19
|
checkPath,
|
|
20
20
|
checkTool
|
|
21
21
|
};
|
|
22
|
-
//# sourceMappingURL=tool-sandbox-
|
|
22
|
+
//# sourceMappingURL=tool-sandbox-CNL6V6IH.js.map
|