shadow-claw 1.54.0 → 1.55.0

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 (286) hide show
  1. package/.well-known/mcp/server-card.json +1 -1
  2. package/.well-known/mcp.json +1 -1
  3. package/README.md +1 -1
  4. package/dist/cli/build/build.js +1 -1
  5. package/dist/cli/{chunk-DO2t9bUI.js → chunk--IuVyWfT.js} +24 -23
  6. package/dist/cli/{chunk-2ZYd9gYC.js → chunk--JpdI-Ht.js} +1 -1
  7. package/dist/cli/{chunk-m4Ineemy.js → chunk-4O8yrQuN.js} +1 -1
  8. package/dist/cli/{chunk-BiH9IXnQ.js → chunk-7S9Ywlfy.js} +1 -1
  9. package/dist/cli/{chunk-BmMOdYvk.js → chunk-B0SqqDSK.js} +1 -1
  10. package/dist/cli/chunk-BNaWaEm-.js +1 -0
  11. package/dist/cli/chunk-BXCsxO9e.js +1 -0
  12. package/dist/cli/chunk-Bq37qDoZ.js +18 -0
  13. package/dist/cli/{chunk-C1htf-nO.js → chunk-BrEeCKIo.js} +2 -2
  14. package/dist/cli/{chunk-BI1SOTM1.js → chunk-Bu3ylrhT.js} +8 -8
  15. package/dist/cli/{chunk-3smiGQoQ.js → chunk-C1v_s0Kb.js} +1 -1
  16. package/dist/cli/{chunk-DGeysxz3.js → chunk-C44G533y.js} +1 -1
  17. package/dist/cli/{chunk-9KiBalKu.js → chunk-C7hJLmsL.js} +1 -1
  18. package/dist/cli/{chunk-BFv9XSNd.js → chunk-CAaQWd6t.js} +1 -1
  19. package/dist/cli/chunk-CIkgn5Fh.js +1 -0
  20. package/dist/cli/chunk-CWEIN2kc.js +1 -0
  21. package/dist/cli/{chunk-BDeDZ-0L.js → chunk-CYg1lO1a.js} +1 -1
  22. package/dist/cli/{chunk-DXLmEQ3i.js → chunk-Ce09lwXT.js} +1 -1
  23. package/dist/cli/{chunk-XsfHeN4m.js → chunk-CpdqRSO-.js} +1 -1
  24. package/dist/cli/chunk-DB4x5L-B.js +1 -0
  25. package/dist/cli/{chunk-DaNyMqrk.js → chunk-DBvObsBQ.js} +1 -1
  26. package/dist/cli/chunk-DGPpt7Ka.js +1 -0
  27. package/dist/cli/chunk-DGagHluH.js +1 -0
  28. package/dist/cli/chunk-DUIs23D9.js +1 -0
  29. package/dist/cli/{chunk-CyvfQV16.js → chunk-DaurYOqg.js} +1 -1
  30. package/dist/cli/{chunk-DSFrcSyA.js → chunk-DfwRL0Ue.js} +1 -1
  31. package/dist/cli/{chunk-M2tZrzY5.js → chunk-DudYQk0p.js} +1 -1
  32. package/dist/cli/chunk-DvKo50Tp.js +2 -0
  33. package/dist/cli/{chunk-H_Mw5ypp.js → chunk-Dvrqte5Q.js} +2 -2
  34. package/dist/cli/{chunk-BtNO-m9T.js → chunk-DzhSExU0.js} +1 -1
  35. package/dist/cli/{chunk-IOMO88kZ.js → chunk-ENKlt3i9.js} +1 -1
  36. package/dist/cli/{chunk-Bspgzwsm.js → chunk-FWRwAX75.js} +8 -8
  37. package/dist/cli/chunk-Lf-Z-h48.js +32 -0
  38. package/dist/cli/{chunk-BucXnZ4Z.js → chunk-VRfkSLrD.js} +1 -1
  39. package/dist/cli/chunk-uaTxD024.js +1 -0
  40. package/dist/cli/cli.js +1 -1
  41. package/dist/cli/prerender/dsd-shell/prerender-dsd-shell.js +1 -1
  42. package/dist/headless-agent.js +2 -2
  43. package/dist/lib/components/index.js +25 -25
  44. package/dist/lib/components/settings/shadow-claw-accounts.js +1 -1
  45. package/dist/lib/components/settings/shadow-claw-channel-config.js +1 -1
  46. package/dist/lib/components/settings/shadow-claw-control-plane.js +1 -1
  47. package/dist/lib/components/settings/shadow-claw-git.js +1 -1
  48. package/dist/lib/components/settings/shadow-claw-integrations.js +1 -1
  49. package/dist/lib/components/settings/shadow-claw-llm.js +1 -1
  50. package/dist/lib/components/settings/shadow-claw-mcp-remote.js +1 -1
  51. package/dist/lib/components/settings/shadow-claw-networking.js +1 -1
  52. package/dist/lib/components/settings/shadow-claw-notifications.js +1 -1
  53. package/dist/lib/components/settings/shadow-claw-peerjs.js +1 -1
  54. package/dist/lib/components/settings/shadow-claw-storage.js +1 -1
  55. package/dist/lib/components/settings/shadow-claw-task-server.js +1 -1
  56. package/dist/lib/components/settings/shadow-claw-webvm.js +1 -1
  57. package/dist/lib/components/shadow-claw/utils/get-route.d.ts +3 -0
  58. package/dist/lib/components/shadow-claw/utils/sync-slotted-sidebar-active-links.d.ts +1 -1
  59. package/dist/lib/components/shadow-claw-accounts.js +1 -1
  60. package/dist/lib/components/shadow-claw-channel-config.js +1 -1
  61. package/dist/lib/components/shadow-claw-channels.js +1 -1
  62. package/dist/lib/components/shadow-claw-chat.js +1 -1
  63. package/dist/lib/components/shadow-claw-control-plane.js +1 -1
  64. package/dist/lib/components/shadow-claw-conversations.js +1 -1
  65. package/dist/lib/components/shadow-claw-file-viewer.js +1 -1
  66. package/dist/lib/components/shadow-claw-files.js +1 -1
  67. package/dist/lib/components/shadow-claw-git.js +1 -1
  68. package/dist/lib/components/shadow-claw-integrations.js +1 -1
  69. package/dist/lib/components/shadow-claw-llm.js +1 -1
  70. package/dist/lib/components/shadow-claw-mcp-remote.js +1 -1
  71. package/dist/lib/components/shadow-claw-networking.js +1 -1
  72. package/dist/lib/components/shadow-claw-notifications.js +1 -1
  73. package/dist/lib/components/shadow-claw-page-header.js +1 -1
  74. package/dist/lib/components/shadow-claw-pages.js +1 -1
  75. package/dist/lib/components/shadow-claw-peerjs.js +1 -1
  76. package/dist/lib/components/shadow-claw-settings.js +1 -1
  77. package/dist/lib/components/shadow-claw-storage.js +1 -1
  78. package/dist/lib/components/shadow-claw-task-server.js +1 -1
  79. package/dist/lib/components/shadow-claw-tasks.js +1 -1
  80. package/dist/lib/components/shadow-claw-terminal.js +1 -1
  81. package/dist/lib/components/shadow-claw-tools.js +1 -1
  82. package/dist/lib/components/shadow-claw-webvm.js +1 -1
  83. package/dist/lib/components/shadow-claw.js +1 -1
  84. package/dist/lib/{configure-peer-js-D5jDCtLx.js → configure-peer-js-C9554Slv.js} +2 -2
  85. package/dist/lib/{configure-peer-js-D5jDCtLx.js.map → configure-peer-js-C9554Slv.js.map} +1 -1
  86. package/dist/lib/{file-viewer-B4CL4e0i.js → file-viewer-DBc5dxNy.js} +2 -2
  87. package/dist/lib/{file-viewer-B4CL4e0i.js.map → file-viewer-DBc5dxNy.js.map} +1 -1
  88. package/dist/lib/index.js +28 -27
  89. package/dist/lib/{init-control-plane-l2uFnhGV.js → init-control-plane-D-41Fm5q.js} +12 -12
  90. package/dist/lib/{init-control-plane-l2uFnhGV.js.map → init-control-plane-D-41Fm5q.js.map} +1 -1
  91. package/dist/lib/{markdown-0_p_zfxL.js → markdown-KnDWzWJJ.js} +2 -2
  92. package/dist/lib/{markdown-0_p_zfxL.js.map → markdown-KnDWzWJJ.js.map} +1 -1
  93. package/dist/lib/{orchestrator-D6wm8Sec.js → orchestrator-BEZcqgR5.js} +9 -9
  94. package/dist/lib/{orchestrator-D6wm8Sec.js.map → orchestrator-BEZcqgR5.js.map} +1 -1
  95. package/dist/lib/{orchestrator-Dh-hnIpK.js → orchestrator-Cda13e5U.js} +4 -4
  96. package/dist/lib/{orchestrator-Dh-hnIpK.js.map → orchestrator-Cda13e5U.js.map} +1 -1
  97. package/dist/lib/{peerjs-BWZnsD0B.js → peerjs-DYkUTcee.js} +5 -5
  98. package/dist/lib/{peerjs-BWZnsD0B.js.map → peerjs-DYkUTcee.js.map} +1 -1
  99. package/dist/lib/{push-client-MybDfOdi.js → push-client-CQtCFDaD.js} +3 -3
  100. package/dist/lib/{push-client-MybDfOdi.js.map → push-client-CQtCFDaD.js.map} +1 -1
  101. package/dist/lib/security/custom-element-security.d.ts +8 -4
  102. package/dist/lib/{shadow-claw-PdOpgTxH.js → shadow-claw-DYe9u6Tp.js} +142 -33
  103. package/dist/lib/shadow-claw-DYe9u6Tp.js.map +1 -0
  104. package/dist/lib/{shadow-claw-accounts-3bR76EOb.js → shadow-claw-accounts-D2URoHys.js} +2 -2
  105. package/dist/lib/{shadow-claw-accounts-3bR76EOb.js.map → shadow-claw-accounts-D2URoHys.js.map} +1 -1
  106. package/dist/lib/{shadow-claw-channel-config-ChdZ1iB8.js → shadow-claw-channel-config-buXoz2xv.js} +3 -3
  107. package/dist/lib/{shadow-claw-channel-config-ChdZ1iB8.js.map → shadow-claw-channel-config-buXoz2xv.js.map} +1 -1
  108. package/dist/lib/{shadow-claw-channels-CK9sc7h_.js → shadow-claw-channels-5yVJ1gLk.js} +3 -3
  109. package/dist/lib/{shadow-claw-channels-CK9sc7h_.js.map → shadow-claw-channels-5yVJ1gLk.js.map} +1 -1
  110. package/dist/lib/{shadow-claw-chat-B6uuZnJ7.js → shadow-claw-chat-CVc-7ycM.js} +7 -7
  111. package/dist/lib/{shadow-claw-chat-B6uuZnJ7.js.map → shadow-claw-chat-CVc-7ycM.js.map} +1 -1
  112. package/dist/lib/{shadow-claw-control-plane-BpRcl312.js → shadow-claw-control-plane-B5vsF91B.js} +6 -6
  113. package/dist/lib/{shadow-claw-control-plane-BpRcl312.js.map → shadow-claw-control-plane-B5vsF91B.js.map} +1 -1
  114. package/dist/lib/{shadow-claw-conversations-Dc_Xk2mB.js → shadow-claw-conversations-PGK5zqn3.js} +54 -12
  115. package/dist/lib/{shadow-claw-conversations-Dc_Xk2mB.js.map → shadow-claw-conversations-PGK5zqn3.js.map} +1 -1
  116. package/dist/lib/{shadow-claw-file-viewer-C4x1PtB2.js → shadow-claw-file-viewer-DSqn0hgx.js} +6 -6
  117. package/dist/lib/{shadow-claw-file-viewer-C4x1PtB2.js.map → shadow-claw-file-viewer-DSqn0hgx.js.map} +1 -1
  118. package/dist/lib/{shadow-claw-files-DhnHbXKf.js → shadow-claw-files-vOa9ZWbr.js} +6 -6
  119. package/dist/lib/{shadow-claw-files-DhnHbXKf.js.map → shadow-claw-files-vOa9ZWbr.js.map} +1 -1
  120. package/dist/lib/{shadow-claw-git-BeQ1ElUd.js → shadow-claw-git-D54Z85Bj.js} +4 -4
  121. package/dist/lib/{shadow-claw-git-BeQ1ElUd.js.map → shadow-claw-git-D54Z85Bj.js.map} +1 -1
  122. package/dist/lib/{shadow-claw-integrations-Bbdolk3w.js → shadow-claw-integrations-BTubMH9d.js} +2 -2
  123. package/dist/lib/{shadow-claw-integrations-Bbdolk3w.js.map → shadow-claw-integrations-BTubMH9d.js.map} +1 -1
  124. package/dist/lib/{shadow-claw-llm-DPda4L3C.js → shadow-claw-llm-8koGTNYs.js} +3 -3
  125. package/dist/lib/{shadow-claw-llm-DPda4L3C.js.map → shadow-claw-llm-8koGTNYs.js.map} +1 -1
  126. package/dist/lib/{shadow-claw-mcp-remote-Dn9c30WI.js → shadow-claw-mcp-remote-C2jwBsQt.js} +2 -2
  127. package/dist/lib/{shadow-claw-mcp-remote-Dn9c30WI.js.map → shadow-claw-mcp-remote-C2jwBsQt.js.map} +1 -1
  128. package/dist/lib/{shadow-claw-networking-zqNuyn3-.js → shadow-claw-networking-BV-rna16.js} +2 -2
  129. package/dist/lib/{shadow-claw-networking-zqNuyn3-.js.map → shadow-claw-networking-BV-rna16.js.map} +1 -1
  130. package/dist/lib/{shadow-claw-notifications-DFgdo33v.js → shadow-claw-notifications-Dku7VBLk.js} +2 -2
  131. package/dist/lib/{shadow-claw-notifications-DFgdo33v.js.map → shadow-claw-notifications-Dku7VBLk.js.map} +1 -1
  132. package/dist/lib/{shadow-claw-page-header-B7LFGQRf.js → shadow-claw-page-header-VPjYWfsT.js} +2 -2
  133. package/dist/lib/{shadow-claw-page-header-B7LFGQRf.js.map → shadow-claw-page-header-VPjYWfsT.js.map} +1 -1
  134. package/dist/lib/{shadow-claw-pages-DLspFqdK.js → shadow-claw-pages-DXrM6hgZ.js} +29 -19
  135. package/dist/lib/shadow-claw-pages-DXrM6hgZ.js.map +1 -0
  136. package/dist/lib/{shadow-claw-peerjs-D8xWwuWR.js → shadow-claw-peerjs-D3xonez5.js} +3 -3
  137. package/dist/lib/{shadow-claw-peerjs-D8xWwuWR.js.map → shadow-claw-peerjs-D3xonez5.js.map} +1 -1
  138. package/dist/lib/{shadow-claw-settings-NbvzXASD.js → shadow-claw-settings-DMTx6OS9.js} +5 -5
  139. package/dist/lib/{shadow-claw-settings-NbvzXASD.js.map → shadow-claw-settings-DMTx6OS9.js.map} +1 -1
  140. package/dist/lib/{shadow-claw-storage-B_NAoZmd.js → shadow-claw-storage-BJLnukxa.js} +3 -3
  141. package/dist/lib/{shadow-claw-storage-B_NAoZmd.js.map → shadow-claw-storage-BJLnukxa.js.map} +1 -1
  142. package/dist/lib/{shadow-claw-task-server-BaQJXhYJ.js → shadow-claw-task-server-DcMj20hD.js} +2 -2
  143. package/dist/lib/{shadow-claw-task-server-BaQJXhYJ.js.map → shadow-claw-task-server-DcMj20hD.js.map} +1 -1
  144. package/dist/lib/{shadow-claw-tasks-CAZua0-j.js → shadow-claw-tasks-BQBe4lVi.js} +7 -7
  145. package/dist/lib/{shadow-claw-tasks-CAZua0-j.js.map → shadow-claw-tasks-BQBe4lVi.js.map} +1 -1
  146. package/dist/lib/{shadow-claw-terminal-B2YJhkJL.js → shadow-claw-terminal-DPEzTxXv.js} +2 -2
  147. package/dist/lib/{shadow-claw-terminal-B2YJhkJL.js.map → shadow-claw-terminal-DPEzTxXv.js.map} +1 -1
  148. package/dist/lib/{shadow-claw-tools-CkZWxxTm.js → shadow-claw-tools-BCnU8FaK.js} +6 -6
  149. package/dist/lib/{shadow-claw-tools-CkZWxxTm.js.map → shadow-claw-tools-BCnU8FaK.js.map} +1 -1
  150. package/dist/lib/{shadow-claw-webvm-BL9cgrP9.js → shadow-claw-webvm-CnW-hoJ8.js} +2 -2
  151. package/dist/lib/{shadow-claw-webvm-BL9cgrP9.js.map → shadow-claw-webvm-CnW-hoJ8.js.map} +1 -1
  152. package/dist/lib/subsystems/mcp/webmcp.d.ts +15 -2
  153. package/dist/lib/{sync-web-mcp-registration-dW2MVCj4.js → sync-web-mcp-registration-DwpGjVdo.js} +10 -4
  154. package/dist/lib/sync-web-mcp-registration-DwpGjVdo.js.map +1 -0
  155. package/dist/lib/{tools-D7whby3H.js → tools-CP6G0HF7.js} +5 -6
  156. package/dist/lib/tools-CP6G0HF7.js.map +1 -0
  157. package/dist/lib/{trusted-types-d0cdkut_.js → trusted-types-0cu5Dm6M.js} +29 -4
  158. package/dist/lib/{trusted-types-d0cdkut_.js.map → trusted-types-0cu5Dm6M.js.map} +1 -1
  159. package/dist/lib/utils/index.d.ts +1 -0
  160. package/dist/lib/utils/index.js +4 -2
  161. package/dist/lib/utils/index.js.map +1 -1
  162. package/dist/lib/utils/resolve-page-script-dependencies.d.ts +19 -0
  163. package/dist/lib/utils/resolve-page-script-dependencies.js +98 -0
  164. package/dist/lib/utils/resolve-page-script-dependencies.js.map +1 -0
  165. package/dist/lib/utils/utils.js +1 -1
  166. package/dist/lib/webmcp-Bf9rT7uu.js +2001 -0
  167. package/dist/lib/webmcp-Bf9rT7uu.js.map +1 -0
  168. package/dist/public/.well-known/mcp/server-card.json +1 -1
  169. package/dist/public/.well-known/mcp.json +1 -1
  170. package/dist/public/AGENTS.md +3 -3
  171. package/dist/public/README.md +1 -1
  172. package/dist/public/agent.worker.js +2 -2
  173. package/dist/public/components/shadow-claw/shadow-claw.css +1 -1
  174. package/dist/public/components/shadow-claw/shadow-claw.html +1 -1
  175. package/dist/public/components/shadow-claw-conversations/shadow-claw-conversations.css +1 -1
  176. package/dist/public/components/shadow-claw-conversations/shadow-claw-conversations.html +1 -1
  177. package/dist/public/{configure-peer-js-WLRM7Qa7.js → configure-peer-js-OYl3V8sW.js} +1 -1
  178. package/dist/public/{custom-element-security-Cl991z-x.js → custom-element-security-BR4V40j4.js} +1 -1
  179. package/dist/public/docs/example/article/index.html +3 -3
  180. package/dist/public/docs/example/article.html +3 -3
  181. package/dist/public/docs/publishing/index.html +3 -3
  182. package/dist/public/docs/publishing.html +3 -3
  183. package/dist/public/docs/skill-creator/index.html +3 -3
  184. package/dist/public/docs/skill-creator.html +3 -3
  185. package/dist/public/docs/subsystems/custom-element-security.md +19 -5
  186. package/dist/public/docs/subsystems/pages.md +10 -2
  187. package/dist/public/docs/subsystems/tools.md +1 -2
  188. package/dist/public/docs/subsystems/webmcp.md +41 -6
  189. package/dist/public/{download-group-file-fFjoIIp4.js → download-group-file-BNmK8wac.js} +1 -1
  190. package/dist/public/e2e/README.md +2 -2
  191. package/dist/public/{e2e-bridge-CiSfBRT4.js → e2e-bridge-4phD1JUQ.js} +1 -1
  192. package/dist/public/{file-viewer-DFC3kfeO.js → file-viewer-Dbh3K9nL.js} +1 -1
  193. package/dist/public/index.html +3 -3
  194. package/dist/public/index.js +1 -1
  195. package/dist/public/{init-control-plane-BEbcwmmv.js → init-control-plane-DGOY_RNS.js} +1 -1
  196. package/dist/public/llms.txt +1 -1
  197. package/dist/public/main/index.html +3 -3
  198. package/dist/public/main/memory/index.html +3 -3
  199. package/dist/public/main/memory.html +3 -3
  200. package/dist/public/main.html +3 -3
  201. package/dist/public/{markdown-BeglYzw9.js → markdown-BPZYpfGm.js} +1 -1
  202. package/dist/public/{orchestrator-BlvEG3PO.js → orchestrator-OoUK7CF9.js} +1 -1
  203. package/dist/public/{orchestrator-DTNrntd4.js → orchestrator-a9047bGu.js} +1 -1
  204. package/dist/public/{peerjs-CnBdK94R.js → peerjs-Cbn310Tz.js} +1 -1
  205. package/dist/public/{push-client-DOHbdCyj.js → push-client-Dy4LGJy9.js} +1 -1
  206. package/dist/public/service-worker.js +1 -1
  207. package/dist/public/shadow-claw-B-HWC1uN.js +1180 -0
  208. package/dist/public/{shadow-claw-accounts-C6FXVw2K.js → shadow-claw-accounts-Di-anCZ1.js} +1 -1
  209. package/dist/public/{shadow-claw-channels-tr_r60Kq.js → shadow-claw-channels-RVwCE8pE.js} +1 -1
  210. package/dist/public/{shadow-claw-chat-BAAPhAOs.js → shadow-claw-chat-DI1q8UnX.js} +1 -1
  211. package/dist/public/{shadow-claw-control-plane-C_5VIx8E.js → shadow-claw-control-plane-KXEdLOGl.js} +2 -2
  212. package/dist/public/{shadow-claw-conversations-DGYZdDa3.js → shadow-claw-conversations-BCBGtS30.js} +40 -6
  213. package/dist/public/{shadow-claw-file-viewer-5j2-Z3fN.js → shadow-claw-file-viewer-CW3t6j-w.js} +1 -1
  214. package/dist/public/{shadow-claw-files-DKF4Yy0m.js → shadow-claw-files-JQ-o0ImX.js} +1 -1
  215. package/dist/public/{shadow-claw-git-CtUTJXKT.js → shadow-claw-git-D2M8VixW.js} +2 -2
  216. package/dist/public/{shadow-claw-integrations-CuBy9D3z.js → shadow-claw-integrations-Cgw6v9_1.js} +1 -1
  217. package/dist/public/{shadow-claw-llm-BIfNNjGL.js → shadow-claw-llm-74ieXp7i.js} +1 -1
  218. package/dist/public/{shadow-claw-mcp-remote-C17FXvrb.js → shadow-claw-mcp-remote-BX0BkSmy.js} +1 -1
  219. package/dist/public/{shadow-claw-networking-CjxQ1CLI.js → shadow-claw-networking-DNX8vaIQ.js} +1 -1
  220. package/dist/public/{shadow-claw-notifications-Brn2O3Ps.js → shadow-claw-notifications-BLTaGAny.js} +1 -1
  221. package/dist/public/{shadow-claw-page-header-Bn1P7Cxb.js → shadow-claw-page-header-CjFOdo9v.js} +1 -1
  222. package/dist/public/shadow-claw-pages-DOQqMm0_.js +645 -0
  223. package/dist/public/{shadow-claw-settings-CfDm0hVA.js → shadow-claw-settings-DFtl0Fy8.js} +2 -2
  224. package/dist/public/{shadow-claw-storage-DOOesRzw.js → shadow-claw-storage-gQGExZRq.js} +1 -1
  225. package/dist/public/{shadow-claw-task-server-H36iDDp2.js → shadow-claw-task-server-Ca45uY7S.js} +1 -1
  226. package/dist/public/{shadow-claw-tasks-4JsjSGkN.js → shadow-claw-tasks-CCTaaSdi.js} +1 -1
  227. package/dist/public/{shadow-claw-terminal-CTRTcYz-.js → shadow-claw-terminal-BfgulLkl.js} +1 -1
  228. package/dist/public/{shadow-claw-tools-Dm1LxNf4.js → shadow-claw-tools-V8NA4n18.js} +1 -1
  229. package/dist/public/{shadow-claw-webvm-JzuPe9Nr.js → shadow-claw-webvm-CxxI2bnC.js} +1 -1
  230. package/dist/public/sync-web-mcp-registration-CkCA8UFm.js +1 -0
  231. package/dist/public/{tools-FiTtOlIt.js → tools-CwQq5tJH.js} +2 -2
  232. package/dist/public/webmcp-CmtWOAFm.js +6 -0
  233. package/dist/server.js +2 -2
  234. package/package.json +3 -3
  235. package/src/cli/prerender/dsd-shell/prerender-dsd-shell.test.ts +16 -0
  236. package/src/cli/prerender/dsd-shell/prerender-dsd-shell.ts +62 -1
  237. package/src/cli/prerender/pretty-paths/prerender-pretty-paths.test.ts +277 -0
  238. package/src/cli/prerender/pretty-paths/prerender-pretty-paths.ts +28 -1
  239. package/src/cli/site-config/custom-elements/build-custom-element-script-tags.ts +13 -1
  240. package/src/components/shadow-claw/shadow-claw.css +12 -0
  241. package/src/components/shadow-claw/shadow-claw.html +12 -2
  242. package/src/components/shadow-claw/utils/bind-event-listeners.test.ts +18 -0
  243. package/src/components/shadow-claw/utils/bind-event-listeners.ts +14 -0
  244. package/src/components/shadow-claw/utils/get-route.test.ts +35 -0
  245. package/src/components/shadow-claw/utils/get-route.ts +18 -0
  246. package/src/components/shadow-claw/utils/sync-slotted-sidebar-active-links.test.ts +152 -1
  247. package/src/components/shadow-claw/utils/sync-slotted-sidebar-active-links.ts +139 -8
  248. package/src/components/shadow-claw-conversations/shadow-claw-conversations.css +11 -0
  249. package/src/components/shadow-claw-conversations/shadow-claw-conversations.html +27 -4
  250. package/src/components/shadow-claw-conversations/shadow-claw-conversations.ts +32 -4
  251. package/src/components/shadow-claw-pages/shadow-claw-pages-scripts.test.ts +266 -0
  252. package/src/components/shadow-claw-pages/shadow-claw-pages.ts +41 -17
  253. package/src/core/orchestrator/utils/sync-web-mcp-registration.test.ts +18 -1
  254. package/src/core/orchestrator/utils/sync-web-mcp-registration.ts +8 -0
  255. package/src/core/utils/init-control-plane.test.ts +9 -4
  256. package/src/security/custom-element-security.test.ts +65 -0
  257. package/src/security/custom-element-security.ts +67 -4
  258. package/src/stores/tools.test.ts +5 -3
  259. package/src/stores/tools.ts +5 -10
  260. package/src/subsystems/mcp/webmcp.test.ts +84 -13
  261. package/src/subsystems/mcp/webmcp.ts +73 -10
  262. package/src/utils/index.ts +1 -0
  263. package/src/utils/resolve-page-script-dependencies.test.ts +245 -0
  264. package/src/utils/resolve-page-script-dependencies.ts +198 -0
  265. package/dist/cli/chunk-B1hufJeO.js +0 -1
  266. package/dist/cli/chunk-BZpn8npn.js +0 -1
  267. package/dist/cli/chunk-Bw5aOTFr.js +0 -1
  268. package/dist/cli/chunk-C8nH01Gw.js +0 -32
  269. package/dist/cli/chunk-CK1ZoyoE.js +0 -17
  270. package/dist/cli/chunk-CVkhDr-7.js +0 -1
  271. package/dist/cli/chunk-Cum07Vlh.js +0 -1
  272. package/dist/cli/chunk-D3UhDDmV.js +0 -2
  273. package/dist/cli/chunk-D8GI6qj6.js +0 -1
  274. package/dist/cli/chunk-DEH-FvmP.js +0 -1
  275. package/dist/cli/chunk-DksvJ_kf.js +0 -1
  276. package/dist/cli/chunk-RGb9wM4R.js +0 -1
  277. package/dist/lib/shadow-claw-PdOpgTxH.js.map +0 -1
  278. package/dist/lib/shadow-claw-pages-DLspFqdK.js.map +0 -1
  279. package/dist/lib/sync-web-mcp-registration-dW2MVCj4.js.map +0 -1
  280. package/dist/lib/tools-D7whby3H.js.map +0 -1
  281. package/dist/lib/webmcp-CYTNZfkn.js +0 -1687
  282. package/dist/lib/webmcp-CYTNZfkn.js.map +0 -1
  283. package/dist/public/shadow-claw-CnNX-WCh.js +0 -1158
  284. package/dist/public/shadow-claw-pages-BwOOqRWW.js +0 -645
  285. package/dist/public/sync-web-mcp-registration-BnHVUjat.js +0 -1
  286. package/dist/public/webmcp-_TBqXlVW.js +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"shadow-claw-tools-CkZWxxTm.js","names":["shadowClawToolsStyles","shadowClawToolsTemplate"],"sources":["../../src/components/shadow-claw-tools/shadow-claw-tools.ts"],"sourcesContent":["import { getAvailableProviders, getProvider } from \"../../config/config.js\";\nimport { effect } from \"../../core/effect.js\";\n\nimport { getDb, ShadowClawDatabase } from \"../../db/db.js\";\nimport { getWebMcpMode } from \"../../subsystems/mcp/webmcp.js\";\n\nimport { orchestratorStore } from \"../../stores/orchestrator.js\";\nimport { toolsStore } from \"../../stores/tools.js\";\n\nimport { TOOL_DEFINITIONS } from \"../../subsystems/tools/tools.js\";\nimport { showError, showInfo, showSuccess } from \"../../ui/toast.js\";\nimport { ulid } from \"../../utils/ulid.js\";\n\nimport type { Orchestrator } from \"../../core/orchestrator/orchestrator.js\";\nimport type { RemoteManifest } from \"../../subsystems/tools/remote/types.js\";\nimport {\n setWebMcpMode,\n setWebMcpToolsEnabled,\n} from \"../../core/orchestrator/utils/sync-web-mcp-registration.js\";\n\nimport \"../common/shadow-claw-page-header-action-button/shadow-claw-page-header-action-button.js\";\nimport \"../shadow-claw-dialog/shadow-claw-dialog.js\";\nimport \"../shadow-claw-page-header/shadow-claw-page-header.js\";\n\nimport ShadowClawElement from \"../shadow-claw-element.js\";\nimport shadowClawToolsStyles from \"./shadow-claw-tools.css\" with { type: \"css\" };\nimport shadowClawToolsTemplate from \"./shadow-claw-tools.html\" with { type: \"html\" };\n\nconst BUILTIN_TOOL_NAMES = new Set(TOOL_DEFINITIONS.map((t) => t.name));\n\nconst elementName = \"shadow-claw-tools\";\nexport class ShadowClawTools extends ShadowClawElement {\n static styles = shadowClawToolsStyles;\n static template = shadowClawToolsTemplate;\n currentRemoteManifest: RemoteManifest | null = null;\n\n orchestrator: Orchestrator | null = null;\n\n constructor() {\n super();\n }\n\n async connectedCallback() {\n const db = await getDb();\n this.orchestrator = orchestratorStore.orchestrator;\n\n await toolsStore.refreshDeclarativeTools(db);\n this.setupEffects(db);\n this.bindEventListeners(db);\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n }\n\n bindEventListeners(db: ShadowClawDatabase) {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n // Back button\n root.querySelector(\".tools__back-btn\")?.addEventListener(\"click\", () => {\n this.dispatchEvent(\n new CustomEvent(\"navigate-back\", { bubbles: true, composed: true }),\n );\n });\n\n // Add tool button\n root.querySelector(\".tools__add-btn\")?.addEventListener(\"click\", () => {\n const dialog = root.querySelector(\"dialog\");\n if (dialog) {\n const form = root.querySelector(\n \".tools__dialog-form\",\n ) as HTMLFormElement | null;\n form?.reset();\n dialog.showModal();\n }\n });\n\n // Backup\n root.querySelector(\".tools__backup-btn\")?.addEventListener(\"click\", () => {\n this.handleBackup();\n });\n\n // Restore\n const restoreInput = root.querySelector(\".tools__hidden-restore\");\n root.querySelector(\".tools__restore-btn\")?.addEventListener(\"click\", () => {\n if (restoreInput instanceof HTMLInputElement) {\n restoreInput.click();\n }\n });\n restoreInput?.addEventListener(\"change\", (e) => {\n if (e.target instanceof HTMLInputElement) {\n this.handleRestore(db, e.target);\n }\n });\n\n // Select all / none\n root\n .querySelector(\".tools__select-all-btn\")\n ?.addEventListener(\"click\", () => {\n const allNames = toolsStore.allTools.map((t) => t.name);\n toolsStore.setAllEnabled(db, allNames);\n const declNames = toolsStore.declarativeTools.map((t) => t.name);\n toolsStore.setAllDeclarativeEnabled(db, declNames);\n showInfo(\"All tools enabled\");\n });\n\n root\n .querySelector(\".tools__select-none-btn\")\n ?.addEventListener(\"click\", () => {\n toolsStore.setAllEnabled(db, []);\n toolsStore.setAllDeclarativeEnabled(db, []);\n showInfo(\"All tools disabled\");\n });\n\n // WebMCP toggle listener\n const webMcpToggle = root.querySelector(\n \".tools__webmcp-toggle\",\n ) as HTMLInputElement | null;\n if (webMcpToggle) {\n webMcpToggle.addEventListener(\"change\", async () => {\n const orchestrator =\n this.orchestrator ?? orchestratorStore.orchestrator;\n if (!orchestrator) {\n webMcpToggle.checked = false;\n showError(\"Orchestrator is not ready\");\n\n return;\n }\n\n const next = webMcpToggle.checked;\n try {\n await setWebMcpToolsEnabled(orchestrator, db, next, { orchestrator });\n showInfo(\n next\n ? \"WebMCP tool registration enabled\"\n : \"WebMCP tool registration disabled\",\n );\n } catch (err) {\n webMcpToggle.checked = !next;\n showError(\n `Failed to update WebMCP setting: ${\n err instanceof Error ? err.message : String(err)\n }`,\n );\n }\n });\n }\n\n // Shared full internet access toggle listener\n const internetAccessToggle = root.querySelector(\n \".tools__internet-access-toggle\",\n ) as HTMLInputElement | null;\n if (internetAccessToggle) {\n internetAccessToggle.addEventListener(\"change\", async () => {\n const next = internetAccessToggle.checked;\n try {\n await orchestratorStore.setVMBashFullInternetAccess(db, next);\n showInfo(\n next\n ? \"Full internet access enabled for Bash and JavaScript tools\"\n : \"Full internet access disabled for Bash and JavaScript tools\",\n );\n } catch (err) {\n internetAccessToggle.checked = !next;\n showError(\n `Failed to update internet access setting: ${\n err instanceof Error ? err.message : String(err)\n }`,\n );\n }\n });\n }\n\n // Web Search toggle\n const webSearchUseProxyToggle = root.querySelector(\n \".tools__websearch-proxy-toggle\",\n ) as HTMLInputElement | null;\n webSearchUseProxyToggle?.addEventListener(\"change\", async () => {\n try {\n await toolsStore.setWebSearchUseProxy(\n db,\n webSearchUseProxyToggle.checked,\n );\n showInfo(\n webSearchUseProxyToggle.checked\n ? \"Web Search local proxy enabled\"\n : \"Web Search local proxy disabled\",\n );\n } catch (err) {\n webSearchUseProxyToggle.checked = !webSearchUseProxyToggle.checked;\n showError(\n `Failed to update Web Search proxy setting: ${\n err instanceof Error ? err.message : String(err)\n }`,\n );\n }\n });\n\n // Search Files save button\n root\n .querySelector(\".tools__save-searchfiles-btn\")\n ?.addEventListener(\"click\", async () => {\n const maxFileBytesInput = root.querySelector(\n \".tools__searchfiles-max-file-bytes-input\",\n ) as HTMLInputElement | null;\n const maxFilesVisitedInput = root.querySelector(\n \".tools__searchfiles-max-files-visited-input\",\n ) as HTMLInputElement | null;\n const skipDirsInput = root.querySelector(\n \".tools__searchfiles-skip-dirs-input\",\n ) as HTMLInputElement | null;\n\n const maxFileBytes = parseInt(maxFileBytesInput?.value || \"\", 10);\n const maxFilesVisited = parseInt(maxFilesVisitedInput?.value || \"\", 10);\n const skipDirs = skipDirsInput?.value ?? \"\";\n\n try {\n if (!isNaN(maxFileBytes) && maxFileBytes > 0) {\n await toolsStore.setSearchFilesMaxFileBytes(db, maxFileBytes);\n }\n if (!isNaN(maxFilesVisited) && maxFilesVisited > 0) {\n await toolsStore.setSearchFilesMaxFilesVisited(db, maxFilesVisited);\n }\n await toolsStore.setSearchFilesSkipDirs(db, skipDirs);\n showSuccess(\"Search Files settings saved\");\n } catch (err) {\n showError(\n `Failed to save Search Files settings: ${\n err instanceof Error ? err.message : String(err)\n }`,\n );\n }\n });\n\n // Web Search save button\n root\n .querySelector(\".tools__save-websearch-btn\")\n ?.addEventListener(\"click\", async () => {\n const proxyUrlInput = root.querySelector(\n \".tools__websearch-proxy-url-input\",\n ) as HTMLInputElement | null;\n const searchUrlInput = root.querySelector(\n \".tools__websearch-url-input\",\n ) as HTMLInputElement | null;\n\n const proxyUrl = proxyUrlInput?.value.trim() || \"/proxy\";\n const searchUrl =\n searchUrlInput?.value.trim() ||\n \"https://html.duckduckgo.com/html/?q={query}\";\n\n try {\n await toolsStore.setWebSearchProxyUrl(db, proxyUrl);\n await toolsStore.setWebSearchUrl(db, searchUrl);\n showSuccess(\"Web Search settings saved\");\n } catch (err) {\n showError(\n `Failed to save Web Search settings: ${\n err instanceof Error ? err.message : String(err)\n }`,\n );\n }\n });\n\n // WebMCP mode selector\n const webMcpModeSelect = root.querySelector(\n \".tools__webmcp-mode\",\n ) as HTMLSelectElement | null;\n if (webMcpModeSelect) {\n webMcpModeSelect.addEventListener(\"change\", async () => {\n const orchestrator =\n this.orchestrator ?? orchestratorStore.orchestrator;\n if (!orchestrator) {\n return;\n }\n\n const mode = webMcpModeSelect.value as \"polyfill\" | \"native\";\n try {\n await setWebMcpMode(orchestrator, db, mode, { orchestrator });\n showInfo(`WebMCP mode set to ${mode}`);\n } catch (err) {\n showError(\n `Failed to update WebMCP mode: ${\n err instanceof Error ? err.message : String(err)\n }`,\n );\n }\n });\n }\n\n // Save prompt\n root\n .querySelector(\".tools__save-prompt-btn\")\n ?.addEventListener(\"click\", () => {\n const textarea = root.querySelector(\".tools__prompt-area\");\n if (textarea instanceof HTMLTextAreaElement) {\n toolsStore.setSystemPromptOverride(db, textarea.value);\n showSuccess(\"System prompt override saved\");\n }\n });\n\n // Clear prompt\n root\n .querySelector(\".tools__clear-prompt-btn\")\n ?.addEventListener(\"click\", () => {\n const textarea = root.querySelector(\".tools__prompt-area\");\n if (textarea instanceof HTMLTextAreaElement) {\n textarea.value = \"\";\n toolsStore.setSystemPromptOverride(db, \"\");\n showSuccess(\"System prompt override cleared\");\n }\n });\n\n // Dialog controls — Add Tool\n const dialog = root.querySelector(\n \".tools__dialog\",\n ) as HTMLDialogElement | null;\n const closeBtn = dialog?.querySelector(\".tools__dialog-close\");\n const cancelBtn = dialog?.querySelector(\".tools__btn-cancel\");\n const form = root.querySelector(\n \".tools__dialog-form\",\n ) as HTMLFormElement | null;\n\n closeBtn?.addEventListener(\"click\", () => dialog?.close());\n cancelBtn?.addEventListener(\"click\", () => dialog?.close());\n\n dialog?.addEventListener(\"click\", (e) => {\n if (e.target === dialog) {\n dialog.close();\n }\n });\n\n form?.addEventListener(\"submit\", (e) => {\n e.preventDefault();\n if (form) {\n this.handleAddTool(db, form);\n }\n });\n\n // Dialog controls — Clone Tool\n const cloneDialog = root.querySelector(\n \".tools__clone-dialog\",\n ) as HTMLDialogElement | null;\n const cloneCloseBtn = root.querySelector(\".tools__clone-dialog-close\");\n const cloneCancelBtn = root.querySelector(\".tools__clone-cancel-btn\");\n const cloneForm = root.querySelector(\n \".tools__clone-dialog-form\",\n ) as HTMLFormElement | null;\n\n cloneCloseBtn?.addEventListener(\"click\", () => cloneDialog?.close());\n cloneCancelBtn?.addEventListener(\"click\", () => cloneDialog?.close());\n cloneDialog?.addEventListener(\"click\", (e) => {\n if (e.target === cloneDialog) {\n cloneDialog.close();\n }\n });\n\n cloneForm?.addEventListener(\"submit\", (e) => {\n e.preventDefault();\n if (cloneForm) {\n this.handleCloneTool(db, cloneForm);\n }\n });\n\n // Dialog controls — Profile\n const profileDialog = root.querySelector(\n \".tools__profile-dialog\",\n ) as HTMLDialogElement | null;\n const profileCloseBtn = root.querySelector(\".tools__profile-dialog-close\");\n const profileCancelBtn = root.querySelector(\".tools__profile-cancel-btn\");\n const profileForm = root.querySelector(\n \".tools__profile-dialog-form\",\n ) as HTMLFormElement | null;\n\n profileCloseBtn?.addEventListener(\"click\", () => profileDialog?.close());\n profileCancelBtn?.addEventListener(\"click\", () => profileDialog?.close());\n profileDialog?.addEventListener(\"click\", (e) => {\n if (e.target === profileDialog) {\n profileDialog.close();\n }\n });\n\n profileForm?.addEventListener(\"submit\", (e) => {\n e.preventDefault();\n if (profileForm) {\n this.handleSaveProfile(db, profileForm);\n }\n });\n\n // Profile select\n const profileSelect = root.querySelector(\".tools__profile-select\");\n profileSelect?.addEventListener(\"change\", (e) => {\n const select = e.target as HTMLSelectElement;\n const value = select.value;\n if (value) {\n toolsStore.activateProfile(db, value);\n showInfo(\"Profile activated\");\n } else {\n toolsStore.deactivateProfile(db);\n showInfo(\"Profile deactivated\");\n }\n });\n\n // Profile new button → open dialog\n root\n .querySelector(\".tools__profile-new-btn\")\n ?.addEventListener(\"click\", () => {\n if (profileDialog && profileForm) {\n profileForm.reset();\n // Populate provider dropdown\n const providerSelect = profileForm.querySelector(\n '[name=\"providerId\"]',\n );\n if (providerSelect) {\n providerSelect.replaceChildren();\n const defaultOption = document.createElement(\"option\");\n defaultOption.value = \"\";\n defaultOption.textContent = \"— Any provider —\";\n providerSelect.append(defaultOption);\n for (const pid of getAvailableProviders()) {\n const p = getProvider(pid);\n if (p) {\n const opt = document.createElement(\"option\");\n opt.value = pid;\n opt.textContent = p.name;\n providerSelect.appendChild(opt);\n }\n }\n }\n\n (profileDialog as HTMLDialogElement).showModal();\n }\n });\n\n // Profile save (overwrite active)\n root\n .querySelector(\".tools__profile-save-btn\")\n ?.addEventListener(\"click\", async () => {\n const activeId = toolsStore.activeProfileId;\n if (activeId) {\n await toolsStore.saveToActiveProfile(db);\n showSuccess(\"Profile saved\");\n } else {\n // No active profile — open new profile dialog\n root\n .querySelector(\".tools__profile-new-btn\")\n ?.dispatchEvent(new Event(\"click\"));\n }\n });\n\n // Profile delete\n root\n .querySelector(\".tools__profile-delete-btn\")\n ?.addEventListener(\"click\", async () => {\n const activeId = toolsStore.activeProfileId;\n if (!activeId) {\n showInfo(\"No profile selected\");\n\n return;\n }\n\n if (activeId.startsWith(\"__builtin_\")) {\n showInfo(\"Built-in profiles cannot be deleted\");\n\n return;\n }\n\n await toolsStore.deleteProfile(db, activeId);\n showSuccess(\"Profile deleted\");\n });\n\n // Dialog controls — Import\n const importDialog = root.querySelector(\n \".tools__import-dialog\",\n ) as HTMLDialogElement | null;\n const importCloseBtn = root.querySelector(\".tools__import-dialog-close\");\n const importCancelBtn = root.querySelector(\".tools__import-cancel-btn\");\n const importForm = root.querySelector(\n \".tools__import-dialog-form\",\n ) as HTMLFormElement | null;\n const importFetchBtn = root.querySelector(\".tools__import-fetch-btn\");\n\n root.querySelector(\".tools__import-btn\")?.addEventListener(\"click\", () => {\n if (importDialog && importForm) {\n importForm.reset();\n this.resetImportDialogState();\n importDialog.showModal();\n }\n });\n\n importCloseBtn?.addEventListener(\"click\", () => importDialog?.close());\n importCancelBtn?.addEventListener(\"click\", () => importDialog?.close());\n importDialog?.addEventListener(\"click\", (e) => {\n if (e.target === importDialog) {\n importDialog.close();\n }\n });\n\n root.querySelectorAll(\".tools__preset-btn\").forEach((btn) => {\n btn.addEventListener(\"click\", () => {\n const url = (btn as HTMLElement).dataset.url;\n const input = root.querySelector(\n \".tools__import-url-input\",\n ) as HTMLInputElement | null;\n if (input && url) {\n input.value = url;\n this.handleFetchSite(db, url);\n }\n });\n });\n\n importFetchBtn?.addEventListener(\"click\", () => {\n const input = root.querySelector(\n \".tools__import-url-input\",\n ) as HTMLInputElement | null;\n if (input && input.value.trim()) {\n this.handleFetchSite(db, input.value.trim());\n }\n });\n\n importForm?.addEventListener(\"submit\", (e) => {\n e.preventDefault();\n if (importForm) {\n this.handleImportSubmit(db, importForm);\n }\n });\n }\n\n handleBackup() {\n const json = toolsStore.exportBackup();\n const blob = new Blob([json], { type: \"application/json\" });\n const url = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = `shadowclaw-tools-${Date.now()}.json`;\n a.click();\n URL.revokeObjectURL(url);\n showSuccess(\"Tools config exported\");\n }\n\n /**\n * Open the clone tool dialog for a given source tool.\n */\n openCloneDialog(sourceToolName: string) {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const cloneDialog = root.querySelector(\n \".tools__clone-dialog\",\n ) as HTMLDialogElement | null;\n const cloneForm = root.querySelector(\n \".tools__clone-dialog-form\",\n ) as HTMLFormElement | null;\n if (!cloneDialog || !cloneForm) {\n return;\n }\n\n cloneForm.reset();\n const sourceInput = cloneForm.querySelector(\n '[name=\"source\"]',\n ) as HTMLInputElement | null;\n if (sourceInput) {\n sourceInput.value = sourceToolName;\n }\n\n cloneDialog.showModal();\n }\n\n renderImportCatalog(manifest: RemoteManifest) {\n const root = this.shadowRoot;\n if (!root) return;\n\n const catalog = root.querySelector(\".tools__import-catalog\");\n if (!catalog) return;\n catalog.replaceChildren();\n\n // 1. Render Tools\n const tools = manifest.tools || [];\n if (tools.length > 0) {\n const category = document.createElement(\"div\");\n category.className = \"tools__import-category\";\n\n const header = document.createElement(\"div\");\n header.className = \"tools__import-category-header\";\n header.textContent = `🛠️ Tools (${tools.length})`;\n category.appendChild(header);\n\n for (const tool of tools) {\n const item = document.createElement(\"div\");\n item.className = \"tools__import-item\";\n\n const itemHeader = document.createElement(\"div\");\n itemHeader.className = \"tools__import-item-header\";\n\n const checkbox = document.createElement(\"input\");\n checkbox.type = \"checkbox\";\n checkbox.name = \"importTool\";\n checkbox.value = tool.name;\n checkbox.checked = true;\n checkbox.id = `import_tool_${tool.name}`;\n itemHeader.appendChild(checkbox);\n\n const titleLabel = document.createElement(\"label\");\n titleLabel.htmlFor = checkbox.id;\n titleLabel.className = \"tools__import-item-title\";\n titleLabel.textContent = tool.name;\n itemHeader.appendChild(titleLabel);\n\n const badge = document.createElement(\"span\");\n badge.className = \"tools__item-badge tools__item-badge--declarative\";\n badge.textContent = tool.executionType || \"declarative\";\n itemHeader.appendChild(badge);\n\n item.appendChild(itemHeader);\n\n if (tool.description) {\n const desc = document.createElement(\"div\");\n desc.className = \"tools__import-item-desc\";\n desc.textContent = tool.description;\n item.appendChild(desc);\n }\n\n category.appendChild(item);\n }\n\n catalog.appendChild(category);\n }\n\n // 2. Render Skills\n const skills = manifest.skills || [];\n if (skills.length > 0) {\n const category = document.createElement(\"div\");\n category.className = \"tools__import-category\";\n\n const header = document.createElement(\"div\");\n header.className = \"tools__import-category-header\";\n header.textContent = `🧠 Agent Skills (${skills.length})`;\n category.appendChild(header);\n\n for (const skill of skills) {\n const item = document.createElement(\"div\");\n item.className = \"tools__import-item\";\n\n const itemHeader = document.createElement(\"div\");\n itemHeader.className = \"tools__import-item-header\";\n\n const checkbox = document.createElement(\"input\");\n checkbox.type = \"checkbox\";\n checkbox.name = \"importSkill\";\n checkbox.value = skill.name;\n checkbox.checked = true;\n checkbox.id = `import_skill_${skill.name}`;\n itemHeader.appendChild(checkbox);\n\n const titleLabel = document.createElement(\"label\");\n titleLabel.htmlFor = checkbox.id;\n titleLabel.className = \"tools__import-item-title\";\n titleLabel.textContent = skill.name;\n itemHeader.appendChild(titleLabel);\n\n const badge = document.createElement(\"span\");\n badge.className = \"tools__item-badge\";\n badge.textContent = \"skill\";\n itemHeader.appendChild(badge);\n\n item.appendChild(itemHeader);\n\n if (skill.description) {\n const desc = document.createElement(\"div\");\n desc.className = \"tools__import-item-desc\";\n desc.textContent = skill.description;\n item.appendChild(desc);\n }\n\n category.appendChild(item);\n }\n\n catalog.appendChild(category);\n }\n\n // 3. Render Scripts\n const scripts = manifest.scripts || [];\n if (scripts.length > 0) {\n const category = document.createElement(\"div\");\n category.className = \"tools__import-category\";\n\n const header = document.createElement(\"div\");\n header.className = \"tools__import-category-header\";\n header.textContent = `📜 Companion Scripts (${scripts.length})`;\n category.appendChild(header);\n\n for (const script of scripts) {\n const item = document.createElement(\"div\");\n item.className = \"tools__import-item\";\n\n const itemHeader = document.createElement(\"div\");\n itemHeader.className = \"tools__import-item-header\";\n\n const checkbox = document.createElement(\"input\");\n checkbox.type = \"checkbox\";\n checkbox.name = \"importScript\";\n checkbox.value = script.name;\n checkbox.checked = true;\n checkbox.id = `import_script_${script.name}`;\n itemHeader.appendChild(checkbox);\n\n const titleLabel = document.createElement(\"label\");\n titleLabel.htmlFor = checkbox.id;\n titleLabel.className = \"tools__import-item-title\";\n titleLabel.textContent = script.name;\n itemHeader.appendChild(titleLabel);\n\n const badge = document.createElement(\"span\");\n badge.className = \"tools__item-badge\";\n badge.textContent = \"script\";\n itemHeader.appendChild(badge);\n\n item.appendChild(itemHeader);\n\n if (script.description) {\n const desc = document.createElement(\"div\");\n desc.className = \"tools__import-item-desc\";\n desc.textContent = script.description;\n item.appendChild(desc);\n }\n\n category.appendChild(item);\n }\n\n catalog.appendChild(category);\n }\n }\n\n resetImportDialogState() {\n this.currentRemoteManifest = null;\n const root = this.shadowRoot;\n if (!root) return;\n\n const statusEl = root.querySelector(\n \".tools__import-manifest-status\",\n ) as HTMLElement | null;\n if (statusEl) statusEl.hidden = true;\n\n const siteName = root.querySelector(\".tools__import-site-name\");\n if (siteName) siteName.textContent = \"\";\n\n const siteDesc = root.querySelector(\".tools__import-site-desc\");\n if (siteDesc) siteDesc.textContent = \"\";\n\n const catalog = root.querySelector(\".tools__import-catalog\");\n if (catalog) catalog.replaceChildren();\n\n const submitBtn = root.querySelector(\n \".tools__import-submit-btn\",\n ) as HTMLButtonElement | null;\n if (submitBtn) submitBtn.disabled = true;\n }\n\n setupEffects(db: ShadowClawDatabase) {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n // Reactive re-render on tool store changes\n this.addCleanup(\n effect(() => {\n toolsStore.enabledToolNames;\n toolsStore.customTools;\n toolsStore.declarativeTools;\n toolsStore.declarativeToolNamesEnabled;\n toolsStore.systemPromptOverride;\n toolsStore.profiles;\n toolsStore.activeProfileId;\n this.updateToolList(db);\n }),\n );\n\n // WebMCP opt-in toggle\n const webMcpToggle = root.querySelector(\n \".tools__webmcp-toggle\",\n ) as HTMLInputElement | null;\n const internetAccessToggle = root.querySelector(\n \".tools__internet-access-toggle\",\n ) as HTMLInputElement | null;\n const webMcpModeSelect = root.querySelector(\n \".tools__webmcp-mode\",\n ) as HTMLSelectElement | null;\n\n if (webMcpToggle) {\n // Sync checked state and mode when orchestrator becomes available\n this.addCleanup(\n effect(() => {\n if (orchestratorStore.ready) {\n this.orchestrator = orchestratorStore.orchestrator;\n webMcpToggle.checked =\n this.orchestrator?.webMcpToolsEnabled === true;\n if (webMcpModeSelect && this.orchestrator) {\n webMcpModeSelect.value = getWebMcpMode() || \"polyfill\";\n }\n }\n }),\n );\n }\n\n if (internetAccessToggle) {\n this.addCleanup(\n effect(() => {\n internetAccessToggle.checked =\n orchestratorStore.vmBashFullInternetAccess;\n }),\n );\n }\n\n // Web Search reactive effects\n const webSearchProxyToggle = root.querySelector(\n \".tools__websearch-proxy-toggle\",\n ) as HTMLInputElement | null;\n const webSearchProxyUrlInput = root.querySelector(\n \".tools__websearch-proxy-url-input\",\n ) as HTMLInputElement | null;\n const webSearchUrlInput = root.querySelector(\n \".tools__websearch-url-input\",\n ) as HTMLInputElement | null;\n\n if (webSearchProxyToggle) {\n this.addCleanup(\n effect(() => {\n webSearchProxyToggle.checked = toolsStore.webSearchUseProxy;\n }),\n );\n }\n\n if (webSearchProxyUrlInput) {\n this.addCleanup(\n effect(() => {\n if (\n document.activeElement !== webSearchProxyUrlInput &&\n !webSearchProxyUrlInput.matches(\":focus\")\n ) {\n webSearchProxyUrlInput.value = toolsStore.webSearchProxyUrl;\n }\n }),\n );\n }\n\n if (webSearchUrlInput) {\n this.addCleanup(\n effect(() => {\n if (\n document.activeElement !== webSearchUrlInput &&\n !webSearchUrlInput.matches(\":focus\")\n ) {\n webSearchUrlInput.value = toolsStore.webSearchUrl;\n }\n }),\n );\n }\n\n // Search Files reactive effects\n const searchFilesMaxFileBytesInput = root.querySelector(\n \".tools__searchfiles-max-file-bytes-input\",\n ) as HTMLInputElement | null;\n const searchFilesMaxFilesVisitedInput = root.querySelector(\n \".tools__searchfiles-max-files-visited-input\",\n ) as HTMLInputElement | null;\n const searchFilesSkipDirsInput = root.querySelector(\n \".tools__searchfiles-skip-dirs-input\",\n ) as HTMLInputElement | null;\n\n if (searchFilesMaxFileBytesInput) {\n this.addCleanup(\n effect(() => {\n if (\n document.activeElement !== searchFilesMaxFileBytesInput &&\n !searchFilesMaxFileBytesInput.matches(\":focus\")\n ) {\n searchFilesMaxFileBytesInput.value = String(\n toolsStore.searchFilesMaxFileBytes,\n );\n }\n }),\n );\n }\n\n if (searchFilesMaxFilesVisitedInput) {\n this.addCleanup(\n effect(() => {\n if (\n document.activeElement !== searchFilesMaxFilesVisitedInput &&\n !searchFilesMaxFilesVisitedInput.matches(\":focus\")\n ) {\n searchFilesMaxFilesVisitedInput.value = String(\n toolsStore.searchFilesMaxFilesVisited,\n );\n }\n }),\n );\n }\n\n if (searchFilesSkipDirsInput) {\n this.addCleanup(\n effect(() => {\n if (\n document.activeElement !== searchFilesSkipDirsInput &&\n !searchFilesSkipDirsInput.matches(\":focus\")\n ) {\n searchFilesSkipDirsInput.value = toolsStore.searchFilesSkipDirs;\n }\n }),\n );\n }\n }\n\n /** Update the profile dropdown to reflect current state. */\n updateProfileSelector() {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const select = root.querySelector(\".tools__profile-select\");\n if (!select) {\n return;\n }\n\n const profiles = toolsStore.profiles;\n const activeId = toolsStore.activeProfileId;\n\n // Preserve selection\n select.replaceChildren();\n const defaultOption = document.createElement(\"option\");\n defaultOption.value = \"\";\n defaultOption.textContent = \"— No profile (manual config) —\";\n select.append(defaultOption);\n for (const p of profiles) {\n const opt = document.createElement(\"option\");\n opt.value = p.id;\n const isBuiltin = p.id.startsWith(\"__builtin_\");\n const providerLabel = p.providerId\n ? getProvider(p.providerId)?.name || p.providerId\n : \"any\";\n const modelLabel = p.model || \"any\";\n opt.textContent = isBuiltin\n ? `⚡ ${p.name} (${providerLabel})`\n : `${p.name} (${providerLabel} / ${modelLabel})`;\n if (p.id === activeId) {\n opt.selected = true;\n }\n\n select.appendChild(opt);\n }\n\n // Disable delete button for built-in profiles\n const deleteBtn = root.querySelector(\n \".tools__profile-delete-btn\",\n ) as HTMLButtonElement | null;\n if (deleteBtn) {\n const isBuiltinActive = activeId?.startsWith(\"__builtin_\");\n deleteBtn.disabled = !!isBuiltinActive;\n deleteBtn.title = isBuiltinActive\n ? \"Built-in profiles cannot be deleted\"\n : \"\";\n }\n }\n\n updateToolList(db: ShadowClawDatabase) {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const list = root.querySelector(\".tools__list\");\n if (!list) {\n return;\n }\n\n const enabled = toolsStore.enabledToolNames;\n const allTools = toolsStore.allTools;\n const declarativeTools = toolsStore.declarativeTools;\n\n const existingCheckboxes = list.querySelectorAll<HTMLInputElement>(\n \".tools__item-checkbox[data-tool]\",\n );\n const existingToolNames = Array.from(existingCheckboxes).map(\n (cb) => cb.getAttribute(\"data-tool\") || \"\",\n );\n const targetToolNames = [\n ...allTools.map((t) => t.name),\n ...declarativeTools.map((t) => t.name),\n ];\n\n const isSameStructure =\n existingToolNames.length === targetToolNames.length &&\n existingToolNames.every((name, i) => name === targetToolNames[i]);\n\n if (isSameStructure) {\n for (const cb of existingCheckboxes) {\n const toolName = cb.getAttribute(\"data-tool\");\n if (!toolName) continue;\n const isDeclarative = declarativeTools.some((t) => t.name === toolName);\n const isChecked = isDeclarative\n ? toolsStore.isDeclarativeToolEnabled(toolName)\n : enabled.has(toolName);\n if (cb.checked !== isChecked) {\n cb.checked = isChecked;\n }\n }\n } else {\n list.replaceChildren();\n\n for (const tool of allTools) {\n const isCustom = !BUILTIN_TOOL_NAMES.has(tool.name);\n const isChecked = enabled.has(tool.name);\n const brief = tool.description.split(\". \")[0];\n\n const item = document.createElement(\"div\");\n item.className = \"tools__item\";\n item.setAttribute(\"role\", \"listitem\");\n\n const checkbox = document.createElement(\"input\");\n checkbox.type = \"checkbox\";\n checkbox.className = \"tools__item-checkbox\";\n checkbox.setAttribute(\"data-tool\", tool.name);\n checkbox.setAttribute(\"aria-label\", `Enable ${tool.name}`);\n checkbox.checked = isChecked;\n\n const info = document.createElement(\"div\");\n info.className = \"tools__item-info\";\n\n const name = document.createElement(\"div\");\n name.className = \"tools__item-name\";\n name.textContent = tool.name;\n\n const desc = document.createElement(\"div\");\n desc.className = \"tools__item-desc\";\n desc.setAttribute(\"title\", tool.description);\n desc.textContent = brief;\n info.append(name, desc);\n\n const cloneBtn = document.createElement(\"button\");\n cloneBtn.className = \"tools__item-clone\";\n cloneBtn.setAttribute(\"data-clone\", tool.name);\n cloneBtn.setAttribute(\"aria-label\", `Clone ${tool.name}`);\n cloneBtn.setAttribute(\"title\", \"Clone tool\");\n cloneBtn.textContent = \"📋\";\n\n item.append(checkbox, info);\n\n if (isCustom) {\n const badge = document.createElement(\"span\");\n badge.className = \"tools__item-badge\";\n badge.textContent = \"custom\";\n item.append(badge);\n }\n\n item.append(cloneBtn);\n\n let deleteBtn: HTMLButtonElement | null = null;\n if (isCustom) {\n deleteBtn = document.createElement(\"button\");\n deleteBtn.className = \"tools__item-delete\";\n deleteBtn.setAttribute(\"data-delete\", tool.name);\n deleteBtn.setAttribute(\"aria-label\", `Delete ${tool.name}`);\n deleteBtn.textContent = \"🗑️\";\n item.append(deleteBtn);\n }\n\n // Toggle\n checkbox?.addEventListener(\"change\", () => {\n toolsStore.setToolEnabled(db, tool.name, checkbox.checked);\n });\n\n // Clone\n cloneBtn?.addEventListener(\"click\", () => {\n this.openCloneDialog(tool.name);\n });\n\n // Delete custom tool\n deleteBtn?.addEventListener(\"click\", () => {\n toolsStore.removeCustomTool(db, tool.name);\n showInfo(`Removed custom tool: ${tool.name}`);\n });\n\n list.appendChild(item);\n }\n\n for (const tool of declarativeTools) {\n const isChecked = toolsStore.isDeclarativeToolEnabled(tool.name);\n const brief = tool.description.split(\". \")[0];\n\n const item = document.createElement(\"div\");\n item.className = \"tools__item\";\n item.setAttribute(\"role\", \"listitem\");\n\n const checkbox = document.createElement(\"input\");\n checkbox.type = \"checkbox\";\n checkbox.className = \"tools__item-checkbox\";\n checkbox.setAttribute(\"data-tool\", tool.name);\n checkbox.setAttribute(\"aria-label\", `Enable ${tool.name}`);\n checkbox.checked = isChecked;\n\n const info = document.createElement(\"div\");\n info.className = \"tools__item-info\";\n\n const name = document.createElement(\"div\");\n name.className = \"tools__item-name\";\n name.textContent = tool.name;\n\n const desc = document.createElement(\"div\");\n desc.className = \"tools__item-desc\";\n desc.setAttribute(\"title\", tool.description);\n desc.textContent = brief;\n info.append(name, desc);\n\n const badge = document.createElement(\"span\");\n badge.className = \"tools__item-badge tools__item-badge--declarative\";\n badge.textContent = \"declarative\";\n item.append(checkbox, info, badge);\n\n checkbox.addEventListener(\"change\", () => {\n toolsStore.setDeclarativeToolEnabled(db, tool.name, checkbox.checked);\n });\n\n list.appendChild(item);\n }\n }\n\n // Update count\n const countEl = root.querySelector(\".tools__count\");\n if (countEl) {\n const enabledBuiltinCount = (toolsStore.enabledTools || []).length;\n const enabledDeclarativeCount = (toolsStore.enabledDeclarativeTools || [])\n .length;\n const totalEnabled = enabledBuiltinCount + enabledDeclarativeCount;\n const totalCount = allTools.length + declarativeTools.length;\n countEl.textContent = `${totalEnabled} of ${totalCount} enabled`;\n }\n\n // Update prompt textarea\n const textarea = root.querySelector(\".tools__prompt-area\");\n if (\n textarea instanceof HTMLTextAreaElement &&\n document.activeElement !== textarea &&\n !textarea.matches(\":focus\")\n ) {\n textarea.value = toolsStore.systemPromptOverride;\n }\n\n // Update profile selector\n this.updateProfileSelector();\n }\n\n async handleAddTool(db: ShadowClawDatabase, form: HTMLFormElement) {\n const data = new FormData(form);\n const name = String(data.get(\"name\") || \"\").trim();\n const description = String(data.get(\"description\") || \"\").trim();\n const schemaStr = String(data.get(\"input_schema\") || \"\").trim();\n\n if (!name || !description) {\n showError(\"Name and description are required\");\n\n return;\n }\n\n // Check uniqueness\n if (toolsStore.allTools.some((t) => t.name === name)) {\n showError(`A tool named \"${name}\" already exists`);\n\n return;\n }\n\n let input_schema = { type: \"object\", properties: {} };\n if (schemaStr) {\n try {\n input_schema = JSON.parse(schemaStr);\n } catch {\n showError(\"Invalid JSON in input schema\");\n\n return;\n }\n }\n\n await toolsStore.addCustomTool(db, { name, description, input_schema });\n showSuccess(`Added custom tool: ${name}`);\n\n const dialog = this.shadowRoot?.querySelector(\n \".tools__dialog\",\n ) as HTMLDialogElement | null;\n dialog?.close();\n }\n\n async handleCloneTool(db: ShadowClawDatabase, form: HTMLFormElement) {\n const data = new FormData(form);\n const sourceToolName = String(data.get(\"source\") || \"\").trim();\n const newName = String(data.get(\"name\") || \"\").trim();\n const newDesc = String(data.get(\"description\") || \"\").trim();\n\n if (!sourceToolName || !newName) {\n showError(\"Source and new tool name are required\");\n\n return;\n }\n\n const ok = await toolsStore.cloneTool(\n db,\n sourceToolName,\n newName,\n newDesc || undefined,\n );\n if (!ok) {\n showError(\n `Clone failed: source not found or name \"${newName}\" already exists.`,\n );\n\n return;\n }\n\n showSuccess(`Cloned \"${sourceToolName}\" → \"${newName}\"`);\n const cloneDialog = this.shadowRoot?.querySelector(\n \".tools__clone-dialog\",\n ) as HTMLDialogElement | null;\n cloneDialog?.close();\n }\n\n async handleFetchSite(_db: ShadowClawDatabase, url: string) {\n const root = this.shadowRoot;\n if (!root) return;\n\n const fetchBtn = root.querySelector(\n \".tools__import-fetch-btn\",\n ) as HTMLButtonElement | null;\n const origText = fetchBtn?.textContent || \"🔍 Fetch\";\n if (fetchBtn) {\n fetchBtn.disabled = true;\n fetchBtn.textContent = \"Fetching...\";\n }\n\n try {\n const resolved = await toolsStore.fetchRemoteDiscoveryManifest(url);\n this.currentRemoteManifest = resolved.manifest;\n\n const siteName = root.querySelector(\".tools__import-site-name\");\n if (siteName)\n siteName.textContent = resolved.manifest.name || \"Remote Site\";\n\n const siteDesc = root.querySelector(\".tools__import-site-desc\");\n if (siteDesc) {\n siteDesc.textContent =\n resolved.manifest.description || \"No description provided.\";\n }\n\n this.renderImportCatalog(resolved.manifest);\n\n const statusEl = root.querySelector(\n \".tools__import-manifest-status\",\n ) as HTMLElement | null;\n if (statusEl) statusEl.hidden = false;\n\n const submitBtn = root.querySelector(\n \".tools__import-submit-btn\",\n ) as HTMLButtonElement | null;\n if (submitBtn) submitBtn.disabled = false;\n\n showInfo(\n `Discovered ${(resolved.manifest.tools || []).length} tools, ${(resolved.manifest.skills || []).length} skills from ${resolved.manifest.name}`,\n );\n } catch (err) {\n this.resetImportDialogState();\n showError(\n `Failed to fetch site: ${err instanceof Error ? err.message : String(err)}`,\n );\n } finally {\n if (fetchBtn) {\n fetchBtn.disabled = false;\n fetchBtn.textContent = origText;\n }\n }\n }\n\n async handleImportSubmit(db: ShadowClawDatabase, form: HTMLFormElement) {\n if (!this.currentRemoteManifest) {\n showError(\"No remote discovery manifest loaded.\");\n return;\n }\n\n const formData = new FormData(form);\n const toolNames = formData.getAll(\"importTool\").map(String);\n const skillNames = formData.getAll(\"importSkill\").map(String);\n const scriptNames = formData.getAll(\"importScript\").map(String);\n\n if (\n toolNames.length === 0 &&\n skillNames.length === 0 &&\n scriptNames.length === 0\n ) {\n showError(\"Please select at least one tool, skill, or script to import.\");\n return;\n }\n\n const autoEnable =\n (form.querySelector(\".tools__import-auto-enable\") as HTMLInputElement)\n ?.checked ?? true;\n const overwrite =\n (form.querySelector(\".tools__import-overwrite\") as HTMLInputElement)\n ?.checked ?? false;\n\n const submitBtn = form.querySelector(\n \".tools__import-submit-btn\",\n ) as HTMLButtonElement | null;\n if (submitBtn) {\n submitBtn.disabled = true;\n submitBtn.textContent = \"Importing...\";\n }\n\n try {\n const result = await toolsStore.importFromRemoteSite(\n db,\n this.currentRemoteManifest,\n { toolNames, skillNames, scriptNames },\n { autoEnable, overwrite },\n );\n\n const importedToolsCount = result.tools.filter(\n (t) => t.status === \"imported\",\n ).length;\n const importedSkillsCount = result.skills.filter(\n (s) => s.status === \"imported\",\n ).length;\n const importedScriptsCount = result.scripts.filter(\n (sc) => sc.status === \"imported\",\n ).length;\n\n const totalCount =\n importedToolsCount + importedSkillsCount + importedScriptsCount;\n\n showSuccess(\n `Successfully imported ${totalCount} items from ${this.currentRemoteManifest.name || \"site\"}!`,\n );\n\n const dialog = this.shadowRoot?.querySelector(\n \".tools__import-dialog\",\n ) as HTMLDialogElement | null;\n dialog?.close();\n } catch (err) {\n showError(\n `Import failed: ${err instanceof Error ? err.message : String(err)}`,\n );\n } finally {\n if (submitBtn) {\n submitBtn.disabled = false;\n submitBtn.textContent = \"Import Selected\";\n }\n }\n }\n\n async handleRestore(db: ShadowClawDatabase, input: HTMLInputElement) {\n const file = input.files?.[0];\n if (!file) {\n return;\n }\n\n try {\n const text = await file.text();\n await toolsStore.importBackup(db, text);\n showSuccess(\"Tools config restored\");\n } catch (err) {\n showError(\n `Failed to restore: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n\n input.value = \"\";\n }\n\n async handleSaveProfile(db: ShadowClawDatabase, form: HTMLFormElement) {\n const data = new FormData(form);\n const name = String(data.get(\"name\") || \"\").trim();\n const providerId = String(data.get(\"providerId\") || \"\").trim();\n const model = String(data.get(\"model\") || \"\").trim();\n\n if (!name) {\n showError(\"Profile name is required\");\n\n return;\n }\n\n const profile = {\n id: ulid(),\n name,\n providerId: providerId || undefined,\n model: model || undefined,\n enabledToolNames: [...toolsStore.enabledToolNames],\n customTools: [...toolsStore.customTools],\n systemPromptOverride: toolsStore.systemPromptOverride,\n };\n\n await toolsStore.addProfile(db, profile);\n await toolsStore.activateProfile(db, profile.id);\n showSuccess(`Profile \"${name}\" created and activated`);\n\n const profileDialog = this.shadowRoot?.querySelector(\n \".tools__profile-dialog\",\n ) as HTMLDialogElement | null;\n profileDialog?.close();\n }\n}\n\nif (!customElements.get(elementName)) {\n customElements.define(elementName, ShadowClawTools);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}
1
+ {"version":3,"file":"shadow-claw-tools-BCnU8FaK.js","names":["shadowClawToolsStyles","shadowClawToolsTemplate"],"sources":["../../src/components/shadow-claw-tools/shadow-claw-tools.ts"],"sourcesContent":["import { getAvailableProviders, getProvider } from \"../../config/config.js\";\nimport { effect } from \"../../core/effect.js\";\n\nimport { getDb, ShadowClawDatabase } from \"../../db/db.js\";\nimport { getWebMcpMode } from \"../../subsystems/mcp/webmcp.js\";\n\nimport { orchestratorStore } from \"../../stores/orchestrator.js\";\nimport { toolsStore } from \"../../stores/tools.js\";\n\nimport { TOOL_DEFINITIONS } from \"../../subsystems/tools/tools.js\";\nimport { showError, showInfo, showSuccess } from \"../../ui/toast.js\";\nimport { ulid } from \"../../utils/ulid.js\";\n\nimport type { Orchestrator } from \"../../core/orchestrator/orchestrator.js\";\nimport type { RemoteManifest } from \"../../subsystems/tools/remote/types.js\";\nimport {\n setWebMcpMode,\n setWebMcpToolsEnabled,\n} from \"../../core/orchestrator/utils/sync-web-mcp-registration.js\";\n\nimport \"../common/shadow-claw-page-header-action-button/shadow-claw-page-header-action-button.js\";\nimport \"../shadow-claw-dialog/shadow-claw-dialog.js\";\nimport \"../shadow-claw-page-header/shadow-claw-page-header.js\";\n\nimport ShadowClawElement from \"../shadow-claw-element.js\";\nimport shadowClawToolsStyles from \"./shadow-claw-tools.css\" with { type: \"css\" };\nimport shadowClawToolsTemplate from \"./shadow-claw-tools.html\" with { type: \"html\" };\n\nconst BUILTIN_TOOL_NAMES = new Set(TOOL_DEFINITIONS.map((t) => t.name));\n\nconst elementName = \"shadow-claw-tools\";\nexport class ShadowClawTools extends ShadowClawElement {\n static styles = shadowClawToolsStyles;\n static template = shadowClawToolsTemplate;\n currentRemoteManifest: RemoteManifest | null = null;\n\n orchestrator: Orchestrator | null = null;\n\n constructor() {\n super();\n }\n\n async connectedCallback() {\n const db = await getDb();\n this.orchestrator = orchestratorStore.orchestrator;\n\n await toolsStore.refreshDeclarativeTools(db);\n this.setupEffects(db);\n this.bindEventListeners(db);\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n }\n\n bindEventListeners(db: ShadowClawDatabase) {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n // Back button\n root.querySelector(\".tools__back-btn\")?.addEventListener(\"click\", () => {\n this.dispatchEvent(\n new CustomEvent(\"navigate-back\", { bubbles: true, composed: true }),\n );\n });\n\n // Add tool button\n root.querySelector(\".tools__add-btn\")?.addEventListener(\"click\", () => {\n const dialog = root.querySelector(\"dialog\");\n if (dialog) {\n const form = root.querySelector(\n \".tools__dialog-form\",\n ) as HTMLFormElement | null;\n form?.reset();\n dialog.showModal();\n }\n });\n\n // Backup\n root.querySelector(\".tools__backup-btn\")?.addEventListener(\"click\", () => {\n this.handleBackup();\n });\n\n // Restore\n const restoreInput = root.querySelector(\".tools__hidden-restore\");\n root.querySelector(\".tools__restore-btn\")?.addEventListener(\"click\", () => {\n if (restoreInput instanceof HTMLInputElement) {\n restoreInput.click();\n }\n });\n restoreInput?.addEventListener(\"change\", (e) => {\n if (e.target instanceof HTMLInputElement) {\n this.handleRestore(db, e.target);\n }\n });\n\n // Select all / none\n root\n .querySelector(\".tools__select-all-btn\")\n ?.addEventListener(\"click\", () => {\n const allNames = toolsStore.allTools.map((t) => t.name);\n toolsStore.setAllEnabled(db, allNames);\n const declNames = toolsStore.declarativeTools.map((t) => t.name);\n toolsStore.setAllDeclarativeEnabled(db, declNames);\n showInfo(\"All tools enabled\");\n });\n\n root\n .querySelector(\".tools__select-none-btn\")\n ?.addEventListener(\"click\", () => {\n toolsStore.setAllEnabled(db, []);\n toolsStore.setAllDeclarativeEnabled(db, []);\n showInfo(\"All tools disabled\");\n });\n\n // WebMCP toggle listener\n const webMcpToggle = root.querySelector(\n \".tools__webmcp-toggle\",\n ) as HTMLInputElement | null;\n if (webMcpToggle) {\n webMcpToggle.addEventListener(\"change\", async () => {\n const orchestrator =\n this.orchestrator ?? orchestratorStore.orchestrator;\n if (!orchestrator) {\n webMcpToggle.checked = false;\n showError(\"Orchestrator is not ready\");\n\n return;\n }\n\n const next = webMcpToggle.checked;\n try {\n await setWebMcpToolsEnabled(orchestrator, db, next, { orchestrator });\n showInfo(\n next\n ? \"WebMCP tool registration enabled\"\n : \"WebMCP tool registration disabled\",\n );\n } catch (err) {\n webMcpToggle.checked = !next;\n showError(\n `Failed to update WebMCP setting: ${\n err instanceof Error ? err.message : String(err)\n }`,\n );\n }\n });\n }\n\n // Shared full internet access toggle listener\n const internetAccessToggle = root.querySelector(\n \".tools__internet-access-toggle\",\n ) as HTMLInputElement | null;\n if (internetAccessToggle) {\n internetAccessToggle.addEventListener(\"change\", async () => {\n const next = internetAccessToggle.checked;\n try {\n await orchestratorStore.setVMBashFullInternetAccess(db, next);\n showInfo(\n next\n ? \"Full internet access enabled for Bash and JavaScript tools\"\n : \"Full internet access disabled for Bash and JavaScript tools\",\n );\n } catch (err) {\n internetAccessToggle.checked = !next;\n showError(\n `Failed to update internet access setting: ${\n err instanceof Error ? err.message : String(err)\n }`,\n );\n }\n });\n }\n\n // Web Search toggle\n const webSearchUseProxyToggle = root.querySelector(\n \".tools__websearch-proxy-toggle\",\n ) as HTMLInputElement | null;\n webSearchUseProxyToggle?.addEventListener(\"change\", async () => {\n try {\n await toolsStore.setWebSearchUseProxy(\n db,\n webSearchUseProxyToggle.checked,\n );\n showInfo(\n webSearchUseProxyToggle.checked\n ? \"Web Search local proxy enabled\"\n : \"Web Search local proxy disabled\",\n );\n } catch (err) {\n webSearchUseProxyToggle.checked = !webSearchUseProxyToggle.checked;\n showError(\n `Failed to update Web Search proxy setting: ${\n err instanceof Error ? err.message : String(err)\n }`,\n );\n }\n });\n\n // Search Files save button\n root\n .querySelector(\".tools__save-searchfiles-btn\")\n ?.addEventListener(\"click\", async () => {\n const maxFileBytesInput = root.querySelector(\n \".tools__searchfiles-max-file-bytes-input\",\n ) as HTMLInputElement | null;\n const maxFilesVisitedInput = root.querySelector(\n \".tools__searchfiles-max-files-visited-input\",\n ) as HTMLInputElement | null;\n const skipDirsInput = root.querySelector(\n \".tools__searchfiles-skip-dirs-input\",\n ) as HTMLInputElement | null;\n\n const maxFileBytes = parseInt(maxFileBytesInput?.value || \"\", 10);\n const maxFilesVisited = parseInt(maxFilesVisitedInput?.value || \"\", 10);\n const skipDirs = skipDirsInput?.value ?? \"\";\n\n try {\n if (!isNaN(maxFileBytes) && maxFileBytes > 0) {\n await toolsStore.setSearchFilesMaxFileBytes(db, maxFileBytes);\n }\n if (!isNaN(maxFilesVisited) && maxFilesVisited > 0) {\n await toolsStore.setSearchFilesMaxFilesVisited(db, maxFilesVisited);\n }\n await toolsStore.setSearchFilesSkipDirs(db, skipDirs);\n showSuccess(\"Search Files settings saved\");\n } catch (err) {\n showError(\n `Failed to save Search Files settings: ${\n err instanceof Error ? err.message : String(err)\n }`,\n );\n }\n });\n\n // Web Search save button\n root\n .querySelector(\".tools__save-websearch-btn\")\n ?.addEventListener(\"click\", async () => {\n const proxyUrlInput = root.querySelector(\n \".tools__websearch-proxy-url-input\",\n ) as HTMLInputElement | null;\n const searchUrlInput = root.querySelector(\n \".tools__websearch-url-input\",\n ) as HTMLInputElement | null;\n\n const proxyUrl = proxyUrlInput?.value.trim() || \"/proxy\";\n const searchUrl =\n searchUrlInput?.value.trim() ||\n \"https://html.duckduckgo.com/html/?q={query}\";\n\n try {\n await toolsStore.setWebSearchProxyUrl(db, proxyUrl);\n await toolsStore.setWebSearchUrl(db, searchUrl);\n showSuccess(\"Web Search settings saved\");\n } catch (err) {\n showError(\n `Failed to save Web Search settings: ${\n err instanceof Error ? err.message : String(err)\n }`,\n );\n }\n });\n\n // WebMCP mode selector\n const webMcpModeSelect = root.querySelector(\n \".tools__webmcp-mode\",\n ) as HTMLSelectElement | null;\n if (webMcpModeSelect) {\n webMcpModeSelect.addEventListener(\"change\", async () => {\n const orchestrator =\n this.orchestrator ?? orchestratorStore.orchestrator;\n if (!orchestrator) {\n return;\n }\n\n const mode = webMcpModeSelect.value as \"polyfill\" | \"native\";\n try {\n await setWebMcpMode(orchestrator, db, mode, { orchestrator });\n showInfo(`WebMCP mode set to ${mode}`);\n } catch (err) {\n showError(\n `Failed to update WebMCP mode: ${\n err instanceof Error ? err.message : String(err)\n }`,\n );\n }\n });\n }\n\n // Save prompt\n root\n .querySelector(\".tools__save-prompt-btn\")\n ?.addEventListener(\"click\", () => {\n const textarea = root.querySelector(\".tools__prompt-area\");\n if (textarea instanceof HTMLTextAreaElement) {\n toolsStore.setSystemPromptOverride(db, textarea.value);\n showSuccess(\"System prompt override saved\");\n }\n });\n\n // Clear prompt\n root\n .querySelector(\".tools__clear-prompt-btn\")\n ?.addEventListener(\"click\", () => {\n const textarea = root.querySelector(\".tools__prompt-area\");\n if (textarea instanceof HTMLTextAreaElement) {\n textarea.value = \"\";\n toolsStore.setSystemPromptOverride(db, \"\");\n showSuccess(\"System prompt override cleared\");\n }\n });\n\n // Dialog controls — Add Tool\n const dialog = root.querySelector(\n \".tools__dialog\",\n ) as HTMLDialogElement | null;\n const closeBtn = dialog?.querySelector(\".tools__dialog-close\");\n const cancelBtn = dialog?.querySelector(\".tools__btn-cancel\");\n const form = root.querySelector(\n \".tools__dialog-form\",\n ) as HTMLFormElement | null;\n\n closeBtn?.addEventListener(\"click\", () => dialog?.close());\n cancelBtn?.addEventListener(\"click\", () => dialog?.close());\n\n dialog?.addEventListener(\"click\", (e) => {\n if (e.target === dialog) {\n dialog.close();\n }\n });\n\n form?.addEventListener(\"submit\", (e) => {\n e.preventDefault();\n if (form) {\n this.handleAddTool(db, form);\n }\n });\n\n // Dialog controls — Clone Tool\n const cloneDialog = root.querySelector(\n \".tools__clone-dialog\",\n ) as HTMLDialogElement | null;\n const cloneCloseBtn = root.querySelector(\".tools__clone-dialog-close\");\n const cloneCancelBtn = root.querySelector(\".tools__clone-cancel-btn\");\n const cloneForm = root.querySelector(\n \".tools__clone-dialog-form\",\n ) as HTMLFormElement | null;\n\n cloneCloseBtn?.addEventListener(\"click\", () => cloneDialog?.close());\n cloneCancelBtn?.addEventListener(\"click\", () => cloneDialog?.close());\n cloneDialog?.addEventListener(\"click\", (e) => {\n if (e.target === cloneDialog) {\n cloneDialog.close();\n }\n });\n\n cloneForm?.addEventListener(\"submit\", (e) => {\n e.preventDefault();\n if (cloneForm) {\n this.handleCloneTool(db, cloneForm);\n }\n });\n\n // Dialog controls — Profile\n const profileDialog = root.querySelector(\n \".tools__profile-dialog\",\n ) as HTMLDialogElement | null;\n const profileCloseBtn = root.querySelector(\".tools__profile-dialog-close\");\n const profileCancelBtn = root.querySelector(\".tools__profile-cancel-btn\");\n const profileForm = root.querySelector(\n \".tools__profile-dialog-form\",\n ) as HTMLFormElement | null;\n\n profileCloseBtn?.addEventListener(\"click\", () => profileDialog?.close());\n profileCancelBtn?.addEventListener(\"click\", () => profileDialog?.close());\n profileDialog?.addEventListener(\"click\", (e) => {\n if (e.target === profileDialog) {\n profileDialog.close();\n }\n });\n\n profileForm?.addEventListener(\"submit\", (e) => {\n e.preventDefault();\n if (profileForm) {\n this.handleSaveProfile(db, profileForm);\n }\n });\n\n // Profile select\n const profileSelect = root.querySelector(\".tools__profile-select\");\n profileSelect?.addEventListener(\"change\", (e) => {\n const select = e.target as HTMLSelectElement;\n const value = select.value;\n if (value) {\n toolsStore.activateProfile(db, value);\n showInfo(\"Profile activated\");\n } else {\n toolsStore.deactivateProfile(db);\n showInfo(\"Profile deactivated\");\n }\n });\n\n // Profile new button → open dialog\n root\n .querySelector(\".tools__profile-new-btn\")\n ?.addEventListener(\"click\", () => {\n if (profileDialog && profileForm) {\n profileForm.reset();\n // Populate provider dropdown\n const providerSelect = profileForm.querySelector(\n '[name=\"providerId\"]',\n );\n if (providerSelect) {\n providerSelect.replaceChildren();\n const defaultOption = document.createElement(\"option\");\n defaultOption.value = \"\";\n defaultOption.textContent = \"— Any provider —\";\n providerSelect.append(defaultOption);\n for (const pid of getAvailableProviders()) {\n const p = getProvider(pid);\n if (p) {\n const opt = document.createElement(\"option\");\n opt.value = pid;\n opt.textContent = p.name;\n providerSelect.appendChild(opt);\n }\n }\n }\n\n (profileDialog as HTMLDialogElement).showModal();\n }\n });\n\n // Profile save (overwrite active)\n root\n .querySelector(\".tools__profile-save-btn\")\n ?.addEventListener(\"click\", async () => {\n const activeId = toolsStore.activeProfileId;\n if (activeId) {\n await toolsStore.saveToActiveProfile(db);\n showSuccess(\"Profile saved\");\n } else {\n // No active profile — open new profile dialog\n root\n .querySelector(\".tools__profile-new-btn\")\n ?.dispatchEvent(new Event(\"click\"));\n }\n });\n\n // Profile delete\n root\n .querySelector(\".tools__profile-delete-btn\")\n ?.addEventListener(\"click\", async () => {\n const activeId = toolsStore.activeProfileId;\n if (!activeId) {\n showInfo(\"No profile selected\");\n\n return;\n }\n\n if (activeId.startsWith(\"__builtin_\")) {\n showInfo(\"Built-in profiles cannot be deleted\");\n\n return;\n }\n\n await toolsStore.deleteProfile(db, activeId);\n showSuccess(\"Profile deleted\");\n });\n\n // Dialog controls — Import\n const importDialog = root.querySelector(\n \".tools__import-dialog\",\n ) as HTMLDialogElement | null;\n const importCloseBtn = root.querySelector(\".tools__import-dialog-close\");\n const importCancelBtn = root.querySelector(\".tools__import-cancel-btn\");\n const importForm = root.querySelector(\n \".tools__import-dialog-form\",\n ) as HTMLFormElement | null;\n const importFetchBtn = root.querySelector(\".tools__import-fetch-btn\");\n\n root.querySelector(\".tools__import-btn\")?.addEventListener(\"click\", () => {\n if (importDialog && importForm) {\n importForm.reset();\n this.resetImportDialogState();\n importDialog.showModal();\n }\n });\n\n importCloseBtn?.addEventListener(\"click\", () => importDialog?.close());\n importCancelBtn?.addEventListener(\"click\", () => importDialog?.close());\n importDialog?.addEventListener(\"click\", (e) => {\n if (e.target === importDialog) {\n importDialog.close();\n }\n });\n\n root.querySelectorAll(\".tools__preset-btn\").forEach((btn) => {\n btn.addEventListener(\"click\", () => {\n const url = (btn as HTMLElement).dataset.url;\n const input = root.querySelector(\n \".tools__import-url-input\",\n ) as HTMLInputElement | null;\n if (input && url) {\n input.value = url;\n this.handleFetchSite(db, url);\n }\n });\n });\n\n importFetchBtn?.addEventListener(\"click\", () => {\n const input = root.querySelector(\n \".tools__import-url-input\",\n ) as HTMLInputElement | null;\n if (input && input.value.trim()) {\n this.handleFetchSite(db, input.value.trim());\n }\n });\n\n importForm?.addEventListener(\"submit\", (e) => {\n e.preventDefault();\n if (importForm) {\n this.handleImportSubmit(db, importForm);\n }\n });\n }\n\n handleBackup() {\n const json = toolsStore.exportBackup();\n const blob = new Blob([json], { type: \"application/json\" });\n const url = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = `shadowclaw-tools-${Date.now()}.json`;\n a.click();\n URL.revokeObjectURL(url);\n showSuccess(\"Tools config exported\");\n }\n\n /**\n * Open the clone tool dialog for a given source tool.\n */\n openCloneDialog(sourceToolName: string) {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const cloneDialog = root.querySelector(\n \".tools__clone-dialog\",\n ) as HTMLDialogElement | null;\n const cloneForm = root.querySelector(\n \".tools__clone-dialog-form\",\n ) as HTMLFormElement | null;\n if (!cloneDialog || !cloneForm) {\n return;\n }\n\n cloneForm.reset();\n const sourceInput = cloneForm.querySelector(\n '[name=\"source\"]',\n ) as HTMLInputElement | null;\n if (sourceInput) {\n sourceInput.value = sourceToolName;\n }\n\n cloneDialog.showModal();\n }\n\n renderImportCatalog(manifest: RemoteManifest) {\n const root = this.shadowRoot;\n if (!root) return;\n\n const catalog = root.querySelector(\".tools__import-catalog\");\n if (!catalog) return;\n catalog.replaceChildren();\n\n // 1. Render Tools\n const tools = manifest.tools || [];\n if (tools.length > 0) {\n const category = document.createElement(\"div\");\n category.className = \"tools__import-category\";\n\n const header = document.createElement(\"div\");\n header.className = \"tools__import-category-header\";\n header.textContent = `🛠️ Tools (${tools.length})`;\n category.appendChild(header);\n\n for (const tool of tools) {\n const item = document.createElement(\"div\");\n item.className = \"tools__import-item\";\n\n const itemHeader = document.createElement(\"div\");\n itemHeader.className = \"tools__import-item-header\";\n\n const checkbox = document.createElement(\"input\");\n checkbox.type = \"checkbox\";\n checkbox.name = \"importTool\";\n checkbox.value = tool.name;\n checkbox.checked = true;\n checkbox.id = `import_tool_${tool.name}`;\n itemHeader.appendChild(checkbox);\n\n const titleLabel = document.createElement(\"label\");\n titleLabel.htmlFor = checkbox.id;\n titleLabel.className = \"tools__import-item-title\";\n titleLabel.textContent = tool.name;\n itemHeader.appendChild(titleLabel);\n\n const badge = document.createElement(\"span\");\n badge.className = \"tools__item-badge tools__item-badge--declarative\";\n badge.textContent = tool.executionType || \"declarative\";\n itemHeader.appendChild(badge);\n\n item.appendChild(itemHeader);\n\n if (tool.description) {\n const desc = document.createElement(\"div\");\n desc.className = \"tools__import-item-desc\";\n desc.textContent = tool.description;\n item.appendChild(desc);\n }\n\n category.appendChild(item);\n }\n\n catalog.appendChild(category);\n }\n\n // 2. Render Skills\n const skills = manifest.skills || [];\n if (skills.length > 0) {\n const category = document.createElement(\"div\");\n category.className = \"tools__import-category\";\n\n const header = document.createElement(\"div\");\n header.className = \"tools__import-category-header\";\n header.textContent = `🧠 Agent Skills (${skills.length})`;\n category.appendChild(header);\n\n for (const skill of skills) {\n const item = document.createElement(\"div\");\n item.className = \"tools__import-item\";\n\n const itemHeader = document.createElement(\"div\");\n itemHeader.className = \"tools__import-item-header\";\n\n const checkbox = document.createElement(\"input\");\n checkbox.type = \"checkbox\";\n checkbox.name = \"importSkill\";\n checkbox.value = skill.name;\n checkbox.checked = true;\n checkbox.id = `import_skill_${skill.name}`;\n itemHeader.appendChild(checkbox);\n\n const titleLabel = document.createElement(\"label\");\n titleLabel.htmlFor = checkbox.id;\n titleLabel.className = \"tools__import-item-title\";\n titleLabel.textContent = skill.name;\n itemHeader.appendChild(titleLabel);\n\n const badge = document.createElement(\"span\");\n badge.className = \"tools__item-badge\";\n badge.textContent = \"skill\";\n itemHeader.appendChild(badge);\n\n item.appendChild(itemHeader);\n\n if (skill.description) {\n const desc = document.createElement(\"div\");\n desc.className = \"tools__import-item-desc\";\n desc.textContent = skill.description;\n item.appendChild(desc);\n }\n\n category.appendChild(item);\n }\n\n catalog.appendChild(category);\n }\n\n // 3. Render Scripts\n const scripts = manifest.scripts || [];\n if (scripts.length > 0) {\n const category = document.createElement(\"div\");\n category.className = \"tools__import-category\";\n\n const header = document.createElement(\"div\");\n header.className = \"tools__import-category-header\";\n header.textContent = `📜 Companion Scripts (${scripts.length})`;\n category.appendChild(header);\n\n for (const script of scripts) {\n const item = document.createElement(\"div\");\n item.className = \"tools__import-item\";\n\n const itemHeader = document.createElement(\"div\");\n itemHeader.className = \"tools__import-item-header\";\n\n const checkbox = document.createElement(\"input\");\n checkbox.type = \"checkbox\";\n checkbox.name = \"importScript\";\n checkbox.value = script.name;\n checkbox.checked = true;\n checkbox.id = `import_script_${script.name}`;\n itemHeader.appendChild(checkbox);\n\n const titleLabel = document.createElement(\"label\");\n titleLabel.htmlFor = checkbox.id;\n titleLabel.className = \"tools__import-item-title\";\n titleLabel.textContent = script.name;\n itemHeader.appendChild(titleLabel);\n\n const badge = document.createElement(\"span\");\n badge.className = \"tools__item-badge\";\n badge.textContent = \"script\";\n itemHeader.appendChild(badge);\n\n item.appendChild(itemHeader);\n\n if (script.description) {\n const desc = document.createElement(\"div\");\n desc.className = \"tools__import-item-desc\";\n desc.textContent = script.description;\n item.appendChild(desc);\n }\n\n category.appendChild(item);\n }\n\n catalog.appendChild(category);\n }\n }\n\n resetImportDialogState() {\n this.currentRemoteManifest = null;\n const root = this.shadowRoot;\n if (!root) return;\n\n const statusEl = root.querySelector(\n \".tools__import-manifest-status\",\n ) as HTMLElement | null;\n if (statusEl) statusEl.hidden = true;\n\n const siteName = root.querySelector(\".tools__import-site-name\");\n if (siteName) siteName.textContent = \"\";\n\n const siteDesc = root.querySelector(\".tools__import-site-desc\");\n if (siteDesc) siteDesc.textContent = \"\";\n\n const catalog = root.querySelector(\".tools__import-catalog\");\n if (catalog) catalog.replaceChildren();\n\n const submitBtn = root.querySelector(\n \".tools__import-submit-btn\",\n ) as HTMLButtonElement | null;\n if (submitBtn) submitBtn.disabled = true;\n }\n\n setupEffects(db: ShadowClawDatabase) {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n // Reactive re-render on tool store changes\n this.addCleanup(\n effect(() => {\n toolsStore.enabledToolNames;\n toolsStore.customTools;\n toolsStore.declarativeTools;\n toolsStore.declarativeToolNamesEnabled;\n toolsStore.systemPromptOverride;\n toolsStore.profiles;\n toolsStore.activeProfileId;\n this.updateToolList(db);\n }),\n );\n\n // WebMCP opt-in toggle\n const webMcpToggle = root.querySelector(\n \".tools__webmcp-toggle\",\n ) as HTMLInputElement | null;\n const internetAccessToggle = root.querySelector(\n \".tools__internet-access-toggle\",\n ) as HTMLInputElement | null;\n const webMcpModeSelect = root.querySelector(\n \".tools__webmcp-mode\",\n ) as HTMLSelectElement | null;\n\n if (webMcpToggle) {\n // Sync checked state and mode when orchestrator becomes available\n this.addCleanup(\n effect(() => {\n if (orchestratorStore.ready) {\n this.orchestrator = orchestratorStore.orchestrator;\n webMcpToggle.checked =\n this.orchestrator?.webMcpToolsEnabled === true;\n if (webMcpModeSelect && this.orchestrator) {\n webMcpModeSelect.value = getWebMcpMode() || \"polyfill\";\n }\n }\n }),\n );\n }\n\n if (internetAccessToggle) {\n this.addCleanup(\n effect(() => {\n internetAccessToggle.checked =\n orchestratorStore.vmBashFullInternetAccess;\n }),\n );\n }\n\n // Web Search reactive effects\n const webSearchProxyToggle = root.querySelector(\n \".tools__websearch-proxy-toggle\",\n ) as HTMLInputElement | null;\n const webSearchProxyUrlInput = root.querySelector(\n \".tools__websearch-proxy-url-input\",\n ) as HTMLInputElement | null;\n const webSearchUrlInput = root.querySelector(\n \".tools__websearch-url-input\",\n ) as HTMLInputElement | null;\n\n if (webSearchProxyToggle) {\n this.addCleanup(\n effect(() => {\n webSearchProxyToggle.checked = toolsStore.webSearchUseProxy;\n }),\n );\n }\n\n if (webSearchProxyUrlInput) {\n this.addCleanup(\n effect(() => {\n if (\n document.activeElement !== webSearchProxyUrlInput &&\n !webSearchProxyUrlInput.matches(\":focus\")\n ) {\n webSearchProxyUrlInput.value = toolsStore.webSearchProxyUrl;\n }\n }),\n );\n }\n\n if (webSearchUrlInput) {\n this.addCleanup(\n effect(() => {\n if (\n document.activeElement !== webSearchUrlInput &&\n !webSearchUrlInput.matches(\":focus\")\n ) {\n webSearchUrlInput.value = toolsStore.webSearchUrl;\n }\n }),\n );\n }\n\n // Search Files reactive effects\n const searchFilesMaxFileBytesInput = root.querySelector(\n \".tools__searchfiles-max-file-bytes-input\",\n ) as HTMLInputElement | null;\n const searchFilesMaxFilesVisitedInput = root.querySelector(\n \".tools__searchfiles-max-files-visited-input\",\n ) as HTMLInputElement | null;\n const searchFilesSkipDirsInput = root.querySelector(\n \".tools__searchfiles-skip-dirs-input\",\n ) as HTMLInputElement | null;\n\n if (searchFilesMaxFileBytesInput) {\n this.addCleanup(\n effect(() => {\n if (\n document.activeElement !== searchFilesMaxFileBytesInput &&\n !searchFilesMaxFileBytesInput.matches(\":focus\")\n ) {\n searchFilesMaxFileBytesInput.value = String(\n toolsStore.searchFilesMaxFileBytes,\n );\n }\n }),\n );\n }\n\n if (searchFilesMaxFilesVisitedInput) {\n this.addCleanup(\n effect(() => {\n if (\n document.activeElement !== searchFilesMaxFilesVisitedInput &&\n !searchFilesMaxFilesVisitedInput.matches(\":focus\")\n ) {\n searchFilesMaxFilesVisitedInput.value = String(\n toolsStore.searchFilesMaxFilesVisited,\n );\n }\n }),\n );\n }\n\n if (searchFilesSkipDirsInput) {\n this.addCleanup(\n effect(() => {\n if (\n document.activeElement !== searchFilesSkipDirsInput &&\n !searchFilesSkipDirsInput.matches(\":focus\")\n ) {\n searchFilesSkipDirsInput.value = toolsStore.searchFilesSkipDirs;\n }\n }),\n );\n }\n }\n\n /** Update the profile dropdown to reflect current state. */\n updateProfileSelector() {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const select = root.querySelector(\".tools__profile-select\");\n if (!select) {\n return;\n }\n\n const profiles = toolsStore.profiles;\n const activeId = toolsStore.activeProfileId;\n\n // Preserve selection\n select.replaceChildren();\n const defaultOption = document.createElement(\"option\");\n defaultOption.value = \"\";\n defaultOption.textContent = \"— No profile (manual config) —\";\n select.append(defaultOption);\n for (const p of profiles) {\n const opt = document.createElement(\"option\");\n opt.value = p.id;\n const isBuiltin = p.id.startsWith(\"__builtin_\");\n const providerLabel = p.providerId\n ? getProvider(p.providerId)?.name || p.providerId\n : \"any\";\n const modelLabel = p.model || \"any\";\n opt.textContent = isBuiltin\n ? `⚡ ${p.name} (${providerLabel})`\n : `${p.name} (${providerLabel} / ${modelLabel})`;\n if (p.id === activeId) {\n opt.selected = true;\n }\n\n select.appendChild(opt);\n }\n\n // Disable delete button for built-in profiles\n const deleteBtn = root.querySelector(\n \".tools__profile-delete-btn\",\n ) as HTMLButtonElement | null;\n if (deleteBtn) {\n const isBuiltinActive = activeId?.startsWith(\"__builtin_\");\n deleteBtn.disabled = !!isBuiltinActive;\n deleteBtn.title = isBuiltinActive\n ? \"Built-in profiles cannot be deleted\"\n : \"\";\n }\n }\n\n updateToolList(db: ShadowClawDatabase) {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const list = root.querySelector(\".tools__list\");\n if (!list) {\n return;\n }\n\n const enabled = toolsStore.enabledToolNames;\n const allTools = toolsStore.allTools;\n const declarativeTools = toolsStore.declarativeTools;\n\n const existingCheckboxes = list.querySelectorAll<HTMLInputElement>(\n \".tools__item-checkbox[data-tool]\",\n );\n const existingToolNames = Array.from(existingCheckboxes).map(\n (cb) => cb.getAttribute(\"data-tool\") || \"\",\n );\n const targetToolNames = [\n ...allTools.map((t) => t.name),\n ...declarativeTools.map((t) => t.name),\n ];\n\n const isSameStructure =\n existingToolNames.length === targetToolNames.length &&\n existingToolNames.every((name, i) => name === targetToolNames[i]);\n\n if (isSameStructure) {\n for (const cb of existingCheckboxes) {\n const toolName = cb.getAttribute(\"data-tool\");\n if (!toolName) continue;\n const isDeclarative = declarativeTools.some((t) => t.name === toolName);\n const isChecked = isDeclarative\n ? toolsStore.isDeclarativeToolEnabled(toolName)\n : enabled.has(toolName);\n if (cb.checked !== isChecked) {\n cb.checked = isChecked;\n }\n }\n } else {\n list.replaceChildren();\n\n for (const tool of allTools) {\n const isCustom = !BUILTIN_TOOL_NAMES.has(tool.name);\n const isChecked = enabled.has(tool.name);\n const brief = tool.description.split(\". \")[0];\n\n const item = document.createElement(\"div\");\n item.className = \"tools__item\";\n item.setAttribute(\"role\", \"listitem\");\n\n const checkbox = document.createElement(\"input\");\n checkbox.type = \"checkbox\";\n checkbox.className = \"tools__item-checkbox\";\n checkbox.setAttribute(\"data-tool\", tool.name);\n checkbox.setAttribute(\"aria-label\", `Enable ${tool.name}`);\n checkbox.checked = isChecked;\n\n const info = document.createElement(\"div\");\n info.className = \"tools__item-info\";\n\n const name = document.createElement(\"div\");\n name.className = \"tools__item-name\";\n name.textContent = tool.name;\n\n const desc = document.createElement(\"div\");\n desc.className = \"tools__item-desc\";\n desc.setAttribute(\"title\", tool.description);\n desc.textContent = brief;\n info.append(name, desc);\n\n const cloneBtn = document.createElement(\"button\");\n cloneBtn.className = \"tools__item-clone\";\n cloneBtn.setAttribute(\"data-clone\", tool.name);\n cloneBtn.setAttribute(\"aria-label\", `Clone ${tool.name}`);\n cloneBtn.setAttribute(\"title\", \"Clone tool\");\n cloneBtn.textContent = \"📋\";\n\n item.append(checkbox, info);\n\n if (isCustom) {\n const badge = document.createElement(\"span\");\n badge.className = \"tools__item-badge\";\n badge.textContent = \"custom\";\n item.append(badge);\n }\n\n item.append(cloneBtn);\n\n let deleteBtn: HTMLButtonElement | null = null;\n if (isCustom) {\n deleteBtn = document.createElement(\"button\");\n deleteBtn.className = \"tools__item-delete\";\n deleteBtn.setAttribute(\"data-delete\", tool.name);\n deleteBtn.setAttribute(\"aria-label\", `Delete ${tool.name}`);\n deleteBtn.textContent = \"🗑️\";\n item.append(deleteBtn);\n }\n\n // Toggle\n checkbox?.addEventListener(\"change\", () => {\n toolsStore.setToolEnabled(db, tool.name, checkbox.checked);\n });\n\n // Clone\n cloneBtn?.addEventListener(\"click\", () => {\n this.openCloneDialog(tool.name);\n });\n\n // Delete custom tool\n deleteBtn?.addEventListener(\"click\", () => {\n toolsStore.removeCustomTool(db, tool.name);\n showInfo(`Removed custom tool: ${tool.name}`);\n });\n\n list.appendChild(item);\n }\n\n for (const tool of declarativeTools) {\n const isChecked = toolsStore.isDeclarativeToolEnabled(tool.name);\n const brief = tool.description.split(\". \")[0];\n\n const item = document.createElement(\"div\");\n item.className = \"tools__item\";\n item.setAttribute(\"role\", \"listitem\");\n\n const checkbox = document.createElement(\"input\");\n checkbox.type = \"checkbox\";\n checkbox.className = \"tools__item-checkbox\";\n checkbox.setAttribute(\"data-tool\", tool.name);\n checkbox.setAttribute(\"aria-label\", `Enable ${tool.name}`);\n checkbox.checked = isChecked;\n\n const info = document.createElement(\"div\");\n info.className = \"tools__item-info\";\n\n const name = document.createElement(\"div\");\n name.className = \"tools__item-name\";\n name.textContent = tool.name;\n\n const desc = document.createElement(\"div\");\n desc.className = \"tools__item-desc\";\n desc.setAttribute(\"title\", tool.description);\n desc.textContent = brief;\n info.append(name, desc);\n\n const badge = document.createElement(\"span\");\n badge.className = \"tools__item-badge tools__item-badge--declarative\";\n badge.textContent = \"declarative\";\n item.append(checkbox, info, badge);\n\n checkbox.addEventListener(\"change\", () => {\n toolsStore.setDeclarativeToolEnabled(db, tool.name, checkbox.checked);\n });\n\n list.appendChild(item);\n }\n }\n\n // Update count\n const countEl = root.querySelector(\".tools__count\");\n if (countEl) {\n const enabledBuiltinCount = (toolsStore.enabledTools || []).length;\n const enabledDeclarativeCount = (toolsStore.enabledDeclarativeTools || [])\n .length;\n const totalEnabled = enabledBuiltinCount + enabledDeclarativeCount;\n const totalCount = allTools.length + declarativeTools.length;\n countEl.textContent = `${totalEnabled} of ${totalCount} enabled`;\n }\n\n // Update prompt textarea\n const textarea = root.querySelector(\".tools__prompt-area\");\n if (\n textarea instanceof HTMLTextAreaElement &&\n document.activeElement !== textarea &&\n !textarea.matches(\":focus\")\n ) {\n textarea.value = toolsStore.systemPromptOverride;\n }\n\n // Update profile selector\n this.updateProfileSelector();\n }\n\n async handleAddTool(db: ShadowClawDatabase, form: HTMLFormElement) {\n const data = new FormData(form);\n const name = String(data.get(\"name\") || \"\").trim();\n const description = String(data.get(\"description\") || \"\").trim();\n const schemaStr = String(data.get(\"input_schema\") || \"\").trim();\n\n if (!name || !description) {\n showError(\"Name and description are required\");\n\n return;\n }\n\n // Check uniqueness\n if (toolsStore.allTools.some((t) => t.name === name)) {\n showError(`A tool named \"${name}\" already exists`);\n\n return;\n }\n\n let input_schema = { type: \"object\", properties: {} };\n if (schemaStr) {\n try {\n input_schema = JSON.parse(schemaStr);\n } catch {\n showError(\"Invalid JSON in input schema\");\n\n return;\n }\n }\n\n await toolsStore.addCustomTool(db, { name, description, input_schema });\n showSuccess(`Added custom tool: ${name}`);\n\n const dialog = this.shadowRoot?.querySelector(\n \".tools__dialog\",\n ) as HTMLDialogElement | null;\n dialog?.close();\n }\n\n async handleCloneTool(db: ShadowClawDatabase, form: HTMLFormElement) {\n const data = new FormData(form);\n const sourceToolName = String(data.get(\"source\") || \"\").trim();\n const newName = String(data.get(\"name\") || \"\").trim();\n const newDesc = String(data.get(\"description\") || \"\").trim();\n\n if (!sourceToolName || !newName) {\n showError(\"Source and new tool name are required\");\n\n return;\n }\n\n const ok = await toolsStore.cloneTool(\n db,\n sourceToolName,\n newName,\n newDesc || undefined,\n );\n if (!ok) {\n showError(\n `Clone failed: source not found or name \"${newName}\" already exists.`,\n );\n\n return;\n }\n\n showSuccess(`Cloned \"${sourceToolName}\" → \"${newName}\"`);\n const cloneDialog = this.shadowRoot?.querySelector(\n \".tools__clone-dialog\",\n ) as HTMLDialogElement | null;\n cloneDialog?.close();\n }\n\n async handleFetchSite(_db: ShadowClawDatabase, url: string) {\n const root = this.shadowRoot;\n if (!root) return;\n\n const fetchBtn = root.querySelector(\n \".tools__import-fetch-btn\",\n ) as HTMLButtonElement | null;\n const origText = fetchBtn?.textContent || \"🔍 Fetch\";\n if (fetchBtn) {\n fetchBtn.disabled = true;\n fetchBtn.textContent = \"Fetching...\";\n }\n\n try {\n const resolved = await toolsStore.fetchRemoteDiscoveryManifest(url);\n this.currentRemoteManifest = resolved.manifest;\n\n const siteName = root.querySelector(\".tools__import-site-name\");\n if (siteName)\n siteName.textContent = resolved.manifest.name || \"Remote Site\";\n\n const siteDesc = root.querySelector(\".tools__import-site-desc\");\n if (siteDesc) {\n siteDesc.textContent =\n resolved.manifest.description || \"No description provided.\";\n }\n\n this.renderImportCatalog(resolved.manifest);\n\n const statusEl = root.querySelector(\n \".tools__import-manifest-status\",\n ) as HTMLElement | null;\n if (statusEl) statusEl.hidden = false;\n\n const submitBtn = root.querySelector(\n \".tools__import-submit-btn\",\n ) as HTMLButtonElement | null;\n if (submitBtn) submitBtn.disabled = false;\n\n showInfo(\n `Discovered ${(resolved.manifest.tools || []).length} tools, ${(resolved.manifest.skills || []).length} skills from ${resolved.manifest.name}`,\n );\n } catch (err) {\n this.resetImportDialogState();\n showError(\n `Failed to fetch site: ${err instanceof Error ? err.message : String(err)}`,\n );\n } finally {\n if (fetchBtn) {\n fetchBtn.disabled = false;\n fetchBtn.textContent = origText;\n }\n }\n }\n\n async handleImportSubmit(db: ShadowClawDatabase, form: HTMLFormElement) {\n if (!this.currentRemoteManifest) {\n showError(\"No remote discovery manifest loaded.\");\n return;\n }\n\n const formData = new FormData(form);\n const toolNames = formData.getAll(\"importTool\").map(String);\n const skillNames = formData.getAll(\"importSkill\").map(String);\n const scriptNames = formData.getAll(\"importScript\").map(String);\n\n if (\n toolNames.length === 0 &&\n skillNames.length === 0 &&\n scriptNames.length === 0\n ) {\n showError(\"Please select at least one tool, skill, or script to import.\");\n return;\n }\n\n const autoEnable =\n (form.querySelector(\".tools__import-auto-enable\") as HTMLInputElement)\n ?.checked ?? true;\n const overwrite =\n (form.querySelector(\".tools__import-overwrite\") as HTMLInputElement)\n ?.checked ?? false;\n\n const submitBtn = form.querySelector(\n \".tools__import-submit-btn\",\n ) as HTMLButtonElement | null;\n if (submitBtn) {\n submitBtn.disabled = true;\n submitBtn.textContent = \"Importing...\";\n }\n\n try {\n const result = await toolsStore.importFromRemoteSite(\n db,\n this.currentRemoteManifest,\n { toolNames, skillNames, scriptNames },\n { autoEnable, overwrite },\n );\n\n const importedToolsCount = result.tools.filter(\n (t) => t.status === \"imported\",\n ).length;\n const importedSkillsCount = result.skills.filter(\n (s) => s.status === \"imported\",\n ).length;\n const importedScriptsCount = result.scripts.filter(\n (sc) => sc.status === \"imported\",\n ).length;\n\n const totalCount =\n importedToolsCount + importedSkillsCount + importedScriptsCount;\n\n showSuccess(\n `Successfully imported ${totalCount} items from ${this.currentRemoteManifest.name || \"site\"}!`,\n );\n\n const dialog = this.shadowRoot?.querySelector(\n \".tools__import-dialog\",\n ) as HTMLDialogElement | null;\n dialog?.close();\n } catch (err) {\n showError(\n `Import failed: ${err instanceof Error ? err.message : String(err)}`,\n );\n } finally {\n if (submitBtn) {\n submitBtn.disabled = false;\n submitBtn.textContent = \"Import Selected\";\n }\n }\n }\n\n async handleRestore(db: ShadowClawDatabase, input: HTMLInputElement) {\n const file = input.files?.[0];\n if (!file) {\n return;\n }\n\n try {\n const text = await file.text();\n await toolsStore.importBackup(db, text);\n showSuccess(\"Tools config restored\");\n } catch (err) {\n showError(\n `Failed to restore: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n\n input.value = \"\";\n }\n\n async handleSaveProfile(db: ShadowClawDatabase, form: HTMLFormElement) {\n const data = new FormData(form);\n const name = String(data.get(\"name\") || \"\").trim();\n const providerId = String(data.get(\"providerId\") || \"\").trim();\n const model = String(data.get(\"model\") || \"\").trim();\n\n if (!name) {\n showError(\"Profile name is required\");\n\n return;\n }\n\n const profile = {\n id: ulid(),\n name,\n providerId: providerId || undefined,\n model: model || undefined,\n enabledToolNames: [...toolsStore.enabledToolNames],\n customTools: [...toolsStore.customTools],\n systemPromptOverride: toolsStore.systemPromptOverride,\n };\n\n await toolsStore.addProfile(db, profile);\n await toolsStore.activateProfile(db, profile.id);\n showSuccess(`Profile \"${name}\" created and activated`);\n\n const profileDialog = this.shadowRoot?.querySelector(\n \".tools__profile-dialog\",\n ) as HTMLDialogElement | null;\n profileDialog?.close();\n }\n}\n\nif (!customElements.get(elementName)) {\n customElements.define(elementName, ShadowClawTools);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}
@@ -2,7 +2,7 @@ import ShadowClawElement from "./components/shadow-claw-element.js";
2
2
  import { n as getDb } from "./db-JvwBIcoE.js";
3
3
  import { f as DEFAULT_VM_BOOT_HOST, n as BASH_MAX_TIMEOUT_SEC, r as CONFIG_KEYS } from "./config-Dalol4GN.js";
4
4
  import { t as getConfig } from "./get-config-DNjQ4Qoj.js";
5
- import { D as setVMBootMode, E as setVMBootHost, O as setVMNetworkRelayURL, b as setVMBashTimeout, t as orchestratorStore } from "./orchestrator-Dh-hnIpK.js";
5
+ import { D as setVMBootMode, E as setVMBootHost, O as setVMNetworkRelayURL, b as setVMBashTimeout, t as orchestratorStore } from "./orchestrator-Cda13e5U.js";
6
6
  import { a as showSuccess, r as showError, s as showWarning } from "./toast-Ck7OIKDf.js";
7
7
  import { t as effect } from "./effect-DL6j9HJp.js";
8
8
 
@@ -348,4 +348,4 @@ if (!customElements.get(elementName)) customElements.define(elementName, ShadowC
348
348
 
349
349
  //#endregion
350
350
  export { ShadowClawWebvm as t };
351
- //# sourceMappingURL=shadow-claw-webvm-BL9cgrP9.js.map
351
+ //# sourceMappingURL=shadow-claw-webvm-CnW-hoJ8.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"shadow-claw-webvm-BL9cgrP9.js","names":["shadowClawWebvmStyles","shadowClawWebvmTemplate"],"sources":["../../src/components/settings/shadow-claw-webvm/shadow-claw-webvm.ts"],"sourcesContent":["import {\n BASH_DEFAULT_TIMEOUT_SEC,\n BASH_MAX_TIMEOUT_SEC,\n CONFIG_KEYS,\n DEFAULT_VM_BOOT_HOST,\n} from \"../../../config/config.js\";\n\nimport { effect } from \"../../../core/effect.js\";\n\nimport {\n setVMBootHost,\n setVMBootMode,\n setVMNetworkRelayURL,\n} from \"../../../core/orchestrator/utils/operations/vm.js\";\n\nimport { setVMBashTimeout } from \"../../../core/orchestrator/utils/settings.js\";\nimport { getDb } from \"../../../db/db.js\";\nimport { getConfig } from \"../../../db/get-config.js\";\nimport { orchestratorStore } from \"../../../stores/orchestrator.js\";\nimport { showError, showSuccess, showWarning } from \"../../../ui/toast.js\";\n\nimport type { Orchestrator } from \"../../../core/orchestrator/orchestrator.js\";\nimport type { ShadowClawDatabase } from \"../../../db/types.js\";\n\nimport ShadowClawElement from \"../../shadow-claw-element.js\";\nimport shadowClawWebvmStyles from \"./shadow-claw-webvm.css\" with { type: \"css\" };\nimport shadowClawWebvmTemplate from \"./shadow-claw-webvm.html\" with { type: \"html\" };\n\nconst elementName = \"shadow-claw-webvm\";\n\n/**\n * Settings sub-component for WebVM configuration:\n * boot mode, bash timeout, boot host, network relay URL.\n */\nexport class ShadowClawWebvm extends ShadowClawElement {\n static styles = shadowClawWebvmStyles;\n static template = shadowClawWebvmTemplate;\n\n db: ShadowClawDatabase | null = null;\n orchestrator: Orchestrator | null = null;\n\n constructor() {\n super();\n }\n\n async connectedCallback() {\n const root = this.shadowRoot;\n if (!root) {\n throw new Error(\"shadowRoot not found\");\n }\n\n this.bindEventListeners();\n this.setupEffects();\n }\n\n /**\n * Bind all event listeners.\n */\n bindEventListeners() {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n root\n .querySelector('[data-action=\"save-vm-boot-mode\"]')\n ?.addEventListener(\"click\", () => this.saveVMBootMode());\n\n root\n .querySelector('[data-action=\"save-vm-bash-timeout\"]')\n ?.addEventListener(\"click\", () => this.saveVMBashTimeout());\n\n root\n .querySelector('[data-action=\"save-vm-boot-host\"]')\n ?.addEventListener(\"click\", () => this.saveVMBootHost());\n\n root\n .querySelector('[data-action=\"save-vm-network-relay-url\"]')\n ?.addEventListener(\"click\", () => this.saveVMNetworkRelayURL());\n }\n\n /**\n * Set up reactive effects.\n */\n setupEffects() {\n effect(() => {\n if (orchestratorStore.ready) {\n void (async () => {\n this.db = await getDb();\n this.orchestrator = orchestratorStore.orchestrator;\n await this.render();\n })();\n }\n });\n }\n\n /**\n * Load and populate all WebVM settings fields.\n */\n async render() {\n if (!this.db) {\n return;\n }\n\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n try {\n // Boot mode\n const vmBootModeSelect = root.querySelector(\n '[data-setting=\"vm-boot-mode-select\"]',\n ) as HTMLSelectElement | null;\n const vmBootMode = await getConfig(this.db, CONFIG_KEYS.VM_BOOT_MODE);\n const normalizedVMBootMode =\n vmBootMode === \"disabled\" ||\n vmBootMode === \"9p\" ||\n vmBootMode === \"ext2\" ||\n vmBootMode === \"auto\"\n ? vmBootMode\n : \"disabled\";\n if (vmBootModeSelect) {\n vmBootModeSelect.value = normalizedVMBootMode;\n }\n\n // Bash timeout\n const vmBashTimeoutInput = root.querySelector(\n '[data-setting=\"vm-bash-timeout-input\"]',\n ) as HTMLInputElement | null;\n const vmBashTimeoutRaw = await getConfig(\n this.db,\n CONFIG_KEYS.VM_BASH_TIMEOUT_SEC,\n );\n const vmBashTimeoutParsed = Number(vmBashTimeoutRaw);\n const normalizedVMBashTimeout = Number.isFinite(vmBashTimeoutParsed)\n ? Math.min(\n Math.max(Math.floor(vmBashTimeoutParsed), 1),\n BASH_MAX_TIMEOUT_SEC,\n )\n : BASH_DEFAULT_TIMEOUT_SEC;\n if (vmBashTimeoutInput) {\n vmBashTimeoutInput.value = String(normalizedVMBashTimeout);\n }\n\n // Boot host\n const vmBootHostInput = root.querySelector(\n '[data-setting=\"vm-boot-host-input\"]',\n ) as HTMLInputElement | null;\n const vmBootHostRaw = await getConfig(this.db, CONFIG_KEYS.VM_BOOT_HOST);\n if (vmBootHostInput) {\n vmBootHostInput.value =\n typeof vmBootHostRaw === \"string\"\n ? vmBootHostRaw.trim()\n : DEFAULT_VM_BOOT_HOST;\n }\n\n // Network relay URL\n const vmNetworkRelayURLInput = root.querySelector(\n '[data-setting=\"vm-network-relay-url-input\"]',\n ) as HTMLInputElement | null;\n const vmNetworkRelayURLRaw = await getConfig(\n this.db,\n CONFIG_KEYS.VM_NETWORK_RELAY_URL,\n );\n if (vmNetworkRelayURLInput && typeof vmNetworkRelayURLRaw === \"string\") {\n vmNetworkRelayURLInput.value = vmNetworkRelayURLRaw.trim();\n }\n } catch (e) {\n console.warn(\"Could not load WebVM settings:\", e);\n }\n }\n\n /**\n * Save default bash timeout.\n */\n async saveVMBashTimeout() {\n if (!this.orchestrator || !this.db) {\n return;\n }\n\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const input = root.querySelector(\n '[data-setting=\"vm-bash-timeout-input\"]',\n ) as HTMLInputElement | null;\n const parsed = Number(input?.value);\n\n if (!Number.isFinite(parsed)) {\n showWarning(\"Please enter a valid timeout in seconds\", 3000);\n\n return;\n }\n\n const normalized = Math.min(\n Math.max(Math.floor(parsed), 1),\n BASH_MAX_TIMEOUT_SEC,\n );\n if (input) {\n input.value = String(normalized);\n }\n\n try {\n await setVMBashTimeout(this.orchestrator, this.db, normalized);\n showSuccess(\"WebVM bash timeout saved\", 3000);\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n showError(\"Error saving WebVM bash timeout: \" + errorMsg, 6000);\n }\n }\n\n /**\n * Save boot host URL.\n */\n async saveVMBootHost() {\n if (!this.orchestrator || !this.db) {\n return;\n }\n\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const input = root.querySelector(\n '[data-setting=\"vm-boot-host-input\"]',\n ) as HTMLInputElement | null;\n const value = input?.value?.trim() || \"\";\n\n if (value) {\n try {\n const parsed = new URL(value);\n if (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\n throw new Error(\"Boot host must use http:// or https://\");\n }\n } catch {\n showWarning(\"Please enter a valid HTTP(S) boot host URL\", 3500);\n\n return;\n }\n }\n\n try {\n await setVMBootHost(this.orchestrator, this.db, value);\n showSuccess(\"WebVM boot host saved\", 3000);\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n showError(\"Error saving WebVM boot host: \" + errorMsg, 6000);\n }\n }\n\n /**\n * Save VM boot mode.\n */\n async saveVMBootMode() {\n if (!this.orchestrator || !this.db) {\n return;\n }\n\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const select = root.querySelector(\n '[data-setting=\"vm-boot-mode-select\"]',\n ) as HTMLSelectElement | null;\n const selected = select?.value || \"disabled\";\n const mode =\n selected === \"disabled\" ||\n selected === \"9p\" ||\n selected === \"ext2\" ||\n selected === \"auto\"\n ? selected\n : \"disabled\";\n\n try {\n await setVMBootMode(this.orchestrator, this.db, mode);\n showSuccess(\"WebVM boot mode saved\", 3000);\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n showError(\"Error saving WebVM mode: \" + errorMsg, 6000);\n }\n }\n\n /**\n * Save network relay URL.\n */\n async saveVMNetworkRelayURL() {\n if (!this.orchestrator || !this.db) {\n return;\n }\n\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const input = root.querySelector(\n '[data-setting=\"vm-network-relay-url-input\"]',\n ) as HTMLInputElement | null;\n const value = input?.value?.trim() || \"\";\n\n if (value) {\n try {\n const parsed = new URL(value);\n if (parsed.protocol !== \"ws:\" && parsed.protocol !== \"wss:\") {\n throw new Error(\"Relay URL must use ws:// or wss://\");\n }\n } catch {\n showWarning(\"Please enter a valid ws:// or wss:// relay URL\", 3500);\n\n return;\n }\n }\n\n if (input) {\n input.value = value;\n }\n\n try {\n await setVMNetworkRelayURL(this.orchestrator, this.db, value);\n showSuccess(\"WebVM relay URL saved\", 3000);\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n showError(\"Error saving WebVM relay URL: \" + errorMsg, 6000);\n }\n }\n}\n\nif (!customElements.get(elementName)) {\n customElements.define(elementName, ShadowClawWebvm);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BA,MAAM,cAAc;;;;;AAMpB,IAAa,kBAAb,cAAqC,kBAAkB;CACrD,OAAO,SAASA;CAChB,OAAO,WAAWC;CAElB,KAAgC;CAChC,eAAoC;CAEpC,cAAc;EACZ,MAAM;CACR;CAEA,MAAM,oBAAoB;EAExB,IAAI,CADS,KAAK,YAEhB,MAAM,IAAI,MAAM,sBAAsB;EAGxC,KAAK,mBAAmB;EACxB,KAAK,aAAa;CACpB;;;;CAKA,qBAAqB;EACnB,MAAM,OAAO,KAAK;EAClB,IAAI,CAAC,MACH;EAGF,KACG,cAAc,qCAAmC,CAAC,EACjD,iBAAiB,eAAe,KAAK,eAAe,CAAC;EAEzD,KACG,cAAc,wCAAsC,CAAC,EACpD,iBAAiB,eAAe,KAAK,kBAAkB,CAAC;EAE5D,KACG,cAAc,qCAAmC,CAAC,EACjD,iBAAiB,eAAe,KAAK,eAAe,CAAC;EAEzD,KACG,cAAc,6CAA2C,CAAC,EACzD,iBAAiB,eAAe,KAAK,sBAAsB,CAAC;CAClE;;;;CAKA,eAAe;EACb,aAAa;GACX,IAAI,kBAAkB,OACpB,CAAM,YAAY;IAChB,KAAK,KAAK,MAAM,MAAM;IACtB,KAAK,eAAe,kBAAkB;IACtC,MAAM,KAAK,OAAO;GACpB,EAAC,CAAE;EAEP,CAAC;CACH;;;;CAKA,MAAM,SAAS;EACb,IAAI,CAAC,KAAK,IACR;EAGF,MAAM,OAAO,KAAK;EAClB,IAAI,CAAC,MACH;EAGF,IAAI;GAEF,MAAM,mBAAmB,KAAK,cAC5B,wCACF;GACA,MAAM,aAAa,MAAM,UAAU,KAAK,IAAI,YAAY,YAAY;GACpE,MAAM,uBACJ,eAAe,cACf,eAAe,QACf,eAAe,UACf,eAAe,SACX,aACA;GACN,IAAI,kBACF,iBAAiB,QAAQ;GAI3B,MAAM,qBAAqB,KAAK,cAC9B,0CACF;GACA,MAAM,mBAAmB,MAAM,UAC7B,KAAK,IACL,YAAY,mBACd;GACA,MAAM,sBAAsB,OAAO,gBAAgB;GACnD,MAAM,0BAA0B,OAAO,SAAS,mBAAmB,IAC/D,KAAK,IACH,KAAK,IAAI,KAAK,MAAM,mBAAmB,GAAG,CAAC,GAC3C,oBACF;GAEJ,IAAI,oBACF,mBAAmB,QAAQ,OAAO,uBAAuB;GAI3D,MAAM,kBAAkB,KAAK,cAC3B,uCACF;GACA,MAAM,gBAAgB,MAAM,UAAU,KAAK,IAAI,YAAY,YAAY;GACvE,IAAI,iBACF,gBAAgB,QACd,OAAO,kBAAkB,WACrB,cAAc,KAAK,IACnB;GAIR,MAAM,yBAAyB,KAAK,cAClC,+CACF;GACA,MAAM,uBAAuB,MAAM,UACjC,KAAK,IACL,YAAY,oBACd;GACA,IAAI,0BAA0B,OAAO,yBAAyB,UAC5D,uBAAuB,QAAQ,qBAAqB,KAAK;EAE7D,SAAS,GAAG;GACV,QAAQ,KAAK,kCAAkC,CAAC;EAClD;CACF;;;;CAKA,MAAM,oBAAoB;EACxB,IAAI,CAAC,KAAK,gBAAgB,CAAC,KAAK,IAC9B;EAGF,MAAM,OAAO,KAAK;EAClB,IAAI,CAAC,MACH;EAGF,MAAM,QAAQ,KAAK,cACjB,0CACF;EACA,MAAM,SAAS,OAAO,OAAO,KAAK;EAElC,IAAI,CAAC,OAAO,SAAS,MAAM,GAAG;GAC5B,YAAY,2CAA2C,GAAI;GAE3D;EACF;EAEA,MAAM,aAAa,KAAK,IACtB,KAAK,IAAI,KAAK,MAAM,MAAM,GAAG,CAAC,GAC9B,oBACF;EACA,IAAI,OACF,MAAM,QAAQ,OAAO,UAAU;EAGjC,IAAI;GACF,MAAM,iBAAiB,KAAK,cAAc,KAAK,IAAI,UAAU;GAC7D,YAAY,4BAA4B,GAAI;EAC9C,SAAS,KAAK;GACZ,MAAM,WAAW,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;GAChE,UAAU,sCAAsC,UAAU,GAAI;EAChE;CACF;;;;CAKA,MAAM,iBAAiB;EACrB,IAAI,CAAC,KAAK,gBAAgB,CAAC,KAAK,IAC9B;EAGF,MAAM,OAAO,KAAK;EAClB,IAAI,CAAC,MACH;EAMF,MAAM,QAHQ,KAAK,cACjB,uCAEgB,CAAC,EAAE,OAAO,KAAK,KAAK;EAEtC,IAAI,OACF,IAAI;GACF,MAAM,SAAS,IAAI,IAAI,KAAK;GAC5B,IAAI,OAAO,aAAa,WAAW,OAAO,aAAa,UACrD,MAAM,IAAI,MAAM,wCAAwC;EAE5D,QAAQ;GACN,YAAY,8CAA8C,IAAI;GAE9D;EACF;EAGF,IAAI;GACF,MAAM,cAAc,KAAK,cAAc,KAAK,IAAI,KAAK;GACrD,YAAY,yBAAyB,GAAI;EAC3C,SAAS,KAAK;GACZ,MAAM,WAAW,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;GAChE,UAAU,mCAAmC,UAAU,GAAI;EAC7D;CACF;;;;CAKA,MAAM,iBAAiB;EACrB,IAAI,CAAC,KAAK,gBAAgB,CAAC,KAAK,IAC9B;EAGF,MAAM,OAAO,KAAK;EAClB,IAAI,CAAC,MACH;EAMF,MAAM,WAHS,KAAK,cAClB,wCAEoB,CAAC,EAAE,SAAS;EAClC,MAAM,OACJ,aAAa,cACb,aAAa,QACb,aAAa,UACb,aAAa,SACT,WACA;EAEN,IAAI;GACF,MAAM,cAAc,KAAK,cAAc,KAAK,IAAI,IAAI;GACpD,YAAY,yBAAyB,GAAI;EAC3C,SAAS,KAAK;GACZ,MAAM,WAAW,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;GAChE,UAAU,8BAA8B,UAAU,GAAI;EACxD;CACF;;;;CAKA,MAAM,wBAAwB;EAC5B,IAAI,CAAC,KAAK,gBAAgB,CAAC,KAAK,IAC9B;EAGF,MAAM,OAAO,KAAK;EAClB,IAAI,CAAC,MACH;EAGF,MAAM,QAAQ,KAAK,cACjB,+CACF;EACA,MAAM,QAAQ,OAAO,OAAO,KAAK,KAAK;EAEtC,IAAI,OACF,IAAI;GACF,MAAM,SAAS,IAAI,IAAI,KAAK;GAC5B,IAAI,OAAO,aAAa,SAAS,OAAO,aAAa,QACnD,MAAM,IAAI,MAAM,oCAAoC;EAExD,QAAQ;GACN,YAAY,kDAAkD,IAAI;GAElE;EACF;EAGF,IAAI,OACF,MAAM,QAAQ;EAGhB,IAAI;GACF,MAAM,qBAAqB,KAAK,cAAc,KAAK,IAAI,KAAK;GAC5D,YAAY,yBAAyB,GAAI;EAC3C,SAAS,KAAK;GACZ,MAAM,WAAW,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;GAChE,UAAU,mCAAmC,UAAU,GAAI;EAC7D;CACF;AACF;AAEA,IAAI,CAAC,eAAe,IAAI,WAAW,GACjC,eAAe,OAAO,aAAa,eAAe"}
1
+ {"version":3,"file":"shadow-claw-webvm-CnW-hoJ8.js","names":["shadowClawWebvmStyles","shadowClawWebvmTemplate"],"sources":["../../src/components/settings/shadow-claw-webvm/shadow-claw-webvm.ts"],"sourcesContent":["import {\n BASH_DEFAULT_TIMEOUT_SEC,\n BASH_MAX_TIMEOUT_SEC,\n CONFIG_KEYS,\n DEFAULT_VM_BOOT_HOST,\n} from \"../../../config/config.js\";\n\nimport { effect } from \"../../../core/effect.js\";\n\nimport {\n setVMBootHost,\n setVMBootMode,\n setVMNetworkRelayURL,\n} from \"../../../core/orchestrator/utils/operations/vm.js\";\n\nimport { setVMBashTimeout } from \"../../../core/orchestrator/utils/settings.js\";\nimport { getDb } from \"../../../db/db.js\";\nimport { getConfig } from \"../../../db/get-config.js\";\nimport { orchestratorStore } from \"../../../stores/orchestrator.js\";\nimport { showError, showSuccess, showWarning } from \"../../../ui/toast.js\";\n\nimport type { Orchestrator } from \"../../../core/orchestrator/orchestrator.js\";\nimport type { ShadowClawDatabase } from \"../../../db/types.js\";\n\nimport ShadowClawElement from \"../../shadow-claw-element.js\";\nimport shadowClawWebvmStyles from \"./shadow-claw-webvm.css\" with { type: \"css\" };\nimport shadowClawWebvmTemplate from \"./shadow-claw-webvm.html\" with { type: \"html\" };\n\nconst elementName = \"shadow-claw-webvm\";\n\n/**\n * Settings sub-component for WebVM configuration:\n * boot mode, bash timeout, boot host, network relay URL.\n */\nexport class ShadowClawWebvm extends ShadowClawElement {\n static styles = shadowClawWebvmStyles;\n static template = shadowClawWebvmTemplate;\n\n db: ShadowClawDatabase | null = null;\n orchestrator: Orchestrator | null = null;\n\n constructor() {\n super();\n }\n\n async connectedCallback() {\n const root = this.shadowRoot;\n if (!root) {\n throw new Error(\"shadowRoot not found\");\n }\n\n this.bindEventListeners();\n this.setupEffects();\n }\n\n /**\n * Bind all event listeners.\n */\n bindEventListeners() {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n root\n .querySelector('[data-action=\"save-vm-boot-mode\"]')\n ?.addEventListener(\"click\", () => this.saveVMBootMode());\n\n root\n .querySelector('[data-action=\"save-vm-bash-timeout\"]')\n ?.addEventListener(\"click\", () => this.saveVMBashTimeout());\n\n root\n .querySelector('[data-action=\"save-vm-boot-host\"]')\n ?.addEventListener(\"click\", () => this.saveVMBootHost());\n\n root\n .querySelector('[data-action=\"save-vm-network-relay-url\"]')\n ?.addEventListener(\"click\", () => this.saveVMNetworkRelayURL());\n }\n\n /**\n * Set up reactive effects.\n */\n setupEffects() {\n effect(() => {\n if (orchestratorStore.ready) {\n void (async () => {\n this.db = await getDb();\n this.orchestrator = orchestratorStore.orchestrator;\n await this.render();\n })();\n }\n });\n }\n\n /**\n * Load and populate all WebVM settings fields.\n */\n async render() {\n if (!this.db) {\n return;\n }\n\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n try {\n // Boot mode\n const vmBootModeSelect = root.querySelector(\n '[data-setting=\"vm-boot-mode-select\"]',\n ) as HTMLSelectElement | null;\n const vmBootMode = await getConfig(this.db, CONFIG_KEYS.VM_BOOT_MODE);\n const normalizedVMBootMode =\n vmBootMode === \"disabled\" ||\n vmBootMode === \"9p\" ||\n vmBootMode === \"ext2\" ||\n vmBootMode === \"auto\"\n ? vmBootMode\n : \"disabled\";\n if (vmBootModeSelect) {\n vmBootModeSelect.value = normalizedVMBootMode;\n }\n\n // Bash timeout\n const vmBashTimeoutInput = root.querySelector(\n '[data-setting=\"vm-bash-timeout-input\"]',\n ) as HTMLInputElement | null;\n const vmBashTimeoutRaw = await getConfig(\n this.db,\n CONFIG_KEYS.VM_BASH_TIMEOUT_SEC,\n );\n const vmBashTimeoutParsed = Number(vmBashTimeoutRaw);\n const normalizedVMBashTimeout = Number.isFinite(vmBashTimeoutParsed)\n ? Math.min(\n Math.max(Math.floor(vmBashTimeoutParsed), 1),\n BASH_MAX_TIMEOUT_SEC,\n )\n : BASH_DEFAULT_TIMEOUT_SEC;\n if (vmBashTimeoutInput) {\n vmBashTimeoutInput.value = String(normalizedVMBashTimeout);\n }\n\n // Boot host\n const vmBootHostInput = root.querySelector(\n '[data-setting=\"vm-boot-host-input\"]',\n ) as HTMLInputElement | null;\n const vmBootHostRaw = await getConfig(this.db, CONFIG_KEYS.VM_BOOT_HOST);\n if (vmBootHostInput) {\n vmBootHostInput.value =\n typeof vmBootHostRaw === \"string\"\n ? vmBootHostRaw.trim()\n : DEFAULT_VM_BOOT_HOST;\n }\n\n // Network relay URL\n const vmNetworkRelayURLInput = root.querySelector(\n '[data-setting=\"vm-network-relay-url-input\"]',\n ) as HTMLInputElement | null;\n const vmNetworkRelayURLRaw = await getConfig(\n this.db,\n CONFIG_KEYS.VM_NETWORK_RELAY_URL,\n );\n if (vmNetworkRelayURLInput && typeof vmNetworkRelayURLRaw === \"string\") {\n vmNetworkRelayURLInput.value = vmNetworkRelayURLRaw.trim();\n }\n } catch (e) {\n console.warn(\"Could not load WebVM settings:\", e);\n }\n }\n\n /**\n * Save default bash timeout.\n */\n async saveVMBashTimeout() {\n if (!this.orchestrator || !this.db) {\n return;\n }\n\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const input = root.querySelector(\n '[data-setting=\"vm-bash-timeout-input\"]',\n ) as HTMLInputElement | null;\n const parsed = Number(input?.value);\n\n if (!Number.isFinite(parsed)) {\n showWarning(\"Please enter a valid timeout in seconds\", 3000);\n\n return;\n }\n\n const normalized = Math.min(\n Math.max(Math.floor(parsed), 1),\n BASH_MAX_TIMEOUT_SEC,\n );\n if (input) {\n input.value = String(normalized);\n }\n\n try {\n await setVMBashTimeout(this.orchestrator, this.db, normalized);\n showSuccess(\"WebVM bash timeout saved\", 3000);\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n showError(\"Error saving WebVM bash timeout: \" + errorMsg, 6000);\n }\n }\n\n /**\n * Save boot host URL.\n */\n async saveVMBootHost() {\n if (!this.orchestrator || !this.db) {\n return;\n }\n\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const input = root.querySelector(\n '[data-setting=\"vm-boot-host-input\"]',\n ) as HTMLInputElement | null;\n const value = input?.value?.trim() || \"\";\n\n if (value) {\n try {\n const parsed = new URL(value);\n if (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\n throw new Error(\"Boot host must use http:// or https://\");\n }\n } catch {\n showWarning(\"Please enter a valid HTTP(S) boot host URL\", 3500);\n\n return;\n }\n }\n\n try {\n await setVMBootHost(this.orchestrator, this.db, value);\n showSuccess(\"WebVM boot host saved\", 3000);\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n showError(\"Error saving WebVM boot host: \" + errorMsg, 6000);\n }\n }\n\n /**\n * Save VM boot mode.\n */\n async saveVMBootMode() {\n if (!this.orchestrator || !this.db) {\n return;\n }\n\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const select = root.querySelector(\n '[data-setting=\"vm-boot-mode-select\"]',\n ) as HTMLSelectElement | null;\n const selected = select?.value || \"disabled\";\n const mode =\n selected === \"disabled\" ||\n selected === \"9p\" ||\n selected === \"ext2\" ||\n selected === \"auto\"\n ? selected\n : \"disabled\";\n\n try {\n await setVMBootMode(this.orchestrator, this.db, mode);\n showSuccess(\"WebVM boot mode saved\", 3000);\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n showError(\"Error saving WebVM mode: \" + errorMsg, 6000);\n }\n }\n\n /**\n * Save network relay URL.\n */\n async saveVMNetworkRelayURL() {\n if (!this.orchestrator || !this.db) {\n return;\n }\n\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const input = root.querySelector(\n '[data-setting=\"vm-network-relay-url-input\"]',\n ) as HTMLInputElement | null;\n const value = input?.value?.trim() || \"\";\n\n if (value) {\n try {\n const parsed = new URL(value);\n if (parsed.protocol !== \"ws:\" && parsed.protocol !== \"wss:\") {\n throw new Error(\"Relay URL must use ws:// or wss://\");\n }\n } catch {\n showWarning(\"Please enter a valid ws:// or wss:// relay URL\", 3500);\n\n return;\n }\n }\n\n if (input) {\n input.value = value;\n }\n\n try {\n await setVMNetworkRelayURL(this.orchestrator, this.db, value);\n showSuccess(\"WebVM relay URL saved\", 3000);\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n showError(\"Error saving WebVM relay URL: \" + errorMsg, 6000);\n }\n }\n}\n\nif (!customElements.get(elementName)) {\n customElements.define(elementName, ShadowClawWebvm);\n}\n"],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ export type { WebMCP } from "webmcp-types";
1
2
  import { type ToolDefinition } from "../tools/tools.js";
2
3
  export type WebMcpMode = "polyfill" | "native";
3
4
  /**
@@ -34,6 +35,7 @@ export interface WebMcpExecuteContext {
34
35
  }
35
36
  export interface WebMcpRegisteredTool {
36
37
  name: string;
38
+ title?: string;
37
39
  description?: string;
38
40
  inputSchema?: unknown;
39
41
  annotations?: Record<string, unknown>;
@@ -41,6 +43,7 @@ export interface WebMcpRegisteredTool {
41
43
  }
42
44
  export interface NormalizedWebMcpRegisteredTool {
43
45
  name: string;
46
+ title?: string;
44
47
  description?: string;
45
48
  inputSchema: Record<string, unknown>;
46
49
  annotations?: Record<string, unknown>;
@@ -59,10 +62,13 @@ export declare function extractAbortSignal(context?: WebMcpExecuteContext | Abor
59
62
  * - Feature-detects `getTools()` on `document.modelContext` / `navigator.modelContext`.
60
63
  * - If `getTools()` is absent (older browser builds or polyfills without getTools),
61
64
  * returns an empty array `[]` without throwing.
65
+ * - Supports options dictionary with `fromOrigins` to discover cross-frame/cross-origin tools (Chrome 155+).
62
66
  * - Normalizes `RegisteredTool#inputSchema` so caller receives a JavaScript object
63
67
  * whether running on Chrome 154+ (native object) or Chrome < 154 (DOMString JSON).
64
68
  */
65
- export declare function getWebMcpTools(): Promise<NormalizedWebMcpRegisteredTool[]>;
69
+ export declare function getWebMcpTools(options?: {
70
+ fromOrigins?: string[];
71
+ }): Promise<NormalizedWebMcpRegisteredTool[]>;
66
72
  /**
67
73
  * Gracefully execute a WebMCP tool on a ModelContext instance with backwards compatibility.
68
74
  *
@@ -150,6 +156,12 @@ export declare function onWebMcpToolActivated(listener: (event: WebMcpToolActiva
150
156
  * Returns an unsubscribe cleanup function.
151
157
  */
152
158
  export declare function onWebMcpToolCancel(listener: (event: WebMcpToolCancelEvent) => void, options?: boolean | WebMcpEventListenerOptions): () => void;
159
+ /**
160
+ * Convenience helper to subscribe to tool registration change events (`toolchange`).
161
+ * Dispatched on `document.modelContext` when tools are registered or unregistered.
162
+ * Returns an unsubscribe cleanup function.
163
+ */
164
+ export declare function onWebMcpToolChange(listener: (event: Event) => void, options?: boolean | AddEventListenerOptions): () => void;
153
165
  /**
154
166
  * Consequential tools that perform high-stakes, irreversible, or external real-world actions
155
167
  * (such as deleting data, executing arbitrary system commands, or transmitting live communications).
@@ -164,6 +176,7 @@ export interface WebMcpToolAnnotations {
164
176
  readOnlyHint?: boolean;
165
177
  consequentialHint?: boolean;
166
178
  untrustedContentHint?: boolean;
179
+ debugging?: boolean;
167
180
  [key: string]: unknown;
168
181
  }
169
182
  /**
@@ -180,7 +193,7 @@ export declare function resolveWebMcpToolAnnotations(toolName: string, customAnn
180
193
  * that unregistration works identically regardless of which implementation is
181
194
  * actually active.
182
195
  *
183
- * Key correctness detail: `initializeWebMCPPolyfill()` is a no-op when
196
+ * Key correctness detail: `ensurePolyfill()` is a no-op when
184
197
  * Chrome's native `document.modelContext` already exists — it does NOT
185
198
  * override the native API. In that situation we are talking to the native
186
199
  * Chrome API even in "polyfill" mode. The native Chrome API only supports
@@ -1,9 +1,9 @@
1
1
  import { r as CONFIG_KEYS } from "./config-Dalol4GN.js";
2
- import { t as toolsStore } from "./tools-D7whby3H.js";
3
- import { A as handleWorkerMessage, Mt as discoverSkills, t as orchestratorStore } from "./orchestrator-Dh-hnIpK.js";
2
+ import { t as toolsStore } from "./tools-CP6G0HF7.js";
3
+ import { A as handleWorkerMessage, Mt as discoverSkills, t as orchestratorStore } from "./orchestrator-Cda13e5U.js";
4
4
  import { t as setConfig } from "./set-config-CCrA9aKc.js";
5
5
  import { t as effect } from "./effect-DL6j9HJp.js";
6
- import { a as setWebMcpMode$1, i as registerWebMcpTools, n as onWebMcpToolActivated, o as unregisterWebMcpTools, r as onWebMcpToolCancel } from "./webmcp-CYTNZfkn.js";
6
+ import { a as registerWebMcpTools, i as onWebMcpToolChange, n as onWebMcpToolActivated, o as setWebMcpMode$1, r as onWebMcpToolCancel, s as unregisterWebMcpTools } from "./webmcp-Bf9rT7uu.js";
7
7
 
8
8
  //#region src/subsystems/skills/tool.ts
9
9
  const activate_skill = {
@@ -36,6 +36,9 @@ function syncWebMcpRegistration(orchestrator, db) {
36
36
  const unsubscribeCancel = onWebMcpToolCancel((event) => {
37
37
  orchestrator.events?.emit("webmcp-tool-cancel", { toolName: event.toolName });
38
38
  });
39
+ const unsubscribeChange = onWebMcpToolChange((event) => {
40
+ orchestrator.events?.emit("webmcp-tool-change", { event });
41
+ });
39
42
  const disposeEffect = effect(() => {
40
43
  const activeGroupId = orchestratorStore.activeGroupId;
41
44
  const allTools = toolsStore.allTools;
@@ -72,6 +75,9 @@ function syncWebMcpRegistration(orchestrator, db) {
72
75
  try {
73
76
  unsubscribeCancel();
74
77
  } catch {}
78
+ try {
79
+ unsubscribeChange();
80
+ } catch {}
75
81
  if (typeof disposeEffect === "function") disposeEffect();
76
82
  };
77
83
  }
@@ -89,4 +95,4 @@ async function setWebMcpToolsEnabled(state, db, enabled, syncDeps) {
89
95
 
90
96
  //#endregion
91
97
  export { activate_skill as i, setWebMcpToolsEnabled as n, syncWebMcpRegistration as r, setWebMcpMode as t };
92
- //# sourceMappingURL=sync-web-mcp-registration-dW2MVCj4.js.map
98
+ //# sourceMappingURL=sync-web-mcp-registration-DwpGjVdo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-web-mcp-registration-DwpGjVdo.js","names":[],"sources":["../../src/subsystems/skills/tool.ts","../../src/core/orchestrator/utils/sync-web-mcp-registration.ts"],"sourcesContent":["import type { ToolDefinition } from \"../../subsystems/tools/types.js\";\n\nexport const activate_skill: ToolDefinition = {\n name: \"activate_skill\",\n description:\n \"Load the full instructions for a workspace skill when its description matches the current task.\",\n input_schema: {\n type: \"object\",\n properties: {\n name: {\n type: \"string\",\n description: \"The exact skill name from the available skills catalog.\",\n },\n },\n required: [\"name\"],\n },\n};\n","import { orchestratorStore } from \"../../../stores/orchestrator.js\";\nimport { toolsStore } from \"../../../stores/tools.js\";\n\nimport {\n setWebMcpMode as applyWebMcpMode,\n registerWebMcpTools,\n unregisterWebMcpTools,\n onWebMcpToolActivated,\n onWebMcpToolCancel,\n onWebMcpToolChange,\n} from \"../../../subsystems/mcp/webmcp.js\";\n\nimport { effect } from \"../../effect.js\";\nimport { handleWorkerMessage } from \"./handle-worker-message.js\";\n\nimport { CONFIG_KEYS } from \"../../../config/config.js\";\nimport { setConfig } from \"../../../db/set-config.js\";\n\nimport type { ShadowClawDatabase } from \"../../../db/db.js\";\nimport type { DeclarativeToolDefinition } from \"../../../subsystems/tools/declarative.js\";\nimport type { SkillRecord } from \"../../../subsystems/skills/types.js\";\nimport type { WebMcpMode } from \"../../../subsystems/mcp/webmcp.js\";\nimport type { OrchestratorState } from \"../orchestrator-state.js\";\nimport type { Orchestrator } from \"../orchestrator.js\";\n\nimport { discoverSkills } from \"../../../subsystems/skills/discover-skills.js\";\nimport { activate_skill } from \"../../../subsystems/skills/tool.js\";\n\nexport function syncWebMcpRegistration(\n orchestrator: Orchestrator,\n db: ShadowClawDatabase,\n): void {\n if (typeof orchestrator.webMcpEffectCleanup === \"function\") {\n orchestrator.webMcpEffectCleanup();\n orchestrator.webMcpEffectCleanup = null;\n }\n\n if (!orchestrator.webMcpToolsEnabled) {\n unregisterWebMcpTools();\n\n return;\n }\n\n // Subscribe to WebMCP lifecycle events (PR #245 / Chrome 156+ with backwards compatibility).\n const unsubscribeActivated = onWebMcpToolActivated((event) => {\n orchestrator.events?.emit(\"webmcp-tool-activated\", {\n toolName: event.toolName,\n });\n });\n\n const unsubscribeCancel = onWebMcpToolCancel((event) => {\n orchestrator.events?.emit(\"webmcp-tool-cancel\", {\n toolName: event.toolName,\n });\n });\n\n const unsubscribeChange = onWebMcpToolChange((event) => {\n orchestrator.events?.emit(\"webmcp-tool-change\", { event });\n });\n\n // Register WebMCP tools and re-register when tool config changes.\n // This effect runs once immediately to perform the initial registration.\n // We intentionally do NOT call isWebMcpSupported() here — that accesses\n // the browser's modelContext API which can crash Chrome Canary's\n // early-preview renderer. Instead, registerWebMcpTools handles feature detection\n // internally and skips modelContext access entirely when 0 tools are\n // passed.\n const disposeEffect = effect(() => {\n // Access signals to establish tracking.\n const activeGroupId = orchestratorStore.activeGroupId;\n const allTools = toolsStore.allTools;\n const globalTools = toolsStore.enabledTools;\n void toolsStore.declarativeTools;\n void toolsStore.declarativeToolNamesEnabled;\n const groups = orchestratorStore.groups;\n const group = groups.find((g) => g.groupId === activeGroupId);\n\n // Serialize WebMCP registration calls to prevent overlapping unregister/register cycles.\n orchestrator.webMcpRegistrationLock = orchestrator.webMcpRegistrationLock\n .then(async () => {\n unregisterWebMcpTools();\n // Small delay to allow the browser's ModelContext to process the unregistrations.\n await new Promise((resolve) => setTimeout(resolve, 0));\n\n let declarativeTools: DeclarativeToolDefinition[] = [];\n try {\n declarativeTools = await toolsStore.refreshDeclarativeTools(\n db,\n activeGroupId,\n );\n } catch {\n // Ignore OPFS load errors\n }\n\n const enabledDeclarativeTools = declarativeTools.filter((dt) =>\n toolsStore.isDeclarativeToolEnabled(dt.name),\n );\n\n const candidateTools = [...allTools, ...declarativeTools];\n let tools =\n group?.toolTags && group.toolTags.length > 0\n ? candidateTools.filter((t) => group.toolTags!.includes(t.name))\n : [...globalTools, ...enabledDeclarativeTools];\n\n let skillDiscovery: { skills: SkillRecord[] } = { skills: [] };\n try {\n skillDiscovery = await discoverSkills(db, activeGroupId);\n } catch {\n // Ignore OPFS load errors\n }\n\n if (\n skillDiscovery.skills.length > 0 &&\n !tools.some((t) => t.name === activate_skill.name)\n ) {\n tools = [...tools, activate_skill];\n }\n\n await registerWebMcpTools(\n orchestrator.agentWorker,\n async (msg) => {\n await handleWorkerMessage(orchestrator, db, msg);\n },\n activeGroupId,\n tools,\n );\n })\n .catch((err) => {\n console.error(\"WebMCP registration failed:\", err);\n });\n });\n\n orchestrator.webMcpEffectCleanup = () => {\n try {\n unsubscribeActivated();\n } catch {}\n try {\n unsubscribeCancel();\n } catch {}\n try {\n unsubscribeChange();\n } catch {}\n if (typeof disposeEffect === \"function\") {\n disposeEffect();\n }\n };\n}\nexport async function setWebMcpMode(\n _state: Pick<\n OrchestratorState,\n \"webMcpToolsEnabled\" | \"webMcpRegistrationLock\"\n > & {\n webMcpEffectCleanup: (() => void) | null;\n agentWorker: Worker | null;\n },\n db: ShadowClawDatabase,\n mode: WebMcpMode,\n syncDeps: { orchestrator: Orchestrator },\n): Promise<void> {\n // Unregister with old mode, switch, re-register with new mode.\n unregisterWebMcpTools();\n applyWebMcpMode(mode);\n\n await setConfig(db, CONFIG_KEYS.WEBMCP_MODE, mode);\n\n syncWebMcpRegistration(syncDeps.orchestrator, db);\n}\n\nexport async function setWebMcpToolsEnabled(\n state: Pick<OrchestratorState, \"webMcpToolsEnabled\">,\n db: ShadowClawDatabase,\n enabled: boolean,\n syncDeps: { orchestrator: Orchestrator },\n): Promise<void> {\n state.webMcpToolsEnabled = !!enabled;\n\n await setConfig(\n db,\n CONFIG_KEYS.WEBMCP_TOOLS_ENABLED,\n state.webMcpToolsEnabled ? \"true\" : \"false\",\n );\n\n syncWebMcpRegistration(syncDeps.orchestrator, db);\n}\n"],"mappings":";;;;;;;;AAEA,MAAa,iBAAiC;CAC5C,MAAM;CACN,aACE;CACF,cAAc;EACZ,MAAM;EACN,YAAY,EACV,MAAM;GACJ,MAAM;GACN,aAAa;EACf,EACF;EACA,UAAU,CAAC,MAAM;CACnB;AACF;;;;ACYA,SAAgB,uBACd,cACA,IACM;CACN,IAAI,OAAO,aAAa,wBAAwB,YAAY;EAC1D,aAAa,oBAAoB;EACjC,aAAa,sBAAsB;CACrC;CAEA,IAAI,CAAC,aAAa,oBAAoB;EACpC,sBAAsB;EAEtB;CACF;CAGA,MAAM,uBAAuB,uBAAuB,UAAU;EAC5D,aAAa,QAAQ,KAAK,yBAAyB,EACjD,UAAU,MAAM,SAClB,CAAC;CACH,CAAC;CAED,MAAM,oBAAoB,oBAAoB,UAAU;EACtD,aAAa,QAAQ,KAAK,sBAAsB,EAC9C,UAAU,MAAM,SAClB,CAAC;CACH,CAAC;CAED,MAAM,oBAAoB,oBAAoB,UAAU;EACtD,aAAa,QAAQ,KAAK,sBAAsB,EAAE,MAAM,CAAC;CAC3D,CAAC;CASD,MAAM,gBAAgB,aAAa;EAEjC,MAAM,gBAAgB,kBAAkB;EACxC,MAAM,WAAW,WAAW;EAC5B,MAAM,cAAc,WAAW;EAC/B,AAAK,WAAW;EAChB,AAAK,WAAW;EAEhB,MAAM,QADS,kBAAkB,OACZ,MAAM,MAAM,EAAE,YAAY,aAAa;EAG5D,aAAa,yBAAyB,aAAa,uBAChD,KAAK,YAAY;GAChB,sBAAsB;GAEtB,MAAM,IAAI,SAAS,YAAY,WAAW,SAAS,CAAC,CAAC;GAErD,IAAI,mBAAgD,CAAC;GACrD,IAAI;IACF,mBAAmB,MAAM,WAAW,wBAClC,IACA,aACF;GACF,QAAQ,CAER;GAEA,MAAM,0BAA0B,iBAAiB,QAAQ,OACvD,WAAW,yBAAyB,GAAG,IAAI,CAC7C;GAEA,MAAM,iBAAiB,CAAC,GAAG,UAAU,GAAG,gBAAgB;GACxD,IAAI,QACF,OAAO,YAAY,MAAM,SAAS,SAAS,IACvC,eAAe,QAAQ,MAAM,MAAM,SAAU,SAAS,EAAE,IAAI,CAAC,IAC7D,CAAC,GAAG,aAAa,GAAG,uBAAuB;GAEjD,IAAI,iBAA4C,EAAE,QAAQ,CAAC,EAAE;GAC7D,IAAI;IACF,iBAAiB,MAAM,eAAe,IAAI,aAAa;GACzD,QAAQ,CAER;GAEA,IACE,eAAe,OAAO,SAAS,KAC/B,CAAC,MAAM,MAAM,MAAM,EAAE,SAAS,eAAe,IAAI,GAEjD,QAAQ,CAAC,GAAG,OAAO,cAAc;GAGnC,MAAM,oBACJ,aAAa,aACb,OAAO,QAAQ;IACb,MAAM,oBAAoB,cAAc,IAAI,GAAG;GACjD,GACA,eACA,KACF;EACF,CAAC,CAAC,CACD,OAAO,QAAQ;GACd,QAAQ,MAAM,+BAA+B,GAAG;EAClD,CAAC;CACL,CAAC;CAED,aAAa,4BAA4B;EACvC,IAAI;GACF,qBAAqB;EACvB,QAAQ,CAAC;EACT,IAAI;GACF,kBAAkB;EACpB,QAAQ,CAAC;EACT,IAAI;GACF,kBAAkB;EACpB,QAAQ,CAAC;EACT,IAAI,OAAO,kBAAkB,YAC3B,cAAc;CAElB;AACF;AACA,eAAsB,cACpB,QAOA,IACA,MACA,UACe;CAEf,sBAAsB;CACtB,gBAAgB,IAAI;CAEpB,MAAM,UAAU,IAAI,YAAY,aAAa,IAAI;CAEjD,uBAAuB,SAAS,cAAc,EAAE;AAClD;AAEA,eAAsB,sBACpB,OACA,IACA,SACA,UACe;CACf,MAAM,qBAAqB,CAAC,CAAC;CAE7B,MAAM,UACJ,IACA,YAAY,sBACZ,MAAM,qBAAqB,SAAS,OACtC;CAEA,uBAAuB,SAAS,cAAc,EAAE;AAClD"}
@@ -8,7 +8,7 @@ import { t as setConfig } from "./set-config-CCrA9aKc.js";
8
8
  import { t as TOOL_DEFINITIONS } from "./tools-tRG7Gu0x.js";
9
9
  import "./tools-Bj8UJ_6L.js";
10
10
  import { computeSha256 } from "./utils/crypto.js";
11
- import { a as toTrustedScriptUrl } from "./trusted-types-d0cdkut_.js";
11
+ import { a as toTrustedScriptUrl } from "./trusted-types-0cu5Dm6M.js";
12
12
  import { t as require_gray_matter } from "./gray-matter-BXr0XQC1.js";
13
13
 
14
14
  //#region src/storage/read-group-file.ts
@@ -777,7 +777,7 @@ var ToolsStore = class {
777
777
  this._enabledDeclarativeTools = new Signal.Computed(() => {
778
778
  const tools = this._declarativeTools.get();
779
779
  const enabledSet = this._declarativeToolNamesEnabled.get();
780
- if (enabledSet === null) return tools;
780
+ if (!enabledSet || enabledSet.size === 0) return [];
781
781
  return tools.filter((t) => enabledSet.has(t.name));
782
782
  });
783
783
  this._activeProfile = new Signal.Computed(() => {
@@ -816,7 +816,7 @@ var ToolsStore = class {
816
816
  }
817
817
  isDeclarativeToolEnabled(name) {
818
818
  const enabledSet = this._declarativeToolNamesEnabled.get();
819
- if (enabledSet === null) return true;
819
+ if (!enabledSet) return false;
820
820
  return enabledSet.has(name);
821
821
  }
822
822
  async refreshDeclarativeTools(db, groupId) {
@@ -834,8 +834,7 @@ var ToolsStore = class {
834
834
  }
835
835
  async setDeclarativeToolEnabled(db, toolName, enabled) {
836
836
  const currentEnabled = this._declarativeToolNamesEnabled.get();
837
- const allDeclTools = this._declarativeTools.get();
838
- const nextSet = new Set(currentEnabled === null ? allDeclTools.map((t) => t.name) : currentEnabled);
837
+ const nextSet = new Set(currentEnabled === null ? [] : currentEnabled);
839
838
  if (enabled) nextSet.add(toolName);
840
839
  else nextSet.delete(toolName);
841
840
  this._declarativeToolNamesEnabled.set(nextSet);
@@ -1149,4 +1148,4 @@ const toolsStore = new ToolsStore();
1149
1148
 
1150
1149
  //#endregion
1151
1150
  export { writeGroupFile as a, findDeclarativeTool as c, readGroupFile as d, groupFileExists as i, loadDeclarativeTools as l, tools_exports as n, writeFileHandle as o, parseSkill as r, writeOpfsPathViaWorker as s, toolsStore as t, DEFAULT_BUILTIN_PROFILE as u };
1152
- //# sourceMappingURL=tools-D7whby3H.js.map
1151
+ //# sourceMappingURL=tools-CP6G0HF7.js.map