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,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
+ }