shadow-claw 1.26.0 → 1.27.1

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 (230) hide show
  1. package/.agents/skills/main/skill-creator/SKILL.md +39 -0
  2. package/.agents/skills/main/skill-creator/references/declarative-pipelines.md +44 -0
  3. package/.agents/skills/main/skill-creator/references/declarative-tools.md +35 -0
  4. package/.agents/skills/main/skill-creator/references/frontmatter-spec.md +50 -0
  5. package/.well-known/agent-skills/index.json +14 -0
  6. package/README.md +5 -3
  7. package/bin/build/build.mjs +148 -15
  8. package/bin/build/build.test.mjs +128 -0
  9. package/bin/cli.mjs +35 -0
  10. package/bin/commands/mcp.mjs +277 -55
  11. package/bin/commands/mcp.test.mjs +275 -1
  12. package/bin/commands/skills-index.mjs +447 -0
  13. package/bin/commands/skills-index.test.mjs +243 -0
  14. package/bin/site-config/utils/custom-elements/get-approved-custom-element-scripts.test.mjs +2 -0
  15. package/bin/site-config/utils/custom-elements/sanitize-embedded-custom-element-scripts.test.mjs +10 -1
  16. package/dist/lib/components/index.js +25 -25
  17. package/dist/lib/components/settings/shadow-claw-accounts.js +1 -1
  18. package/dist/lib/components/settings/shadow-claw-channel-config.js +1 -1
  19. package/dist/lib/components/settings/shadow-claw-control-plane.js +1 -1
  20. package/dist/lib/components/settings/shadow-claw-git.js +1 -1
  21. package/dist/lib/components/settings/shadow-claw-integrations.js +1 -1
  22. package/dist/lib/components/settings/shadow-claw-llm.js +1 -1
  23. package/dist/lib/components/settings/shadow-claw-mcp-remote.js +1 -1
  24. package/dist/lib/components/settings/shadow-claw-networking.js +1 -1
  25. package/dist/lib/components/settings/shadow-claw-peerjs.js +1 -1
  26. package/dist/lib/components/settings/shadow-claw-storage.js +1 -1
  27. package/dist/lib/components/settings/shadow-claw-task-server.js +1 -1
  28. package/dist/lib/components/settings/shadow-claw-webvm.js +1 -1
  29. package/dist/lib/components/shadow-claw-a2ui.js +1 -1
  30. package/dist/lib/components/shadow-claw-accounts.js +1 -1
  31. package/dist/lib/components/shadow-claw-channel-config.js +1 -1
  32. package/dist/lib/components/shadow-claw-channels.js +1 -1
  33. package/dist/lib/components/shadow-claw-chat.js +1 -1
  34. package/dist/lib/components/shadow-claw-control-plane.js +1 -1
  35. package/dist/lib/components/shadow-claw-conversations.js +1 -1
  36. package/dist/lib/components/shadow-claw-file-viewer.js +1 -1
  37. package/dist/lib/components/shadow-claw-files.js +1 -1
  38. package/dist/lib/components/shadow-claw-git.js +1 -1
  39. package/dist/lib/components/shadow-claw-integrations.js +1 -1
  40. package/dist/lib/components/shadow-claw-llm.js +1 -1
  41. package/dist/lib/components/shadow-claw-mcp-remote.js +1 -1
  42. package/dist/lib/components/shadow-claw-networking.js +1 -1
  43. package/dist/lib/components/shadow-claw-page-header.js +1 -1
  44. package/dist/lib/components/shadow-claw-pages.js +1 -1
  45. package/dist/lib/components/shadow-claw-peerjs.js +1 -1
  46. package/dist/lib/components/shadow-claw-settings.js +1 -1
  47. package/dist/lib/components/shadow-claw-storage.js +1 -1
  48. package/dist/lib/components/shadow-claw-task-server.js +1 -1
  49. package/dist/lib/components/shadow-claw-tasks.js +1 -1
  50. package/dist/lib/components/shadow-claw-terminal.js +1 -1
  51. package/dist/lib/components/shadow-claw-tools.js +1 -1
  52. package/dist/lib/components/shadow-claw-webvm.js +1 -1
  53. package/dist/lib/components/shadow-claw.js +1 -1
  54. package/dist/lib/{configurePeerJs-CrlGan0m.js → configurePeerJs-oODzltaC.js} +2 -2
  55. package/dist/lib/{configurePeerJs-CrlGan0m.js.map → configurePeerJs-oODzltaC.js.map} +1 -1
  56. package/dist/lib/core/control-plane-client.d.ts +1 -0
  57. package/dist/lib/{downloadGroupFile-DboUjmp2.js → downloadGroupFile-DmcBQU1n.js} +2 -2
  58. package/dist/lib/{downloadGroupFile-DboUjmp2.js.map → downloadGroupFile-DmcBQU1n.js.map} +1 -1
  59. package/dist/lib/{file-viewer-BrK2Wxgh.js → file-viewer-C3YKnq_-.js} +4 -3
  60. package/dist/lib/{file-viewer-BrK2Wxgh.js.map → file-viewer-C3YKnq_-.js.map} +1 -1
  61. package/dist/lib/index.js +26 -26
  62. package/dist/lib/{initControlPlane-CsO4UR6_.js → initControlPlane-C2zURVIS.js} +86 -13
  63. package/dist/lib/initControlPlane-C2zURVIS.js.map +1 -0
  64. package/dist/lib/{markdown-eeSTFnMA.js → markdown-C6EHl9zs.js} +3 -3
  65. package/dist/lib/{markdown-eeSTFnMA.js.map → markdown-C6EHl9zs.js.map} +1 -1
  66. package/dist/lib/{orchestrator-CJvoC2Uu.js → orchestrator-CACLa_Ro.js} +7 -6
  67. package/dist/lib/{orchestrator-CJvoC2Uu.js.map → orchestrator-CACLa_Ro.js.map} +1 -1
  68. package/dist/lib/{orchestrator-DCfomsn9.js → orchestrator-KRjx0eba.js} +6 -534
  69. package/dist/lib/{orchestrator-DCfomsn9.js.map → orchestrator-KRjx0eba.js.map} +1 -1
  70. package/dist/lib/parsePath-DwC_YZjw.js +16 -0
  71. package/dist/lib/parsePath-DwC_YZjw.js.map +1 -0
  72. package/dist/lib/{peerjs-Dp02bXcG.js → peerjs-DFWOBcXf.js} +4 -4
  73. package/dist/lib/{peerjs-Dp02bXcG.js.map → peerjs-DFWOBcXf.js.map} +1 -1
  74. package/dist/lib/{readGroupFileBytes-Bve-e5e_.js → readGroupFileBytes-C8oOe8Iu.js} +3 -16
  75. package/dist/lib/readGroupFileBytes-C8oOe8Iu.js.map +1 -0
  76. package/dist/lib/security/custom-element-security.d.ts +8 -0
  77. package/dist/lib/server/control-plane-types.d.ts +1 -1
  78. package/dist/lib/{shadow-claw-D8xINM3c.js → shadow-claw-6UHdiy4a.js} +5 -5
  79. package/dist/lib/{shadow-claw-D8xINM3c.js.map → shadow-claw-6UHdiy4a.js.map} +1 -1
  80. package/dist/lib/{shadow-claw-a2ui-7rJqG4Ke.js → shadow-claw-a2ui-CpZUTzlh.js} +5 -4
  81. package/dist/lib/{shadow-claw-a2ui-7rJqG4Ke.js.map → shadow-claw-a2ui-CpZUTzlh.js.map} +1 -1
  82. package/dist/lib/{shadow-claw-accounts-CdruwN8A.js → shadow-claw-accounts-03oJ__XC.js} +2 -2
  83. package/dist/lib/{shadow-claw-accounts-CdruwN8A.js.map → shadow-claw-accounts-03oJ__XC.js.map} +1 -1
  84. package/dist/lib/{shadow-claw-channel-config-Bj0-Nk3t.js → shadow-claw-channel-config-DmfwJc6G.js} +3 -3
  85. package/dist/lib/{shadow-claw-channel-config-Bj0-Nk3t.js.map → shadow-claw-channel-config-DmfwJc6G.js.map} +1 -1
  86. package/dist/lib/{shadow-claw-channels-C_jI4KhP.js → shadow-claw-channels-1N6Jl-By.js} +3 -3
  87. package/dist/lib/{shadow-claw-channels-C_jI4KhP.js.map → shadow-claw-channels-1N6Jl-By.js.map} +1 -1
  88. package/dist/lib/{shadow-claw-chat-B16MspoP.js → shadow-claw-chat-BMoqQJRK.js} +10 -10
  89. package/dist/lib/{shadow-claw-chat-B16MspoP.js.map → shadow-claw-chat-BMoqQJRK.js.map} +1 -1
  90. package/dist/lib/{shadow-claw-control-plane-x8Ldid_h.js → shadow-claw-control-plane-UG0o7pCz.js} +6 -6
  91. package/dist/lib/{shadow-claw-control-plane-x8Ldid_h.js.map → shadow-claw-control-plane-UG0o7pCz.js.map} +1 -1
  92. package/dist/lib/{shadow-claw-conversations-Ct1kAYdB.js → shadow-claw-conversations-BwXep3iu.js} +4 -3
  93. package/dist/lib/{shadow-claw-conversations-Ct1kAYdB.js.map → shadow-claw-conversations-BwXep3iu.js.map} +1 -1
  94. package/dist/lib/{shadow-claw-file-viewer-BfDHHgpA.js → shadow-claw-file-viewer-DUxzVxDT.js} +14 -10
  95. package/dist/lib/shadow-claw-file-viewer-DUxzVxDT.js.map +1 -0
  96. package/dist/lib/{shadow-claw-files-EYhOPYIH.js → shadow-claw-files-DIREEnT2.js} +7 -7
  97. package/dist/lib/{shadow-claw-files-EYhOPYIH.js.map → shadow-claw-files-DIREEnT2.js.map} +1 -1
  98. package/dist/lib/{shadow-claw-git-tcSpT-P0.js → shadow-claw-git-Bg1SWgsF.js} +4 -4
  99. package/dist/lib/{shadow-claw-git-tcSpT-P0.js.map → shadow-claw-git-Bg1SWgsF.js.map} +1 -1
  100. package/dist/lib/{shadow-claw-integrations-NbcCx_ZI.js → shadow-claw-integrations-Ds-CLPhj.js} +2 -2
  101. package/dist/lib/{shadow-claw-integrations-NbcCx_ZI.js.map → shadow-claw-integrations-Ds-CLPhj.js.map} +1 -1
  102. package/dist/lib/{shadow-claw-llm-BazJdD5f.js → shadow-claw-llm-CazBrVpM.js} +3 -3
  103. package/dist/lib/{shadow-claw-llm-BazJdD5f.js.map → shadow-claw-llm-CazBrVpM.js.map} +1 -1
  104. package/dist/lib/{shadow-claw-mcp-remote-CYmhpg7a.js → shadow-claw-mcp-remote-CT5Q-54E.js} +2 -2
  105. package/dist/lib/{shadow-claw-mcp-remote-CYmhpg7a.js.map → shadow-claw-mcp-remote-CT5Q-54E.js.map} +1 -1
  106. package/dist/lib/{shadow-claw-networking-DImPxe0H.js → shadow-claw-networking-Df85tCbO.js} +2 -2
  107. package/dist/lib/{shadow-claw-networking-DImPxe0H.js.map → shadow-claw-networking-Df85tCbO.js.map} +1 -1
  108. package/dist/lib/{shadow-claw-page-header-CcHUfFUx.js → shadow-claw-page-header-Cti2fzf-.js} +2 -2
  109. package/dist/lib/{shadow-claw-page-header-CcHUfFUx.js.map → shadow-claw-page-header-Cti2fzf-.js.map} +1 -1
  110. package/dist/lib/{shadow-claw-pages-D54jF1Qq.js → shadow-claw-pages-BgPyIEZO.js} +15 -11
  111. package/dist/lib/shadow-claw-pages-BgPyIEZO.js.map +1 -0
  112. package/dist/lib/{shadow-claw-peerjs-B9-T8Nlx.js → shadow-claw-peerjs-xkBXILed.js} +3 -3
  113. package/dist/lib/{shadow-claw-peerjs-B9-T8Nlx.js.map → shadow-claw-peerjs-xkBXILed.js.map} +1 -1
  114. package/dist/lib/{shadow-claw-settings-Bt1VAe-1.js → shadow-claw-settings-CN89xRVU.js} +4 -4
  115. package/dist/lib/{shadow-claw-settings-Bt1VAe-1.js.map → shadow-claw-settings-CN89xRVU.js.map} +1 -1
  116. package/dist/lib/{shadow-claw-storage-CFOjGf1d.js → shadow-claw-storage-VnhcObCe.js} +3 -3
  117. package/dist/lib/{shadow-claw-storage-CFOjGf1d.js.map → shadow-claw-storage-VnhcObCe.js.map} +1 -1
  118. package/dist/lib/{shadow-claw-task-server-BiKa2GOm.js → shadow-claw-task-server-jgEC2hHB.js} +2 -2
  119. package/dist/lib/{shadow-claw-task-server-BiKa2GOm.js.map → shadow-claw-task-server-jgEC2hHB.js.map} +1 -1
  120. package/dist/lib/{shadow-claw-tasks-DDHd8W4d.js → shadow-claw-tasks-i_evIufy.js} +6 -6
  121. package/dist/lib/{shadow-claw-tasks-DDHd8W4d.js.map → shadow-claw-tasks-i_evIufy.js.map} +1 -1
  122. package/dist/lib/{shadow-claw-terminal-kB6_tWKz.js → shadow-claw-terminal-CwScROlu.js} +2 -2
  123. package/dist/lib/{shadow-claw-terminal-kB6_tWKz.js.map → shadow-claw-terminal-CwScROlu.js.map} +1 -1
  124. package/dist/lib/{shadow-claw-tools-DxXIm0ku.js → shadow-claw-tools-DD3fyXP4.js} +5 -4
  125. package/dist/lib/{shadow-claw-tools-DxXIm0ku.js.map → shadow-claw-tools-DD3fyXP4.js.map} +1 -1
  126. package/dist/lib/{shadow-claw-webvm-Dc8oo7ao.js → shadow-claw-webvm-DbJq4I3-.js} +2 -2
  127. package/dist/lib/{shadow-claw-webvm-Dc8oo7ao.js.map → shadow-claw-webvm-DbJq4I3-.js.map} +1 -1
  128. package/dist/lib/{syncWebMcpRegistration-jyRGbC9w.js → syncWebMcpRegistration-DNLnQ-jz.js} +3 -2
  129. package/dist/lib/{syncWebMcpRegistration-jyRGbC9w.js.map → syncWebMcpRegistration-DNLnQ-jz.js.map} +1 -1
  130. package/dist/lib/tools-DwwB9RBa.js +546 -0
  131. package/dist/lib/tools-DwwB9RBa.js.map +1 -0
  132. package/dist/lib/{trusted-types-CkLDpLiZ.js → trusted-types-Dx0RZlrd.js} +19 -8
  133. package/dist/lib/trusted-types-Dx0RZlrd.js.map +1 -0
  134. package/dist/lib/utils/index.js +1 -1
  135. package/dist/lib/utils/utils.js +1 -1
  136. package/dist/public/.well-known/agent-skills/index.json +14 -0
  137. package/dist/public/AGENTS.md +5 -3
  138. package/dist/public/README.md +5 -3
  139. package/dist/public/agent.worker.js +1 -1
  140. package/dist/public/{configurePeerJs-COcwE0E7.js → configurePeerJs-BqgeBjP7.js} +1 -1
  141. package/dist/public/custom-element-security-FU04Cq05.js +1 -0
  142. package/dist/public/dist-B9m1QM9v.js +58 -0
  143. package/dist/public/docs/README.md +31 -31
  144. package/dist/public/docs/example/article/index.html +1 -1
  145. package/dist/public/docs/publishing/index.html +1 -1
  146. package/dist/public/docs/skill-creator/index.html +1 -1
  147. package/dist/public/docs/subsystems/a2ui.md +11 -1
  148. package/dist/public/docs/subsystems/cli.md +32 -0
  149. package/dist/public/docs/subsystems/control-plane.md +8 -2
  150. package/dist/public/docs/subsystems/custom-element-security.md +19 -9
  151. package/dist/public/docs/subsystems/mcp-server.md +39 -15
  152. package/dist/public/docs/subsystems/skills.md +30 -0
  153. package/dist/public/docs/subsystems/webmcp.md +9 -0
  154. package/dist/public/downloadGroupFile-D8KRJGGL.js +1 -0
  155. package/dist/public/e2e/README.md +7 -4
  156. package/dist/public/{e2e-bridge-CHARpbpW.js → e2e-bridge-Ceqr5kGc.js} +1 -1
  157. package/dist/public/effect-BJCrpFdp.js +1 -0
  158. package/dist/public/file-viewer-C-6Jc_tb.js +1 -0
  159. package/dist/public/index.html +1 -1
  160. package/dist/public/index.js +1 -1
  161. package/dist/public/initControlPlane-BN9cWyO0.js +1 -0
  162. package/dist/public/main/index.html +1 -1
  163. package/dist/public/main/memory/index.html +1 -1
  164. package/dist/public/{markdown-1I3O6Mmd.js → markdown-C3M4OW_A.js} +1 -1
  165. package/dist/public/{orchestrator-Cl95w2vb.js → orchestrator-CMbCTjBf.js} +7 -7
  166. package/dist/public/{orchestrator-D-xlXG92.js → orchestrator-DHjdLtqa.js} +663 -663
  167. package/dist/public/peerjs-DUCKH-m9.js +1 -0
  168. package/dist/public/service-worker.js +1 -1
  169. package/dist/public/{shadow-claw-CaoKmIIB.js → shadow-claw-EAt2ml5Y.js} +3 -3
  170. package/dist/public/{shadow-claw-accounts-CJvYC4li.js → shadow-claw-accounts-xUOLBsQZ.js} +1 -1
  171. package/dist/public/{shadow-claw-channels-3K62sU5f.js → shadow-claw-channels-XsfuWFF8.js} +4 -4
  172. package/dist/public/{shadow-claw-chat-Cu2keU2I.js → shadow-claw-chat-CbSaOZ4q.js} +7 -7
  173. package/dist/public/{shadow-claw-control-plane-D1OwlQI_.js → shadow-claw-control-plane-DHvN3Ukg.js} +2 -2
  174. package/dist/public/{shadow-claw-conversations-DDtg3BEZ.js → shadow-claw-conversations-BWs5VVfs.js} +2 -2
  175. package/dist/public/{shadow-claw-file-viewer-BR__1z9S.js → shadow-claw-file-viewer-BWsoW5QS.js} +5 -4
  176. package/dist/public/{shadow-claw-files-BJSyZ-Bl.js → shadow-claw-files-CG7MqWiV.js} +8 -8
  177. package/dist/public/{shadow-claw-git-MAjhXRLc.js → shadow-claw-git-DBRPZNav.js} +6 -6
  178. package/dist/public/{shadow-claw-integrations-82UoFuDR.js → shadow-claw-integrations-BBVnO0Fc.js} +8 -8
  179. package/dist/public/{shadow-claw-llm-R8j0lwPP.js → shadow-claw-llm-DMvLgKXo.js} +2 -2
  180. package/dist/public/{shadow-claw-mcp-remote-BzZoz4LX.js → shadow-claw-mcp-remote-Bkx0gsmF.js} +2 -2
  181. package/dist/public/{shadow-claw-networking-DLEd9cNm.js → shadow-claw-networking-Dd8Rw31D.js} +2 -2
  182. package/dist/public/{shadow-claw-notifications-1vwR7TbT.js → shadow-claw-notifications-Dbevj-lq.js} +2 -2
  183. package/dist/public/{shadow-claw-page-header-DMKbkv3s.js → shadow-claw-page-header-BccSHItx.js} +1 -1
  184. package/dist/public/{shadow-claw-pages-CjyeIV__.js → shadow-claw-pages-3_lQAv0t.js} +4 -3
  185. package/dist/public/{shadow-claw-settings-BfbT4dBU.js → shadow-claw-settings-t8TIlgrM.js} +5 -5
  186. package/dist/public/{shadow-claw-storage-C-mWQQML.js → shadow-claw-storage-CfEXoSIE.js} +2 -2
  187. package/dist/public/{shadow-claw-task-server-D3lHp0Nc.js → shadow-claw-task-server-DxQSsgRZ.js} +2 -2
  188. package/dist/public/{shadow-claw-tasks-DVVWEm-c.js → shadow-claw-tasks-DNpicQwz.js} +14 -14
  189. package/dist/public/{shadow-claw-terminal-BwuTRp-O.js → shadow-claw-terminal-DpY6zU_r.js} +1 -1
  190. package/dist/public/{shadow-claw-toast-ClCwgzFG.js → shadow-claw-toast-BkrQIP-3.js} +1 -1
  191. package/dist/public/{shadow-claw-tools-zFLk2nbV.js → shadow-claw-tools-WSwWohnk.js} +2 -2
  192. package/dist/public/{shadow-claw-webvm-qR9X7fg7.js → shadow-claw-webvm-CP6oFjg5.js} +2 -2
  193. package/dist/public/syncWebMcpRegistration-DOn9gLnD.js +1 -0
  194. package/dist/public/toast-BXgUfbyh.js +1 -0
  195. package/dist/public/tools-DvckJZG2.js +1 -0
  196. package/dist/server.js +188 -188
  197. package/package.json +3 -1
  198. package/src/components/shadow-claw-a2ui/shadow-claw-a2ui.stories.ts +1380 -93
  199. package/src/components/shadow-claw-a2ui/shadow-claw-a2ui.ts +11 -6
  200. package/src/components/shadow-claw-file-viewer/shadow-claw-file-viewer.test.ts +8 -1
  201. package/src/components/shadow-claw-file-viewer/shadow-claw-file-viewer.ts +13 -5
  202. package/src/components/shadow-claw-pages/utils/buildHtmlPageSrcdoc.ts +13 -5
  203. package/src/core/control-plane-client.ts +15 -0
  204. package/src/core/utils/initControlPlane.test.ts +187 -0
  205. package/src/core/utils/initControlPlane.ts +194 -20
  206. package/src/security/custom-element-security.test.ts +51 -0
  207. package/src/security/custom-element-security.ts +33 -15
  208. package/src/server/control-plane-types.ts +1 -0
  209. package/src/server/control-plane.test.ts +69 -0
  210. package/src/server/control-plane.ts +45 -3
  211. package/src/server/mcp/tools/built-in-tools.ts +80 -5
  212. package/src/server/mcp/tools/client-tool-relay.ts +183 -26
  213. package/src/server/mcp/tools/mcp-tools.test.ts +140 -0
  214. package/src/server/middleware/static-files.test.ts +142 -0
  215. package/src/server/middleware/static-files.ts +66 -8
  216. package/src/testing/jest-setup.ts +14 -0
  217. package/src/worker/utils/handleMessage.ts +4 -1
  218. package/dist/lib/initControlPlane-CsO4UR6_.js.map +0 -1
  219. package/dist/lib/readGroupFileBytes-Bve-e5e_.js.map +0 -1
  220. package/dist/lib/shadow-claw-file-viewer-BfDHHgpA.js.map +0 -1
  221. package/dist/lib/shadow-claw-pages-D54jF1Qq.js.map +0 -1
  222. package/dist/lib/trusted-types-CkLDpLiZ.js.map +0 -1
  223. package/dist/public/custom-element-security-NCqQ5lmC.js +0 -1
  224. package/dist/public/downloadGroupFile-G0BZQgQg.js +0 -1
  225. package/dist/public/effect-rHYr4nfu.js +0 -1
  226. package/dist/public/file-viewer-8PdCURDD.js +0 -1
  227. package/dist/public/initControlPlane-CcGXax0A.js +0 -1
  228. package/dist/public/peerjs-BZdxWQFv.js +0 -1
  229. package/dist/public/syncWebMcpRegistration-DD42YsYV.js +0 -1
  230. package/dist/public/toast-HAq8XWFj.js +0 -58
