openclaw-multi-auto 1.3.7 → 1.3.9

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 (414) hide show
  1. package/dist/{accounts-L9ByEpnP.js → accounts-C9HcPI9h.js} +2 -2
  2. package/dist/{accounts-BOzyfwW4.js → accounts-C_lW3Ag9.js} +2 -2
  3. package/dist/{accounts-yfBeCZtS.js → accounts-Tgelvk0C.js} +17 -17
  4. package/dist/{active-listener-D1yqT1cw.js → active-listener-BEdprTkn.js} +2 -2
  5. package/dist/{api-key-rotation-DtsNS2Nb.js → api-key-rotation-BJpKWXy0.js} +2 -2
  6. package/dist/{audio-preflight-DpxQCpsA.js → audio-preflight-BMvgEQ5j.js} +32 -32
  7. package/dist/{audio-transcription-runner-28fcRNNi.js → audio-transcription-runner-gLFfz8fr.js} +12 -12
  8. package/dist/{audit-membership-runtime-DWyHWAHM.js → audit-membership-runtime-Dntemq07.js} +4 -4
  9. package/dist/build-info.json +3 -3
  10. package/dist/bundled/boot-md/handler.js +51 -51
  11. package/dist/bundled/bootstrap-extra-files/handler.js +6 -6
  12. package/dist/bundled/command-logger/handler.js +2 -2
  13. package/dist/bundled/session-memory/handler.js +51 -51
  14. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  15. package/dist/{channel-activity-xHOMiarp.js → channel-activity-BDnjYF7B.js} +3 -3
  16. package/dist/{chrome-DwizpzOC.js → chrome-DxxEKrY7.js} +18 -18
  17. package/dist/{commands-registry-V1zZ5pPC.js → commands-registry-D5qXbFJn.js} +4 -4
  18. package/dist/control-ui/apple-touch-icon.png +0 -0
  19. package/dist/control-ui/assets/de-Bm0iuKxz.js +2 -0
  20. package/dist/control-ui/assets/de-Bm0iuKxz.js.map +1 -0
  21. package/dist/control-ui/assets/index-7XbUBC_m.js +8380 -0
  22. package/dist/control-ui/assets/index-7XbUBC_m.js.map +1 -0
  23. package/dist/control-ui/assets/index-E0j6Tkrc.css +1 -0
  24. package/dist/control-ui/assets/pt-BR-C2uaHesk.js +2 -0
  25. package/dist/control-ui/assets/pt-BR-C2uaHesk.js.map +1 -0
  26. package/dist/control-ui/assets/zh-CN-CqPGpAps.js +2 -0
  27. package/dist/control-ui/assets/zh-CN-CqPGpAps.js.map +1 -0
  28. package/dist/control-ui/assets/zh-TW-Cyl5GDQh.js +2 -0
  29. package/dist/control-ui/assets/zh-TW-Cyl5GDQh.js.map +1 -0
  30. package/dist/control-ui/favicon-32.png +0 -0
  31. package/dist/control-ui/favicon.ico +0 -0
  32. package/dist/control-ui/favicon.svg +22 -0
  33. package/dist/control-ui/index.html +17 -0
  34. package/dist/{deliver-D4o6VIur.js → deliver-DbdywYJE.js} +21 -21
  35. package/dist/deliver-runtime-BFs7iAZF.js +36 -0
  36. package/dist/deps-send-discord.runtime-DZUccI6Z.js +26 -0
  37. package/dist/deps-send-imessage.runtime-CF3OpoqY.js +25 -0
  38. package/dist/deps-send-signal.runtime-Cw4-ozeO.js +24 -0
  39. package/dist/deps-send-slack.runtime-BDsDhS1P.js +22 -0
  40. package/dist/deps-send-telegram.runtime-D_4xVasO.js +27 -0
  41. package/dist/deps-send-whatsapp.runtime-DK8jqd14.js +60 -0
  42. package/dist/{diagnostic-Bn4PZjMZ.js → diagnostic-Co6Kghr-.js} +2 -2
  43. package/dist/{errors-CCLeFWAg.js → errors-xt401nuk.js} +1 -1
  44. package/dist/{fetch-BlJWzEP6.js → fetch-DuraYswo.js} +5 -5
  45. package/dist/{fetch-guard-ChYBwfiy.js → fetch-guard-DWr0d00H.js} +2 -2
  46. package/dist/{frontmatter-CvaMP376.js → frontmatter-BkTfEZ93.js} +3 -3
  47. package/dist/{fs-safe-0jAo_Whb.js → fs-safe-CTYUrIgQ.js} +4 -4
  48. package/dist/{github-copilot-token-D13V9YBz.js → github-copilot-token-BDioPmd6.js} +7 -7
  49. package/dist/{image-Bbn53mzj.js → image-eT7Y-nP5.js} +6 -6
  50. package/dist/{image-ops-CehkHxmW.js → image-ops-BuUnEOE0.js} +2 -2
  51. package/dist/image-runtime-BcAK3n8a.js +29 -0
  52. package/dist/{ir-DAP-B-Xw.js → ir-B83looB-.js} +8 -8
  53. package/dist/{legacy-names-TyzbVqa_.js → legacy-names-DOC03BkU.js} +1 -1
  54. package/dist/llm-slug-generator.js +51 -51
  55. package/dist/{logger-DMZQQtxK.js → logger-BfjWMCSD.js} +7 -7
  56. package/dist/{login-DiCctRo1.js → login-CrIwcrVI.js} +5 -5
  57. package/dist/{login-qr-MUbXgjtd.js → login-qr-BpPDZdl_.js} +10 -10
  58. package/dist/{manager-BW_NSIMl.js → manager-1bvuGrNR.js} +13 -13
  59. package/dist/manager-runtime-FO1Sx3W8.js +18 -0
  60. package/dist/{model-selection-idoqPmw0.js → model-selection-Dna0Gz1k.js} +43 -43
  61. package/dist/{outbound-C2kanETZ.js → outbound-ChDjtuD6.js} +6 -6
  62. package/dist/{outbound-attachment-DBrYWX8h.js → outbound-attachment-DqHlD21U.js} +2 -2
  63. package/dist/{path-alias-guards-DqXRZmsL.js → path-alias-guards-BzvdLvTI.js} +1 -1
  64. package/dist/{paths-CCxysrzL.js → paths-Bkr-BCxW.js} +4 -4
  65. package/dist/{paths-C6TxBCvO.js → paths-Cvc9EM8Y.js} +5 -5
  66. package/dist/{pi-embedded-BaGj07T0.js → pi-embedded-BQQa91aA.js} +158 -158
  67. package/dist/{pi-embedded-helpers-wy0DZvx1.js → pi-embedded-helpers-CLXm10bV.js} +52 -52
  68. package/dist/{plugin-sdk/pi-model-discovery-v-XPUOOf.js → pi-model-discovery-Dymwdjt0.js} +2 -2
  69. package/dist/pi-model-discovery-runtime-BeY4EUPp.js +11 -0
  70. package/dist/{pi-tools.before-tool-call.runtime-BuLxSyx9.js → pi-tools.before-tool-call.runtime-Cwab_5W1.js} +9 -9
  71. package/dist/plugin-sdk/index.js +50 -50
  72. package/dist/plugin-sdk/mattermost.js +3 -3
  73. package/dist/plugin-sdk/signal.js +2 -2
  74. package/dist/plugin-sdk/zalo.js +2 -2
  75. package/dist/{plugins-CWkRQYDj.js → plugins-4Rj4OjLY.js} +11 -11
  76. package/dist/{proxy-env-Cq5gdrbj.js → proxy-env-DlmzDx8x.js} +1 -1
  77. package/dist/{proxy-fetch-CCjEYbFm.js → proxy-fetch-B2pEfjbR.js} +1 -1
  78. package/dist/{pw-ai-Cl1Lc7RC.js → pw-ai-DNMjFMqH.js} +14 -14
  79. package/dist/{qmd-manager-BsYsO9Ii.js → qmd-manager-BtIKUaO9.js} +10 -10
  80. package/dist/{query-expansion-DtLc3wjL.js → query-expansion-CX-1fS52.js} +6 -6
  81. package/dist/{plugin-sdk/redact-DjVX-1N3.js → redact-COik8ET1.js} +1 -1
  82. package/dist/{run-with-concurrency-D_ZpbgEG.js → run-with-concurrency-BgYfgkXT.js} +4 -4
  83. package/dist/runtime-whatsapp-login.runtime-DUb55byQ.js +13 -0
  84. package/dist/runtime-whatsapp-outbound.runtime-Bii_xSfI.js +22 -0
  85. package/dist/{send-Dx2RkUOZ.js → send-6lz6rNVP.js} +6 -6
  86. package/dist/{send-vmONuVgL.js → send-BHTiZcH3.js} +26 -26
  87. package/dist/{send-Bj776ESJ.js → send-L7gRiwyd.js} +7 -7
  88. package/dist/{send-DcxmcFi_.js → send-PE6cwoTe.js} +8 -8
  89. package/dist/{send-BQERFNyo.js → send-dfu6_rgf.js} +5 -5
  90. package/dist/{session-A4QhBRvH.js → session-D8ImowSs.js} +8 -8
  91. package/dist/{skill-commands-CMzBZKG2.js → skill-commands-DNqJ-kwn.js} +9 -9
  92. package/dist/{skills-CE_iqvM5.js → skills-7ODkHQYp.js} +22 -22
  93. package/dist/slash-commands.runtime-CVw6566g.js +16 -0
  94. package/dist/slash-dispatch.runtime-B9Ygtzi4.js +56 -0
  95. package/dist/slash-skill-commands.runtime-DxZ4z5h6.js +20 -0
  96. package/dist/{store--eR1R_UX.js → store-D89wDcz9.js} +2 -2
  97. package/dist/subagent-registry-runtime-DL1Wv7nA.js +56 -0
  98. package/dist/{subsystem-Di1z8l0Z.js → subsystem-B45WV3qB.js} +14 -14
  99. package/dist/{tables-d739Y1xW.js → tables-mE4cJBN2.js} +1 -1
  100. package/dist/{plugin-sdk/target-errors-Blia4S69.js → target-errors-mnlwhAjP.js} +2 -2
  101. package/dist/{thinking-DXYisHiZ.js → thinking-BeGmb5k6.js} +7 -7
  102. package/dist/{tokens-DxnY9ui_.js → tokens-q32vI39c.js} +1 -1
  103. package/dist/{tool-images-2cBx1W8h.js → tool-images-RZdHiZcG.js} +2 -2
  104. package/dist/{web-CzWRVmFt.js → web-Btj-e8kN.js} +55 -55
  105. package/dist/{whatsapp-actions-iEArE_Ez.js → whatsapp-actions-BHbJJyqw.js} +21 -21
  106. package/dist/{workspace-CUVC6GX1.js → workspace-U-DyR64O.js} +20 -20
  107. package/package.json +7 -5
  108. package/scripts/create-instance.sh +66 -27
  109. package/scripts/install-maca.sh +1 -1
  110. package/scripts/npm_publish.sh +5 -1
  111. package/ui/index.html +16 -0
  112. package/ui/node_modules/.bin/jiti +21 -0
  113. package/ui/node_modules/.bin/lessc +21 -0
  114. package/ui/node_modules/.bin/marked +21 -0
  115. package/ui/node_modules/.bin/playwright +21 -0
  116. package/ui/node_modules/.bin/sass +21 -0
  117. package/ui/node_modules/.bin/tsx +21 -0
  118. package/ui/node_modules/.bin/vite +21 -0
  119. package/ui/node_modules/.bin/vitest +21 -0
  120. package/ui/node_modules/.bin/yaml +21 -0
  121. package/ui/package.json +27 -0
  122. package/ui/public/apple-touch-icon.png +0 -0
  123. package/ui/public/favicon-32.png +0 -0
  124. package/ui/public/favicon.ico +0 -0
  125. package/ui/public/favicon.svg +22 -0
  126. package/ui/src/css.d.ts +1 -0
  127. package/ui/src/i18n/index.ts +3 -0
  128. package/ui/src/i18n/lib/lit-controller.ts +22 -0
  129. package/ui/src/i18n/lib/registry.ts +64 -0
  130. package/ui/src/i18n/lib/translate.ts +123 -0
  131. package/ui/src/i18n/lib/types.ts +9 -0
  132. package/ui/src/i18n/locales/de.ts +129 -0
  133. package/ui/src/i18n/locales/en.ts +337 -0
  134. package/ui/src/i18n/locales/pt-BR.ts +128 -0
  135. package/ui/src/i18n/locales/zh-CN.ts +330 -0
  136. package/ui/src/i18n/locales/zh-TW.ts +125 -0
  137. package/ui/src/i18n/test/translate.test.ts +56 -0
  138. package/ui/src/main.ts +2 -0
  139. package/ui/src/styles/base.css +385 -0
  140. package/ui/src/styles/chat/grouped.css +300 -0
  141. package/ui/src/styles/chat/layout.css +481 -0
  142. package/ui/src/styles/chat/sidebar.css +117 -0
  143. package/ui/src/styles/chat/text.css +146 -0
  144. package/ui/src/styles/chat/tool-cards.css +202 -0
  145. package/ui/src/styles/chat.css +5 -0
  146. package/ui/src/styles/components.css +2612 -0
  147. package/ui/src/styles/config.css +1658 -0
  148. package/ui/src/styles/layout.css +621 -0
  149. package/ui/src/styles/layout.mobile.css +374 -0
  150. package/ui/src/styles.css +5 -0
  151. package/ui/src/ui/__screenshots__/config-form.browser.test.ts/config-form-renderer-flags-unsupported-unions-1.png +0 -0
  152. package/ui/src/ui/__screenshots__/config-form.browser.test.ts/config-form-renderer-renders-inputs-and-patches-values-1.png +0 -0
  153. package/ui/src/ui/__screenshots__/config-form.browser.test.ts/config-form-renderer-renders-union-literals-as-select-options-1.png +0 -0
  154. package/ui/src/ui/__screenshots__/navigation.browser.test.ts/control-UI-routing-auto-scrolls-chat-history-to-the-latest-message-1.png +0 -0
  155. package/ui/src/ui/app-channels.ts +279 -0
  156. package/ui/src/ui/app-chat.ts +266 -0
  157. package/ui/src/ui/app-defaults.ts +50 -0
  158. package/ui/src/ui/app-events.ts +5 -0
  159. package/ui/src/ui/app-gateway.node.test.ts +229 -0
  160. package/ui/src/ui/app-gateway.ts +349 -0
  161. package/ui/src/ui/app-lifecycle.node.test.ts +44 -0
  162. package/ui/src/ui/app-lifecycle.ts +109 -0
  163. package/ui/src/ui/app-polling.ts +69 -0
  164. package/ui/src/ui/app-render-usage-tab.ts +273 -0
  165. package/ui/src/ui/app-render.helpers.node.test.ts +286 -0
  166. package/ui/src/ui/app-render.helpers.ts +574 -0
  167. package/ui/src/ui/app-render.ts +1168 -0
  168. package/ui/src/ui/app-scroll.test.ts +275 -0
  169. package/ui/src/ui/app-scroll.ts +179 -0
  170. package/ui/src/ui/app-settings.test.ts +70 -0
  171. package/ui/src/ui/app-settings.ts +440 -0
  172. package/ui/src/ui/app-tool-stream.node.test.ts +139 -0
  173. package/ui/src/ui/app-tool-stream.ts +455 -0
  174. package/ui/src/ui/app-view-state.ts +321 -0
  175. package/ui/src/ui/app.ts +621 -0
  176. package/ui/src/ui/assistant-identity.ts +23 -0
  177. package/ui/src/ui/chat/constants.ts +12 -0
  178. package/ui/src/ui/chat/copy-as-markdown.ts +97 -0
  179. package/ui/src/ui/chat/grouped-render.ts +287 -0
  180. package/ui/src/ui/chat/message-extract.test.ts +64 -0
  181. package/ui/src/ui/chat/message-extract.ts +122 -0
  182. package/ui/src/ui/chat/message-normalizer.test.ts +179 -0
  183. package/ui/src/ui/chat/message-normalizer.ts +101 -0
  184. package/ui/src/ui/chat/tool-cards.ts +156 -0
  185. package/ui/src/ui/chat/tool-helpers.test.ts +141 -0
  186. package/ui/src/ui/chat/tool-helpers.ts +37 -0
  187. package/ui/src/ui/chat-event-reload.test.ts +47 -0
  188. package/ui/src/ui/chat-event-reload.ts +16 -0
  189. package/ui/src/ui/chat-markdown.browser.test.ts +37 -0
  190. package/ui/src/ui/components/resizable-divider.ts +110 -0
  191. package/ui/src/ui/config-form.browser.test.ts +443 -0
  192. package/ui/src/ui/controllers/agent-files.ts +126 -0
  193. package/ui/src/ui/controllers/agent-identity.ts +59 -0
  194. package/ui/src/ui/controllers/agent-skills.ts +33 -0
  195. package/ui/src/ui/controllers/agents.test.ts +61 -0
  196. package/ui/src/ui/controllers/agents.ts +64 -0
  197. package/ui/src/ui/controllers/assistant-identity.ts +34 -0
  198. package/ui/src/ui/controllers/channels.ts +94 -0
  199. package/ui/src/ui/controllers/channels.types.ts +15 -0
  200. package/ui/src/ui/controllers/chat.test.ts +568 -0
  201. package/ui/src/ui/controllers/chat.ts +318 -0
  202. package/ui/src/ui/controllers/config/form-coerce.ts +160 -0
  203. package/ui/src/ui/controllers/config/form-utils.node.test.ts +455 -0
  204. package/ui/src/ui/controllers/config/form-utils.ts +90 -0
  205. package/ui/src/ui/controllers/config.test.ts +289 -0
  206. package/ui/src/ui/controllers/config.ts +219 -0
  207. package/ui/src/ui/controllers/control-ui-bootstrap.test.ts +82 -0
  208. package/ui/src/ui/controllers/control-ui-bootstrap.ts +49 -0
  209. package/ui/src/ui/controllers/cron-filters.test.ts +81 -0
  210. package/ui/src/ui/controllers/cron.test.ts +1070 -0
  211. package/ui/src/ui/controllers/cron.ts +921 -0
  212. package/ui/src/ui/controllers/debug.ts +60 -0
  213. package/ui/src/ui/controllers/devices.ts +159 -0
  214. package/ui/src/ui/controllers/exec-approval.ts +100 -0
  215. package/ui/src/ui/controllers/exec-approvals.ts +170 -0
  216. package/ui/src/ui/controllers/logs.ts +147 -0
  217. package/ui/src/ui/controllers/nodes.ts +32 -0
  218. package/ui/src/ui/controllers/presence.ts +37 -0
  219. package/ui/src/ui/controllers/sessions.test.ts +104 -0
  220. package/ui/src/ui/controllers/sessions.ts +127 -0
  221. package/ui/src/ui/controllers/skills.ts +157 -0
  222. package/ui/src/ui/controllers/usage.node.test.ts +181 -0
  223. package/ui/src/ui/controllers/usage.ts +315 -0
  224. package/ui/src/ui/data/moonshot-kimi-k2.ts +45 -0
  225. package/ui/src/ui/device-auth.ts +73 -0
  226. package/ui/src/ui/device-identity.ts +112 -0
  227. package/ui/src/ui/external-link.test.ts +18 -0
  228. package/ui/src/ui/external-link.ts +19 -0
  229. package/ui/src/ui/focus-mode.browser.test.ts +39 -0
  230. package/ui/src/ui/format.test.ts +101 -0
  231. package/ui/src/ui/format.ts +60 -0
  232. package/ui/src/ui/gateway.ts +360 -0
  233. package/ui/src/ui/icons.ts +256 -0
  234. package/ui/src/ui/markdown.test.ts +85 -0
  235. package/ui/src/ui/markdown.ts +139 -0
  236. package/ui/src/ui/navigation.browser.test.ts +188 -0
  237. package/ui/src/ui/navigation.test.ts +189 -0
  238. package/ui/src/ui/navigation.ts +165 -0
  239. package/ui/src/ui/open-external-url.test.ts +108 -0
  240. package/ui/src/ui/open-external-url.ts +73 -0
  241. package/ui/src/ui/presenter.ts +85 -0
  242. package/ui/src/ui/storage.node.test.ts +63 -0
  243. package/ui/src/ui/storage.ts +99 -0
  244. package/ui/src/ui/test-helpers/app-mount.ts +27 -0
  245. package/ui/src/ui/text-direction.test.ts +24 -0
  246. package/ui/src/ui/text-direction.ts +30 -0
  247. package/ui/src/ui/theme-transition.ts +109 -0
  248. package/ui/src/ui/theme.ts +16 -0
  249. package/ui/src/ui/tool-display.ts +159 -0
  250. package/ui/src/ui/types/chat-types.ts +44 -0
  251. package/ui/src/ui/types.ts +627 -0
  252. package/ui/src/ui/ui-types.ts +54 -0
  253. package/ui/src/ui/usage-helpers.node.test.ts +43 -0
  254. package/ui/src/ui/usage-helpers.ts +321 -0
  255. package/ui/src/ui/usage-types.ts +22 -0
  256. package/ui/src/ui/uuid.test.ts +41 -0
  257. package/ui/src/ui/uuid.ts +57 -0
  258. package/ui/src/ui/views/agents-panels-status-files.ts +461 -0
  259. package/ui/src/ui/views/agents-panels-tools-skills.browser.test.ts +102 -0
  260. package/ui/src/ui/views/agents-panels-tools-skills.ts +537 -0
  261. package/ui/src/ui/views/agents-utils.test.ts +100 -0
  262. package/ui/src/ui/views/agents-utils.ts +502 -0
  263. package/ui/src/ui/views/agents.ts +499 -0
  264. package/ui/src/ui/views/channel-config-extras.ts +49 -0
  265. package/ui/src/ui/views/channels.config.ts +155 -0
  266. package/ui/src/ui/views/channels.discord.ts +65 -0
  267. package/ui/src/ui/views/channels.googlechat.ts +79 -0
  268. package/ui/src/ui/views/channels.imessage.ts +65 -0
  269. package/ui/src/ui/views/channels.nostr-profile-form.ts +321 -0
  270. package/ui/src/ui/views/channels.nostr.ts +237 -0
  271. package/ui/src/ui/views/channels.shared.ts +38 -0
  272. package/ui/src/ui/views/channels.signal.ts +69 -0
  273. package/ui/src/ui/views/channels.slack.ts +65 -0
  274. package/ui/src/ui/views/channels.telegram.ts +120 -0
  275. package/ui/src/ui/views/channels.ts +325 -0
  276. package/ui/src/ui/views/channels.types.ts +62 -0
  277. package/ui/src/ui/views/channels.whatsapp.ts +118 -0
  278. package/ui/src/ui/views/chat-image-open.browser.test.ts +70 -0
  279. package/ui/src/ui/views/chat.test.ts +227 -0
  280. package/ui/src/ui/views/chat.ts +616 -0
  281. package/ui/src/ui/views/config-form.analyze.ts +267 -0
  282. package/ui/src/ui/views/config-form.node.ts +1073 -0
  283. package/ui/src/ui/views/config-form.render.ts +478 -0
  284. package/ui/src/ui/views/config-form.search.node.test.ts +69 -0
  285. package/ui/src/ui/views/config-form.shared.ts +96 -0
  286. package/ui/src/ui/views/config-form.ts +4 -0
  287. package/ui/src/ui/views/config-search.node.test.ts +50 -0
  288. package/ui/src/ui/views/config-search.ts +92 -0
  289. package/ui/src/ui/views/config.browser.test.ts +233 -0
  290. package/ui/src/ui/views/config.ts +820 -0
  291. package/ui/src/ui/views/cron.test.ts +741 -0
  292. package/ui/src/ui/views/cron.ts +1758 -0
  293. package/ui/src/ui/views/debug.ts +151 -0
  294. package/ui/src/ui/views/exec-approval.ts +89 -0
  295. package/ui/src/ui/views/gateway-url-confirmation.ts +40 -0
  296. package/ui/src/ui/views/instances.ts +89 -0
  297. package/ui/src/ui/views/logs.ts +155 -0
  298. package/ui/src/ui/views/markdown-sidebar.ts +40 -0
  299. package/ui/src/ui/views/nodes-exec-approvals.ts +617 -0
  300. package/ui/src/ui/views/nodes-shared.ts +67 -0
  301. package/ui/src/ui/views/nodes.ts +485 -0
  302. package/ui/src/ui/views/overview-hints.ts +16 -0
  303. package/ui/src/ui/views/overview.node.test.ts +39 -0
  304. package/ui/src/ui/views/overview.ts +361 -0
  305. package/ui/src/ui/views/sessions.test.ts +81 -0
  306. package/ui/src/ui/views/sessions.ts +321 -0
  307. package/ui/src/ui/views/skills-grouping.ts +40 -0
  308. package/ui/src/ui/views/skills-shared.ts +52 -0
  309. package/ui/src/ui/views/skills.ts +192 -0
  310. package/ui/src/ui/views/usage-metrics.ts +578 -0
  311. package/ui/src/ui/views/usage-query.ts +277 -0
  312. package/ui/src/ui/views/usage-render-details.test.ts +136 -0
  313. package/ui/src/ui/views/usage-render-details.ts +1083 -0
  314. package/ui/src/ui/views/usage-render-overview.ts +796 -0
  315. package/ui/src/ui/views/usage-styles/usageStyles-part1.ts +701 -0
  316. package/ui/src/ui/views/usage-styles/usageStyles-part2.ts +702 -0
  317. package/ui/src/ui/views/usage-styles/usageStyles-part3.ts +551 -0
  318. package/ui/src/ui/views/usage.ts +836 -0
  319. package/ui/src/ui/views/usageStyles.ts +5 -0
  320. package/ui/src/ui/views/usageTypes.ts +105 -0
  321. package/ui/vite.config.ts +43 -0
  322. package/ui/vitest.config.ts +15 -0
  323. package/ui/vitest.node.config.ts +10 -0
  324. package/dist/deliver-runtime-P-G3bPjW.js +0 -36
  325. package/dist/deps-send-discord.runtime-DnbhTFX9.js +0 -26
  326. package/dist/deps-send-imessage.runtime-BOiQ6mDx.js +0 -25
  327. package/dist/deps-send-signal.runtime-CTcl388M.js +0 -24
  328. package/dist/deps-send-slack.runtime-CCqBz4Kg.js +0 -22
  329. package/dist/deps-send-telegram.runtime-DGSKTCpH.js +0 -27
  330. package/dist/deps-send-whatsapp.runtime-CJkTHkah.js +0 -60
  331. package/dist/image-runtime-CVv2ra9J.js +0 -29
  332. package/dist/manager-runtime-BN6VevdC.js +0 -18
  333. package/dist/pi-model-discovery-BGgOlX8N.js +0 -134
  334. package/dist/pi-model-discovery-runtime-Bwmi4Ev8.js +0 -11
  335. package/dist/plugin-sdk/accounts-CJWOBzwB.js +0 -35
  336. package/dist/plugin-sdk/accounts-DP1-L-QS.js +0 -288
  337. package/dist/plugin-sdk/accounts-DZhWlEg3.js +0 -46
  338. package/dist/plugin-sdk/active-listener-B_sLJTXM.js +0 -50
  339. package/dist/plugin-sdk/api-key-rotation-BRE4X2tf.js +0 -181
  340. package/dist/plugin-sdk/audio-preflight-DGEUDxxR.js +0 -69
  341. package/dist/plugin-sdk/audio-transcription-runner-DkoPNPYt.js +0 -2176
  342. package/dist/plugin-sdk/audit-membership-runtime-DSBHHw7o.js +0 -58
  343. package/dist/plugin-sdk/channel-activity-F3d0yUwy.js +0 -94
  344. package/dist/plugin-sdk/channel-web-QF7EpjeP.js +0 -2256
  345. package/dist/plugin-sdk/chrome-BXoCyCkY.js +0 -2415
  346. package/dist/plugin-sdk/commands-registry-t7cXBTfN.js +0 -1125
  347. package/dist/plugin-sdk/config-BkEnz2Po.js +0 -17913
  348. package/dist/plugin-sdk/deliver-B6AG_l67.js +0 -1694
  349. package/dist/plugin-sdk/deliver-runtime-D585kJZc.js +0 -32
  350. package/dist/plugin-sdk/deps-send-discord.runtime-a_OKY2js.js +0 -23
  351. package/dist/plugin-sdk/deps-send-imessage.runtime-Baxy9TD4.js +0 -22
  352. package/dist/plugin-sdk/deps-send-signal.runtime-BwXoCrFl.js +0 -21
  353. package/dist/plugin-sdk/deps-send-slack.runtime-CLmKjgso.js +0 -19
  354. package/dist/plugin-sdk/deps-send-telegram.runtime-BKfdBKnZ.js +0 -24
  355. package/dist/plugin-sdk/deps-send-whatsapp.runtime-BOTwkbx_.js +0 -57
  356. package/dist/plugin-sdk/diagnostic-CsP-lEkI.js +0 -319
  357. package/dist/plugin-sdk/errors-DaiAM-yU.js +0 -54
  358. package/dist/plugin-sdk/fetch-guard-DETCcJzQ.js +0 -156
  359. package/dist/plugin-sdk/fs-safe-B8y811FR.js +0 -352
  360. package/dist/plugin-sdk/image-DjTEkYZE.js +0 -2310
  361. package/dist/plugin-sdk/image-ops-BSiMpAw4.js +0 -584
  362. package/dist/plugin-sdk/image-runtime-6xPp8m5a.js +0 -25
  363. package/dist/plugin-sdk/ir-DQ7_HbvK.js +0 -1296
  364. package/dist/plugin-sdk/local-roots-BUP4YBmR.js +0 -186
  365. package/dist/plugin-sdk/logger-CZY9KIoY.js +0 -1163
  366. package/dist/plugin-sdk/login-BxEKLlCo.js +0 -57
  367. package/dist/plugin-sdk/login-qr-BQIpMPr9.js +0 -320
  368. package/dist/plugin-sdk/manager-I6KbPihW.js +0 -3917
  369. package/dist/plugin-sdk/manager-runtime-CFfYYWIQ.js +0 -15
  370. package/dist/plugin-sdk/outbound-NS6UHnB6.js +0 -212
  371. package/dist/plugin-sdk/outbound-attachment-Dy6fyf6H.js +0 -19
  372. package/dist/plugin-sdk/path-alias-guards-DBjLbIX_.js +0 -43
  373. package/dist/plugin-sdk/paths-vTM3Lh3X.js +0 -166
  374. package/dist/plugin-sdk/pi-embedded-helpers-1R1gu7eX.js +0 -9627
  375. package/dist/plugin-sdk/pi-model-discovery-runtime-Do9o-dUd.js +0 -8
  376. package/dist/plugin-sdk/pi-tools.before-tool-call.runtime-D4sFsIks.js +0 -354
  377. package/dist/plugin-sdk/plugins-DeBZB9l_.js +0 -864
  378. package/dist/plugin-sdk/proxy-fetch-ChxOhWF4.js +0 -38
  379. package/dist/plugin-sdk/pw-ai-DEOmCSSC.js +0 -1938
  380. package/dist/plugin-sdk/qmd-manager-HyYKoEch.js +0 -1448
  381. package/dist/plugin-sdk/query-expansion-CeyKUeDW.js +0 -1011
  382. package/dist/plugin-sdk/reply-DAo_Jt8K.js +0 -97916
  383. package/dist/plugin-sdk/resolve-outbound-target-B42qgQS9.js +0 -40
  384. package/dist/plugin-sdk/run-with-concurrency-Bt_ks0Qa.js +0 -1994
  385. package/dist/plugin-sdk/runtime-whatsapp-login.runtime-B6W989eF.js +0 -10
  386. package/dist/plugin-sdk/runtime-whatsapp-outbound.runtime-c_GDFy37.js +0 -19
  387. package/dist/plugin-sdk/send-CQpMudwO.js +0 -2587
  388. package/dist/plugin-sdk/send-DQHLzVyO.js +0 -414
  389. package/dist/plugin-sdk/send-DTB24bEF.js +0 -3135
  390. package/dist/plugin-sdk/send-DfHadjZ_.js +0 -503
  391. package/dist/plugin-sdk/send-XXlW2iny.js +0 -540
  392. package/dist/plugin-sdk/session-6TF6MyaC.js +0 -169
  393. package/dist/plugin-sdk/skill-commands-CkGeFUMl.js +0 -342
  394. package/dist/plugin-sdk/skills-CBkHBYPq.js +0 -1428
  395. package/dist/plugin-sdk/slash-commands.runtime-CxliuGaP.js +0 -13
  396. package/dist/plugin-sdk/slash-dispatch.runtime-DFaeYlJQ.js +0 -52
  397. package/dist/plugin-sdk/slash-skill-commands.runtime-0M0OLCxq.js +0 -16
  398. package/dist/plugin-sdk/ssrf-cFtplYtS.js +0 -202
  399. package/dist/plugin-sdk/store-5nyxY3WU.js +0 -81
  400. package/dist/plugin-sdk/subagent-registry-runtime-DCtmDwna.js +0 -52
  401. package/dist/plugin-sdk/tables-C47P4GTN.js +0 -55
  402. package/dist/plugin-sdk/thinking-Bo2eosVa.js +0 -1206
  403. package/dist/plugin-sdk/tokens-DgNRBwIg.js +0 -52
  404. package/dist/plugin-sdk/tool-images-Gk_-0y2N.js +0 -274
  405. package/dist/plugin-sdk/web-CVxZbXyH.js +0 -56
  406. package/dist/plugin-sdk/whatsapp-actions-Bw0H9g-n.js +0 -80
  407. package/dist/redact-ClbcYG1J.js +0 -319
  408. package/dist/runtime-whatsapp-login.runtime-IeylZEl4.js +0 -13
  409. package/dist/runtime-whatsapp-outbound.runtime-ClBRuLsq.js +0 -22
  410. package/dist/slash-commands.runtime-Cpn2tYW4.js +0 -16
  411. package/dist/slash-dispatch.runtime-DoBAQBU5.js +0 -56
  412. package/dist/slash-skill-commands.runtime-DKMvvdDW.js +0 -20
  413. package/dist/subagent-registry-runtime-ppWS3tVu.js +0 -56
  414. package/dist/target-errors-CBI2Ga0y.js +0 -195
