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.
Files changed (392) hide show
  1. package/bundle/{_registry.generated-7DRCE4V6.js → _registry.generated-RC6PEH6Z.js} +16 -15
  2. package/bundle/{_registry.generated-7DRCE4V6.js.map → _registry.generated-RC6PEH6Z.js.map} +1 -1
  3. package/bundle/abtars-browser.js +6 -5
  4. package/bundle/abtars-browser.js.map +1 -1
  5. package/bundle/abtars-cli.js +73 -46
  6. package/bundle/abtars-cli.js.map +3 -3
  7. package/bundle/abtars-restart.js +7 -7
  8. package/bundle/abtars-rss.js +2 -1
  9. package/bundle/abtars-rss.js.map +2 -2
  10. package/bundle/abtars-task.js +6 -5
  11. package/bundle/abtars-task.js.map +1 -1
  12. package/bundle/abtars-todo.js +2 -1
  13. package/bundle/abtars-todo.js.map +1 -1
  14. package/bundle/abtars.js +307 -212
  15. package/bundle/abtars.js.map +4 -4
  16. package/bundle/{acp-raw-client-AZJCEB6S.js → acp-raw-client-E6FM45NC.js} +4 -3
  17. package/bundle/{acp-raw-client-AZJCEB6S.js.map → acp-raw-client-E6FM45NC.js.map} +1 -1
  18. package/bundle/{action-gate-QYJL57IX.js → action-gate-G2V47NHW.js} +4 -3
  19. package/bundle/{action-gate-QYJL57IX.js.map → action-gate-G2V47NHW.js.map} +1 -1
  20. package/bundle/{agent-api-adapter-PYMNQXHE.js → agent-api-adapter-PTJYZKQK.js} +5 -4
  21. package/bundle/{agent-api-adapter-PYMNQXHE.js.map → agent-api-adapter-PTJYZKQK.js.map} +1 -1
  22. package/bundle/{agent-api-rate-limit-4GEZ4YN5.js → agent-api-rate-limit-WCFXJMGY.js} +6 -5
  23. package/bundle/{agent-registry-563P4EUJ.js → agent-registry-GU7ABOK5.js} +9 -8
  24. package/bundle/bootstrap-POWWTU6I.js +63 -0
  25. package/bundle/bootstrap-POWWTU6I.js.map +7 -0
  26. package/bundle/{bridge-lock-transport-LXCF2IVN.js → bridge-lock-transport-4ZH7QTJP.js} +6 -5
  27. package/bundle/{browser-2VZOGOGX.js → browser-EJNS35NT.js} +8 -7
  28. package/bundle/{budget-PPA7WY3D.js → budget-45QOBDWA.js} +5 -4
  29. package/bundle/{budget-PPA7WY3D.js.map → budget-45QOBDWA.js.map} +1 -1
  30. package/bundle/{capability-WXEA2WFK.js → capability-JFWX3IQF.js} +7 -6
  31. package/bundle/{chunk-CB6S3ZRF.js → chunk-2FAZIA37.js} +3 -3
  32. package/bundle/{chunk-VJATH7AN.js → chunk-2KC5G3EA.js} +9 -8
  33. package/bundle/chunk-2KC5G3EA.js.map +7 -0
  34. package/bundle/{chunk-OY2HAK33.js → chunk-36ZEYDKZ.js} +1 -1
  35. package/bundle/chunk-36ZEYDKZ.js.map +7 -0
  36. package/bundle/{chunk-2FZJDMAF.js → chunk-3CACHBDI.js} +10 -10
  37. package/bundle/{chunk-O4GKI3Q3.js → chunk-4S554KLW.js} +4 -4
  38. package/bundle/{chunk-3QW2K53E.js → chunk-5GCLBUBS.js} +11 -19
  39. package/bundle/chunk-5GCLBUBS.js.map +7 -0
  40. package/bundle/{chunk-RJX45XIC.js → chunk-5HDSQFT6.js} +9 -4
  41. package/bundle/chunk-5HDSQFT6.js.map +7 -0
  42. package/bundle/{chunk-EDZGF6BC.js → chunk-5NY2YULC.js} +11 -4
  43. package/bundle/chunk-5NY2YULC.js.map +7 -0
  44. package/bundle/{chunk-LE23VPN3.js → chunk-63A7ZRIH.js} +4 -4
  45. package/bundle/{chunk-LE23VPN3.js.map → chunk-63A7ZRIH.js.map} +1 -1
  46. package/bundle/{chunk-SSCGWDIC.js → chunk-65VCEC32.js} +2 -2
  47. package/bundle/{chunk-V2QIAXWZ.js → chunk-7BSQ5UQO.js} +3 -3
  48. package/bundle/{chunk-E7MV7WFT.js → chunk-7Z3HBPRY.js} +6 -6
  49. package/bundle/{chunk-TY26WMQY.js → chunk-AFREM7FX.js} +2 -2
  50. package/bundle/{chunk-GCFIK6OB.js → chunk-AO32N2VB.js} +92 -20
  51. package/bundle/chunk-AO32N2VB.js.map +7 -0
  52. package/bundle/{chunk-N5VROZ7A.js → chunk-B6ZN6COK.js} +5 -5
  53. package/bundle/{chunk-M6Q3IQ4H.js → chunk-BFDBGESM.js} +259 -122
  54. package/bundle/chunk-BFDBGESM.js.map +7 -0
  55. package/bundle/{chunk-YEOZN5IE.js → chunk-DYBW4XXL.js} +2 -2
  56. package/bundle/{chunk-56D3Y44D.js → chunk-EFJVUJBE.js} +10 -10
  57. package/bundle/{chunk-S6HEHCCG.js → chunk-EQSG2CRM.js} +83 -46
  58. package/bundle/chunk-EQSG2CRM.js.map +7 -0
  59. package/bundle/{chunk-FIAVVKGN.js → chunk-EUZDKV3C.js} +3 -3
  60. package/bundle/{chunk-2LKQV2ND.js → chunk-FRKW6LWB.js} +3 -3
  61. package/bundle/{chunk-H2K23MOF.js → chunk-GALQBVKO.js} +21 -5
  62. package/bundle/chunk-GALQBVKO.js.map +7 -0
  63. package/bundle/{chunk-DNDYD5SL.js → chunk-GP4XUKI5.js} +3 -3
  64. package/bundle/{chunk-SXNY6HC4.js → chunk-GPZNXY2U.js} +6 -6
  65. package/bundle/chunk-GPZNXY2U.js.map +7 -0
  66. package/bundle/{chunk-W726UGI6.js → chunk-GRVWZO4C.js} +3 -3
  67. package/bundle/{chunk-IXKQ4JMX.js → chunk-GVM5YU5I.js} +33 -17
  68. package/bundle/chunk-GVM5YU5I.js.map +7 -0
  69. package/bundle/{chunk-OOKNHOCB.js → chunk-GWILHZPT.js} +2 -2
  70. package/bundle/{chunk-3LQOJVTB.js → chunk-HFOCNYEO.js} +1842 -1220
  71. package/bundle/{chunk-3LQOJVTB.js.map → chunk-HFOCNYEO.js.map} +4 -4
  72. package/bundle/{chunk-NP72ZB7P.js → chunk-HMKVL7AX.js} +53 -47
  73. package/bundle/chunk-HMKVL7AX.js.map +7 -0
  74. package/bundle/{chunk-BNBC4T45.js → chunk-HT2BPTZY.js} +3 -3
  75. package/bundle/{chunk-BU7LTI2W.js → chunk-HZDLFLRP.js} +6 -7
  76. package/bundle/chunk-HZDLFLRP.js.map +7 -0
  77. package/bundle/{chunk-FVUL44T4.js → chunk-IJT4KWXT.js} +2 -2
  78. package/bundle/{chunk-IK4R3RBZ.js → chunk-JNIHEDKF.js} +3 -3
  79. package/bundle/{chunk-J5NOL4DB.js → chunk-JQDJPUHM.js} +16 -6
  80. package/bundle/chunk-JQDJPUHM.js.map +7 -0
  81. package/bundle/{chunk-SESM4GBM.js → chunk-KTYGKPYM.js} +52 -25
  82. package/bundle/chunk-KTYGKPYM.js.map +7 -0
  83. package/bundle/chunk-LME23AA2.js +37 -0
  84. package/bundle/chunk-LME23AA2.js.map +7 -0
  85. package/bundle/{chunk-4PIVWXUJ.js → chunk-LUNA6PM5.js} +2 -2
  86. package/bundle/{chunk-37EX63K4.js → chunk-LUW62WGO.js} +6998 -3621
  87. package/bundle/chunk-LUW62WGO.js.map +7 -0
  88. package/bundle/{chunk-MV5KOWOR.js → chunk-NDCRWEEJ.js} +7 -7
  89. package/bundle/{chunk-7WHXTCVD.js → chunk-NRUSRJXR.js} +8 -3
  90. package/bundle/chunk-NRUSRJXR.js.map +7 -0
  91. package/bundle/{chunk-C3EYYJN3.js → chunk-O7KQG6ME.js} +17 -5
  92. package/bundle/chunk-O7KQG6ME.js.map +7 -0
  93. package/bundle/{chunk-ZOCEBV62.js → chunk-OKAQICWY.js} +3 -3
  94. package/bundle/{chunk-TCI6FZTP.js → chunk-OLAURO5G.js} +9 -9
  95. package/bundle/{chunk-YME7NRGP.js → chunk-OXTSWQCX.js} +2 -2
  96. package/bundle/{chunk-HDOFJVFS.js → chunk-PEDX56EL.js} +3 -3
  97. package/bundle/{chunk-7RAGSHSH.js → chunk-PROPYS3P.js} +12 -10
  98. package/bundle/chunk-PROPYS3P.js.map +7 -0
  99. package/bundle/{chunk-ASYX43OU.js → chunk-Q32H6VPU.js} +26 -26
  100. package/bundle/{chunk-P5O6QZDC.js → chunk-QROWBWLL.js} +10 -6
  101. package/bundle/chunk-QROWBWLL.js.map +7 -0
  102. package/bundle/{chunk-S7ZIGIR5.js → chunk-R76K6L6H.js} +27 -27
  103. package/bundle/{chunk-S7ZIGIR5.js.map → chunk-R76K6L6H.js.map} +1 -1
  104. package/bundle/{chunk-MQJG7OJX.js → chunk-RIHQ37U5.js} +38 -36
  105. package/bundle/chunk-RIHQ37U5.js.map +7 -0
  106. package/bundle/{chunk-IQKADER4.js → chunk-RWRRGE4U.js} +2 -2
  107. package/bundle/{chunk-72T2Q7IG.js → chunk-S5GD5EJ5.js} +271 -282
  108. package/bundle/chunk-S5GD5EJ5.js.map +7 -0
  109. package/bundle/{chunk-ULO2PX3T.js → chunk-TEFZ4JA4.js} +3 -3
  110. package/bundle/{chunk-2RGR3LSV.js → chunk-TMUYFERL.js} +2 -2
  111. package/bundle/{chunk-KBPVJGD7.js → chunk-URQPDCK5.js} +3 -3
  112. package/bundle/chunk-UUIHL65U.js +77 -0
  113. package/bundle/chunk-UUIHL65U.js.map +7 -0
  114. package/bundle/{chunk-FJF42RZY.js → chunk-VUIX5AGB.js} +3 -3
  115. package/bundle/{chunk-5V4VHKEA.js → chunk-WBTJ2E62.js} +5 -4
  116. package/bundle/chunk-WBTJ2E62.js.map +7 -0
  117. package/bundle/{chunk-ZY6DH2S4.js → chunk-WTIGZO3N.js} +80 -70
  118. package/bundle/chunk-WTIGZO3N.js.map +7 -0
  119. package/bundle/{chunk-4HNCOQSK.js → chunk-WYHGNI56.js} +7 -7
  120. package/bundle/{chunk-24V4A6RP.js → chunk-XX6BGTPO.js} +4 -4
  121. package/bundle/{chunk-T7TAWGBX.js → chunk-Y76VUJSF.js} +2 -2
  122. package/bundle/{chunk-TVSPVZTX.js → chunk-YDY6QVWJ.js} +3 -3
  123. package/bundle/{chunk-V6CV3QPH.js → chunk-YRSMGJFP.js} +2 -2
  124. package/bundle/{chunk-WP7FZHMI.js → chunk-YSKCQH6E.js} +2 -2
  125. package/bundle/{chunk-NGZVJ52F.js → chunk-ZKJOFASV.js} +7 -7
  126. package/bundle/{chunk-WGWM4IZM.js → chunk-ZT5ZBGWS.js} +4 -4
  127. package/bundle/{chunk-WGWM4IZM.js.map → chunk-ZT5ZBGWS.js.map} +1 -1
  128. package/bundle/{chunk-43DKPXTP.js → chunk-ZV4IWKDJ.js} +4 -4
  129. package/bundle/{commands-XXFU2ZF7.js → commands-EWA4HNCM.js} +20 -20
  130. package/bundle/{config-EWDZ234X.js → config-M3P5IOAI.js} +8 -7
  131. package/bundle/{config-show-6J33O4TE.js → config-show-3DHPP26D.js} +5 -5
  132. package/bundle/{context-OCS7HLJP.js → context-5P7IYYU2.js} +5 -2
  133. package/bundle/{context-OCS7HLJP.js.map → context-5P7IYYU2.js.map} +1 -1
  134. package/bundle/{daemon-LTDAXNA2.js → daemon-TB23FFWY.js} +7 -7
  135. package/bundle/{delegation-tools-YDTWQMZD.js → delegation-tools-P2SCNL23.js} +14 -11
  136. package/bundle/{registry-client-VN2MM2HI.js → deploy-YYUCGGP3.js} +10 -6
  137. package/bundle/{deploy-lib-import-RGZJ3CGC.js → deploy-lib-import-T3UP4G6G.js} +5 -3
  138. package/bundle/{deps-PHSLIA77.js → deps-WVK553KF.js} +21 -19
  139. package/bundle/deps-WVK553KF.js.map +7 -0
  140. package/bundle/{direct-api-transport-OAKYQBJR.js → direct-api-transport-WQ6HA5OX.js} +30 -28
  141. package/bundle/direct-api-transport-WQ6HA5OX.js.map +7 -0
  142. package/bundle/{discord-adapter-WUNYPTDE.js → discord-adapter-4TTETYDI.js} +26 -26
  143. package/bundle/{dist-7HEHHQI2.js → dist-KMK7TZGN.js} +376 -348
  144. package/bundle/dist-KMK7TZGN.js.map +7 -0
  145. package/bundle/{dns-wakeup-F55ALHXJ.js → dns-wakeup-IDOJIXBX.js} +4 -3
  146. package/bundle/{dns-wakeup-F55ALHXJ.js.map → dns-wakeup-IDOJIXBX.js.map} +1 -1
  147. package/bundle/{doctor-probes-3SLIUGKS.js → doctor-probes-VDWFJKUB.js} +4 -3
  148. package/bundle/{env-schema-MSDP2YBO.js → env-schema-4JXQUOH4.js} +5 -4
  149. package/bundle/{gossip-CS3G3447.js → gossip-3C3BSNPN.js} +7 -6
  150. package/bundle/{guardrails-24XK2COI.js → guardrails-DL7ZSWVN.js} +6 -5
  151. package/bundle/{health-check-FRUNRVNQ.js → health-check-YKWFD2LZ.js} +5 -6
  152. package/bundle/{health-check-FRUNRVNQ.js.map → health-check-YKWFD2LZ.js.map} +2 -2
  153. package/bundle/{heartbeat-system-G4IFQXT6.js → heartbeat-system-TDDIOVTC.js} +7 -6
  154. package/bundle/{heartbeat-tier3-3ZO3EVXP.js → heartbeat-tier3-55T2HUNE.js} +45 -44
  155. package/bundle/heartbeat-tier3-55T2HUNE.js.map +7 -0
  156. package/bundle/{hook-system-X6INNJGV.js → hook-system-M3POLUIB.js} +5 -4
  157. package/bundle/{hotskills-6FQYTJIO.js → hotskills-FWX4QI7V.js} +7 -6
  158. package/bundle/{install-ZAHTZ5M5.js → install-4MXBYIUG.js} +23 -20
  159. package/bundle/install-4MXBYIUG.js.map +7 -0
  160. package/bundle/{install-manifest-QX7KVDCA.js → install-manifest-5PPWMD2W.js} +4 -3
  161. package/bundle/{install-manifest-QX7KVDCA.js.map → install-manifest-5PPWMD2W.js.map} +1 -1
  162. package/bundle/{irc-adapter-IEJQKKJF.js → irc-adapter-PTTZD32W.js} +5 -4
  163. package/bundle/{irc-adapter-IEJQKKJF.js.map → irc-adapter-PTTZD32W.js.map} +1 -1
  164. package/bundle/{irc-config-TTWNYFLH.js → irc-config-CP7ZMUOX.js} +6 -5
  165. package/bundle/{irc-config-TTWNYFLH.js.map → irc-config-CP7ZMUOX.js.map} +1 -1
  166. package/bundle/{kanban-board-J6RO3ZU7.js → kanban-board-M326B2XJ.js} +7 -5
  167. package/bundle/{kanban-channel-5EIXBFSA.js → kanban-channel-IJ52OMNA.js} +8 -6
  168. package/bundle/{lazy-require-V6EFUATC.js → lazy-require-KCRVT4SI.js} +11 -6
  169. package/bundle/{logger-Y3VILPRH.js → logger-OWCSNYCA.js} +4 -3
  170. package/bundle/{logs-YS3GDURO.js → logs-FXS4SCEM.js} +5 -5
  171. package/bundle/{main-chat-YLZDNQPO.js → main-chat-ZNUZCTNS.js} +6 -5
  172. package/bundle/{master-user-Z4M7KCJE.js → master-user-HSKM4ZFN.js} +7 -6
  173. package/bundle/{media-utils-P6RZ2K3U.js → media-utils-3ZYOD7SK.js} +44 -43
  174. package/bundle/{media-utils-P6RZ2K3U.js.map → media-utils-3ZYOD7SK.js.map} +2 -2
  175. package/bundle/{message-pipeline-MHEBDJLH.js → message-pipeline-KSONH4MT.js} +20 -20
  176. package/bundle/meta.json +9327 -8582
  177. package/bundle/{migrate-layout-RJJQLVGR.js → migrate-layout-IJIEJY3A.js} +8 -4
  178. package/bundle/migrate-layout-IJIEJY3A.js.map +7 -0
  179. package/bundle/{nerve-VZNMFDGY.js → nerve-IGSXBKZZ.js} +5 -4
  180. package/bundle/{notification-VV2OR6NW.js → notification-BFSIEECG.js} +8 -7
  181. package/bundle/{openrouter-credits-LXC7P4G6.js → openrouter-credits-NTVZDRYM.js} +5 -4
  182. package/bundle/{openrouter-credits-LXC7P4G6.js.map → openrouter-credits-NTVZDRYM.js.map} +1 -1
  183. package/bundle/{orc-KC4USP55.js → orc-EIGVTHAV.js} +4 -4
  184. package/bundle/{orc-tools-CHRSXSAS.js → orc-tools-A3G7WCSJ.js} +5 -4
  185. package/bundle/{paths-EDK6KWHG.js → paths-3ZVW3NFL.js} +6 -2
  186. package/bundle/{paths-RZF6WDMG.js → paths-X4LRYUI6.js} +3 -2
  187. package/bundle/{peer-auth-SRONOLNG.js → peer-auth-QC4EF2PM.js} +9 -8
  188. package/bundle/{peer-client-VOF77T6C.js → peer-client-RGEU5HOK.js} +9 -8
  189. package/bundle/{peer-client-VOF77T6C.js.map → peer-client-RGEU5HOK.js.map} +1 -1
  190. package/bundle/{peer-config-FRWLEYQ5.js → peer-config-TN55LFDC.js} +6 -5
  191. package/bundle/{peer-jwt-XY3XRIA2.js → peer-jwt-NCCPXJRX.js} +6 -5
  192. package/bundle/{peer-transport-UBBXTDRP.js → peer-transport-I6JPLFZ2.js} +8 -7
  193. package/bundle/{phase-transport-4NQHZX75.js → phase-transport-2BRWACDF.js} +18 -16
  194. package/bundle/public/css/dashboard.css +542 -0
  195. package/bundle/public/index.html +180 -0
  196. package/bundle/public/js/app.js +437 -0
  197. package/bundle/public/memory-universe.js +384 -0
  198. package/bundle/{reconcile-2EUXJ6W5.js → reconcile-CTFCLQRN.js} +5 -4
  199. package/bundle/{reconciler-FFQGV4DO.js → reconciler-FHESO6OC.js} +14 -11
  200. package/bundle/{reconciler-FFQGV4DO.js.map → reconciler-FHESO6OC.js.map} +1 -1
  201. package/bundle/{restore-NFDE2RG6.js → restore-IFHPI7I7.js} +13 -9
  202. package/bundle/{restore-NFDE2RG6.js.map → restore-IFHPI7I7.js.map} +3 -3
  203. package/bundle/{rollback-MVZ53XS4.js → rollback-ANRI3T5Z.js} +5 -5
  204. package/bundle/{chunk-SKY6656M.js → sandbox-runtime-QROWHDCS.js} +11 -28
  205. package/bundle/{chunk-SKY6656M.js.map → sandbox-runtime-QROWHDCS.js.map} +1 -1
  206. package/bundle/{self-healer-utils-KD6LV63S.js → self-healer-utils-IFAYOQO2.js} +5 -4
  207. package/bundle/{self-healer-utils-KD6LV63S.js.map → self-healer-utils-IFAYOQO2.js.map} +1 -1
  208. package/bundle/{sha-tracker-2DB4R2TW.js → sha-tracker-ZWBP6CIJ.js} +5 -4
  209. package/bundle/{skill-session-BPDVA6ZG.js → skill-session-AXBDQSLQ.js} +5 -4
  210. package/bundle/{skill-session-BPDVA6ZG.js.map → skill-session-AXBDQSLQ.js.map} +1 -1
  211. package/bundle/{skill-stats-TPD2NROA.js → skill-stats-JORH5DGM.js} +6 -5
  212. package/bundle/{skill-watcher-D7QYYYON.js → skill-watcher-E4MGLKLS.js} +6 -5
  213. package/bundle/{sleep-GH6DLBJJ.js → sleep-SRCSXY6T.js} +10 -9
  214. package/bundle/{soul-bundle-GXLMDBCC.js → soul-bundle-VWAVHCZ6.js} +10 -9
  215. package/bundle/{spin-4DBYHS3E.js → spin-IMW2MZOH.js} +13 -10
  216. package/bundle/{spin-notifications-IKYJPER5.js → spin-notifications-SE2HVZI7.js} +7 -5
  217. package/bundle/{spin-notifications-IKYJPER5.js.map → spin-notifications-SE2HVZI7.js.map} +1 -1
  218. package/bundle/{spin-types-PLJH3SIK.js → spin-types-BLPYAETA.js} +5 -4
  219. package/bundle/{src-SUFZ27S5.js → src-6BTCMOD3.js} +4 -4
  220. package/bundle/{sse-parser-anthropic-U7ILHOY5.js → sse-parser-anthropic-A6R4Z2TB.js} +5 -4
  221. package/bundle/{sse-parser-anthropic-U7ILHOY5.js.map → sse-parser-anthropic-A6R4Z2TB.js.map} +1 -1
  222. package/bundle/{sse-parser-responses-OI73R3AH.js → sse-parser-responses-HSZY3QGJ.js} +5 -4
  223. package/bundle/{sse-parser-responses-OI73R3AH.js.map → sse-parser-responses-HSZY3QGJ.js.map} +1 -1
  224. package/bundle/{ssrf-guard-6GP4QYVA.js → ssrf-guard-O6SHIK6Q.js} +5 -4
  225. package/bundle/{ssrf-guard-6GP4QYVA.js.map → ssrf-guard-O6SHIK6Q.js.map} +1 -1
  226. package/bundle/{start-JT2BPMSW.js → start-7QZIWO3S.js} +5 -5
  227. package/bundle/start-7QZIWO3S.js.map +7 -0
  228. package/bundle/{stt-KD3AABKG.js → stt-LGVPXMVR.js} +6 -5
  229. package/bundle/{subagent-runtime-LVECAUPV.js → subagent-runtime-3UJB4HUB.js} +6 -5
  230. package/bundle/system-status-ATGKRRQI.js +349 -0
  231. package/bundle/system-status-ATGKRRQI.js.map +7 -0
  232. package/bundle/{task-store-2XRDM3AW.js → task-store-W5BFIAIH.js} +6 -5
  233. package/bundle/{telegram-adapter-UJ3RYYV6.js → telegram-adapter-7G773NII.js} +35 -35
  234. package/bundle/{tool-registry-YU6WBXPA.js → tool-registry-J6TE3I2T.js} +25 -23
  235. package/bundle/{tool-sandbox-RNNPDR5M.js → tool-sandbox-4UC6GAKA.js} +6 -5
  236. package/bundle/{transport-config-OK3MZPJK.js → transport-config-KBF5W2DP.js} +9 -8
  237. package/bundle/{update-ENNPRW7Y.js → update-424ZZQQ6.js} +6 -6
  238. package/bundle/{update-check-SJB6GV3A.js → update-check-7UWKBJOP.js} +3 -2
  239. package/bundle/{update-check-SJB6GV3A.js.map → update-check-7UWKBJOP.js.map} +1 -1
  240. package/bundle/{usage-tracker-HRSGC7QC.js → usage-tracker-NXD364VX.js} +2 -2
  241. package/bundle/{user-registry-6PUJJ5J2.js → user-registry-35BW4XKM.js} +6 -5
  242. package/bundle/{wrapper-WLHLG4MI.js → wrapper-W66YICNZ.js} +3 -3
  243. package/bundle/{ws-peer-client-WHW3RJTD.js → ws-peer-client-AIXCXF7V.js} +15 -14
  244. package/bundle/{ws-peer-client-WHW3RJTD.js.map → ws-peer-client-AIXCXF7V.js.map} +2 -2
  245. package/package.json +4 -8
  246. package/scripts/emergency-deploy.sh +11 -8
  247. package/scripts/emergency-update.sh +156 -23
  248. package/templates/config/.env +1 -1
  249. package/templates/config/models.json +13 -0
  250. package/bundle/chunk-37EX63K4.js.map +0 -7
  251. package/bundle/chunk-3QW2K53E.js.map +0 -7
  252. package/bundle/chunk-5V4VHKEA.js.map +0 -7
  253. package/bundle/chunk-72T2Q7IG.js.map +0 -7
  254. package/bundle/chunk-7RAGSHSH.js.map +0 -7
  255. package/bundle/chunk-7WHXTCVD.js.map +0 -7
  256. package/bundle/chunk-BU7LTI2W.js.map +0 -7
  257. package/bundle/chunk-C3EYYJN3.js.map +0 -7
  258. package/bundle/chunk-CAOIIVFP.js +0 -110
  259. package/bundle/chunk-CAOIIVFP.js.map +0 -7
  260. package/bundle/chunk-EDZGF6BC.js.map +0 -7
  261. package/bundle/chunk-GCFIK6OB.js.map +0 -7
  262. package/bundle/chunk-H2K23MOF.js.map +0 -7
  263. package/bundle/chunk-HAZHNBBY.js +0 -156
  264. package/bundle/chunk-HAZHNBBY.js.map +0 -7
  265. package/bundle/chunk-IXKQ4JMX.js.map +0 -7
  266. package/bundle/chunk-J5NOL4DB.js.map +0 -7
  267. package/bundle/chunk-JAJ3DUQ2.js +0 -30
  268. package/bundle/chunk-JAJ3DUQ2.js.map +0 -7
  269. package/bundle/chunk-KMFR5AVY.js +0 -45
  270. package/bundle/chunk-KMFR5AVY.js.map +0 -7
  271. package/bundle/chunk-M6Q3IQ4H.js.map +0 -7
  272. package/bundle/chunk-MQJG7OJX.js.map +0 -7
  273. package/bundle/chunk-NP72ZB7P.js.map +0 -7
  274. package/bundle/chunk-OY2HAK33.js.map +0 -7
  275. package/bundle/chunk-P5O6QZDC.js.map +0 -7
  276. package/bundle/chunk-RJX45XIC.js.map +0 -7
  277. package/bundle/chunk-S6HEHCCG.js.map +0 -7
  278. package/bundle/chunk-SESM4GBM.js.map +0 -7
  279. package/bundle/chunk-SXNY6HC4.js.map +0 -7
  280. package/bundle/chunk-VJATH7AN.js.map +0 -7
  281. package/bundle/chunk-ZY6DH2S4.js.map +0 -7
  282. package/bundle/deps-PHSLIA77.js.map +0 -7
  283. package/bundle/direct-api-transport-OAKYQBJR.js.map +0 -7
  284. package/bundle/dist-7HEHHQI2.js.map +0 -7
  285. package/bundle/heartbeat-tier3-3ZO3EVXP.js.map +0 -7
  286. package/bundle/install-ZAHTZ5M5.js.map +0 -7
  287. package/bundle/migrate-layout-RJJQLVGR.js.map +0 -7
  288. package/bundle/phase-config-V4XETN5F.js +0 -18
  289. package/bundle/sandbox-runtime-WHACQLLN.js +0 -22
  290. package/bundle/start-JT2BPMSW.js.map +0 -7
  291. package/bundle/system-status-XXJWTVJN.js +0 -243
  292. package/bundle/system-status-XXJWTVJN.js.map +0 -7
  293. package/bundle/user-registry-6PUJJ5J2.js.map +0 -7
  294. package/bundle/wrapper-WLHLG4MI.js.map +0 -7
  295. /package/bundle/{agent-api-rate-limit-4GEZ4YN5.js.map → agent-api-rate-limit-WCFXJMGY.js.map} +0 -0
  296. /package/bundle/{agent-registry-563P4EUJ.js.map → agent-registry-GU7ABOK5.js.map} +0 -0
  297. /package/bundle/{bridge-lock-transport-LXCF2IVN.js.map → bridge-lock-transport-4ZH7QTJP.js.map} +0 -0
  298. /package/bundle/{browser-2VZOGOGX.js.map → browser-EJNS35NT.js.map} +0 -0
  299. /package/bundle/{capability-WXEA2WFK.js.map → capability-JFWX3IQF.js.map} +0 -0
  300. /package/bundle/{chunk-CB6S3ZRF.js.map → chunk-2FAZIA37.js.map} +0 -0
  301. /package/bundle/{chunk-2FZJDMAF.js.map → chunk-3CACHBDI.js.map} +0 -0
  302. /package/bundle/{chunk-O4GKI3Q3.js.map → chunk-4S554KLW.js.map} +0 -0
  303. /package/bundle/{chunk-SSCGWDIC.js.map → chunk-65VCEC32.js.map} +0 -0
  304. /package/bundle/{chunk-V2QIAXWZ.js.map → chunk-7BSQ5UQO.js.map} +0 -0
  305. /package/bundle/{chunk-E7MV7WFT.js.map → chunk-7Z3HBPRY.js.map} +0 -0
  306. /package/bundle/{chunk-TY26WMQY.js.map → chunk-AFREM7FX.js.map} +0 -0
  307. /package/bundle/{chunk-N5VROZ7A.js.map → chunk-B6ZN6COK.js.map} +0 -0
  308. /package/bundle/{chunk-YEOZN5IE.js.map → chunk-DYBW4XXL.js.map} +0 -0
  309. /package/bundle/{chunk-56D3Y44D.js.map → chunk-EFJVUJBE.js.map} +0 -0
  310. /package/bundle/{chunk-FIAVVKGN.js.map → chunk-EUZDKV3C.js.map} +0 -0
  311. /package/bundle/{chunk-2LKQV2ND.js.map → chunk-FRKW6LWB.js.map} +0 -0
  312. /package/bundle/{chunk-DNDYD5SL.js.map → chunk-GP4XUKI5.js.map} +0 -0
  313. /package/bundle/{chunk-W726UGI6.js.map → chunk-GRVWZO4C.js.map} +0 -0
  314. /package/bundle/{chunk-OOKNHOCB.js.map → chunk-GWILHZPT.js.map} +0 -0
  315. /package/bundle/{chunk-BNBC4T45.js.map → chunk-HT2BPTZY.js.map} +0 -0
  316. /package/bundle/{chunk-FVUL44T4.js.map → chunk-IJT4KWXT.js.map} +0 -0
  317. /package/bundle/{chunk-IK4R3RBZ.js.map → chunk-JNIHEDKF.js.map} +0 -0
  318. /package/bundle/{chunk-4PIVWXUJ.js.map → chunk-LUNA6PM5.js.map} +0 -0
  319. /package/bundle/{chunk-MV5KOWOR.js.map → chunk-NDCRWEEJ.js.map} +0 -0
  320. /package/bundle/{chunk-ZOCEBV62.js.map → chunk-OKAQICWY.js.map} +0 -0
  321. /package/bundle/{chunk-TCI6FZTP.js.map → chunk-OLAURO5G.js.map} +0 -0
  322. /package/bundle/{chunk-YME7NRGP.js.map → chunk-OXTSWQCX.js.map} +0 -0
  323. /package/bundle/{chunk-HDOFJVFS.js.map → chunk-PEDX56EL.js.map} +0 -0
  324. /package/bundle/{chunk-ASYX43OU.js.map → chunk-Q32H6VPU.js.map} +0 -0
  325. /package/bundle/{chunk-IQKADER4.js.map → chunk-RWRRGE4U.js.map} +0 -0
  326. /package/bundle/{chunk-ULO2PX3T.js.map → chunk-TEFZ4JA4.js.map} +0 -0
  327. /package/bundle/{chunk-2RGR3LSV.js.map → chunk-TMUYFERL.js.map} +0 -0
  328. /package/bundle/{chunk-KBPVJGD7.js.map → chunk-URQPDCK5.js.map} +0 -0
  329. /package/bundle/{chunk-FJF42RZY.js.map → chunk-VUIX5AGB.js.map} +0 -0
  330. /package/bundle/{chunk-4HNCOQSK.js.map → chunk-WYHGNI56.js.map} +0 -0
  331. /package/bundle/{chunk-24V4A6RP.js.map → chunk-XX6BGTPO.js.map} +0 -0
  332. /package/bundle/{chunk-T7TAWGBX.js.map → chunk-Y76VUJSF.js.map} +0 -0
  333. /package/bundle/{chunk-TVSPVZTX.js.map → chunk-YDY6QVWJ.js.map} +0 -0
  334. /package/bundle/{chunk-V6CV3QPH.js.map → chunk-YRSMGJFP.js.map} +0 -0
  335. /package/bundle/{chunk-WP7FZHMI.js.map → chunk-YSKCQH6E.js.map} +0 -0
  336. /package/bundle/{chunk-NGZVJ52F.js.map → chunk-ZKJOFASV.js.map} +0 -0
  337. /package/bundle/{chunk-43DKPXTP.js.map → chunk-ZV4IWKDJ.js.map} +0 -0
  338. /package/bundle/{commands-XXFU2ZF7.js.map → commands-EWA4HNCM.js.map} +0 -0
  339. /package/bundle/{config-EWDZ234X.js.map → config-M3P5IOAI.js.map} +0 -0
  340. /package/bundle/{config-show-6J33O4TE.js.map → config-show-3DHPP26D.js.map} +0 -0
  341. /package/bundle/{daemon-LTDAXNA2.js.map → daemon-TB23FFWY.js.map} +0 -0
  342. /package/bundle/{delegation-tools-YDTWQMZD.js.map → delegation-tools-P2SCNL23.js.map} +0 -0
  343. /package/bundle/{deploy-lib-import-RGZJ3CGC.js.map → deploy-YYUCGGP3.js.map} +0 -0
  344. /package/bundle/{doctor-probes-3SLIUGKS.js.map → deploy-lib-import-T3UP4G6G.js.map} +0 -0
  345. /package/bundle/{discord-adapter-WUNYPTDE.js.map → discord-adapter-4TTETYDI.js.map} +0 -0
  346. /package/bundle/{env-schema-MSDP2YBO.js.map → doctor-probes-VDWFJKUB.js.map} +0 -0
  347. /package/bundle/{gossip-CS3G3447.js.map → env-schema-4JXQUOH4.js.map} +0 -0
  348. /package/bundle/{guardrails-24XK2COI.js.map → gossip-3C3BSNPN.js.map} +0 -0
  349. /package/bundle/{heartbeat-system-G4IFQXT6.js.map → guardrails-DL7ZSWVN.js.map} +0 -0
  350. /package/bundle/{hook-system-X6INNJGV.js.map → heartbeat-system-TDDIOVTC.js.map} +0 -0
  351. /package/bundle/{hotskills-6FQYTJIO.js.map → hook-system-M3POLUIB.js.map} +0 -0
  352. /package/bundle/{kanban-board-J6RO3ZU7.js.map → hotskills-FWX4QI7V.js.map} +0 -0
  353. /package/bundle/{kanban-channel-5EIXBFSA.js.map → kanban-board-M326B2XJ.js.map} +0 -0
  354. /package/bundle/{lazy-require-V6EFUATC.js.map → kanban-channel-IJ52OMNA.js.map} +0 -0
  355. /package/bundle/{logger-Y3VILPRH.js.map → lazy-require-KCRVT4SI.js.map} +0 -0
  356. /package/bundle/{main-chat-YLZDNQPO.js.map → logger-OWCSNYCA.js.map} +0 -0
  357. /package/bundle/{logs-YS3GDURO.js.map → logs-FXS4SCEM.js.map} +0 -0
  358. /package/bundle/{master-user-Z4M7KCJE.js.map → main-chat-ZNUZCTNS.js.map} +0 -0
  359. /package/bundle/{message-pipeline-MHEBDJLH.js.map → master-user-HSKM4ZFN.js.map} +0 -0
  360. /package/bundle/{nerve-VZNMFDGY.js.map → message-pipeline-KSONH4MT.js.map} +0 -0
  361. /package/bundle/{notification-VV2OR6NW.js.map → nerve-IGSXBKZZ.js.map} +0 -0
  362. /package/bundle/{orc-tools-CHRSXSAS.js.map → notification-BFSIEECG.js.map} +0 -0
  363. /package/bundle/{orc-KC4USP55.js.map → orc-EIGVTHAV.js.map} +0 -0
  364. /package/bundle/{paths-EDK6KWHG.js.map → orc-tools-A3G7WCSJ.js.map} +0 -0
  365. /package/bundle/{paths-RZF6WDMG.js.map → paths-3ZVW3NFL.js.map} +0 -0
  366. /package/bundle/{peer-auth-SRONOLNG.js.map → paths-X4LRYUI6.js.map} +0 -0
  367. /package/bundle/{peer-config-FRWLEYQ5.js.map → peer-auth-QC4EF2PM.js.map} +0 -0
  368. /package/bundle/{peer-jwt-XY3XRIA2.js.map → peer-config-TN55LFDC.js.map} +0 -0
  369. /package/bundle/{peer-transport-UBBXTDRP.js.map → peer-jwt-NCCPXJRX.js.map} +0 -0
  370. /package/bundle/{phase-config-V4XETN5F.js.map → peer-transport-I6JPLFZ2.js.map} +0 -0
  371. /package/bundle/{phase-transport-4NQHZX75.js.map → phase-transport-2BRWACDF.js.map} +0 -0
  372. /package/bundle/{reconcile-2EUXJ6W5.js.map → reconcile-CTFCLQRN.js.map} +0 -0
  373. /package/bundle/{registry-client-VN2MM2HI.js.map → rollback-ANRI3T5Z.js.map} +0 -0
  374. /package/bundle/{rollback-MVZ53XS4.js.map → sha-tracker-ZWBP6CIJ.js.map} +0 -0
  375. /package/bundle/{sandbox-runtime-WHACQLLN.js.map → skill-stats-JORH5DGM.js.map} +0 -0
  376. /package/bundle/{sha-tracker-2DB4R2TW.js.map → skill-watcher-E4MGLKLS.js.map} +0 -0
  377. /package/bundle/{skill-stats-TPD2NROA.js.map → sleep-SRCSXY6T.js.map} +0 -0
  378. /package/bundle/{skill-watcher-D7QYYYON.js.map → soul-bundle-VWAVHCZ6.js.map} +0 -0
  379. /package/bundle/{sleep-GH6DLBJJ.js.map → spin-IMW2MZOH.js.map} +0 -0
  380. /package/bundle/{soul-bundle-GXLMDBCC.js.map → spin-types-BLPYAETA.js.map} +0 -0
  381. /package/bundle/{spin-4DBYHS3E.js.map → src-6BTCMOD3.js.map} +0 -0
  382. /package/bundle/{spin-types-PLJH3SIK.js.map → stt-LGVPXMVR.js.map} +0 -0
  383. /package/bundle/{src-SUFZ27S5.js.map → subagent-runtime-3UJB4HUB.js.map} +0 -0
  384. /package/bundle/{stt-KD3AABKG.js.map → task-store-W5BFIAIH.js.map} +0 -0
  385. /package/bundle/{telegram-adapter-UJ3RYYV6.js.map → telegram-adapter-7G773NII.js.map} +0 -0
  386. /package/bundle/{subagent-runtime-LVECAUPV.js.map → tool-registry-J6TE3I2T.js.map} +0 -0
  387. /package/bundle/{task-store-2XRDM3AW.js.map → tool-sandbox-4UC6GAKA.js.map} +0 -0
  388. /package/bundle/{tool-registry-YU6WBXPA.js.map → transport-config-KBF5W2DP.js.map} +0 -0
  389. /package/bundle/{tool-sandbox-RNNPDR5M.js.map → update-424ZZQQ6.js.map} +0 -0
  390. /package/bundle/{transport-config-OK3MZPJK.js.map → usage-tracker-NXD364VX.js.map} +0 -0
  391. /package/bundle/{update-ENNPRW7Y.js.map → user-registry-35BW4XKM.js.map} +0 -0
  392. /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