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,502 @@
1
+ import { html } from "lit";
2
+ import {
3
+ listCoreToolSections,
4
+ PROFILE_OPTIONS as TOOL_PROFILE_OPTIONS,
5
+ } from "../../../../src/agents/tool-catalog.js";
6
+ import {
7
+ expandToolGroups,
8
+ normalizeToolName,
9
+ resolveToolProfilePolicy,
10
+ } from "../../../../src/agents/tool-policy-shared.js";
11
+ import type { AgentIdentityResult, AgentsFilesListResult, AgentsListResult } from "../types.ts";
12
+
13
+ export const TOOL_SECTIONS = listCoreToolSections();
14
+
15
+ export const PROFILE_OPTIONS = TOOL_PROFILE_OPTIONS;
16
+
17
+ type ToolPolicy = {
18
+ allow?: string[];
19
+ deny?: string[];
20
+ };
21
+
22
+ type AgentConfigEntry = {
23
+ id: string;
24
+ name?: string;
25
+ workspace?: string;
26
+ agentDir?: string;
27
+ model?: unknown;
28
+ skills?: string[];
29
+ tools?: {
30
+ profile?: string;
31
+ allow?: string[];
32
+ alsoAllow?: string[];
33
+ deny?: string[];
34
+ };
35
+ };
36
+
37
+ type ConfigSnapshot = {
38
+ agents?: {
39
+ defaults?: { workspace?: string; model?: unknown; models?: Record<string, { alias?: string }> };
40
+ list?: AgentConfigEntry[];
41
+ };
42
+ tools?: {
43
+ profile?: string;
44
+ allow?: string[];
45
+ alsoAllow?: string[];
46
+ deny?: string[];
47
+ };
48
+ };
49
+
50
+ export function normalizeAgentLabel(agent: {
51
+ id: string;
52
+ name?: string;
53
+ identity?: { name?: string };
54
+ }) {
55
+ return agent.name?.trim() || agent.identity?.name?.trim() || agent.id;
56
+ }
57
+
58
+ function isLikelyEmoji(value: string) {
59
+ const trimmed = value.trim();
60
+ if (!trimmed) {
61
+ return false;
62
+ }
63
+ if (trimmed.length > 16) {
64
+ return false;
65
+ }
66
+ let hasNonAscii = false;
67
+ for (let i = 0; i < trimmed.length; i += 1) {
68
+ if (trimmed.charCodeAt(i) > 127) {
69
+ hasNonAscii = true;
70
+ break;
71
+ }
72
+ }
73
+ if (!hasNonAscii) {
74
+ return false;
75
+ }
76
+ if (trimmed.includes("://") || trimmed.includes("/") || trimmed.includes(".")) {
77
+ return false;
78
+ }
79
+ return true;
80
+ }
81
+
82
+ export function resolveAgentEmoji(
83
+ agent: { identity?: { emoji?: string; avatar?: string } },
84
+ agentIdentity?: AgentIdentityResult | null,
85
+ ) {
86
+ const identityEmoji = agentIdentity?.emoji?.trim();
87
+ if (identityEmoji && isLikelyEmoji(identityEmoji)) {
88
+ return identityEmoji;
89
+ }
90
+ const agentEmoji = agent.identity?.emoji?.trim();
91
+ if (agentEmoji && isLikelyEmoji(agentEmoji)) {
92
+ return agentEmoji;
93
+ }
94
+ const identityAvatar = agentIdentity?.avatar?.trim();
95
+ if (identityAvatar && isLikelyEmoji(identityAvatar)) {
96
+ return identityAvatar;
97
+ }
98
+ const avatar = agent.identity?.avatar?.trim();
99
+ if (avatar && isLikelyEmoji(avatar)) {
100
+ return avatar;
101
+ }
102
+ return "";
103
+ }
104
+
105
+ export function agentBadgeText(agentId: string, defaultId: string | null) {
106
+ return defaultId && agentId === defaultId ? "default" : null;
107
+ }
108
+
109
+ export function formatBytes(bytes?: number) {
110
+ if (bytes == null || !Number.isFinite(bytes)) {
111
+ return "-";
112
+ }
113
+ if (bytes < 1024) {
114
+ return `${bytes} B`;
115
+ }
116
+ const units = ["KB", "MB", "GB", "TB"];
117
+ let size = bytes / 1024;
118
+ let unitIndex = 0;
119
+ while (size >= 1024 && unitIndex < units.length - 1) {
120
+ size /= 1024;
121
+ unitIndex += 1;
122
+ }
123
+ return `${size.toFixed(size < 10 ? 1 : 0)} ${units[unitIndex]}`;
124
+ }
125
+
126
+ export function resolveAgentConfig(config: Record<string, unknown> | null, agentId: string) {
127
+ const cfg = config as ConfigSnapshot | null;
128
+ const list = cfg?.agents?.list ?? [];
129
+ const entry = list.find((agent) => agent?.id === agentId);
130
+ return {
131
+ entry,
132
+ defaults: cfg?.agents?.defaults,
133
+ globalTools: cfg?.tools,
134
+ };
135
+ }
136
+
137
+ export type AgentContext = {
138
+ workspace: string;
139
+ model: string;
140
+ identityName: string;
141
+ identityEmoji: string;
142
+ skillsLabel: string;
143
+ isDefault: boolean;
144
+ };
145
+
146
+ export function buildAgentContext(
147
+ agent: AgentsListResult["agents"][number],
148
+ configForm: Record<string, unknown> | null,
149
+ agentFilesList: AgentsFilesListResult | null,
150
+ defaultId: string | null,
151
+ agentIdentity?: AgentIdentityResult | null,
152
+ ): AgentContext {
153
+ const config = resolveAgentConfig(configForm, agent.id);
154
+ const workspaceFromFiles =
155
+ agentFilesList && agentFilesList.agentId === agent.id ? agentFilesList.workspace : null;
156
+ const workspace =
157
+ workspaceFromFiles || config.entry?.workspace || config.defaults?.workspace || "default";
158
+ const modelLabel = config.entry?.model
159
+ ? resolveModelLabel(config.entry?.model)
160
+ : resolveModelLabel(config.defaults?.model);
161
+ const identityName =
162
+ agentIdentity?.name?.trim() ||
163
+ agent.identity?.name?.trim() ||
164
+ agent.name?.trim() ||
165
+ config.entry?.name ||
166
+ agent.id;
167
+ const identityEmoji = resolveAgentEmoji(agent, agentIdentity) || "-";
168
+ const skillFilter = Array.isArray(config.entry?.skills) ? config.entry?.skills : null;
169
+ const skillCount = skillFilter?.length ?? null;
170
+ return {
171
+ workspace,
172
+ model: modelLabel,
173
+ identityName,
174
+ identityEmoji,
175
+ skillsLabel: skillFilter ? `${skillCount} selected` : "all skills",
176
+ isDefault: Boolean(defaultId && agent.id === defaultId),
177
+ };
178
+ }
179
+
180
+ export function resolveModelLabel(model?: unknown): string {
181
+ if (!model) {
182
+ return "-";
183
+ }
184
+ if (typeof model === "string") {
185
+ return model.trim() || "-";
186
+ }
187
+ if (typeof model === "object" && model) {
188
+ const record = model as { primary?: string; fallbacks?: string[] };
189
+ const primary = record.primary?.trim();
190
+ if (primary) {
191
+ const fallbackCount = Array.isArray(record.fallbacks) ? record.fallbacks.length : 0;
192
+ return fallbackCount > 0 ? `${primary} (+${fallbackCount} fallback)` : primary;
193
+ }
194
+ }
195
+ return "-";
196
+ }
197
+
198
+ export function normalizeModelValue(label: string): string {
199
+ const match = label.match(/^(.+) \(\+\d+ fallback\)$/);
200
+ return match ? match[1] : label;
201
+ }
202
+
203
+ export function resolveModelPrimary(model?: unknown): string | null {
204
+ if (!model) {
205
+ return null;
206
+ }
207
+ if (typeof model === "string") {
208
+ const trimmed = model.trim();
209
+ return trimmed || null;
210
+ }
211
+ if (typeof model === "object" && model) {
212
+ const record = model as Record<string, unknown>;
213
+ const candidate =
214
+ typeof record.primary === "string"
215
+ ? record.primary
216
+ : typeof record.model === "string"
217
+ ? record.model
218
+ : typeof record.id === "string"
219
+ ? record.id
220
+ : typeof record.value === "string"
221
+ ? record.value
222
+ : null;
223
+ const primary = candidate?.trim();
224
+ return primary || null;
225
+ }
226
+ return null;
227
+ }
228
+
229
+ export function resolveModelFallbacks(model?: unknown): string[] | null {
230
+ if (!model || typeof model === "string") {
231
+ return null;
232
+ }
233
+ if (typeof model === "object" && model) {
234
+ const record = model as Record<string, unknown>;
235
+ const fallbacks = Array.isArray(record.fallbacks)
236
+ ? record.fallbacks
237
+ : Array.isArray(record.fallback)
238
+ ? record.fallback
239
+ : null;
240
+ return fallbacks
241
+ ? fallbacks.filter((entry): entry is string => typeof entry === "string")
242
+ : null;
243
+ }
244
+ return null;
245
+ }
246
+
247
+ export function resolveEffectiveModelFallbacks(
248
+ entryModel?: unknown,
249
+ defaultModel?: unknown,
250
+ ): string[] | null {
251
+ return resolveModelFallbacks(entryModel) ?? resolveModelFallbacks(defaultModel);
252
+ }
253
+
254
+ function addModelId(target: Set<string>, value: unknown) {
255
+ if (typeof value !== "string") {
256
+ return;
257
+ }
258
+ const trimmed = value.trim();
259
+ if (!trimmed) {
260
+ return;
261
+ }
262
+ target.add(trimmed);
263
+ }
264
+
265
+ function addModelConfigIds(target: Set<string>, modelConfig: unknown) {
266
+ if (!modelConfig) {
267
+ return;
268
+ }
269
+ if (typeof modelConfig === "string") {
270
+ addModelId(target, modelConfig);
271
+ return;
272
+ }
273
+ if (typeof modelConfig !== "object") {
274
+ return;
275
+ }
276
+ const record = modelConfig as Record<string, unknown>;
277
+ addModelId(target, record.primary);
278
+ addModelId(target, record.model);
279
+ addModelId(target, record.id);
280
+ addModelId(target, record.value);
281
+ const fallbacks = Array.isArray(record.fallbacks)
282
+ ? record.fallbacks
283
+ : Array.isArray(record.fallback)
284
+ ? record.fallback
285
+ : [];
286
+ for (const fallback of fallbacks) {
287
+ addModelId(target, fallback);
288
+ }
289
+ }
290
+
291
+ export function sortLocaleStrings(values: Iterable<string>): string[] {
292
+ const sorted = Array.from(values);
293
+ const buffer = Array.from({ length: sorted.length }, () => "");
294
+
295
+ const merge = (left: number, middle: number, right: number): void => {
296
+ let i = left;
297
+ let j = middle;
298
+ let k = left;
299
+ while (i < middle && j < right) {
300
+ buffer[k++] = sorted[i].localeCompare(sorted[j]) <= 0 ? sorted[i++] : sorted[j++];
301
+ }
302
+ while (i < middle) {
303
+ buffer[k++] = sorted[i++];
304
+ }
305
+ while (j < right) {
306
+ buffer[k++] = sorted[j++];
307
+ }
308
+ for (let idx = left; idx < right; idx += 1) {
309
+ sorted[idx] = buffer[idx];
310
+ }
311
+ };
312
+
313
+ const sortRange = (left: number, right: number): void => {
314
+ if (right - left <= 1) {
315
+ return;
316
+ }
317
+
318
+ const middle = (left + right) >>> 1;
319
+ sortRange(left, middle);
320
+ sortRange(middle, right);
321
+ merge(left, middle, right);
322
+ };
323
+
324
+ sortRange(0, sorted.length);
325
+ return sorted;
326
+ }
327
+
328
+ export function resolveConfiguredCronModelSuggestions(
329
+ configForm: Record<string, unknown> | null,
330
+ ): string[] {
331
+ if (!configForm || typeof configForm !== "object") {
332
+ return [];
333
+ }
334
+ const agents = (configForm as { agents?: unknown }).agents;
335
+ if (!agents || typeof agents !== "object") {
336
+ return [];
337
+ }
338
+ const out = new Set<string>();
339
+ const defaults = (agents as { defaults?: unknown }).defaults;
340
+ if (defaults && typeof defaults === "object") {
341
+ const defaultsRecord = defaults as Record<string, unknown>;
342
+ addModelConfigIds(out, defaultsRecord.model);
343
+ const defaultsModels = defaultsRecord.models;
344
+ if (defaultsModels && typeof defaultsModels === "object") {
345
+ for (const modelId of Object.keys(defaultsModels as Record<string, unknown>)) {
346
+ addModelId(out, modelId);
347
+ }
348
+ }
349
+ }
350
+ const list = (agents as { list?: unknown }).list;
351
+ if (list && typeof list === "object") {
352
+ for (const entry of Object.values(list as Record<string, unknown>)) {
353
+ if (!entry || typeof entry !== "object") {
354
+ continue;
355
+ }
356
+ addModelConfigIds(out, (entry as Record<string, unknown>).model);
357
+ }
358
+ }
359
+ return sortLocaleStrings(out);
360
+ }
361
+
362
+ export function parseFallbackList(value: string): string[] {
363
+ return value
364
+ .split(",")
365
+ .map((entry) => entry.trim())
366
+ .filter(Boolean);
367
+ }
368
+
369
+ type ConfiguredModelOption = {
370
+ value: string;
371
+ label: string;
372
+ };
373
+
374
+ function resolveConfiguredModels(
375
+ configForm: Record<string, unknown> | null,
376
+ ): ConfiguredModelOption[] {
377
+ const cfg = configForm as ConfigSnapshot | null;
378
+ const models = cfg?.agents?.defaults?.models;
379
+ if (!models || typeof models !== "object") {
380
+ return [];
381
+ }
382
+ const options: ConfiguredModelOption[] = [];
383
+ for (const [modelId, modelRaw] of Object.entries(models)) {
384
+ const trimmed = modelId.trim();
385
+ if (!trimmed) {
386
+ continue;
387
+ }
388
+ const alias =
389
+ modelRaw && typeof modelRaw === "object" && "alias" in modelRaw
390
+ ? typeof (modelRaw as { alias?: unknown }).alias === "string"
391
+ ? (modelRaw as { alias?: string }).alias?.trim()
392
+ : undefined
393
+ : undefined;
394
+ const label = alias && alias !== trimmed ? `${alias} (${trimmed})` : trimmed;
395
+ options.push({ value: trimmed, label });
396
+ }
397
+ return options;
398
+ }
399
+
400
+ export function buildModelOptions(
401
+ configForm: Record<string, unknown> | null,
402
+ current?: string | null,
403
+ ) {
404
+ const options = resolveConfiguredModels(configForm);
405
+ const hasCurrent = current ? options.some((option) => option.value === current) : false;
406
+ if (current && !hasCurrent) {
407
+ options.unshift({ value: current, label: `Current (${current})` });
408
+ }
409
+ if (options.length === 0) {
410
+ return html`
411
+ <option value="" disabled>No configured models</option>
412
+ `;
413
+ }
414
+ return options.map((option) => html`<option value=${option.value}>${option.label}</option>`);
415
+ }
416
+
417
+ type CompiledPattern =
418
+ | { kind: "all" }
419
+ | { kind: "exact"; value: string }
420
+ | { kind: "regex"; value: RegExp };
421
+
422
+ function compilePattern(pattern: string): CompiledPattern {
423
+ const normalized = normalizeToolName(pattern);
424
+ if (!normalized) {
425
+ return { kind: "exact", value: "" };
426
+ }
427
+ if (normalized === "*") {
428
+ return { kind: "all" };
429
+ }
430
+ if (!normalized.includes("*")) {
431
+ return { kind: "exact", value: normalized };
432
+ }
433
+ const escaped = normalized.replace(/[.*+?^${}()|[\\]\\]/g, "\\$&");
434
+ return { kind: "regex", value: new RegExp(`^${escaped.replaceAll("\\*", ".*")}$`) };
435
+ }
436
+
437
+ function compilePatterns(patterns?: string[]): CompiledPattern[] {
438
+ if (!Array.isArray(patterns)) {
439
+ return [];
440
+ }
441
+ return expandToolGroups(patterns)
442
+ .map(compilePattern)
443
+ .filter((pattern) => {
444
+ return pattern.kind !== "exact" || pattern.value.length > 0;
445
+ });
446
+ }
447
+
448
+ function matchesAny(name: string, patterns: CompiledPattern[]) {
449
+ for (const pattern of patterns) {
450
+ if (pattern.kind === "all") {
451
+ return true;
452
+ }
453
+ if (pattern.kind === "exact" && name === pattern.value) {
454
+ return true;
455
+ }
456
+ if (pattern.kind === "regex" && pattern.value.test(name)) {
457
+ return true;
458
+ }
459
+ }
460
+ return false;
461
+ }
462
+
463
+ export function isAllowedByPolicy(name: string, policy?: ToolPolicy) {
464
+ if (!policy) {
465
+ return true;
466
+ }
467
+ const normalized = normalizeToolName(name);
468
+ const deny = compilePatterns(policy.deny);
469
+ if (matchesAny(normalized, deny)) {
470
+ return false;
471
+ }
472
+ const allow = compilePatterns(policy.allow);
473
+ if (allow.length === 0) {
474
+ return true;
475
+ }
476
+ if (matchesAny(normalized, allow)) {
477
+ return true;
478
+ }
479
+ if (normalized === "apply_patch" && matchesAny("exec", allow)) {
480
+ return true;
481
+ }
482
+ return false;
483
+ }
484
+
485
+ export function matchesList(name: string, list?: string[]) {
486
+ if (!Array.isArray(list) || list.length === 0) {
487
+ return false;
488
+ }
489
+ const normalized = normalizeToolName(name);
490
+ const patterns = compilePatterns(list);
491
+ if (matchesAny(normalized, patterns)) {
492
+ return true;
493
+ }
494
+ if (normalized === "apply_patch" && matchesAny("exec", patterns)) {
495
+ return true;
496
+ }
497
+ return false;
498
+ }
499
+
500
+ export function resolveToolProfile(profile: string) {
501
+ return resolveToolProfilePolicy(profile) ?? undefined;
502
+ }