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,5 +1,8 @@
1
1
  import { describe, it, expect, beforeEach } from "@jest/globals";
2
- import { syncSlottedSidebarActiveLinks } from "./sync-slotted-sidebar-active-links.js";
2
+ import {
3
+ setupSlottedSidebarActiveLinks,
4
+ syncSlottedSidebarActiveLinks,
5
+ } from "./sync-slotted-sidebar-active-links.js";
3
6
 
4
7
  describe("syncSlottedSidebarActiveLinks", () => {
5
8
  let host: HTMLElement;
@@ -91,3 +94,151 @@ describe("syncSlottedSidebarActiveLinks", () => {
91
94
  expect(corporateLink?.classList.contains("active")).toBe(false);
92
95
  });
93
96
  });
97
+
98
+ describe("setupSlottedSidebarActiveLinks", () => {
99
+ let host: HTMLElement;
100
+ let originalNavigation: any;
101
+ let originalReplaceState: any;
102
+
103
+ beforeEach(() => {
104
+ originalNavigation = (window as any).navigation;
105
+ originalReplaceState = window.history.replaceState;
106
+
107
+ host = document.createElement("div");
108
+ host.innerHTML = `
109
+ <div slot="sidebar" class="sidebar-custom-sections">
110
+ <a href="/" class="sidebar-link">Home</a>
111
+ <a href="/2022/11/27/c-sharp-in-the-browser-without-blazor/" class="sidebar-link">C# in the Browser Without Blazor</a>
112
+ <a href="/2021/04/18/using-open/" class="sidebar-link">Using Open</a>
113
+ <a href="/2021/02/27/the-web-is-dynamic/" class="sidebar-link">The Web Is Dynamic</a>
114
+ </div>
115
+ `;
116
+
117
+ // Ensure initial location is home
118
+ window.history.replaceState({}, "", "/");
119
+ });
120
+
121
+ afterEach(() => {
122
+ if (originalNavigation !== undefined) {
123
+ (window as any).navigation = originalNavigation;
124
+ } else {
125
+ delete (window as any).navigation;
126
+ }
127
+ window.history.replaceState = originalReplaceState;
128
+ window.history.replaceState({}, "", "/");
129
+ });
130
+
131
+ it("synchronizes active sidebar link on Navigation API navigate event using destination URL when window.location.href is still old URL", () => {
132
+ const nav = new EventTarget();
133
+ (window as any).navigation = nav;
134
+
135
+ const cleanup = setupSlottedSidebarActiveLinks(host);
136
+
137
+ const linkCSharp = host.querySelector<HTMLAnchorElement>(
138
+ 'a[href="/2022/11/27/c-sharp-in-the-browser-without-blazor/"]',
139
+ );
140
+ const linkUsingOpen = host.querySelector<HTMLAnchorElement>(
141
+ 'a[href="/2021/04/18/using-open/"]',
142
+ );
143
+
144
+ // Initial state: home is active, posts are not
145
+ expect(linkCSharp?.classList.contains("active")).toBe(false);
146
+ expect(linkUsingOpen?.classList.contains("active")).toBe(false);
147
+
148
+ // 1. User scrolls to C# post: replaceState triggers navigate event.
149
+ // Crucially: At this point, the browser has NOT committed navigation yet,
150
+ // so window.location.href is STILL "http://localhost/"!
151
+ const navEvent1 = new Event("navigate") as any;
152
+ navEvent1.destination = {
153
+ url: `${window.location.origin}/2022/11/27/c-sharp-in-the-browser-without-blazor/`,
154
+ };
155
+ nav.dispatchEvent(navEvent1);
156
+
157
+ // C# link MUST be highlighted immediately without off-by-one delay
158
+ expect(linkCSharp?.classList.contains("active")).toBe(true);
159
+ expect(linkCSharp?.getAttribute("aria-current")).toBe("page");
160
+ expect(linkUsingOpen?.classList.contains("active")).toBe(false);
161
+
162
+ // Browser now commits navigation: location updates to C# post
163
+ window.history.replaceState(
164
+ {},
165
+ "",
166
+ "/2022/11/27/c-sharp-in-the-browser-without-blazor/",
167
+ );
168
+
169
+ // 2. User scrolls down to "Using Open": replaceState triggers navigate event.
170
+ // window.location.href is STILL C# post URL!
171
+ const navEvent2 = new Event("navigate") as any;
172
+ navEvent2.destination = {
173
+ url: `${window.location.origin}/2021/04/18/using-open/`,
174
+ };
175
+ nav.dispatchEvent(navEvent2);
176
+
177
+ // "Using Open" MUST be highlighted, and C# link MUST NOT be highlighted
178
+ expect(linkCSharp?.classList.contains("active")).toBe(false);
179
+ expect(linkCSharp?.hasAttribute("aria-current")).toBe(false);
180
+ expect(linkUsingOpen?.classList.contains("active")).toBe(true);
181
+ expect(linkUsingOpen?.getAttribute("aria-current")).toBe("page");
182
+
183
+ cleanup();
184
+ });
185
+
186
+ it("synchronizes active sidebar link immediately when history.replaceState is called", () => {
187
+ delete (window as any).navigation;
188
+
189
+ const cleanup = setupSlottedSidebarActiveLinks(host);
190
+
191
+ const linkCSharp = host.querySelector<HTMLAnchorElement>(
192
+ 'a[href="/2022/11/27/c-sharp-in-the-browser-without-blazor/"]',
193
+ );
194
+ const linkUsingOpen = host.querySelector<HTMLAnchorElement>(
195
+ 'a[href="/2021/04/18/using-open/"]',
196
+ );
197
+
198
+ expect(linkCSharp?.classList.contains("active")).toBe(false);
199
+
200
+ // replaceState to C# post
201
+ window.history.replaceState(
202
+ { inFeedScroll: true },
203
+ "",
204
+ "/2022/11/27/c-sharp-in-the-browser-without-blazor/",
205
+ );
206
+
207
+ expect(linkCSharp?.classList.contains("active")).toBe(true);
208
+ expect(linkUsingOpen?.classList.contains("active")).toBe(false);
209
+
210
+ // replaceState to Using Open
211
+ window.history.replaceState(
212
+ { inFeedScroll: true },
213
+ "",
214
+ "/2021/04/18/using-open/",
215
+ );
216
+
217
+ expect(linkCSharp?.classList.contains("active")).toBe(false);
218
+ expect(linkUsingOpen?.classList.contains("active")).toBe(true);
219
+
220
+ cleanup();
221
+ });
222
+
223
+ it("synchronizes active sidebar link when shadow-claw-feed-scroll event is dispatched", () => {
224
+ const cleanup = setupSlottedSidebarActiveLinks(host);
225
+
226
+ const linkCSharp = host.querySelector<HTMLAnchorElement>(
227
+ 'a[href="/2022/11/27/c-sharp-in-the-browser-without-blazor/"]',
228
+ );
229
+
230
+ window.dispatchEvent(
231
+ new CustomEvent("shadow-claw-feed-scroll", {
232
+ detail: {
233
+ url: "/2022/11/27/c-sharp-in-the-browser-without-blazor/",
234
+ title: "C# in the Browser Without Blazor",
235
+ },
236
+ }),
237
+ );
238
+
239
+ expect(linkCSharp?.classList.contains("active")).toBe(true);
240
+ expect(linkCSharp?.getAttribute("aria-current")).toBe("page");
241
+
242
+ cleanup();
243
+ });
244
+ });
@@ -65,7 +65,7 @@ export function syncSlottedSidebarActiveLinks(
65
65
 
66
66
  /**
67
67
  * Sets up listeners so slotted sidebar active links stay in sync whenever
68
- * the URL changes (popstate, Navigation API navigate, or iframe replaceState).
68
+ * the URL changes (popstate, Navigation API navigate, replaceState, or feed scroll events).
69
69
  * Returns a cleanup function to remove the listeners.
70
70
  */
71
71
  export function setupSlottedSidebarActiveLinks(
@@ -75,26 +75,157 @@ export function setupSlottedSidebarActiveLinks(
75
75
  return () => {};
76
76
  }
77
77
 
78
- const sync = () => syncSlottedSidebarActiveLinks(host);
78
+ const sync = (targetUrl?: URL) =>
79
+ syncSlottedSidebarActiveLinks(host, targetUrl);
79
80
 
80
81
  // Initial sync
81
82
  sync();
82
83
 
83
- // Re-sync on back/forward navigation and replaceState-driven URL changes
84
- window.addEventListener("popstate", sync, { passive: true });
84
+ // Re-sync on back/forward navigation
85
+ const handlePopstate = () => sync();
86
+ window.addEventListener("popstate", handlePopstate, { passive: true });
85
87
 
86
- // Re-sync on Navigation API navigate (Chrome 102+) — covers pushState/replaceState too
88
+ // Re-sync on custom feed-scroll or url-change events
89
+ const handleCustomFeedScroll = (ev: Event) => {
90
+ const detailUrl = (ev as CustomEvent)?.detail?.url;
91
+ if (detailUrl) {
92
+ try {
93
+ sync(new URL(detailUrl, window.location.href));
94
+ return;
95
+ } catch {}
96
+ }
97
+ sync();
98
+ };
99
+ window.addEventListener("shadow-claw-feed-scroll", handleCustomFeedScroll);
100
+ window.addEventListener("shadow-claw-url-change", handleCustomFeedScroll);
101
+
102
+ // Re-sync on Navigation API navigate (Chrome 102+)
103
+ // CRITICAL: On 'navigate', window.location.href has NOT yet updated (it holds the old URL).
104
+ // We must inspect ev.destination.url so the sidebar highlights the target article
105
+ // synchronously without an "off-by-one" lag.
87
106
  const nav = (window as unknown as { navigation?: EventTarget }).navigation;
107
+ let handleNavigate: ((ev: any) => void) | null = null;
108
+ let handleCurrentEntryChange: (() => void) | null = null;
109
+ let handleNavigateSuccess: (() => void) | null = null;
110
+
88
111
  if (nav && typeof nav.addEventListener === "function") {
89
- nav.addEventListener("navigate", sync, {
112
+ handleNavigate = (ev: any) => {
113
+ const destUrl = ev?.destination?.url;
114
+ if (destUrl) {
115
+ try {
116
+ sync(new URL(destUrl));
117
+ return;
118
+ } catch {}
119
+ }
120
+ sync();
121
+ };
122
+
123
+ handleCurrentEntryChange = () => {
124
+ sync();
125
+ };
126
+
127
+ handleNavigateSuccess = () => {
128
+ sync();
129
+ };
130
+
131
+ nav.addEventListener("navigate", handleNavigate, {
132
+ passive: true,
133
+ } as EventListenerOptions);
134
+
135
+ nav.addEventListener("currententrychange", handleCurrentEntryChange, {
136
+ passive: true,
137
+ } as EventListenerOptions);
138
+
139
+ nav.addEventListener("navigatesuccess", handleNavigateSuccess, {
90
140
  passive: true,
91
141
  } as EventListenerOptions);
92
142
  }
93
143
 
144
+ // Intercept history.replaceState and history.pushState so synchronous in-feed URL updates
145
+ // immediately update the slotted sidebar in environments without Navigation API or when invoked directly.
146
+ let origReplaceState: typeof window.history.replaceState | null = null;
147
+ let origPushState: typeof window.history.pushState | null = null;
148
+ const historyObj = typeof window !== "undefined" ? window.history : null;
149
+ let unhookHistory: (() => void) | null = null;
150
+
151
+ if (historyObj) {
152
+ origReplaceState = historyObj.replaceState;
153
+ origPushState = historyObj.pushState;
154
+
155
+ const wrappedReplaceState = function (
156
+ this: History,
157
+ _data: any,
158
+ _unused: string,
159
+ url?: string | URL | null,
160
+ ) {
161
+ const res = origReplaceState?.apply(this, arguments as any);
162
+ try {
163
+ if (url) {
164
+ sync(new URL(url.toString(), window.location.href));
165
+ } else {
166
+ sync();
167
+ }
168
+ } catch {
169
+ sync();
170
+ }
171
+ return res;
172
+ };
173
+
174
+ const wrappedPushState = function (
175
+ this: History,
176
+ _data: any,
177
+ _unused: string,
178
+ url?: string | URL | null,
179
+ ) {
180
+ const res = origPushState?.apply(this, arguments as any);
181
+ try {
182
+ if (url) {
183
+ sync(new URL(url.toString(), window.location.href));
184
+ } else {
185
+ sync();
186
+ }
187
+ } catch {
188
+ sync();
189
+ }
190
+ return res;
191
+ };
192
+
193
+ historyObj.replaceState = wrappedReplaceState;
194
+ historyObj.pushState = wrappedPushState;
195
+
196
+ unhookHistory = () => {
197
+ if (historyObj.replaceState === wrappedReplaceState && origReplaceState) {
198
+ historyObj.replaceState = origReplaceState;
199
+ }
200
+ if (historyObj.pushState === wrappedPushState && origPushState) {
201
+ historyObj.pushState = origPushState;
202
+ }
203
+ };
204
+ }
205
+
94
206
  return () => {
95
- window.removeEventListener("popstate", sync);
207
+ window.removeEventListener("popstate", handlePopstate);
208
+ window.removeEventListener(
209
+ "shadow-claw-feed-scroll",
210
+ handleCustomFeedScroll,
211
+ );
212
+ window.removeEventListener(
213
+ "shadow-claw-url-change",
214
+ handleCustomFeedScroll,
215
+ );
96
216
  if (nav && typeof nav.removeEventListener === "function") {
97
- nav.removeEventListener("navigate", sync);
217
+ if (handleNavigate) {
218
+ nav.removeEventListener("navigate", handleNavigate);
219
+ }
220
+ if (handleCurrentEntryChange) {
221
+ nav.removeEventListener("currententrychange", handleCurrentEntryChange);
222
+ }
223
+ if (handleNavigateSuccess) {
224
+ nav.removeEventListener("navigatesuccess", handleNavigateSuccess);
225
+ }
226
+ }
227
+ if (unhookHistory) {
228
+ unhookHistory();
98
229
  }
99
230
  };
100
231
  }
@@ -615,3 +615,14 @@
615
615
  flex: 1;
616
616
  margin-bottom: 0;
617
617
  }
618
+
619
+ form:tool-form-active,
620
+ .conversations__form:tool-form-active {
621
+ outline: 2px dashed var(--accent, #3b82f6);
622
+ outline-offset: 4px;
623
+ }
624
+
625
+ button:tool-submit-active {
626
+ outline: 2px dashed var(--warning, #f59e0b);
627
+ outline-offset: 2px;
628
+ }
@@ -25,7 +25,12 @@
25
25
  dialog-aria-label="Create new conversation"
26
26
  dialog-class="conversations__dialog conversations__create-dialog"
27
27
  >
28
- <form class="conversations__form" method="dialog">
28
+ <form
29
+ class="conversations__form"
30
+ method="dialog"
31
+ toolname="conversations_create"
32
+ tooldescription="Create a new conversation session"
33
+ >
29
34
  <label class="conversations__label" for="conversations-create-name">
30
35
  Conversation name
31
36
  </label>
@@ -36,6 +41,7 @@
36
41
  name="conversations-create-name"
37
42
  required
38
43
  type="text"
44
+ toolparamdescription="Display name of the new conversation"
39
45
  />
40
46
  <div class="conversations__actions">
41
47
  <button class="conversations__cancel" type="button">Cancel</button>
@@ -48,7 +54,12 @@
48
54
  dialog-aria-label="Conversation Details"
49
55
  dialog-class="conversations__dialog conversations__details-dialog"
50
56
  >
51
- <form class="conversations__form" method="dialog">
57
+ <form
58
+ class="conversations__form"
59
+ method="dialog"
60
+ toolname="conversations_edit_details"
61
+ tooldescription="Edit conversation details, model configuration, and pinned tools"
62
+ >
52
63
  <label class="conversations__label" for="conversations-details-name">
53
64
  Conversation name
54
65
  </label>
@@ -59,6 +70,7 @@
59
70
  name="conversations-details-name"
60
71
  required
61
72
  type="text"
73
+ toolparamdescription="Display name of the conversation"
62
74
  />
63
75
  <label
64
76
  class="conversations__label conversations__label--group-id"
@@ -73,6 +85,7 @@
73
85
  name="conversations-details-group-id"
74
86
  readonly
75
87
  type="text"
88
+ toolparamdescription="Unique group identifier for the conversation"
76
89
  />
77
90
  <button
78
91
  type="button"
@@ -202,7 +215,12 @@
202
215
  dialog-aria-label="Delete conversation"
203
216
  dialog-class="conversations__dialog conversations__delete-dialog"
204
217
  >
205
- <form class="conversations__form" method="dialog">
218
+ <form
219
+ class="conversations__form"
220
+ method="dialog"
221
+ toolname="conversations_delete"
222
+ tooldescription="Confirm deletion of the selected conversation"
223
+ >
206
224
  <p class="conversations__delete-message">
207
225
  Delete conversation "<span class="conversations__delete-name"></span>"?
208
226
  This cannot be undone.
@@ -220,7 +238,12 @@
220
238
  dialog-aria-label="Clone conversation"
221
239
  dialog-class="conversations__dialog conversations__clone-dialog"
222
240
  >
223
- <form class="conversations__form" method="dialog">
241
+ <form
242
+ class="conversations__form"
243
+ method="dialog"
244
+ toolname="conversations_clone"
245
+ tooldescription="Confirm cloning of the selected conversation into a new session"
246
+ >
224
247
  <p class="conversations__delete-message">
225
248
  Clone conversation "<span class="conversations__clone-name"></span>"?
226
249
  </p>
@@ -1547,7 +1547,14 @@ export class ShadowClawConversations extends ShadowClawElement {
1547
1547
 
1548
1548
  createForm?.addEventListener("submit", async (e) => {
1549
1549
  e.preventDefault();
1550
- await this._submitCreateDialog();
1550
+ const promise = this._submitCreateDialog();
1551
+ if (
1552
+ (e as any).agentInvoked &&
1553
+ typeof (e as any).respondWith === "function"
1554
+ ) {
1555
+ (e as any).respondWith(promise);
1556
+ }
1557
+ await promise;
1551
1558
  });
1552
1559
 
1553
1560
  // Details dialog
@@ -1577,7 +1584,14 @@ export class ShadowClawConversations extends ShadowClawElement {
1577
1584
 
1578
1585
  detailsForm?.addEventListener("submit", async (e) => {
1579
1586
  e.preventDefault();
1580
- await this._submitDetailsDialog();
1587
+ const promise = this._submitDetailsDialog();
1588
+ if (
1589
+ (e as any).agentInvoked &&
1590
+ typeof (e as any).respondWith === "function"
1591
+ ) {
1592
+ (e as any).respondWith(promise);
1593
+ }
1594
+ await promise;
1581
1595
  });
1582
1596
 
1583
1597
  // Delete dialog
@@ -1598,7 +1612,14 @@ export class ShadowClawConversations extends ShadowClawElement {
1598
1612
 
1599
1613
  deleteForm?.addEventListener("submit", async (e) => {
1600
1614
  e.preventDefault();
1601
- await this._submitDeleteDialog();
1615
+ const promise = this._submitDeleteDialog();
1616
+ if (
1617
+ (e as any).agentInvoked &&
1618
+ typeof (e as any).respondWith === "function"
1619
+ ) {
1620
+ (e as any).respondWith(promise);
1621
+ }
1622
+ await promise;
1602
1623
  });
1603
1624
 
1604
1625
  // Clone dialog
@@ -1619,7 +1640,14 @@ export class ShadowClawConversations extends ShadowClawElement {
1619
1640
 
1620
1641
  cloneForm?.addEventListener("submit", async (e) => {
1621
1642
  e.preventDefault();
1622
- await this._submitCloneDialog();
1643
+ const promise = this._submitCloneDialog();
1644
+ if (
1645
+ (e as any).agentInvoked &&
1646
+ typeof (e as any).respondWith === "function"
1647
+ ) {
1648
+ (e as any).respondWith(promise);
1649
+ }
1650
+ await promise;
1623
1651
  });
1624
1652
  }
1625
1653