abtars 0.3.4-alpha.0 → 0.3.4-alpha.2
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-7DRCE4V6.js → _registry.generated-RC6PEH6Z.js} +16 -15
- package/bundle/{_registry.generated-7DRCE4V6.js.map → _registry.generated-RC6PEH6Z.js.map} +1 -1
- package/bundle/abtars-browser.js +6 -5
- package/bundle/abtars-browser.js.map +1 -1
- package/bundle/abtars-cli.js +73 -46
- package/bundle/abtars-cli.js.map +3 -3
- package/bundle/abtars-restart.js +7 -7
- package/bundle/abtars-rss.js +2 -1
- package/bundle/abtars-rss.js.map +2 -2
- package/bundle/abtars-task.js +6 -5
- package/bundle/abtars-task.js.map +1 -1
- package/bundle/abtars-todo.js +2 -1
- package/bundle/abtars-todo.js.map +1 -1
- package/bundle/abtars.js +307 -212
- package/bundle/abtars.js.map +4 -4
- package/bundle/{acp-raw-client-AZJCEB6S.js → acp-raw-client-E6FM45NC.js} +4 -3
- package/bundle/{acp-raw-client-AZJCEB6S.js.map → acp-raw-client-E6FM45NC.js.map} +1 -1
- package/bundle/{action-gate-QYJL57IX.js → action-gate-G2V47NHW.js} +4 -3
- package/bundle/{action-gate-QYJL57IX.js.map → action-gate-G2V47NHW.js.map} +1 -1
- package/bundle/{agent-api-adapter-PYMNQXHE.js → agent-api-adapter-PTJYZKQK.js} +5 -4
- package/bundle/{agent-api-adapter-PYMNQXHE.js.map → agent-api-adapter-PTJYZKQK.js.map} +1 -1
- package/bundle/{agent-api-rate-limit-4GEZ4YN5.js → agent-api-rate-limit-WCFXJMGY.js} +6 -5
- package/bundle/{agent-registry-563P4EUJ.js → agent-registry-GU7ABOK5.js} +9 -8
- package/bundle/bootstrap-POWWTU6I.js +63 -0
- package/bundle/bootstrap-POWWTU6I.js.map +7 -0
- package/bundle/{bridge-lock-transport-LXCF2IVN.js → bridge-lock-transport-4ZH7QTJP.js} +6 -5
- package/bundle/{browser-2VZOGOGX.js → browser-EJNS35NT.js} +8 -7
- package/bundle/{budget-PPA7WY3D.js → budget-45QOBDWA.js} +5 -4
- package/bundle/{budget-PPA7WY3D.js.map → budget-45QOBDWA.js.map} +1 -1
- package/bundle/{capability-WXEA2WFK.js → capability-JFWX3IQF.js} +7 -6
- package/bundle/{chunk-CB6S3ZRF.js → chunk-2FAZIA37.js} +3 -3
- package/bundle/{chunk-VJATH7AN.js → chunk-2KC5G3EA.js} +9 -8
- package/bundle/chunk-2KC5G3EA.js.map +7 -0
- package/bundle/{chunk-OY2HAK33.js → chunk-36ZEYDKZ.js} +1 -1
- package/bundle/chunk-36ZEYDKZ.js.map +7 -0
- package/bundle/{chunk-2FZJDMAF.js → chunk-3CACHBDI.js} +10 -10
- package/bundle/{chunk-O4GKI3Q3.js → chunk-4S554KLW.js} +4 -4
- package/bundle/{chunk-3QW2K53E.js → chunk-5GCLBUBS.js} +11 -19
- package/bundle/chunk-5GCLBUBS.js.map +7 -0
- package/bundle/{chunk-RJX45XIC.js → chunk-5HDSQFT6.js} +9 -4
- package/bundle/chunk-5HDSQFT6.js.map +7 -0
- package/bundle/{chunk-EDZGF6BC.js → chunk-5NY2YULC.js} +11 -4
- package/bundle/chunk-5NY2YULC.js.map +7 -0
- package/bundle/{chunk-LE23VPN3.js → chunk-63A7ZRIH.js} +4 -4
- package/bundle/{chunk-LE23VPN3.js.map → chunk-63A7ZRIH.js.map} +1 -1
- package/bundle/{chunk-SSCGWDIC.js → chunk-65VCEC32.js} +2 -2
- package/bundle/{chunk-V2QIAXWZ.js → chunk-7BSQ5UQO.js} +3 -3
- package/bundle/{chunk-E7MV7WFT.js → chunk-7Z3HBPRY.js} +6 -6
- package/bundle/{chunk-TY26WMQY.js → chunk-AFREM7FX.js} +2 -2
- package/bundle/{chunk-GCFIK6OB.js → chunk-AO32N2VB.js} +92 -20
- package/bundle/chunk-AO32N2VB.js.map +7 -0
- package/bundle/{chunk-N5VROZ7A.js → chunk-B6ZN6COK.js} +5 -5
- package/bundle/{chunk-M6Q3IQ4H.js → chunk-BFDBGESM.js} +259 -122
- package/bundle/chunk-BFDBGESM.js.map +7 -0
- package/bundle/{chunk-YEOZN5IE.js → chunk-DYBW4XXL.js} +2 -2
- package/bundle/{chunk-56D3Y44D.js → chunk-EFJVUJBE.js} +10 -10
- package/bundle/{chunk-S6HEHCCG.js → chunk-EQSG2CRM.js} +83 -46
- package/bundle/chunk-EQSG2CRM.js.map +7 -0
- package/bundle/{chunk-FIAVVKGN.js → chunk-EUZDKV3C.js} +3 -3
- package/bundle/{chunk-2LKQV2ND.js → chunk-FRKW6LWB.js} +3 -3
- package/bundle/{chunk-H2K23MOF.js → chunk-GALQBVKO.js} +21 -5
- package/bundle/chunk-GALQBVKO.js.map +7 -0
- package/bundle/{chunk-DNDYD5SL.js → chunk-GP4XUKI5.js} +3 -3
- package/bundle/{chunk-SXNY6HC4.js → chunk-GPZNXY2U.js} +6 -6
- package/bundle/chunk-GPZNXY2U.js.map +7 -0
- package/bundle/{chunk-W726UGI6.js → chunk-GRVWZO4C.js} +3 -3
- package/bundle/{chunk-IXKQ4JMX.js → chunk-GVM5YU5I.js} +33 -17
- package/bundle/chunk-GVM5YU5I.js.map +7 -0
- package/bundle/{chunk-OOKNHOCB.js → chunk-GWILHZPT.js} +2 -2
- package/bundle/{chunk-3LQOJVTB.js → chunk-HFOCNYEO.js} +1842 -1220
- package/bundle/{chunk-3LQOJVTB.js.map → chunk-HFOCNYEO.js.map} +4 -4
- package/bundle/{chunk-NP72ZB7P.js → chunk-HMKVL7AX.js} +53 -47
- package/bundle/chunk-HMKVL7AX.js.map +7 -0
- package/bundle/{chunk-BNBC4T45.js → chunk-HT2BPTZY.js} +3 -3
- package/bundle/{chunk-BU7LTI2W.js → chunk-HZDLFLRP.js} +6 -7
- package/bundle/chunk-HZDLFLRP.js.map +7 -0
- package/bundle/{chunk-FVUL44T4.js → chunk-IJT4KWXT.js} +2 -2
- package/bundle/{chunk-IK4R3RBZ.js → chunk-JNIHEDKF.js} +3 -3
- package/bundle/{chunk-J5NOL4DB.js → chunk-JQDJPUHM.js} +16 -6
- package/bundle/chunk-JQDJPUHM.js.map +7 -0
- package/bundle/{chunk-SESM4GBM.js → chunk-KTYGKPYM.js} +52 -25
- package/bundle/chunk-KTYGKPYM.js.map +7 -0
- package/bundle/chunk-LME23AA2.js +37 -0
- package/bundle/chunk-LME23AA2.js.map +7 -0
- package/bundle/{chunk-4PIVWXUJ.js → chunk-LUNA6PM5.js} +2 -2
- package/bundle/{chunk-37EX63K4.js → chunk-LUW62WGO.js} +6998 -3621
- package/bundle/chunk-LUW62WGO.js.map +7 -0
- package/bundle/{chunk-MV5KOWOR.js → chunk-NDCRWEEJ.js} +7 -7
- package/bundle/{chunk-7WHXTCVD.js → chunk-NRUSRJXR.js} +8 -3
- package/bundle/chunk-NRUSRJXR.js.map +7 -0
- package/bundle/{chunk-C3EYYJN3.js → chunk-O7KQG6ME.js} +17 -5
- package/bundle/chunk-O7KQG6ME.js.map +7 -0
- package/bundle/{chunk-ZOCEBV62.js → chunk-OKAQICWY.js} +3 -3
- package/bundle/{chunk-TCI6FZTP.js → chunk-OLAURO5G.js} +9 -9
- package/bundle/{chunk-YME7NRGP.js → chunk-OXTSWQCX.js} +2 -2
- package/bundle/{chunk-HDOFJVFS.js → chunk-PEDX56EL.js} +3 -3
- package/bundle/{chunk-7RAGSHSH.js → chunk-PROPYS3P.js} +12 -10
- package/bundle/chunk-PROPYS3P.js.map +7 -0
- package/bundle/{chunk-ASYX43OU.js → chunk-Q32H6VPU.js} +26 -26
- package/bundle/{chunk-P5O6QZDC.js → chunk-QROWBWLL.js} +10 -6
- package/bundle/chunk-QROWBWLL.js.map +7 -0
- package/bundle/{chunk-S7ZIGIR5.js → chunk-R76K6L6H.js} +27 -27
- package/bundle/{chunk-S7ZIGIR5.js.map → chunk-R76K6L6H.js.map} +1 -1
- package/bundle/{chunk-MQJG7OJX.js → chunk-RIHQ37U5.js} +38 -36
- package/bundle/chunk-RIHQ37U5.js.map +7 -0
- package/bundle/{chunk-IQKADER4.js → chunk-RWRRGE4U.js} +2 -2
- package/bundle/{chunk-72T2Q7IG.js → chunk-S5GD5EJ5.js} +271 -282
- package/bundle/chunk-S5GD5EJ5.js.map +7 -0
- package/bundle/{chunk-ULO2PX3T.js → chunk-TEFZ4JA4.js} +3 -3
- package/bundle/{chunk-2RGR3LSV.js → chunk-TMUYFERL.js} +2 -2
- package/bundle/{chunk-KBPVJGD7.js → chunk-URQPDCK5.js} +3 -3
- package/bundle/chunk-UUIHL65U.js +77 -0
- package/bundle/chunk-UUIHL65U.js.map +7 -0
- package/bundle/{chunk-FJF42RZY.js → chunk-VUIX5AGB.js} +3 -3
- package/bundle/{chunk-5V4VHKEA.js → chunk-WBTJ2E62.js} +5 -4
- package/bundle/chunk-WBTJ2E62.js.map +7 -0
- package/bundle/{chunk-ZY6DH2S4.js → chunk-WTIGZO3N.js} +80 -70
- package/bundle/chunk-WTIGZO3N.js.map +7 -0
- package/bundle/{chunk-4HNCOQSK.js → chunk-WYHGNI56.js} +7 -7
- package/bundle/{chunk-24V4A6RP.js → chunk-XX6BGTPO.js} +4 -4
- package/bundle/{chunk-T7TAWGBX.js → chunk-Y76VUJSF.js} +2 -2
- package/bundle/{chunk-TVSPVZTX.js → chunk-YDY6QVWJ.js} +3 -3
- package/bundle/{chunk-V6CV3QPH.js → chunk-YRSMGJFP.js} +2 -2
- package/bundle/{chunk-WP7FZHMI.js → chunk-YSKCQH6E.js} +2 -2
- package/bundle/{chunk-NGZVJ52F.js → chunk-ZKJOFASV.js} +7 -7
- package/bundle/{chunk-WGWM4IZM.js → chunk-ZT5ZBGWS.js} +4 -4
- package/bundle/{chunk-WGWM4IZM.js.map → chunk-ZT5ZBGWS.js.map} +1 -1
- package/bundle/{chunk-43DKPXTP.js → chunk-ZV4IWKDJ.js} +4 -4
- package/bundle/{commands-XXFU2ZF7.js → commands-EWA4HNCM.js} +20 -20
- package/bundle/{config-EWDZ234X.js → config-M3P5IOAI.js} +8 -7
- package/bundle/{config-show-6J33O4TE.js → config-show-3DHPP26D.js} +5 -5
- package/bundle/{context-OCS7HLJP.js → context-5P7IYYU2.js} +5 -2
- package/bundle/{context-OCS7HLJP.js.map → context-5P7IYYU2.js.map} +1 -1
- package/bundle/{daemon-LTDAXNA2.js → daemon-TB23FFWY.js} +7 -7
- package/bundle/{delegation-tools-YDTWQMZD.js → delegation-tools-P2SCNL23.js} +14 -11
- package/bundle/{registry-client-VN2MM2HI.js → deploy-YYUCGGP3.js} +10 -6
- package/bundle/{deploy-lib-import-RGZJ3CGC.js → deploy-lib-import-T3UP4G6G.js} +5 -3
- package/bundle/{deps-PHSLIA77.js → deps-WVK553KF.js} +21 -19
- package/bundle/deps-WVK553KF.js.map +7 -0
- package/bundle/{direct-api-transport-OAKYQBJR.js → direct-api-transport-WQ6HA5OX.js} +30 -28
- package/bundle/direct-api-transport-WQ6HA5OX.js.map +7 -0
- package/bundle/{discord-adapter-WUNYPTDE.js → discord-adapter-4TTETYDI.js} +26 -26
- package/bundle/{dist-7HEHHQI2.js → dist-KMK7TZGN.js} +376 -348
- package/bundle/dist-KMK7TZGN.js.map +7 -0
- package/bundle/{dns-wakeup-F55ALHXJ.js → dns-wakeup-IDOJIXBX.js} +4 -3
- package/bundle/{dns-wakeup-F55ALHXJ.js.map → dns-wakeup-IDOJIXBX.js.map} +1 -1
- package/bundle/{doctor-probes-3SLIUGKS.js → doctor-probes-VDWFJKUB.js} +4 -3
- package/bundle/{env-schema-MSDP2YBO.js → env-schema-4JXQUOH4.js} +5 -4
- package/bundle/{gossip-CS3G3447.js → gossip-3C3BSNPN.js} +7 -6
- package/bundle/{guardrails-24XK2COI.js → guardrails-DL7ZSWVN.js} +6 -5
- package/bundle/{health-check-FRUNRVNQ.js → health-check-YKWFD2LZ.js} +5 -6
- package/bundle/{health-check-FRUNRVNQ.js.map → health-check-YKWFD2LZ.js.map} +2 -2
- package/bundle/{heartbeat-system-G4IFQXT6.js → heartbeat-system-TDDIOVTC.js} +7 -6
- package/bundle/{heartbeat-tier3-3ZO3EVXP.js → heartbeat-tier3-55T2HUNE.js} +45 -44
- package/bundle/heartbeat-tier3-55T2HUNE.js.map +7 -0
- package/bundle/{hook-system-X6INNJGV.js → hook-system-M3POLUIB.js} +5 -4
- package/bundle/{hotskills-6FQYTJIO.js → hotskills-FWX4QI7V.js} +7 -6
- package/bundle/{install-ZAHTZ5M5.js → install-4MXBYIUG.js} +23 -20
- package/bundle/install-4MXBYIUG.js.map +7 -0
- package/bundle/{install-manifest-QX7KVDCA.js → install-manifest-5PPWMD2W.js} +4 -3
- package/bundle/{install-manifest-QX7KVDCA.js.map → install-manifest-5PPWMD2W.js.map} +1 -1
- package/bundle/{irc-adapter-IEJQKKJF.js → irc-adapter-PTTZD32W.js} +5 -4
- package/bundle/{irc-adapter-IEJQKKJF.js.map → irc-adapter-PTTZD32W.js.map} +1 -1
- package/bundle/{irc-config-TTWNYFLH.js → irc-config-CP7ZMUOX.js} +6 -5
- package/bundle/{irc-config-TTWNYFLH.js.map → irc-config-CP7ZMUOX.js.map} +1 -1
- package/bundle/{kanban-board-J6RO3ZU7.js → kanban-board-M326B2XJ.js} +7 -5
- package/bundle/{kanban-channel-5EIXBFSA.js → kanban-channel-IJ52OMNA.js} +8 -6
- package/bundle/{lazy-require-V6EFUATC.js → lazy-require-KCRVT4SI.js} +11 -6
- package/bundle/{logger-Y3VILPRH.js → logger-OWCSNYCA.js} +4 -3
- package/bundle/{logs-YS3GDURO.js → logs-FXS4SCEM.js} +5 -5
- package/bundle/{main-chat-YLZDNQPO.js → main-chat-ZNUZCTNS.js} +6 -5
- package/bundle/{master-user-Z4M7KCJE.js → master-user-HSKM4ZFN.js} +7 -6
- package/bundle/{media-utils-P6RZ2K3U.js → media-utils-3ZYOD7SK.js} +44 -43
- package/bundle/{media-utils-P6RZ2K3U.js.map → media-utils-3ZYOD7SK.js.map} +2 -2
- package/bundle/{message-pipeline-MHEBDJLH.js → message-pipeline-KSONH4MT.js} +20 -20
- package/bundle/meta.json +9327 -8582
- package/bundle/{migrate-layout-RJJQLVGR.js → migrate-layout-IJIEJY3A.js} +8 -4
- package/bundle/migrate-layout-IJIEJY3A.js.map +7 -0
- package/bundle/{nerve-VZNMFDGY.js → nerve-IGSXBKZZ.js} +5 -4
- package/bundle/{notification-VV2OR6NW.js → notification-BFSIEECG.js} +8 -7
- package/bundle/{openrouter-credits-LXC7P4G6.js → openrouter-credits-NTVZDRYM.js} +5 -4
- package/bundle/{openrouter-credits-LXC7P4G6.js.map → openrouter-credits-NTVZDRYM.js.map} +1 -1
- package/bundle/{orc-KC4USP55.js → orc-EIGVTHAV.js} +4 -4
- package/bundle/{orc-tools-CHRSXSAS.js → orc-tools-A3G7WCSJ.js} +5 -4
- package/bundle/{paths-EDK6KWHG.js → paths-3ZVW3NFL.js} +6 -2
- package/bundle/{paths-RZF6WDMG.js → paths-X4LRYUI6.js} +3 -2
- package/bundle/{peer-auth-SRONOLNG.js → peer-auth-QC4EF2PM.js} +9 -8
- package/bundle/{peer-client-VOF77T6C.js → peer-client-RGEU5HOK.js} +9 -8
- package/bundle/{peer-client-VOF77T6C.js.map → peer-client-RGEU5HOK.js.map} +1 -1
- package/bundle/{peer-config-FRWLEYQ5.js → peer-config-TN55LFDC.js} +6 -5
- package/bundle/{peer-jwt-XY3XRIA2.js → peer-jwt-NCCPXJRX.js} +6 -5
- package/bundle/{peer-transport-UBBXTDRP.js → peer-transport-I6JPLFZ2.js} +8 -7
- package/bundle/{phase-transport-4NQHZX75.js → phase-transport-2BRWACDF.js} +18 -16
- package/bundle/public/css/dashboard.css +542 -0
- package/bundle/public/index.html +180 -0
- package/bundle/public/js/app.js +437 -0
- package/bundle/public/memory-universe.js +384 -0
- package/bundle/{reconcile-2EUXJ6W5.js → reconcile-CTFCLQRN.js} +5 -4
- package/bundle/{reconciler-FFQGV4DO.js → reconciler-FHESO6OC.js} +14 -11
- package/bundle/{reconciler-FFQGV4DO.js.map → reconciler-FHESO6OC.js.map} +1 -1
- package/bundle/{restore-NFDE2RG6.js → restore-IFHPI7I7.js} +13 -9
- package/bundle/{restore-NFDE2RG6.js.map → restore-IFHPI7I7.js.map} +3 -3
- package/bundle/{rollback-MVZ53XS4.js → rollback-ANRI3T5Z.js} +5 -5
- package/bundle/{chunk-SKY6656M.js → sandbox-runtime-QROWHDCS.js} +11 -28
- package/bundle/{chunk-SKY6656M.js.map → sandbox-runtime-QROWHDCS.js.map} +1 -1
- package/bundle/{self-healer-utils-KD6LV63S.js → self-healer-utils-IFAYOQO2.js} +5 -4
- package/bundle/{self-healer-utils-KD6LV63S.js.map → self-healer-utils-IFAYOQO2.js.map} +1 -1
- package/bundle/{sha-tracker-2DB4R2TW.js → sha-tracker-ZWBP6CIJ.js} +5 -4
- package/bundle/{skill-session-BPDVA6ZG.js → skill-session-AXBDQSLQ.js} +5 -4
- package/bundle/{skill-session-BPDVA6ZG.js.map → skill-session-AXBDQSLQ.js.map} +1 -1
- package/bundle/{skill-stats-TPD2NROA.js → skill-stats-JORH5DGM.js} +6 -5
- package/bundle/{skill-watcher-D7QYYYON.js → skill-watcher-E4MGLKLS.js} +6 -5
- package/bundle/{sleep-GH6DLBJJ.js → sleep-SRCSXY6T.js} +10 -9
- package/bundle/{soul-bundle-GXLMDBCC.js → soul-bundle-VWAVHCZ6.js} +10 -9
- package/bundle/{spin-4DBYHS3E.js → spin-IMW2MZOH.js} +13 -10
- package/bundle/{spin-notifications-IKYJPER5.js → spin-notifications-SE2HVZI7.js} +7 -5
- package/bundle/{spin-notifications-IKYJPER5.js.map → spin-notifications-SE2HVZI7.js.map} +1 -1
- package/bundle/{spin-types-PLJH3SIK.js → spin-types-BLPYAETA.js} +5 -4
- package/bundle/{src-SUFZ27S5.js → src-6BTCMOD3.js} +4 -4
- package/bundle/{sse-parser-anthropic-U7ILHOY5.js → sse-parser-anthropic-A6R4Z2TB.js} +5 -4
- package/bundle/{sse-parser-anthropic-U7ILHOY5.js.map → sse-parser-anthropic-A6R4Z2TB.js.map} +1 -1
- package/bundle/{sse-parser-responses-OI73R3AH.js → sse-parser-responses-HSZY3QGJ.js} +5 -4
- package/bundle/{sse-parser-responses-OI73R3AH.js.map → sse-parser-responses-HSZY3QGJ.js.map} +1 -1
- package/bundle/{ssrf-guard-6GP4QYVA.js → ssrf-guard-O6SHIK6Q.js} +5 -4
- package/bundle/{ssrf-guard-6GP4QYVA.js.map → ssrf-guard-O6SHIK6Q.js.map} +1 -1
- package/bundle/{start-JT2BPMSW.js → start-7QZIWO3S.js} +5 -5
- package/bundle/start-7QZIWO3S.js.map +7 -0
- package/bundle/{stt-KD3AABKG.js → stt-LGVPXMVR.js} +6 -5
- package/bundle/{subagent-runtime-LVECAUPV.js → subagent-runtime-3UJB4HUB.js} +6 -5
- package/bundle/system-status-ATGKRRQI.js +349 -0
- package/bundle/system-status-ATGKRRQI.js.map +7 -0
- package/bundle/{task-store-2XRDM3AW.js → task-store-W5BFIAIH.js} +6 -5
- package/bundle/{telegram-adapter-UJ3RYYV6.js → telegram-adapter-7G773NII.js} +35 -35
- package/bundle/{tool-registry-YU6WBXPA.js → tool-registry-J6TE3I2T.js} +25 -23
- package/bundle/{tool-sandbox-RNNPDR5M.js → tool-sandbox-4UC6GAKA.js} +6 -5
- package/bundle/{transport-config-OK3MZPJK.js → transport-config-KBF5W2DP.js} +9 -8
- package/bundle/{update-ENNPRW7Y.js → update-424ZZQQ6.js} +6 -6
- package/bundle/{update-check-SJB6GV3A.js → update-check-7UWKBJOP.js} +3 -2
- package/bundle/{update-check-SJB6GV3A.js.map → update-check-7UWKBJOP.js.map} +1 -1
- package/bundle/{usage-tracker-HRSGC7QC.js → usage-tracker-NXD364VX.js} +2 -2
- package/bundle/{user-registry-6PUJJ5J2.js → user-registry-35BW4XKM.js} +6 -5
- package/bundle/{wrapper-WLHLG4MI.js → wrapper-W66YICNZ.js} +3 -3
- package/bundle/{ws-peer-client-WHW3RJTD.js → ws-peer-client-AIXCXF7V.js} +15 -14
- package/bundle/{ws-peer-client-WHW3RJTD.js.map → ws-peer-client-AIXCXF7V.js.map} +2 -2
- package/package.json +4 -8
- package/scripts/emergency-deploy.sh +11 -8
- package/scripts/emergency-update.sh +156 -23
- package/templates/config/.env +1 -1
- package/templates/config/models.json +13 -0
- package/bundle/chunk-37EX63K4.js.map +0 -7
- package/bundle/chunk-3QW2K53E.js.map +0 -7
- package/bundle/chunk-5V4VHKEA.js.map +0 -7
- package/bundle/chunk-72T2Q7IG.js.map +0 -7
- package/bundle/chunk-7RAGSHSH.js.map +0 -7
- package/bundle/chunk-7WHXTCVD.js.map +0 -7
- package/bundle/chunk-BU7LTI2W.js.map +0 -7
- package/bundle/chunk-C3EYYJN3.js.map +0 -7
- package/bundle/chunk-CAOIIVFP.js +0 -110
- package/bundle/chunk-CAOIIVFP.js.map +0 -7
- package/bundle/chunk-EDZGF6BC.js.map +0 -7
- package/bundle/chunk-GCFIK6OB.js.map +0 -7
- package/bundle/chunk-H2K23MOF.js.map +0 -7
- package/bundle/chunk-HAZHNBBY.js +0 -156
- package/bundle/chunk-HAZHNBBY.js.map +0 -7
- package/bundle/chunk-IXKQ4JMX.js.map +0 -7
- package/bundle/chunk-J5NOL4DB.js.map +0 -7
- package/bundle/chunk-JAJ3DUQ2.js +0 -30
- package/bundle/chunk-JAJ3DUQ2.js.map +0 -7
- package/bundle/chunk-KMFR5AVY.js +0 -45
- package/bundle/chunk-KMFR5AVY.js.map +0 -7
- package/bundle/chunk-M6Q3IQ4H.js.map +0 -7
- package/bundle/chunk-MQJG7OJX.js.map +0 -7
- package/bundle/chunk-NP72ZB7P.js.map +0 -7
- package/bundle/chunk-OY2HAK33.js.map +0 -7
- package/bundle/chunk-P5O6QZDC.js.map +0 -7
- package/bundle/chunk-RJX45XIC.js.map +0 -7
- package/bundle/chunk-S6HEHCCG.js.map +0 -7
- package/bundle/chunk-SESM4GBM.js.map +0 -7
- package/bundle/chunk-SXNY6HC4.js.map +0 -7
- package/bundle/chunk-VJATH7AN.js.map +0 -7
- package/bundle/chunk-ZY6DH2S4.js.map +0 -7
- package/bundle/deps-PHSLIA77.js.map +0 -7
- package/bundle/direct-api-transport-OAKYQBJR.js.map +0 -7
- package/bundle/dist-7HEHHQI2.js.map +0 -7
- package/bundle/heartbeat-tier3-3ZO3EVXP.js.map +0 -7
- package/bundle/install-ZAHTZ5M5.js.map +0 -7
- package/bundle/migrate-layout-RJJQLVGR.js.map +0 -7
- package/bundle/phase-config-V4XETN5F.js +0 -18
- package/bundle/sandbox-runtime-WHACQLLN.js +0 -22
- package/bundle/start-JT2BPMSW.js.map +0 -7
- package/bundle/system-status-XXJWTVJN.js +0 -243
- package/bundle/system-status-XXJWTVJN.js.map +0 -7
- package/bundle/user-registry-6PUJJ5J2.js.map +0 -7
- package/bundle/wrapper-WLHLG4MI.js.map +0 -7
- /package/bundle/{agent-api-rate-limit-4GEZ4YN5.js.map → agent-api-rate-limit-WCFXJMGY.js.map} +0 -0
- /package/bundle/{agent-registry-563P4EUJ.js.map → agent-registry-GU7ABOK5.js.map} +0 -0
- /package/bundle/{bridge-lock-transport-LXCF2IVN.js.map → bridge-lock-transport-4ZH7QTJP.js.map} +0 -0
- /package/bundle/{browser-2VZOGOGX.js.map → browser-EJNS35NT.js.map} +0 -0
- /package/bundle/{capability-WXEA2WFK.js.map → capability-JFWX3IQF.js.map} +0 -0
- /package/bundle/{chunk-CB6S3ZRF.js.map → chunk-2FAZIA37.js.map} +0 -0
- /package/bundle/{chunk-2FZJDMAF.js.map → chunk-3CACHBDI.js.map} +0 -0
- /package/bundle/{chunk-O4GKI3Q3.js.map → chunk-4S554KLW.js.map} +0 -0
- /package/bundle/{chunk-SSCGWDIC.js.map → chunk-65VCEC32.js.map} +0 -0
- /package/bundle/{chunk-V2QIAXWZ.js.map → chunk-7BSQ5UQO.js.map} +0 -0
- /package/bundle/{chunk-E7MV7WFT.js.map → chunk-7Z3HBPRY.js.map} +0 -0
- /package/bundle/{chunk-TY26WMQY.js.map → chunk-AFREM7FX.js.map} +0 -0
- /package/bundle/{chunk-N5VROZ7A.js.map → chunk-B6ZN6COK.js.map} +0 -0
- /package/bundle/{chunk-YEOZN5IE.js.map → chunk-DYBW4XXL.js.map} +0 -0
- /package/bundle/{chunk-56D3Y44D.js.map → chunk-EFJVUJBE.js.map} +0 -0
- /package/bundle/{chunk-FIAVVKGN.js.map → chunk-EUZDKV3C.js.map} +0 -0
- /package/bundle/{chunk-2LKQV2ND.js.map → chunk-FRKW6LWB.js.map} +0 -0
- /package/bundle/{chunk-DNDYD5SL.js.map → chunk-GP4XUKI5.js.map} +0 -0
- /package/bundle/{chunk-W726UGI6.js.map → chunk-GRVWZO4C.js.map} +0 -0
- /package/bundle/{chunk-OOKNHOCB.js.map → chunk-GWILHZPT.js.map} +0 -0
- /package/bundle/{chunk-BNBC4T45.js.map → chunk-HT2BPTZY.js.map} +0 -0
- /package/bundle/{chunk-FVUL44T4.js.map → chunk-IJT4KWXT.js.map} +0 -0
- /package/bundle/{chunk-IK4R3RBZ.js.map → chunk-JNIHEDKF.js.map} +0 -0
- /package/bundle/{chunk-4PIVWXUJ.js.map → chunk-LUNA6PM5.js.map} +0 -0
- /package/bundle/{chunk-MV5KOWOR.js.map → chunk-NDCRWEEJ.js.map} +0 -0
- /package/bundle/{chunk-ZOCEBV62.js.map → chunk-OKAQICWY.js.map} +0 -0
- /package/bundle/{chunk-TCI6FZTP.js.map → chunk-OLAURO5G.js.map} +0 -0
- /package/bundle/{chunk-YME7NRGP.js.map → chunk-OXTSWQCX.js.map} +0 -0
- /package/bundle/{chunk-HDOFJVFS.js.map → chunk-PEDX56EL.js.map} +0 -0
- /package/bundle/{chunk-ASYX43OU.js.map → chunk-Q32H6VPU.js.map} +0 -0
- /package/bundle/{chunk-IQKADER4.js.map → chunk-RWRRGE4U.js.map} +0 -0
- /package/bundle/{chunk-ULO2PX3T.js.map → chunk-TEFZ4JA4.js.map} +0 -0
- /package/bundle/{chunk-2RGR3LSV.js.map → chunk-TMUYFERL.js.map} +0 -0
- /package/bundle/{chunk-KBPVJGD7.js.map → chunk-URQPDCK5.js.map} +0 -0
- /package/bundle/{chunk-FJF42RZY.js.map → chunk-VUIX5AGB.js.map} +0 -0
- /package/bundle/{chunk-4HNCOQSK.js.map → chunk-WYHGNI56.js.map} +0 -0
- /package/bundle/{chunk-24V4A6RP.js.map → chunk-XX6BGTPO.js.map} +0 -0
- /package/bundle/{chunk-T7TAWGBX.js.map → chunk-Y76VUJSF.js.map} +0 -0
- /package/bundle/{chunk-TVSPVZTX.js.map → chunk-YDY6QVWJ.js.map} +0 -0
- /package/bundle/{chunk-V6CV3QPH.js.map → chunk-YRSMGJFP.js.map} +0 -0
- /package/bundle/{chunk-WP7FZHMI.js.map → chunk-YSKCQH6E.js.map} +0 -0
- /package/bundle/{chunk-NGZVJ52F.js.map → chunk-ZKJOFASV.js.map} +0 -0
- /package/bundle/{chunk-43DKPXTP.js.map → chunk-ZV4IWKDJ.js.map} +0 -0
- /package/bundle/{commands-XXFU2ZF7.js.map → commands-EWA4HNCM.js.map} +0 -0
- /package/bundle/{config-EWDZ234X.js.map → config-M3P5IOAI.js.map} +0 -0
- /package/bundle/{config-show-6J33O4TE.js.map → config-show-3DHPP26D.js.map} +0 -0
- /package/bundle/{daemon-LTDAXNA2.js.map → daemon-TB23FFWY.js.map} +0 -0
- /package/bundle/{delegation-tools-YDTWQMZD.js.map → delegation-tools-P2SCNL23.js.map} +0 -0
- /package/bundle/{deploy-lib-import-RGZJ3CGC.js.map → deploy-YYUCGGP3.js.map} +0 -0
- /package/bundle/{doctor-probes-3SLIUGKS.js.map → deploy-lib-import-T3UP4G6G.js.map} +0 -0
- /package/bundle/{discord-adapter-WUNYPTDE.js.map → discord-adapter-4TTETYDI.js.map} +0 -0
- /package/bundle/{env-schema-MSDP2YBO.js.map → doctor-probes-VDWFJKUB.js.map} +0 -0
- /package/bundle/{gossip-CS3G3447.js.map → env-schema-4JXQUOH4.js.map} +0 -0
- /package/bundle/{guardrails-24XK2COI.js.map → gossip-3C3BSNPN.js.map} +0 -0
- /package/bundle/{heartbeat-system-G4IFQXT6.js.map → guardrails-DL7ZSWVN.js.map} +0 -0
- /package/bundle/{hook-system-X6INNJGV.js.map → heartbeat-system-TDDIOVTC.js.map} +0 -0
- /package/bundle/{hotskills-6FQYTJIO.js.map → hook-system-M3POLUIB.js.map} +0 -0
- /package/bundle/{kanban-board-J6RO3ZU7.js.map → hotskills-FWX4QI7V.js.map} +0 -0
- /package/bundle/{kanban-channel-5EIXBFSA.js.map → kanban-board-M326B2XJ.js.map} +0 -0
- /package/bundle/{lazy-require-V6EFUATC.js.map → kanban-channel-IJ52OMNA.js.map} +0 -0
- /package/bundle/{logger-Y3VILPRH.js.map → lazy-require-KCRVT4SI.js.map} +0 -0
- /package/bundle/{main-chat-YLZDNQPO.js.map → logger-OWCSNYCA.js.map} +0 -0
- /package/bundle/{logs-YS3GDURO.js.map → logs-FXS4SCEM.js.map} +0 -0
- /package/bundle/{master-user-Z4M7KCJE.js.map → main-chat-ZNUZCTNS.js.map} +0 -0
- /package/bundle/{message-pipeline-MHEBDJLH.js.map → master-user-HSKM4ZFN.js.map} +0 -0
- /package/bundle/{nerve-VZNMFDGY.js.map → message-pipeline-KSONH4MT.js.map} +0 -0
- /package/bundle/{notification-VV2OR6NW.js.map → nerve-IGSXBKZZ.js.map} +0 -0
- /package/bundle/{orc-tools-CHRSXSAS.js.map → notification-BFSIEECG.js.map} +0 -0
- /package/bundle/{orc-KC4USP55.js.map → orc-EIGVTHAV.js.map} +0 -0
- /package/bundle/{paths-EDK6KWHG.js.map → orc-tools-A3G7WCSJ.js.map} +0 -0
- /package/bundle/{paths-RZF6WDMG.js.map → paths-3ZVW3NFL.js.map} +0 -0
- /package/bundle/{peer-auth-SRONOLNG.js.map → paths-X4LRYUI6.js.map} +0 -0
- /package/bundle/{peer-config-FRWLEYQ5.js.map → peer-auth-QC4EF2PM.js.map} +0 -0
- /package/bundle/{peer-jwt-XY3XRIA2.js.map → peer-config-TN55LFDC.js.map} +0 -0
- /package/bundle/{peer-transport-UBBXTDRP.js.map → peer-jwt-NCCPXJRX.js.map} +0 -0
- /package/bundle/{phase-config-V4XETN5F.js.map → peer-transport-I6JPLFZ2.js.map} +0 -0
- /package/bundle/{phase-transport-4NQHZX75.js.map → phase-transport-2BRWACDF.js.map} +0 -0
- /package/bundle/{reconcile-2EUXJ6W5.js.map → reconcile-CTFCLQRN.js.map} +0 -0
- /package/bundle/{registry-client-VN2MM2HI.js.map → rollback-ANRI3T5Z.js.map} +0 -0
- /package/bundle/{rollback-MVZ53XS4.js.map → sha-tracker-ZWBP6CIJ.js.map} +0 -0
- /package/bundle/{sandbox-runtime-WHACQLLN.js.map → skill-stats-JORH5DGM.js.map} +0 -0
- /package/bundle/{sha-tracker-2DB4R2TW.js.map → skill-watcher-E4MGLKLS.js.map} +0 -0
- /package/bundle/{skill-stats-TPD2NROA.js.map → sleep-SRCSXY6T.js.map} +0 -0
- /package/bundle/{skill-watcher-D7QYYYON.js.map → soul-bundle-VWAVHCZ6.js.map} +0 -0
- /package/bundle/{sleep-GH6DLBJJ.js.map → spin-IMW2MZOH.js.map} +0 -0
- /package/bundle/{soul-bundle-GXLMDBCC.js.map → spin-types-BLPYAETA.js.map} +0 -0
- /package/bundle/{spin-4DBYHS3E.js.map → src-6BTCMOD3.js.map} +0 -0
- /package/bundle/{spin-types-PLJH3SIK.js.map → stt-LGVPXMVR.js.map} +0 -0
- /package/bundle/{src-SUFZ27S5.js.map → subagent-runtime-3UJB4HUB.js.map} +0 -0
- /package/bundle/{stt-KD3AABKG.js.map → task-store-W5BFIAIH.js.map} +0 -0
- /package/bundle/{telegram-adapter-UJ3RYYV6.js.map → telegram-adapter-7G773NII.js.map} +0 -0
- /package/bundle/{subagent-runtime-LVECAUPV.js.map → tool-registry-J6TE3I2T.js.map} +0 -0
- /package/bundle/{task-store-2XRDM3AW.js.map → tool-sandbox-4UC6GAKA.js.map} +0 -0
- /package/bundle/{tool-registry-YU6WBXPA.js.map → transport-config-KBF5W2DP.js.map} +0 -0
- /package/bundle/{tool-sandbox-RNNPDR5M.js.map → update-424ZZQQ6.js.map} +0 -0
- /package/bundle/{transport-config-OK3MZPJK.js.map → usage-tracker-NXD364VX.js.map} +0 -0
- /package/bundle/{update-ENNPRW7Y.js.map → user-registry-35BW4XKM.js.map} +0 -0
- /package/bundle/{usage-tracker-HRSGC7QC.js.map → wrapper-W66YICNZ.js.map} +0 -0
|
@@ -0,0 +1,180 @@
|
|
|
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>
|
|
@@ -0,0 +1,437 @@
|
|
|
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
|