abtars 0.3.4-alpha.7 → 0.3.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundle/{_registry.generated-WGR4WOPT.js → _registry.generated-AVR7DK2A.js} +17 -14
- package/bundle/{_registry.generated-WGR4WOPT.js.map → _registry.generated-AVR7DK2A.js.map} +1 -1
- package/bundle/{abmind-lazy-7Z44NODV.js → abmind-lazy-E3YCFKQ5.js} +15 -5
- package/bundle/abtars-browser.js +4 -4
- package/bundle/abtars-cli.js +23 -13
- package/bundle/abtars-cli.js.map +2 -2
- package/bundle/abtars-restart.js +3 -3
- package/bundle/abtars-task.js +3 -3
- package/bundle/abtars-task.js.map +2 -2
- package/bundle/abtars.js +610 -455
- package/bundle/abtars.js.map +4 -4
- package/bundle/{acp-raw-client-E6FM45NC.js → acp-raw-client-UCNK3OTU.js} +2 -2
- package/bundle/{action-gate-G2V47NHW.js → action-gate-V4FCBHFB.js} +2 -2
- package/bundle/{agent-api-adapter-YAHKQMMZ.js → agent-api-adapter-7HEPYSIN.js} +3 -3
- package/bundle/{agent-api-rate-limit-WCFXJMGY.js → agent-api-rate-limit-RZSAM3SW.js} +4 -4
- package/bundle/{agent-registry-GI6CLT3Z.js → agent-registry-46A2R5KP.js} +7 -7
- package/bundle/{bootstrap-X2QYIZIJ.js → bootstrap-MIHJJSWU.js} +2 -2
- package/bundle/{bridge-lock-transport-4ZH7QTJP.js → bridge-lock-transport-7RSN7OLJ.js} +4 -4
- package/bundle/{browser-DMARZJIN.js → browser-F6BCWJWW.js} +6 -6
- package/bundle/{budget-45QOBDWA.js → budget-WUM3SPKW.js} +3 -3
- package/bundle/{capability-JFWX3IQF.js → capability-QVRKGRFC.js} +5 -5
- package/bundle/{chunk-YSKCQH6E.js → chunk-2IYJ4I66.js} +2 -2
- package/bundle/{chunk-KTYGKPYM.js → chunk-2NLUT5S2.js} +6 -6
- package/bundle/chunk-3BG3AIDP.js +191 -0
- package/bundle/chunk-3BG3AIDP.js.map +7 -0
- package/bundle/{chunk-OKAQICWY.js → chunk-3GQX34S2.js} +3 -3
- package/bundle/{chunk-QROWBWLL.js → chunk-3XZ773BS.js} +2 -2
- package/bundle/{chunk-DYBW4XXL.js → chunk-467SRLLR.js} +2 -2
- package/bundle/{chunk-LGP6TYFI.js → chunk-4AILRHUI.js} +97 -8
- package/bundle/chunk-4AILRHUI.js.map +7 -0
- package/bundle/{chunk-GPZNXY2U.js → chunk-4S3H4OK7.js} +4 -4
- package/bundle/{chunk-NDCRWEEJ.js → chunk-4Y5MJQRE.js} +6 -6
- package/bundle/{chunk-FRKW6LWB.js → chunk-55UWKI5C.js} +3 -3
- package/bundle/{chunk-4UL3KINB.js → chunk-5PNJFDSW.js} +8 -8
- package/bundle/{chunk-LUNA6PM5.js → chunk-5RVOEFGT.js} +4 -2
- package/bundle/{chunk-LUNA6PM5.js.map → chunk-5RVOEFGT.js.map} +2 -2
- package/bundle/{chunk-OXTSWQCX.js → chunk-5Y3FJ2Y7.js} +2 -2
- package/bundle/{chunk-TMUYFERL.js → chunk-6B5ZFUPD.js} +2 -2
- package/bundle/{chunk-65VCEC32.js → chunk-6PA5JBUU.js} +2 -2
- package/bundle/chunk-BNXV7SZI.js +195 -0
- package/bundle/chunk-BNXV7SZI.js.map +7 -0
- package/bundle/{chunk-AFREM7FX.js → chunk-CK7YTA2F.js} +2 -2
- package/bundle/{chunk-NRUSRJXR.js → chunk-DZJ5QZFD.js} +2 -2
- package/bundle/{chunk-YRSMGJFP.js → chunk-E67KESEG.js} +2 -2
- package/bundle/{chunk-ZV4IWKDJ.js → chunk-E7XD5UGB.js} +3 -3
- package/bundle/{chunk-GXL7HJPT.js → chunk-EAX5ZZUL.js} +63 -39
- package/bundle/chunk-EAX5ZZUL.js.map +7 -0
- package/bundle/{chunk-PEDX56EL.js → chunk-EFGBM555.js} +2 -2
- package/bundle/{chunk-EQSG2CRM.js → chunk-FGYDIX54.js} +22 -15
- package/bundle/chunk-FGYDIX54.js.map +7 -0
- package/bundle/{chunk-XWRADSXO.js → chunk-GF6NVNA7.js} +15 -5
- package/bundle/chunk-GF6NVNA7.js.map +7 -0
- package/bundle/{chunk-SIFPBTI4.js → chunk-HGSHCQ5F.js} +113 -73
- package/bundle/chunk-HGSHCQ5F.js.map +7 -0
- package/bundle/{chunk-YRU2K3O6.js → chunk-IMIGG5EO.js} +39 -39
- package/bundle/chunk-IMIGG5EO.js.map +7 -0
- package/bundle/{chunk-W4EA4GCA.js → chunk-ITOFPJAV.js} +43 -31
- package/bundle/chunk-ITOFPJAV.js.map +7 -0
- package/bundle/{chunk-UPRZDU6T.js → chunk-IY6UKLPS.js} +3 -3
- package/bundle/{chunk-EUZDKV3C.js → chunk-J4RUFAPK.js} +3 -3
- package/bundle/{chunk-HZDLFLRP.js → chunk-J7DRPVMU.js} +35 -5
- package/bundle/chunk-J7DRPVMU.js.map +7 -0
- package/bundle/{chunk-EGL6UMAO.js → chunk-JG4BKXBN.js} +7 -1
- package/bundle/chunk-JG4BKXBN.js.map +7 -0
- package/bundle/{chunk-5B5B6EHL.js → chunk-JLWYPGWI.js} +5 -5
- package/bundle/{chunk-5QUTMUIK.js → chunk-JXYWDAHD.js} +12 -12
- package/bundle/{chunk-GRVWZO4C.js → chunk-KOSFXW2S.js} +24 -3
- package/bundle/{chunk-GRVWZO4C.js.map → chunk-KOSFXW2S.js.map} +1 -1
- package/bundle/{chunk-ONBF5DDU.js → chunk-L72RIPEC.js} +248 -182
- package/bundle/chunk-L72RIPEC.js.map +7 -0
- package/bundle/{chunk-TEFZ4JA4.js → chunk-NHPLD3C7.js} +2 -2
- package/bundle/{chunk-2KC5G3EA.js → chunk-OWUO5RS3.js} +5 -5
- package/bundle/{chunk-4MULJ5SS.js → chunk-OY4Q6AMY.js} +71 -49
- package/bundle/chunk-OY4Q6AMY.js.map +7 -0
- package/bundle/{chunk-WBTJ2E62.js → chunk-P3NODAHF.js} +2 -5
- package/bundle/{chunk-WBTJ2E62.js.map → chunk-P3NODAHF.js.map} +2 -2
- package/bundle/{chunk-BROFMHC2.js → chunk-PB5GF4FG.js} +334 -237
- package/bundle/chunk-PB5GF4FG.js.map +7 -0
- package/bundle/{chunk-WYHGNI56.js → chunk-PMD5BLFS.js} +6 -6
- package/bundle/{chunk-URQPDCK5.js → chunk-Q66LQMMZ.js} +3 -3
- package/bundle/{chunk-HKRSMUXJ.js → chunk-SC2Y5NR2.js} +71 -132
- package/bundle/chunk-SC2Y5NR2.js.map +7 -0
- package/bundle/chunk-SFL4EPCZ.js +555 -0
- package/bundle/chunk-SFL4EPCZ.js.map +7 -0
- package/bundle/{chunk-LDUOOKQY.js → chunk-SJPUNDZ3.js} +5 -5
- package/bundle/{chunk-LDUOOKQY.js.map → chunk-SJPUNDZ3.js.map} +1 -1
- package/bundle/{chunk-JQDJPUHM.js → chunk-TWB2ZGVH.js} +2 -2
- package/bundle/{chunk-IJT4KWXT.js → chunk-U4U47YE7.js} +2 -2
- package/bundle/{chunk-2FAZIA37.js → chunk-W546CU3A.js} +3 -3
- package/bundle/chunk-WC5O5KOE.js +211 -0
- package/bundle/chunk-WC5O5KOE.js.map +7 -0
- package/bundle/{chunk-JNIHEDKF.js → chunk-XPWYDNWL.js} +2 -2
- package/bundle/{chunk-GWILHZPT.js → chunk-XRTXYN66.js} +10 -7
- package/bundle/{chunk-GWILHZPT.js.map → chunk-XRTXYN66.js.map} +2 -2
- package/bundle/{chunk-EFJVUJBE.js → chunk-Y5FEFKGM.js} +6 -6
- package/bundle/chunk-YJZE4OK3.js +169 -0
- package/bundle/chunk-YJZE4OK3.js.map +7 -0
- package/bundle/{chunk-GVM5YU5I.js → chunk-Z4FZPB42.js} +2 -2
- package/bundle/{chunk-7BSQ5UQO.js → chunk-ZSIDQ66D.js} +3 -3
- package/bundle/{chunk-XX6BGTPO.js → chunk-ZZZCJJEO.js} +4 -4
- package/bundle/{commands-XYEGVUZF.js → commands-2ZW6CMLC.js} +17 -16
- package/bundle/{config-M3P5IOAI.js → config-YMY5YHKN.js} +6 -6
- package/bundle/{context-2RJHC2LE.js → context-CL2RSLII.js} +7 -5
- package/bundle/context-CL2RSLII.js.map +7 -0
- package/bundle/{daemon-TB23FFWY.js → daemon-D7SU63OY.js} +3 -3
- package/bundle/{delegation-tools-QKNYQGTQ.js → delegation-tools-WS7Z56KZ.js} +12 -12
- package/bundle/{deploy-EPDWNHJU.js → deploy-AMTVKIMU.js} +2 -2
- package/bundle/{deps-WVK553KF.js → deps-T63AVJKJ.js} +3 -3
- package/bundle/{direct-api-transport-E3LNDBJT.js → direct-api-transport-QNNY2WWP.js} +56 -33
- package/bundle/direct-api-transport-QNNY2WWP.js.map +7 -0
- package/bundle/{discord-adapter-IT3KP3VB.js → discord-adapter-ABAD56Y2.js} +21 -20
- package/bundle/{discord-adapter-IT3KP3VB.js.map → discord-adapter-ABAD56Y2.js.map} +1 -1
- package/bundle/{dns-wakeup-IDOJIXBX.js → dns-wakeup-V3LEFXPE.js} +9 -33
- package/bundle/dns-wakeup-V3LEFXPE.js.map +7 -0
- package/bundle/{doctor-probes-B54JFIW3.js → doctor-probes-O6YI6XSZ.js} +6 -2
- package/bundle/{env-schema-4JXQUOH4.js → env-schema-B5RB32DC.js} +3 -3
- package/bundle/{gossip-3C3BSNPN.js → gossip-SKRCPOBS.js} +9 -5
- package/bundle/{guardrails-DL7ZSWVN.js → guardrails-64GQ5Y5K.js} +4 -4
- package/bundle/{heartbeat-system-MVTRS4GP.js → heartbeat-system-X4MUTKJD.js} +6 -6
- package/bundle/{heartbeat-tier3-ABWL3P7M.js → heartbeat-tier3-2PTPWEQQ.js} +53 -76
- package/bundle/heartbeat-tier3-2PTPWEQQ.js.map +7 -0
- package/bundle/{hook-system-M3POLUIB.js → hook-system-YB635OC4.js} +3 -3
- package/bundle/{hotskills-FWX4QI7V.js → hotskills-Q75D2DK3.js} +5 -5
- package/bundle/{install-OS3CU7NF.js → install-RFKKFSGS.js} +17 -30
- package/bundle/install-RFKKFSGS.js.map +7 -0
- package/bundle/{install-manifest-5PPWMD2W.js → install-manifest-J7ICPCJN.js} +2 -2
- package/bundle/{irc-adapter-PTTZD32W.js → irc-adapter-TVEV4R6H.js} +3 -3
- package/bundle/{irc-config-CP7ZMUOX.js → irc-config-M676FOFI.js} +4 -4
- package/bundle/{kanban-board-M326B2XJ.js → kanban-board-DLEJUCNN.js} +9 -7
- package/bundle/{kanban-channel-IJ52OMNA.js → kanban-channel-XOLUHJZJ.js} +6 -6
- package/bundle/kanban-delivery-C4QPBNPX.js +45 -0
- package/bundle/kanban-delivery-C4QPBNPX.js.map +7 -0
- package/bundle/{lazy-require-KCRVT4SI.js → lazy-require-JKQSALXN.js} +3 -3
- package/bundle/{logger-OWCSNYCA.js → logger-3EGHBD4R.js} +2 -2
- package/bundle/{main-chat-ZNUZCTNS.js → main-chat-3H63REKK.js} +4 -4
- package/bundle/{master-user-HSKM4ZFN.js → master-user-MUBUP3KD.js} +5 -5
- package/bundle/{media-utils-3ZYOD7SK.js → media-utils-HUUIALAJ.js} +3 -3
- package/bundle/{message-pipeline-P5GAQU4Z.js → message-pipeline-GRDRWONR.js} +17 -16
- package/bundle/meta.json +3699 -3138
- package/bundle/{metrics-collector-L3VPEHII.js → metrics-collector-YMUGY3PI.js} +31 -2
- package/bundle/metrics-collector-YMUGY3PI.js.map +7 -0
- package/bundle/{model-health-registry-MLEIZSTV.js → model-health-registry-QADMFQFQ.js} +2 -2
- package/bundle/{nerve-IGSXBKZZ.js → nerve-QPAEBRKX.js} +3 -3
- package/bundle/{notification-BFSIEECG.js → notification-3JICGXWU.js} +6 -6
- package/bundle/{openrouter-credits-NTVZDRYM.js → openrouter-credits-7NEIPYJN.js} +3 -3
- package/bundle/{orc-tools-4CHEFWSN.js → orc-tools-UZVPONKY.js} +5 -3
- package/bundle/{peer-auth-QC4EF2PM.js → peer-auth-RI43DKJE.js} +24 -15
- package/bundle/{peer-client-RGEU5HOK.js → peer-client-UITTMWJ2.js} +34 -29
- package/bundle/peer-client-UITTMWJ2.js.map +7 -0
- package/bundle/{peer-config-TN55LFDC.js → peer-config-URM7DCW6.js} +9 -4
- package/bundle/{peer-transport-I6JPLFZ2.js → peer-transport-SI7I72DB.js} +12 -10
- package/bundle/{phase-transport-PGKU2KD4.js → phase-transport-ESWWACZI.js} +17 -17
- package/bundle/{reconcile-CTFCLQRN.js → reconcile-GFDQYNBD.js} +3 -3
- package/bundle/{reconciler-EBKH3JNU.js → reconciler-IEUJXJN2.js} +12 -12
- package/bundle/{restore-IFHPI7I7.js → restore-FARTGLQQ.js} +3 -3
- package/bundle/{rollback-ANRI3T5Z.js → rollback-GEWPZABG.js} +2 -2
- package/bundle/{sandbox-runtime-QROWHDCS.js → sandbox-runtime-DV6E25J6.js} +2 -2
- package/bundle/{self-healer-utils-IFAYOQO2.js → self-healer-utils-P4SKNNEM.js} +3 -3
- package/bundle/{sha-tracker-ZWBP6CIJ.js → sha-tracker-77SHLYNY.js} +3 -3
- package/bundle/{skill-session-BMSRQSHV.js → skill-session-5HSMXY54.js} +3 -3
- package/bundle/{skill-stats-JORH5DGM.js → skill-stats-MI3RSWWL.js} +4 -4
- package/bundle/{skill-watcher-E4MGLKLS.js → skill-watcher-5L7JE6TN.js} +4 -4
- package/bundle/{sleep-36XS6MHJ.js → sleep-I4JFASCY.js} +11 -8
- package/bundle/{soul-bundle-VWAVHCZ6.js → soul-bundle-522C3IRH.js} +9 -8
- package/bundle/{spin-TI3TSVVT.js → spin-VHNGNWTD.js} +11 -11
- package/bundle/{spin-notifications-SE2HVZI7.js → spin-notifications-7NC5XZEM.js} +5 -5
- package/bundle/{spin-types-BLPYAETA.js → spin-types-C5KOQOPD.js} +7 -3
- package/bundle/{sse-parser-anthropic-A6R4Z2TB.js → sse-parser-anthropic-MMTVWHLI.js} +3 -3
- package/bundle/{sse-parser-responses-HSZY3QGJ.js → sse-parser-responses-3AOFN64C.js} +3 -3
- package/bundle/{ssrf-guard-O6SHIK6Q.js → ssrf-guard-U2JA72TC.js} +3 -3
- package/bundle/{start-7QZIWO3S.js → start-H5IUFAWF.js} +4 -2
- package/bundle/{start-7QZIWO3S.js.map → start-H5IUFAWF.js.map} +2 -2
- package/bundle/{stt-LGVPXMVR.js → stt-PSOPPBV4.js} +4 -4
- package/bundle/{system-status-JZU5FO7B.js → system-status-4LYGOFNO.js} +38 -24
- package/bundle/system-status-4LYGOFNO.js.map +7 -0
- package/bundle/{task-store-W5BFIAIH.js → task-store-MNCW42BW.js} +4 -4
- package/bundle/{telegram-adapter-H6PMFPMB.js → telegram-adapter-O6KIZDY6.js} +69 -46
- package/bundle/telegram-adapter-O6KIZDY6.js.map +7 -0
- package/bundle/{tool-registry-IZX2IOBM.js → tool-registry-JJMWCQKZ.js} +26 -24
- package/bundle/{tool-sandbox-4UC6GAKA.js → tool-sandbox-CNL6V6IH.js} +4 -4
- package/bundle/{transport-config-KBF5W2DP.js → transport-config-6MB2K2XC.js} +7 -7
- package/bundle/tribe-GDTFYJTK.js +111 -0
- package/bundle/tribe-GDTFYJTK.js.map +7 -0
- package/bundle/{update-MESYO4LO.js → update-HGQAOC5L.js} +3 -3
- package/bundle/{usage-tracker-NXD364VX.js → usage-tracker-SR4BI6ZT.js} +2 -2
- package/bundle/{user-registry-35BW4XKM.js → user-registry-4PACZJIJ.js} +4 -4
- package/bundle/wire-platform-KKPWNNNQ.js +88 -0
- package/bundle/wire-platform-KKPWNNNQ.js.map +7 -0
- package/bundle/ws-peer-client-U3NNPOK7.js +370 -0
- package/bundle/ws-peer-client-U3NNPOK7.js.map +7 -0
- package/package.json +1 -1
- package/scripts/abtars-watchdog.service +2 -1
- package/scripts/abtars-watchdog.sh +1 -5
- package/scripts/emergency-deploy.sh +2 -2
- package/scripts/emergency-update.sh +88 -41
- package/bundle/chunk-3AAENI2K.js +0 -210
- package/bundle/chunk-3AAENI2K.js.map +0 -7
- package/bundle/chunk-4MULJ5SS.js.map +0 -7
- package/bundle/chunk-4S554KLW.js +0 -105
- package/bundle/chunk-4S554KLW.js.map +0 -7
- package/bundle/chunk-5GCLBUBS.js +0 -257
- package/bundle/chunk-5GCLBUBS.js.map +0 -7
- package/bundle/chunk-BROFMHC2.js.map +0 -7
- package/bundle/chunk-EGL6UMAO.js.map +0 -7
- package/bundle/chunk-EQSG2CRM.js.map +0 -7
- package/bundle/chunk-GXL7HJPT.js.map +0 -7
- package/bundle/chunk-HKRSMUXJ.js.map +0 -7
- package/bundle/chunk-HT2BPTZY.js +0 -241
- package/bundle/chunk-HT2BPTZY.js.map +0 -7
- package/bundle/chunk-HZDLFLRP.js.map +0 -7
- package/bundle/chunk-IKUZPMVA.js +0 -82
- package/bundle/chunk-IKUZPMVA.js.map +0 -7
- package/bundle/chunk-LGP6TYFI.js.map +0 -7
- package/bundle/chunk-ONBF5DDU.js.map +0 -7
- package/bundle/chunk-RWRRGE4U.js +0 -72
- package/bundle/chunk-RWRRGE4U.js.map +0 -7
- package/bundle/chunk-SIFPBTI4.js.map +0 -7
- package/bundle/chunk-VUIX5AGB.js +0 -65
- package/bundle/chunk-VUIX5AGB.js.map +0 -7
- package/bundle/chunk-W4EA4GCA.js.map +0 -7
- package/bundle/chunk-XWRADSXO.js.map +0 -7
- package/bundle/chunk-Y76VUJSF.js +0 -75
- package/bundle/chunk-Y76VUJSF.js.map +0 -7
- package/bundle/chunk-YRU2K3O6.js.map +0 -7
- package/bundle/context-2RJHC2LE.js.map +0 -7
- package/bundle/direct-api-transport-E3LNDBJT.js.map +0 -7
- package/bundle/dns-wakeup-IDOJIXBX.js.map +0 -7
- package/bundle/heartbeat-tier3-ABWL3P7M.js.map +0 -7
- package/bundle/install-OS3CU7NF.js.map +0 -7
- package/bundle/metrics-collector-L3VPEHII.js.map +0 -7
- package/bundle/peer-client-RGEU5HOK.js.map +0 -7
- package/bundle/peer-jwt-NCCPXJRX.js +0 -18
- package/bundle/public/css/dashboard.css +0 -542
- package/bundle/public/index.html +0 -180
- package/bundle/public/js/app.js +0 -437
- package/bundle/public/memory-universe.js +0 -384
- package/bundle/stream-single-RFJNUTL6.js +0 -34
- package/bundle/stream-single-RFJNUTL6.js.map +0 -7
- package/bundle/subagent-runtime-5QUVES3W.js +0 -14
- package/bundle/system-status-JZU5FO7B.js.map +0 -7
- package/bundle/telegram-adapter-H6PMFPMB.js.map +0 -7
- package/bundle/usage-tracker-NXD364VX.js.map +0 -7
- package/bundle/user-registry-35BW4XKM.js.map +0 -7
- package/bundle/ws-peer-client-AIXCXF7V.js +0 -173
- package/bundle/ws-peer-client-AIXCXF7V.js.map +0 -7
- /package/bundle/{abmind-lazy-7Z44NODV.js.map → abmind-lazy-E3YCFKQ5.js.map} +0 -0
- /package/bundle/{acp-raw-client-E6FM45NC.js.map → acp-raw-client-UCNK3OTU.js.map} +0 -0
- /package/bundle/{action-gate-G2V47NHW.js.map → action-gate-V4FCBHFB.js.map} +0 -0
- /package/bundle/{agent-api-adapter-YAHKQMMZ.js.map → agent-api-adapter-7HEPYSIN.js.map} +0 -0
- /package/bundle/{agent-api-rate-limit-WCFXJMGY.js.map → agent-api-rate-limit-RZSAM3SW.js.map} +0 -0
- /package/bundle/{agent-registry-GI6CLT3Z.js.map → agent-registry-46A2R5KP.js.map} +0 -0
- /package/bundle/{bootstrap-X2QYIZIJ.js.map → bootstrap-MIHJJSWU.js.map} +0 -0
- /package/bundle/{bridge-lock-transport-4ZH7QTJP.js.map → bridge-lock-transport-7RSN7OLJ.js.map} +0 -0
- /package/bundle/{browser-DMARZJIN.js.map → browser-F6BCWJWW.js.map} +0 -0
- /package/bundle/{budget-45QOBDWA.js.map → budget-WUM3SPKW.js.map} +0 -0
- /package/bundle/{capability-JFWX3IQF.js.map → capability-QVRKGRFC.js.map} +0 -0
- /package/bundle/{chunk-YSKCQH6E.js.map → chunk-2IYJ4I66.js.map} +0 -0
- /package/bundle/{chunk-KTYGKPYM.js.map → chunk-2NLUT5S2.js.map} +0 -0
- /package/bundle/{chunk-OKAQICWY.js.map → chunk-3GQX34S2.js.map} +0 -0
- /package/bundle/{chunk-QROWBWLL.js.map → chunk-3XZ773BS.js.map} +0 -0
- /package/bundle/{chunk-DYBW4XXL.js.map → chunk-467SRLLR.js.map} +0 -0
- /package/bundle/{chunk-GPZNXY2U.js.map → chunk-4S3H4OK7.js.map} +0 -0
- /package/bundle/{chunk-NDCRWEEJ.js.map → chunk-4Y5MJQRE.js.map} +0 -0
- /package/bundle/{chunk-FRKW6LWB.js.map → chunk-55UWKI5C.js.map} +0 -0
- /package/bundle/{chunk-4UL3KINB.js.map → chunk-5PNJFDSW.js.map} +0 -0
- /package/bundle/{chunk-OXTSWQCX.js.map → chunk-5Y3FJ2Y7.js.map} +0 -0
- /package/bundle/{chunk-TMUYFERL.js.map → chunk-6B5ZFUPD.js.map} +0 -0
- /package/bundle/{chunk-65VCEC32.js.map → chunk-6PA5JBUU.js.map} +0 -0
- /package/bundle/{chunk-AFREM7FX.js.map → chunk-CK7YTA2F.js.map} +0 -0
- /package/bundle/{chunk-NRUSRJXR.js.map → chunk-DZJ5QZFD.js.map} +0 -0
- /package/bundle/{chunk-YRSMGJFP.js.map → chunk-E67KESEG.js.map} +0 -0
- /package/bundle/{chunk-ZV4IWKDJ.js.map → chunk-E7XD5UGB.js.map} +0 -0
- /package/bundle/{chunk-PEDX56EL.js.map → chunk-EFGBM555.js.map} +0 -0
- /package/bundle/{chunk-UPRZDU6T.js.map → chunk-IY6UKLPS.js.map} +0 -0
- /package/bundle/{chunk-EUZDKV3C.js.map → chunk-J4RUFAPK.js.map} +0 -0
- /package/bundle/{chunk-5B5B6EHL.js.map → chunk-JLWYPGWI.js.map} +0 -0
- /package/bundle/{chunk-5QUTMUIK.js.map → chunk-JXYWDAHD.js.map} +0 -0
- /package/bundle/{chunk-TEFZ4JA4.js.map → chunk-NHPLD3C7.js.map} +0 -0
- /package/bundle/{chunk-2KC5G3EA.js.map → chunk-OWUO5RS3.js.map} +0 -0
- /package/bundle/{chunk-WYHGNI56.js.map → chunk-PMD5BLFS.js.map} +0 -0
- /package/bundle/{chunk-URQPDCK5.js.map → chunk-Q66LQMMZ.js.map} +0 -0
- /package/bundle/{chunk-JQDJPUHM.js.map → chunk-TWB2ZGVH.js.map} +0 -0
- /package/bundle/{chunk-IJT4KWXT.js.map → chunk-U4U47YE7.js.map} +0 -0
- /package/bundle/{chunk-2FAZIA37.js.map → chunk-W546CU3A.js.map} +0 -0
- /package/bundle/{chunk-JNIHEDKF.js.map → chunk-XPWYDNWL.js.map} +0 -0
- /package/bundle/{chunk-EFJVUJBE.js.map → chunk-Y5FEFKGM.js.map} +0 -0
- /package/bundle/{chunk-GVM5YU5I.js.map → chunk-Z4FZPB42.js.map} +0 -0
- /package/bundle/{chunk-7BSQ5UQO.js.map → chunk-ZSIDQ66D.js.map} +0 -0
- /package/bundle/{chunk-XX6BGTPO.js.map → chunk-ZZZCJJEO.js.map} +0 -0
- /package/bundle/{commands-XYEGVUZF.js.map → commands-2ZW6CMLC.js.map} +0 -0
- /package/bundle/{config-M3P5IOAI.js.map → config-YMY5YHKN.js.map} +0 -0
- /package/bundle/{daemon-TB23FFWY.js.map → daemon-D7SU63OY.js.map} +0 -0
- /package/bundle/{delegation-tools-QKNYQGTQ.js.map → delegation-tools-WS7Z56KZ.js.map} +0 -0
- /package/bundle/{deploy-EPDWNHJU.js.map → deploy-AMTVKIMU.js.map} +0 -0
- /package/bundle/{deps-WVK553KF.js.map → deps-T63AVJKJ.js.map} +0 -0
- /package/bundle/{doctor-probes-B54JFIW3.js.map → doctor-probes-O6YI6XSZ.js.map} +0 -0
- /package/bundle/{env-schema-4JXQUOH4.js.map → env-schema-B5RB32DC.js.map} +0 -0
- /package/bundle/{gossip-3C3BSNPN.js.map → gossip-SKRCPOBS.js.map} +0 -0
- /package/bundle/{guardrails-DL7ZSWVN.js.map → guardrails-64GQ5Y5K.js.map} +0 -0
- /package/bundle/{heartbeat-system-MVTRS4GP.js.map → heartbeat-system-X4MUTKJD.js.map} +0 -0
- /package/bundle/{hook-system-M3POLUIB.js.map → hook-system-YB635OC4.js.map} +0 -0
- /package/bundle/{hotskills-FWX4QI7V.js.map → hotskills-Q75D2DK3.js.map} +0 -0
- /package/bundle/{install-manifest-5PPWMD2W.js.map → install-manifest-J7ICPCJN.js.map} +0 -0
- /package/bundle/{irc-adapter-PTTZD32W.js.map → irc-adapter-TVEV4R6H.js.map} +0 -0
- /package/bundle/{irc-config-CP7ZMUOX.js.map → irc-config-M676FOFI.js.map} +0 -0
- /package/bundle/{kanban-board-M326B2XJ.js.map → kanban-board-DLEJUCNN.js.map} +0 -0
- /package/bundle/{kanban-channel-IJ52OMNA.js.map → kanban-channel-XOLUHJZJ.js.map} +0 -0
- /package/bundle/{lazy-require-KCRVT4SI.js.map → lazy-require-JKQSALXN.js.map} +0 -0
- /package/bundle/{logger-OWCSNYCA.js.map → logger-3EGHBD4R.js.map} +0 -0
- /package/bundle/{main-chat-ZNUZCTNS.js.map → main-chat-3H63REKK.js.map} +0 -0
- /package/bundle/{master-user-HSKM4ZFN.js.map → master-user-MUBUP3KD.js.map} +0 -0
- /package/bundle/{media-utils-3ZYOD7SK.js.map → media-utils-HUUIALAJ.js.map} +0 -0
- /package/bundle/{message-pipeline-P5GAQU4Z.js.map → message-pipeline-GRDRWONR.js.map} +0 -0
- /package/bundle/{model-health-registry-MLEIZSTV.js.map → model-health-registry-QADMFQFQ.js.map} +0 -0
- /package/bundle/{nerve-IGSXBKZZ.js.map → nerve-QPAEBRKX.js.map} +0 -0
- /package/bundle/{notification-BFSIEECG.js.map → notification-3JICGXWU.js.map} +0 -0
- /package/bundle/{openrouter-credits-NTVZDRYM.js.map → openrouter-credits-7NEIPYJN.js.map} +0 -0
- /package/bundle/{orc-tools-4CHEFWSN.js.map → orc-tools-UZVPONKY.js.map} +0 -0
- /package/bundle/{peer-auth-QC4EF2PM.js.map → peer-auth-RI43DKJE.js.map} +0 -0
- /package/bundle/{peer-config-TN55LFDC.js.map → peer-config-URM7DCW6.js.map} +0 -0
- /package/bundle/{peer-jwt-NCCPXJRX.js.map → peer-transport-SI7I72DB.js.map} +0 -0
- /package/bundle/{peer-transport-I6JPLFZ2.js.map → phase-transport-ESWWACZI.js.map} +0 -0
- /package/bundle/{phase-transport-PGKU2KD4.js.map → reconcile-GFDQYNBD.js.map} +0 -0
- /package/bundle/{reconciler-EBKH3JNU.js.map → reconciler-IEUJXJN2.js.map} +0 -0
- /package/bundle/{restore-IFHPI7I7.js.map → restore-FARTGLQQ.js.map} +0 -0
- /package/bundle/{reconcile-CTFCLQRN.js.map → rollback-GEWPZABG.js.map} +0 -0
- /package/bundle/{sandbox-runtime-QROWHDCS.js.map → sandbox-runtime-DV6E25J6.js.map} +0 -0
- /package/bundle/{self-healer-utils-IFAYOQO2.js.map → self-healer-utils-P4SKNNEM.js.map} +0 -0
- /package/bundle/{rollback-ANRI3T5Z.js.map → sha-tracker-77SHLYNY.js.map} +0 -0
- /package/bundle/{skill-session-BMSRQSHV.js.map → skill-session-5HSMXY54.js.map} +0 -0
- /package/bundle/{sha-tracker-ZWBP6CIJ.js.map → skill-stats-MI3RSWWL.js.map} +0 -0
- /package/bundle/{skill-stats-JORH5DGM.js.map → skill-watcher-5L7JE6TN.js.map} +0 -0
- /package/bundle/{skill-watcher-E4MGLKLS.js.map → sleep-I4JFASCY.js.map} +0 -0
- /package/bundle/{sleep-36XS6MHJ.js.map → soul-bundle-522C3IRH.js.map} +0 -0
- /package/bundle/{soul-bundle-VWAVHCZ6.js.map → spin-VHNGNWTD.js.map} +0 -0
- /package/bundle/{spin-notifications-SE2HVZI7.js.map → spin-notifications-7NC5XZEM.js.map} +0 -0
- /package/bundle/{spin-TI3TSVVT.js.map → spin-types-C5KOQOPD.js.map} +0 -0
- /package/bundle/{sse-parser-anthropic-A6R4Z2TB.js.map → sse-parser-anthropic-MMTVWHLI.js.map} +0 -0
- /package/bundle/{sse-parser-responses-HSZY3QGJ.js.map → sse-parser-responses-3AOFN64C.js.map} +0 -0
- /package/bundle/{ssrf-guard-O6SHIK6Q.js.map → ssrf-guard-U2JA72TC.js.map} +0 -0
- /package/bundle/{spin-types-BLPYAETA.js.map → stt-PSOPPBV4.js.map} +0 -0
- /package/bundle/{stt-LGVPXMVR.js.map → task-store-MNCW42BW.js.map} +0 -0
- /package/bundle/{subagent-runtime-5QUVES3W.js.map → tool-registry-JJMWCQKZ.js.map} +0 -0
- /package/bundle/{task-store-W5BFIAIH.js.map → tool-sandbox-CNL6V6IH.js.map} +0 -0
- /package/bundle/{tool-registry-IZX2IOBM.js.map → transport-config-6MB2K2XC.js.map} +0 -0
- /package/bundle/{tool-sandbox-4UC6GAKA.js.map → update-HGQAOC5L.js.map} +0 -0
- /package/bundle/{transport-config-KBF5W2DP.js.map → usage-tracker-SR4BI6ZT.js.map} +0 -0
- /package/bundle/{update-MESYO4LO.js.map → user-registry-4PACZJIJ.js.map} +0 -0
|
@@ -0,0 +1,555 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { createRequire as __bundleCreateRequire } from 'node:module'; import { fileURLToPath as __bundleFileURLToPath } from 'node:url'; import { dirname as __bundleDirname } from 'node:path'; const require = __bundleCreateRequire(import.meta.url); const __chunk_filename = __bundleFileURLToPath(import.meta.url); const __chunk_dirname = __bundleDirname(__chunk_filename);
|
|
3
|
+
import {
|
|
4
|
+
bridge_lock_transport_exports,
|
|
5
|
+
init_bridge_lock_transport
|
|
6
|
+
} from "./chunk-KOSFXW2S.js";
|
|
7
|
+
import {
|
|
8
|
+
init_peer_config,
|
|
9
|
+
loadPeerConfig,
|
|
10
|
+
peer_config_exports
|
|
11
|
+
} from "./chunk-3BG3AIDP.js";
|
|
12
|
+
import {
|
|
13
|
+
init_logger,
|
|
14
|
+
logDebug,
|
|
15
|
+
logInfo,
|
|
16
|
+
logTrace,
|
|
17
|
+
logWarn
|
|
18
|
+
} from "./chunk-XRTXYN66.js";
|
|
19
|
+
import {
|
|
20
|
+
__esm,
|
|
21
|
+
__export,
|
|
22
|
+
__require,
|
|
23
|
+
__toCommonJS
|
|
24
|
+
} from "./chunk-7K2YZTLD.js";
|
|
25
|
+
|
|
26
|
+
// src/components/peer-transport/http-transport.ts
|
|
27
|
+
function resolvePeer(peers, name) {
|
|
28
|
+
const key = Object.keys(peers).find((k) => k.toLowerCase() === name.toLowerCase());
|
|
29
|
+
if (!key || !peers[key]) throw new Error(`Unknown peer '${name}'. Available: ${Object.keys(peers).join(", ")}`);
|
|
30
|
+
return peers[key];
|
|
31
|
+
}
|
|
32
|
+
var TAG, HttpTransport;
|
|
33
|
+
var init_http_transport = __esm({
|
|
34
|
+
"src/components/peer-transport/http-transport.ts"() {
|
|
35
|
+
"use strict";
|
|
36
|
+
init_gossip();
|
|
37
|
+
init_peer_config();
|
|
38
|
+
init_logger();
|
|
39
|
+
TAG = "http-transport";
|
|
40
|
+
HttpTransport = class {
|
|
41
|
+
handlers = [];
|
|
42
|
+
wsClients = /* @__PURE__ */ new Map();
|
|
43
|
+
/** Init WS connections for all ws-outbound peers. Call on boot. */
|
|
44
|
+
async initWsConnections() {
|
|
45
|
+
const config = loadPeerConfig();
|
|
46
|
+
const { WsPeerClient: Client } = await import("./ws-peer-client-U3NNPOK7.js");
|
|
47
|
+
for (const [name, entry] of Object.entries(config.peers)) {
|
|
48
|
+
if (entry.transport !== "ws-outbound") continue;
|
|
49
|
+
const client = new Client(name, entry);
|
|
50
|
+
client.onPush((method, payload) => {
|
|
51
|
+
if (method === "callback") {
|
|
52
|
+
const p = payload;
|
|
53
|
+
import("./kanban-board-DLEJUCNN.js").then(({ kanbanList, kanbanComplete, kanbanFail, kanbanAddTokens }) => {
|
|
54
|
+
const cards = kanbanList("running", "status").filter((c) => {
|
|
55
|
+
if (c.type !== "remote") return false;
|
|
56
|
+
try {
|
|
57
|
+
const m = JSON.parse(c.notes ?? "{}");
|
|
58
|
+
return m.peer === name && m.remote_task_id === p.task_id;
|
|
59
|
+
} catch {
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
if (!cards.length) return;
|
|
64
|
+
const card = cards[0];
|
|
65
|
+
if (p.tokens_used) kanbanAddTokens(card.id, p.tokens_used);
|
|
66
|
+
if (p.status === "done") kanbanComplete(card.id, null, p.result_summary ?? "");
|
|
67
|
+
else kanbanFail(card.id, p.error ?? "remote failure");
|
|
68
|
+
import("./nerve-QPAEBRKX.js").then(({ nerve }) => nerve.emit(p.status === "done" ? "card:done" : "card:failed", card.id));
|
|
69
|
+
}).catch(() => {
|
|
70
|
+
});
|
|
71
|
+
} else if (method === "channel") {
|
|
72
|
+
const p = payload;
|
|
73
|
+
import("./kanban-channel-XOLUHJZJ.js").then(({ channelPost }) => {
|
|
74
|
+
channelPost(p.card_id, p.from_agent, "ALL", p.message);
|
|
75
|
+
}).catch(() => {
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
for (const h of this.handlers) h(name, { type: method, payload });
|
|
79
|
+
});
|
|
80
|
+
client.connect();
|
|
81
|
+
this.wsClients.set(name, client);
|
|
82
|
+
logInfo(TAG, `WS outbound: connecting to ${name}`);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/** Check if a peer is reachable via WS. */
|
|
86
|
+
hasWsConnection(peer) {
|
|
87
|
+
return this.wsClients.get(peer)?.connected ?? false;
|
|
88
|
+
}
|
|
89
|
+
/** #1293 — Called by HB tick to check and reconnect stale ws-outbound connections. */
|
|
90
|
+
checkWsConnections() {
|
|
91
|
+
for (const [name, client] of this.wsClients) {
|
|
92
|
+
if (!client.connected) {
|
|
93
|
+
logDebug(TAG, `HB: ws-outbound ${name} disconnected \u2014 scheduling reconnect`);
|
|
94
|
+
client.connect();
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
discover() {
|
|
99
|
+
return getAlivePeers();
|
|
100
|
+
}
|
|
101
|
+
async send(peer, message) {
|
|
102
|
+
if (message.type === "ask") {
|
|
103
|
+
const { callPeer } = await import("./peer-client-UITTMWJ2.js");
|
|
104
|
+
const config = loadPeerConfig();
|
|
105
|
+
return callPeer(peer, message.payload.prompt, config.maxHops);
|
|
106
|
+
}
|
|
107
|
+
if (message.type === "task" && message.payload.action === "callback") {
|
|
108
|
+
const config = loadPeerConfig();
|
|
109
|
+
const entry = resolvePeer(config.peers, peer);
|
|
110
|
+
logDebug(TAG, `\u2192 callback ${peer}: task_id=${message.payload.task_id} status=${message.payload.status}`);
|
|
111
|
+
logTrace(TAG, `\u2192 callback ${peer} result: ${String(message.payload.result_summary ?? "").slice(0, 200)}`);
|
|
112
|
+
const payload = { task_id: message.payload.task_id, status: message.payload.status, result_summary: message.payload.result_summary, error: message.payload.error };
|
|
113
|
+
if (message.payload.artifacts) payload.artifacts = message.payload.artifacts;
|
|
114
|
+
const ws = this.wsClients.get(peer);
|
|
115
|
+
if (ws?.connected) {
|
|
116
|
+
await ws.send("callback", payload);
|
|
117
|
+
logInfo(TAG, `CALLBACK ${peer} (ws) task_id=${message.payload.task_id}`);
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
const body = JSON.stringify(payload);
|
|
121
|
+
return this.httpCall(entry, peer, "POST", "/v1/callbacks", body);
|
|
122
|
+
}
|
|
123
|
+
if (message.type === "task") return this.delegateTask(peer, message.payload.goal, message.payload);
|
|
124
|
+
if (message.type === "check") return this.checkTask(peer, message.payload.taskId);
|
|
125
|
+
if (message.type === "terminate") return this.terminateTask(peer, message.payload.taskId);
|
|
126
|
+
throw new Error(`Unknown message type: ${message.type}`);
|
|
127
|
+
}
|
|
128
|
+
async broadcast(message) {
|
|
129
|
+
const peers = this.discover();
|
|
130
|
+
await Promise.allSettled(peers.map((p) => this.send(p.name, message)));
|
|
131
|
+
}
|
|
132
|
+
onMessage(handler) {
|
|
133
|
+
this.handlers.push(handler);
|
|
134
|
+
}
|
|
135
|
+
/** Called by agent-api-server when an inbound peer message arrives. */
|
|
136
|
+
dispatchInbound(from, message) {
|
|
137
|
+
for (const h of this.handlers) {
|
|
138
|
+
try {
|
|
139
|
+
h(from, message);
|
|
140
|
+
} catch {
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
async delegateTask(peer, goal, opts) {
|
|
145
|
+
const config = loadPeerConfig();
|
|
146
|
+
const entry = resolvePeer(config.peers, peer);
|
|
147
|
+
logDebug(TAG, `\u2192 peer_delegate ${peer}: priority=${opts?.priority ?? "MEDIUM"}, goal=${goal.length}ch`);
|
|
148
|
+
logTrace(TAG, `\u2192 peer_delegate ${peer} goal: ${goal.slice(0, 300)}`);
|
|
149
|
+
if (opts?.artifacts?.length) {
|
|
150
|
+
const MAX_SINGLE = 14e5;
|
|
151
|
+
const MAX_TOTAL = 5e6;
|
|
152
|
+
let total = 0;
|
|
153
|
+
for (const a of opts.artifacts) {
|
|
154
|
+
if (a.content.length > MAX_SINGLE) throw new Error(`Artifact '${a.name}' exceeds 1.4MB limit (${a.content.length} bytes)`);
|
|
155
|
+
total += a.content.length;
|
|
156
|
+
}
|
|
157
|
+
if (total > MAX_TOTAL) throw new Error(`Total artifacts exceed 5MB limit (${total} bytes)`);
|
|
158
|
+
}
|
|
159
|
+
const payload = { goal, priority: opts?.priority ?? "MEDIUM", context: opts?.context, callback_peer: config.self.name };
|
|
160
|
+
if (opts?.artifacts?.length) payload.artifacts = opts.artifacts;
|
|
161
|
+
const ws = this.wsClients.get(peer);
|
|
162
|
+
if (ws?.connected) {
|
|
163
|
+
const result = await ws.send("delegate", payload);
|
|
164
|
+
logInfo(TAG, `PEER_DELEGATE ${peer} (ws) \u2192 remote#${result.taskId} (${goal.length}ch)`);
|
|
165
|
+
return { taskId: result.taskId, remoteSessionId: result.session_id };
|
|
166
|
+
}
|
|
167
|
+
const body = JSON.stringify(payload);
|
|
168
|
+
const response = await this.httpCall(entry, peer, "POST", "/v1/tasks", body);
|
|
169
|
+
const parsed = JSON.parse(response);
|
|
170
|
+
logInfo(TAG, `PEER_DELEGATE ${peer} \u2192 remote#${parsed.task_id} (${goal.length}ch)`);
|
|
171
|
+
return { taskId: parsed.task_id, remoteSessionId: parsed.session_id };
|
|
172
|
+
}
|
|
173
|
+
async checkTask(peer, taskId) {
|
|
174
|
+
const config = loadPeerConfig();
|
|
175
|
+
const entry = resolvePeer(config.peers, peer);
|
|
176
|
+
logDebug(TAG, `\u2192 peer_check ${peer}#${taskId}`);
|
|
177
|
+
const response = await this.httpCall(entry, peer, "GET", `/v1/tasks/${taskId}`);
|
|
178
|
+
const parsed = JSON.parse(response);
|
|
179
|
+
logDebug(TAG, `\u2190 peer_check ${peer}#${taskId}: status=${parsed.status}`);
|
|
180
|
+
logTrace(TAG, `\u2190 peer_check ${peer}#${taskId} result: ${(parsed.result_summary ?? "").slice(0, 200)}`);
|
|
181
|
+
return {
|
|
182
|
+
taskId: parsed.id ?? taskId,
|
|
183
|
+
status: parsed.status,
|
|
184
|
+
result: parsed.result_summary,
|
|
185
|
+
error: parsed.error,
|
|
186
|
+
tokensUsed: parsed.tokens_used
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
async terminateTask(peer, taskId) {
|
|
190
|
+
const config = loadPeerConfig();
|
|
191
|
+
const entry = resolvePeer(config.peers, peer);
|
|
192
|
+
logDebug(TAG, `\u2192 peer_terminate ${peer}#${taskId}`);
|
|
193
|
+
await this.httpCall(entry, peer, "DELETE", `/v1/tasks/${taskId}`);
|
|
194
|
+
logInfo(TAG, `PEER_TERMINATE ${peer}#${taskId}`);
|
|
195
|
+
}
|
|
196
|
+
/** #949: Push a channel message to a remote peer. */
|
|
197
|
+
async pushChannelMessage(peer, cardId, from, message, createdAt) {
|
|
198
|
+
const config = loadPeerConfig();
|
|
199
|
+
const entry = resolvePeer(config.peers, peer);
|
|
200
|
+
await this.httpCall(entry, peer, "POST", `/v1/tasks/${cardId}/messages`, JSON.stringify({ from_agent: from, message, created_at: createdAt }));
|
|
201
|
+
}
|
|
202
|
+
async httpCall(entry, peerName, method, path, body) {
|
|
203
|
+
const { signRequest, verifyServerCert } = await import("./peer-auth-RI43DKJE.js");
|
|
204
|
+
const { loadPeerConfig: loadPeerConfig2 } = await import("./peer-config-URM7DCW6.js");
|
|
205
|
+
const config = loadPeerConfig2();
|
|
206
|
+
if (!entry.verifyKey) {
|
|
207
|
+
throw new Error(`Peer ${peerName} has no verifyKey \u2014 enroll first before calling`);
|
|
208
|
+
}
|
|
209
|
+
const bodyStr = body ?? "";
|
|
210
|
+
const sigHeaders = signRequest(method, path, bodyStr, config.self.signingKey, config.self.name);
|
|
211
|
+
const http = await import("node:https");
|
|
212
|
+
return new Promise((resolve, reject) => {
|
|
213
|
+
const headers = {
|
|
214
|
+
...sigHeaders,
|
|
215
|
+
"Content-Type": "application/json"
|
|
216
|
+
};
|
|
217
|
+
if (body) headers["Content-Length"] = String(Buffer.byteLength(body));
|
|
218
|
+
const req = http.request({
|
|
219
|
+
hostname: entry.host,
|
|
220
|
+
port: entry.port,
|
|
221
|
+
path,
|
|
222
|
+
method,
|
|
223
|
+
headers,
|
|
224
|
+
timeout: 6e4,
|
|
225
|
+
minVersion: "TLSv1.3",
|
|
226
|
+
rejectUnauthorized: true,
|
|
227
|
+
checkServerIdentity: (_host, cert) => {
|
|
228
|
+
if (!cert.raw) return new Error("No cert presented by peer");
|
|
229
|
+
try {
|
|
230
|
+
const { createPublicKey } = __require("node:crypto");
|
|
231
|
+
const keyObj = createPublicKey({ key: cert.raw, format: "der", type: "spki" });
|
|
232
|
+
const certPem = keyObj.export({ type: "spki", format: "pem" });
|
|
233
|
+
const certDerB64 = cert.raw.toString("base64");
|
|
234
|
+
const certPemBlock = `-----BEGIN CERTIFICATE-----
|
|
235
|
+
${certDerB64.match(/.{1,64}/g).join("\n")}
|
|
236
|
+
-----END CERTIFICATE-----
|
|
237
|
+
`;
|
|
238
|
+
if (!verifyServerCert(certPemBlock, entry.verifyKey)) {
|
|
239
|
+
return new Error(`Peer ${peerName} cert key does not match enrolled verifyKey`);
|
|
240
|
+
}
|
|
241
|
+
} catch (e) {
|
|
242
|
+
return new Error(`Cert verify error: ${e instanceof Error ? e.message : String(e)}`);
|
|
243
|
+
}
|
|
244
|
+
return void 0;
|
|
245
|
+
}
|
|
246
|
+
}, (res) => {
|
|
247
|
+
let data = "";
|
|
248
|
+
res.on("data", (c) => data += c);
|
|
249
|
+
res.on("end", () => {
|
|
250
|
+
if (res.statusCode >= 400) {
|
|
251
|
+
reject(new Error(`Peer ${peerName} returned ${res.statusCode}: ${data.slice(0, 200)}`));
|
|
252
|
+
return;
|
|
253
|
+
}
|
|
254
|
+
resolve(data);
|
|
255
|
+
});
|
|
256
|
+
});
|
|
257
|
+
req.on("timeout", () => {
|
|
258
|
+
req.destroy();
|
|
259
|
+
reject(new Error(`Peer ${peerName} timeout`));
|
|
260
|
+
});
|
|
261
|
+
req.on("error", (err) => reject(new Error(`Peer ${peerName} unreachable: ${err.message}`)));
|
|
262
|
+
if (body) req.write(body);
|
|
263
|
+
req.end();
|
|
264
|
+
});
|
|
265
|
+
}
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
});
|
|
269
|
+
|
|
270
|
+
// src/components/peer-transport/index.ts
|
|
271
|
+
var peer_transport_exports = {};
|
|
272
|
+
__export(peer_transport_exports, {
|
|
273
|
+
HttpTransport: () => HttpTransport,
|
|
274
|
+
getAlivePeers: () => getAlivePeers,
|
|
275
|
+
getPeerTable: () => getPeerTable,
|
|
276
|
+
getPeerTransport: () => getPeerTransport,
|
|
277
|
+
gossipBroadcast: () => gossipBroadcast,
|
|
278
|
+
initPeerTransport: () => initPeerTransport,
|
|
279
|
+
setGossipInterval: () => setGossipInterval,
|
|
280
|
+
startGossipListener: () => startGossipListener,
|
|
281
|
+
stopGossipListener: () => stopGossipListener
|
|
282
|
+
});
|
|
283
|
+
function getPeerTransport() {
|
|
284
|
+
if (!_instance) _instance = new HttpTransport();
|
|
285
|
+
return _instance;
|
|
286
|
+
}
|
|
287
|
+
async function initPeerTransport() {
|
|
288
|
+
const transport = getPeerTransport();
|
|
289
|
+
await transport.initWsConnections();
|
|
290
|
+
}
|
|
291
|
+
var _instance;
|
|
292
|
+
var init_peer_transport = __esm({
|
|
293
|
+
"src/components/peer-transport/index.ts"() {
|
|
294
|
+
init_http_transport();
|
|
295
|
+
init_gossip();
|
|
296
|
+
init_http_transport();
|
|
297
|
+
_instance = null;
|
|
298
|
+
}
|
|
299
|
+
});
|
|
300
|
+
|
|
301
|
+
// src/components/peer-transport/gossip.ts
|
|
302
|
+
var gossip_exports = {};
|
|
303
|
+
__export(gossip_exports, {
|
|
304
|
+
findCapablePeer: () => findCapablePeer,
|
|
305
|
+
getAlivePeers: () => getAlivePeers,
|
|
306
|
+
getLocalCapabilities: () => getLocalCapabilities,
|
|
307
|
+
getPeerTable: () => getPeerTable,
|
|
308
|
+
gossipBroadcast: () => gossipBroadcast,
|
|
309
|
+
setGossipInterval: () => setGossipInterval,
|
|
310
|
+
startGossip: () => startGossip,
|
|
311
|
+
startGossipListener: () => startGossipListener,
|
|
312
|
+
stopGossip: () => stopGossip,
|
|
313
|
+
stopGossipListener: () => stopGossipListener
|
|
314
|
+
});
|
|
315
|
+
import { createSocket } from "node:dgram";
|
|
316
|
+
import { execSync } from "node:child_process";
|
|
317
|
+
import { existsSync } from "node:fs";
|
|
318
|
+
import { cpus, loadavg } from "node:os";
|
|
319
|
+
function discoverCapabilities() {
|
|
320
|
+
const caps = ["bash", "node", "memory"];
|
|
321
|
+
try {
|
|
322
|
+
if (execSync("which docker", { stdio: "pipe" }).toString().trim()) caps.push("docker");
|
|
323
|
+
} catch {
|
|
324
|
+
}
|
|
325
|
+
try {
|
|
326
|
+
if (execSync("which xcodebuild", { stdio: "pipe" }).toString().trim()) caps.push("xcode");
|
|
327
|
+
} catch {
|
|
328
|
+
}
|
|
329
|
+
try {
|
|
330
|
+
if (execSync("which ollama", { stdio: "pipe" }).toString().trim()) caps.push("ollama");
|
|
331
|
+
} catch {
|
|
332
|
+
}
|
|
333
|
+
if (existsSync("/usr/bin/nvidia-smi") || process.env["CUDA_VISIBLE_DEVICES"]) caps.push("gpu");
|
|
334
|
+
if (process.env["BROWSER_ENGINE"]) caps.push("browser");
|
|
335
|
+
if (process.env["GROQ_API_KEY"]) caps.push("stt");
|
|
336
|
+
return caps;
|
|
337
|
+
}
|
|
338
|
+
function getLoad() {
|
|
339
|
+
const cores = cpus().length || 1;
|
|
340
|
+
return Math.min(1, loadavg()[0] / cores);
|
|
341
|
+
}
|
|
342
|
+
function buildPacket() {
|
|
343
|
+
const config = loadPeerConfig();
|
|
344
|
+
const payload = JSON.stringify({
|
|
345
|
+
name: config.self.name,
|
|
346
|
+
ts: Math.floor(Date.now() / 1e3),
|
|
347
|
+
load: Math.round(getLoad() * 100) / 100,
|
|
348
|
+
sessions: parseInt(process.env["_ACTIVE_SESSIONS"] ?? "0", 10),
|
|
349
|
+
capabilities: _capabilities,
|
|
350
|
+
version: process.env["npm_package_version"] ?? "?"
|
|
351
|
+
});
|
|
352
|
+
const { sign: cryptoSign } = __require("node:crypto");
|
|
353
|
+
const { createPrivateKey } = __require("node:crypto");
|
|
354
|
+
const privKey = createPrivateKey({ key: Buffer.from(config.self.signingKey, "base64"), format: "der", type: "pkcs8" });
|
|
355
|
+
const canonical = `abtars-gossip-v1
|
|
356
|
+
${payload}`;
|
|
357
|
+
const sig = cryptoSign(null, Buffer.from(canonical, "utf-8"), privKey).toString("base64");
|
|
358
|
+
return Buffer.from(`${payload}|${sig}`);
|
|
359
|
+
}
|
|
360
|
+
function verifyPacket(data) {
|
|
361
|
+
const str = data.toString("utf8");
|
|
362
|
+
const sepIdx = str.lastIndexOf("|");
|
|
363
|
+
if (sepIdx < 0) return null;
|
|
364
|
+
const payload = str.slice(0, sepIdx);
|
|
365
|
+
const sigBase64 = str.slice(sepIdx + 1);
|
|
366
|
+
let parsed;
|
|
367
|
+
try {
|
|
368
|
+
parsed = JSON.parse(payload);
|
|
369
|
+
} catch {
|
|
370
|
+
return null;
|
|
371
|
+
}
|
|
372
|
+
if (typeof parsed.name !== "string") return null;
|
|
373
|
+
const config = loadPeerConfig();
|
|
374
|
+
const name = parsed.name;
|
|
375
|
+
if (name === config.self.name) return null;
|
|
376
|
+
const peerEntry = config.peers[name];
|
|
377
|
+
if (!peerEntry?.verifyKey) {
|
|
378
|
+
logTrace(TAG2, `Gossip from unknown peer '${name}' \u2014 dropped`);
|
|
379
|
+
return null;
|
|
380
|
+
}
|
|
381
|
+
const { verify: cryptoVerify } = __require("node:crypto");
|
|
382
|
+
const { createPublicKey } = __require("node:crypto");
|
|
383
|
+
try {
|
|
384
|
+
const pubKey = createPublicKey({ key: Buffer.from(peerEntry.verifyKey, "base64"), format: "der", type: "spki" });
|
|
385
|
+
const canonical = `abtars-gossip-v1
|
|
386
|
+
${payload}`;
|
|
387
|
+
const ok = cryptoVerify(null, Buffer.from(canonical, "utf-8"), pubKey, Buffer.from(sigBase64, "base64"));
|
|
388
|
+
if (!ok) {
|
|
389
|
+
logWarn(TAG2, `Gossip from ${name}: bad Ed25519 signature \u2014 dropped`);
|
|
390
|
+
return null;
|
|
391
|
+
}
|
|
392
|
+
} catch {
|
|
393
|
+
return null;
|
|
394
|
+
}
|
|
395
|
+
return parsed;
|
|
396
|
+
}
|
|
397
|
+
function broadcast() {
|
|
398
|
+
const config = loadPeerConfig();
|
|
399
|
+
const packet = buildPacket();
|
|
400
|
+
for (const [name, entry] of Object.entries(config.peers)) {
|
|
401
|
+
_socket?.send(packet, 0, packet.length, GOSSIP_PORT, entry.host, (err) => {
|
|
402
|
+
if (err) logTrace(TAG2, `Send to ${name} (${entry.host}:${GOSSIP_PORT}) failed: ${err.message}`);
|
|
403
|
+
});
|
|
404
|
+
}
|
|
405
|
+
logTrace(TAG2, `Broadcast to ${Object.keys(config.peers).length} peer(s)`);
|
|
406
|
+
try {
|
|
407
|
+
const { updateBridgeLockField } = (init_bridge_lock_transport(), __toCommonJS(bridge_lock_transport_exports));
|
|
408
|
+
updateBridgeLockField("lastGossipBroadcast", Date.now());
|
|
409
|
+
} catch {
|
|
410
|
+
}
|
|
411
|
+
const now = Date.now();
|
|
412
|
+
for (const [, health] of peerTable) {
|
|
413
|
+
const wasAlive = health.alive;
|
|
414
|
+
health.alive = now - health.lastSeen < TTL_MS;
|
|
415
|
+
if (wasAlive && !health.alive) logDebug(TAG2, `PEER_OFFLINE ${health.name} (no heartbeat for ${Math.round((now - health.lastSeen) / 1e3)}s)`);
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
function startGossip() {
|
|
419
|
+
_capabilities = discoverCapabilities();
|
|
420
|
+
logInfo(TAG2, `Capabilities: [${_capabilities.join(", ")}]`);
|
|
421
|
+
_socket = createSocket("udp4");
|
|
422
|
+
_socket.on("message", (msg, rinfo) => {
|
|
423
|
+
const parsed = verifyPacket(msg);
|
|
424
|
+
if (!parsed || typeof parsed.name !== "string") return;
|
|
425
|
+
const name = parsed.name;
|
|
426
|
+
const config = loadPeerConfig();
|
|
427
|
+
if (name === config.self.name) return;
|
|
428
|
+
const existing = peerTable.get(name);
|
|
429
|
+
const health = {
|
|
430
|
+
name,
|
|
431
|
+
lastSeen: Date.now(),
|
|
432
|
+
load: parsed.load ?? 0,
|
|
433
|
+
sessions: parsed.sessions ?? 0,
|
|
434
|
+
capabilities: parsed.capabilities ?? [],
|
|
435
|
+
version: parsed.version ?? "?",
|
|
436
|
+
alive: true,
|
|
437
|
+
host: rinfo.address,
|
|
438
|
+
port: rinfo.port
|
|
439
|
+
};
|
|
440
|
+
peerTable.set(name, health);
|
|
441
|
+
if (!existing) logDebug(TAG2, `PEER_ONLINE ${name} [${health.capabilities.join(",")}] v${health.version}`);
|
|
442
|
+
else if (!existing.alive) logDebug(TAG2, `PEER_ONLINE ${name} returned [${health.capabilities.join(",")}] v${health.version}`);
|
|
443
|
+
});
|
|
444
|
+
_socket.on("error", (err) => {
|
|
445
|
+
logWarn(TAG2, `Socket error: ${err.message}`);
|
|
446
|
+
});
|
|
447
|
+
_socket.bind(GOSSIP_PORT, "0.0.0.0", () => {
|
|
448
|
+
logInfo(TAG2, `Listening on UDP :${GOSSIP_PORT}`);
|
|
449
|
+
});
|
|
450
|
+
setTimeout(broadcast, 2e3);
|
|
451
|
+
_interval = setInterval(broadcast, BROADCAST_INTERVAL_MS);
|
|
452
|
+
}
|
|
453
|
+
function stopGossip() {
|
|
454
|
+
if (_interval) {
|
|
455
|
+
clearInterval(_interval);
|
|
456
|
+
_interval = null;
|
|
457
|
+
}
|
|
458
|
+
if (_socket) {
|
|
459
|
+
_socket.close();
|
|
460
|
+
_socket = null;
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
function getPeerTable(includeAll = false) {
|
|
464
|
+
const now = Date.now();
|
|
465
|
+
try {
|
|
466
|
+
const { getPeerTransport: getPeerTransport2 } = (init_peer_transport(), __toCommonJS(peer_transport_exports));
|
|
467
|
+
const transport = getPeerTransport2();
|
|
468
|
+
const { loadPeerConfig: loadPeerConfig2 } = (init_peer_config(), __toCommonJS(peer_config_exports));
|
|
469
|
+
const config = loadPeerConfig2();
|
|
470
|
+
for (const [name, entry] of Object.entries(config.peers)) {
|
|
471
|
+
if (entry.transport === "ws-outbound" && typeof transport.hasWsConnection === "function" && transport.hasWsConnection(name)) {
|
|
472
|
+
const existing = peerTable.get(name);
|
|
473
|
+
if (!existing) {
|
|
474
|
+
peerTable.set(name, {
|
|
475
|
+
name,
|
|
476
|
+
lastSeen: now,
|
|
477
|
+
load: 0,
|
|
478
|
+
sessions: 0,
|
|
479
|
+
capabilities: [],
|
|
480
|
+
version: "?",
|
|
481
|
+
alive: true,
|
|
482
|
+
host: entry.host,
|
|
483
|
+
port: entry.port
|
|
484
|
+
});
|
|
485
|
+
} else {
|
|
486
|
+
existing.lastSeen = now;
|
|
487
|
+
existing.alive = true;
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
} catch {
|
|
492
|
+
}
|
|
493
|
+
const results = [];
|
|
494
|
+
for (const health of peerTable.values()) {
|
|
495
|
+
health.alive = now - health.lastSeen < TTL_MS;
|
|
496
|
+
if (includeAll || health.alive) results.push(health);
|
|
497
|
+
}
|
|
498
|
+
return results;
|
|
499
|
+
}
|
|
500
|
+
function getLocalCapabilities() {
|
|
501
|
+
return _capabilities;
|
|
502
|
+
}
|
|
503
|
+
function findCapablePeer(requires) {
|
|
504
|
+
const alive = getPeerTable().filter(
|
|
505
|
+
(p) => requires.every((req) => p.capabilities.includes(req))
|
|
506
|
+
);
|
|
507
|
+
if (alive.length === 0) return null;
|
|
508
|
+
alive.sort((a, b) => a.load - b.load);
|
|
509
|
+
return alive[0];
|
|
510
|
+
}
|
|
511
|
+
function setGossipInterval(ms) {
|
|
512
|
+
if (_interval) {
|
|
513
|
+
clearInterval(_interval);
|
|
514
|
+
_interval = setInterval(broadcast, ms);
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
var TAG2, GOSSIP_PORT, BROADCAST_INTERVAL_MS, TTL_MS, peerTable, _socket, _interval, _capabilities, startGossipListener, getAlivePeers, gossipBroadcast, stopGossipListener;
|
|
518
|
+
var init_gossip = __esm({
|
|
519
|
+
"src/components/peer-transport/gossip.ts"() {
|
|
520
|
+
init_peer_config();
|
|
521
|
+
init_logger();
|
|
522
|
+
TAG2 = "gossip";
|
|
523
|
+
GOSSIP_PORT = parseInt(process.env["GOSSIP_PORT"] ?? "5355", 10);
|
|
524
|
+
BROADCAST_INTERVAL_MS = 6e4;
|
|
525
|
+
TTL_MS = 18e4;
|
|
526
|
+
peerTable = /* @__PURE__ */ new Map();
|
|
527
|
+
_socket = null;
|
|
528
|
+
_interval = null;
|
|
529
|
+
_capabilities = [];
|
|
530
|
+
startGossipListener = startGossip;
|
|
531
|
+
getAlivePeers = getPeerTable;
|
|
532
|
+
gossipBroadcast = broadcast;
|
|
533
|
+
stopGossipListener = stopGossip;
|
|
534
|
+
}
|
|
535
|
+
});
|
|
536
|
+
|
|
537
|
+
export {
|
|
538
|
+
startGossip,
|
|
539
|
+
stopGossip,
|
|
540
|
+
getPeerTable,
|
|
541
|
+
getLocalCapabilities,
|
|
542
|
+
findCapablePeer,
|
|
543
|
+
startGossipListener,
|
|
544
|
+
getAlivePeers,
|
|
545
|
+
gossipBroadcast,
|
|
546
|
+
setGossipInterval,
|
|
547
|
+
stopGossipListener,
|
|
548
|
+
gossip_exports,
|
|
549
|
+
init_gossip,
|
|
550
|
+
HttpTransport,
|
|
551
|
+
getPeerTransport,
|
|
552
|
+
initPeerTransport,
|
|
553
|
+
init_peer_transport
|
|
554
|
+
};
|
|
555
|
+
//# sourceMappingURL=chunk-SFL4EPCZ.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/components/peer-transport/http-transport.ts", "../src/components/peer-transport/index.ts", "../src/components/peer-transport/gossip.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * peer-transport/http-transport.ts \u2014 HTTP implementation of PeerTransport (#911).\n *\n * Wraps existing peer-client.ts (JWT auth, TLS, Ed25519 signing) behind the\n * PeerTransport interface. discover() reads peers.json (static).\n */\n\nimport type { PeerTransport, PeerCard, PeerMessage, TaskResult } from \"./interface.js\";\nimport { getAlivePeers } from \"./gossip.js\";\nimport { loadPeerConfig, type PeerEntry } from \"../peer-config.js\";\nimport { logInfo, logDebug, logTrace } from \"../logger.js\";\nimport type { WsPeerClient } from \"./ws-peer-client.js\";\n\nconst TAG = \"http-transport\";\n\nexport class HttpTransport implements PeerTransport {\n private handlers: Array<(from: string, message: PeerMessage) => void> = [];\n private wsClients = new Map<string, WsPeerClient>();\n\n /** Init WS connections for all ws-outbound peers. Call on boot. */\n async initWsConnections(): Promise<void> {\n const config = loadPeerConfig();\n const { WsPeerClient: Client } = await import(\"./ws-peer-client.js\");\n for (const [name, entry] of Object.entries(config.peers)) {\n if (entry.transport !== \"ws-outbound\") continue;\n const client = new Client(name, entry);\n client.onPush((method, payload) => {\n if (method === \"callback\") {\n // Inbound callback from peer \u2014 fire as if it arrived via HTTP /v1/callbacks\n const p = payload as { task_id: number; status: string; result_summary?: string; error?: string; tokens_used?: number };\n import(\"../tasks/kanban-board.js\").then(({ kanbanList, kanbanComplete, kanbanFail, kanbanAddTokens }) => {\n const cards = kanbanList(\"running\", \"status\").filter(c => {\n if (c.type !== \"remote\") return false;\n try { const m = JSON.parse(c.notes ?? \"{}\"); return m.peer === name && m.remote_task_id === p.task_id; } catch { return false; }\n });\n if (!cards.length) return;\n const card = cards[0]!;\n if (p.tokens_used) kanbanAddTokens(card.id, p.tokens_used);\n if (p.status === \"done\") kanbanComplete(card.id, null, p.result_summary ?? \"\");\n else kanbanFail(card.id, p.error ?? \"remote failure\");\n import(\"../nerve.js\").then(({ nerve }) => nerve.emit(p.status === \"done\" ? \"card:done\" : \"card:failed\", card.id));\n }).catch(() => {});\n } else if (method === \"channel\") {\n // Inbound channel message from peer\n const p = payload as { card_id: number; from_agent: string; message: string; created_at: string };\n import(\"../tasks/kanban-channel.js\").then(({ channelPost }) => {\n channelPost(p.card_id, p.from_agent, \"ALL\", p.message);\n }).catch(() => {});\n }\n for (const h of this.handlers) h(name, { type: method as any, payload: payload as any });\n });\n client.connect();\n this.wsClients.set(name, client);\n logInfo(TAG, `WS outbound: connecting to ${name}`);\n }\n }\n\n /** Check if a peer is reachable via WS. */\n hasWsConnection(peer: string): boolean {\n return this.wsClients.get(peer)?.connected ?? false;\n }\n\n /** #1293 \u2014 Called by HB tick to check and reconnect stale ws-outbound connections. */\n checkWsConnections(): void {\n for (const [name, client] of this.wsClients) {\n if (!client.connected) {\n logDebug(TAG, `HB: ws-outbound ${name} disconnected \u2014 scheduling reconnect`);\n client.connect();\n }\n }\n }\n\n discover(): PeerCard[] {\n return getAlivePeers();\n }\n\n async send(peer: string, message: PeerMessage): Promise<unknown> {\n if (message.type === \"ask\") {\n const { callPeer } = await import(\"../peer-client.js\");\n const config = loadPeerConfig();\n return callPeer(peer, message.payload.prompt as string, config.maxHops);\n }\n if (message.type === \"task\" && message.payload.action === \"callback\") {\n const config = loadPeerConfig();\n const entry = resolvePeer(config.peers, peer);\n logDebug(TAG, `\u2192 callback ${peer}: task_id=${message.payload.task_id} status=${message.payload.status}`);\n logTrace(TAG, `\u2192 callback ${peer} result: ${String(message.payload.result_summary ?? \"\").slice(0, 200)}`);\n const payload: Record<string, unknown> = { task_id: message.payload.task_id, status: message.payload.status, result_summary: message.payload.result_summary, error: message.payload.error };\n if (message.payload.artifacts) payload.artifacts = message.payload.artifacts;\n\n // #972: Push via WS if connected\n const ws = this.wsClients.get(peer);\n if (ws?.connected) {\n await ws.send(\"callback\", payload);\n logInfo(TAG, `CALLBACK ${peer} (ws) task_id=${message.payload.task_id}`);\n return;\n }\n\n const body = JSON.stringify(payload);\n return this.httpCall(entry, peer, \"POST\", \"/v1/callbacks\", body);\n }\n if (message.type === \"task\") return this.delegateTask(peer, message.payload.goal as string, message.payload as any);\n if (message.type === \"check\") return this.checkTask(peer, message.payload.taskId as number);\n if (message.type === \"terminate\") return this.terminateTask(peer, message.payload.taskId as number);\n throw new Error(`Unknown message type: ${message.type}`);\n }\n\n async broadcast(message: PeerMessage): Promise<void> {\n const peers = this.discover();\n await Promise.allSettled(peers.map(p => this.send(p.name, message)));\n }\n\n onMessage(handler: (from: string, message: PeerMessage) => void): void {\n this.handlers.push(handler);\n }\n\n /** Called by agent-api-server when an inbound peer message arrives. */\n dispatchInbound(from: string, message: PeerMessage): void {\n for (const h of this.handlers) { try { h(from, message); } catch {} }\n }\n\n async delegateTask(peer: string, goal: string, opts?: { priority?: string; context?: string; artifacts?: Array<{ name: string; content: string }> }): Promise<{ taskId: number; remoteSessionId?: string }> {\n const config = loadPeerConfig();\n const entry = resolvePeer(config.peers, peer);\n\n // Callback: remote peer looks us up in its peers.json by name\n\n logDebug(TAG, `\u2192 peer_delegate ${peer}: priority=${opts?.priority ?? \"MEDIUM\"}, goal=${goal.length}ch`);\n logTrace(TAG, `\u2192 peer_delegate ${peer} goal: ${goal.slice(0, 300)}`);\n\n // Size guard for artifacts (#928)\n if (opts?.artifacts?.length) {\n const MAX_SINGLE = 1_400_000; // 1.4MB base64 per artifact\n const MAX_TOTAL = 5_000_000; // 5MB total\n let total = 0;\n for (const a of opts.artifacts) {\n if (a.content.length > MAX_SINGLE) throw new Error(`Artifact '${a.name}' exceeds 1.4MB limit (${a.content.length} bytes)`);\n total += a.content.length;\n }\n if (total > MAX_TOTAL) throw new Error(`Total artifacts exceed 5MB limit (${total} bytes)`);\n }\n\n const payload: Record<string, unknown> = { goal, priority: opts?.priority ?? \"MEDIUM\", context: opts?.context, callback_peer: config.self.name };\n if (opts?.artifacts?.length) payload.artifacts = opts.artifacts;\n\n // #972: Route via WS if connected, otherwise HTTP\n const ws = this.wsClients.get(peer);\n if (ws?.connected) {\n const result = await ws.send(\"delegate\", payload) as any;\n logInfo(TAG, `PEER_DELEGATE ${peer} (ws) \u2192 remote#${result.taskId} (${goal.length}ch)`);\n return { taskId: result.taskId, remoteSessionId: result.session_id };\n }\n\n const body = JSON.stringify(payload);\n const response = await this.httpCall(entry, peer, \"POST\", \"/v1/tasks\", body);\n const parsed = JSON.parse(response);\n logInfo(TAG, `PEER_DELEGATE ${peer} \u2192 remote#${parsed.task_id} (${goal.length}ch)`);\n return { taskId: parsed.task_id, remoteSessionId: parsed.session_id };\n }\n\n async checkTask(peer: string, taskId: number): Promise<TaskResult> {\n const config = loadPeerConfig();\n const entry = resolvePeer(config.peers, peer);\n logDebug(TAG, `\u2192 peer_check ${peer}#${taskId}`);\n const response = await this.httpCall(entry, peer, \"GET\", `/v1/tasks/${taskId}`);\n const parsed = JSON.parse(response);\n logDebug(TAG, `\u2190 peer_check ${peer}#${taskId}: status=${parsed.status}`);\n logTrace(TAG, `\u2190 peer_check ${peer}#${taskId} result: ${(parsed.result_summary ?? \"\").slice(0, 200)}`);\n return {\n taskId: parsed.id ?? taskId,\n status: parsed.status,\n result: parsed.result_summary,\n error: parsed.error,\n tokensUsed: parsed.tokens_used,\n };\n }\n\n async terminateTask(peer: string, taskId: number): Promise<void> {\n const config = loadPeerConfig();\n const entry = resolvePeer(config.peers, peer);\n logDebug(TAG, `\u2192 peer_terminate ${peer}#${taskId}`);\n await this.httpCall(entry, peer, \"DELETE\", `/v1/tasks/${taskId}`);\n logInfo(TAG, `PEER_TERMINATE ${peer}#${taskId}`);\n }\n\n /** #949: Push a channel message to a remote peer. */\n async pushChannelMessage(peer: string, cardId: number, from: string, message: string, createdAt: string): Promise<void> {\n const config = loadPeerConfig();\n const entry = resolvePeer(config.peers, peer);\n await this.httpCall(entry, peer, \"POST\", `/v1/tasks/${cardId}/messages`, JSON.stringify({ from_agent: from, message, created_at: createdAt }));\n }\n\n private async httpCall(entry: PeerEntry, peerName: string, method: string, path: string, body?: string): Promise<string> {\n const { signRequest, verifyServerCert } = await import(\"./peer-auth.js\");\n const { loadPeerConfig } = await import(\"../peer-config.js\");\n const config = loadPeerConfig();\n\n if (!entry.verifyKey) {\n throw new Error(`Peer ${peerName} has no verifyKey \u2014 enroll first before calling`);\n }\n\n const bodyStr = body ?? \"\";\n const sigHeaders = signRequest(method, path, bodyStr, config.self.signingKey, config.self.name);\n\n const http = await import(\"node:https\");\n\n return new Promise((resolve, reject) => {\n const headers: Record<string, string> = {\n ...sigHeaders,\n \"Content-Type\": \"application/json\",\n };\n if (body) headers[\"Content-Length\"] = String(Buffer.byteLength(body));\n\n const req = http.request({\n hostname: entry.host,\n port: entry.port,\n path,\n method,\n headers,\n timeout: 60_000,\n minVersion: \"TLSv1.3\" as const,\n rejectUnauthorized: true,\n checkServerIdentity: (_host: string, cert: { raw?: Buffer }) => {\n if (!cert.raw) return new Error(\"No cert presented by peer\");\n try {\n const { createPublicKey } = require(\"node:crypto\") as typeof import(\"node:crypto\");\n const keyObj = createPublicKey({ key: cert.raw, format: \"der\", type: \"spki\" });\n const certPem = keyObj.export({ type: \"spki\", format: \"pem\" }) as string;\n // Reconstruct as X.509 for verifyServerCert: use the raw DER cert to build PEM\n const certDerB64 = cert.raw.toString(\"base64\");\n const certPemBlock = `-----BEGIN CERTIFICATE-----\\n${certDerB64.match(/.{1,64}/g)!.join(\"\\n\")}\\n-----END CERTIFICATE-----\\n`;\n if (!verifyServerCert(certPemBlock, entry.verifyKey)) {\n return new Error(`Peer ${peerName} cert key does not match enrolled verifyKey`);\n }\n } catch (e) {\n return new Error(`Cert verify error: ${e instanceof Error ? e.message : String(e)}`);\n }\n return undefined;\n },\n } as any, (res: any) => {\n let data = \"\";\n res.on(\"data\", (c: any) => data += c);\n res.on(\"end\", () => {\n if (res.statusCode >= 400) {\n reject(new Error(`Peer ${peerName} returned ${res.statusCode}: ${data.slice(0, 200)}`));\n return;\n }\n resolve(data);\n });\n });\n req.on(\"timeout\", () => { req.destroy(); reject(new Error(`Peer ${peerName} timeout`)); });\n req.on(\"error\", (err: Error) => reject(new Error(`Peer ${peerName} unreachable: ${err.message}`)));\n if (body) req.write(body);\n req.end();\n });\n }\n}\n\nfunction resolvePeer(peers: Record<string, PeerEntry>, name: string): PeerEntry {\n const key = Object.keys(peers).find(k => k.toLowerCase() === name.toLowerCase());\n if (!key || !peers[key]) throw new Error(`Unknown peer '${name}'. Available: ${Object.keys(peers).join(\", \")}`);\n return peers[key];\n}\n", "/**\n * peer-transport/index.ts \u2014 Factory + singleton (#911).\n */\n\nexport type { PeerTransport, PeerCard, PeerMessage, TaskResult, PeerHealth } from \"./interface.js\";\nexport { HttpTransport } from \"./http-transport.js\";\nexport { startGossipListener, gossipBroadcast, getAlivePeers, getPeerTable, setGossipInterval, stopGossipListener } from \"./gossip.js\";\n\nimport { HttpTransport } from \"./http-transport.js\";\nimport type { PeerTransport } from \"./interface.js\";\n\nlet _instance: PeerTransport | null = null;\n\n/** Get the singleton PeerTransport instance. */\nexport function getPeerTransport(): PeerTransport {\n if (!_instance) _instance = new HttpTransport();\n return _instance;\n}\n\n/** Initialize peer transport + WS outbound connections. Call at boot. */\nexport async function initPeerTransport(): Promise<void> {\n const transport = getPeerTransport() as HttpTransport;\n await transport.initWsConnections();\n}\n", "/**\n * gossip.ts \u2014 Peer health gossip (#971, #1293).\n *\n * Each peer broadcasts liveness + load + capabilities every 60s via UDP.\n * All peers maintain a live peer table (Map with 3\u00D7 TTL).\n * Orc reads this table for intelligent routing.\n *\n * #1293: Packet auth changed from HMAC-SHA256 to Ed25519 signatures.\n * gossipSecret / token removed. Packet format:\n * payloadJson + \"|\" + base64(sign(privKey, \"abtars-gossip-v1\\n\" + payloadJson))\n */\n\nimport { createSocket, type Socket } from \"node:dgram\";\nimport { execSync } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { cpus, loadavg } from \"node:os\";\nimport { loadPeerConfig } from \"../peer-config.js\";\nimport { logInfo, logDebug, logWarn, logTrace } from \"../logger.js\";\n\nconst TAG = \"gossip\";\nconst GOSSIP_PORT = parseInt(process.env[\"GOSSIP_PORT\"] ?? \"5355\", 10);\nconst BROADCAST_INTERVAL_MS = 60_000;\nconst TTL_MS = 180_000; // 3 missed broadcasts \u2192 dead\n\nexport interface PeerHealth {\n name: string;\n lastSeen: number;\n load: number;\n sessions: number;\n capabilities: string[];\n version: string;\n alive: boolean;\n host: string;\n port: number;\n}\n\nconst peerTable = new Map<string, PeerHealth>();\nlet _socket: Socket | null = null;\nlet _interval: ReturnType<typeof setInterval> | null = null;\nlet _capabilities: string[] = [];\n\n/** Auto-discover this peer's capabilities at boot. */\nfunction discoverCapabilities(): string[] {\n const caps: string[] = [\"bash\", \"node\", \"memory\"];\n try { if (execSync(\"which docker\", { stdio: \"pipe\" }).toString().trim()) caps.push(\"docker\"); } catch {}\n try { if (execSync(\"which xcodebuild\", { stdio: \"pipe\" }).toString().trim()) caps.push(\"xcode\"); } catch {}\n try { if (execSync(\"which ollama\", { stdio: \"pipe\" }).toString().trim()) caps.push(\"ollama\"); } catch {}\n if (existsSync(\"/usr/bin/nvidia-smi\") || process.env[\"CUDA_VISIBLE_DEVICES\"]) caps.push(\"gpu\");\n if (process.env[\"BROWSER_ENGINE\"]) caps.push(\"browser\");\n if (process.env[\"GROQ_API_KEY\"]) caps.push(\"stt\");\n return caps;\n}\n\n/** Get normalized system load (0-1). */\nfunction getLoad(): number {\n const cores = cpus().length || 1;\n return Math.min(1, loadavg()[0]! / cores);\n}\n\n/** Build the gossip packet (Ed25519 signed). */\nfunction buildPacket(): Buffer {\n const config = loadPeerConfig();\n const payload = JSON.stringify({\n name: config.self.name,\n ts: Math.floor(Date.now() / 1000),\n load: Math.round(getLoad() * 100) / 100,\n sessions: parseInt(process.env[\"_ACTIVE_SESSIONS\"] ?? \"0\", 10),\n capabilities: _capabilities,\n version: process.env[\"npm_package_version\"] ?? \"?\",\n });\n // Sign with Ed25519 identity key\n const { sign: cryptoSign } = require(\"node:crypto\") as typeof import(\"node:crypto\");\n const { createPrivateKey } = require(\"node:crypto\") as typeof import(\"node:crypto\");\n const privKey = createPrivateKey({ key: Buffer.from(config.self.signingKey, \"base64\"), format: \"der\", type: \"pkcs8\" });\n const canonical = `abtars-gossip-v1\\n${payload}`;\n const sig = cryptoSign(null, Buffer.from(canonical, \"utf-8\"), privKey).toString(\"base64\");\n return Buffer.from(`${payload}|${sig}`);\n}\n\n/** Verify incoming Ed25519-signed gossip packet. */\nfunction verifyPacket(data: Buffer): Record<string, unknown> | null {\n const str = data.toString(\"utf8\");\n const sepIdx = str.lastIndexOf(\"|\");\n if (sepIdx < 0) return null;\n const payload = str.slice(0, sepIdx);\n const sigBase64 = str.slice(sepIdx + 1);\n\n // Parse name from payload to look up verifyKey\n let parsed: Record<string, unknown>;\n try { parsed = JSON.parse(payload); } catch { return null; }\n if (typeof parsed.name !== \"string\") return null;\n\n const config = loadPeerConfig();\n const name = parsed.name as string;\n\n // Ignore our own gossip\n if (name === config.self.name) return null;\n\n const peerEntry = config.peers[name];\n if (!peerEntry?.verifyKey) {\n logTrace(TAG, `Gossip from unknown peer '${name}' \u2014 dropped`);\n return null;\n }\n\n const { verify: cryptoVerify } = require(\"node:crypto\") as typeof import(\"node:crypto\");\n const { createPublicKey } = require(\"node:crypto\") as typeof import(\"node:crypto\");\n try {\n const pubKey = createPublicKey({ key: Buffer.from(peerEntry.verifyKey, \"base64\"), format: \"der\", type: \"spki\" });\n const canonical = `abtars-gossip-v1\\n${payload}`;\n const ok = cryptoVerify(null, Buffer.from(canonical, \"utf-8\"), pubKey, Buffer.from(sigBase64, \"base64\"));\n if (!ok) { logWarn(TAG, `Gossip from ${name}: bad Ed25519 signature \u2014 dropped`); return null; }\n } catch {\n return null;\n }\n\n return parsed;\n}\n\n/** Broadcast to all known peers. */\nfunction broadcast(): void {\n const config = loadPeerConfig();\n const packet = buildPacket();\n for (const [name, entry] of Object.entries(config.peers)) {\n _socket?.send(packet, 0, packet.length, GOSSIP_PORT, entry.host, (err) => {\n if (err) logTrace(TAG, `Send to ${name} (${entry.host}:${GOSSIP_PORT}) failed: ${err.message}`);\n });\n }\n logTrace(TAG, `Broadcast to ${Object.keys(config.peers).length} peer(s)`);\n // Record broadcast time for /status + /doctor gossip freshness (#1211).\n try {\n const { updateBridgeLockField } = require(\"../transport/bridge-lock-transport.js\") as typeof import(\"../transport/bridge-lock-transport.js\");\n updateBridgeLockField(\"lastGossipBroadcast\", Date.now());\n } catch { /* lock unavailable \u2014 non-fatal */ }\n // Expire stale entries\n const now = Date.now();\n for (const [, health] of peerTable) {\n const wasAlive = health.alive;\n health.alive = (now - health.lastSeen) < TTL_MS;\n if (wasAlive && !health.alive) logDebug(TAG, `PEER_OFFLINE ${health.name} (no heartbeat for ${Math.round((now - health.lastSeen) / 1000)}s)`);\n }\n}\n\n/** Start gossip system. */\nexport function startGossip(): void {\n _capabilities = discoverCapabilities();\n logInfo(TAG, `Capabilities: [${_capabilities.join(\", \")}]`);\n\n _socket = createSocket(\"udp4\");\n _socket.on(\"message\", (msg, rinfo) => {\n const parsed = verifyPacket(msg);\n if (!parsed || typeof parsed.name !== \"string\") return;\n const name = parsed.name as string;\n const config = loadPeerConfig();\n\n if (name === config.self.name) return; // ignore own echo\n\n const existing = peerTable.get(name);\n const health: PeerHealth = {\n name,\n lastSeen: Date.now(),\n load: (parsed.load as number) ?? 0,\n sessions: (parsed.sessions as number) ?? 0,\n capabilities: (parsed.capabilities as string[]) ?? [],\n version: (parsed.version as string) ?? \"?\",\n alive: true,\n host: rinfo.address,\n port: rinfo.port,\n };\n peerTable.set(name, health);\n if (!existing) logDebug(TAG, `PEER_ONLINE ${name} [${health.capabilities.join(\",\")}] v${health.version}`);\n else if (!existing.alive) logDebug(TAG, `PEER_ONLINE ${name} returned [${health.capabilities.join(\",\")}] v${health.version}`);\n });\n\n _socket.on(\"error\", (err) => { logWarn(TAG, `Socket error: ${err.message}`); });\n _socket.bind(GOSSIP_PORT, \"0.0.0.0\", () => {\n logInfo(TAG, `Listening on UDP :${GOSSIP_PORT}`);\n });\n\n // Broadcast immediately, then every 60s\n setTimeout(broadcast, 2000);\n _interval = setInterval(broadcast, BROADCAST_INTERVAL_MS);\n}\n\n/** Stop gossip. */\nexport function stopGossip(): void {\n if (_interval) { clearInterval(_interval); _interval = null; }\n if (_socket) { _socket.close(); _socket = null; }\n}\n\n/** Get live peer table (alive peers only unless includeAll). Also marks ws-outbound peers as alive if WS is connected. */\nexport function getPeerTable(includeAll = false): PeerHealth[] {\n const now = Date.now();\n\n // Mark ws-outbound peers as alive if they have a live WS connection (even without gossip)\n try {\n const { getPeerTransport } = require(\"./index.js\") as typeof import(\"./index.js\");\n const transport = getPeerTransport() as import(\"./http-transport.js\").HttpTransport;\n const { loadPeerConfig } = require(\"../peer-config.js\") as typeof import(\"../peer-config.js\");\n const config = loadPeerConfig();\n for (const [name, entry] of Object.entries(config.peers)) {\n if (entry.transport === \"ws-outbound\" && typeof transport.hasWsConnection === \"function\" && transport.hasWsConnection(name)) {\n const existing = peerTable.get(name);\n if (!existing) {\n peerTable.set(name, {\n name,\n lastSeen: now,\n load: 0,\n sessions: 0,\n capabilities: [],\n version: \"?\",\n alive: true,\n host: entry.host,\n port: entry.port,\n });\n } else {\n existing.lastSeen = now;\n existing.alive = true;\n }\n }\n }\n } catch { /* best effort \u2014 transport may not be up */ }\n\n const results: PeerHealth[] = [];\n for (const health of peerTable.values()) {\n health.alive = (now - health.lastSeen) < TTL_MS;\n if (includeAll || health.alive) results.push(health);\n }\n return results;\n}\n\n/** Get this peer's capabilities. */\nexport function getLocalCapabilities(): string[] { return _capabilities; }\n\n/** Find best peer matching required capabilities, sorted by load. */\nexport function findCapablePeer(requires: string[]): PeerHealth | null {\n const alive = getPeerTable().filter(p =>\n requires.every(req => p.capabilities.includes(req))\n );\n if (alive.length === 0) return null;\n alive.sort((a, b) => a.load - b.load);\n return alive[0]!;\n}\n\n/** Alias for boot compatibility. */\nexport const startGossipListener = startGossip;\n\n/** Alias for http-transport compatibility. */\nexport const getAlivePeers = getPeerTable;\n\n/** Alias for phase-heartbeat compatibility. */\nexport const gossipBroadcast = broadcast;\n\n/** Alias: update broadcast interval (resets the internal timer). */\nexport function setGossipInterval(ms: number): void {\n if (_interval) { clearInterval(_interval); _interval = setInterval(broadcast, ms); }\n}\n\n/** Alias for stopGossip. */\nexport const stopGossipListener = stopGossip;\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["loadPeerConfig", "TAG", "getPeerTransport", "loadPeerConfig"]
|
|
7
|
+
}
|