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
package/bundle/public/index.html
DELETED
|
@@ -1,180 +0,0 @@
|
|
|
1
|
-
<!DOCTYPE html>
|
|
2
|
-
<html lang="en">
|
|
3
|
-
<head>
|
|
4
|
-
<meta charset="UTF-8">
|
|
5
|
-
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
-
<title>abTARS Dashboard</title>
|
|
7
|
-
<link rel="stylesheet" href="/css/dashboard.css">
|
|
8
|
-
</head>
|
|
9
|
-
<body data-has-agent-api="false" data-agent-api-port="">
|
|
10
|
-
<header>
|
|
11
|
-
<img src="/assets/logo.png" alt="" onerror="this.style.display='none'">
|
|
12
|
-
<h1>abTARS Dashboard</h1>
|
|
13
|
-
</header>
|
|
14
|
-
<div id="connection-banner" class="connection-banner" style="display:none;">
|
|
15
|
-
Connection lost. Reconnecting<span id="reconnect-dots">...</span>
|
|
16
|
-
</div>
|
|
17
|
-
<main class="grid">
|
|
18
|
-
|
|
19
|
-
<!-- Bridge Health -->
|
|
20
|
-
<div class="card card-split" id="card-health">
|
|
21
|
-
<div class="split-top">
|
|
22
|
-
<h2>Bridge Health</h2>
|
|
23
|
-
<div class="stat-row"><span class="stat-label">Version</span><span class="stat-value" id="health-version">—</span></div>
|
|
24
|
-
<div class="stat-row"><span class="stat-label">Uptime</span><span class="stat-value" id="health-uptime">—</span></div>
|
|
25
|
-
<div class="stat-row"><span class="stat-label">Model</span><span class="stat-value" id="health-model">—</span></div>
|
|
26
|
-
<div class="stat-row"><span class="stat-label">Enabled Platforms</span><span class="stat-value" id="health-platforms">—</span></div>
|
|
27
|
-
<div class="stat-row"><span class="stat-label">Heartbeat</span><span class="stat-value" id="hb-status">—</span></div>
|
|
28
|
-
<div id="hb-tasks" style="margin-top:6px;"></div>
|
|
29
|
-
<div class="stat-row"><span class="stat-label">Last Update</span><span class="stat-value" id="health-timestamp">—</span></div>
|
|
30
|
-
</div>
|
|
31
|
-
<hr class="split-divider">
|
|
32
|
-
<div class="split-bottom">
|
|
33
|
-
<h2>Transport</h2>
|
|
34
|
-
<div class="stat-row"><span class="stat-label">Type</span><span class="stat-value" id="transport-type">—</span></div>
|
|
35
|
-
<div class="stat-row"><span class="stat-label">Connection</span><span class="stat-value" id="transport-state"><span class="indicator red"></span> disconnected</span></div>
|
|
36
|
-
<div style="margin-top:10px;">
|
|
37
|
-
<span class="stat-label">Context Window</span>
|
|
38
|
-
<div class="progress-bar-bg"><div class="progress-bar-fill" id="transport-ctx-bar" style="width:0%"></div></div>
|
|
39
|
-
<div style="text-align:right;font-size:0.75rem;color:#9e9e9e;margin-top:2px;"><span id="transport-ctx-pct">—</span></div>
|
|
40
|
-
</div>
|
|
41
|
-
</div>
|
|
42
|
-
</div>
|
|
43
|
-
|
|
44
|
-
<!-- Subsystem Health Grid -->
|
|
45
|
-
<div class="card" id="card-subsystems">
|
|
46
|
-
<h2>🏥 Subsystems</h2>
|
|
47
|
-
<div id="subsystem-grid" style="font-size:0.82rem;line-height:1.8;font-family:monospace;"></div>
|
|
48
|
-
<hr style="border-color:#0f3460;margin:12px 0;">
|
|
49
|
-
<div style="display:flex;gap:8px;flex-wrap:wrap;">
|
|
50
|
-
<button class="btn-search-toggle" data-action="toggle-overlay" data-target="log-overlay">📋 Log</button>
|
|
51
|
-
</div>
|
|
52
|
-
<hr style="border-color:#0f3460;margin:12px 0;">
|
|
53
|
-
<h2>Memory</h2>
|
|
54
|
-
<div id="memory-stats">
|
|
55
|
-
<div class="stat-row"><span class="stat-label">Status</span><span class="stat-value" id="mem-status">—</span></div>
|
|
56
|
-
<div class="stat-row"><span class="stat-label">Messages</span><span class="stat-value" id="mem-messages">—</span></div>
|
|
57
|
-
<div class="stat-row"><span class="stat-label">Extracted</span><span class="stat-value" id="mem-extracted">—</span></div>
|
|
58
|
-
<div class="stat-row"><span class="stat-label">Consolidations (D/W/Q)</span><span class="stat-value" id="mem-consolidations">—</span></div>
|
|
59
|
-
<div class="stat-row"><span class="stat-label">Documents</span><span class="stat-value" id="mem-documents">—</span></div>
|
|
60
|
-
<div class="stat-row"><span class="stat-label">DB Size</span><span class="stat-value" id="mem-dbsize">—</span></div>
|
|
61
|
-
</div>
|
|
62
|
-
<hr style="border-color:#0f3460;margin:12px 0;">
|
|
63
|
-
<div style="display:flex;gap:8px;flex-wrap:wrap;">
|
|
64
|
-
<button class="btn-search-toggle" data-action="load-universe">🌌 Universe</button>
|
|
65
|
-
<button class="btn-search-toggle" data-action="toggle-overlay" data-target="search-overlay">🔍 Search</button>
|
|
66
|
-
</div>
|
|
67
|
-
</div>
|
|
68
|
-
|
|
69
|
-
<!-- Platforms -->
|
|
70
|
-
<div class="card" id="card-platforms">
|
|
71
|
-
<h2>Platforms</h2>
|
|
72
|
-
<div class="platform-group">
|
|
73
|
-
<h3>Access Interfaces</h3>
|
|
74
|
-
<div class="platform-item" id="plat-telegram">
|
|
75
|
-
<span class="name">Telegram</span>
|
|
76
|
-
<span>
|
|
77
|
-
<span class="badge disabled" id="plat-telegram-badge">—</span>
|
|
78
|
-
<button class="btn-start" data-action="toggle-platform" data-name="telegram" data-op="start" id="plat-telegram-start">Start</button>
|
|
79
|
-
<button class="btn-stop" data-action="toggle-platform" data-name="telegram" data-op="stop" id="plat-telegram-stop">Stop</button>
|
|
80
|
-
</span>
|
|
81
|
-
</div>
|
|
82
|
-
<div class="platform-item" id="plat-discord">
|
|
83
|
-
<span class="name">Discord</span>
|
|
84
|
-
<span>
|
|
85
|
-
<span class="badge disabled" id="plat-discord-badge">—</span>
|
|
86
|
-
<button class="btn-start" data-action="toggle-platform" data-name="discord" data-op="start" id="plat-discord-start">Start</button>
|
|
87
|
-
<button class="btn-stop" data-action="toggle-platform" data-name="discord" data-op="stop" id="plat-discord-stop">Stop</button>
|
|
88
|
-
</span>
|
|
89
|
-
</div>
|
|
90
|
-
<div class="platform-item" id="plat-agent-api" style="display:none;">
|
|
91
|
-
<span class="name">Agent A2A</span>
|
|
92
|
-
<span>
|
|
93
|
-
<span class="badge disabled clickable" id="plat-agent-api-badge" data-action="toggle-a2a-panel">—</span>
|
|
94
|
-
<button class="btn-start" data-action="toggle-platform" data-name="agent-api" data-op="start" id="plat-agent-api-start">Start</button>
|
|
95
|
-
<button class="btn-stop" data-action="toggle-platform" data-name="agent-api" data-op="stop" id="plat-agent-api-stop">Stop</button>
|
|
96
|
-
</span>
|
|
97
|
-
</div>
|
|
98
|
-
</div>
|
|
99
|
-
<div class="platform-group">
|
|
100
|
-
<h3>External Tooling</h3>
|
|
101
|
-
<div class="platform-item"><span class="name">Gmail (gws)</span><span><span class="badge disabled" id="auth-gws">—</span></span></div>
|
|
102
|
-
<div class="platform-item" id="plat-nlm"><span class="name">LM Notebook</span><span><span class="badge disabled" id="auth-nlm">—</span></span></div>
|
|
103
|
-
</div>
|
|
104
|
-
</div>
|
|
105
|
-
|
|
106
|
-
<!-- Scheduled Tasks (4th column) -->
|
|
107
|
-
<div class="card" id="card-cron">
|
|
108
|
-
<h2>Scheduled Tasks</h2>
|
|
109
|
-
<div id="cron-entries"><div style="color:#666;font-size:0.82rem;">Loading...</div></div>
|
|
110
|
-
</div>
|
|
111
|
-
|
|
112
|
-
</main>
|
|
113
|
-
|
|
114
|
-
<!-- Log Overlay -->
|
|
115
|
-
<div id="log-overlay" class="overlay-panel" style="display:none;">
|
|
116
|
-
<div class="overlay-header">
|
|
117
|
-
<h2>📋 Log</h2>
|
|
118
|
-
<button class="btn-close-overlay" data-action="toggle-overlay" data-target="log-overlay">✕</button>
|
|
119
|
-
</div>
|
|
120
|
-
<div class="overlay-body" style="flex-direction:column;">
|
|
121
|
-
<div style="display:flex;gap:6px;margin-bottom:8px;">
|
|
122
|
-
<button class="log-level-btn lvl-info active" data-action="toggle-log-level" data-level="info">info</button>
|
|
123
|
-
<button class="log-level-btn lvl-warn active" data-action="toggle-log-level" data-level="warn">warn</button>
|
|
124
|
-
<button class="log-level-btn lvl-error active" data-action="toggle-log-level" data-level="error">error</button>
|
|
125
|
-
<button class="log-level-btn lvl-debug" data-action="toggle-log-level" data-level="debug">debug</button>
|
|
126
|
-
</div>
|
|
127
|
-
<div id="log-entries" style="flex:1;overflow-y:auto;font-size:0.88rem;font-family:monospace;line-height:1.6;"></div>
|
|
128
|
-
</div>
|
|
129
|
-
</div>
|
|
130
|
-
|
|
131
|
-
<!-- Search Overlay -->
|
|
132
|
-
<div id="search-overlay" class="overlay-panel" style="display:none;">
|
|
133
|
-
<div class="overlay-header">
|
|
134
|
-
<h2>🔍 Memory Search</h2>
|
|
135
|
-
<button class="btn-close-overlay" data-action="toggle-overlay" data-target="search-overlay">✕</button>
|
|
136
|
-
</div>
|
|
137
|
-
<div class="overlay-body">
|
|
138
|
-
<div class="search-panel-row">
|
|
139
|
-
<div class="search-box" style="margin:0;">
|
|
140
|
-
<input type="text" id="mem-userid-input" placeholder="all users" style="width:100px;text-align:center;flex:none;">
|
|
141
|
-
<button data-action="list-chat-ids">LIST</button>
|
|
142
|
-
</div>
|
|
143
|
-
<div class="layer-toggles" id="layer-toggles" style="margin:0;">
|
|
144
|
-
<button class="layer-btn active" data-layer="S1" data-action="toggle-layer">S1:en-fts</button>
|
|
145
|
-
<button class="layer-btn active" data-layer="S2" data-action="toggle-layer">S2:orig-fts</button>
|
|
146
|
-
<button class="layer-btn active" data-layer="S3" data-action="toggle-layer">S3:like</button>
|
|
147
|
-
<button class="layer-btn active" data-layer="S4" data-action="toggle-layer">S4:msg-fts</button>
|
|
148
|
-
<button class="layer-btn active" data-layer="S5" data-action="toggle-layer">S5:msg-like</button>
|
|
149
|
-
<button class="layer-btn active" data-layer="S6" data-action="toggle-layer">S6:consol</button>
|
|
150
|
-
<button class="layer-btn active" data-layer="S7" data-action="toggle-layer">S7:fallback</button>
|
|
151
|
-
<button class="layer-btn active" data-layer="Se" data-action="toggle-layer">Se:embed</button>
|
|
152
|
-
<button class="layer-btn" data-layer="NLM" data-action="toggle-layer">NLM</button>
|
|
153
|
-
</div>
|
|
154
|
-
</div>
|
|
155
|
-
<div class="search-panel-row" style="margin-top:8px;">
|
|
156
|
-
<button class="layer-btn active" id="mode-toggle" data-action="toggle-search-mode" style="min-width:42px;">OR</button>
|
|
157
|
-
<input type="text" id="mem-keyword-input" class="keyword-input" placeholder="Type keyword + Enter to add filter...">
|
|
158
|
-
<input type="text" id="mem-entity-input" placeholder="Entity filter" style="width:120px;flex:none;">
|
|
159
|
-
<button class="btn-search" data-action="search-memory">Search</button>
|
|
160
|
-
</div>
|
|
161
|
-
<div id="keyword-filters" class="keyword-filters"></div>
|
|
162
|
-
<div class="search-results" id="mem-search-results"></div>
|
|
163
|
-
</div>
|
|
164
|
-
</div>
|
|
165
|
-
|
|
166
|
-
<!-- A2A Panel -->
|
|
167
|
-
<div id="a2a-panel" class="a2a-panel" style="display:none;">
|
|
168
|
-
<div class="a2a-header">
|
|
169
|
-
<h3>🔗 A2A Traffic — abTARS ↔ Agents</h3>
|
|
170
|
-
<span class="a2a-count" id="a2a-count"></span>
|
|
171
|
-
</div>
|
|
172
|
-
<div class="a2a-entries" id="a2a-entries">
|
|
173
|
-
<div class="a2a-empty">No traffic yet. Waiting for agent requests...</div>
|
|
174
|
-
</div>
|
|
175
|
-
</div>
|
|
176
|
-
|
|
177
|
-
<script src="/memory-universe.js"></script>
|
|
178
|
-
<script type="module" src="/js/app.js"></script>
|
|
179
|
-
</body>
|
|
180
|
-
</html>
|
package/bundle/public/js/app.js
DELETED
|
@@ -1,437 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* app.js — Dashboard entry point (ES module).
|
|
3
|
-
* Sets up auth, WebSocket, event delegation, and card updates.
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
// ── Auth ─────────────────────────────────────────────────────────────────────
|
|
7
|
-
let token = sessionStorage.getItem("dashboard_token");
|
|
8
|
-
if (!token) {
|
|
9
|
-
token = new URLSearchParams(location.search).get("token") || prompt("Enter dashboard auth token:");
|
|
10
|
-
if (token) sessionStorage.setItem("dashboard_token", token);
|
|
11
|
-
}
|
|
12
|
-
if (!token) {
|
|
13
|
-
document.body.innerHTML = '<div style="text-align:center;padding:60px;color:#f44336;">Authentication token required. Reload to try again.</div>';
|
|
14
|
-
throw new Error("no token");
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
// ── Capability flags ─────────────────────────────────────────────────────────
|
|
18
|
-
const body = document.body;
|
|
19
|
-
if (body.dataset.hasAgentApi === "true") {
|
|
20
|
-
const el = document.getElementById("plat-agent-api");
|
|
21
|
-
if (el) el.style.display = "";
|
|
22
|
-
const badge = document.getElementById("plat-agent-api-badge");
|
|
23
|
-
if (badge) badge.dataset.port = body.dataset.agentApiPort || "";
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
// ── Helpers ──────────────────────────────────────────────────────────────────
|
|
27
|
-
function formatBytes(bytes) {
|
|
28
|
-
if (bytes === 0) return "0 B";
|
|
29
|
-
const k = 1024, sizes = ["B", "KB", "MB", "GB"];
|
|
30
|
-
const i = Math.min(Math.floor(Math.log(bytes) / Math.log(k)), sizes.length - 1);
|
|
31
|
-
return (bytes / Math.pow(k, i)).toFixed(1) + " " + sizes[i];
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
function formatUptime(ms) {
|
|
35
|
-
const s = Math.floor(ms / 1000), h = Math.floor(s / 3600), m = Math.floor((s % 3600) / 60), sec = s % 60;
|
|
36
|
-
const parts = [];
|
|
37
|
-
if (h > 0) parts.push(h + "h");
|
|
38
|
-
if (m > 0) parts.push(m + "m");
|
|
39
|
-
if (sec > 0 || parts.length === 0) parts.push(sec + "s");
|
|
40
|
-
return parts.join(" ");
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
function setText(id, val) {
|
|
44
|
-
const el = document.getElementById(id);
|
|
45
|
-
if (el) el.textContent = val != null ? String(val) : "—";
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
function escHtml(str) {
|
|
49
|
-
const d = document.createElement("div");
|
|
50
|
-
d.textContent = str;
|
|
51
|
-
return d.innerHTML;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
function authHeaders() {
|
|
55
|
-
return { "Authorization": "Bearer " + token };
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
// ── WebSocket ────────────────────────────────────────────────────────────────
|
|
59
|
-
let ws = null, reconnectAttempt = 0, reconnectTimer = null;
|
|
60
|
-
const banner = document.getElementById("connection-banner");
|
|
61
|
-
|
|
62
|
-
function getReconnectDelay(attempt) {
|
|
63
|
-
return Math.min(1000 * Math.pow(2, attempt - 1), 30000);
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
function connect() {
|
|
67
|
-
const proto = location.protocol === "https:" ? "wss:" : "ws:";
|
|
68
|
-
ws = new WebSocket(proto + "//" + location.host + "/ws?token=" + encodeURIComponent(token));
|
|
69
|
-
ws.onopen = () => { reconnectAttempt = 0; banner.style.display = "none"; if (reconnectTimer) { clearTimeout(reconnectTimer); reconnectTimer = null; } };
|
|
70
|
-
ws.onmessage = (evt) => { try { updateDashboard(JSON.parse(evt.data)); } catch {} };
|
|
71
|
-
ws.onclose = () => scheduleReconnect();
|
|
72
|
-
ws.onerror = () => { if (ws) ws.close(); };
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
function scheduleReconnect() {
|
|
76
|
-
banner.style.display = "block";
|
|
77
|
-
reconnectAttempt++;
|
|
78
|
-
reconnectTimer = setTimeout(connect, getReconnectDelay(reconnectAttempt));
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
// ── Dashboard Update ─────────────────────────────────────────────────────────
|
|
82
|
-
function updateDashboard(snap) {
|
|
83
|
-
// Bridge Health
|
|
84
|
-
setText("health-uptime", formatUptime(snap.uptimeMs));
|
|
85
|
-
setText("health-timestamp", new Date(snap.timestamp).toLocaleTimeString());
|
|
86
|
-
setText("health-version", snap.version && snap.commit ? `v${snap.version} (${snap.commit})` : "—");
|
|
87
|
-
setText("health-model", snap.model ? `${snap.model.name} (${snap.model.provider})` : "—");
|
|
88
|
-
|
|
89
|
-
// Platforms
|
|
90
|
-
if (snap.services) {
|
|
91
|
-
updateServiceRow("telegram", snap.services.telegram);
|
|
92
|
-
updateServiceRow("discord", snap.services.discord);
|
|
93
|
-
updateServiceRow("agent-api", snap.services["agent-api"]);
|
|
94
|
-
const enabled = [];
|
|
95
|
-
if (snap.services.telegram?.running) enabled.push("Telegram");
|
|
96
|
-
if (snap.services.discord?.running) enabled.push("Discord");
|
|
97
|
-
setText("health-platforms", enabled.length > 0 ? enabled.join(", ") : "None");
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
// Transport
|
|
101
|
-
if (snap.transport) {
|
|
102
|
-
setText("transport-type", snap.transport.type || "—");
|
|
103
|
-
const stateEl = document.getElementById("transport-state");
|
|
104
|
-
if (stateEl) stateEl.innerHTML = snap.transport.ready
|
|
105
|
-
? '<span class="indicator green"></span> connected'
|
|
106
|
-
: '<span class="indicator red"></span> disconnected';
|
|
107
|
-
const pct = snap.transport.contextPercent;
|
|
108
|
-
const bar = document.getElementById("transport-ctx-bar");
|
|
109
|
-
if (bar) {
|
|
110
|
-
bar.style.width = pct >= 0 ? Math.min(pct, 100) + "%" : "0%";
|
|
111
|
-
bar.style.background = pct > 85 ? "#f44336" : pct > 60 ? "#ff9800" : "#4caf50";
|
|
112
|
-
}
|
|
113
|
-
setText("transport-ctx-pct", pct >= 0 ? pct + "%" : "N/A");
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
// Memory
|
|
117
|
-
if (snap.memory) {
|
|
118
|
-
const memStatus = document.getElementById("mem-status");
|
|
119
|
-
if (memStatus) {
|
|
120
|
-
memStatus.innerHTML = !snap.memory.enabled
|
|
121
|
-
? '<span class="indicator yellow"></span> disabled'
|
|
122
|
-
: snap.memory.error ? '<span class="indicator red"></span> error'
|
|
123
|
-
: '<span class="indicator green"></span> enabled';
|
|
124
|
-
}
|
|
125
|
-
if (snap.memory.stats) {
|
|
126
|
-
const s = snap.memory.stats;
|
|
127
|
-
setText("mem-messages", s.totalMessages);
|
|
128
|
-
setText("mem-extracted", s.extractedMemories);
|
|
129
|
-
setText("mem-consolidations", s.consolidationFiles.daily + " / " + s.consolidationFiles.weekly + " / " + s.consolidationFiles.quarterly);
|
|
130
|
-
setText("mem-documents", s.ingestedDocuments);
|
|
131
|
-
setText("mem-dbsize", formatBytes(s.dbSizeBytes));
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
// Auth indicators
|
|
136
|
-
const authGws = document.getElementById("auth-gws");
|
|
137
|
-
if (authGws) authGws.innerHTML = '<span class="auth-dot ' + (snap.gwsAuth ? "ok" : "no") + '"></span>' + (snap.gwsAuth ? "Authenticated" : "Not configured");
|
|
138
|
-
const authNlm = document.getElementById("auth-nlm");
|
|
139
|
-
if (authNlm) authNlm.innerHTML = '<span class="auth-dot ' + (snap.notebooklm?.enabled ? "ok" : "no") + '"></span>' + (snap.notebooklm?.enabled ? "Active" : "Disabled");
|
|
140
|
-
const authX = document.getElementById("auth-x");
|
|
141
|
-
if (authX) authX.innerHTML = '<span class="auth-dot ' + (snap.xAuth ? "ok" : "no") + '"></span>' + (snap.xAuth ? "Authenticated" : "No cookies");
|
|
142
|
-
|
|
143
|
-
// Heartbeat
|
|
144
|
-
if (snap.heartbeat) {
|
|
145
|
-
const hbEl = document.getElementById("hb-status");
|
|
146
|
-
if (hbEl) {
|
|
147
|
-
hbEl.innerHTML = snap.heartbeat.running
|
|
148
|
-
? '<span class="indicator green"></span> ' + (snap.heartbeat.intervalMs ? (snap.heartbeat.intervalMs / 1000) + "s" : "")
|
|
149
|
-
: '<span class="indicator red"></span> FAILED';
|
|
150
|
-
}
|
|
151
|
-
const hbTasks = document.getElementById("hb-tasks");
|
|
152
|
-
if (hbTasks && snap.heartbeat.taskNames) {
|
|
153
|
-
hbTasks.innerHTML = snap.heartbeat.taskNames.length === 0
|
|
154
|
-
? '<div style="color:#666;font-size:0.82rem;">No tasks registered</div>'
|
|
155
|
-
: snap.heartbeat.taskNames.map(name =>
|
|
156
|
-
'<div class="stat-row"><span class="stat-label">' + escHtml(name) + '</span><span class="stat-value"><span class="indicator ' + (snap.heartbeat.running ? "green" : "yellow") + '"></span></span></div>'
|
|
157
|
-
).join("");
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
// Cron
|
|
162
|
-
if (snap.cron) updateCronPanel(snap.cron);
|
|
163
|
-
|
|
164
|
-
// A2A
|
|
165
|
-
updateA2ATraffic(snap.agentApi);
|
|
166
|
-
|
|
167
|
-
// Subsystem health grid
|
|
168
|
-
if (snap.subsystems) updateSubsystemGrid(snap.subsystems);
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
function updateServiceRow(name, state) {
|
|
172
|
-
const badge = document.getElementById("plat-" + name + "-badge");
|
|
173
|
-
const btnStart = document.getElementById("plat-" + name + "-start");
|
|
174
|
-
const btnStop = document.getElementById("plat-" + name + "-stop");
|
|
175
|
-
if (!badge) return;
|
|
176
|
-
if (!state || !state.configured) {
|
|
177
|
-
badge.textContent = "not configured"; badge.className = "badge disabled";
|
|
178
|
-
if (btnStart) btnStart.disabled = true;
|
|
179
|
-
if (btnStop) btnStop.disabled = true;
|
|
180
|
-
return;
|
|
181
|
-
}
|
|
182
|
-
if (state.running) {
|
|
183
|
-
badge.textContent = name === "agent-api" ? "⚠️ " + (badge.dataset.port || "?") : "running";
|
|
184
|
-
badge.className = name === "agent-api" ? "badge running clickable" : "badge running";
|
|
185
|
-
if (btnStart) btnStart.disabled = true;
|
|
186
|
-
if (btnStop) btnStop.disabled = false;
|
|
187
|
-
} else {
|
|
188
|
-
badge.textContent = "stopped"; badge.className = "badge stopped";
|
|
189
|
-
if (btnStart) btnStart.disabled = false;
|
|
190
|
-
if (btnStop) btnStop.disabled = true;
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
// ── Cron Panel ───────────────────────────────────────────────────────────────
|
|
195
|
-
function updateCronPanel(entries) {
|
|
196
|
-
const container = document.getElementById("cron-entries");
|
|
197
|
-
if (!container) return;
|
|
198
|
-
if (!entries || entries.length === 0) {
|
|
199
|
-
container.innerHTML = '<div style="color:#666;font-size:0.82rem;">No scheduled tasks</div>';
|
|
200
|
-
return;
|
|
201
|
-
}
|
|
202
|
-
container.innerHTML = entries.map(e => {
|
|
203
|
-
const statusBadge = e.paused ? '<span class="badge paused">paused</span>' : '<span class="badge running">active</span>';
|
|
204
|
-
const priorityBadge = e.priority === "high" ? ' <span class="badge high">HIGH</span>' : e.priority === "low" ? ' <span class="badge low">LOW</span>' : "";
|
|
205
|
-
const nextFire = e.paused ? "—" : new Date(e.fireAt).toLocaleString();
|
|
206
|
-
const lastRan = e.lastRanAt ? new Date(e.lastRanAt).toLocaleString() : "never";
|
|
207
|
-
const pauseBtn = e.paused
|
|
208
|
-
? `<button class="btn-start" data-action="cron-action" data-id="${e.id}" data-op="resume">Resume</button>`
|
|
209
|
-
: `<button class="btn-stop" data-action="cron-action" data-id="${e.id}" data-op="pause">Pause</button>`;
|
|
210
|
-
return `<div class="cron-entry"><div class="cron-info"><div class="cron-label">${statusBadge}${priorityBadge} ${escHtml(e.label)}</div><div class="cron-meta">${escHtml(e.schedule)} · ${e.executor} · next: ${nextFire} · last: ${lastRan}</div></div><div class="cron-actions">${pauseBtn}<button class="btn-start" style="background:#0f3460;color:#a0c4ff;" data-action="cron-action" data-id="${e.id}" data-op="trigger">▶ Run</button></div></div>`;
|
|
211
|
-
}).join("");
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
// ── A2A Traffic ──────────────────────────────────────────────────────────────
|
|
215
|
-
let lastTrafficCount = 0;
|
|
216
|
-
|
|
217
|
-
function updateA2ATraffic(agentApi) {
|
|
218
|
-
if (!agentApi?.traffic) return;
|
|
219
|
-
const entries = agentApi.traffic;
|
|
220
|
-
if (entries.length === lastTrafficCount) return;
|
|
221
|
-
lastTrafficCount = entries.length;
|
|
222
|
-
setText("a2a-count", entries.length + " entries");
|
|
223
|
-
const container = document.getElementById("a2a-entries");
|
|
224
|
-
if (!container) return;
|
|
225
|
-
if (entries.length === 0) {
|
|
226
|
-
container.innerHTML = '<div class="a2a-empty">No traffic yet. Waiting for agent requests...</div>';
|
|
227
|
-
return;
|
|
228
|
-
}
|
|
229
|
-
container.innerHTML = entries.slice().reverse().map(e => {
|
|
230
|
-
const time = new Date(e.ts).toLocaleTimeString();
|
|
231
|
-
const epClass = e.endpoint === "prompt" ? "prompt" : e.endpoint === "reset" ? "reset" : "status";
|
|
232
|
-
let body = "";
|
|
233
|
-
if (e.endpoint === "prompt") {
|
|
234
|
-
body = '<div class="a2a-prompt">→ ' + escHtml(e.prompt) + "</div>";
|
|
235
|
-
if (e.response) body += '<div class="a2a-response">← ' + escHtml(e.response) + "</div>";
|
|
236
|
-
} else {
|
|
237
|
-
body = '<div class="a2a-response">' + escHtml(e.response || e.endpoint) + "</div>";
|
|
238
|
-
}
|
|
239
|
-
body += '<div class="a2a-meta">' + (e.ip || "—") + " · " + e.durationMs + "ms · " + e.status + "</div>";
|
|
240
|
-
return `<div class="a2a-entry"><span class="a2a-time">${time}</span><span class="a2a-endpoint ${epClass}">${e.endpoint}</span><div class="a2a-body">${body}</div></div>`;
|
|
241
|
-
}).join("");
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
// ── Log Panel ────────────────────────────────────────────────────────────────
|
|
245
|
-
const logLevels = { info: true, warn: true, error: true, debug: false };
|
|
246
|
-
let logPollTimer = null;
|
|
247
|
-
|
|
248
|
-
function fetchLogs() {
|
|
249
|
-
const active = Object.keys(logLevels).filter(k => logLevels[k]);
|
|
250
|
-
const container = document.getElementById("log-entries");
|
|
251
|
-
if (active.length === 0) { if (container) container.innerHTML = '<div style="color:#666;padding:12px;">No levels selected</div>'; return; }
|
|
252
|
-
fetch("/api/logs?level=" + active.join(",") + "&limit=500", { headers: authHeaders() })
|
|
253
|
-
.then(r => r.json())
|
|
254
|
-
.then(data => {
|
|
255
|
-
if (!container || !data.lines) return;
|
|
256
|
-
const wasAtBottom = container.scrollHeight - container.scrollTop - container.clientHeight < 30;
|
|
257
|
-
container.innerHTML = data.lines.map(line => {
|
|
258
|
-
let lvl = "info";
|
|
259
|
-
if (line.includes(" WARN ")) lvl = "warn";
|
|
260
|
-
else if (line.includes(" ERROR")) lvl = "error";
|
|
261
|
-
else if (line.includes(" DEBUG")) lvl = "debug";
|
|
262
|
-
return '<div class="log-line ' + lvl + '">' + escHtml(line.slice(0, 19).replace("T", " ") + line.slice(24)) + "</div>";
|
|
263
|
-
}).join("");
|
|
264
|
-
if (wasAtBottom) container.scrollTop = container.scrollHeight;
|
|
265
|
-
}).catch(() => {});
|
|
266
|
-
}
|
|
267
|
-
|
|
268
|
-
// ── Memory Search ────────────────────────────────────────────────────────────
|
|
269
|
-
let keywordFilters = [];
|
|
270
|
-
let searchMode = "or";
|
|
271
|
-
|
|
272
|
-
function getSelectedStages() {
|
|
273
|
-
return [...document.querySelectorAll("#layer-toggles .layer-btn.active")].map(b => b.dataset.layer);
|
|
274
|
-
}
|
|
275
|
-
|
|
276
|
-
function renderFilters() {
|
|
277
|
-
const container = document.getElementById("keyword-filters");
|
|
278
|
-
if (!container) return;
|
|
279
|
-
container.innerHTML = keywordFilters.map((kw, i) =>
|
|
280
|
-
`<span class="keyword-chip" data-action="remove-filter" data-index="${i}">${escHtml(kw)} ✕</span>`
|
|
281
|
-
).join("");
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
function searchMemory() {
|
|
285
|
-
const container = document.getElementById("mem-search-results");
|
|
286
|
-
if (keywordFilters.length === 0) { if (container) container.innerHTML = ""; return; }
|
|
287
|
-
const stages = getSelectedStages();
|
|
288
|
-
if (stages.length === 0) { if (container) container.innerHTML = '<div style="color:#666;padding:6px 0;">No stages selected</div>'; return; }
|
|
289
|
-
const userId = document.getElementById("mem-userid-input")?.value.trim() || "";
|
|
290
|
-
const entity = document.getElementById("mem-entity-input")?.value || "";
|
|
291
|
-
const keywords = keywordFilters.join(",");
|
|
292
|
-
let url = "/api/memory/search?keywords=" + encodeURIComponent(keywords) + "&original=" + encodeURIComponent(keywords) + "&stages=" + encodeURIComponent(stages.join(",")) + "&mode=" + searchMode;
|
|
293
|
-
if (entity) url += "&entity=" + encodeURIComponent(entity);
|
|
294
|
-
if (userId) url += "&userId=" + encodeURIComponent(userId);
|
|
295
|
-
fetch(url, { headers: authHeaders() }).then(r => r.json()).then(data => {
|
|
296
|
-
if (!container) return;
|
|
297
|
-
if (data.error) { container.innerHTML = '<div style="color:#f44336;padding:6px 0;">' + escHtml(data.error) + "</div>"; return; }
|
|
298
|
-
if (!data.results?.length) { container.innerHTML = '<div style="color:#666;padding:6px 0;">No results found</div>'; return; }
|
|
299
|
-
let stageInfo = "";
|
|
300
|
-
if (data.layers) {
|
|
301
|
-
stageInfo = '<div style="color:#888;font-size:11px;margin-bottom:6px;">' + Object.keys(data.layers).map(k => k + ":" + (data.layers[k].hits || 0) + " (" + (data.layers[k].ms || 0) + "ms)").join(" | ") + "</div>";
|
|
302
|
-
}
|
|
303
|
-
container.innerHTML = stageInfo + data.results.map(r => {
|
|
304
|
-
let meta = '<span class="score">' + (r.score != null ? r.score.toFixed(2) : "—") + '</span> <span class="source">' + escHtml(r.source) + '</span> <span class="source">' + escHtml(r.date) + "</span>";
|
|
305
|
-
if (r.memoryType) meta += ' <span class="source">' + r.memoryType + "</span>";
|
|
306
|
-
let content = escHtml(r.content.substring(0, 300));
|
|
307
|
-
if (r.contentOriginal && r.contentOriginal !== r.content) content += '<div style="color:#888;font-size:11px;margin-top:2px;">' + escHtml(r.contentOriginal.substring(0, 200)) + "</div>";
|
|
308
|
-
return '<div class="search-result-item"><div class="result-meta">' + meta + '</div><div class="result-content">' + content + "</div></div>";
|
|
309
|
-
}).join("");
|
|
310
|
-
}).catch(err => { if (container) container.innerHTML = '<div style="color:#f44336;">Search failed: ' + escHtml(err.message) + "</div>"; });
|
|
311
|
-
}
|
|
312
|
-
|
|
313
|
-
function listChatIds() {
|
|
314
|
-
fetch("/api/memory/chats", { headers: authHeaders() }).then(r => r.json()).then(data => {
|
|
315
|
-
const container = document.getElementById("mem-search-results");
|
|
316
|
-
if (!container) return;
|
|
317
|
-
if (data.error) { container.innerHTML = '<div style="color:#f44336;">' + escHtml(data.error) + "</div>"; return; }
|
|
318
|
-
if (!data.userIds?.length) { container.innerHTML = '<div style="color:#666;">No chats found</div>'; return; }
|
|
319
|
-
container.innerHTML = '<div style="padding:6px 0;color:#e0e0e0;"><strong>Stored Chat IDs:</strong><br>' +
|
|
320
|
-
data.userIds.map(id => `<span style="cursor:pointer;color:#64b5f6;margin-right:12px;" data-action="select-chat-id" data-id="${id}">${id}</span>`).join("") + "</div>";
|
|
321
|
-
}).catch(() => {});
|
|
322
|
-
}
|
|
323
|
-
|
|
324
|
-
// ── Subsystem Health Grid ─────────────────────────────────────────────────────
|
|
325
|
-
function updateSubsystemGrid(subsystems) {
|
|
326
|
-
const container = document.getElementById("subsystem-grid");
|
|
327
|
-
if (!container || !subsystems.length) return;
|
|
328
|
-
container.innerHTML = subsystems.map(s => {
|
|
329
|
-
const icon = s.status === "ok" ? "✓" : s.status === "skipped" ? "○" : s.status === "retrying" ? "↻" : "✗";
|
|
330
|
-
const color = s.status === "ok" ? "#4caf50" : s.status === "skipped" ? "#9e9e9e" : s.status === "retrying" ? "#ff9800" : "#f44336";
|
|
331
|
-
const detail = s.detail ? ` <span style="color:#888;">— ${escHtml(s.detail)}</span>` : "";
|
|
332
|
-
return `<div><span style="color:${color};font-weight:bold;">${icon}</span> ${escHtml(s.name)}${detail}</div>`;
|
|
333
|
-
}).join("");
|
|
334
|
-
}
|
|
335
|
-
|
|
336
|
-
// ── Event Delegation ─────────────────────────────────────────────────────────
|
|
337
|
-
document.body.addEventListener("click", (e) => {
|
|
338
|
-
const target = e.target.closest("[data-action]");
|
|
339
|
-
if (!target) return;
|
|
340
|
-
const action = target.dataset.action;
|
|
341
|
-
|
|
342
|
-
switch (action) {
|
|
343
|
-
case "toggle-platform": {
|
|
344
|
-
const name = target.dataset.name, op = target.dataset.op;
|
|
345
|
-
fetch("/api/services/" + name + "/" + op, { method: "POST", headers: authHeaders() })
|
|
346
|
-
.then(r => r.json()).then(d => { if (d.error) alert("Error: " + d.error); })
|
|
347
|
-
.catch(err => alert("Request failed: " + err.message));
|
|
348
|
-
break;
|
|
349
|
-
}
|
|
350
|
-
case "toggle-overlay": {
|
|
351
|
-
const el = document.getElementById(target.dataset.target);
|
|
352
|
-
if (el) {
|
|
353
|
-
const show = el.style.display === "none";
|
|
354
|
-
el.style.display = show ? "flex" : "none";
|
|
355
|
-
// Start/stop log polling when log overlay toggles
|
|
356
|
-
if (target.dataset.target === "log-overlay") {
|
|
357
|
-
if (show) { fetchLogs(); logPollTimer = setInterval(fetchLogs, 5000); }
|
|
358
|
-
else { clearInterval(logPollTimer); logPollTimer = null; }
|
|
359
|
-
}
|
|
360
|
-
}
|
|
361
|
-
break;
|
|
362
|
-
}
|
|
363
|
-
case "toggle-a2a-panel": {
|
|
364
|
-
const panel = document.getElementById("a2a-panel");
|
|
365
|
-
if (panel) panel.style.display = panel.style.display === "none" ? "flex" : "none";
|
|
366
|
-
break;
|
|
367
|
-
}
|
|
368
|
-
case "load-universe": {
|
|
369
|
-
if (window.initMemoryUniverse) window.initMemoryUniverse(token);
|
|
370
|
-
break;
|
|
371
|
-
}
|
|
372
|
-
case "toggle-log-level": {
|
|
373
|
-
const level = target.dataset.level;
|
|
374
|
-
logLevels[level] = !logLevels[level];
|
|
375
|
-
target.classList.toggle("active", logLevels[level]);
|
|
376
|
-
fetchLogs();
|
|
377
|
-
break;
|
|
378
|
-
}
|
|
379
|
-
case "toggle-layer": {
|
|
380
|
-
target.classList.toggle("active");
|
|
381
|
-
searchMemory();
|
|
382
|
-
break;
|
|
383
|
-
}
|
|
384
|
-
case "toggle-search-mode": {
|
|
385
|
-
searchMode = searchMode === "or" ? "and" : "or";
|
|
386
|
-
target.textContent = searchMode.toUpperCase();
|
|
387
|
-
target.classList.toggle("active", searchMode === "or");
|
|
388
|
-
searchMemory();
|
|
389
|
-
break;
|
|
390
|
-
}
|
|
391
|
-
case "search-memory": {
|
|
392
|
-
searchMemory();
|
|
393
|
-
break;
|
|
394
|
-
}
|
|
395
|
-
case "list-chat-ids": {
|
|
396
|
-
listChatIds();
|
|
397
|
-
break;
|
|
398
|
-
}
|
|
399
|
-
case "remove-filter": {
|
|
400
|
-
keywordFilters.splice(Number(target.dataset.index), 1);
|
|
401
|
-
renderFilters();
|
|
402
|
-
searchMemory();
|
|
403
|
-
break;
|
|
404
|
-
}
|
|
405
|
-
case "cron-action": {
|
|
406
|
-
fetch("/api/cron/" + target.dataset.id + "/" + target.dataset.op, { method: "POST", headers: authHeaders() })
|
|
407
|
-
.then(r => r.json()).then(d => { if (d.error) alert("Error: " + d.error); })
|
|
408
|
-
.catch(err => alert("Request failed: " + err.message));
|
|
409
|
-
break;
|
|
410
|
-
}
|
|
411
|
-
case "select-chat-id": {
|
|
412
|
-
const input = document.getElementById("mem-userid-input");
|
|
413
|
-
if (input) input.value = target.dataset.id;
|
|
414
|
-
break;
|
|
415
|
-
}
|
|
416
|
-
}
|
|
417
|
-
});
|
|
418
|
-
|
|
419
|
-
// Keyword input Enter handler
|
|
420
|
-
const kwInput = document.getElementById("mem-keyword-input");
|
|
421
|
-
if (kwInput) {
|
|
422
|
-
kwInput.addEventListener("keydown", (e) => {
|
|
423
|
-
if (e.key === "Enter") {
|
|
424
|
-
const val = kwInput.value.trim();
|
|
425
|
-
if (val && !keywordFilters.includes(val)) {
|
|
426
|
-
keywordFilters.push(val);
|
|
427
|
-
renderFilters();
|
|
428
|
-
searchMemory();
|
|
429
|
-
}
|
|
430
|
-
kwInput.value = "";
|
|
431
|
-
}
|
|
432
|
-
});
|
|
433
|
-
}
|
|
434
|
-
|
|
435
|
-
// ── Init ─────────────────────────────────────────────────────────────────────
|
|
436
|
-
connect();
|
|
437
|
-
// Logs fetched on overlay open, not on page load
|