abtars 0.3.4-alpha.8 → 0.3.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundle/{_registry.generated-YP5GLSG7.js → _registry.generated-AVR7DK2A.js} +15 -15
- package/bundle/{abmind-lazy-7Z44NODV.js → abmind-lazy-E3YCFKQ5.js} +15 -5
- package/bundle/abtars-browser.js +4 -4
- package/bundle/abtars-cli.js +23 -13
- package/bundle/abtars-cli.js.map +2 -2
- package/bundle/abtars-restart.js +3 -3
- package/bundle/abtars-task.js +3 -3
- package/bundle/abtars.js +385 -466
- package/bundle/abtars.js.map +4 -4
- package/bundle/{acp-raw-client-E6FM45NC.js → acp-raw-client-UCNK3OTU.js} +2 -2
- package/bundle/{action-gate-G2V47NHW.js → action-gate-V4FCBHFB.js} +2 -2
- package/bundle/{agent-api-adapter-WRGEQ6DV.js → agent-api-adapter-7HEPYSIN.js} +3 -3
- package/bundle/{agent-api-rate-limit-WCFXJMGY.js → agent-api-rate-limit-RZSAM3SW.js} +4 -4
- package/bundle/{agent-registry-GHNG2PH3.js → agent-registry-46A2R5KP.js} +7 -7
- package/bundle/{bootstrap-PZIDBPEJ.js → bootstrap-MIHJJSWU.js} +2 -2
- package/bundle/{bridge-lock-transport-4ZH7QTJP.js → bridge-lock-transport-7RSN7OLJ.js} +4 -4
- package/bundle/{browser-D3LZV7ZK.js → browser-F6BCWJWW.js} +6 -6
- package/bundle/{budget-45QOBDWA.js → budget-WUM3SPKW.js} +3 -3
- package/bundle/{capability-JFWX3IQF.js → capability-QVRKGRFC.js} +5 -5
- package/bundle/{chunk-YSKCQH6E.js → chunk-2IYJ4I66.js} +2 -2
- package/bundle/{chunk-W2R2HFOQ.js → chunk-2NLUT5S2.js} +6 -6
- package/bundle/chunk-3BG3AIDP.js +191 -0
- package/bundle/chunk-3BG3AIDP.js.map +7 -0
- package/bundle/{chunk-OKAQICWY.js → chunk-3GQX34S2.js} +3 -3
- package/bundle/{chunk-QROWBWLL.js → chunk-3XZ773BS.js} +2 -2
- package/bundle/{chunk-DYBW4XXL.js → chunk-467SRLLR.js} +2 -2
- package/bundle/{chunk-374NCXFZ.js → chunk-4AILRHUI.js} +10 -8
- package/bundle/chunk-4AILRHUI.js.map +7 -0
- package/bundle/{chunk-GPZNXY2U.js → chunk-4S3H4OK7.js} +4 -4
- package/bundle/{chunk-NDCRWEEJ.js → chunk-4Y5MJQRE.js} +6 -6
- package/bundle/{chunk-FRKW6LWB.js → chunk-55UWKI5C.js} +3 -3
- package/bundle/{chunk-7JN2MMU7.js → chunk-5PNJFDSW.js} +8 -8
- package/bundle/{chunk-LUNA6PM5.js → chunk-5RVOEFGT.js} +4 -2
- package/bundle/{chunk-LUNA6PM5.js.map → chunk-5RVOEFGT.js.map} +2 -2
- package/bundle/{chunk-OXTSWQCX.js → chunk-5Y3FJ2Y7.js} +2 -2
- package/bundle/{chunk-TMUYFERL.js → chunk-6B5ZFUPD.js} +2 -2
- package/bundle/{chunk-65VCEC32.js → chunk-6PA5JBUU.js} +2 -2
- package/bundle/{chunk-C7K6VZNY.js → chunk-BNXV7SZI.js} +21 -12
- package/bundle/chunk-BNXV7SZI.js.map +7 -0
- package/bundle/{chunk-AFREM7FX.js → chunk-CK7YTA2F.js} +2 -2
- package/bundle/{chunk-NRUSRJXR.js → chunk-DZJ5QZFD.js} +2 -2
- package/bundle/{chunk-YRSMGJFP.js → chunk-E67KESEG.js} +2 -2
- package/bundle/{chunk-ZV4IWKDJ.js → chunk-E7XD5UGB.js} +3 -3
- package/bundle/{chunk-CXXU3HAU.js → chunk-EAX5ZZUL.js} +63 -39
- package/bundle/chunk-EAX5ZZUL.js.map +7 -0
- package/bundle/{chunk-PEDX56EL.js → chunk-EFGBM555.js} +2 -2
- package/bundle/{chunk-EQSG2CRM.js → chunk-FGYDIX54.js} +22 -15
- package/bundle/chunk-FGYDIX54.js.map +7 -0
- package/bundle/{chunk-YPAQEQSC.js → chunk-GF6NVNA7.js} +15 -5
- package/bundle/chunk-GF6NVNA7.js.map +7 -0
- package/bundle/{chunk-UNM3OXHB.js → chunk-HGSHCQ5F.js} +110 -72
- package/bundle/{chunk-UNM3OXHB.js.map → chunk-HGSHCQ5F.js.map} +2 -2
- package/bundle/{chunk-VXCETPZU.js → chunk-IMIGG5EO.js} +39 -39
- package/bundle/chunk-IMIGG5EO.js.map +7 -0
- package/bundle/{chunk-P2K2K6XL.js → chunk-ITOFPJAV.js} +44 -32
- package/bundle/chunk-ITOFPJAV.js.map +7 -0
- package/bundle/{chunk-75ATTOW4.js → chunk-IY6UKLPS.js} +3 -3
- package/bundle/{chunk-EUZDKV3C.js → chunk-J4RUFAPK.js} +3 -3
- package/bundle/{chunk-HZDLFLRP.js → chunk-J7DRPVMU.js} +35 -5
- package/bundle/chunk-J7DRPVMU.js.map +7 -0
- package/bundle/{chunk-EGL6UMAO.js → chunk-JG4BKXBN.js} +7 -1
- package/bundle/chunk-JG4BKXBN.js.map +7 -0
- package/bundle/{chunk-N4EB6LA7.js → chunk-JLWYPGWI.js} +5 -5
- package/bundle/{chunk-5QUTMUIK.js → chunk-JXYWDAHD.js} +12 -12
- package/bundle/{chunk-GRVWZO4C.js → chunk-KOSFXW2S.js} +24 -3
- package/bundle/{chunk-GRVWZO4C.js.map → chunk-KOSFXW2S.js.map} +1 -1
- package/bundle/{chunk-M3JEX6L4.js → chunk-L72RIPEC.js} +9 -9
- package/bundle/{chunk-TEFZ4JA4.js → chunk-NHPLD3C7.js} +2 -2
- package/bundle/{chunk-2KC5G3EA.js → chunk-OWUO5RS3.js} +5 -5
- package/bundle/{chunk-4MULJ5SS.js → chunk-OY4Q6AMY.js} +71 -49
- package/bundle/chunk-OY4Q6AMY.js.map +7 -0
- package/bundle/{chunk-WBTJ2E62.js → chunk-P3NODAHF.js} +2 -5
- package/bundle/{chunk-WBTJ2E62.js.map → chunk-P3NODAHF.js.map} +2 -2
- package/bundle/{chunk-SMPHE3ZM.js → chunk-PB5GF4FG.js} +215 -163
- package/bundle/chunk-PB5GF4FG.js.map +7 -0
- package/bundle/{chunk-WYHGNI56.js → chunk-PMD5BLFS.js} +6 -6
- package/bundle/{chunk-URQPDCK5.js → chunk-Q66LQMMZ.js} +3 -3
- package/bundle/{chunk-IHYKTDIP.js → chunk-SC2Y5NR2.js} +36 -119
- package/bundle/chunk-SC2Y5NR2.js.map +7 -0
- package/bundle/chunk-SFL4EPCZ.js +555 -0
- package/bundle/chunk-SFL4EPCZ.js.map +7 -0
- package/bundle/{chunk-LDUOOKQY.js → chunk-SJPUNDZ3.js} +5 -5
- package/bundle/{chunk-LDUOOKQY.js.map → chunk-SJPUNDZ3.js.map} +1 -1
- package/bundle/{chunk-JQDJPUHM.js → chunk-TWB2ZGVH.js} +2 -2
- package/bundle/{chunk-IJT4KWXT.js → chunk-U4U47YE7.js} +2 -2
- package/bundle/{chunk-2FAZIA37.js → chunk-W546CU3A.js} +3 -3
- package/bundle/chunk-WC5O5KOE.js +211 -0
- package/bundle/chunk-WC5O5KOE.js.map +7 -0
- package/bundle/{chunk-JNIHEDKF.js → chunk-XPWYDNWL.js} +2 -2
- package/bundle/{chunk-GWILHZPT.js → chunk-XRTXYN66.js} +10 -7
- package/bundle/{chunk-GWILHZPT.js.map → chunk-XRTXYN66.js.map} +2 -2
- package/bundle/{chunk-EFJVUJBE.js → chunk-Y5FEFKGM.js} +6 -6
- package/bundle/chunk-YJZE4OK3.js +169 -0
- package/bundle/chunk-YJZE4OK3.js.map +7 -0
- package/bundle/{chunk-GVM5YU5I.js → chunk-Z4FZPB42.js} +2 -2
- package/bundle/{chunk-7BSQ5UQO.js → chunk-ZSIDQ66D.js} +3 -3
- package/bundle/{chunk-XX6BGTPO.js → chunk-ZZZCJJEO.js} +4 -4
- package/bundle/{commands-OIISYHTD.js → commands-2ZW6CMLC.js} +17 -16
- package/bundle/{config-M3P5IOAI.js → config-YMY5YHKN.js} +6 -6
- package/bundle/{context-2RJHC2LE.js → context-CL2RSLII.js} +7 -5
- package/bundle/context-CL2RSLII.js.map +7 -0
- package/bundle/{daemon-TB23FFWY.js → daemon-D7SU63OY.js} +3 -3
- package/bundle/{delegation-tools-YATZFKYO.js → delegation-tools-WS7Z56KZ.js} +12 -12
- package/bundle/{deploy-T6R45OZJ.js → deploy-AMTVKIMU.js} +2 -2
- package/bundle/{deps-WVK553KF.js → deps-T63AVJKJ.js} +3 -3
- package/bundle/{direct-api-transport-S2RDH2I7.js → direct-api-transport-QNNY2WWP.js} +51 -32
- package/bundle/direct-api-transport-QNNY2WWP.js.map +7 -0
- package/bundle/{discord-adapter-UTXUWX3A.js → discord-adapter-ABAD56Y2.js} +21 -20
- package/bundle/{discord-adapter-UTXUWX3A.js.map → discord-adapter-ABAD56Y2.js.map} +1 -1
- package/bundle/{dns-wakeup-IDOJIXBX.js → dns-wakeup-V3LEFXPE.js} +9 -33
- package/bundle/dns-wakeup-V3LEFXPE.js.map +7 -0
- package/bundle/{doctor-probes-B54JFIW3.js → doctor-probes-O6YI6XSZ.js} +6 -2
- package/bundle/{env-schema-4JXQUOH4.js → env-schema-B5RB32DC.js} +3 -3
- package/bundle/{gossip-3C3BSNPN.js → gossip-SKRCPOBS.js} +9 -5
- package/bundle/{guardrails-DL7ZSWVN.js → guardrails-64GQ5Y5K.js} +4 -4
- package/bundle/{heartbeat-system-MVTRS4GP.js → heartbeat-system-X4MUTKJD.js} +6 -6
- package/bundle/{heartbeat-tier3-6KH45CL6.js → heartbeat-tier3-2PTPWEQQ.js} +53 -76
- package/bundle/heartbeat-tier3-2PTPWEQQ.js.map +7 -0
- package/bundle/{hook-system-M3POLUIB.js → hook-system-YB635OC4.js} +3 -3
- package/bundle/{hotskills-FWX4QI7V.js → hotskills-Q75D2DK3.js} +5 -5
- package/bundle/{install-OS3CU7NF.js → install-RFKKFSGS.js} +17 -30
- package/bundle/install-RFKKFSGS.js.map +7 -0
- package/bundle/{install-manifest-5PPWMD2W.js → install-manifest-J7ICPCJN.js} +2 -2
- package/bundle/{irc-adapter-PTTZD32W.js → irc-adapter-TVEV4R6H.js} +3 -3
- package/bundle/{irc-config-CP7ZMUOX.js → irc-config-M676FOFI.js} +4 -4
- package/bundle/{kanban-board-M326B2XJ.js → kanban-board-DLEJUCNN.js} +9 -7
- package/bundle/{kanban-channel-IJ52OMNA.js → kanban-channel-XOLUHJZJ.js} +6 -6
- package/bundle/kanban-delivery-C4QPBNPX.js +45 -0
- package/bundle/kanban-delivery-C4QPBNPX.js.map +7 -0
- package/bundle/{lazy-require-KCRVT4SI.js → lazy-require-JKQSALXN.js} +3 -3
- package/bundle/{logger-OWCSNYCA.js → logger-3EGHBD4R.js} +2 -2
- package/bundle/{main-chat-ZNUZCTNS.js → main-chat-3H63REKK.js} +4 -4
- package/bundle/{master-user-HSKM4ZFN.js → master-user-MUBUP3KD.js} +5 -5
- package/bundle/{media-utils-3ZYOD7SK.js → media-utils-HUUIALAJ.js} +3 -3
- package/bundle/{message-pipeline-AUIUNM5R.js → message-pipeline-GRDRWONR.js} +17 -16
- package/bundle/meta.json +2773 -2241
- package/bundle/{metrics-collector-L3VPEHII.js → metrics-collector-YMUGY3PI.js} +31 -2
- package/bundle/metrics-collector-YMUGY3PI.js.map +7 -0
- package/bundle/{model-health-registry-MLEIZSTV.js → model-health-registry-QADMFQFQ.js} +2 -2
- package/bundle/{nerve-IGSXBKZZ.js → nerve-QPAEBRKX.js} +3 -3
- package/bundle/{notification-BFSIEECG.js → notification-3JICGXWU.js} +6 -6
- package/bundle/{openrouter-credits-NTVZDRYM.js → openrouter-credits-7NEIPYJN.js} +3 -3
- package/bundle/{orc-tools-TOD4WHTM.js → orc-tools-UZVPONKY.js} +5 -3
- package/bundle/{peer-auth-QC4EF2PM.js → peer-auth-RI43DKJE.js} +24 -15
- package/bundle/{peer-client-RGEU5HOK.js → peer-client-UITTMWJ2.js} +34 -29
- package/bundle/peer-client-UITTMWJ2.js.map +7 -0
- package/bundle/{peer-config-TN55LFDC.js → peer-config-URM7DCW6.js} +9 -4
- package/bundle/{peer-transport-5VKK2I7P.js → peer-transport-SI7I72DB.js} +12 -10
- package/bundle/{phase-transport-FS6NL4A5.js → phase-transport-ESWWACZI.js} +17 -17
- package/bundle/{reconcile-CTFCLQRN.js → reconcile-GFDQYNBD.js} +3 -3
- package/bundle/{reconciler-NZ4O4BCP.js → reconciler-IEUJXJN2.js} +12 -12
- package/bundle/{restore-IFHPI7I7.js → restore-FARTGLQQ.js} +3 -3
- package/bundle/{rollback-ANRI3T5Z.js → rollback-GEWPZABG.js} +2 -2
- package/bundle/{sandbox-runtime-QROWHDCS.js → sandbox-runtime-DV6E25J6.js} +2 -2
- package/bundle/{self-healer-utils-IFAYOQO2.js → self-healer-utils-P4SKNNEM.js} +3 -3
- package/bundle/{sha-tracker-ZWBP6CIJ.js → sha-tracker-77SHLYNY.js} +3 -3
- package/bundle/{skill-session-VJXTKOKL.js → skill-session-5HSMXY54.js} +3 -3
- package/bundle/{skill-stats-JORH5DGM.js → skill-stats-MI3RSWWL.js} +4 -4
- package/bundle/{skill-watcher-E4MGLKLS.js → skill-watcher-5L7JE6TN.js} +4 -4
- package/bundle/{sleep-BEWAUFCL.js → sleep-I4JFASCY.js} +11 -11
- package/bundle/{soul-bundle-VWAVHCZ6.js → soul-bundle-522C3IRH.js} +9 -8
- package/bundle/{spin-E3ZDEDKT.js → spin-VHNGNWTD.js} +11 -11
- package/bundle/{spin-notifications-SE2HVZI7.js → spin-notifications-7NC5XZEM.js} +5 -5
- package/bundle/{spin-types-OIE67MJK.js → spin-types-C5KOQOPD.js} +7 -3
- package/bundle/{sse-parser-anthropic-A6R4Z2TB.js → sse-parser-anthropic-MMTVWHLI.js} +3 -3
- package/bundle/{sse-parser-responses-HSZY3QGJ.js → sse-parser-responses-3AOFN64C.js} +3 -3
- package/bundle/{ssrf-guard-O6SHIK6Q.js → ssrf-guard-U2JA72TC.js} +3 -3
- package/bundle/{start-7QZIWO3S.js → start-H5IUFAWF.js} +4 -2
- package/bundle/{start-7QZIWO3S.js.map → start-H5IUFAWF.js.map} +2 -2
- package/bundle/{stt-LGVPXMVR.js → stt-PSOPPBV4.js} +4 -4
- package/bundle/{system-status-FAVNIUFJ.js → system-status-4LYGOFNO.js} +38 -24
- package/bundle/system-status-4LYGOFNO.js.map +7 -0
- package/bundle/{task-store-W5BFIAIH.js → task-store-MNCW42BW.js} +4 -4
- package/bundle/{telegram-adapter-4TX7QWKC.js → telegram-adapter-O6KIZDY6.js} +62 -45
- package/bundle/telegram-adapter-O6KIZDY6.js.map +7 -0
- package/bundle/{tool-registry-7FK3OQGL.js → tool-registry-JJMWCQKZ.js} +26 -24
- package/bundle/{tool-sandbox-4UC6GAKA.js → tool-sandbox-CNL6V6IH.js} +4 -4
- package/bundle/{transport-config-KBF5W2DP.js → transport-config-6MB2K2XC.js} +7 -7
- package/bundle/tribe-GDTFYJTK.js +111 -0
- package/bundle/tribe-GDTFYJTK.js.map +7 -0
- package/bundle/{update-CKFP6LBE.js → update-HGQAOC5L.js} +3 -3
- package/bundle/{usage-tracker-NXD364VX.js → usage-tracker-SR4BI6ZT.js} +2 -2
- package/bundle/{user-registry-35BW4XKM.js → user-registry-4PACZJIJ.js} +4 -4
- package/bundle/wire-platform-KKPWNNNQ.js +88 -0
- package/bundle/wire-platform-KKPWNNNQ.js.map +7 -0
- package/bundle/ws-peer-client-U3NNPOK7.js +370 -0
- package/bundle/ws-peer-client-U3NNPOK7.js.map +7 -0
- package/package.json +1 -1
- package/scripts/abtars-watchdog.sh +1 -5
- package/scripts/emergency-deploy.sh +2 -2
- package/scripts/emergency-update.sh +36 -37
- package/bundle/chunk-374NCXFZ.js.map +0 -7
- package/bundle/chunk-4MULJ5SS.js.map +0 -7
- package/bundle/chunk-4S554KLW.js +0 -105
- package/bundle/chunk-4S554KLW.js.map +0 -7
- package/bundle/chunk-C7K6VZNY.js.map +0 -7
- package/bundle/chunk-CXXU3HAU.js.map +0 -7
- package/bundle/chunk-EGL6UMAO.js.map +0 -7
- package/bundle/chunk-EQSG2CRM.js.map +0 -7
- package/bundle/chunk-HT2BPTZY.js +0 -241
- package/bundle/chunk-HT2BPTZY.js.map +0 -7
- package/bundle/chunk-HZDLFLRP.js.map +0 -7
- package/bundle/chunk-IHYKTDIP.js.map +0 -7
- package/bundle/chunk-IKUZPMVA.js +0 -82
- package/bundle/chunk-IKUZPMVA.js.map +0 -7
- package/bundle/chunk-P2K2K6XL.js.map +0 -7
- package/bundle/chunk-PU5HSKWH.js +0 -257
- package/bundle/chunk-PU5HSKWH.js.map +0 -7
- package/bundle/chunk-RWRRGE4U.js +0 -72
- package/bundle/chunk-RWRRGE4U.js.map +0 -7
- package/bundle/chunk-SMPHE3ZM.js.map +0 -7
- package/bundle/chunk-VUIX5AGB.js +0 -65
- package/bundle/chunk-VUIX5AGB.js.map +0 -7
- package/bundle/chunk-VXCETPZU.js.map +0 -7
- package/bundle/chunk-YPAQEQSC.js.map +0 -7
- package/bundle/context-2RJHC2LE.js.map +0 -7
- package/bundle/direct-api-transport-S2RDH2I7.js.map +0 -7
- package/bundle/dns-wakeup-IDOJIXBX.js.map +0 -7
- package/bundle/heartbeat-tier3-6KH45CL6.js.map +0 -7
- package/bundle/install-OS3CU7NF.js.map +0 -7
- package/bundle/metrics-collector-L3VPEHII.js.map +0 -7
- package/bundle/peer-client-RGEU5HOK.js.map +0 -7
- package/bundle/peer-jwt-NCCPXJRX.js +0 -18
- package/bundle/stream-single-RFJNUTL6.js +0 -34
- package/bundle/stream-single-RFJNUTL6.js.map +0 -7
- package/bundle/system-status-FAVNIUFJ.js.map +0 -7
- package/bundle/telegram-adapter-4TX7QWKC.js.map +0 -7
- package/bundle/user-registry-35BW4XKM.js.map +0 -7
- package/bundle/ws-peer-client-AIXCXF7V.js +0 -173
- package/bundle/ws-peer-client-AIXCXF7V.js.map +0 -7
- /package/bundle/{_registry.generated-YP5GLSG7.js.map → _registry.generated-AVR7DK2A.js.map} +0 -0
- /package/bundle/{abmind-lazy-7Z44NODV.js.map → abmind-lazy-E3YCFKQ5.js.map} +0 -0
- /package/bundle/{acp-raw-client-E6FM45NC.js.map → acp-raw-client-UCNK3OTU.js.map} +0 -0
- /package/bundle/{action-gate-G2V47NHW.js.map → action-gate-V4FCBHFB.js.map} +0 -0
- /package/bundle/{agent-api-adapter-WRGEQ6DV.js.map → agent-api-adapter-7HEPYSIN.js.map} +0 -0
- /package/bundle/{agent-api-rate-limit-WCFXJMGY.js.map → agent-api-rate-limit-RZSAM3SW.js.map} +0 -0
- /package/bundle/{agent-registry-GHNG2PH3.js.map → agent-registry-46A2R5KP.js.map} +0 -0
- /package/bundle/{bootstrap-PZIDBPEJ.js.map → bootstrap-MIHJJSWU.js.map} +0 -0
- /package/bundle/{bridge-lock-transport-4ZH7QTJP.js.map → bridge-lock-transport-7RSN7OLJ.js.map} +0 -0
- /package/bundle/{browser-D3LZV7ZK.js.map → browser-F6BCWJWW.js.map} +0 -0
- /package/bundle/{budget-45QOBDWA.js.map → budget-WUM3SPKW.js.map} +0 -0
- /package/bundle/{capability-JFWX3IQF.js.map → capability-QVRKGRFC.js.map} +0 -0
- /package/bundle/{chunk-YSKCQH6E.js.map → chunk-2IYJ4I66.js.map} +0 -0
- /package/bundle/{chunk-W2R2HFOQ.js.map → chunk-2NLUT5S2.js.map} +0 -0
- /package/bundle/{chunk-OKAQICWY.js.map → chunk-3GQX34S2.js.map} +0 -0
- /package/bundle/{chunk-QROWBWLL.js.map → chunk-3XZ773BS.js.map} +0 -0
- /package/bundle/{chunk-DYBW4XXL.js.map → chunk-467SRLLR.js.map} +0 -0
- /package/bundle/{chunk-GPZNXY2U.js.map → chunk-4S3H4OK7.js.map} +0 -0
- /package/bundle/{chunk-NDCRWEEJ.js.map → chunk-4Y5MJQRE.js.map} +0 -0
- /package/bundle/{chunk-FRKW6LWB.js.map → chunk-55UWKI5C.js.map} +0 -0
- /package/bundle/{chunk-7JN2MMU7.js.map → chunk-5PNJFDSW.js.map} +0 -0
- /package/bundle/{chunk-OXTSWQCX.js.map → chunk-5Y3FJ2Y7.js.map} +0 -0
- /package/bundle/{chunk-TMUYFERL.js.map → chunk-6B5ZFUPD.js.map} +0 -0
- /package/bundle/{chunk-65VCEC32.js.map → chunk-6PA5JBUU.js.map} +0 -0
- /package/bundle/{chunk-AFREM7FX.js.map → chunk-CK7YTA2F.js.map} +0 -0
- /package/bundle/{chunk-NRUSRJXR.js.map → chunk-DZJ5QZFD.js.map} +0 -0
- /package/bundle/{chunk-YRSMGJFP.js.map → chunk-E67KESEG.js.map} +0 -0
- /package/bundle/{chunk-ZV4IWKDJ.js.map → chunk-E7XD5UGB.js.map} +0 -0
- /package/bundle/{chunk-PEDX56EL.js.map → chunk-EFGBM555.js.map} +0 -0
- /package/bundle/{chunk-75ATTOW4.js.map → chunk-IY6UKLPS.js.map} +0 -0
- /package/bundle/{chunk-EUZDKV3C.js.map → chunk-J4RUFAPK.js.map} +0 -0
- /package/bundle/{chunk-N4EB6LA7.js.map → chunk-JLWYPGWI.js.map} +0 -0
- /package/bundle/{chunk-5QUTMUIK.js.map → chunk-JXYWDAHD.js.map} +0 -0
- /package/bundle/{chunk-M3JEX6L4.js.map → chunk-L72RIPEC.js.map} +0 -0
- /package/bundle/{chunk-TEFZ4JA4.js.map → chunk-NHPLD3C7.js.map} +0 -0
- /package/bundle/{chunk-2KC5G3EA.js.map → chunk-OWUO5RS3.js.map} +0 -0
- /package/bundle/{chunk-WYHGNI56.js.map → chunk-PMD5BLFS.js.map} +0 -0
- /package/bundle/{chunk-URQPDCK5.js.map → chunk-Q66LQMMZ.js.map} +0 -0
- /package/bundle/{chunk-JQDJPUHM.js.map → chunk-TWB2ZGVH.js.map} +0 -0
- /package/bundle/{chunk-IJT4KWXT.js.map → chunk-U4U47YE7.js.map} +0 -0
- /package/bundle/{chunk-2FAZIA37.js.map → chunk-W546CU3A.js.map} +0 -0
- /package/bundle/{chunk-JNIHEDKF.js.map → chunk-XPWYDNWL.js.map} +0 -0
- /package/bundle/{chunk-EFJVUJBE.js.map → chunk-Y5FEFKGM.js.map} +0 -0
- /package/bundle/{chunk-GVM5YU5I.js.map → chunk-Z4FZPB42.js.map} +0 -0
- /package/bundle/{chunk-7BSQ5UQO.js.map → chunk-ZSIDQ66D.js.map} +0 -0
- /package/bundle/{chunk-XX6BGTPO.js.map → chunk-ZZZCJJEO.js.map} +0 -0
- /package/bundle/{commands-OIISYHTD.js.map → commands-2ZW6CMLC.js.map} +0 -0
- /package/bundle/{config-M3P5IOAI.js.map → config-YMY5YHKN.js.map} +0 -0
- /package/bundle/{daemon-TB23FFWY.js.map → daemon-D7SU63OY.js.map} +0 -0
- /package/bundle/{delegation-tools-YATZFKYO.js.map → delegation-tools-WS7Z56KZ.js.map} +0 -0
- /package/bundle/{deploy-T6R45OZJ.js.map → deploy-AMTVKIMU.js.map} +0 -0
- /package/bundle/{deps-WVK553KF.js.map → deps-T63AVJKJ.js.map} +0 -0
- /package/bundle/{doctor-probes-B54JFIW3.js.map → doctor-probes-O6YI6XSZ.js.map} +0 -0
- /package/bundle/{env-schema-4JXQUOH4.js.map → env-schema-B5RB32DC.js.map} +0 -0
- /package/bundle/{gossip-3C3BSNPN.js.map → gossip-SKRCPOBS.js.map} +0 -0
- /package/bundle/{guardrails-DL7ZSWVN.js.map → guardrails-64GQ5Y5K.js.map} +0 -0
- /package/bundle/{heartbeat-system-MVTRS4GP.js.map → heartbeat-system-X4MUTKJD.js.map} +0 -0
- /package/bundle/{hook-system-M3POLUIB.js.map → hook-system-YB635OC4.js.map} +0 -0
- /package/bundle/{hotskills-FWX4QI7V.js.map → hotskills-Q75D2DK3.js.map} +0 -0
- /package/bundle/{install-manifest-5PPWMD2W.js.map → install-manifest-J7ICPCJN.js.map} +0 -0
- /package/bundle/{irc-adapter-PTTZD32W.js.map → irc-adapter-TVEV4R6H.js.map} +0 -0
- /package/bundle/{irc-config-CP7ZMUOX.js.map → irc-config-M676FOFI.js.map} +0 -0
- /package/bundle/{kanban-board-M326B2XJ.js.map → kanban-board-DLEJUCNN.js.map} +0 -0
- /package/bundle/{kanban-channel-IJ52OMNA.js.map → kanban-channel-XOLUHJZJ.js.map} +0 -0
- /package/bundle/{lazy-require-KCRVT4SI.js.map → lazy-require-JKQSALXN.js.map} +0 -0
- /package/bundle/{logger-OWCSNYCA.js.map → logger-3EGHBD4R.js.map} +0 -0
- /package/bundle/{main-chat-ZNUZCTNS.js.map → main-chat-3H63REKK.js.map} +0 -0
- /package/bundle/{master-user-HSKM4ZFN.js.map → master-user-MUBUP3KD.js.map} +0 -0
- /package/bundle/{media-utils-3ZYOD7SK.js.map → media-utils-HUUIALAJ.js.map} +0 -0
- /package/bundle/{message-pipeline-AUIUNM5R.js.map → message-pipeline-GRDRWONR.js.map} +0 -0
- /package/bundle/{model-health-registry-MLEIZSTV.js.map → model-health-registry-QADMFQFQ.js.map} +0 -0
- /package/bundle/{nerve-IGSXBKZZ.js.map → nerve-QPAEBRKX.js.map} +0 -0
- /package/bundle/{notification-BFSIEECG.js.map → notification-3JICGXWU.js.map} +0 -0
- /package/bundle/{openrouter-credits-NTVZDRYM.js.map → openrouter-credits-7NEIPYJN.js.map} +0 -0
- /package/bundle/{orc-tools-TOD4WHTM.js.map → orc-tools-UZVPONKY.js.map} +0 -0
- /package/bundle/{peer-auth-QC4EF2PM.js.map → peer-auth-RI43DKJE.js.map} +0 -0
- /package/bundle/{peer-config-TN55LFDC.js.map → peer-config-URM7DCW6.js.map} +0 -0
- /package/bundle/{peer-jwt-NCCPXJRX.js.map → peer-transport-SI7I72DB.js.map} +0 -0
- /package/bundle/{peer-transport-5VKK2I7P.js.map → phase-transport-ESWWACZI.js.map} +0 -0
- /package/bundle/{phase-transport-FS6NL4A5.js.map → reconcile-GFDQYNBD.js.map} +0 -0
- /package/bundle/{reconciler-NZ4O4BCP.js.map → reconciler-IEUJXJN2.js.map} +0 -0
- /package/bundle/{restore-IFHPI7I7.js.map → restore-FARTGLQQ.js.map} +0 -0
- /package/bundle/{reconcile-CTFCLQRN.js.map → rollback-GEWPZABG.js.map} +0 -0
- /package/bundle/{sandbox-runtime-QROWHDCS.js.map → sandbox-runtime-DV6E25J6.js.map} +0 -0
- /package/bundle/{self-healer-utils-IFAYOQO2.js.map → self-healer-utils-P4SKNNEM.js.map} +0 -0
- /package/bundle/{rollback-ANRI3T5Z.js.map → sha-tracker-77SHLYNY.js.map} +0 -0
- /package/bundle/{skill-session-VJXTKOKL.js.map → skill-session-5HSMXY54.js.map} +0 -0
- /package/bundle/{sha-tracker-ZWBP6CIJ.js.map → skill-stats-MI3RSWWL.js.map} +0 -0
- /package/bundle/{skill-stats-JORH5DGM.js.map → skill-watcher-5L7JE6TN.js.map} +0 -0
- /package/bundle/{skill-watcher-E4MGLKLS.js.map → sleep-I4JFASCY.js.map} +0 -0
- /package/bundle/{sleep-BEWAUFCL.js.map → soul-bundle-522C3IRH.js.map} +0 -0
- /package/bundle/{soul-bundle-VWAVHCZ6.js.map → spin-VHNGNWTD.js.map} +0 -0
- /package/bundle/{spin-notifications-SE2HVZI7.js.map → spin-notifications-7NC5XZEM.js.map} +0 -0
- /package/bundle/{spin-E3ZDEDKT.js.map → spin-types-C5KOQOPD.js.map} +0 -0
- /package/bundle/{sse-parser-anthropic-A6R4Z2TB.js.map → sse-parser-anthropic-MMTVWHLI.js.map} +0 -0
- /package/bundle/{sse-parser-responses-HSZY3QGJ.js.map → sse-parser-responses-3AOFN64C.js.map} +0 -0
- /package/bundle/{ssrf-guard-O6SHIK6Q.js.map → ssrf-guard-U2JA72TC.js.map} +0 -0
- /package/bundle/{spin-types-OIE67MJK.js.map → stt-PSOPPBV4.js.map} +0 -0
- /package/bundle/{stt-LGVPXMVR.js.map → task-store-MNCW42BW.js.map} +0 -0
- /package/bundle/{task-store-W5BFIAIH.js.map → tool-registry-JJMWCQKZ.js.map} +0 -0
- /package/bundle/{tool-registry-7FK3OQGL.js.map → tool-sandbox-CNL6V6IH.js.map} +0 -0
- /package/bundle/{tool-sandbox-4UC6GAKA.js.map → transport-config-6MB2K2XC.js.map} +0 -0
- /package/bundle/{transport-config-KBF5W2DP.js.map → update-HGQAOC5L.js.map} +0 -0
- /package/bundle/{update-CKFP6LBE.js.map → usage-tracker-SR4BI6ZT.js.map} +0 -0
- /package/bundle/{usage-tracker-NXD364VX.js.map → user-registry-4PACZJIJ.js.map} +0 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/components/transport/tool-registry.ts", "../src/components/transport/skill-authoring.ts", "../src/components/transport/mcp-tool.ts", "../src/components/transport/peer-delegation-tools.ts", "../src/components/transport/kanban-tool.ts", "../src/components/transport/channel-tool.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Tool registry for DirectApiTransport.\n * Phase 2: native tool schemas. Phase 3: in-process memory when available.\n */\n\nimport { execFile } from \"node:child_process\";\nimport { appendFileSync, mkdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport type { MemoryBackend } from \"abmind\";\nimport type { InstantStoreParams } from \"../../types/index.js\";\nimport { logWarn, redactSecrets } from \"../logger.js\";\nimport { logAndSwallow } from \"../log-and-swallow.js\";\nimport { checkTool, checkPath, auditDeny, type SandboxPolicy } from \"../tool-sandbox.js\";\nimport { getMasterUserId } from \"../master-user.js\";\n\nconst TAG = \"tool_registry\";\n\n// #449: append-only audit log\nconst AUDIT_DIR = join(process.env[\"ABTARS_HOME\"] ?? join(homedir(), \".abtars\"), \"logs\");\nconst AUDIT_PATH = join(AUDIT_DIR, \"audit.jsonl\");\ntry { mkdirSync(AUDIT_DIR, { recursive: true }); } catch (err) { logAndSwallow(TAG, \"mkdirSync audit dir\", err); }\nfunction audit(entry: Record<string, unknown>): void {\n try { appendFileSync(AUDIT_PATH, JSON.stringify(entry) + \"\\n\"); } catch (err) { logAndSwallow(TAG, \"audit write\", err); }\n}\n\nexport type ToolDefinition = {\n readonly name: string;\n readonly description: string;\n readonly parameters: Record<string, unknown>;\n execute(args: Record<string, string>, context?: { userId: string; signal?: AbortSignal }): Promise<string>;\n};\n\nconst BASH_TIMEOUT_MS = 300_000;\nconst CLI_TIMEOUT_MS = 60_000;\n\n// #1266: when no in-process memory backend is wired, return this error\n// rather than silently shelling out to a CLI on PATH we don't trust.\nconst MEMORY_BACKEND_ERROR = \"memory backend not initialized \u2014 abmind failed to load or below supported floor\";\n\n/**\n * Patterns that would spawn or restart a bridge/watchdog process.\n * Blocked to prevent the LLM (especially fallback models) from accidentally\n * starting a second bridge instance, which would cause port conflicts,\n * Telegram 409 errors, and bridge.lock PID confusion.\n *\n * See post-mortem of 2026-04-22 outage: cron agent ran execute_bash that\n * spawned a rogue bridge alongside the watchdog-supervised one.\n */\nconst BLOCKED_PATTERNS: readonly RegExp[] = [\n /\\bmain\\.js\\b/, // node .../current/dist/main.js ...\n /\\babtars\\.sh\\b/, // the launcher\n /\\bwatchdog\\.sh\\b/, // the watchdog\n /\\blaunchctl\\s+(load|bootstrap|kickstart|start)\\b/, // launchd bridge start\n];\n\nexport function isBridgeSpawnCommand(cmd: string): boolean {\n return BLOCKED_PATTERNS.some(p => p.test(cmd));\n}\n\n/** Block kill/pkill/killall targeting the bridge's own PID or process patterns (#414). */\nfunction isBridgeKillCommand(cmd: string): boolean {\n const pid = process.pid;\n const ppid = process.ppid;\n // Direct kill of own PID or parent\n if (new RegExp(`\\\\bkill\\\\s+(-\\\\d+\\\\s+)?${pid}\\\\b`).test(cmd)) return true;\n if (new RegExp(`\\\\bkill\\\\s+(-\\\\d+\\\\s+)?${ppid}\\\\b`).test(cmd)) return true;\n // pkill/killall targeting bridge patterns\n if (/\\b(pkill|killall)\\b.*\\b(abtars|main\\.js|watchdog)\\b/.test(cmd)) return true;\n if (/\\bkill\\b.*\\$\\(.*pgrep.*abtars/.test(cmd)) return true;\n return false;\n}\n\nfunction runBash(cmd: string, timeout = BASH_TIMEOUT_MS, signal?: AbortSignal): Promise<string> {\n // Guardrails: command check\n const { checkCommand, classifyCommand } = require(\"../guardrails.js\") as typeof import(\"../guardrails.js\");\n const cmdBlock = checkCommand(cmd);\n if (cmdBlock) {\n logWarn(\"tool-registry\", `Guardrails blocked: ${cmd.slice(0, 200)}`);\n return Promise.resolve(JSON.stringify({ stderr: cmdBlock, exit_code: 126 }));\n }\n\n // Action gate: auth-required commands\n const tier = classifyCommand(cmd);\n if (tier === \"auth-required\" && _actionGate) {\n return _actionGate.requestAuth(\"bash-auth\", cmd).then((granted) => {\n if (!granted) {\n logWarn(\"tool-registry\", `Auth denied for: ${cmd.slice(0, 200)}`);\n return JSON.stringify({ stderr: \"Command requires authorization. Master denied or timed out.\", exit_code: 126 });\n }\n return executeBash(cmd, timeout, signal);\n });\n }\n\n if (isBridgeSpawnCommand(cmd)) {\n logWarn(\"tool-registry\", `Blocked bridge-spawn command: ${cmd.slice(0, 200)}`);\n return Promise.resolve(JSON.stringify({\n stderr: \"Command blocked: this would spawn/restart a bridge or watchdog process. The bridge is already running under launchd+watchdog supervision; use launchctl inspection commands (launchctl list, launchctl print) or signal the existing process instead.\",\n exit_code: 126,\n }));\n }\n if (isBridgeKillCommand(cmd)) {\n logWarn(\"tool-registry\", `Blocked bridge-kill command: ${cmd.slice(0, 200)}`);\n return Promise.resolve(JSON.stringify({\n stderr: \"Command blocked: this would kill the bridge process (yourself). Ask the user to send /restart for a session reset or restart the bridge manually.\",\n exit_code: 126,\n }));\n }\n return executeBash(cmd, timeout, signal);\n}\n\nlet _seatbeltActive = false;\nlet _seatbeltPolicy: import(\"../seatbelt/policy.js\").SeatbeltPolicy | null = null;\n\n/** Wire seatbelt for OS-level command sandboxing (#906). */\nexport function setSeatbelt(active: boolean, policy?: import(\"../seatbelt/policy.js\").SeatbeltPolicy): void {\n _seatbeltActive = active;\n _seatbeltPolicy = policy ?? null;\n}\n\nfunction executeBash(cmd: string, timeout: number, signal?: AbortSignal): Promise<string> {\n return new Promise((resolve) => {\n let bin = \"bash\";\n let args = [\"-c\", cmd];\n\n // #906: Wrap in OS sandbox if seatbelt active and command needs sandboxing\n if (_seatbeltActive && _seatbeltPolicy) {\n const { shouldSandbox, wrapCommand } = require(\"../seatbelt/index.js\") as typeof import(\"../seatbelt/index.js\");\n if (shouldSandbox(cmd)) {\n const wrapped = wrapCommand(cmd, _seatbeltPolicy);\n bin = wrapped.bin;\n args = wrapped.args;\n }\n }\n\n const child = execFile(bin, args, { timeout, maxBuffer: 1024 * 1024 }, (err, stdout, stderr) => {\n const result: Record<string, unknown> = {};\n if (stdout) result[\"stdout\"] = stdout.slice(0, 50_000);\n if (stderr) result[\"stderr\"] = stderr.slice(0, 10_000);\n if (err) result[\"exit_code\"] = (err as NodeJS.ErrnoException & { code?: number }).code ?? 1;\n else result[\"exit_code\"] = 0;\n resolve(JSON.stringify(result));\n });\n if (signal) {\n if (signal.aborted) { child.kill(\"SIGTERM\"); return; }\n const onAbort = (): void => {\n child.kill(\"SIGTERM\");\n // #1003: escalate to SIGKILL if child doesn't exit within 3s\n setTimeout(() => { try { child.kill(\"SIGKILL\"); } catch {} }, 3000);\n };\n signal.addEventListener(\"abort\", onAbort, { once: true });\n child.on(\"exit\", () => signal.removeEventListener(\"abort\", onAbort));\n }\n });\n}\n\nlet memoryBackend: MemoryBackend | null = null;\n\n/** Wire in-process memory backend. Call once after memory init. */\nexport function setMemoryBackend(backend: MemoryBackend | null): void {\n memoryBackend = backend;\n}\n\nlet _actionGate: import(\"../action-gate.js\").ActionGate | null = null;\n\n/** Wire action gate for auth-required commands. */\nexport function setActionGate(gate: import(\"../action-gate.js\").ActionGate | null): void {\n _actionGate = gate;\n}\n\nlet _peerActivityCb: ((msg: string) => void) | null = null;\n\n/** Wire peer activity notification callback. */\nexport function setPeerActivityCallback(cb: ((msg: string) => void) | null): void {\n _peerActivityCb = cb;\n}\n\n// --- Tool definitions ---\n\nconst bashTool: ToolDefinition = {\n name: \"execute_bash\",\n description: \"Execute a bash command. Use for file operations, git, running scripts, and any shell command. Commands that would spawn or restart a bridge/watchdog process (node main.js, abtars.sh, abtars-watchdog.sh, launchctl load/bootstrap/kickstart/start) are blocked \u2014 the bridge is already supervised.\",\n parameters: {\n type: \"object\",\n properties: { command: { type: \"string\", description: \"The bash command to execute\" } },\n required: [\"command\"],\n },\n execute: (args, context) => runBash(args[\"command\"] ?? \"\", BASH_TIMEOUT_MS, context?.signal),\n};\n\nlet _storeCount = 0;\nconst STORE_CAP = 20;\n\n/** Reset store counter (called on new subagent session). */\nexport function resetStoreCounter(): void { _storeCount = 0; }\n\nconst memoryStoreTool: ToolDefinition = {\n name: \"memory_store\",\n description: \"Store a memory. Use after learning something about the user, their preferences, decisions, or facts worth remembering.\",\n parameters: {\n type: \"object\",\n properties: {\n translated: { type: \"string\", description: \"Memory content in English\" },\n original: { type: \"string\", description: \"Memory content in original language (if not English)\" },\n type: { type: \"string\", enum: [\"fact\", \"preference\", \"decision\", \"experience\", \"skill\", \"relationship\", \"goal\"], description: \"Memory type\" },\n emotion: { type: \"integer\", description: \"Emotion score -5 to +5 (0=neutral)\" },\n confidence: { type: \"integer\", description: \"Confidence 1-5 (3=default)\" },\n classification: { type: \"integer\", description: \"0=public (general knowledge), 1=internal (default), 2=confidential (personal preferences, habits, opinions about specific users), 3=secret (credentials, API keys, tokens, passwords \u2014 store IMMEDIATELY with exact string, never paraphrase, never wait for Dreamy)\" },\n },\n required: [\"translated\", \"type\"],\n },\n async execute(args, context): Promise<string> {\n if (++_storeCount > STORE_CAP) {\n return JSON.stringify({ stored: false, error: \"Store limit reached for this session. Move to next task.\" });\n }\n if (memoryBackend) {\n try {\n const params: InstantStoreParams = {\n userId: context?.userId ?? getMasterUserId(),\n contentEn: args[\"translated\"] ?? \"\",\n contentOriginal: args[\"original\"] ?? args[\"translated\"] ?? \"\",\n memoryType: (args[\"type\"] ?? \"fact\") as InstantStoreParams[\"memoryType\"],\n emotionScore: parseInt(args[\"emotion\"] ?? \"0\", 10),\n confidence: parseInt(args[\"confidence\"] ?? \"3\", 10),\n classification: parseInt(args[\"classification\"] ?? \"1\", 10),\n };\n const result = await memoryBackend.instantStore({ ...params, createdBy: \"tool:memory_store\" });\n return JSON.stringify(result);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n // #706: FTS5 corruption self-heal \u2014 rebuild indexes and retry once\n if (msg.includes(\"fts5\") || msg.includes(\"corruption\")) {\n try {\n memoryBackend.rebuildFtsIndexes();\n logWarn(\"tool-registry\", \"FTS corruption detected \u2014 rebuilt indexes, retrying store\");\n const params: InstantStoreParams = {\n userId: context?.userId ?? getMasterUserId(),\n contentEn: args[\"translated\"] ?? \"\",\n contentOriginal: args[\"original\"] ?? args[\"translated\"] ?? \"\",\n memoryType: (args[\"type\"] ?? \"fact\") as InstantStoreParams[\"memoryType\"],\n emotionScore: parseInt(args[\"emotion\"] ?? \"0\", 10),\n confidence: parseInt(args[\"confidence\"] ?? \"3\", 10),\n classification: parseInt(args[\"classification\"] ?? \"1\", 10),\n };\n const result = await memoryBackend.instantStore({ ...params, createdBy: \"tool:memory_store\" });\n return JSON.stringify(result);\n } catch (retryErr) { /* fall through */ }\n }\n return JSON.stringify({ error: msg });\n }\n }\n return JSON.stringify({ error: MEMORY_BACKEND_ERROR });\n },\n};\n\nconst memoryRecallTool: ToolDefinition = {\n name: \"memory_recall\",\n description: \"Search memories by keyword or semantic query. Returns relevant stored memories.\",\n parameters: {\n type: \"object\",\n properties: {\n query: { type: \"string\", description: \"Search query\" },\n limit: { type: \"integer\", description: \"Max results (default 10)\" },\n },\n required: [\"query\"],\n },\n async execute(args, context): Promise<string> {\n if (memoryBackend) {\n try {\n const t0 = Date.now();\n const userId = context?.userId ?? getMasterUserId();\n const { loadUsers } = await import(\"../user-registry.js\");\n const userEntry = loadUsers().byUserId.get(userId);\n const result = await memoryBackend.recall({\n translated: [args[\"query\"] ?? \"\"],\n original: args[\"query\"] ?? \"\",\n userId,\n limit: parseInt(args[\"limit\"] ?? \"10\", 10),\n maxClassification: userEntry?.maxClass ?? 1,\n });\n import(\"../metrics-collector.js\").then(({ recordLatency }) => recordLatency(\"recall\", Date.now() - t0)).catch(() => {});\n return JSON.stringify(result);\n } catch (err) {\n return JSON.stringify({ error: err instanceof Error ? err.message : String(err) });\n }\n }\n return JSON.stringify({ error: MEMORY_BACKEND_ERROR });\n },\n};\n\nconst memoryEditTool: ToolDefinition = {\n name: \"memory_edit\",\n description: \"Edit an existing memory by ID. Change content, type, emotion, confidence, or classification.\",\n parameters: {\n type: \"object\",\n properties: {\n memory_id: { type: \"integer\", description: \"Memory ID to edit\" },\n translated: { type: \"string\", description: \"New English content\" },\n original: { type: \"string\", description: \"New original language content\" },\n type: { type: \"string\", description: \"New memory type\" },\n emotion: { type: \"integer\", description: \"New emotion score\" },\n confidence: { type: \"integer\", description: \"New confidence\" },\n classification: { type: \"integer\", description: \"New classification\" },\n caller: { type: \"string\", enum: [\"kp\", \"dreamy\"], description: \"Who is making the edit\" },\n },\n required: [\"memory_id\"],\n },\n async execute(args): Promise<string> {\n if (memoryBackend) {\n try {\n const result = await memoryBackend.editMemory({\n memoryId: parseInt(args[\"memory_id\"] ?? \"0\", 10),\n contentEn: args[\"translated\"],\n contentOriginal: args[\"original\"],\n memoryType: args[\"type\"] as \"fact\" | \"decision\" | \"preference\" | \"event\" | undefined,\n emotionScore: args[\"emotion\"] ? parseInt(args[\"emotion\"], 10) : undefined,\n confidence: args[\"confidence\"] ? parseInt(args[\"confidence\"], 10) : undefined,\n classification: args[\"classification\"] ? parseInt(args[\"classification\"], 10) : undefined,\n caller: (args[\"caller\"] ?? \"kp\") as \"kp\" | \"dreamy\",\n });\n return JSON.stringify(result);\n } catch (err) {\n return JSON.stringify({ error: err instanceof Error ? err.message : String(err) });\n }\n }\n return JSON.stringify({ error: MEMORY_BACKEND_ERROR });\n },\n};\n\nconst webBrowseTool: ToolDefinition = {\n name: \"web_browse\",\n description: \"Browse a URL or perform a complex multi-step web task. For quick lookups use execute_bash with curl.\",\n parameters: {\n type: \"object\",\n properties: {\n task: { type: \"string\", description: \"What to do on the web\" },\n chat_id: { type: \"string\", description: \"Chat ID for result delivery\" },\n engine: { type: \"string\", enum: [\"cloakbrowser\"], description: \"Browser engine (default: cloakbrowser)\" },\n },\n required: [\"task\", \"chat_id\"],\n },\n execute: (args) => {\n let cmd = `abtars-browse --task ${JSON.stringify(args[\"task\"] ?? \"\")} --chat-id ${args[\"chat_id\"] ?? \"0\"}`;\n if (args[\"engine\"]) cmd += ` --engine ${args[\"engine\"]}`;\n return runBash(cmd, CLI_TIMEOUT_MS);\n },\n};\n\nconst todoTool: ToolDefinition = {\n name: \"todo_manage\",\n description: \"Manage TODO items. Add, complete, or list tasks.\",\n parameters: {\n type: \"object\",\n properties: {\n action: { type: \"string\", enum: [\"add\", \"done\", \"list\", \"remove\"], description: \"Action to perform\" },\n text: { type: \"string\", description: \"TODO text (for add)\" },\n id: { type: \"string\", description: \"TODO ID (for done/remove)\" },\n },\n required: [\"action\"],\n },\n execute: (args) => {\n const action = args[\"action\"] ?? \"list\";\n if (action === \"add\") return runBash(`abtars-todo add ${JSON.stringify(args[\"text\"] ?? \"\")}`, CLI_TIMEOUT_MS);\n if (action === \"done\") return runBash(`abtars-todo done ${args[\"id\"] ?? \"\"}`, CLI_TIMEOUT_MS);\n if (action === \"remove\") return runBash(`abtars-todo remove ${args[\"id\"] ?? \"\"}`, CLI_TIMEOUT_MS);\n return runBash(\"abtars-todo list\", CLI_TIMEOUT_MS);\n },\n};\n\nlet _enqueueCron: ((id: string, manual?: boolean) => string | null) | null = null;\n\n/** Inject enqueueCron from bridge for task_manage --run. */\nexport function setEnqueueCron(fn: (id: string, manual?: boolean) => string | null): void { _enqueueCron = fn; }\n\nlet _ircSend: ((channel: string, message: string) => void) | null = null;\n\n/** Inject IRC send from bridge for irc_send tool. */\nexport function setIrcSend(fn: (channel: string, message: string) => void): void { _ircSend = fn; }\n\n/** @deprecated \u2014 secret_get now reads from file, not DB. Kept for backward compat (callers may still call this). */\n\nlet _sendDocument: ((path: string, caption?: string) => Promise<number>) | null = null;\n\n/**\n * Inject sendDocument from bridge for the send_document tool.\n * Caller binds main chat id + telegram adapter; tool is a thin wrapper around that.\n */\nexport function setSendDocument(fn: ((path: string, caption?: string) => Promise<number>) | null): void { _sendDocument = fn; }\n\nconst sendDocumentTool: ToolDefinition = {\n name: \"send_document\",\n description: \"Send a file from disk to the user's Telegram chat. Use for delivering reports, daily summaries, logs, or any .md file the user asks for. Do not summarize \u2014 the raw file is sent as an attachment.\",\n parameters: {\n type: \"object\",\n properties: {\n path: { type: \"string\", description: \"Absolute path to the file\" },\n caption: { type: \"string\", description: \"Optional short caption (\u22641024 chars)\" },\n },\n required: [\"path\"],\n },\n execute: async (args) => {\n const path = args[\"path\"];\n if (!path) return JSON.stringify({ error: \"path is required\" });\n if (!_sendDocument) return JSON.stringify({ error: \"Telegram not configured (sendDocument unavailable)\" });\n try {\n const messageId = await _sendDocument(path, args[\"caption\"]);\n return JSON.stringify({ ok: true, message_id: messageId });\n } catch (err) {\n return JSON.stringify({ error: err instanceof Error ? err.message : String(err) });\n }\n },\n};\n\nconst taskTool: ToolDefinition = {\n name: \"task_manage\",\n description: \"Manage scheduled/recurring tasks (cron). Add, list, remove, pause, resume, or run tasks. Use action=run to execute a task immediately via the cron queue (isolated subagent).\",\n parameters: {\n type: \"object\",\n properties: {\n action: { type: \"string\", enum: [\"add\", \"list\", \"remove\", \"pause\", \"resume\", \"run\"], description: \"Action\" },\n message: { type: \"string\", description: \"Task message/command (for add)\" },\n schedule: { type: \"string\", description: \"Cron schedule expression (for add)\" },\n type: { type: \"string\", enum: [\"reminder\", \"script\", \"agent\"], description: \"Task type (for add)\" },\n chat_id: { type: \"string\", description: \"Chat ID (for add)\" },\n id: { type: \"string\", description: \"Task ID (for remove/pause/resume/run)\" },\n },\n required: [\"action\"],\n },\n execute: (args) => {\n const action = args[\"action\"] ?? \"list\";\n if (action === \"list\") return runBash(\"abtars-task list\", CLI_TIMEOUT_MS);\n if (action === \"remove\") return runBash(`abtars-task remove ${args[\"id\"] ?? \"\"}`, CLI_TIMEOUT_MS);\n if (action === \"pause\") return runBash(`abtars-task pause ${args[\"id\"] ?? \"\"}`, CLI_TIMEOUT_MS);\n if (action === \"resume\") return runBash(`abtars-task resume ${args[\"id\"] ?? \"\"}`, CLI_TIMEOUT_MS);\n if (action === \"run\") {\n if (!_enqueueCron) return Promise.resolve(JSON.stringify({ error: \"enqueueCron not available\" }));\n const err = _enqueueCron(args[\"id\"] ?? \"\", true);\n return Promise.resolve(JSON.stringify(err ? { error: err } : { ok: true, message: `Task ${args[\"id\"]} enqueued for immediate execution` }));\n }\n let cmd = `abtars-task add --message ${JSON.stringify(args[\"message\"] ?? \"\")}`;\n if (args[\"schedule\"]) cmd += ` --schedule ${JSON.stringify(args[\"schedule\"])}`;\n if (args[\"type\"]) cmd += ` --type ${args[\"type\"]}`;\n if (args[\"chat_id\"]) cmd += ` --chat-id ${args[\"chat_id\"]}`;\n return runBash(cmd, CLI_TIMEOUT_MS);\n },\n};\n\nconst peerSessionTool: ToolDefinition = {\n name: \"peer_session\",\n description: \"Open or continue a peer-to-peer session with another agent. Messages persist across turns. Use only when the user explicitly asks to contact another agent.\",\n parameters: {\n type: \"object\",\n properties: {\n peer_name: { type: \"string\", description: \"Name of the peer (as in peers.json)\" },\n message: { type: \"string\", description: \"Your message to the peer\" },\n session_id: { type: \"string\", description: \"Session ID from previous call (omit for new conversation)\" },\n },\n required: [\"peer_name\", \"message\"],\n },\n async execute(args) {\n // #1301 \u2014 no relay: a peer-originated request must never make us call a third peer.\n const { isActiveCardPeerSourced } = await import(\"./orc-tools.js\");\n if (await isActiveCardPeerSourced()) {\n return JSON.stringify({ error: \"Relaying to other peers is not permitted for peer-originated requests. Peers communicate directly.\", reason: \"peer_relay_blocked\" });\n }\n const { callPeer } = await import(\"../peer-client.js\");\n const { loadPeerConfig } = await import(\"../peer-config.js\");\n const { getOrCreateSession, addTurn, isEnded, destroySession } = await import(\"../peer-sessions.js\");\n\n const peerName = args.peer_name?.trim();\n const message = args.message?.trim();\n if (!peerName || !message) return JSON.stringify({ error: \"peer_name and message required\" });\n\n const config = loadPeerConfig();\n if (peerName === config.self.name) return JSON.stringify({ error: \"Cannot chat with yourself\" });\n if (!config.peers[peerName]) return JSON.stringify({ error: `Unknown peer: ${peerName}` });\n\n const session = getOrCreateSession(args.session_id?.trim() || undefined, peerName);\n\n // Check turn cap before sending\n if (session.messages.length >= 20) {\n destroySession(session.id);\n return JSON.stringify({ session_id: session.id, response: \"[SESSION_END] Turn limit reached.\", ended: true, reason: \"max-turns\" });\n }\n\n addTurn(session, \"user\", message);\n\n // Build full conversation for peer (OpenAI messages format)\n const prompt = session.messages.map(m => `${m.role === \"user\" ? \"You\" : \"Peer\"}: ${m.content}`).join(\"\\n\") + \"\\n\\nRespond to the latest message.\";\n\n try {\n const response = await callPeer(peerName, prompt, config.maxHops);\n addTurn(session, \"assistant\", response);\n _peerActivityCb?.(`\uD83E\uDD16 Agents: ${config.self.name} \u2194 ${peerName} session. [turn ${session.messages.length}]`);\n\n const { ended, reason } = isEnded(session, response);\n if (ended) destroySession(session.id);\n\n return JSON.stringify({ session_id: session.id, response, ended, reason });\n } catch (err) {\n destroySession(session.id);\n return JSON.stringify({ error: `peer_session failed: ${err instanceof Error ? err.message : String(err)}`, session_id: session.id, ended: true });\n }\n },\n};\n\nconst peerWakeupTool: ToolDefinition = {\n name: \"peer_wakeup\",\n description: \"Send a wake-up signal to a peer that cannot reach us directly (firewall). The peer's bridge will call us back via A2A within seconds.\",\n parameters: {\n type: \"object\",\n properties: {\n peer_name: { type: \"string\", description: \"Name of the peer to wake up (as in peers.json)\" },\n },\n required: [\"peer_name\"],\n },\n async execute(args) {\n // #1301 \u2014 no relay: a peer-originated request must never wake/reach a third peer via us.\n const { isActiveCardPeerSourced } = await import(\"./orc-tools.js\");\n if (await isActiveCardPeerSourced()) {\n return JSON.stringify({ error: \"Relaying to other peers is not permitted for peer-originated requests. Peers communicate directly.\", reason: \"peer_relay_blocked\" });\n }\n const { sendWakeup } = await import(\"../dns-wakeup.js\");\n const { loadPeerConfig } = await import(\"../peer-config.js\");\n const peerName = args.peer_name?.trim();\n if (!peerName) return JSON.stringify({ error: \"peer_name required\" });\n const config = loadPeerConfig();\n const peer = config.peers[peerName];\n if (!peer) return JSON.stringify({ error: `Unknown peer: ${peerName}` });\n const udpPort = peer.udpPort ?? 5353;\n sendWakeup(config.self.name, peer.host, udpPort);\n return JSON.stringify({ ok: true, message: `Wake-up sent to ${peerName}. Expect callback within seconds.` });\n },\n};\n\nconst ircSendTool: ToolDefinition = {\n name: \"irc_send\",\n description: \"Send a message to an IRC channel (e.g. #bridges)\",\n parameters: {\n channel: { type: \"string\", description: \"IRC channel (e.g. #bridges)\" },\n message: { type: \"string\", description: \"Message text to send\" },\n },\n execute: async (args) => {\n if (!_ircSend) return JSON.stringify({ error: \"IRC adapter not connected\" });\n const channel = args[\"channel\"] ?? \"\";\n const message = args[\"message\"] ?? \"\";\n if (!channel || !message) return JSON.stringify({ error: \"channel and message are required\" });\n _ircSend(channel, message);\n return JSON.stringify({ ok: true, channel, sent: message.length + \" chars\" });\n },\n};\n\nconst secretGetTool: ToolDefinition = {\n name: \"secret_get\",\n description: \"Retrieve a secret from ~/.abtars/secret/. For env-var secrets (no extension), returns the value. For files (with extension like .json), returns the full decrypted content. NEVER echo the value to the user.\",\n parameters: {\n properties: {\n name: { type: \"string\", description: \"Exact filename in secret/ dir (e.g. 'OPENROUTER_API_KEY', 'x-cookies.json')\" },\n },\n required: [\"name\"],\n },\n execute: async (args) => {\n const name = args.name?.trim();\n if (!name) return JSON.stringify({ error: \"name is required\" });\n try {\n const { readSecret } = await import(\"../../components/secrets.js\");\n const value = readSecret(name);\n if (value === undefined) return JSON.stringify({ error: `secret '${name}' not found or could not be decrypted` });\n\n // For env-var type (no extension): also inject into process.env\n if (!name.includes(\".\")) {\n process.env[name] = value;\n return JSON.stringify({ ok: true, env_var: `$${name}`, hint: `Use $${name} in commands. NEVER print or echo the value.` });\n }\n return JSON.stringify({ ok: true, content: value });\n } catch (err) {\n return JSON.stringify({ error: `secret_get failed: ${err instanceof Error ? err.message : String(err)}` });\n }\n },\n};\n\nimport { skillCreateTool, skillUpdateTool, skillPatchTool, skillRemoveTool } from \"./skill-authoring.js\";\nimport { mcpTool } from \"./mcp-tool.js\";\nimport { getDelegationTools } from \"./delegation-tools.js\";\nimport { getPeerDelegationTools } from \"./peer-delegation-tools.js\";\nimport { getOrcTools } from \"./orc-tools.js\";\nimport { kanbanTool } from \"./kanban-tool.js\";\nimport { channelPostTool, channelReadTool } from \"./channel-tool.js\";\nimport { artifactPushTool, artifactPullTool, artifactAttachTool } from \"./artifact-tools.js\";\n\nconst ALL_TOOLS: ToolDefinition[] = [bashTool, memoryStoreTool, memoryRecallTool, memoryEditTool, webBrowseTool, todoTool, taskTool, sendDocumentTool, peerSessionTool, peerWakeupTool, ircSendTool, secretGetTool, skillCreateTool, skillUpdateTool, skillPatchTool, skillRemoveTool, mcpTool, kanbanTool, channelPostTool, channelReadTool, artifactAttachTool, ...getDelegationTools(), ...getPeerDelegationTools(), ...getOrcTools()];\n\n// Conditional: artifact store tools (#929)\nif (process.env[\"ARTIFACT_S3_ENDPOINT\"]) {\n ALL_TOOLS.push(artifactPushTool, artifactPullTool);\n}\n\nexport function getToolDefinitions(): ToolDefinition[] { return ALL_TOOLS; }\n\nexport function getToolSchemas(policy?: SandboxPolicy): Array<{ type: \"function\"; function: { name: string; description: string; parameters: Record<string, unknown> } }> {\n const tools = policy ? ALL_TOOLS.filter(t => checkTool(t.name, policy).allowed) : ALL_TOOLS;\n return tools.map(t => ({\n type: \"function\" as const,\n function: { name: t.name, description: t.description, parameters: t.parameters },\n }));\n}\n\nimport { bumpRead } from \"../skill-stats.js\";\n\n/** Check if a bash command result indicates a skill file was read. */\nfunction checkSkillRead(toolName: string, args: Record<string, string>): void {\n if (toolName !== \"execute_bash\") return;\n const cmd = args[\"command\"] ?? \"\";\n if (cmd.includes(\"/.abtars/skills/\") && cmd.includes(\"/SKILL.md\")) {\n const match = cmd.match(/\\/.abtars\\/skills\\/[^/]+\\/([^/]+)\\/SKILL\\.md/);\n if (match) bumpRead(match[1]!);\n }\n}\n\nexport async function executeToolCall(name: string, args: Record<string, string>, context?: { userId: string; signal?: AbortSignal; sandboxPolicy?: SandboxPolicy }): Promise<string> {\n // Sandbox enforcement\n if (context?.sandboxPolicy) {\n const toolCheck = checkTool(name, context.sandboxPolicy);\n if (!toolCheck.allowed) {\n const available = ALL_TOOLS.filter(t => checkTool(t.name, context.sandboxPolicy!).allowed).map(t => t.name);\n auditDeny(name, undefined, \"session\", toolCheck.reason!);\n return JSON.stringify({ error: `Tool '${name}' not available in this session`, available_tools: available, reason: \"peer_sandbox\" });\n }\n const filePath = args[\"path\"] ?? args[\"file_path\"];\n if (filePath) {\n const mode = name.includes(\"read\") || name === \"memory_recall\" ? \"read\" as const : \"write\" as const;\n const pathCheck = checkPath(filePath, mode, context.sandboxPolicy);\n if (!pathCheck.allowed) {\n auditDeny(name, filePath, \"session\", pathCheck.reason!);\n return JSON.stringify({ error: pathCheck.reason, reason: \"peer_sandbox\" });\n }\n }\n }\n\n const tool = ALL_TOOLS.find(t => t.name === name);\n if (!tool) return JSON.stringify({ error: `Unknown tool: ${name}` });\n const ts = Date.now();\n\n // #621: redact abmind_store args based on classification\n const storeClass = (name === \"abmind_store\" || name === \"memory_store\") ? parseInt(args.classification ?? args.class ?? \"1\", 10) : 0;\n const auditArgs = storeClass >= 2\n ? `{\"class\":${storeClass},\"[REDACTED]\":true}`\n : redactSecrets(JSON.stringify(args));\n audit({ ts, tool: name, args: auditArgs, userId: context?.userId });\n\n try {\n const result = await tool.execute(args, context);\n audit({ ts, tool: name, status: \"ok\", chars: result.length });\n checkSkillRead(name, args);\n return result;\n } catch (err) {\n audit({ ts, tool: name, status: \"error\", error: err instanceof Error ? err.message : String(err) });\n throw err;\n }\n}\n", "/**\n * skill-authoring.ts \u2014 skill lifecycle tools (#381, #613, #614).\n * Agent persists procedural knowledge as skills under ~/.abtars/skills/self/.\n */\n\nimport { existsSync, mkdirSync, writeFileSync, readFileSync, renameSync, appendFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { abmind } from \"../../utils/abmind-lazy.js\";\nimport { abtarsHome } from \"../../paths.js\";\nimport { logInfo } from \"../logger.js\";\nimport { logAndSwallow } from \"../log-and-swallow.js\";\nimport { setProvenance } from \"../skill-stats.js\";\nimport type { ToolDefinition } from \"./tool-registry.js\";\n\nconst TAG = \"skill-authoring\";\nconst NAME_RE = /^[a-z0-9][a-z0-9-]{1,62}[a-z0-9]$/;\nconst MIN_BYTES = 100;\nconst MAX_BYTES = 50_000;\nconst MAX_TAGS = 5;\n\nfunction skillsDir(): string { return join(abtarsHome(), \"skills\"); }\nfunction selfDir(): string { return join(skillsDir(), \"self\"); }\nfunction trashDir(): string { return join(skillsDir(), \".trash\"); }\nfunction auditLogPath(): string { return join(abtarsHome(), \"logs\", \"skill-authoring.log\"); }\n\nfunction audit(entry: string): void {\n const line = `[${new Date().toISOString()}] ${entry}\\n`;\n try {\n const dir = join(abtarsHome(), \"logs\");\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true });\n appendFileSync(auditLogPath(), line);\n } catch (err) { logAndSwallow(TAG, \"audit write\", err); }\n}\n\nfunction validate(name: string, description: string, content: string): string | null {\n if (!NAME_RE.test(name)) return `Invalid name \"${name}\". Must be 3-64 chars, lowercase alphanumeric + hyphens, no leading/trailing hyphens.`;\n const desc = description.trim();\n if (desc.length < 1 || desc.length > 120) return `Description must be 1-120 chars (got ${desc.length}).`;\n const bytes = Buffer.byteLength(content, \"utf-8\");\n if (bytes < MIN_BYTES) return `Content too short (${bytes} bytes, minimum ${MIN_BYTES}). Write a useful skill, not a one-liner.`;\n if (bytes > MAX_BYTES) return `Content too large (${bytes} bytes, maximum ${MAX_BYTES}). Split into a skill + references/ files.`;\n const path = join(selfDir(), name, \"SKILL.md\");\n if (existsSync(path)) return `Skill \"${name}\" already exists. Use skill_update to modify it.`;\n const scan = abmind()?.scanForInjection(content);\n if (scan && !scan.safe) return `Content blocked by injection scanner: ${scan.flags[0]?.category ?? \"unknown\"} (score=${scan.score}). Rephrase the content.`;\n return null;\n}\n\n/** Parse YAML-like frontmatter from SKILL.md content. */\nfunction parseFrontmatter(raw: string): { meta: Record<string, unknown>; body: string } {\n const match = raw.match(/^---\\n([\\s\\S]*?)\\n---\\n\\n?([\\s\\S]*)$/);\n if (!match) return { meta: {}, body: raw };\n const meta: Record<string, unknown> = {};\n for (const line of match[1]!.split(\"\\n\")) {\n const idx = line.indexOf(\":\");\n if (idx < 0) continue;\n const key = line.slice(0, idx).trim();\n let val: unknown = line.slice(idx + 1).trim();\n // Parse array: [a, b, c]\n if (typeof val === \"string\" && val.startsWith(\"[\") && val.endsWith(\"]\")) {\n val = val.slice(1, -1).split(\",\").map(s => s.trim()).filter(Boolean);\n }\n meta[key] = val;\n }\n return { meta, body: match[2]! };\n}\n\n/** Serialize frontmatter fields back to YAML-like string. */\nfunction serializeFrontmatter(meta: Record<string, unknown>): string {\n const lines: string[] = [\"---\"];\n for (const [k, v] of Object.entries(meta)) {\n if (v === undefined || v === null) continue;\n if (Array.isArray(v) && v.length > 0) {\n lines.push(`${k}: [${v.join(\", \")}]`);\n } else if (!Array.isArray(v)) {\n lines.push(`${k}: ${v}`);\n }\n }\n lines.push(\"---\\n\\n\");\n return lines.join(\"\\n\");\n}\n\n/** Guard: skill must exist in self/ dir. Returns error string or null. */\nfunction guardSelfSkill(name: string): string | null {\n if (!NAME_RE.test(name)) return `Invalid name \"${name}\".`;\n const path = join(selfDir(), name, \"SKILL.md\");\n if (!existsSync(path)) return `Skill \"${name}\" not found in self/.`;\n return null;\n}\n\nexport const skillCreateTool: ToolDefinition = {\n name: \"skill_create\",\n description: \"Persist a new procedural skill to disk. Use when you've solved a novel task, discovered a workflow, or received a correction worth remembering as a repeatable recipe. Skills become available in future sessions via the skills_catalog.\",\n parameters: {\n type: \"object\",\n properties: {\n name: { type: \"string\", description: \"Skill identifier, kebab-case, e.g. 'fix-stale-node-modules'. 3-64 chars, [a-z0-9-]+.\" },\n description: { type: \"string\", description: \"One-line description, max 120 chars. Shown in skills_catalog.\" },\n content: { type: \"string\", description: \"Skill body in Markdown. Starts with # <Title>. No frontmatter \u2014 the tool writes it.\" },\n tags: { type: \"array\", items: { type: \"string\" }, description: \"Optional tags for categorization (max 5). E.g. ['tools', 'browser', 'debugging'].\" },\n related: { type: \"array\", items: { type: \"string\" }, description: \"Optional related skill names.\" },\n },\n required: [\"name\", \"description\", \"content\"],\n },\n async execute(args) {\n const { name, description, content, tags, related } = args as unknown as { name: string; description: string; content: string; tags?: string[]; related?: string[] };\n const error = validate(name, description, content);\n if (error) {\n audit(`skill_create name=${name} bytes=${content.length} ok=false error=\"${error}\"`);\n return JSON.stringify({ error });\n }\n\n const tagList = (tags ?? []).slice(0, MAX_TAGS).map(t => t.toLowerCase().trim()).filter(Boolean);\n const relList = (related ?? []).filter(Boolean);\n const tagsLine = tagList.length > 0 ? `tags: [${tagList.join(\", \")}]\\n` : \"\";\n const relatedLine = relList.length > 0 ? `related: [${relList.join(\", \")}]\\n` : \"\";\n const frontmatter = `---\\nname: ${name}\\ndescription: ${description.trim()}\\n${tagsLine}${relatedLine}---\\n\\n`;\n const fullContent = frontmatter + content;\n const dir = join(selfDir(), name);\n const filePath = join(dir, \"SKILL.md\");\n const tmpPath = filePath + \".tmp\";\n\n try {\n mkdirSync(dir, { recursive: true });\n writeFileSync(tmpPath, fullContent, \"utf-8\");\n renameSync(tmpPath, filePath);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n audit(`skill_create name=${name} bytes=${content.length} ok=false error=\"write failed: ${msg}\"`);\n return JSON.stringify({ error: `Write failed: ${msg}` });\n }\n\n setProvenance(name, \"agent\");\n audit(`skill_create name=${name} tags=[${tagList.join(\",\")}] bytes=${content.length} ok=true`);\n logInfo(TAG, `Created skill: self/${name} (${content.length} bytes)`);\n return JSON.stringify({ ok: true, path: filePath, message: `Skill \"${name}\" created in self/. Available in skills_catalog after /skill reload.` });\n },\n};\n\nexport const skillUpdateTool: ToolDefinition = {\n name: \"skill_update\",\n description: \"Full rewrite of an existing skill's SKILL.md in self/. Preserves frontmatter fields (tags, related, description) when omitted by caller.\",\n parameters: {\n type: \"object\",\n properties: {\n name: { type: \"string\", description: \"Skill name (must exist in self/).\" },\n description: { type: \"string\", description: \"New description (optional \u2014 keeps existing if omitted).\" },\n content: { type: \"string\", description: \"New skill body in Markdown (no frontmatter).\" },\n tags: { type: \"array\", items: { type: \"string\" }, description: \"New tags (optional \u2014 keeps existing if omitted).\" },\n related: { type: \"array\", items: { type: \"string\" }, description: \"New related skills (optional \u2014 keeps existing if omitted).\" },\n },\n required: [\"name\", \"content\"],\n },\n async execute(args) {\n const { name, content, description, tags, related } = args as unknown as { name: string; content: string; description?: string; tags?: string[]; related?: string[] };\n const guard = guardSelfSkill(name);\n if (guard) { audit(`skill_update name=${name} ok=false error=\"${guard}\"`); return JSON.stringify({ error: guard }); }\n\n const bytes = Buffer.byteLength(content, \"utf-8\");\n if (bytes < MIN_BYTES) return JSON.stringify({ error: `Content too short (${bytes} bytes, minimum ${MIN_BYTES}).` });\n if (bytes > MAX_BYTES) return JSON.stringify({ error: `Content too large (${bytes} bytes, maximum ${MAX_BYTES}).` });\n\n const scan = abmind()?.scanForInjection(content);\n if (scan && !scan.safe) return JSON.stringify({ error: `Content blocked by injection scanner: ${scan.flags[0]?.category ?? \"unknown\"}.` });\n\n const filePath = join(selfDir(), name, \"SKILL.md\");\n const existing = readFileSync(filePath, \"utf-8\");\n const { meta } = parseFrontmatter(existing);\n\n // Merge: caller fields override, omitted fields preserved\n const merged: Record<string, unknown> = { ...meta, name };\n if (description !== undefined) merged[\"description\"] = description.trim();\n if (tags !== undefined) merged[\"tags\"] = tags.slice(0, MAX_TAGS).map(t => t.toLowerCase().trim()).filter(Boolean);\n if (related !== undefined) merged[\"related\"] = related.filter(Boolean);\n\n const fullContent = serializeFrontmatter(merged) + content;\n const tmpPath = filePath + \".tmp\";\n try {\n writeFileSync(tmpPath, fullContent, \"utf-8\");\n renameSync(tmpPath, filePath);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n audit(`skill_update name=${name} ok=false error=\"write failed: ${msg}\"`);\n return JSON.stringify({ error: `Write failed: ${msg}` });\n }\n\n audit(`skill_update name=${name} bytes=${bytes} ok=true`);\n logInfo(TAG, `Updated skill: self/${name} (${bytes} bytes)`);\n return JSON.stringify({ ok: true, path: filePath, message: `Skill \"${name}\" updated.` });\n },\n};\n\nexport const skillPatchTool: ToolDefinition = {\n name: \"skill_patch\",\n description: \"Targeted find-and-replace within a skill's SKILL.md in self/. old_string must match exactly once.\",\n parameters: {\n type: \"object\",\n properties: {\n name: { type: \"string\", description: \"Skill name (must exist in self/).\" },\n old_string: { type: \"string\", description: \"Exact string to find (must match once).\" },\n new_string: { type: \"string\", description: \"Replacement string.\" },\n },\n required: [\"name\", \"old_string\", \"new_string\"],\n },\n async execute(args) {\n const { name, old_string, new_string } = args as unknown as { name: string; old_string: string; new_string: string };\n const guard = guardSelfSkill(name);\n if (guard) { audit(`skill_patch name=${name} ok=false error=\"${guard}\"`); return JSON.stringify({ error: guard }); }\n\n const filePath = join(selfDir(), name, \"SKILL.md\");\n const existing = readFileSync(filePath, \"utf-8\");\n\n const count = existing.split(old_string).length - 1;\n if (count === 0) return JSON.stringify({ error: `old_string not found in skill \"${name}\".` });\n if (count > 1) return JSON.stringify({ error: `old_string matches ${count} times \u2014 must match exactly once.` });\n\n const patched = existing.replace(old_string, new_string);\n const scan = abmind()?.scanForInjection(patched);\n if (scan && !scan.safe) return JSON.stringify({ error: `Patched content blocked by injection scanner: ${scan.flags[0]?.category ?? \"unknown\"}.` });\n\n const tmpPath = filePath + \".tmp\";\n try {\n writeFileSync(tmpPath, patched, \"utf-8\");\n renameSync(tmpPath, filePath);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n audit(`skill_patch name=${name} ok=false error=\"write failed: ${msg}\"`);\n return JSON.stringify({ error: `Write failed: ${msg}` });\n }\n\n audit(`skill_patch name=${name} ok=true`);\n logInfo(TAG, `Patched skill: self/${name}`);\n return JSON.stringify({ ok: true, path: filePath, message: `Skill \"${name}\" patched.` });\n },\n};\n\nexport const skillRemoveTool: ToolDefinition = {\n name: \"skill_remove\",\n description: \"Soft-delete a skill from self/ by moving it to .trash/ (recoverable for 7 days).\",\n parameters: {\n type: \"object\",\n properties: {\n name: { type: \"string\", description: \"Skill name (must exist in self/).\" },\n },\n required: [\"name\"],\n },\n async execute(args) {\n const { name } = args as unknown as { name: string };\n const guard = guardSelfSkill(name);\n if (guard) { audit(`skill_remove name=${name} ok=false error=\"${guard}\"`); return JSON.stringify({ error: guard }); }\n\n const srcDir = join(selfDir(), name);\n const ts = Date.now();\n const destDir = join(trashDir(), `${name}-${ts}`);\n try {\n mkdirSync(trashDir(), { recursive: true });\n renameSync(srcDir, destDir);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n audit(`skill_remove name=${name} ok=false error=\"move failed: ${msg}\"`);\n return JSON.stringify({ error: `Move failed: ${msg}` });\n }\n\n audit(`skill_remove name=${name} dest=${destDir} ok=true`);\n logInfo(TAG, `Removed skill: self/${name} \u2192 .trash/`);\n return JSON.stringify({ ok: true, message: `Skill \"${name}\" moved to .trash/. Will be pruned after 7 days.` });\n },\n};\n", "/**\n * mcp-tool.ts \u2014 Generic MCP tool (#471 v2).\n * Single tool that routes to any mcporter server/tool. Daemon starts on-demand.\n */\n\nimport { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport { logInfo, logWarn } from \"../logger.js\";\nimport { logAndSwallow } from \"../log-and-swallow.js\";\nimport type { ToolDefinition } from \"./tool-registry.js\";\n\nconst execFileAsync = promisify(execFile);\nconst TAG = \"mcp\";\nlet daemonStarted = false;\n\nasync function ensureDaemon(): Promise<void> {\n if (daemonStarted) return;\n try {\n await execFileAsync(\"mcporter\", [\"daemon\", \"start\"], { timeout: 10_000 });\n daemonStarted = true;\n logInfo(TAG, \"mcporter daemon started (on-demand)\");\n } catch {\n logWarn(TAG, \"mcporter daemon start failed \u2014 calls may still work if already running\");\n daemonStarted = true; // don't retry every call \u2014 assume already running\n }\n}\n\nexport const mcpTool: ToolDefinition = {\n name: \"mcp\",\n description: \"Call an MCP server tool via mcporter. Available servers shown by /mcp command. Use when you need JIRA, presentations, or other MCP-connected services.\",\n parameters: {\n type: \"object\",\n properties: {\n server: { type: \"string\", description: \"Server name (e.g. 'pptx', 'atlassian')\" },\n tool: { type: \"string\", description: \"Tool name (e.g. 'jira_search', 'create_presentation')\" },\n args: { type: \"string\", description: \"Tool arguments as JSON string (e.g. '{\\\"query\\\": \\\"assignee = me\\\"}')\" },\n },\n required: [\"server\", \"tool\"],\n },\n async execute(params) {\n await ensureDaemon();\n const { server, tool, args } = params as { server: string; tool: string; args?: string };\n const cliArgs = [\"call\", `${server}.${tool}`];\n if (args) {\n try {\n const parsed = JSON.parse(args) as Record<string, string>;\n for (const [k, v] of Object.entries(parsed)) cliArgs.push(`${k}=${v}`);\n } catch (err) {\n logAndSwallow(TAG, \"JSON.parse mcp args\", err);\n cliArgs.push(args);\n }\n }\n try {\n const { stdout } = await execFileAsync(\"mcporter\", cliArgs, { timeout: 30_000, encoding: \"utf-8\" });\n return stdout;\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n return JSON.stringify({ error: `mcp call failed: ${msg}` });\n }\n },\n};\n", "/**\n * peer-delegation-tools.ts \u2014 peer_delegate, peer_check, peer_terminate (#675).\n *\n * Remote delegation tools for the Orc. Uses PeerTransport to call\n * remote peers' /v1/tasks endpoints. Results tracked in local kanban\n * with type=\"remote\" and meta JSON for peer + remote_task_id.\n */\n\nimport type { ToolDefinition } from \"./tool-registry.js\";\nimport { getPeerTransport } from \"../peer-transport/index.js\";\nimport { kanbanEnqueue } from \"../tasks/kanban-board.js\";\nimport { logInfo, logWarn, logDebug, logTrace } from \"../logger.js\";\n\nconst TAG = \"peer-delegate\";\n\nexport const peerDelegateTool: ToolDefinition = {\n name: \"peer_delegate\",\n description: \"Delegate a task to a remote peer. If peer is omitted, auto-selects the best capable peer by load. Use 'requires' to specify needed capabilities (gpu, docker, ollama, browser, xcode).\",\n parameters: {\n type: \"object\",\n properties: {\n peer: { type: \"string\", description: \"Peer name (optional \u2014 auto-selects if omitted)\" },\n goal: { type: \"string\", description: \"Task goal/instructions for the remote peer\" },\n priority: { type: \"string\", enum: [\"CRITICAL\", \"HIGH\", \"MEDIUM\", \"LOW\"], description: \"Task priority (default: MEDIUM)\" },\n context: { type: \"string\", description: \"Optional context to include\" },\n requires: { type: \"array\", items: { type: \"string\" }, description: \"Required capabilities (e.g. ['gpu', 'docker'])\" },\n artifacts: { type: \"string\", description: \"JSON array of {name, content} objects (base64-encoded files to send)\" },\n },\n required: [\"goal\"],\n },\n async execute(args: Record<string, string>): Promise<string> {\n // #1301 \u2014 no relay: a peer-originated request must never delegate onward to a third peer via us.\n const { isActiveCardPeerSourced } = await import(\"./orc-tools.js\");\n if (await isActiveCardPeerSourced()) {\n return JSON.stringify({ error: \"Relaying to other peers is not permitted for peer-originated requests. Peers communicate directly.\", reason: \"peer_relay_blocked\" });\n }\n const { goal, priority, context } = args;\n let peer = args.peer;\n const requires: string[] = args.requires ? (typeof args.requires === \"string\" ? JSON.parse(args.requires) : args.requires) : [];\n const artifacts: Array<{ name: string; content: string }> | undefined = args.artifacts ? JSON.parse(args.artifacts) : undefined;\n\n if (!goal) return JSON.stringify({ error: \"goal is required\" });\n\n // Auto-select peer if not specified\n if (!peer && requires.length > 0) {\n const { findCapablePeer } = await import(\"../peer-transport/gossip.js\");\n const match = findCapablePeer(requires);\n if (!match) return JSON.stringify({ error: `No alive peer with capabilities: [${requires.join(\", \")}]` });\n peer = match.name;\n logDebug(TAG, `Auto-selected peer ${peer} for requires=[${requires.join(\",\")}] (load=${match.load})`);\n } else if (!peer) {\n // No peer, no requires \u2014 pick least loaded\n const { getPeerTable } = await import(\"../peer-transport/gossip.js\");\n const alive = getPeerTable().sort((a, b) => a.load - b.load);\n if (alive.length === 0) return JSON.stringify({ error: \"No alive peers available\" });\n peer = alive[0]!.name;\n logDebug(TAG, `Auto-selected least-loaded peer ${peer} (load=${alive[0]!.load})`);\n }\n\n // Validate capabilities if requires specified + explicit peer\n if (requires.length > 0 && args.peer) {\n const { getPeerTable } = await import(\"../peer-transport/gossip.js\");\n const entry = getPeerTable(true).find(p => p.name.toLowerCase() === peer!.toLowerCase());\n if (entry && !requires.every(r => entry.capabilities.includes(r))) {\n const missing = requires.filter(r => !entry.capabilities.includes(r));\n return JSON.stringify({ error: `Peer ${peer} lacks capabilities: [${missing.join(\", \")}]` });\n }\n }\n\n logDebug(TAG, `peer_delegate: peer=${peer} priority=${priority ?? \"MEDIUM\"} goal=${goal.length}ch requires=[${requires.join(\",\")}]`);\n logTrace(TAG, `peer_delegate goal: ${goal.slice(0, 500)}`);\n\n try {\n const transport = getPeerTransport();\n const { taskId: remoteTaskId, remoteSessionId } = await transport.delegateTask(peer, goal, { priority, context, artifacts });\n\n const localCardId = kanbanEnqueue(`[remote:${peer}] ${goal.slice(0, 80)}`, \"peer\", undefined, {\n type: \"remote\",\n priority: priority ?? \"MEDIUM\",\n notes: JSON.stringify({ peer, remote_task_id: remoteTaskId, remote_session_id: remoteSessionId, goal, requires }),\n });\n\n // #949: Create hollow session to track remote worker locally\n if (remoteSessionId) {\n const { spin } = await import(\"../spin.js\");\n const { getMasterUserId } = await import(\"../master-user.js\");\n spin.createHollowSession(getMasterUserId(), \"telegram\", \"W\", peer, remoteSessionId);\n }\n\n logInfo(TAG, `Delegated to ${peer}: remote#${remoteTaskId} \u2192 local#${localCardId}`);\n return JSON.stringify({ ok: true, local_card_id: localCardId, remote_task_id: remoteTaskId, remote_session_id: remoteSessionId, peer, status: \"queued\" });\n } catch (err) {\n logWarn(TAG, `peer_delegate failed: ${err instanceof Error ? err.message : String(err)}`);\n return JSON.stringify({ error: `peer_delegate failed: ${err instanceof Error ? err.message : String(err)}` });\n }\n },\n};\n\nexport const peerCheckTool: ToolDefinition = {\n name: \"peer_check\",\n description: \"Check the status of a task delegated to a remote peer. Returns status and result if complete.\",\n parameters: {\n type: \"object\",\n properties: {\n peer: { type: \"string\", description: \"Peer name\" },\n task_id: { type: \"number\", description: \"Remote task ID (from peer_delegate result)\" },\n },\n required: [\"peer\", \"task_id\"],\n },\n async execute(args: Record<string, string>): Promise<string> {\n const peer = args.peer;\n const taskId = parseInt(args.task_id ?? \"\", 10);\n if (!peer || isNaN(taskId)) return JSON.stringify({ error: \"peer and task_id are required\" });\n\n try {\n const transport = getPeerTransport();\n const result = await transport.checkTask(peer, taskId);\n return JSON.stringify({ ok: true, ...result });\n } catch (err) {\n logWarn(TAG, `peer_check failed: ${err instanceof Error ? err.message : String(err)}`);\n return JSON.stringify({ error: `peer_check failed: ${err instanceof Error ? err.message : String(err)}` });\n }\n },\n};\n\nexport const peerTerminateTool: ToolDefinition = {\n name: \"peer_terminate\",\n description: \"Cancel/terminate a task running on a remote peer.\",\n parameters: {\n type: \"object\",\n properties: {\n peer: { type: \"string\", description: \"Peer name\" },\n task_id: { type: \"number\", description: \"Remote task ID to terminate\" },\n },\n required: [\"peer\", \"task_id\"],\n },\n async execute(args: Record<string, string>): Promise<string> {\n const peer = args.peer;\n const taskId = parseInt(args.task_id ?? \"\", 10);\n if (!peer || isNaN(taskId)) return JSON.stringify({ error: \"peer and task_id are required\" });\n\n try {\n const transport = getPeerTransport();\n await transport.terminateTask(peer, taskId);\n logInfo(TAG, `Terminated remote task ${taskId} on ${peer}`);\n return JSON.stringify({ ok: true, terminated: true, peer, task_id: taskId });\n } catch (err) {\n logWarn(TAG, `peer_terminate failed: ${err instanceof Error ? err.message : String(err)}`);\n return JSON.stringify({ error: `peer_terminate failed: ${err instanceof Error ? err.message : String(err)}` });\n }\n },\n};\n\nexport function getPeerDelegationTools(): ToolDefinition[] {\n return [peerDelegateTool, peerCheckTool, peerTerminateTool];\n}\n", "/**\n * kanban-tool.ts \u2014 Agent-facing tool for managing the kanban board.\n */\n\nimport type { ToolDefinition } from \"./tool-registry.js\";\nimport { kanbanEnqueue, kanbanUpdate, kanbanList, type KanbanCard } from \"../tasks/kanban-board.js\";\n\nfunction formatCard(c: KanbanCard): string {\n const icon = c.status === \"delivered\" ? \"*\" : c.status === \"done\" ? \"*\" : c.status === \"running\" ? \"~\" : c.status === \"failed\" ? \"x\" : \"+\";\n const due = c.due_at ? ` due:${c.due_at}` : \"\";\n const lbl = c.labels ? ` [${c.labels}]` : \"\";\n const deps = c.blocked_by ? ` <- #${c.blocked_by}` : \"\";\n const tokens = c.tokens_used ? ` ${c.tokens_used} tok` : \"\";\n const source = c.type === \"remote\" ? (() => { try { return ` [${JSON.parse(c.notes ?? \"{}\").peer}]`; } catch { return \" [remote]\"; } })() : \"\";\n return `${icon} #${c.id} ${c.title} (${c.priority}/${c.status})${tokens}${source}${due}${lbl}${deps}`;\n}\n\nasync function execute(args: Record<string, string>): Promise<string> {\n const action = args.action;\n\n if (action === \"create\") {\n if (!args.title) return \"[err] title required\";\n const id = kanbanEnqueue(args.title, args.source || \"agent\", undefined, {\n priority: args.priority,\n type: args.type,\n labels: args.labels,\n due_at: args.due_at,\n parent_id: args.parent_id ? parseInt(args.parent_id, 10) : undefined,\n notes: args.notes,\n blocked_by: args.blocked_by || undefined,\n });\n return `+ Card #${id} created: \"${args.title}\"${args.blocked_by ? ` (blocked_by: ${args.blocked_by})` : \"\"}`;\n }\n\n if (action === \"update\") {\n if (!args.id) return \"[err] id required\";\n const fields: Record<string, unknown> = {};\n for (const k of [\"title\", \"status\", \"priority\", \"type\", \"labels\", \"due_at\", \"notes\", \"approval\"] as const) {\n if (args[k]) fields[k] = args[k];\n }\n if (args.parent_id) fields.parent_id = parseInt(args.parent_id, 10);\n kanbanUpdate(parseInt(args.id, 10), fields as any);\n return `* Card #${args.id} updated`;\n }\n\n if (action === \"list\") {\n const cards = kanbanList(args.status || undefined);\n if (cards.length === 0) return \"Board is empty\";\n return `Kanban Board (${cards.length}):\\n` + cards.map(formatCard).join(\"\\n\");\n }\n\n return `[err] Unknown action: ${action}. Use create | update | list`;\n}\n\nexport const kanbanTool: ToolDefinition = {\n name: \"kanban_manage\",\n description: \"Create, update, or list cards on the kanban board. Use for tracking work items, user requests, and task decomposition.\",\n parameters: {\n type: \"object\",\n properties: {\n action: { type: \"string\", description: \"create | update | list\", enum: [\"create\", \"update\", \"list\"] },\n title: { type: \"string\", description: \"Card title (required for create)\" },\n id: { type: \"string\", description: \"Card ID (required for update)\" },\n source: { type: \"string\", description: \"Who created: user | agent | cron | peer\" },\n status: { type: \"string\", description: \"New status (for update): queued | running | done | failed\" },\n priority: { type: \"string\", description: \"CRITICAL | HIGH | MEDIUM | LOW\" },\n type: { type: \"string\", description: \"Card type (task, bug, feature, research, report, etc.)\" },\n labels: { type: \"string\", description: \"Comma-separated tags\" },\n due_at: { type: \"string\", description: \"ISO deadline (e.g. 2026-06-08T12:00:00)\" },\n parent_id: { type: \"string\", description: \"Parent card ID for subtasks\" },\n notes: { type: \"string\", description: \"Additional context\" },\n blocked_by: { type: \"string\", description: \"Comma-separated card IDs this card depends on, or 'children' to wait for all child cards\" },\n approval: { type: \"string\", description: \"pending | approved | rejected\" },\n },\n required: [\"action\"],\n },\n execute,\n};\n", "/**\n * channel-tool.ts \u2014 Agent-facing tools for the communication channel (#891).\n */\n\nimport type { ToolDefinition } from \"./tool-registry.js\";\nimport { channelPost, channelRead, type ChannelMessage } from \"../tasks/kanban-channel.js\";\n\nfunction formatMsg(m: ChannelMessage): string {\n const dir = m.directive ? \" \u26A1\" : \"\";\n return `[${m.from_agent}\u2192${m.to_agent}]${dir} ${m.message} (${m.created_at})`;\n}\n\nasync function executePost(args: Record<string, string>, ctx?: { userId?: string }): Promise<string> {\n const cardId = parseInt(args.card_id ?? \"\", 10);\n if (!cardId) return \"\u274C card_id required\";\n if (!args.message) return \"\u274C message required\";\n const from = args.from || ctx?.userId || \"agent\";\n const to = args.to || \"ALL\";\n const directive = args.directive === \"true\" || args.directive === \"1\";\n const msgType = args.type || \"progress\";\n const id = channelPost(cardId, from, to, args.message, directive, msgType);\n return `\u2713 Posted #${id} to card:${cardId} [${from}\u2192${to}]`;\n}\n\nasync function executeRead(args: Record<string, string>): Promise<string> {\n const cardId = parseInt(args.card_id ?? \"\", 10);\n if (!cardId) return \"\u274C card_id required\";\n const msgs = channelRead(cardId, { since: args.since, from: args.from });\n if (msgs.length === 0) return \"No messages.\";\n return msgs.map(formatMsg).join(\"\\n\");\n}\n\nexport const channelPostTool: ToolDefinition = {\n name: \"channel_post\",\n description: \"Post a message to the project discussion channel. Keep messages short (<1000 chars). For long plans, write a file and reference the path.\",\n parameters: {\n type: \"object\",\n properties: {\n card_id: { type: \"string\", description: \"Kanban card ID this message belongs to\" },\n to: { type: \"string\", description: \"Recipient: ALL (default), Worker-01, ORC, MASTER, or peer:name\" },\n message: { type: \"string\", description: \"Short message (max 1000 chars)\" },\n directive: { type: \"string\", description: \"Set to 'true' for priority directive (Orc/master only)\" },\n type: { type: \"string\", enum: [\"progress\", \"question\", \"result\", \"error\"], description: \"Message type (default: progress)\" },\n },\n required: [\"card_id\", \"message\"],\n },\n execute: executePost,\n};\n\nexport const channelReadTool: ToolDefinition = {\n name: \"channel_read\",\n description: \"Read messages from the project discussion channel.\",\n parameters: {\n type: \"object\",\n properties: {\n card_id: { type: \"string\", description: \"Kanban card ID to read messages from\" },\n since: { type: \"string\", description: \"ISO timestamp \u2014 only messages after this time\" },\n from: { type: \"string\", description: \"Filter by sender name\" },\n },\n required: [\"card_id\"],\n },\n execute: executeRead,\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["execFile", "appendFileSync", "mkdirSync", "join", "TAG", "TAG", "getMasterUserId", "TAG", "join", "mkdirSync", "audit", "appendFileSync", "execFile"]
|
|
7
|
+
}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import { createRequire as __bundleCreateRequire } from 'node:module'; import { fileURLToPath as __bundleFileURLToPath } from 'node:url'; import { dirname as __bundleDirname } from 'node:path'; const require = __bundleCreateRequire(import.meta.url); const __chunk_filename = __bundleFileURLToPath(import.meta.url); const __chunk_dirname = __bundleDirname(__chunk_filename);
|
|
3
3
|
import {
|
|
4
4
|
deploy
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-HGSHCQ5F.js";
|
|
6
6
|
import {
|
|
7
7
|
printBanner
|
|
8
8
|
} from "./chunk-YDY6QVWJ.js";
|
|
@@ -27,11 +27,11 @@ Usage: abtars update --dev [dir] | --alpha | --stable
|
|
|
27
27
|
if (opts.localDir) {
|
|
28
28
|
return deploy({ source: opts.source, localDir: opts.localDir, skipFreshness: opts.skipFreshness });
|
|
29
29
|
}
|
|
30
|
-
const { bootstrap } = await import("./bootstrap-
|
|
30
|
+
const { bootstrap } = await import("./bootstrap-MIHJJSWU.js");
|
|
31
31
|
return bootstrap({ channel: opts.source });
|
|
32
32
|
}
|
|
33
33
|
|
|
34
34
|
export {
|
|
35
35
|
update
|
|
36
36
|
};
|
|
37
|
-
//# sourceMappingURL=chunk-
|
|
37
|
+
//# sourceMappingURL=chunk-IY6UKLPS.js.map
|
|
@@ -3,12 +3,12 @@
|
|
|
3
3
|
import {
|
|
4
4
|
init_log_and_swallow,
|
|
5
5
|
logAndSwallow
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-2IYJ4I66.js";
|
|
7
7
|
import {
|
|
8
8
|
init_logger,
|
|
9
9
|
logInfo,
|
|
10
10
|
logWarn
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-XRTXYN66.js";
|
|
12
12
|
import {
|
|
13
13
|
__esm,
|
|
14
14
|
__require
|
|
@@ -287,4 +287,4 @@ export {
|
|
|
287
287
|
SkillWatcher,
|
|
288
288
|
init_skill_watcher
|
|
289
289
|
};
|
|
290
|
-
//# sourceMappingURL=chunk-
|
|
290
|
+
//# sourceMappingURL=chunk-J4RUFAPK.js.map
|
|
@@ -4,7 +4,10 @@ import {
|
|
|
4
4
|
printBanner
|
|
5
5
|
} from "./chunk-YDY6QVWJ.js";
|
|
6
6
|
import {
|
|
7
|
-
acquireLock
|
|
7
|
+
acquireLock,
|
|
8
|
+
emptyManifest,
|
|
9
|
+
readManifest,
|
|
10
|
+
writeManifest
|
|
8
11
|
} from "./chunk-5NY2YULC.js";
|
|
9
12
|
import {
|
|
10
13
|
packagePaths
|
|
@@ -13,6 +16,17 @@ import {
|
|
|
13
16
|
// src/cli/commands/rollback.ts
|
|
14
17
|
import { existsSync, readFileSync, writeFileSync, unlinkSync, symlinkSync } from "node:fs";
|
|
15
18
|
import { join } from "node:path";
|
|
19
|
+
import { hostname } from "node:os";
|
|
20
|
+
function resolveReleaseIdentity(releaseDir, target) {
|
|
21
|
+
let version = target;
|
|
22
|
+
try {
|
|
23
|
+
const pkg = JSON.parse(readFileSync(join(releaseDir, "package.json"), "utf-8"));
|
|
24
|
+
if (typeof pkg.version === "string" && pkg.version) version = pkg.version;
|
|
25
|
+
} catch {
|
|
26
|
+
}
|
|
27
|
+
const commit = /^[0-9a-f]{7,40}$/.test(target) ? target : null;
|
|
28
|
+
return { version, commit };
|
|
29
|
+
}
|
|
16
30
|
async function rollback(opts) {
|
|
17
31
|
await printBanner("rollback");
|
|
18
32
|
const paths = packagePaths("abtars");
|
|
@@ -57,12 +71,28 @@ async function rollback(opts) {
|
|
|
57
71
|
symlinkSync(targetDir, paths.app);
|
|
58
72
|
} catch {
|
|
59
73
|
}
|
|
60
|
-
|
|
74
|
+
const priorManifest = await readManifest(paths.manifest);
|
|
75
|
+
const { version: targetVersion, commit: targetCommit } = resolveReleaseIdentity(targetDir, target);
|
|
76
|
+
await writeManifest(paths.manifest, {
|
|
77
|
+
...priorManifest ?? emptyManifest("abtars", hostname()),
|
|
78
|
+
version: targetVersion,
|
|
79
|
+
commit: targetCommit,
|
|
80
|
+
activatedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
81
|
+
previousVersion: priorManifest?.version ?? null,
|
|
82
|
+
previousCommit: priorManifest?.commit ?? null
|
|
83
|
+
// source intentionally preserved from prior manifest — rollback does not
|
|
84
|
+
// change release provenance, and Manifest.source has no 'rollback' variant.
|
|
85
|
+
});
|
|
86
|
+
process.stdout.write(`\u2713 rolled back to ${target} (slot ${slot}) \u2014 manifest updated to ${targetVersion}
|
|
61
87
|
`);
|
|
62
88
|
try {
|
|
63
|
-
const
|
|
89
|
+
const statePath = join(paths.home, "deploy.state");
|
|
90
|
+
const state = JSON.parse(readFileSync(statePath, "utf-8") || "{}");
|
|
91
|
+
state.status = "rollback";
|
|
92
|
+
state.version = targetVersion;
|
|
93
|
+
state.completedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
64
94
|
state.restartCount = 0;
|
|
65
|
-
writeFileSync(
|
|
95
|
+
writeFileSync(statePath, JSON.stringify(state) + "\n");
|
|
66
96
|
} catch {
|
|
67
97
|
}
|
|
68
98
|
writeFileSync(join(paths.home, ".start-reason"), `rollback:${target}`);
|
|
@@ -82,4 +112,4 @@ async function rollback(opts) {
|
|
|
82
112
|
export {
|
|
83
113
|
rollback
|
|
84
114
|
};
|
|
85
|
-
//# sourceMappingURL=chunk-
|
|
115
|
+
//# sourceMappingURL=chunk-J7DRPVMU.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/cli/commands/rollback.ts"],
|
|
4
|
+
"sourcesContent": ["import { printBanner } from './banner.js';\n/**\n * `abtars rollback` \u2014 repoint current symlink to a previous release from history.json.\n * --to N (1-3, default 1) selects which prior to restore.\n */\n\nimport { existsSync, readFileSync, writeFileSync, unlinkSync, symlinkSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { hostname } from 'node:os';\nimport { acquireLock, packagePaths, readManifest, writeManifest, emptyManifest } from '../deploy-lib-import.js';\n\n/**\n * Derive {version, commit} for a history entry. History entries are either a\n * git short SHA (dev builds, e.g. \"3aebb9d\") or a version string (npm builds,\n * e.g. \"0.3.4-alpha.8\"). The release dir's package.json holds the full version.\n */\nfunction resolveReleaseIdentity(releaseDir: string, target: string): { version: string; commit: string | null } {\n let version = target;\n try {\n const pkg = JSON.parse(readFileSync(join(releaseDir, 'package.json'), 'utf-8')) as { version?: string };\n if (typeof pkg.version === 'string' && pkg.version) version = pkg.version;\n } catch { /* fall back to target as version */ }\n // Git short SHA: 7-40 hex chars. npm versions contain dots/dashes.\n const commit = /^[0-9a-f]{7,40}$/.test(target) ? target : null;\n return { version, commit };\n}\n\nexport async function rollback(opts?: { to?: number }): Promise<number> {\n await printBanner(\"rollback\");\n const paths = packagePaths('abtars');\n const releasesDir = paths.releasesDir;\n const historyFile = join(releasesDir, 'history.json');\n const currentLink = join(releasesDir, 'current');\n const slot = opts?.to ?? 1;\n\n if (slot < 1 || slot > 3) {\n process.stderr.write(`Invalid --to value: ${slot}. Must be 1-3.\\n`);\n return 2;\n }\n\n let history: string[] = [];\n try { history = JSON.parse(readFileSync(historyFile, \"utf-8\")); } catch {}\n\n if (history.length <= slot) {\n process.stderr.write(`Nothing at slot ${slot} (history has ${history.length} entries).\\n`);\n return 2;\n }\n\n const target = history[slot]!;\n const targetDir = join(releasesDir, target);\n if (!existsSync(targetDir)) {\n process.stderr.write(`Release dir ${target} not found on disk.\\n`);\n return 2;\n }\n\n const release = await acquireLock(paths.lock, 'rollback');\n try {\n // Repoint current symlink\n try { unlinkSync(currentLink); } catch {}\n symlinkSync(targetDir, currentLink);\n\n // Also repoint legacy app/ symlink\n try { unlinkSync(paths.app); } catch {}\n try { symlinkSync(targetDir, paths.app); } catch {}\n\n // #1291: update manifest.json + deploy.state so the respawned bridge (which\n // reads its version from manifest via getDeployedVersion()) reports the\n // rolled-back release, not the stale pre-rollback one. Without this,\n // /software and bridge.lock keep showing the old version even though the\n // symlink + code were swapped correctly.\n const priorManifest = await readManifest(paths.manifest);\n const { version: targetVersion, commit: targetCommit } = resolveReleaseIdentity(targetDir, target);\n await writeManifest(paths.manifest, {\n ...(priorManifest ?? emptyManifest('abtars', hostname())),\n version: targetVersion,\n commit: targetCommit,\n activatedAt: new Date().toISOString(),\n previousVersion: priorManifest?.version ?? null,\n previousCommit: priorManifest?.commit ?? null,\n // source intentionally preserved from prior manifest \u2014 rollback does not\n // change release provenance, and Manifest.source has no 'rollback' variant.\n });\n\n process.stdout.write(`\u2713 rolled back to ${target} (slot ${slot}) \u2014 manifest updated to ${targetVersion}\\n`);\n\n // Reset circuit breaker counter + mark deploy.state so /software deploy-state line is accurate\n try {\n const statePath = join(paths.home, 'deploy.state');\n const state: Record<string, unknown> = JSON.parse(readFileSync(statePath, 'utf-8') || '{}');\n state.status = 'rollback';\n state.version = targetVersion;\n state.completedAt = new Date().toISOString();\n state.restartCount = 0;\n writeFileSync(statePath, JSON.stringify(state) + '\\n');\n } catch {}\n\n // Write start reason + restart\n writeFileSync(join(paths.home, '.start-reason'), `rollback:${target}`);\n\n // Kill bridge so WD respawns from rolled-back code\n try {\n const bridgePid = JSON.parse(readFileSync(join(paths.home, 'bridge.lock'), 'utf-8')).pid;\n if (bridgePid > 0) process.kill(bridgePid, 'SIGTERM');\n } catch {}\n\n process.stdout.write(`\u267B\uFE0F Bridge killed \u2014 WD will respawn from ${target}\\n`);\n return 0;\n } finally {\n await release();\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -40,6 +40,7 @@ var ModelHealthRegistry = class {
|
|
|
40
40
|
}
|
|
41
41
|
drain(b, now) {
|
|
42
42
|
if (this.authSticky && b.authFailed) return;
|
|
43
|
+
if (b.creditsFailed) return;
|
|
43
44
|
const elapsed = now - b.lastUpdate;
|
|
44
45
|
b.level = Math.max(0, b.level - elapsed * this.leakPerMs);
|
|
45
46
|
b.lastUpdate = now;
|
|
@@ -87,6 +88,10 @@ var ModelHealthRegistry = class {
|
|
|
87
88
|
b.level = Math.min(1, b.level + this.rateLimitFill);
|
|
88
89
|
if (retryAfterMs && retryAfterMs > 0) b.cooldownUntil = now + retryAfterMs;
|
|
89
90
|
break;
|
|
91
|
+
case "credits":
|
|
92
|
+
b.level = 1;
|
|
93
|
+
b.creditsFailed = true;
|
|
94
|
+
break;
|
|
90
95
|
case "weak":
|
|
91
96
|
b.level = Math.min(1, b.level + this.weakFill);
|
|
92
97
|
break;
|
|
@@ -108,6 +113,7 @@ var ModelHealthRegistry = class {
|
|
|
108
113
|
this.drain(b, now);
|
|
109
114
|
let status = "healthy";
|
|
110
115
|
if (b.authFailed) status = "auth_failed";
|
|
116
|
+
else if (b.creditsFailed) status = "exhausted";
|
|
111
117
|
else if (b.level > this.skipThreshold) status = "exhausted";
|
|
112
118
|
else if (b.level > 0.3) status = "degraded";
|
|
113
119
|
result.set(key, { level: Math.round(b.level * 100), consecutiveErrors: b.consecutiveErrors, cooldownUntil: b.cooldownUntil, status });
|
|
@@ -137,4 +143,4 @@ export {
|
|
|
137
143
|
ModelHealthRegistry,
|
|
138
144
|
classifyError
|
|
139
145
|
};
|
|
140
|
-
//# sourceMappingURL=chunk-
|
|
146
|
+
//# sourceMappingURL=chunk-JG4BKXBN.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/components/transport/model-health-registry.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * ModelHealthRegistry \u2014 shared per-model error tracking.\n * Leaky-bucket algorithm: fills on errors, drains over time. Full = skip.\n * One instance per bridge process, shared across all FallbackPolicy instances.\n *\n * All tuning constants configurable via transport.json `healthPolicy` key.\n * Missing fields fall back to hardcoded defaults.\n */\n\nexport type ErrorKind = \"rate_limit\" | \"credits\" | \"auth\" | \"transient\" | \"weak\" | \"empty\" | \"truncated\";\nexport type ModelStatus = \"healthy\" | \"degraded\" | \"exhausted\" | \"auth_failed\";\n\nexport interface HealthPolicyConfig {\n /** Bucket level (0-1) above which model is skipped. Default: 0.7 */\n skipThreshold?: number;\n /** Drain rate per minute (0-1). Default: 0.03 */\n leakPerMinute?: number;\n /** Auth error: fill amount (0-1). Default: 1.0 (instant full) */\n authFill?: number;\n /** Auth errors are sticky (never auto-drain). Default: true */\n authSticky?: boolean;\n /** Rate-limit fill per hit. Default: 0.5 */\n rateLimitFill?: number;\n /** Weak-model fill per hit. Default: 0.05 */\n weakFill?: number;\n /** Empty response (0 tokens) fill per hit. Default: 0.25 */\n emptyFill?: number;\n /** Truncated response (finish_reason=length) fill per hit. Default: 0 (disabled) */\n truncatedFill?: number;\n /** Transient progressive fill array. Default: [0.1, 0.2, 0.4, 0.8] */\n transientProgressive?: number[];\n /** Consecutive errors before cooldown kicks in. Default: 3 */\n transientCooldownAfter?: number;\n /** Max cooldown seconds for transient errors. Default: 300 */\n transientMaxCooldownSec?: number;\n}\n\ninterface Bucket {\n level: number;\n lastUpdate: number;\n consecutiveErrors: number;\n cooldownUntil?: number;\n authFailed?: boolean;\n /** #1296: credits (402) errors are sticky \u2014 bucket stays full until resetAll(). */\n creditsFailed?: boolean;\n demoted?: boolean;\n}\n\n// Defaults (unchanged from pre-config behavior)\nconst D_SKIP_THRESHOLD = 0.7;\nconst D_LEAK_PER_MIN = 0.03;\nconst D_AUTH_STICKY = true;\nconst D_RATE_LIMIT_FILL = 0.5;\nconst D_WEAK_FILL = 0.35;\nconst D_EMPTY_FILL = 0.25;\nconst D_TRUNCATED_FILL = 0;\nconst D_TRANSIENT_PROGRESSIVE = [0.1, 0.2, 0.4, 0.8];\nconst D_TRANSIENT_COOLDOWN_AFTER = 3;\nconst D_TRANSIENT_MAX_COOLDOWN_SEC = 300;\n\nexport class ModelHealthRegistry {\n private readonly buckets = new Map<string, Bucket>();\n private readonly skipThreshold: number;\n private readonly leakPerMs: number;\n private readonly authSticky: boolean;\n private readonly rateLimitFill: number;\n private readonly weakFill: number;\n private readonly emptyFill: number;\n private readonly truncatedFill: number;\n private readonly transientProgressive: number[];\n private readonly transientCooldownAfter: number;\n private readonly transientMaxCooldownMs: number;\n\n /** Fired when a model crosses the demotion threshold. Wired at boot. */\n onDemote?: (model: string, endpoint: string, reason: \"auth\" | \"timeout\") => void;\n\n constructor(config?: HealthPolicyConfig) {\n this.skipThreshold = config?.skipThreshold ?? D_SKIP_THRESHOLD;\n this.leakPerMs = (config?.leakPerMinute ?? D_LEAK_PER_MIN) / 60000;\n this.authSticky = config?.authSticky ?? D_AUTH_STICKY;\n this.rateLimitFill = config?.rateLimitFill ?? D_RATE_LIMIT_FILL;\n this.weakFill = config?.weakFill ?? D_WEAK_FILL;\n this.emptyFill = config?.emptyFill ?? D_EMPTY_FILL;\n this.truncatedFill = config?.truncatedFill ?? D_TRUNCATED_FILL;\n this.transientProgressive = config?.transientProgressive ?? D_TRANSIENT_PROGRESSIVE;\n this.transientCooldownAfter = config?.transientCooldownAfter ?? D_TRANSIENT_COOLDOWN_AFTER;\n this.transientMaxCooldownMs = (config?.transientMaxCooldownSec ?? D_TRANSIENT_MAX_COOLDOWN_SEC) * 1000;\n }\n\n private drain(b: Bucket, now: number): void {\n if (this.authSticky && b.authFailed) return;\n // #1296: credits exhaustion is sticky \u2014 no drain until resetAll()\n if (b.creditsFailed) return;\n const elapsed = now - b.lastUpdate;\n b.level = Math.max(0, b.level - elapsed * this.leakPerMs);\n b.lastUpdate = now;\n }\n\n shouldSkip(model: string, endpoint: string): boolean {\n const b = this.buckets.get(`${endpoint}|${model}`);\n if (!b) return false;\n const now = Date.now();\n if (b.cooldownUntil && now < b.cooldownUntil) return true;\n if (b.cooldownUntil && now >= b.cooldownUntil) b.cooldownUntil = undefined;\n this.drain(b, now);\n return b.level > this.skipThreshold;\n }\n\n recordSuccess(model: string, endpoint: string): void {\n const b = this.buckets.get(`${endpoint}|${model}`);\n if (!b) return;\n b.consecutiveErrors = 0;\n b.cooldownUntil = undefined;\n b.authFailed = false;\n }\n\n recordError(model: string, endpoint: string, kind: ErrorKind, retryAfterMs?: number): void {\n const key = `${endpoint}|${model}`;\n const now = Date.now();\n const b = this.buckets.get(key) ?? { level: 0, lastUpdate: now, consecutiveErrors: 0 };\n this.drain(b, now);\n\n switch (kind) {\n case \"auth\":\n b.level = 1.0;\n b.authFailed = true;\n if (this.onDemote && !b.demoted) {\n b.demoted = true;\n this.onDemote(model, endpoint, \"auth\");\n }\n break;\n case \"transient\": {\n const idx = Math.min(b.consecutiveErrors, this.transientProgressive.length - 1);\n b.level = Math.min(1.0, b.level + this.transientProgressive[idx]!);\n if (b.consecutiveErrors >= this.transientCooldownAfter) {\n b.cooldownUntil = now + Math.min((b.consecutiveErrors + 1) * 60_000, this.transientMaxCooldownMs);\n }\n break;\n }\n case \"rate_limit\":\n case \"credits\":\n b.level = Math.min(1.0, b.level + this.rateLimitFill);\n if (retryAfterMs && retryAfterMs > 0) b.cooldownUntil = now + retryAfterMs;\n break;\n case \"credits\":\n // #1296: credits exhaustion is sticky \u2014 stays full until resetAll() (manual /model reset)\n b.level = 1.0;\n b.creditsFailed = true;\n break;\n case \"weak\":\n b.level = Math.min(1.0, b.level + this.weakFill);\n break;\n case \"empty\":\n b.level = Math.min(1.0, b.level + this.emptyFill);\n break;\n case \"truncated\":\n if (this.truncatedFill > 0) b.level = Math.min(1.0, b.level + this.truncatedFill);\n break;\n }\n\n b.consecutiveErrors++;\n b.lastUpdate = now;\n this.buckets.set(key, b);\n }\n\n getHealth(): Map<string, { level: number; consecutiveErrors: number; cooldownUntil?: number; status: ModelStatus }> {\n const now = Date.now();\n const result = new Map<string, { level: number; consecutiveErrors: number; cooldownUntil?: number; status: ModelStatus }>();\n for (const [key, b] of this.buckets) {\n this.drain(b, now);\n let status: ModelStatus = \"healthy\";\n if (b.authFailed) status = \"auth_failed\";\n else if (b.creditsFailed) status = \"exhausted\";\n else if (b.level > this.skipThreshold) status = \"exhausted\";\n else if (b.level > 0.3) status = \"degraded\";\n result.set(key, { level: Math.round(b.level * 100), consecutiveErrors: b.consecutiveErrors, cooldownUntil: b.cooldownUntil, status });\n }\n return result;\n }\n\n /** Get bucket level for a specific model (0-100%). */\n getBucketLevel(model: string, endpoint: string): number {\n const b = this.buckets.get(`${endpoint}|${model}`);\n if (!b) return 0;\n this.drain(b, Date.now());\n return Math.round(b.level * 100);\n }\n\n resetAll(): void {\n this.buckets.clear();\n }\n}\n\n/** Classify HTTP status to error kind. */\nexport function classifyError(status: number, message?: string): ErrorKind {\n if (status === 402 && message?.includes(\"credits\")) return \"credits\";\n if (status === 429 || status === 402) return \"rate_limit\";\n if (status === 404 && message && /image input|No endpoints found/i.test(message)) return \"transient\";\n if (status === 401 || status === 403 || status === 404) return \"auth\";\n return \"transient\";\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -5,16 +5,16 @@ import {
|
|
|
5
5
|
BrowserManager,
|
|
6
6
|
BrowserTool,
|
|
7
7
|
DomainAllowlist
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-OWUO5RS3.js";
|
|
9
9
|
import {
|
|
10
10
|
getEnv,
|
|
11
11
|
init_env_schema
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-6PA5JBUU.js";
|
|
13
13
|
import {
|
|
14
14
|
init_logger,
|
|
15
15
|
logError,
|
|
16
16
|
logInfo
|
|
17
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-XRTXYN66.js";
|
|
18
18
|
import {
|
|
19
19
|
abtarsHome,
|
|
20
20
|
init_paths
|
|
@@ -66,7 +66,7 @@ function register(api) {
|
|
|
66
66
|
buf = buf.slice(nl + 1);
|
|
67
67
|
try {
|
|
68
68
|
const { taskId, prompt, timeoutMs } = JSON.parse(line);
|
|
69
|
-
import("./spin-
|
|
69
|
+
import("./spin-VHNGNWTD.js").then(({ spin: s }) => {
|
|
70
70
|
const { cardId } = s.dispatch({ type: "B", goal: prompt, source: "agent", timeoutMs });
|
|
71
71
|
conn.write(JSON.stringify({ ok: true, taskId, cardId, status: "spawned" }) + "\n");
|
|
72
72
|
}).catch((err) => {
|
|
@@ -98,4 +98,4 @@ export {
|
|
|
98
98
|
register,
|
|
99
99
|
browser_exports
|
|
100
100
|
};
|
|
101
|
-
//# sourceMappingURL=chunk-
|
|
101
|
+
//# sourceMappingURL=chunk-JLWYPGWI.js.map
|
|
@@ -3,15 +3,15 @@
|
|
|
3
3
|
import {
|
|
4
4
|
init_bridge_lock_transport,
|
|
5
5
|
writeRestartReason
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-KOSFXW2S.js";
|
|
7
7
|
import {
|
|
8
8
|
getEnv,
|
|
9
9
|
init_env_schema
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-6PA5JBUU.js";
|
|
11
11
|
import {
|
|
12
12
|
init_log_and_swallow,
|
|
13
13
|
logAndSwallow
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-2IYJ4I66.js";
|
|
15
15
|
import {
|
|
16
16
|
init_logger,
|
|
17
17
|
logDebug,
|
|
@@ -19,7 +19,7 @@ import {
|
|
|
19
19
|
logInfo,
|
|
20
20
|
logTrace,
|
|
21
21
|
logWarn
|
|
22
|
-
} from "./chunk-
|
|
22
|
+
} from "./chunk-XRTXYN66.js";
|
|
23
23
|
import {
|
|
24
24
|
__export
|
|
25
25
|
} from "./chunk-7K2YZTLD.js";
|
|
@@ -17218,7 +17218,7 @@ var AcpTransport = class _AcpTransport {
|
|
|
17218
17218
|
this._rawClient = null;
|
|
17219
17219
|
}
|
|
17220
17220
|
if (_AcpTransport._rawMode) {
|
|
17221
|
-
const { AcpRawClient } = await import("./acp-raw-client-
|
|
17221
|
+
const { AcpRawClient } = await import("./acp-raw-client-UCNK3OTU.js");
|
|
17222
17222
|
let args2;
|
|
17223
17223
|
if (this.extraCliArgs) {
|
|
17224
17224
|
args2 = [...this.extraCliArgs];
|
|
@@ -17274,7 +17274,7 @@ var AcpTransport = class _AcpTransport {
|
|
|
17274
17274
|
env: cleanEnv
|
|
17275
17275
|
});
|
|
17276
17276
|
if (this.agent.pid) {
|
|
17277
|
-
import("./bridge-lock-transport-
|
|
17277
|
+
import("./bridge-lock-transport-7RSN7OLJ.js").then(({ trackAcpPid }) => trackAcpPid(this.agent.pid)).catch(() => {
|
|
17278
17278
|
});
|
|
17279
17279
|
}
|
|
17280
17280
|
if (!this.agent.stdin || !this.agent.stdout) {
|
|
@@ -17334,7 +17334,7 @@ var AcpTransport = class _AcpTransport {
|
|
|
17334
17334
|
const inTok = typeof params["inputTokens"] === "number" ? params["inputTokens"] : 0;
|
|
17335
17335
|
const outTok = typeof params["outputTokens"] === "number" ? params["outputTokens"] : 0;
|
|
17336
17336
|
if (inTok || outTok) {
|
|
17337
|
-
import("./budget-
|
|
17337
|
+
import("./budget-WUM3SPKW.js").then(({ incrementBudgetCounter }) => incrementBudgetCounter(this.agentName, inTok + outTok)).catch(() => {
|
|
17338
17338
|
});
|
|
17339
17339
|
}
|
|
17340
17340
|
}
|
|
@@ -17410,12 +17410,12 @@ var AcpTransport = class _AcpTransport {
|
|
|
17410
17410
|
return chunks.join("") || "(no response)";
|
|
17411
17411
|
} finally {
|
|
17412
17412
|
const durationMs = Date.now() - this.promptStartedAt;
|
|
17413
|
-
import("./metrics-collector-
|
|
17413
|
+
import("./metrics-collector-YMUGY3PI.js").then(({ recordLatency, recordCall }) => {
|
|
17414
17414
|
recordLatency(`llm:${this.modelId ?? "unknown"}`, durationMs);
|
|
17415
17415
|
recordCall(`llm:${this.modelId ?? "unknown"}`, true);
|
|
17416
17416
|
}).catch(() => {
|
|
17417
17417
|
});
|
|
17418
|
-
import("./hook-system-
|
|
17418
|
+
import("./hook-system-YB635OC4.js").then(({ hasHooks, fire }) => {
|
|
17419
17419
|
if (!hasHooks("AfterPrompt")) return;
|
|
17420
17420
|
fire("AfterPrompt", {
|
|
17421
17421
|
event: "AfterPrompt",
|
|
@@ -17430,7 +17430,7 @@ var AcpTransport = class _AcpTransport {
|
|
|
17430
17430
|
}).catch((err) => logAndSwallow(TAG, "fire AfterPrompt", err));
|
|
17431
17431
|
}).catch((err) => logAndSwallow(TAG, "import hook-system", err));
|
|
17432
17432
|
this.sm.promptCompleted();
|
|
17433
|
-
import("./budget-
|
|
17433
|
+
import("./budget-WUM3SPKW.js").then(({ incrementBudgetCounter }) => incrementBudgetCounter(this.agentName, 0)).catch(() => {
|
|
17434
17434
|
});
|
|
17435
17435
|
this.drainPending();
|
|
17436
17436
|
}
|
|
@@ -17541,7 +17541,7 @@ var AcpTransport = class _AcpTransport {
|
|
|
17541
17541
|
}
|
|
17542
17542
|
async resetSession(_sessionKey) {
|
|
17543
17543
|
try {
|
|
17544
|
-
const { clearTransportCache, loadTransport, resolveAgent } = await import("./transport-config-
|
|
17544
|
+
const { clearTransportCache, loadTransport, resolveAgent } = await import("./transport-config-6MB2K2XC.js");
|
|
17545
17545
|
clearTransportCache();
|
|
17546
17546
|
const tc = loadTransport();
|
|
17547
17547
|
if (tc) {
|
|
@@ -17783,4 +17783,4 @@ export {
|
|
|
17783
17783
|
ModelNotFoundError,
|
|
17784
17784
|
AcpTransport
|
|
17785
17785
|
};
|
|
17786
|
-
//# sourceMappingURL=chunk-
|
|
17786
|
+
//# sourceMappingURL=chunk-JXYWDAHD.js.map
|