@@ -0,0 +1,621 @@
1
+ import { LitElement } from "lit";
2
+ import { customElement, state } from "lit/decorators.js";
3
+ import { i18n, I18nController, isSupportedLocale } from "../i18n/index.ts";
4
+ import {
5
+ handleChannelConfigReload as handleChannelConfigReloadInternal,
6
+ handleChannelConfigSave as handleChannelConfigSaveInternal,
7
+ handleNostrProfileCancel as handleNostrProfileCancelInternal,
8
+ handleNostrProfileEdit as handleNostrProfileEditInternal,
9
+ handleNostrProfileFieldChange as handleNostrProfileFieldChangeInternal,
10
+ handleNostrProfileImport as handleNostrProfileImportInternal,
11
+ handleNostrProfileSave as handleNostrProfileSaveInternal,
12
+ handleNostrProfileToggleAdvanced as handleNostrProfileToggleAdvancedInternal,
13
+ handleWhatsAppLogout as handleWhatsAppLogoutInternal,
14
+ handleWhatsAppStart as handleWhatsAppStartInternal,
15
+ handleWhatsAppWait as handleWhatsAppWaitInternal,
16
+ } from "./app-channels.ts";
17
+ import {
18
+ handleAbortChat as handleAbortChatInternal,
19
+ handleSendChat as handleSendChatInternal,
20
+ removeQueuedMessage as removeQueuedMessageInternal,
21
+ } from "./app-chat.ts";
22
+ import { DEFAULT_CRON_FORM, DEFAULT_LOG_LEVEL_FILTERS } from "./app-defaults.ts";
23
+ import type { EventLogEntry } from "./app-events.ts";
24
+ import { connectGateway as connectGatewayInternal } from "./app-gateway.ts";
25
+ import {
26
+ handleConnected,
27
+ handleDisconnected,
28
+ handleFirstUpdated,
29
+ handleUpdated,
30
+ } from "./app-lifecycle.ts";
31
+ import { renderApp } from "./app-render.ts";
32
+ import {
33
+ exportLogs as exportLogsInternal,
34
+ handleChatScroll as handleChatScrollInternal,
35
+ handleLogsScroll as handleLogsScrollInternal,
36
+ resetChatScroll as resetChatScrollInternal,
37
+ scheduleChatScroll as scheduleChatScrollInternal,
38
+ } from "./app-scroll.ts";
39
+ import {
40
+ applySettings as applySettingsInternal,
41
+ loadCron as loadCronInternal,
42
+ loadOverview as loadOverviewInternal,
43
+ setTab as setTabInternal,
44
+ setTheme as setThemeInternal,
45
+ onPopState as onPopStateInternal,
46
+ } from "./app-settings.ts";
47
+ import {
48
+ resetToolStream as resetToolStreamInternal,
49
+ type ToolStreamEntry,
50
+ type CompactionStatus,
51
+ type FallbackStatus,
52
+ } from "./app-tool-stream.ts";
53
+ import type { AppViewState } from "./app-view-state.ts";
54
+ import { normalizeAssistantIdentity } from "./assistant-identity.ts";
55
+ import { loadAssistantIdentity as loadAssistantIdentityInternal } from "./controllers/assistant-identity.ts";
56
+ import type { CronFieldErrors } from "./controllers/cron.ts";
57
+ import type { DevicePairingList } from "./controllers/devices.ts";
58
+ import type { ExecApprovalRequest } from "./controllers/exec-approval.ts";
59
+ import type { ExecApprovalsFile, ExecApprovalsSnapshot } from "./controllers/exec-approvals.ts";
60
+ import type { SkillMessage } from "./controllers/skills.ts";
61
+ import type { GatewayBrowserClient, GatewayHelloOk } from "./gateway.ts";
62
+ import type { Tab } from "./navigation.ts";
63
+ import { loadSettings, type UiSettings } from "./storage.ts";
64
+ import type { ResolvedTheme, ThemeMode } from "./theme.ts";
65
+ import type {
66
+ AgentsListResult,
67
+ AgentsFilesListResult,
68
+ AgentIdentityResult,
69
+ ConfigSnapshot,
70
+ ConfigUiHints,
71
+ CronJob,
72
+ CronRunLogEntry,
73
+ CronStatus,
74
+ HealthSnapshot,
75
+ LogEntry,
76
+ LogLevel,
77
+ PresenceEntry,
78
+ ChannelsStatusSnapshot,
79
+ SessionsListResult,
80
+ SkillStatusReport,
81
+ ToolsCatalogResult,
82
+ StatusSummary,
83
+ NostrProfile,
84
+ } from "./types.ts";
85
+ import { type ChatAttachment, type ChatQueueItem, type CronFormState } from "./ui-types.ts";
86
+ import { generateUUID } from "./uuid.ts";
87
+ import type { NostrProfileFormState } from "./views/channels.nostr-profile-form.ts";
88
+
89
+ declare global {
90
+ interface Window {
91
+ __OPENCLAW_CONTROL_UI_BASE_PATH__?: string;
92
+ }
93
+ }
94
+
95
+ const bootAssistantIdentity = normalizeAssistantIdentity({});
96
+
97
+ function resolveOnboardingMode(): boolean {
98
+ if (!window.location.search) {
99
+ return false;
100
+ }
101
+ const params = new URLSearchParams(window.location.search);
102
+ const raw = params.get("onboarding");
103
+ if (!raw) {
104
+ return false;
105
+ }
106
+ const normalized = raw.trim().toLowerCase();
107
+ return normalized === "1" || normalized === "true" || normalized === "yes" || normalized === "on";
108
+ }
109
+
110
+ @customElement("openclaw-app")
111
+ export class OpenClawApp extends LitElement {
112
+ private i18nController = new I18nController(this);
113
+ clientInstanceId = generateUUID();
114
+ @state() settings: UiSettings = loadSettings();
115
+ constructor() {
116
+ super();
117
+ if (isSupportedLocale(this.settings.locale)) {
118
+ void i18n.setLocale(this.settings.locale);
119
+ }
120
+ }
121
+ @state() password = "";
122
+ @state() tab: Tab = "chat";
123
+ @state() onboarding = resolveOnboardingMode();
124
+ @state() connected = false;
125
+ @state() theme: ThemeMode = this.settings.theme ?? "system";
126
+ @state() themeResolved: ResolvedTheme = "dark";
127
+ @state() hello: GatewayHelloOk | null = null;
128
+ @state() lastError: string | null = null;
129
+ @state() lastErrorCode: string | null = null;
130
+ @state() eventLog: EventLogEntry[] = [];
131
+ private eventLogBuffer: EventLogEntry[] = [];
132
+ private toolStreamSyncTimer: number | null = null;
133
+ private sidebarCloseTimer: number | null = null;
134
+
135
+ @state() assistantName = bootAssistantIdentity.name;
136
+ @state() assistantAvatar = bootAssistantIdentity.avatar;
137
+ @state() assistantAgentId = bootAssistantIdentity.agentId ?? null;
138
+
139
+ @state() sessionKey = this.settings.sessionKey;
140
+ @state() chatLoading = false;
141
+ @state() chatSending = false;
142
+ @state() chatMessage = "";
143
+ @state() chatMessages: unknown[] = [];
144
+ @state() chatToolMessages: unknown[] = [];
145
+ @state() chatStream: string | null = null;
146
+ @state() chatStreamStartedAt: number | null = null;
147
+ @state() chatRunId: string | null = null;
148
+ @state() compactionStatus: CompactionStatus | null = null;
149
+ @state() fallbackStatus: FallbackStatus | null = null;
150
+ @state() chatAvatarUrl: string | null = null;
151
+ @state() chatThinkingLevel: string | null = null;
152
+ @state() chatQueue: ChatQueueItem[] = [];
153
+ @state() chatAttachments: ChatAttachment[] = [];
154
+ @state() chatManualRefreshInFlight = false;
155
+ // Sidebar state for tool output viewing
156
+ @state() sidebarOpen = false;
157
+ @state() sidebarContent: string | null = null;
158
+ @state() sidebarError: string | null = null;
159
+ @state() splitRatio = this.settings.splitRatio;
160
+
161
+ @state() nodesLoading = false;
162
+ @state() nodes: Array<Record<string, unknown>> = [];
163
+ @state() devicesLoading = false;
164
+ @state() devicesError: string | null = null;
165
+ @state() devicesList: DevicePairingList | null = null;
166
+ @state() execApprovalsLoading = false;
167
+ @state() execApprovalsSaving = false;
168
+ @state() execApprovalsDirty = false;
169
+ @state() execApprovalsSnapshot: ExecApprovalsSnapshot | null = null;
170
+ @state() execApprovalsForm: ExecApprovalsFile | null = null;
171
+ @state() execApprovalsSelectedAgent: string | null = null;
172
+ @state() execApprovalsTarget: "gateway" | "node" = "gateway";
173
+ @state() execApprovalsTargetNodeId: string | null = null;
174
+ @state() execApprovalQueue: ExecApprovalRequest[] = [];
175
+ @state() execApprovalBusy = false;
176
+ @state() execApprovalError: string | null = null;
177
+ @state() pendingGatewayUrl: string | null = null;
178
+
179
+ @state() configLoading = false;
180
+ @state() configRaw = "{\n}\n";
181
+ @state() configRawOriginal = "";
182
+ @state() configValid: boolean | null = null;
183
+ @state() configIssues: unknown[] = [];
184
+ @state() configSaving = false;
185
+ @state() configApplying = false;
186
+ @state() updateRunning = false;
187
+ @state() applySessionKey = this.settings.lastActiveSessionKey;
188
+ @state() configSnapshot: ConfigSnapshot | null = null;
189
+ @state() configSchema: unknown = null;
190
+ @state() configSchemaVersion: string | null = null;
191
+ @state() configSchemaLoading = false;
192
+ @state() configUiHints: ConfigUiHints = {};
193
+ @state() configForm: Record<string, unknown> | null = null;
194
+ @state() configFormOriginal: Record<string, unknown> | null = null;
195
+ @state() configFormDirty = false;
196
+ @state() configFormMode: "form" | "raw" = "form";
197
+ @state() configSearchQuery = "";
198
+ @state() configActiveSection: string | null = null;
199
+ @state() configActiveSubsection: string | null = null;
200
+
201
+ @state() channelsLoading = false;
202
+ @state() channelsSnapshot: ChannelsStatusSnapshot | null = null;
203
+ @state() channelsError: string | null = null;
204
+ @state() channelsLastSuccess: number | null = null;
205
+ @state() whatsappLoginMessage: string | null = null;
206
+ @state() whatsappLoginQrDataUrl: string | null = null;
207
+ @state() whatsappLoginConnected: boolean | null = null;
208
+ @state() whatsappBusy = false;
209
+ @state() nostrProfileFormState: NostrProfileFormState | null = null;
210
+ @state() nostrProfileAccountId: string | null = null;
211
+
212
+ @state() presenceLoading = false;
213
+ @state() presenceEntries: PresenceEntry[] = [];
214
+ @state() presenceError: string | null = null;
215
+ @state() presenceStatus: string | null = null;
216
+
217
+ @state() agentsLoading = false;
218
+ @state() agentsList: AgentsListResult | null = null;
219
+ @state() agentsError: string | null = null;
220
+ @state() agentsSelectedId: string | null = null;
221
+ @state() toolsCatalogLoading = false;
222
+ @state() toolsCatalogError: string | null = null;
223
+ @state() toolsCatalogResult: ToolsCatalogResult | null = null;
224
+ @state() agentsPanel: "overview" | "files" | "tools" | "skills" | "channels" | "cron" =
225
+ "overview";
226
+ @state() agentFilesLoading = false;
227
+ @state() agentFilesError: string | null = null;
228
+ @state() agentFilesList: AgentsFilesListResult | null = null;
229
+ @state() agentFileContents: Record<string, string> = {};
230
+ @state() agentFileDrafts: Record<string, string> = {};
231
+ @state() agentFileActive: string | null = null;
232
+ @state() agentFileSaving = false;
233
+ @state() agentIdentityLoading = false;
234
+ @state() agentIdentityError: string | null = null;
235
+ @state() agentIdentityById: Record<string, AgentIdentityResult> = {};
236
+ @state() agentSkillsLoading = false;
237
+ @state() agentSkillsError: string | null = null;
238
+ @state() agentSkillsReport: SkillStatusReport | null = null;
239
+ @state() agentSkillsAgentId: string | null = null;
240
+
241
+ @state() sessionsLoading = false;
242
+ @state() sessionsResult: SessionsListResult | null = null;
243
+ @state() sessionsError: string | null = null;
244
+ @state() sessionsFilterActive = "";
245
+ @state() sessionsFilterLimit = "120";
246
+ @state() sessionsIncludeGlobal = true;
247
+ @state() sessionsIncludeUnknown = false;
248
+ @state() sessionsHideCron = true;
249
+
250
+ @state() usageLoading = false;
251
+ @state() usageResult: import("./types.js").SessionsUsageResult | null = null;
252
+ @state() usageCostSummary: import("./types.js").CostUsageSummary | null = null;
253
+ @state() usageError: string | null = null;
254
+ @state() usageStartDate = (() => {
255
+ const d = new Date();
256
+ return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, "0")}-${String(d.getDate()).padStart(2, "0")}`;
257
+ })();
258
+ @state() usageEndDate = (() => {
259
+ const d = new Date();
260
+ return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, "0")}-${String(d.getDate()).padStart(2, "0")}`;
261
+ })();
262
+ @state() usageSelectedSessions: string[] = [];
263
+ @state() usageSelectedDays: string[] = [];
264
+ @state() usageSelectedHours: number[] = [];
265
+ @state() usageChartMode: "tokens" | "cost" = "tokens";
266
+ @state() usageDailyChartMode: "total" | "by-type" = "by-type";
267
+ @state() usageTimeSeriesMode: "cumulative" | "per-turn" = "per-turn";
268
+ @state() usageTimeSeriesBreakdownMode: "total" | "by-type" = "by-type";
269
+ @state() usageTimeSeries: import("./types.js").SessionUsageTimeSeries | null = null;
270
+ @state() usageTimeSeriesLoading = false;
271
+ @state() usageTimeSeriesCursorStart: number | null = null;
272
+ @state() usageTimeSeriesCursorEnd: number | null = null;
273
+ @state() usageSessionLogs: import("./views/usage.js").SessionLogEntry[] | null = null;
274
+ @state() usageSessionLogsLoading = false;
275
+ @state() usageSessionLogsExpanded = false;
276
+ // Applied query (used to filter the already-loaded sessions list client-side).
277
+ @state() usageQuery = "";
278
+ // Draft query text (updates immediately as the user types; applied via debounce or "Search").
279
+ @state() usageQueryDraft = "";
280
+ @state() usageSessionSort: "tokens" | "cost" | "recent" | "messages" | "errors" = "recent";
281
+ @state() usageSessionSortDir: "desc" | "asc" = "desc";
282
+ @state() usageRecentSessions: string[] = [];
283
+ @state() usageTimeZone: "local" | "utc" = "local";
284
+ @state() usageContextExpanded = false;
285
+ @state() usageHeaderPinned = false;
286
+ @state() usageSessionsTab: "all" | "recent" = "all";
287
+ @state() usageVisibleColumns: string[] = [
288
+ "channel",
289
+ "agent",
290
+ "provider",
291
+ "model",
292
+ "messages",
293
+ "tools",
294
+ "errors",
295
+ "duration",
296
+ ];
297
+ @state() usageLogFilterRoles: import("./views/usage.js").SessionLogRole[] = [];
298
+ @state() usageLogFilterTools: string[] = [];
299
+ @state() usageLogFilterHasTools = false;
300
+ @state() usageLogFilterQuery = "";
301
+
302
+ // Non-reactive (don’t trigger renders just for timer bookkeeping).
303
+ usageQueryDebounceTimer: number | null = null;
304
+
305
+ @state() cronLoading = false;
306
+ @state() cronJobsLoadingMore = false;
307
+ @state() cronJobs: CronJob[] = [];
308
+ @state() cronJobsTotal = 0;
309
+ @state() cronJobsHasMore = false;
310
+ @state() cronJobsNextOffset: number | null = null;
311
+ @state() cronJobsLimit = 50;
312
+ @state() cronJobsQuery = "";
313
+ @state() cronJobsEnabledFilter: import("./types.js").CronJobsEnabledFilter = "all";
314
+ @state() cronJobsScheduleKindFilter: import("./controllers/cron.js").CronJobsScheduleKindFilter =
315
+ "all";
316
+ @state() cronJobsLastStatusFilter: import("./controllers/cron.js").CronJobsLastStatusFilter =
317
+ "all";
318
+ @state() cronJobsSortBy: import("./types.js").CronJobsSortBy = "nextRunAtMs";
319
+ @state() cronJobsSortDir: import("./types.js").CronSortDir = "asc";
320
+ @state() cronStatus: CronStatus | null = null;
321
+ @state() cronError: string | null = null;
322
+ @state() cronForm: CronFormState = { ...DEFAULT_CRON_FORM };
323
+ @state() cronFieldErrors: CronFieldErrors = {};
324
+ @state() cronEditingJobId: string | null = null;
325
+ @state() cronRunsJobId: string | null = null;
326
+ @state() cronRunsLoadingMore = false;
327
+ @state() cronRuns: CronRunLogEntry[] = [];
328
+ @state() cronRunsTotal = 0;
329
+ @state() cronRunsHasMore = false;
330
+ @state() cronRunsNextOffset: number | null = null;
331
+ @state() cronRunsLimit = 50;
332
+ @state() cronRunsScope: import("./types.js").CronRunScope = "all";
333
+ @state() cronRunsStatuses: import("./types.js").CronRunsStatusValue[] = [];
334
+ @state() cronRunsDeliveryStatuses: import("./types.js").CronDeliveryStatus[] = [];
335
+ @state() cronRunsStatusFilter: import("./types.js").CronRunsStatusFilter = "all";
336
+ @state() cronRunsQuery = "";
337
+ @state() cronRunsSortDir: import("./types.js").CronSortDir = "desc";
338
+ @state() cronModelSuggestions: string[] = [];
339
+ @state() cronBusy = false;
340
+
341
+ @state() updateAvailable: import("./types.js").UpdateAvailable | null = null;
342
+
343
+ @state() skillsLoading = false;
344
+ @state() skillsReport: SkillStatusReport | null = null;
345
+ @state() skillsError: string | null = null;
346
+ @state() skillsFilter = "";
347
+ @state() skillEdits: Record<string, string> = {};
348
+ @state() skillsBusyKey: string | null = null;
349
+ @state() skillMessages: Record<string, SkillMessage> = {};
350
+
351
+ @state() debugLoading = false;
352
+ @state() debugStatus: StatusSummary | null = null;
353
+ @state() debugHealth: HealthSnapshot | null = null;
354
+ @state() debugModels: unknown[] = [];
355
+ @state() debugHeartbeat: unknown = null;
356
+ @state() debugCallMethod = "";
357
+ @state() debugCallParams = "{}";
358
+ @state() debugCallResult: string | null = null;
359
+ @state() debugCallError: string | null = null;
360
+
361
+ @state() logsLoading = false;
362
+ @state() logsError: string | null = null;
363
+ @state() logsFile: string | null = null;
364
+ @state() logsEntries: LogEntry[] = [];
365
+ @state() logsFilterText = "";
366
+ @state() logsLevelFilters: Record<LogLevel, boolean> = {
367
+ ...DEFAULT_LOG_LEVEL_FILTERS,
368
+ };
369
+ @state() logsAutoFollow = true;
370
+ @state() logsTruncated = false;
371
+ @state() logsCursor: number | null = null;
372
+ @state() logsLastFetchAt: number | null = null;
373
+ @state() logsLimit = 500;
374
+ @state() logsMaxBytes = 250_000;
375
+ @state() logsAtBottom = true;
376
+
377
+ client: GatewayBrowserClient | null = null;
378
+ private chatScrollFrame: number | null = null;
379
+ private chatScrollTimeout: number | null = null;
380
+ private chatHasAutoScrolled = false;
381
+ private chatUserNearBottom = true;
382
+ @state() chatNewMessagesBelow = false;
383
+ private nodesPollInterval: number | null = null;
384
+ private logsPollInterval: number | null = null;
385
+ private debugPollInterval: number | null = null;
386
+ private logsScrollFrame: number | null = null;
387
+ private toolStreamById = new Map<string, ToolStreamEntry>();
388
+ private toolStreamOrder: string[] = [];
389
+ refreshSessionsAfterChat = new Set<string>();
390
+ basePath = "";
391
+ private popStateHandler = () =>
392
+ onPopStateInternal(this as unknown as Parameters<typeof onPopStateInternal>[0]);
393
+ private themeMedia: MediaQueryList | null = null;
394
+ private themeMediaHandler: ((event: MediaQueryListEvent) => void) | null = null;
395
+ private topbarObserver: ResizeObserver | null = null;
396
+
397
+ createRenderRoot() {
398
+ return this;
399
+ }
400
+
401
+ connectedCallback() {
402
+ super.connectedCallback();
403
+ handleConnected(this as unknown as Parameters<typeof handleConnected>[0]);
404
+ }
405
+
406
+ protected firstUpdated() {
407
+ handleFirstUpdated(this as unknown as Parameters<typeof handleFirstUpdated>[0]);
408
+ }
409
+
410
+ disconnectedCallback() {
411
+ handleDisconnected(this as unknown as Parameters<typeof handleDisconnected>[0]);
412
+ super.disconnectedCallback();
413
+ }
414
+
415
+ protected updated(changed: Map<PropertyKey, unknown>) {
416
+ handleUpdated(this as unknown as Parameters<typeof handleUpdated>[0], changed);
417
+ }
418
+
419
+ connect() {
420
+ connectGatewayInternal(this as unknown as Parameters<typeof connectGatewayInternal>[0]);
421
+ }
422
+
423
+ handleChatScroll(event: Event) {
424
+ handleChatScrollInternal(
425
+ this as unknown as Parameters<typeof handleChatScrollInternal>[0],
426
+ event,
427
+ );
428
+ }
429
+
430
+ handleLogsScroll(event: Event) {
431
+ handleLogsScrollInternal(
432
+ this as unknown as Parameters<typeof handleLogsScrollInternal>[0],
433
+ event,
434
+ );
435
+ }
436
+
437
+ exportLogs(lines: string[], label: string) {
438
+ exportLogsInternal(lines, label);
439
+ }
440
+
441
+ resetToolStream() {
442
+ resetToolStreamInternal(this as unknown as Parameters<typeof resetToolStreamInternal>[0]);
443
+ }
444
+
445
+ resetChatScroll() {
446
+ resetChatScrollInternal(this as unknown as Parameters<typeof resetChatScrollInternal>[0]);
447
+ }
448
+
449
+ scrollToBottom(opts?: { smooth?: boolean }) {
450
+ resetChatScrollInternal(this as unknown as Parameters<typeof resetChatScrollInternal>[0]);
451
+ scheduleChatScrollInternal(
452
+ this as unknown as Parameters<typeof scheduleChatScrollInternal>[0],
453
+ true,
454
+ Boolean(opts?.smooth),
455
+ );
456
+ }
457
+
458
+ async loadAssistantIdentity() {
459
+ await loadAssistantIdentityInternal(this);
460
+ }
461
+
462
+ applySettings(next: UiSettings) {
463
+ applySettingsInternal(this as unknown as Parameters<typeof applySettingsInternal>[0], next);
464
+ }
465
+
466
+ setTab(next: Tab) {
467
+ setTabInternal(this as unknown as Parameters<typeof setTabInternal>[0], next);
468
+ }
469
+
470
+ setTheme(next: ThemeMode, context?: Parameters<typeof setThemeInternal>[2]) {
471
+ setThemeInternal(this as unknown as Parameters<typeof setThemeInternal>[0], next, context);
472
+ }
473
+
474
+ async loadOverview() {
475
+ await loadOverviewInternal(this as unknown as Parameters<typeof loadOverviewInternal>[0]);
476
+ }
477
+
478
+ async loadCron() {
479
+ await loadCronInternal(this as unknown as Parameters<typeof loadCronInternal>[0]);
480
+ }
481
+
482
+ async handleAbortChat() {
483
+ await handleAbortChatInternal(this as unknown as Parameters<typeof handleAbortChatInternal>[0]);
484
+ }
485
+
486
+ removeQueuedMessage(id: string) {
487
+ removeQueuedMessageInternal(
488
+ this as unknown as Parameters<typeof removeQueuedMessageInternal>[0],
489
+ id,
490
+ );
491
+ }
492
+
493
+ async handleSendChat(
494
+ messageOverride?: string,
495
+ opts?: Parameters<typeof handleSendChatInternal>[2],
496
+ ) {
497
+ await handleSendChatInternal(
498
+ this as unknown as Parameters<typeof handleSendChatInternal>[0],
499
+ messageOverride,
500
+ opts,
501
+ );
502
+ }
503
+
504
+ async handleWhatsAppStart(force: boolean) {
505
+ await handleWhatsAppStartInternal(this, force);
506
+ }
507
+
508
+ async handleWhatsAppWait() {
509
+ await handleWhatsAppWaitInternal(this);
510
+ }
511
+
512
+ async handleWhatsAppLogout() {
513
+ await handleWhatsAppLogoutInternal(this);
514
+ }
515
+
516
+ async handleChannelConfigSave() {
517
+ await handleChannelConfigSaveInternal(this);
518
+ }
519
+
520
+ async handleChannelConfigReload() {
521
+ await handleChannelConfigReloadInternal(this);
522
+ }
523
+
524
+ handleNostrProfileEdit(accountId: string, profile: NostrProfile | null) {
525
+ handleNostrProfileEditInternal(this, accountId, profile);
526
+ }
527
+
528
+ handleNostrProfileCancel() {
529
+ handleNostrProfileCancelInternal(this);
530
+ }
531
+
532
+ handleNostrProfileFieldChange(field: keyof NostrProfile, value: string) {
533
+ handleNostrProfileFieldChangeInternal(this, field, value);
534
+ }
535
+
536
+ async handleNostrProfileSave() {
537
+ await handleNostrProfileSaveInternal(this);
538
+ }
539
+
540
+ async handleNostrProfileImport() {
541
+ await handleNostrProfileImportInternal(this);
542
+ }
543
+
544
+ handleNostrProfileToggleAdvanced() {
545
+ handleNostrProfileToggleAdvancedInternal(this);
546
+ }
547
+
548
+ async handleExecApprovalDecision(decision: "allow-once" | "allow-always" | "deny") {
549
+ const active = this.execApprovalQueue[0];
550
+ if (!active || !this.client || this.execApprovalBusy) {
551
+ return;
552
+ }
553
+ this.execApprovalBusy = true;
554
+ this.execApprovalError = null;
555
+ try {
556
+ await this.client.request("exec.approval.resolve", {
557
+ id: active.id,
558
+ decision,
559
+ });
560
+ this.execApprovalQueue = this.execApprovalQueue.filter((entry) => entry.id !== active.id);
561
+ } catch (err) {
562
+ this.execApprovalError = `Exec approval failed: ${String(err)}`;
563
+ } finally {
564
+ this.execApprovalBusy = false;
565
+ }
566
+ }
567
+
568
+ handleGatewayUrlConfirm() {
569
+ const nextGatewayUrl = this.pendingGatewayUrl;
570
+ if (!nextGatewayUrl) {
571
+ return;
572
+ }
573
+ this.pendingGatewayUrl = null;
574
+ applySettingsInternal(this as unknown as Parameters<typeof applySettingsInternal>[0], {
575
+ ...this.settings,
576
+ gatewayUrl: nextGatewayUrl,
577
+ });
578
+ this.connect();
579
+ }
580
+
581
+ handleGatewayUrlCancel() {
582
+ this.pendingGatewayUrl = null;
583
+ }
584
+
585
+ // Sidebar handlers for tool output viewing
586
+ handleOpenSidebar(content: string) {
587
+ if (this.sidebarCloseTimer != null) {
588
+ window.clearTimeout(this.sidebarCloseTimer);
589
+ this.sidebarCloseTimer = null;
590
+ }
591
+ this.sidebarContent = content;
592
+ this.sidebarError = null;
593
+ this.sidebarOpen = true;
594
+ }
595
+
596
+ handleCloseSidebar() {
597
+ this.sidebarOpen = false;
598
+ // Clear content after transition
599
+ if (this.sidebarCloseTimer != null) {
600
+ window.clearTimeout(this.sidebarCloseTimer);
601
+ }
602
+ this.sidebarCloseTimer = window.setTimeout(() => {
603
+ if (this.sidebarOpen) {
604
+ return;
605
+ }
606
+ this.sidebarContent = null;
607
+ this.sidebarError = null;
608
+ this.sidebarCloseTimer = null;
609
+ }, 200);
610
+ }
611
+
612
+ handleSplitRatioChange(ratio: number) {
613
+ const newRatio = Math.max(0.4, Math.min(0.7, ratio));
614
+ this.splitRatio = newRatio;
615
+ this.applySettings({ ...this.settings, splitRatio: newRatio });
616
+ }
617
+
618
+ render() {
619
+ return renderApp(this as unknown as AppViewState);
620
+ }
621
+ }
@@ -0,0 +1,23 @@
1
+ import { coerceIdentityValue } from "../../../src/shared/assistant-identity-values.js";
2
+
3
+ const MAX_ASSISTANT_NAME = 50;
4
+ const MAX_ASSISTANT_AVATAR = 200;
5
+
6
+ export const DEFAULT_ASSISTANT_NAME = "Assistant";
7
+ export const DEFAULT_ASSISTANT_AVATAR = "A";
8
+
9
+ export type AssistantIdentity = {
10
+ agentId?: string | null;
11
+ name: string;
12
+ avatar: string | null;
13
+ };
14
+
15
+ export function normalizeAssistantIdentity(
16
+ input?: Partial<AssistantIdentity> | null,
17
+ ): AssistantIdentity {
18
+ const name = coerceIdentityValue(input?.name, MAX_ASSISTANT_NAME) ?? DEFAULT_ASSISTANT_NAME;
19
+ const avatar = coerceIdentityValue(input?.avatar ?? undefined, MAX_ASSISTANT_AVATAR) ?? null;
20
+ const agentId =
21
+ typeof input?.agentId === "string" && input.agentId.trim() ? input.agentId.trim() : null;
22
+ return { agentId, name, avatar };
23
+ }
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Chat-related constants for the UI layer.
3
+ */
4
+
5
+ /** Character threshold for showing tool output inline vs collapsed */
6
+ export const TOOL_INLINE_THRESHOLD = 80;
7
+
8
+ /** Maximum lines to show in collapsed preview */
9
+ export const PREVIEW_MAX_LINES = 2;
10
+
11
+ /** Maximum characters to show in collapsed preview */
12
+ export const PREVIEW_MAX_CHARS = 100;