openclaw-multi-auto 1.3.6 → 1.3.8

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 (328) hide show
  1. package/dist/{audio-preflight-5FEeDooz.js → audio-preflight-DDBLZBdb.js} +4 -4
  2. package/dist/{audio-transcription-runner-B-UvoDjZ.js → audio-transcription-runner-DZbSWT9E.js} +1 -1
  3. package/dist/build-info.json +3 -3
  4. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  5. package/dist/{chrome-D45SyhQL.js → chrome-CMU2WVFh.js} +8 -8
  6. package/dist/{deliver-B9cys0EZ.js → deliver-BXVcFIHL.js} +1 -1
  7. package/dist/{deliver-runtime-DhaQJ0pI.js → deliver-runtime-DTaIS-1i.js} +3 -3
  8. package/dist/{deps-send-whatsapp.runtime-DvTL2tzN.js → deps-send-whatsapp.runtime-CIZqFAqb.js} +7 -7
  9. package/dist/extensionAPI.js +6 -6
  10. package/dist/{image-DAOPwVXi.js → image-BCVLo0qw.js} +1 -1
  11. package/dist/{image-runtime-wlCLVvVv.js → image-runtime-DtCKpMPZ.js} +3 -3
  12. package/dist/{pi-embedded-DYU79yGe.js → pi-embedded-CgQ_W6Xs.js} +24 -24
  13. package/dist/{pi-embedded-helpers-uTRAmQ4n.js → pi-embedded-helpers-CwuBTKza.js} +3 -3
  14. package/dist/plugin-sdk/{accounts-DyFCXtHv.js → accounts-BslAlVYS.js} +2 -2
  15. package/dist/plugin-sdk/{accounts-BJAXxY46.js → accounts-C3m65--E.js} +2 -2
  16. package/dist/plugin-sdk/{accounts-C1j7HSL0.js → accounts-CNCCkdEF.js} +3 -3
  17. package/dist/plugin-sdk/{active-listener-CftX5jLD.js → active-listener-CkPnMUkB.js} +2 -2
  18. package/dist/plugin-sdk/{api-key-rotation-8nyyt1kx.js → api-key-rotation-BXnNsojA.js} +2 -2
  19. package/dist/plugin-sdk/{audio-preflight-C_aSAPR1.js → audio-preflight-CtO4fFvp.js} +26 -26
  20. package/dist/plugin-sdk/{audio-transcription-runner-CB53F7_7.js → audio-transcription-runner-DnxvOS1-.js} +11 -11
  21. package/dist/plugin-sdk/{audit-membership-runtime-BXndI4LG.js → audit-membership-runtime-BpfoSk8M.js} +2 -2
  22. package/dist/plugin-sdk/{channel-activity-C5y8AgAV.js → channel-activity-WJYxcJ3S.js} +3 -3
  23. package/dist/plugin-sdk/{channel-web-DBTRO03V.js → channel-web-dO5k3ubM.js} +18 -18
  24. package/dist/plugin-sdk/{chrome-f00sZkDX.js → chrome-CjNTuJML.js} +6 -6
  25. package/dist/plugin-sdk/{commands-registry-BJ_NxG2F.js → commands-registry-CdYjoI0i.js} +4 -4
  26. package/dist/plugin-sdk/{common-Cf27Jwxu.js → common-oYc5vPFl.js} +2 -2
  27. package/dist/plugin-sdk/{config-CHQrpx-Q.js → config-B1z-UxQ3.js} +7 -7
  28. package/dist/plugin-sdk/{deliver-DNEuetST.js → deliver-D5_6T567.js} +10 -10
  29. package/dist/plugin-sdk/deliver-runtime-C5dgvvga.js +32 -0
  30. package/dist/plugin-sdk/deps-send-discord.runtime-Dg4N7PHJ.js +23 -0
  31. package/dist/plugin-sdk/deps-send-imessage.runtime-0OEwzMQm.js +22 -0
  32. package/dist/plugin-sdk/deps-send-signal.runtime-BM1jRt3G.js +21 -0
  33. package/dist/plugin-sdk/deps-send-slack.runtime-1E3BYRdF.js +19 -0
  34. package/dist/plugin-sdk/deps-send-telegram.runtime-DNCxIflA.js +24 -0
  35. package/dist/plugin-sdk/deps-send-whatsapp.runtime-OLwr-9c8.js +57 -0
  36. package/dist/plugin-sdk/{diagnostic-LYUUmjJ5.js → diagnostic-Bxxu0ig-.js} +2 -2
  37. package/dist/plugin-sdk/{errors-CtMWwS2Z.js → errors-B3cHyZZA.js} +1 -1
  38. package/dist/plugin-sdk/{fetch-guard-CxYB5Kg6.js → fetch-guard-Dcgod0tg.js} +2 -2
  39. package/dist/plugin-sdk/{fs-safe-DtfhxbrI.js → fs-safe-BaKqI3G4.js} +3 -3
  40. package/dist/plugin-sdk/{image-BwjYjRHx.js → image-B2mQW9Rb.js} +6 -6
  41. package/dist/plugin-sdk/{image-ops-BnZKcbd6.js → image-ops-Cbzr4U9l.js} +2 -2
  42. package/dist/plugin-sdk/image-runtime-BFm45j49.js +25 -0
  43. package/dist/plugin-sdk/{ir-Z4hX67TJ.js → ir-ZEmrTr4J.js} +7 -7
  44. package/dist/plugin-sdk/{local-roots-KhjQw04O.js → local-roots-CIPRxA-4.js} +4 -4
  45. package/dist/plugin-sdk/{logger-DHIIvMxj.js → logger-CvPFVOgT.js} +2 -2
  46. package/dist/plugin-sdk/{login-C31642Ld.js → login-CCTew9bt.js} +4 -4
  47. package/dist/plugin-sdk/{login-qr--y2SG_Ue.js → login-qr-BI3Vi_wJ.js} +5 -5
  48. package/dist/plugin-sdk/{manager-2UZBMCc7.js → manager-BEoYPn7R.js} +8 -8
  49. package/dist/plugin-sdk/manager-runtime-DxclHQ4U.js +15 -0
  50. package/dist/plugin-sdk/{outbound-Ba0QUI5h.js → outbound-ByOw1K6W.js} +5 -5
  51. package/dist/plugin-sdk/{outbound-attachment-B1Laso-8.js → outbound-attachment-BzVhxRRw.js} +2 -2
  52. package/dist/plugin-sdk/{path-alias-guards-C7Vm5DZ1.js → path-alias-guards-sWayacde.js} +1 -1
  53. package/dist/plugin-sdk/{paths-DopV9PQG.js → paths-Dpg3qxcl.js} +1 -1
  54. package/dist/plugin-sdk/{pi-embedded-helpers-DnA_OCzP.js → pi-embedded-helpers-DIxXkGJf.js} +16 -16
  55. package/dist/plugin-sdk/{pi-model-discovery-DdPqXk8f.js → pi-model-discovery-DM_2uFtj.js} +1 -1
  56. package/dist/plugin-sdk/pi-model-discovery-runtime-BuzvkvNR.js +8 -0
  57. package/dist/plugin-sdk/{pi-tools.before-tool-call.runtime-DxFHiLUE.js → pi-tools.before-tool-call.runtime-w1dqL_ty.js} +4 -4
  58. package/dist/plugin-sdk/{plugins-CbCt4osF.js → plugins-C4USiH29.js} +4 -4
  59. package/dist/plugin-sdk/{proxy-env-C63mMdas.js → proxy-env-ET-rp8eg.js} +1 -1
  60. package/dist/plugin-sdk/{proxy-fetch-Ch95c_Y2.js → proxy-fetch-uDXGKG3Z.js} +1 -1
  61. package/dist/plugin-sdk/{pw-ai-DpJk62D4.js → pw-ai-CyOt3RDA.js} +9 -9
  62. package/dist/plugin-sdk/{qmd-manager-Ca-iSfEE.js → qmd-manager-BySdoVR7.js} +7 -7
  63. package/dist/plugin-sdk/{query-expansion-B_Xe41Ab.js → query-expansion-C6uS-7lj.js} +4 -4
  64. package/dist/plugin-sdk/{redact-hp9TOulW.js → redact-Bvxt1T_Q.js} +1 -1
  65. package/dist/plugin-sdk/{reply-CovBlFea.js → reply-CTCSeQqW.js} +73 -73
  66. package/dist/plugin-sdk/{resolve-outbound-target-BbrHgyUk.js → resolve-outbound-target-Bw8YNANu.js} +2 -2
  67. package/dist/plugin-sdk/{run-with-concurrency-BR1DXa8T.js → run-with-concurrency-C_KCHwvf.js} +1 -1
  68. package/dist/plugin-sdk/runtime-whatsapp-login.runtime-BxgRDkhc.js +10 -0
  69. package/dist/plugin-sdk/runtime-whatsapp-outbound.runtime-elOqrkfg.js +19 -0
  70. package/dist/plugin-sdk/{send-BvAtLLPl.js → send-BZ6nYFZr.js} +5 -5
  71. package/dist/plugin-sdk/{send-BTztm3D2.js → send-C0w6xP2x.js} +6 -6
  72. package/dist/plugin-sdk/{send-CWJUuG0i.js → send-CFf-1V89.js} +8 -8
  73. package/dist/plugin-sdk/{send-EcglC4cG.js → send-CY-Qfwia.js} +7 -7
  74. package/dist/plugin-sdk/{send-BXpXBwM_.js → send-qPyNGSe4.js} +13 -13
  75. package/dist/plugin-sdk/{session-k256LJZT.js → session-COrvpvUQ.js} +3 -3
  76. package/dist/plugin-sdk/signal.js +2 -2
  77. package/dist/plugin-sdk/{skill-commands-DoRqLzxm.js → skill-commands-DZqhtmiv.js} +4 -4
  78. package/dist/plugin-sdk/{skills-QudILG6e.js → skills-Cw_vXEJb.js} +6 -6
  79. package/dist/plugin-sdk/slash-commands.runtime-D67JLweo.js +13 -0
  80. package/dist/plugin-sdk/slash-dispatch.runtime-DvcpvCJ0.js +52 -0
  81. package/dist/plugin-sdk/slash-skill-commands.runtime-BM1x3azR.js +16 -0
  82. package/dist/plugin-sdk/{store-BbDQw3g6.js → store-CMHj6IIw.js} +2 -2
  83. package/dist/plugin-sdk/subagent-registry-runtime-1lbDyRzz.js +52 -0
  84. package/dist/plugin-sdk/{tables-BhvloMKN.js → tables-CSqrHsKL.js} +1 -1
  85. package/dist/plugin-sdk/{thinking-URzkT-3p.js → thinking-DOnsR_A8.js} +7 -7
  86. package/dist/plugin-sdk/{tokens-B1PW5Ayy.js → tokens-BDr0Z9o3.js} +1 -1
  87. package/dist/plugin-sdk/{tool-images-xpqbP6RR.js → tool-images-eEfOVkzf.js} +2 -2
  88. package/dist/plugin-sdk/web-BLyT64pW.js +56 -0
  89. package/dist/plugin-sdk/{whatsapp-actions-RcZ6vp61.js → whatsapp-actions-xcleMoMv.js} +17 -17
  90. package/dist/plugin-sdk/whatsapp.js +50 -50
  91. package/dist/{pw-ai-GcYO6HPE.js → pw-ai-CmphSzHx.js} +1 -1
  92. package/dist/{slash-dispatch.runtime-Dh053pQK.js → slash-dispatch.runtime-131yup2e.js} +6 -6
  93. package/dist/{subagent-registry-runtime-DSi5mnCQ.js → subagent-registry-runtime-DbSf_Je6.js} +6 -6
  94. package/dist/{web-1hWJDzNA.js → web-MR9d7KyB.js} +6 -6
  95. package/package.json +5 -2
  96. package/scripts/create-instance.sh +44 -19
  97. package/scripts/install-maca.sh +39 -28
  98. package/scripts/npm_publish.sh +8 -6
  99. package/ui/index.html +16 -0
  100. package/ui/node_modules/.bin/jiti +21 -0
  101. package/ui/node_modules/.bin/lessc +21 -0
  102. package/ui/node_modules/.bin/marked +21 -0
  103. package/ui/node_modules/.bin/playwright +21 -0
  104. package/ui/node_modules/.bin/sass +21 -0
  105. package/ui/node_modules/.bin/tsx +21 -0
  106. package/ui/node_modules/.bin/vite +21 -0
  107. package/ui/node_modules/.bin/vitest +21 -0
  108. package/ui/node_modules/.bin/yaml +21 -0
  109. package/ui/package.json +27 -0
  110. package/ui/public/apple-touch-icon.png +0 -0
  111. package/ui/public/favicon-32.png +0 -0
  112. package/ui/public/favicon.ico +0 -0
  113. package/ui/public/favicon.svg +22 -0
  114. package/ui/src/css.d.ts +1 -0
  115. package/ui/src/i18n/index.ts +3 -0
  116. package/ui/src/i18n/lib/lit-controller.ts +22 -0
  117. package/ui/src/i18n/lib/registry.ts +64 -0
  118. package/ui/src/i18n/lib/translate.ts +123 -0
  119. package/ui/src/i18n/lib/types.ts +9 -0
  120. package/ui/src/i18n/locales/de.ts +129 -0
  121. package/ui/src/i18n/locales/en.ts +337 -0
  122. package/ui/src/i18n/locales/pt-BR.ts +128 -0
  123. package/ui/src/i18n/locales/zh-CN.ts +330 -0
  124. package/ui/src/i18n/locales/zh-TW.ts +125 -0
  125. package/ui/src/i18n/test/translate.test.ts +56 -0
  126. package/ui/src/main.ts +2 -0
  127. package/ui/src/styles/base.css +385 -0
  128. package/ui/src/styles/chat/grouped.css +300 -0
  129. package/ui/src/styles/chat/layout.css +481 -0
  130. package/ui/src/styles/chat/sidebar.css +117 -0
  131. package/ui/src/styles/chat/text.css +146 -0
  132. package/ui/src/styles/chat/tool-cards.css +202 -0
  133. package/ui/src/styles/chat.css +5 -0
  134. package/ui/src/styles/components.css +2612 -0
  135. package/ui/src/styles/config.css +1658 -0
  136. package/ui/src/styles/layout.css +621 -0
  137. package/ui/src/styles/layout.mobile.css +374 -0
  138. package/ui/src/styles.css +5 -0
  139. package/ui/src/ui/__screenshots__/config-form.browser.test.ts/config-form-renderer-flags-unsupported-unions-1.png +0 -0
  140. package/ui/src/ui/__screenshots__/config-form.browser.test.ts/config-form-renderer-renders-inputs-and-patches-values-1.png +0 -0
  141. package/ui/src/ui/__screenshots__/config-form.browser.test.ts/config-form-renderer-renders-union-literals-as-select-options-1.png +0 -0
  142. package/ui/src/ui/__screenshots__/navigation.browser.test.ts/control-UI-routing-auto-scrolls-chat-history-to-the-latest-message-1.png +0 -0
  143. package/ui/src/ui/app-channels.ts +279 -0
  144. package/ui/src/ui/app-chat.ts +266 -0
  145. package/ui/src/ui/app-defaults.ts +50 -0
  146. package/ui/src/ui/app-events.ts +5 -0
  147. package/ui/src/ui/app-gateway.node.test.ts +229 -0
  148. package/ui/src/ui/app-gateway.ts +349 -0
  149. package/ui/src/ui/app-lifecycle.node.test.ts +44 -0
  150. package/ui/src/ui/app-lifecycle.ts +109 -0
  151. package/ui/src/ui/app-polling.ts +69 -0
  152. package/ui/src/ui/app-render-usage-tab.ts +273 -0
  153. package/ui/src/ui/app-render.helpers.node.test.ts +286 -0
  154. package/ui/src/ui/app-render.helpers.ts +574 -0
  155. package/ui/src/ui/app-render.ts +1168 -0
  156. package/ui/src/ui/app-scroll.test.ts +275 -0
  157. package/ui/src/ui/app-scroll.ts +179 -0
  158. package/ui/src/ui/app-settings.test.ts +70 -0
  159. package/ui/src/ui/app-settings.ts +440 -0
  160. package/ui/src/ui/app-tool-stream.node.test.ts +139 -0
  161. package/ui/src/ui/app-tool-stream.ts +455 -0
  162. package/ui/src/ui/app-view-state.ts +321 -0
  163. package/ui/src/ui/app.ts +621 -0
  164. package/ui/src/ui/assistant-identity.ts +23 -0
  165. package/ui/src/ui/chat/constants.ts +12 -0
  166. package/ui/src/ui/chat/copy-as-markdown.ts +97 -0
  167. package/ui/src/ui/chat/grouped-render.ts +287 -0
  168. package/ui/src/ui/chat/message-extract.test.ts +64 -0
  169. package/ui/src/ui/chat/message-extract.ts +122 -0
  170. package/ui/src/ui/chat/message-normalizer.test.ts +179 -0
  171. package/ui/src/ui/chat/message-normalizer.ts +101 -0
  172. package/ui/src/ui/chat/tool-cards.ts +156 -0
  173. package/ui/src/ui/chat/tool-helpers.test.ts +141 -0
  174. package/ui/src/ui/chat/tool-helpers.ts +37 -0
  175. package/ui/src/ui/chat-event-reload.test.ts +47 -0
  176. package/ui/src/ui/chat-event-reload.ts +16 -0
  177. package/ui/src/ui/chat-markdown.browser.test.ts +37 -0
  178. package/ui/src/ui/components/resizable-divider.ts +110 -0
  179. package/ui/src/ui/config-form.browser.test.ts +443 -0
  180. package/ui/src/ui/controllers/agent-files.ts +126 -0
  181. package/ui/src/ui/controllers/agent-identity.ts +59 -0
  182. package/ui/src/ui/controllers/agent-skills.ts +33 -0
  183. package/ui/src/ui/controllers/agents.test.ts +61 -0
  184. package/ui/src/ui/controllers/agents.ts +64 -0
  185. package/ui/src/ui/controllers/assistant-identity.ts +34 -0
  186. package/ui/src/ui/controllers/channels.ts +94 -0
  187. package/ui/src/ui/controllers/channels.types.ts +15 -0
  188. package/ui/src/ui/controllers/chat.test.ts +568 -0
  189. package/ui/src/ui/controllers/chat.ts +318 -0
  190. package/ui/src/ui/controllers/config/form-coerce.ts +160 -0
  191. package/ui/src/ui/controllers/config/form-utils.node.test.ts +455 -0
  192. package/ui/src/ui/controllers/config/form-utils.ts +90 -0
  193. package/ui/src/ui/controllers/config.test.ts +289 -0
  194. package/ui/src/ui/controllers/config.ts +219 -0
  195. package/ui/src/ui/controllers/control-ui-bootstrap.test.ts +82 -0
  196. package/ui/src/ui/controllers/control-ui-bootstrap.ts +49 -0
  197. package/ui/src/ui/controllers/cron-filters.test.ts +81 -0
  198. package/ui/src/ui/controllers/cron.test.ts +1070 -0
  199. package/ui/src/ui/controllers/cron.ts +921 -0
  200. package/ui/src/ui/controllers/debug.ts +60 -0
  201. package/ui/src/ui/controllers/devices.ts +159 -0
  202. package/ui/src/ui/controllers/exec-approval.ts +100 -0
  203. package/ui/src/ui/controllers/exec-approvals.ts +170 -0
  204. package/ui/src/ui/controllers/logs.ts +147 -0
  205. package/ui/src/ui/controllers/nodes.ts +32 -0
  206. package/ui/src/ui/controllers/presence.ts +37 -0
  207. package/ui/src/ui/controllers/sessions.test.ts +104 -0
  208. package/ui/src/ui/controllers/sessions.ts +127 -0
  209. package/ui/src/ui/controllers/skills.ts +157 -0
  210. package/ui/src/ui/controllers/usage.node.test.ts +181 -0
  211. package/ui/src/ui/controllers/usage.ts +315 -0
  212. package/ui/src/ui/data/moonshot-kimi-k2.ts +45 -0
  213. package/ui/src/ui/device-auth.ts +73 -0
  214. package/ui/src/ui/device-identity.ts +112 -0
  215. package/ui/src/ui/external-link.test.ts +18 -0
  216. package/ui/src/ui/external-link.ts +19 -0
  217. package/ui/src/ui/focus-mode.browser.test.ts +39 -0
  218. package/ui/src/ui/format.test.ts +101 -0
  219. package/ui/src/ui/format.ts +60 -0
  220. package/ui/src/ui/gateway.ts +360 -0
  221. package/ui/src/ui/icons.ts +256 -0
  222. package/ui/src/ui/markdown.test.ts +85 -0
  223. package/ui/src/ui/markdown.ts +139 -0
  224. package/ui/src/ui/navigation.browser.test.ts +188 -0
  225. package/ui/src/ui/navigation.test.ts +189 -0
  226. package/ui/src/ui/navigation.ts +165 -0
  227. package/ui/src/ui/open-external-url.test.ts +108 -0
  228. package/ui/src/ui/open-external-url.ts +73 -0
  229. package/ui/src/ui/presenter.ts +85 -0
  230. package/ui/src/ui/storage.node.test.ts +63 -0
  231. package/ui/src/ui/storage.ts +99 -0
  232. package/ui/src/ui/test-helpers/app-mount.ts +27 -0
  233. package/ui/src/ui/text-direction.test.ts +24 -0
  234. package/ui/src/ui/text-direction.ts +30 -0
  235. package/ui/src/ui/theme-transition.ts +109 -0
  236. package/ui/src/ui/theme.ts +16 -0
  237. package/ui/src/ui/tool-display.ts +159 -0
  238. package/ui/src/ui/types/chat-types.ts +44 -0
  239. package/ui/src/ui/types.ts +627 -0
  240. package/ui/src/ui/ui-types.ts +54 -0
  241. package/ui/src/ui/usage-helpers.node.test.ts +43 -0
  242. package/ui/src/ui/usage-helpers.ts +321 -0
  243. package/ui/src/ui/usage-types.ts +22 -0
  244. package/ui/src/ui/uuid.test.ts +41 -0
  245. package/ui/src/ui/uuid.ts +57 -0
  246. package/ui/src/ui/views/agents-panels-status-files.ts +461 -0
  247. package/ui/src/ui/views/agents-panels-tools-skills.browser.test.ts +102 -0
  248. package/ui/src/ui/views/agents-panels-tools-skills.ts +537 -0
  249. package/ui/src/ui/views/agents-utils.test.ts +100 -0
  250. package/ui/src/ui/views/agents-utils.ts +502 -0
  251. package/ui/src/ui/views/agents.ts +499 -0
  252. package/ui/src/ui/views/channel-config-extras.ts +49 -0
  253. package/ui/src/ui/views/channels.config.ts +155 -0
  254. package/ui/src/ui/views/channels.discord.ts +65 -0
  255. package/ui/src/ui/views/channels.googlechat.ts +79 -0
  256. package/ui/src/ui/views/channels.imessage.ts +65 -0
  257. package/ui/src/ui/views/channels.nostr-profile-form.ts +321 -0
  258. package/ui/src/ui/views/channels.nostr.ts +237 -0
  259. package/ui/src/ui/views/channels.shared.ts +38 -0
  260. package/ui/src/ui/views/channels.signal.ts +69 -0
  261. package/ui/src/ui/views/channels.slack.ts +65 -0
  262. package/ui/src/ui/views/channels.telegram.ts +120 -0
  263. package/ui/src/ui/views/channels.ts +325 -0
  264. package/ui/src/ui/views/channels.types.ts +62 -0
  265. package/ui/src/ui/views/channels.whatsapp.ts +118 -0
  266. package/ui/src/ui/views/chat-image-open.browser.test.ts +70 -0
  267. package/ui/src/ui/views/chat.test.ts +227 -0
  268. package/ui/src/ui/views/chat.ts +616 -0
  269. package/ui/src/ui/views/config-form.analyze.ts +267 -0
  270. package/ui/src/ui/views/config-form.node.ts +1073 -0
  271. package/ui/src/ui/views/config-form.render.ts +478 -0
  272. package/ui/src/ui/views/config-form.search.node.test.ts +69 -0
  273. package/ui/src/ui/views/config-form.shared.ts +96 -0
  274. package/ui/src/ui/views/config-form.ts +4 -0
  275. package/ui/src/ui/views/config-search.node.test.ts +50 -0
  276. package/ui/src/ui/views/config-search.ts +92 -0
  277. package/ui/src/ui/views/config.browser.test.ts +233 -0
  278. package/ui/src/ui/views/config.ts +820 -0
  279. package/ui/src/ui/views/cron.test.ts +741 -0
  280. package/ui/src/ui/views/cron.ts +1758 -0
  281. package/ui/src/ui/views/debug.ts +151 -0
  282. package/ui/src/ui/views/exec-approval.ts +89 -0
  283. package/ui/src/ui/views/gateway-url-confirmation.ts +40 -0
  284. package/ui/src/ui/views/instances.ts +89 -0
  285. package/ui/src/ui/views/logs.ts +155 -0
  286. package/ui/src/ui/views/markdown-sidebar.ts +40 -0
  287. package/ui/src/ui/views/nodes-exec-approvals.ts +617 -0
  288. package/ui/src/ui/views/nodes-shared.ts +67 -0
  289. package/ui/src/ui/views/nodes.ts +485 -0
  290. package/ui/src/ui/views/overview-hints.ts +16 -0
  291. package/ui/src/ui/views/overview.node.test.ts +39 -0
  292. package/ui/src/ui/views/overview.ts +361 -0
  293. package/ui/src/ui/views/sessions.test.ts +81 -0
  294. package/ui/src/ui/views/sessions.ts +321 -0
  295. package/ui/src/ui/views/skills-grouping.ts +40 -0
  296. package/ui/src/ui/views/skills-shared.ts +52 -0
  297. package/ui/src/ui/views/skills.ts +192 -0
  298. package/ui/src/ui/views/usage-metrics.ts +578 -0
  299. package/ui/src/ui/views/usage-query.ts +277 -0
  300. package/ui/src/ui/views/usage-render-details.test.ts +136 -0
  301. package/ui/src/ui/views/usage-render-details.ts +1083 -0
  302. package/ui/src/ui/views/usage-render-overview.ts +796 -0
  303. package/ui/src/ui/views/usage-styles/usageStyles-part1.ts +701 -0
  304. package/ui/src/ui/views/usage-styles/usageStyles-part2.ts +702 -0
  305. package/ui/src/ui/views/usage-styles/usageStyles-part3.ts +551 -0
  306. package/ui/src/ui/views/usage.ts +836 -0
  307. package/ui/src/ui/views/usageStyles.ts +5 -0
  308. package/ui/src/ui/views/usageTypes.ts +105 -0
  309. package/ui/vite.config.ts +43 -0
  310. package/ui/vitest.config.ts +15 -0
  311. package/ui/vitest.node.config.ts +10 -0
  312. package/dist/plugin-sdk/deliver-runtime-BFdqklJM.js +0 -32
  313. package/dist/plugin-sdk/deps-send-discord.runtime-DuqpYwU0.js +0 -23
  314. package/dist/plugin-sdk/deps-send-imessage.runtime-CZ2rS8Lb.js +0 -22
  315. package/dist/plugin-sdk/deps-send-signal.runtime-BdqiWhIh.js +0 -21
  316. package/dist/plugin-sdk/deps-send-slack.runtime-04s36qiC.js +0 -19
  317. package/dist/plugin-sdk/deps-send-telegram.runtime-LE5tkPvr.js +0 -24
  318. package/dist/plugin-sdk/deps-send-whatsapp.runtime-Bz57lobC.js +0 -57
  319. package/dist/plugin-sdk/image-runtime-B8twoubs.js +0 -25
  320. package/dist/plugin-sdk/manager-runtime-CMeLwose.js +0 -15
  321. package/dist/plugin-sdk/pi-model-discovery-runtime-D8CJhtJY.js +0 -8
  322. package/dist/plugin-sdk/runtime-whatsapp-login.runtime-SkO91TZH.js +0 -10
  323. package/dist/plugin-sdk/runtime-whatsapp-outbound.runtime-B0VWK5hm.js +0 -19
  324. package/dist/plugin-sdk/slash-commands.runtime-DS6vCNSL.js +0 -13
  325. package/dist/plugin-sdk/slash-dispatch.runtime-BXrxb2wd.js +0 -52
  326. package/dist/plugin-sdk/slash-skill-commands.runtime-Bd6qQ2oT.js +0 -16
  327. package/dist/plugin-sdk/subagent-registry-runtime-1uwQbuXj.js +0 -52
  328. package/dist/plugin-sdk/web-B74yhL2N.js +0 -56