@@ -146,6 +146,9 @@ var ControlPlaneClient = class {
146
146
  }
147
147
  disconnect() {
148
148
  this._isDestroyed = true;
149
+ try {
150
+ this._sendUnregister();
151
+ } catch (_) {}
149
152
  this._cleanupConnection();
150
153
  if (this._reconnectTimer) {
151
154
  clearTimeout(this._reconnectTimer);
@@ -214,6 +217,15 @@ var ControlPlaneClient = class {
214
217
  payload
215
218
  });
216
219
  }
220
+ _sendUnregister() {
221
+ if (!this._clientId) return;
222
+ const payload = { clientId: this._clientId };
223
+ this._sendMessage({
224
+ id: ulid(),
225
+ type: "client:unregister",
226
+ payload
227
+ });
228
+ }
217
229
  _sendMessage(msg) {
218
230
  if (this._transport === "websocket") {
219
231
  if (this._ws && (this._ws.readyState === 1 || this._ws.readyState === this._WebSocketClass?.OPEN)) this._ws.send(JSON.stringify(msg));
@@ -381,7 +393,7 @@ async function executeClientControlCommand(action, args = {}, options = {}) {
381
393
  switch (action) {
382
394
  case "send-message": {
383
395
  if (!args.text) throw new Error("Missing text parameter");
384
- const { orchestratorStore } = await import("./orchestrator-DCfomsn9.js").then((n) => n.n);
396
+ const { orchestratorStore } = await import("./orchestrator-KRjx0eba.js").then((n) => n.n);
385
397
  const orch = options.orchestrator || orchestratorStore.orchestrator;
386
398
  const targetGroupId = args.groupId || orchestratorStore.activeGroupId || "br:main";
387
399
  if (orch?.browserChat?.submit) {
@@ -416,7 +428,7 @@ async function executeClientControlCommand(action, args = {}, options = {}) {
416
428
  return { tasks };
417
429
  }
418
430
  case "read-state": {
419
- const { orchestratorStore } = await import("./orchestrator-DCfomsn9.js").then((n) => n.n);
431
+ const { orchestratorStore } = await import("./orchestrator-KRjx0eba.js").then((n) => n.n);
420
432
  const orch = options.orchestrator || orchestratorStore.orchestrator;
421
433
  return {
422
434
  clientId,
@@ -437,6 +449,21 @@ async function executeClientControlCommand(action, args = {}, options = {}) {
437
449
  annotations: t.annotations
438
450
  })) };
439
451
  } catch (_) {}
452
+ try {
453
+ const { orchestratorStore } = await import("./orchestrator-KRjx0eba.js").then((n) => n.n);
454
+ const orch = options.orchestrator || orchestratorStore.orchestrator || (typeof document !== "undefined" ? document.querySelector("shadow-claw")?.orchestrator : null);
455
+ const activeGroupId = args.groupId || orch?.activeGroupId || orchestratorStore.activeGroupId || "br:main";
456
+ const group = orchestratorStore.groups.find((g) => g.groupId === activeGroupId);
457
+ if (group?.toolTags && group.toolTags.length > 0) {
458
+ const { TOOL_DEFINITIONS } = await import("./tools-DBaMRiEu.js").then((n) => n.n);
459
+ const { parseWebMcpInputSchema } = await import("./webmcp-j_1_T3wf.js").then((n) => n.a);
460
+ return { tools: TOOL_DEFINITIONS.filter((t) => group.toolTags.includes(t.name)).map((t) => ({
461
+ name: t.name,
462
+ description: t.description,
463
+ inputSchema: parseWebMcpInputSchema(t.input_schema)
464
+ })) };
465
+ }
466
+ } catch (_) {}
440
467
  const { TOOL_DEFINITIONS } = await import("./tools-DBaMRiEu.js").then((n) => n.n);
441
468
  const { parseWebMcpInputSchema } = await import("./webmcp-j_1_T3wf.js").then((n) => n.a);
442
469
  return { tools: TOOL_DEFINITIONS.map((t) => ({
@@ -447,26 +474,72 @@ async function executeClientControlCommand(action, args = {}, options = {}) {
447
474
  }
448
475
  case "invoke-tool": {
449
476
  if (!args.toolName) throw new Error("Missing toolName parameter");
477
+ try {
478
+ const { orchestratorStore } = await import("./orchestrator-KRjx0eba.js").then((n) => n.n);
479
+ const { toolsStore } = await import("./tools-DwwB9RBa.js").then((n) => n.n);
480
+ const orch = options.orchestrator || orchestratorStore.orchestrator || (typeof document !== "undefined" ? document.querySelector("shadow-claw")?.orchestrator : null);
481
+ const activeGroupId = args.groupId || orch?.activeGroupId || orchestratorStore.activeGroupId || "br:main";
482
+ const group = orchestratorStore.groups.find((g) => g.groupId === activeGroupId);
483
+ if (group?.toolTags && group.toolTags.length > 0) {
484
+ if (!group.toolTags.includes(args.toolName)) throw new Error(`Tool '${args.toolName}' is not enabled in the active conversation (${activeGroupId}).`);
485
+ } else if (toolsStore?.allTools && toolsStore.allTools.some((t) => t.name === args.toolName) && toolsStore?.enabledToolNames && toolsStore.enabledToolNames.size > 0) {
486
+ const isBuiltIn = toolsStore.enabledToolNames.has(args.toolName);
487
+ const isDeclarative = toolsStore.isDeclarativeToolEnabled(args.toolName);
488
+ if (!isBuiltIn && !isDeclarative) throw new Error(`Tool '${args.toolName}' is not enabled on this client.`);
489
+ }
490
+ } catch (err) {
491
+ if (err.message && err.message.includes("is not enabled")) throw err;
492
+ }
450
493
  const ctx = typeof document !== "undefined" && document.modelContext || typeof navigator !== "undefined" && navigator.modelContext;
451
494
  if (ctx) {
495
+ let matchedTool;
452
496
  if (typeof ctx.getTools === "function") try {
453
497
  const tools = await ctx.getTools();
454
- const tool = Array.isArray(tools) ? tools.find((t) => t.name === args.toolName) : void 0;
455
- if (tool && typeof tool.execute === "function") return { result: await tool.execute(args.input || {}) };
498
+ if (Array.isArray(tools) && tools.length > 0) {
499
+ matchedTool = tools.find((t) => t.name === args.toolName);
500
+ if (!matchedTool) throw new Error(`Tool '${args.toolName}' is not enabled or registered on this client.`);
501
+ } else matchedTool = Array.isArray(tools) ? tools.find((t) => t.name === args.toolName) : void 0;
502
+ if (matchedTool && typeof matchedTool.execute === "function") return { result: await matchedTool.execute(typeof args.input === "string" ? JSON.parse(args.input) : args.input || {}) };
503
+ } catch (err) {
504
+ if (err.message && err.message.includes("is not enabled")) throw err;
505
+ }
506
+ const inputStr = typeof args.input === "string" ? args.input : JSON.stringify(args.input || {});
507
+ if (typeof ctx.executeTool === "function") {
508
+ if (matchedTool) try {
509
+ return { result: await ctx.executeTool(matchedTool, inputStr) };
510
+ } catch (_) {}
511
+ try {
512
+ return { result: await ctx.executeTool({ name: args.toolName }, inputStr) };
513
+ } catch (_) {}
514
+ try {
515
+ return { result: await ctx.executeTool(args.toolName, inputStr) };
516
+ } catch (_) {}
517
+ }
518
+ if (typeof navigator !== "undefined" && navigator.modelContextTesting && typeof navigator.modelContextTesting.executeTool === "function") try {
519
+ return { result: await navigator.modelContextTesting.executeTool(args.toolName, inputStr) };
520
+ } catch (_) {}
521
+ if (typeof ctx.callTool === "function") try {
522
+ return { result: await ctx.callTool({
523
+ name: args.toolName,
524
+ arguments: typeof args.input === "string" ? JSON.parse(args.input) : args.input || {}
525
+ }) };
526
+ } catch (_) {}
527
+ if (typeof ctx.invoke === "function") try {
528
+ return { result: await ctx.invoke(args.toolName, typeof args.input === "string" ? JSON.parse(args.input) : args.input || {}) };
456
529
  } catch (_) {}
457
- if (typeof ctx.executeTool === "function") return { result: await ctx.executeTool({ name: args.toolName }, typeof args.input === "string" ? args.input : JSON.stringify(args.input || {})) };
458
- if (typeof ctx.invoke === "function") return { result: await ctx.invoke(args.toolName, args.input || {}) };
459
530
  }
460
- const { orchestratorStore } = await import("./orchestrator-DCfomsn9.js").then((n) => n.n);
461
- const orch = options.orchestrator || orchestratorStore.orchestrator;
531
+ const { orchestratorStore } = await import("./orchestrator-KRjx0eba.js").then((n) => n.n);
532
+ const orch = options.orchestrator || orchestratorStore.orchestrator || (typeof document !== "undefined" ? document.querySelector("shadow-claw")?.orchestrator : null);
462
533
  const worker = orch?.agentWorker;
463
534
  if (worker && typeof worker.postMessage === "function") {
464
535
  const callId = Date.now().toString(36) + Math.random().toString(36).slice(2);
536
+ const isInteractive = args.toolName === "ask_user";
537
+ const fallbackTimeoutMs = args.timeoutMs || (isInteractive ? 3e5 : 6e4);
465
538
  return { result: await new Promise((resolve, reject) => {
466
539
  const timeout = setTimeout(() => {
467
540
  worker.removeEventListener("message", handler);
468
541
  reject(/* @__PURE__ */ new Error("Timeout waiting for tool execution"));
469
- }, 6e4);
542
+ }, fallbackTimeoutMs);
470
543
  const handler = (event) => {
471
544
  const data = event.data;
472
545
  if (data && data.type === "execute-tool-result" && data.callId === callId) {
@@ -482,8 +555,8 @@ async function executeClientControlCommand(action, args = {}, options = {}) {
482
555
  callId,
483
556
  payload: {
484
557
  name: args.toolName,
485
- input: args.input || {},
486
- groupId: args.groupId || orch.activeGroupId || "br:main"
558
+ input: typeof args.input === "string" ? JSON.parse(args.input) : args.input || {},
559
+ groupId: args.groupId || orch?.activeGroupId || "br:main"
487
560
  }
488
561
  });
489
562
  }) };
@@ -491,7 +564,7 @@ async function executeClientControlCommand(action, args = {}, options = {}) {
491
564
  throw new Error(`Tool ${args.toolName} could not be executed (no context or worker available)`);
492
565
  }
493
566
  case "trigger-backup": {
494
- const { orchestratorStore } = await import("./orchestrator-DCfomsn9.js").then((n) => n.n);
567
+ const { orchestratorStore } = await import("./orchestrator-KRjx0eba.js").then((n) => n.n);
495
568
  const targetGroupId = args.groupId || options.orchestrator?.activeGroupId || orchestratorStore.activeGroupId || "br:main";
496
569
  const db = await getDb();
497
570
  const { getGroupDir } = await import("./getGroupDir-m0f-ekgX.js").then((n) => n.n);
@@ -583,4 +656,4 @@ function stopControlPlaneClient() {
583
656
 
584
657
  //#endregion
585
658
  export { createDefaultControlPlaneClient, executeClientControlCommand, isControlPlaneEnabled, shouldConnectControlPlane, stopControlPlaneClient };
586
- //# sourceMappingURL=initControlPlane-CsO4UR6_.js.map
659
+ //# sourceMappingURL=initControlPlane-C2zURVIS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"initControlPlane-C2zURVIS.js","names":["process"],"sources":["../../src/core/control-plane-client.ts","../../src/core/utils/initControlPlane.ts"],"sourcesContent":["/**\n * ShadowClaw — Browser Control Plane Client\n *\n * Supports dual transport:\n * 1. \"sse\" (default): HTTP Server-Sent Events (GET /api/control/events) for\n * server-to-client commands + HTTP POST (/api/control/messages) for client-to-server.\n * Highly proxy-, CDN-, and firewall-compatible.\n * 2. \"websocket\": Full-duplex WebSocket connection to `/ws/control`.\n */\n\nimport type {\n ControlMessage,\n ClientRegisterPayload,\n HeartbeatPayload,\n CommandExecutePayload,\n CommandResultPayload,\n ControlPlaneTransport,\n} from \"../server/control-plane-types.js\";\nimport { ulid } from \"../utils/ulid.js\";\n\nexport type CommandHandler = (args: any) => Promise<any> | any;\n\nexport interface ControlPlaneClientOptions {\n transport?: ControlPlaneTransport;\n url?: string;\n httpUrl?: string;\n token?: string;\n clientId: string;\n deviceLabel?: string;\n capabilities?: string[];\n version?: string;\n peerId?: string;\n heartbeatIntervalMs?: number;\n reconnectDelayMs?: number;\n maxReconnectDelayMs?: number;\n handlers?: Record<string, CommandHandler>;\n WebSocketClass?: any;\n EventSourceClass?: any;\n fetchFn?: typeof fetch;\n}\n\nexport class ControlPlaneClient {\n private _transport: ControlPlaneTransport;\n private _url: string;\n private _httpUrl: string;\n private _token?: string;\n private _clientId: string;\n private _peerId?: string;\n private _deviceLabel: string;\n private _capabilities: string[];\n private _version: string;\n private _heartbeatIntervalMs: number;\n private _reconnectDelayMs: number;\n private _maxReconnectDelayMs: number;\n private _handlers: Map<string, CommandHandler>;\n private _WebSocketClass: any;\n private _EventSourceClass: any;\n private _fetchFn: typeof fetch;\n\n private _ws: WebSocket | null = null;\n private _es: any = null;\n private _heartbeatTimer: any = null;\n private _reconnectTimer: any = null;\n private _currentReconnectDelay: number;\n private _isDestroyed: boolean = false;\n private _state: \"disconnected\" | \"connecting\" | \"connected\" = \"disconnected\";\n\n constructor(options: ControlPlaneClientOptions) {\n this._transport = options.transport || \"sse\";\n this._clientId = options.clientId;\n this._peerId = options.peerId;\n this._deviceLabel = options.deviceLabel || \"ShadowClaw Browser Client\";\n this._capabilities = options.capabilities || [\"webmcp\", \"opfs\", \"push\"];\n this._version = options.version || \"1.23.4\";\n this._token = options.token;\n this._heartbeatIntervalMs = options.heartbeatIntervalMs || 10000;\n this._reconnectDelayMs = options.reconnectDelayMs || 1000;\n this._maxReconnectDelayMs = options.maxReconnectDelayMs || 30000;\n this._currentReconnectDelay = this._reconnectDelayMs;\n this._handlers = new Map();\n\n this._WebSocketClass =\n options.WebSocketClass ||\n (typeof WebSocket !== \"undefined\" ? WebSocket : null);\n this._EventSourceClass =\n options.EventSourceClass ||\n (typeof EventSource !== \"undefined\" ? EventSource : null);\n this._fetchFn =\n options.fetchFn ||\n (typeof fetch !== \"undefined\"\n ? fetch.bind(globalThis)\n : ((() => Promise.reject(new Error(\"fetch not available\"))) as any));\n\n if (options.handlers) {\n for (const [action, handler] of Object.entries(options.handlers)) {\n this.registerHandler(action, handler);\n }\n }\n\n const loc = typeof location !== \"undefined\" ? location : null;\n const origin = loc\n ? `${loc.protocol}//${loc.host}`\n : \"http://127.0.0.1:8888\";\n const wsOrigin = loc\n ? `${loc.protocol === \"https:\" ? \"wss:\" : \"ws:\"}//${loc.host}`\n : \"ws://127.0.0.1:8888\";\n\n this._url = options.url || `${wsOrigin}/ws/control`;\n this._httpUrl = options.httpUrl || origin;\n }\n\n public get transport(): ControlPlaneTransport {\n return this._transport;\n }\n\n public registerHandler(action: string, handler: CommandHandler): void {\n this._handlers.set(action, handler);\n }\n\n public unregisterHandler(action: string): void {\n this._handlers.delete(action);\n }\n\n public getState(): \"disconnected\" | \"connecting\" | \"connected\" {\n return this._state;\n }\n\n public connect(): void {\n if (\n this._isDestroyed ||\n this._state === \"connected\" ||\n this._state === \"connecting\"\n ) {\n return;\n }\n\n if (this._transport === \"websocket\") {\n this._connectWebSocket();\n } else {\n this._connectSse();\n }\n }\n\n private _connectWebSocket(): void {\n if (!this._WebSocketClass) {\n console.warn(\n \"[ControlPlaneClient] WebSocket not supported in this environment\",\n );\n return;\n }\n\n this._state = \"connecting\";\n const wsUrl = new URL(this._url, \"ws://127.0.0.1:8888\");\n if (this._token) {\n wsUrl.searchParams.set(\"token\", this._token);\n }\n\n try {\n const ws = new this._WebSocketClass(wsUrl.toString());\n this._ws = ws;\n\n ws.onopen = () => {\n this._state = \"connected\";\n this._currentReconnectDelay = this._reconnectDelayMs;\n this._sendRegister();\n this._startHeartbeat();\n };\n\n ws.onmessage = (event: MessageEvent) => {\n this._handleMessage(event.data);\n };\n\n ws.onclose = () => {\n this._cleanupConnection();\n if (!this._isDestroyed) {\n this._scheduleReconnect();\n }\n };\n\n ws.onerror = (err: any) => {\n console.warn(\"[ControlPlaneClient] WebSocket error:\", err);\n };\n } catch (err) {\n console.warn(\n \"[ControlPlaneClient] Failed to establish WebSocket connection:\",\n err,\n );\n this._cleanupConnection();\n this._scheduleReconnect();\n }\n }\n\n private _connectSse(): void {\n if (!this._EventSourceClass) {\n if (typeof process === \"undefined\" || !process.env?.JEST_WORKER_ID) {\n console.warn(\n \"[ControlPlaneClient] EventSource not supported in this environment\",\n );\n }\n return;\n }\n\n this._state = \"connecting\";\n const sseUrl = new URL(\"/api/control/events\", this._httpUrl);\n sseUrl.searchParams.set(\"clientId\", this._clientId);\n if (this._token) {\n sseUrl.searchParams.set(\"token\", this._token);\n }\n\n try {\n const es = new this._EventSourceClass(sseUrl.toString());\n this._es = es;\n\n es.onopen = () => {\n this._state = \"connected\";\n this._currentReconnectDelay = this._reconnectDelayMs;\n this._sendRegister();\n this._startHeartbeat();\n };\n\n if (typeof es.addEventListener === \"function\") {\n es.addEventListener(\"command:execute\", (event: MessageEvent) => {\n this._handleMessage(event.data);\n });\n }\n\n es.onmessage = (event: MessageEvent) => {\n this._handleMessage(event.data);\n };\n\n es.onerror = (err: any) => {\n console.warn(\"[ControlPlaneClient] SSE connection error:\", err);\n this._cleanupConnection();\n if (!this._isDestroyed) {\n this._scheduleReconnect();\n }\n };\n } catch (err) {\n console.warn(\n \"[ControlPlaneClient] Failed to establish SSE connection:\",\n err,\n );\n this._cleanupConnection();\n this._scheduleReconnect();\n }\n }\n\n public disconnect(): void {\n this._isDestroyed = true;\n try {\n this._sendUnregister();\n } catch (_) {}\n this._cleanupConnection();\n if (this._reconnectTimer) {\n clearTimeout(this._reconnectTimer);\n this._reconnectTimer = null;\n }\n }\n\n private _cleanupConnection(): void {\n this._state = \"disconnected\";\n this._stopHeartbeat();\n if (this._ws) {\n try {\n this._ws.close();\n } catch (_) {}\n this._ws = null;\n }\n if (this._es) {\n try {\n this._es.close();\n } catch (_) {}\n this._es = null;\n }\n }\n\n private _scheduleReconnect(): void {\n if (this._reconnectTimer || this._isDestroyed) {\n return;\n }\n\n this._reconnectTimer = setTimeout(() => {\n this._reconnectTimer = null;\n if (!this._isDestroyed) {\n this.connect();\n }\n }, this._currentReconnectDelay);\n\n this._currentReconnectDelay = Math.min(\n this._currentReconnectDelay * 1.5,\n this._maxReconnectDelayMs,\n );\n }\n\n private _startHeartbeat(): void {\n this._stopHeartbeat();\n this._heartbeatTimer = setInterval(() => {\n this._sendHeartbeat();\n }, this._heartbeatIntervalMs);\n }\n\n private _stopHeartbeat(): void {\n if (this._heartbeatTimer) {\n clearInterval(this._heartbeatTimer);\n this._heartbeatTimer = null;\n }\n }\n\n private _sendRegister(): void {\n const payload: ClientRegisterPayload = {\n clientId: this._clientId,\n deviceLabel: this._deviceLabel,\n capabilities: this._capabilities,\n version: this._version,\n transport: this._transport,\n peerId: this._peerId,\n };\n this._sendMessage({\n id: ulid(),\n type: \"client:register\",\n payload,\n });\n }\n\n private _sendHeartbeat(): void {\n const payload: HeartbeatPayload = {\n clientId: this._clientId,\n timestamp: Date.now(),\n };\n this._sendMessage({\n id: ulid(),\n type: \"client:heartbeat\",\n payload,\n });\n }\n\n private _sendUnregister(): void {\n if (!this._clientId) return;\n const payload = {\n clientId: this._clientId,\n };\n this._sendMessage({\n id: ulid(),\n type: \"client:unregister\",\n payload,\n });\n }\n\n private _sendMessage(msg: ControlMessage): void {\n if (this._transport === \"websocket\") {\n if (\n this._ws &&\n (this._ws.readyState === 1 ||\n this._ws.readyState === (this._WebSocketClass as any)?.OPEN)\n ) {\n this._ws.send(JSON.stringify(msg));\n }\n return;\n }\n\n // SSE Mode: send messages to server via HTTP POST /api/control/messages\n const messagesUrl = new URL(\"/api/control/messages\", this._httpUrl);\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n if (this._token) {\n headers[\"x-control-token\"] = this._token;\n headers[\"Authorization\"] = `Bearer ${this._token}`;\n }\n\n const fetchOptions: any = {\n method: \"POST\",\n headers,\n body: JSON.stringify(msg),\n };\n\n const host = messagesUrl.hostname.toLowerCase();\n const isLoopback =\n host === \"localhost\" ||\n host === \"127.0.0.1\" ||\n host === \"::1\" ||\n host === \"[::1]\";\n const isPrivate = /^(10\\.|172\\.(1[6-9]|2\\d|3[01])\\.|192\\.168\\.)/.test(host);\n\n if (isLoopback) {\n fetchOptions.targetAddressSpace = \"loopback\";\n } else if (isPrivate) {\n fetchOptions.targetAddressSpace = \"private\";\n }\n\n this._fetchFn(messagesUrl.toString(), fetchOptions).catch((err) => {\n console.warn(\n \"[ControlPlaneClient] Failed to send message via HTTP POST:\",\n err,\n );\n });\n }\n\n private async _handleMessage(dataStr: string): Promise<void> {\n if (!dataStr || typeof dataStr !== \"string\") {\n return;\n }\n\n let msg: ControlMessage;\n try {\n msg = JSON.parse(dataStr);\n } catch {\n return;\n }\n\n if (msg.type === \"command:execute\") {\n const payload = msg.payload as CommandExecutePayload;\n const { commandId, action, args } = payload;\n\n const handler = this._handlers.get(action);\n if (!handler) {\n this._sendMessage({\n id: ulid(),\n type: \"command:result\",\n replyTo: msg.id,\n payload: {\n commandId,\n success: false,\n error: `Unknown action: ${action}`,\n } as CommandResultPayload,\n });\n return;\n }\n\n try {\n const result = await handler(args);\n this._sendMessage({\n id: ulid(),\n type: \"command:result\",\n replyTo: msg.id,\n payload: {\n commandId,\n success: true,\n data: result,\n } as CommandResultPayload,\n });\n } catch (err: any) {\n this._sendMessage({\n id: ulid(),\n type: \"command:result\",\n replyTo: msg.id,\n payload: {\n commandId,\n success: false,\n error: err.message || String(err),\n } as CommandResultPayload,\n });\n }\n }\n }\n}\n","/**\n * ShadowClaw — Control Plane Browser Initialization Helper\n */\n\nimport { ControlPlaneClient } from \"../control-plane-client.js\";\nimport { getDeploymentNamespace } from \"../app-routes.js\";\nimport { getDb } from \"../../db/db.js\";\nimport { getAllTasks } from \"../../db/getAllTasks.js\";\nimport { ulid } from \"../../utils/ulid.js\";\nimport {\n CONFIG_KEYS,\n DEFAULT_CONTROL_PLANE_ENABLED,\n DEFAULT_CONTROL_PLANE_TRANSPORT,\n} from \"../../config/config.js\";\nimport type { ControlPlaneTransport } from \"../../server/control-plane-types.js\";\n\nexport function getOrCreateControlPlaneClientId(): string {\n if (typeof localStorage !== \"undefined\") {\n try {\n const stored = localStorage.getItem(CONFIG_KEYS.CONTROL_PLANE_CLIENT_ID);\n if (stored && stored.trim()) {\n return stored.trim();\n }\n } catch (_) {}\n }\n\n const namespace = getDeploymentNamespace();\n const generated = namespace\n ? `${namespace}-${ulid().toLowerCase()}`\n : `client-${ulid().toLowerCase()}`;\n\n if (typeof localStorage !== \"undefined\") {\n try {\n localStorage.setItem(CONFIG_KEYS.CONTROL_PLANE_CLIENT_ID, generated);\n } catch (_) {}\n }\n\n return generated;\n}\n\nexport function isControlPlaneEnabledSync(): boolean {\n if (typeof localStorage !== \"undefined\") {\n try {\n const val = localStorage.getItem(CONFIG_KEYS.CONTROL_PLANE_ENABLED);\n if (val !== null) {\n return val === \"true\" || val === \"1\";\n }\n } catch (_) {}\n }\n return DEFAULT_CONTROL_PLANE_ENABLED;\n}\n\nexport async function isControlPlaneEnabled(db?: any): Promise<boolean> {\n if (typeof localStorage !== \"undefined\") {\n try {\n const val = localStorage.getItem(CONFIG_KEYS.CONTROL_PLANE_ENABLED);\n if (val !== null) {\n return val === \"true\" || val === \"1\";\n }\n } catch (_) {}\n }\n\n if (db) {\n try {\n const { getConfig } = await import(\"../../db/getConfig.js\");\n const val = await getConfig(db, CONFIG_KEYS.CONTROL_PLANE_ENABLED);\n if (val !== null && val !== undefined) {\n return val === \"true\" || val === \"1\";\n }\n } catch (_) {}\n }\n\n return DEFAULT_CONTROL_PLANE_ENABLED;\n}\n\nexport function shouldConnectControlPlane(loc?: {\n protocol?: string;\n hostname?: string;\n}): boolean {\n if (typeof EventSource === \"undefined\" && typeof WebSocket === \"undefined\") {\n return false;\n }\n\n const currentLoc = loc || (typeof location !== \"undefined\" ? location : null);\n if (!currentLoc) {\n return false;\n }\n\n if (currentLoc.protocol === \"file:\") {\n return false;\n }\n\n if (\n typeof document !== \"undefined\" &&\n document.querySelector('meta[name=\"shadowclaw-static-only\"]')\n ) {\n return false;\n }\n\n return true;\n}\n\nexport function getControlPlaneServerUrl(loc?: {\n protocol?: string;\n host?: string;\n hostname?: string;\n}): { httpUrl: string; wsUrl: string } {\n let customUrl = \"\";\n if (typeof localStorage !== \"undefined\") {\n try {\n customUrl = (\n localStorage.getItem(CONFIG_KEYS.CONTROL_PLANE_URL) || \"\"\n ).trim();\n } catch (_) {}\n }\n\n const currentLoc = loc || (typeof location !== \"undefined\" ? location : null);\n const isStaticHost =\n currentLoc &&\n (currentLoc.protocol === \"file:\" ||\n (currentLoc.hostname &&\n (currentLoc.hostname.endsWith(\".github.io\") ||\n currentLoc.hostname.endsWith(\".pages.dev\"))));\n\n let baseHttp = customUrl;\n if (!baseHttp) {\n if (isStaticHost) {\n baseHttp = \"http://127.0.0.1:8888\";\n } else if (currentLoc && currentLoc.host) {\n baseHttp = `${currentLoc.protocol}//${currentLoc.host}`;\n } else {\n baseHttp = \"http://127.0.0.1:8888\";\n }\n }\n\n baseHttp = baseHttp.replace(/\\/+$/, \"\");\n\n const baseWs = baseHttp.replace(/^https?:/, (proto) =>\n proto === \"https:\" ? \"wss:\" : \"ws:\",\n );\n\n return {\n httpUrl: baseHttp,\n wsUrl: `${baseWs}/ws/control`,\n };\n}\n\nexport function detectCapabilities(): string[] {\n const caps: string[] = [];\n\n if (typeof navigator !== \"undefined\") {\n if (\n navigator.storage &&\n typeof navigator.storage.getDirectory === \"function\"\n ) {\n caps.push(\"opfs\");\n }\n\n if (\n \"serviceWorker\" in navigator &&\n typeof window !== \"undefined\" &&\n \"PushManager\" in window\n ) {\n caps.push(\"push\");\n }\n\n if (\n (typeof document !== \"undefined\" && (document as any).modelContext) ||\n ((navigator as any) && (navigator as any).modelContext)\n ) {\n caps.push(\"webmcp\");\n }\n }\n\n if (typeof RTCPeerConnection !== \"undefined\") {\n caps.push(\"peerjs\");\n }\n\n return caps;\n}\n\nexport function detectDeviceLabel(): string {\n if (typeof navigator === \"undefined\") {\n return \"ShadowClaw Node\";\n }\n\n const ua = navigator.userAgent;\n let device = \"Desktop\";\n if (/iPad/i.test(ua)) device = \"iPad\";\n else if (/iPhone/i.test(ua)) device = \"iPhone\";\n else if (/Android/i.test(ua)) device = \"Android\";\n else if (/Macintosh/i.test(ua)) device = \"Mac\";\n else if (/Windows/i.test(ua)) device = \"Windows\";\n else if (/Linux/i.test(ua)) device = \"Linux\";\n\n let browser = \"Browser\";\n if (/Chrome/i.test(ua) && !/Edg/i.test(ua)) browser = \"Chrome\";\n else if (/Safari/i.test(ua) && !/Chrome/i.test(ua)) browser = \"Safari\";\n else if (/Firefox/i.test(ua)) browser = \"Firefox\";\n else if (/Edg/i.test(ua)) browser = \"Edge\";\n\n return `${device} ${browser}`;\n}\n\nexport interface InitControlPlaneOptions {\n orchestrator?: any;\n clientId?: string;\n transport?: ControlPlaneTransport;\n autoConnect?: boolean;\n}\n\nlet activeClient: ControlPlaneClient | null = null;\n\nexport async function executeClientControlCommand(\n action: string,\n args: any = {},\n options: InitControlPlaneOptions = {},\n): Promise<any> {\n const clientId = getOrCreateControlPlaneClientId();\n const deviceLabel = detectDeviceLabel();\n const capabilities = detectCapabilities();\n\n switch (action) {\n case \"send-message\": {\n if (!args.text) {\n throw new Error(\"Missing text parameter\");\n }\n const { orchestratorStore } =\n await import(\"../../stores/orchestrator.js\");\n const orch = options.orchestrator || orchestratorStore.orchestrator;\n const targetGroupId =\n args.groupId || orchestratorStore.activeGroupId || \"br:main\";\n\n if (orch?.browserChat?.submit) {\n orch.browserChat.submit(args.text, targetGroupId);\n return { queued: true, groupId: targetGroupId };\n }\n if (orch?.submitMessage) {\n orch.submitMessage(args.text, targetGroupId);\n return { queued: true, groupId: targetGroupId };\n }\n if (orchestratorStore.sendMessage) {\n orchestratorStore.sendMessage(args.text);\n return { queued: true, groupId: targetGroupId };\n }\n return { queued: false, error: \"Orchestrator not ready\" };\n }\n\n case \"list-tasks\": {\n const db = await getDb();\n let tasks = await getAllTasks(db);\n if (args?.groupId) {\n tasks = tasks.filter((t) => t.groupId === args.groupId);\n }\n return { tasks };\n }\n\n case \"read-state\": {\n const { orchestratorStore } =\n await import(\"../../stores/orchestrator.js\");\n const orch = options.orchestrator || orchestratorStore.orchestrator;\n return {\n clientId,\n deviceLabel,\n capabilities,\n activeGroupId:\n options.orchestrator?.activeGroupId ||\n orchestratorStore.activeGroupId ||\n orch?.activeGroupId ||\n \"br:main\",\n state:\n options.orchestrator?.state ||\n orchestratorStore.state ||\n orch?.state ||\n \"idle\",\n };\n }\n\n case \"list-tools\": {\n try {\n const { getWebMcpTools } =\n await import(\"../../subsystems/mcp/webmcp.js\");\n const webMcpTools = await getWebMcpTools();\n if (webMcpTools && webMcpTools.length > 0) {\n return {\n tools: webMcpTools.map((t) => ({\n name: t.name,\n description: t.description,\n inputSchema: t.inputSchema,\n annotations: t.annotations,\n })),\n };\n }\n } catch (_) {}\n\n // Fallback: filter by conversation group toolTags if active\n try {\n const { orchestratorStore } =\n await import(\"../../stores/orchestrator.js\");\n const orch =\n options.orchestrator ||\n orchestratorStore.orchestrator ||\n (typeof document !== \"undefined\"\n ? (document.querySelector(\"shadow-claw\") as any)?.orchestrator\n : null);\n const activeGroupId =\n args.groupId ||\n orch?.activeGroupId ||\n orchestratorStore.activeGroupId ||\n \"br:main\";\n const group = orchestratorStore.groups.find(\n (g) => g.groupId === activeGroupId,\n );\n\n if (group?.toolTags && group.toolTags.length > 0) {\n const { TOOL_DEFINITIONS } =\n await import(\"../../subsystems/tools/index.js\");\n const { parseWebMcpInputSchema } =\n await import(\"../../subsystems/mcp/webmcp.js\");\n const activeTools = TOOL_DEFINITIONS.filter((t) =>\n group.toolTags!.includes(t.name),\n );\n return {\n tools: activeTools.map((t) => ({\n name: t.name,\n description: t.description,\n inputSchema: parseWebMcpInputSchema(t.input_schema),\n })),\n };\n }\n } catch (_) {}\n\n // Default fallback: list built-in TOOL_DEFINITIONS\n const { TOOL_DEFINITIONS } =\n await import(\"../../subsystems/tools/index.js\");\n const { parseWebMcpInputSchema } =\n await import(\"../../subsystems/mcp/webmcp.js\");\n return {\n tools: TOOL_DEFINITIONS.map((t) => ({\n name: t.name,\n description: t.description,\n inputSchema: parseWebMcpInputSchema(t.input_schema),\n })),\n };\n }\n\n case \"invoke-tool\": {\n if (!args.toolName) {\n throw new Error(\"Missing toolName parameter\");\n }\n\n // 1. Validate tool against active conversation group and toolsStore\n try {\n const { orchestratorStore } =\n await import(\"../../stores/orchestrator.js\");\n const { toolsStore } = await import(\"../../stores/tools.js\");\n const orch =\n options.orchestrator ||\n orchestratorStore.orchestrator ||\n (typeof document !== \"undefined\"\n ? (document.querySelector(\"shadow-claw\") as any)?.orchestrator\n : null);\n const activeGroupId =\n args.groupId ||\n orch?.activeGroupId ||\n orchestratorStore.activeGroupId ||\n \"br:main\";\n const group = orchestratorStore.groups.find(\n (g) => g.groupId === activeGroupId,\n );\n\n if (group?.toolTags && group.toolTags.length > 0) {\n if (!group.toolTags.includes(args.toolName)) {\n throw new Error(\n `Tool '${args.toolName}' is not enabled in the active conversation (${activeGroupId}).`,\n );\n }\n } else if (\n toolsStore?.allTools &&\n toolsStore.allTools.some((t: any) => t.name === args.toolName) &&\n toolsStore?.enabledToolNames &&\n toolsStore.enabledToolNames.size > 0\n ) {\n const isBuiltIn = toolsStore.enabledToolNames.has(args.toolName);\n const isDeclarative = toolsStore.isDeclarativeToolEnabled(\n args.toolName,\n );\n if (!isBuiltIn && !isDeclarative) {\n throw new Error(\n `Tool '${args.toolName}' is not enabled on this client.`,\n );\n }\n }\n } catch (err: any) {\n if (err.message && err.message.includes(\"is not enabled\")) {\n throw err;\n }\n }\n\n const ctx =\n (typeof document !== \"undefined\" && (document as any).modelContext) ||\n (typeof navigator !== \"undefined\" && (navigator as any).modelContext);\n\n if (ctx) {\n let matchedTool: any;\n if (typeof ctx.getTools === \"function\") {\n try {\n const tools = await ctx.getTools();\n if (Array.isArray(tools) && tools.length > 0) {\n matchedTool = tools.find((t: any) => t.name === args.toolName);\n if (!matchedTool) {\n throw new Error(\n `Tool '${args.toolName}' is not enabled or registered on this client.`,\n );\n }\n } else {\n matchedTool = Array.isArray(tools)\n ? tools.find((t: any) => t.name === args.toolName)\n : undefined;\n }\n if (matchedTool && typeof matchedTool.execute === \"function\") {\n const res = await matchedTool.execute(\n typeof args.input === \"string\"\n ? JSON.parse(args.input)\n : args.input || {},\n );\n return { result: res };\n }\n } catch (err: any) {\n if (err.message && err.message.includes(\"is not enabled\")) {\n throw err;\n }\n }\n }\n\n const inputStr =\n typeof args.input === \"string\"\n ? args.input\n : JSON.stringify(args.input || {});\n\n if (typeof ctx.executeTool === \"function\") {\n // 1. Pass the actual ModelContextTool object from getTools() if available (required by native Chromium)\n if (matchedTool) {\n try {\n const res = await ctx.executeTool(matchedTool, inputStr);\n return { result: res };\n } catch (_) {}\n }\n\n // 2. Pass { name: toolName } object (accepted by polyfill / mocks)\n try {\n const res = await ctx.executeTool(\n { name: args.toolName },\n inputStr,\n );\n return { result: res };\n } catch (_) {}\n\n // 3. Pass toolName string directly (accepted by some preview shims)\n try {\n const res = await ctx.executeTool(args.toolName, inputStr);\n return { result: res };\n } catch (_) {}\n }\n\n // 4. Check navigator.modelContextTesting if present\n if (\n typeof navigator !== \"undefined\" &&\n (navigator as any).modelContextTesting &&\n typeof (navigator as any).modelContextTesting.executeTool ===\n \"function\"\n ) {\n try {\n const res = await (\n navigator as any\n ).modelContextTesting.executeTool(args.toolName, inputStr);\n return { result: res };\n } catch (_) {}\n }\n\n // 5. Check callTool (MCP-B / extension runtime)\n if (typeof ctx.callTool === \"function\") {\n try {\n const res = await ctx.callTool({\n name: args.toolName,\n arguments:\n typeof args.input === \"string\"\n ? JSON.parse(args.input)\n : args.input || {},\n });\n return { result: res };\n } catch (_) {}\n }\n\n // 6. Check invoke\n if (typeof ctx.invoke === \"function\") {\n try {\n const res = await ctx.invoke(\n args.toolName,\n typeof args.input === \"string\"\n ? JSON.parse(args.input)\n : args.input || {},\n );\n return { result: res };\n } catch (_) {}\n }\n }\n\n // Worker fallback if agent worker is active\n const { orchestratorStore } =\n await import(\"../../stores/orchestrator.js\");\n const orch =\n options.orchestrator ||\n orchestratorStore.orchestrator ||\n (typeof document !== \"undefined\"\n ? (document.querySelector(\"shadow-claw\") as any)?.orchestrator\n : null);\n const worker: any = orch?.agentWorker;\n if (worker && typeof worker.postMessage === \"function\") {\n const callId =\n Date.now().toString(36) + Math.random().toString(36).slice(2);\n const isInteractive = args.toolName === \"ask_user\";\n const fallbackTimeoutMs =\n args.timeoutMs || (isInteractive ? 300000 : 60000);\n const result = await new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n worker.removeEventListener(\"message\", handler);\n reject(new Error(\"Timeout waiting for tool execution\"));\n }, fallbackTimeoutMs);\n\n const handler = (event: MessageEvent) => {\n const data = event.data;\n if (\n data &&\n data.type === \"execute-tool-result\" &&\n data.callId === callId\n ) {\n clearTimeout(timeout);\n worker.removeEventListener(\"message\", handler);\n if (data.error) {\n reject(new Error(data.error));\n } else {\n resolve(data.result);\n }\n }\n };\n\n worker.addEventListener(\"message\", handler);\n worker.postMessage({\n type: \"execute-tool\",\n callId,\n payload: {\n name: args.toolName,\n input:\n typeof args.input === \"string\"\n ? JSON.parse(args.input)\n : args.input || {},\n groupId: args.groupId || orch?.activeGroupId || \"br:main\",\n },\n });\n });\n return { result };\n }\n\n throw new Error(\n `Tool ${args.toolName} could not be executed (no context or worker available)`,\n );\n }\n\n case \"trigger-backup\": {\n const { orchestratorStore } =\n await import(\"../../stores/orchestrator.js\");\n const targetGroupId =\n args.groupId ||\n options.orchestrator?.activeGroupId ||\n orchestratorStore.activeGroupId ||\n \"br:main\";\n const db = await getDb();\n const { getGroupDir } = await import(\"../../storage/getGroupDir.js\");\n const groupDir = await getGroupDir(db, targetGroupId);\n\n async function collectFiles(\n dir: FileSystemDirectoryHandle,\n prefix = \"\",\n ): Promise<string[]> {\n const result: string[] = [];\n for await (const [name, handle] of (dir as any).entries()) {\n const relPath = prefix ? `${prefix}/${name}` : name;\n if (handle.kind === \"directory\") {\n const sub = await collectFiles(handle, relPath);\n result.push(...sub);\n } else {\n result.push(relPath);\n }\n }\n return result;\n }\n\n async function readFile(relPath: string): Promise<Uint8Array | null> {\n try {\n const parts = relPath.split(\"/\");\n let cur: FileSystemDirectoryHandle = groupDir;\n for (let i = 0; i < parts.length - 1; i++) {\n cur = await cur.getDirectoryHandle(parts[i]);\n }\n const fileHandle = await cur.getFileHandle(parts[parts.length - 1]);\n const file = await fileHandle.getFile();\n const buffer = await file.arrayBuffer();\n return new Uint8Array(buffer);\n } catch {\n return null;\n }\n }\n\n const { BackupController } = await import(\"../backup-controller.js\");\n\n const backupCtrl = new BackupController({\n clientId,\n token: args.token,\n serverBaseUrl: getControlPlaneServerUrl().httpUrl,\n fileEnumerator: () => collectFiles(groupDir),\n fileReader: (filePath) => readFile(filePath),\n });\n\n const result = await backupCtrl.initiate();\n return result;\n }\n\n default:\n throw new Error(`Unknown action '${action}'`);\n }\n}\n\nexport function createDefaultControlPlaneClient(\n options: InitControlPlaneOptions = {},\n): ControlPlaneClient {\n if (activeClient) {\n try {\n activeClient.disconnect();\n } catch (_) {}\n activeClient = null;\n }\n\n const clientId =\n (options.clientId && options.clientId.trim()) ||\n getOrCreateControlPlaneClientId();\n const capabilities = detectCapabilities();\n const deviceLabel = detectDeviceLabel();\n\n let configuredTransport: ControlPlaneTransport | null = null;\n if (typeof localStorage !== \"undefined\") {\n try {\n const stored = localStorage.getItem(CONFIG_KEYS.CONTROL_PLANE_TRANSPORT);\n if (stored === \"sse\" || stored === \"websocket\") {\n configuredTransport = stored;\n }\n } catch (_) {}\n }\n\n const transport =\n options.transport ||\n configuredTransport ||\n (DEFAULT_CONTROL_PLANE_TRANSPORT as ControlPlaneTransport);\n\n let peerId: string | undefined;\n if (typeof localStorage !== \"undefined\") {\n try {\n // CONFIG_KEYS.PEERJS_MY_PEER_ID is \"peerjs_my_peer_id\" — set by configurePeerJs via setConfig.\n // We also check the raw IndexedDB config key written by setConfig, which mirrors to localStorage\n // under the same key name in browser environments that support it.\n peerId = localStorage.getItem(CONFIG_KEYS.PEERJS_MY_PEER_ID) || undefined;\n } catch (_) {}\n }\n\n const { httpUrl, wsUrl } = getControlPlaneServerUrl();\n\n const client = new ControlPlaneClient({\n clientId,\n deviceLabel,\n capabilities,\n peerId,\n transport,\n httpUrl,\n url: wsUrl,\n handlers: {\n \"send-message\": (args: any) =>\n executeClientControlCommand(\"send-message\", args, options),\n \"list-tasks\": (args: any) =>\n executeClientControlCommand(\"list-tasks\", args, options),\n \"read-state\": (args: any) =>\n executeClientControlCommand(\"read-state\", args, options),\n \"invoke-tool\": (args: any) =>\n executeClientControlCommand(\"invoke-tool\", args, options),\n \"list-tools\": (args: any) =>\n executeClientControlCommand(\"list-tools\", args, options),\n \"trigger-backup\": (args: any) =>\n executeClientControlCommand(\"trigger-backup\", args, options),\n },\n });\n\n if (options.autoConnect !== false && shouldConnectControlPlane()) {\n client.connect();\n }\n\n activeClient = client;\n return client;\n}\n\nexport function getActiveControlPlaneClient(): ControlPlaneClient | null {\n return activeClient;\n}\n\nexport function stopControlPlaneClient(): void {\n if (activeClient) {\n try {\n activeClient.disconnect();\n } catch (_) {}\n activeClient = null;\n }\n}\n"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { i as __toESM, t as __commonJSMin } from "./rolldown-runtime-DZ8SGSJo.js";
2
- import { Nt as require_gray_matter } from "./orchestrator-DCfomsn9.js";
2
+ import { Nt as require_gray_matter } from "./orchestrator-KRjx0eba.js";
3
3
  import { n as getDOMPurify, t as ensureIframeSanitizerHook } from "./iframe-sanitizer-CUqHuWQ-.js";
4
- import { b as isAllowedCustomElement } from "./trusted-types-CkLDpLiZ.js";
4
+ import { b as isAllowedCustomElement } from "./trusted-types-Dx0RZlrd.js";
5
5
 
6
6
  //#region node_modules/highlight.js/lib/core.js
7
7
  var require_core = /* @__PURE__ */ __commonJSMin(((exports, module) => {
@@ -49748,4 +49748,4 @@ async function renderMarkdown(src, options) {
49748
49748
 
49749
49749
  //#endregion
49750
49750
  export { splitFrontmatter as n, es_default as r, renderMarkdown as t };
49751
- //# sourceMappingURL=markdown-eeSTFnMA.js.map
49751
+ //# sourceMappingURL=markdown-C6EHl9zs.js.map