@@ -0,0 +1,318 @@
1
+ import { extractText } from "../chat/message-extract.ts";
2
+ import type { GatewayBrowserClient } from "../gateway.ts";
3
+ import type { ChatAttachment } from "../ui-types.ts";
4
+ import { generateUUID } from "../uuid.ts";
5
+
6
+ const SILENT_REPLY_PATTERN = /^\s*NO_REPLY\s*$/;
7
+
8
+ function isSilentReplyStream(text: string): boolean {
9
+ return SILENT_REPLY_PATTERN.test(text);
10
+ }
11
+ /** Client-side defense-in-depth: detect assistant messages whose text is purely NO_REPLY. */
12
+ function isAssistantSilentReply(message: unknown): boolean {
13
+ if (!message || typeof message !== "object") {
14
+ return false;
15
+ }
16
+ const entry = message as Record<string, unknown>;
17
+ const role = typeof entry.role === "string" ? entry.role.toLowerCase() : "";
18
+ if (role !== "assistant") {
19
+ return false;
20
+ }
21
+ // entry.text takes precedence — matches gateway extractAssistantTextForSilentCheck
22
+ if (typeof entry.text === "string") {
23
+ return isSilentReplyStream(entry.text);
24
+ }
25
+ const text = extractText(message);
26
+ return typeof text === "string" && isSilentReplyStream(text);
27
+ }
28
+
29
+ export type ChatState = {
30
+ client: GatewayBrowserClient | null;
31
+ connected: boolean;
32
+ sessionKey: string;
33
+ chatLoading: boolean;
34
+ chatMessages: unknown[];
35
+ chatThinkingLevel: string | null;
36
+ chatSending: boolean;
37
+ chatMessage: string;
38
+ chatAttachments: ChatAttachment[];
39
+ chatRunId: string | null;
40
+ chatStream: string | null;
41
+ chatStreamStartedAt: number | null;
42
+ lastError: string | null;
43
+ };
44
+
45
+ export type ChatEventPayload = {
46
+ runId: string;
47
+ sessionKey: string;
48
+ state: "delta" | "final" | "aborted" | "error";
49
+ message?: unknown;
50
+ errorMessage?: string;
51
+ };
52
+
53
+ export async function loadChatHistory(state: ChatState) {
54
+ if (!state.client || !state.connected) {
55
+ return;
56
+ }
57
+ state.chatLoading = true;
58
+ state.lastError = null;
59
+ try {
60
+ const res = await state.client.request<{ messages?: Array<unknown>; thinkingLevel?: string }>(
61
+ "chat.history",
62
+ {
63
+ sessionKey: state.sessionKey,
64
+ limit: 200,
65
+ },
66
+ );
67
+ const messages = Array.isArray(res.messages) ? res.messages : [];
68
+ state.chatMessages = messages.filter((message) => !isAssistantSilentReply(message));
69
+ state.chatThinkingLevel = res.thinkingLevel ?? null;
70
+ } catch (err) {
71
+ state.lastError = String(err);
72
+ } finally {
73
+ state.chatLoading = false;
74
+ }
75
+ }
76
+
77
+ function dataUrlToBase64(dataUrl: string): { content: string; mimeType: string } | null {
78
+ const match = /^data:([^;]+);base64,(.+)$/.exec(dataUrl);
79
+ if (!match) {
80
+ return null;
81
+ }
82
+ return { mimeType: match[1], content: match[2] };
83
+ }
84
+
85
+ type AssistantMessageNormalizationOptions = {
86
+ roleRequirement: "required" | "optional";
87
+ roleCaseSensitive?: boolean;
88
+ requireContentArray?: boolean;
89
+ allowTextField?: boolean;
90
+ };
91
+
92
+ function normalizeAssistantMessage(
93
+ message: unknown,
94
+ options: AssistantMessageNormalizationOptions,
95
+ ): Record<string, unknown> | null {
96
+ if (!message || typeof message !== "object") {
97
+ return null;
98
+ }
99
+ const candidate = message as Record<string, unknown>;
100
+ const roleValue = candidate.role;
101
+ if (typeof roleValue === "string") {
102
+ const role = options.roleCaseSensitive ? roleValue : roleValue.toLowerCase();
103
+ if (role !== "assistant") {
104
+ return null;
105
+ }
106
+ } else if (options.roleRequirement === "required") {
107
+ return null;
108
+ }
109
+
110
+ if (options.requireContentArray) {
111
+ return Array.isArray(candidate.content) ? candidate : null;
112
+ }
113
+ if (!("content" in candidate) && !(options.allowTextField && "text" in candidate)) {
114
+ return null;
115
+ }
116
+ return candidate;
117
+ }
118
+
119
+ function normalizeAbortedAssistantMessage(message: unknown): Record<string, unknown> | null {
120
+ return normalizeAssistantMessage(message, {
121
+ roleRequirement: "required",
122
+ roleCaseSensitive: true,
123
+ requireContentArray: true,
124
+ });
125
+ }
126
+
127
+ function normalizeFinalAssistantMessage(message: unknown): Record<string, unknown> | null {
128
+ return normalizeAssistantMessage(message, {
129
+ roleRequirement: "optional",
130
+ allowTextField: true,
131
+ });
132
+ }
133
+
134
+ export async function sendChatMessage(
135
+ state: ChatState,
136
+ message: string,
137
+ attachments?: ChatAttachment[],
138
+ ): Promise<string | null> {
139
+ if (!state.client || !state.connected) {
140
+ return null;
141
+ }
142
+ const msg = message.trim();
143
+ const hasAttachments = attachments && attachments.length > 0;
144
+ if (!msg && !hasAttachments) {
145
+ return null;
146
+ }
147
+
148
+ const now = Date.now();
149
+
150
+ // Build user message content blocks
151
+ const contentBlocks: Array<{ type: string; text?: string; source?: unknown }> = [];
152
+ if (msg) {
153
+ contentBlocks.push({ type: "text", text: msg });
154
+ }
155
+ // Add image previews to the message for display
156
+ if (hasAttachments) {
157
+ for (const att of attachments) {
158
+ contentBlocks.push({
159
+ type: "image",
160
+ source: { type: "base64", media_type: att.mimeType, data: att.dataUrl },
161
+ });
162
+ }
163
+ }
164
+
165
+ state.chatMessages = [
166
+ ...state.chatMessages,
167
+ {
168
+ role: "user",
169
+ content: contentBlocks,
170
+ timestamp: now,
171
+ },
172
+ ];
173
+
174
+ state.chatSending = true;
175
+ state.lastError = null;
176
+ const runId = generateUUID();
177
+ state.chatRunId = runId;
178
+ state.chatStream = "";
179
+ state.chatStreamStartedAt = now;
180
+
181
+ // Convert attachments to API format
182
+ const apiAttachments = hasAttachments
183
+ ? attachments
184
+ .map((att) => {
185
+ const parsed = dataUrlToBase64(att.dataUrl);
186
+ if (!parsed) {
187
+ return null;
188
+ }
189
+ return {
190
+ type: "image",
191
+ mimeType: parsed.mimeType,
192
+ content: parsed.content,
193
+ };
194
+ })
195
+ .filter((a): a is NonNullable<typeof a> => a !== null)
196
+ : undefined;
197
+
198
+ try {
199
+ await state.client.request("chat.send", {
200
+ sessionKey: state.sessionKey,
201
+ message: msg,
202
+ deliver: false,
203
+ idempotencyKey: runId,
204
+ attachments: apiAttachments,
205
+ });
206
+ return runId;
207
+ } catch (err) {
208
+ const error = String(err);
209
+ state.chatRunId = null;
210
+ state.chatStream = null;
211
+ state.chatStreamStartedAt = null;
212
+ state.lastError = error;
213
+ state.chatMessages = [
214
+ ...state.chatMessages,
215
+ {
216
+ role: "assistant",
217
+ content: [{ type: "text", text: "Error: " + error }],
218
+ timestamp: Date.now(),
219
+ },
220
+ ];
221
+ return null;
222
+ } finally {
223
+ state.chatSending = false;
224
+ }
225
+ }
226
+
227
+ export async function abortChatRun(state: ChatState): Promise<boolean> {
228
+ if (!state.client || !state.connected) {
229
+ return false;
230
+ }
231
+ const runId = state.chatRunId;
232
+ try {
233
+ await state.client.request(
234
+ "chat.abort",
235
+ runId ? { sessionKey: state.sessionKey, runId } : { sessionKey: state.sessionKey },
236
+ );
237
+ return true;
238
+ } catch (err) {
239
+ state.lastError = String(err);
240
+ return false;
241
+ }
242
+ }
243
+
244
+ export function handleChatEvent(state: ChatState, payload?: ChatEventPayload) {
245
+ if (!payload) {
246
+ return null;
247
+ }
248
+ if (payload.sessionKey !== state.sessionKey) {
249
+ return null;
250
+ }
251
+
252
+ // Final from another run (e.g. sub-agent announce): refresh history to show new message.
253
+ // See https://github.com/openclaw/openclaw/issues/1909
254
+ if (payload.runId && state.chatRunId && payload.runId !== state.chatRunId) {
255
+ if (payload.state === "final") {
256
+ const finalMessage = normalizeFinalAssistantMessage(payload.message);
257
+ if (finalMessage && !isAssistantSilentReply(finalMessage)) {
258
+ state.chatMessages = [...state.chatMessages, finalMessage];
259
+ return null;
260
+ }
261
+ return "final";
262
+ }
263
+ return null;
264
+ }
265
+
266
+ if (payload.state === "delta") {
267
+ const next = extractText(payload.message);
268
+ if (typeof next === "string" && !isSilentReplyStream(next)) {
269
+ const current = state.chatStream ?? "";
270
+ if (!current || next.length >= current.length) {
271
+ state.chatStream = next;
272
+ }
273
+ }
274
+ } else if (payload.state === "final") {
275
+ const finalMessage = normalizeFinalAssistantMessage(payload.message);
276
+ if (finalMessage && !isAssistantSilentReply(finalMessage)) {
277
+ state.chatMessages = [...state.chatMessages, finalMessage];
278
+ } else if (state.chatStream?.trim() && !isSilentReplyStream(state.chatStream)) {
279
+ state.chatMessages = [
280
+ ...state.chatMessages,
281
+ {
282
+ role: "assistant",
283
+ content: [{ type: "text", text: state.chatStream }],
284
+ timestamp: Date.now(),
285
+ },
286
+ ];
287
+ }
288
+ state.chatStream = null;
289
+ state.chatRunId = null;
290
+ state.chatStreamStartedAt = null;
291
+ } else if (payload.state === "aborted") {
292
+ const normalizedMessage = normalizeAbortedAssistantMessage(payload.message);
293
+ if (normalizedMessage && !isAssistantSilentReply(normalizedMessage)) {
294
+ state.chatMessages = [...state.chatMessages, normalizedMessage];
295
+ } else {
296
+ const streamedText = state.chatStream ?? "";
297
+ if (streamedText.trim() && !isSilentReplyStream(streamedText)) {
298
+ state.chatMessages = [
299
+ ...state.chatMessages,
300
+ {
301
+ role: "assistant",
302
+ content: [{ type: "text", text: streamedText }],
303
+ timestamp: Date.now(),
304
+ },
305
+ ];
306
+ }
307
+ }
308
+ state.chatStream = null;
309
+ state.chatRunId = null;
310
+ state.chatStreamStartedAt = null;
311
+ } else if (payload.state === "error") {
312
+ state.chatStream = null;
313
+ state.chatRunId = null;
314
+ state.chatStreamStartedAt = null;
315
+ state.lastError = payload.errorMessage ?? "chat error";
316
+ }
317
+ return payload.state;
318
+ }
@@ -0,0 +1,160 @@
1
+ import { schemaType, type JsonSchema } from "../../views/config-form.shared.ts";
2
+
3
+ function coerceNumberString(value: string, integer: boolean): number | undefined | string {
4
+ const trimmed = value.trim();
5
+ if (trimmed === "") {
6
+ return undefined;
7
+ }
8
+ const parsed = Number(trimmed);
9
+ if (!Number.isFinite(parsed)) {
10
+ return value;
11
+ }
12
+ if (integer && !Number.isInteger(parsed)) {
13
+ return value;
14
+ }
15
+ return parsed;
16
+ }
17
+
18
+ function coerceBooleanString(value: string): boolean | string {
19
+ const trimmed = value.trim();
20
+ if (trimmed === "true") {
21
+ return true;
22
+ }
23
+ if (trimmed === "false") {
24
+ return false;
25
+ }
26
+ return value;
27
+ }
28
+
29
+ /**
30
+ * Walk a form value tree alongside its JSON Schema and coerce string values
31
+ * to their schema-defined types (number, boolean).
32
+ *
33
+ * HTML `<input>` elements always produce string `.value` properties. Even
34
+ * though the form rendering code converts values correctly for most paths,
35
+ * some interactions (map-field repopulation, re-renders, paste, etc.) can
36
+ * leak raw strings into the config form state. This utility acts as a
37
+ * safety net before serialization so that `config.set` always receives
38
+ * correctly typed JSON.
39
+ */
40
+ export function coerceFormValues(value: unknown, schema: JsonSchema): unknown {
41
+ if (value === null || value === undefined) {
42
+ return value;
43
+ }
44
+
45
+ if (schema.allOf && schema.allOf.length > 0) {
46
+ let next: unknown = value;
47
+ for (const segment of schema.allOf) {
48
+ next = coerceFormValues(next, segment);
49
+ }
50
+ return next;
51
+ }
52
+
53
+ const type = schemaType(schema);
54
+
55
+ // Handle anyOf/oneOf — try to match the value against a variant
56
+ if (schema.anyOf || schema.oneOf) {
57
+ const variants = (schema.anyOf ?? schema.oneOf ?? []).filter(
58
+ (v) => !(v.type === "null" || (Array.isArray(v.type) && v.type.includes("null"))),
59
+ );
60
+
61
+ if (variants.length === 1) {
62
+ return coerceFormValues(value, variants[0]);
63
+ }
64
+
65
+ // Try number/boolean coercion for string values
66
+ if (typeof value === "string") {
67
+ for (const variant of variants) {
68
+ const variantType = schemaType(variant);
69
+ if (variantType === "number" || variantType === "integer") {
70
+ const coerced = coerceNumberString(value, variantType === "integer");
71
+ if (coerced === undefined || typeof coerced === "number") {
72
+ return coerced;
73
+ }
74
+ }
75
+ if (variantType === "boolean") {
76
+ const coerced = coerceBooleanString(value);
77
+ if (typeof coerced === "boolean") {
78
+ return coerced;
79
+ }
80
+ }
81
+ }
82
+ }
83
+
84
+ // For non-string values (objects, arrays), try to recurse into matching variant
85
+ for (const variant of variants) {
86
+ const variantType = schemaType(variant);
87
+ if (variantType === "object" && typeof value === "object" && !Array.isArray(value)) {
88
+ return coerceFormValues(value, variant);
89
+ }
90
+ if (variantType === "array" && Array.isArray(value)) {
91
+ return coerceFormValues(value, variant);
92
+ }
93
+ }
94
+
95
+ return value;
96
+ }
97
+
98
+ if (type === "number" || type === "integer") {
99
+ if (typeof value === "string") {
100
+ const coerced = coerceNumberString(value, type === "integer");
101
+ if (coerced === undefined || typeof coerced === "number") {
102
+ return coerced;
103
+ }
104
+ }
105
+ return value;
106
+ }
107
+
108
+ if (type === "boolean") {
109
+ if (typeof value === "string") {
110
+ const coerced = coerceBooleanString(value);
111
+ if (typeof coerced === "boolean") {
112
+ return coerced;
113
+ }
114
+ }
115
+ return value;
116
+ }
117
+
118
+ if (type === "object") {
119
+ if (typeof value !== "object" || Array.isArray(value)) {
120
+ return value;
121
+ }
122
+ const obj = value as Record<string, unknown>;
123
+ const props = schema.properties ?? {};
124
+ const additional =
125
+ schema.additionalProperties && typeof schema.additionalProperties === "object"
126
+ ? schema.additionalProperties
127
+ : null;
128
+ const result: Record<string, unknown> = {};
129
+ for (const [key, val] of Object.entries(obj)) {
130
+ const propSchema = props[key] ?? additional;
131
+ const coerced = propSchema ? coerceFormValues(val, propSchema) : val;
132
+ // Omit undefined — "clear field = unset" for optional properties
133
+ if (coerced !== undefined) {
134
+ result[key] = coerced;
135
+ }
136
+ }
137
+ return result;
138
+ }
139
+
140
+ if (type === "array") {
141
+ if (!Array.isArray(value)) {
142
+ return value;
143
+ }
144
+ if (Array.isArray(schema.items)) {
145
+ // Tuple form: each index has its own schema
146
+ const tuple = schema.items;
147
+ return value.map((item, i) => {
148
+ const s = i < tuple.length ? tuple[i] : undefined;
149
+ return s ? coerceFormValues(item, s) : item;
150
+ });
151
+ }
152
+ const itemsSchema = schema.items;
153
+ if (!itemsSchema) {
154
+ return value;
155
+ }
156
+ return value.map((item) => coerceFormValues(item, itemsSchema)).filter((v) => v !== undefined);
157
+ }
158
+
159
+ return value;
160
+ }