shadow-claw 1.26.0 → 1.27.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 (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 +146 -15
  8. package/bin/build/build.test.mjs +57 -0
  9. package/bin/cli.mjs +26 -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 +328 -0
  13. package/bin/commands/skills-index.test.mjs +161 -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 +29 -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 +1 -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
@@ -1,3 +1,3 @@
1
- import { t as ShadowClawAccounts } from "../shadow-claw-accounts-CdruwN8A.js";
1
+ import { t as ShadowClawAccounts } from "../shadow-claw-accounts-03oJ__XC.js";
2
2
 
3
3
  export { ShadowClawAccounts };
@@ -1,3 +1,3 @@
1
- import { t as ShadowClawChannelConfig } from "../shadow-claw-channel-config-Bj0-Nk3t.js";
1
+ import { t as ShadowClawChannelConfig } from "../shadow-claw-channel-config-DmfwJc6G.js";
2
2
 
3
3
  export { ShadowClawChannelConfig };
@@ -1,3 +1,3 @@
1
- import { t as ShadowClawChannels } from "../shadow-claw-channels-C_jI4KhP.js";
1
+ import { t as ShadowClawChannels } from "../shadow-claw-channels-1N6Jl-By.js";
2
2
 
3
3
  export { ShadowClawChannels };
@@ -1,3 +1,3 @@
1
- import { t as ShadowClawChat } from "../shadow-claw-chat-B16MspoP.js";
1
+ import { t as ShadowClawChat } from "../shadow-claw-chat-BMoqQJRK.js";
2
2
 
3
3
  export { ShadowClawChat };
@@ -1,3 +1,3 @@
1
- import { n as getControlPlaneTargetAddressSpace, t as ShadowClawControlPlane } from "../shadow-claw-control-plane-x8Ldid_h.js";
1
+ import { n as getControlPlaneTargetAddressSpace, t as ShadowClawControlPlane } from "../shadow-claw-control-plane-UG0o7pCz.js";
2
2
 
3
3
  export { ShadowClawControlPlane, getControlPlaneTargetAddressSpace };
@@ -1,3 +1,3 @@
1
- import { t as ShadowClawConversations } from "../shadow-claw-conversations-Ct1kAYdB.js";
1
+ import { t as ShadowClawConversations } from "../shadow-claw-conversations-BwXep3iu.js";
2
2
 
3
3
  export { ShadowClawConversations };
@@ -1,3 +1,3 @@
1
- import { t as ShadowClawFileViewer } from "../shadow-claw-file-viewer-BfDHHgpA.js";
1
+ import { t as ShadowClawFileViewer } from "../shadow-claw-file-viewer-DUxzVxDT.js";
2
2
 
3
3
  export { ShadowClawFileViewer };
@@ -1,3 +1,3 @@
1
- import { t as ShadowClawFiles } from "../shadow-claw-files-EYhOPYIH.js";
1
+ import { t as ShadowClawFiles } from "../shadow-claw-files-DIREEnT2.js";
2
2
 
3
3
  export { ShadowClawFiles };
@@ -1,3 +1,3 @@
1
- import { t as ShadowClawGit } from "../shadow-claw-git-tcSpT-P0.js";
1
+ import { t as ShadowClawGit } from "../shadow-claw-git-Bg1SWgsF.js";
2
2
 
3
3
  export { ShadowClawGit };
@@ -1,3 +1,3 @@
1
- import { t as ShadowClawIntegrations } from "../shadow-claw-integrations-NbcCx_ZI.js";
1
+ import { t as ShadowClawIntegrations } from "../shadow-claw-integrations-Ds-CLPhj.js";
2
2
 
3
3
  export { ShadowClawIntegrations };
@@ -1,3 +1,3 @@
1
- import { t as ShadowClawLlm } from "../shadow-claw-llm-BazJdD5f.js";
1
+ import { t as ShadowClawLlm } from "../shadow-claw-llm-CazBrVpM.js";
2
2
 
3
3
  export { ShadowClawLlm };
@@ -1,3 +1,3 @@
1
- import { t as ShadowClawMcpRemote } from "../shadow-claw-mcp-remote-CYmhpg7a.js";
1
+ import { t as ShadowClawMcpRemote } from "../shadow-claw-mcp-remote-CT5Q-54E.js";
2
2
 
3
3
  export { ShadowClawMcpRemote };
@@ -1,3 +1,3 @@
1
- import { t as ShadowClawNetworking } from "../shadow-claw-networking-DImPxe0H.js";
1
+ import { t as ShadowClawNetworking } from "../shadow-claw-networking-Df85tCbO.js";
2
2
 
3
3
  export { ShadowClawNetworking };
@@ -1,3 +1,3 @@
1
- import { t as ShadowClawPageHeader } from "../shadow-claw-page-header-CcHUfFUx.js";
1
+ import { t as ShadowClawPageHeader } from "../shadow-claw-page-header-Cti2fzf-.js";
2
2
 
3
3
  export { ShadowClawPageHeader };
@@ -1,3 +1,3 @@
1
- import { t as ShadowClawPages } from "../shadow-claw-pages-D54jF1Qq.js";
1
+ import { t as ShadowClawPages } from "../shadow-claw-pages-BgPyIEZO.js";
2
2
 
3
3
  export { ShadowClawPages };
@@ -1,3 +1,3 @@
1
- import { t as ShadowClawPeerJs } from "../shadow-claw-peerjs-B9-T8Nlx.js";
1
+ import { t as ShadowClawPeerJs } from "../shadow-claw-peerjs-xkBXILed.js";
2
2
 
3
3
  export { ShadowClawPeerJs };
@@ -1,3 +1,3 @@
1
- import { t as ShadowClawSettings } from "../shadow-claw-settings-Bt1VAe-1.js";
1
+ import { t as ShadowClawSettings } from "../shadow-claw-settings-CN89xRVU.js";
2
2
 
3
3
  export { ShadowClawSettings };
@@ -1,3 +1,3 @@
1
- import { t as ShadowClawStorage } from "../shadow-claw-storage-CFOjGf1d.js";
1
+ import { t as ShadowClawStorage } from "../shadow-claw-storage-VnhcObCe.js";
2
2
 
3
3
  export { ShadowClawStorage };
@@ -1,3 +1,3 @@
1
- import { t as ShadowClawTaskServer } from "../shadow-claw-task-server-BiKa2GOm.js";
1
+ import { t as ShadowClawTaskServer } from "../shadow-claw-task-server-jgEC2hHB.js";
2
2
 
3
3
  export { ShadowClawTaskServer };
@@ -1,3 +1,3 @@
1
- import { t as ShadowClawTasks } from "../shadow-claw-tasks-DDHd8W4d.js";
1
+ import { t as ShadowClawTasks } from "../shadow-claw-tasks-i_evIufy.js";
2
2
 
3
3
  export { ShadowClawTasks };
@@ -1,3 +1,3 @@
1
- import { n as ShadowClawTerminal, t as AUTO_SCROLL_BOTTOM_THRESHOLD_PX } from "../shadow-claw-terminal-kB6_tWKz.js";
1
+ import { n as ShadowClawTerminal, t as AUTO_SCROLL_BOTTOM_THRESHOLD_PX } from "../shadow-claw-terminal-CwScROlu.js";
2
2
 
3
3
  export { AUTO_SCROLL_BOTTOM_THRESHOLD_PX, ShadowClawTerminal };
@@ -1,3 +1,3 @@
1
- import { t as ShadowClawTools } from "../shadow-claw-tools-DxXIm0ku.js";
1
+ import { t as ShadowClawTools } from "../shadow-claw-tools-DD3fyXP4.js";
2
2
 
3
3
  export { ShadowClawTools };
@@ -1,3 +1,3 @@
1
- import { t as ShadowClawWebvm } from "../shadow-claw-webvm-Dc8oo7ao.js";
1
+ import { t as ShadowClawWebvm } from "../shadow-claw-webvm-DbJq4I3-.js";
2
2
 
3
3
  export { ShadowClawWebvm };
@@ -1,4 +1,4 @@
1
- import { t as ShadowClaw } from "../shadow-claw-D8xINM3c.js";
1
+ import { t as ShadowClaw } from "../shadow-claw-6UHdiy4a.js";
2
2
  import { n as MAX_SIDEBAR_WIDTH_PX, r as MIN_SIDEBAR_WIDTH_PX, t as DEFAULT_SIDEBAR_WIDTH_PX } from "../constants-BxxDX8j_.js";
3
3
 
4
4
  export { DEFAULT_SIDEBAR_WIDTH_PX, MAX_SIDEBAR_WIDTH_PX, MIN_SIDEBAR_WIDTH_PX, ShadowClaw };
@@ -1,5 +1,5 @@
1
1
  import { r as CONFIG_KEYS } from "./config--CFrw3J3.js";
2
- import { dt as getChannelEnabled, yt as normalizeStringList } from "./orchestrator-DCfomsn9.js";
2
+ import { dt as getChannelEnabled, yt as normalizeStringList } from "./orchestrator-KRjx0eba.js";
3
3
  import { t as setConfig } from "./setConfig-BFED5CXn.js";
4
4
 
5
5
  //#region src/core/orchestrator/utils/configurePeerJs.ts
@@ -35,4 +35,4 @@ async function configurePeerJs(orchestrator, db, myPeerId, trustedPeerIds, serve
35
35
 
36
36
  //#endregion
37
37
  export { configurePeerJs as t };
38
- //# sourceMappingURL=configurePeerJs-CrlGan0m.js.map
38
+ //# sourceMappingURL=configurePeerJs-oODzltaC.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"configurePeerJs-CrlGan0m.js","names":[],"sources":["../../src/core/orchestrator/utils/configurePeerJs.ts"],"sourcesContent":["import { CONFIG_KEYS } from \"../../../config/config.js\";\nimport { setConfig } from \"../../../db/setConfig.js\";\nimport { normalizeStringList } from \"./normalizeStringList.js\";\nimport { getChannelEnabled } from \"./operations/channel.js\";\n\nimport type { ShadowClawDatabase } from \"../../../db/db.js\";\nimport type { Orchestrator } from \"../orchestrator.js\";\n\nexport async function configurePeerJs(\n orchestrator: Orchestrator,\n db: ShadowClawDatabase,\n myPeerId: string,\n trustedPeerIds: string[],\n serverHost = \"\",\n serverPort = 0,\n serverPath = \"\",\n serverSecure = true,\n): Promise<void> {\n const normalizedMyPeerId = myPeerId.trim();\n const normalizedTrustedPeerIds = normalizeStringList(trustedPeerIds);\n const normalizedServerHost = serverHost.trim();\n const normalizedServerPort = Number.isFinite(serverPort)\n ? Math.max(0, Math.floor(serverPort))\n : 0;\n\n const normalizedServerPath = serverPath.trim();\n const normalizedServerSecure = !!serverSecure;\n\n orchestrator.peerjsMyPeerId = normalizedMyPeerId;\n orchestrator.peerjsTrustedPeerIds = normalizedTrustedPeerIds;\n orchestrator.peerjsServerHost = normalizedServerHost;\n orchestrator.peerjsServerPort = normalizedServerPort;\n orchestrator.peerjsServerPath = normalizedServerPath;\n orchestrator.peerjsServerSecure = normalizedServerSecure;\n\n await setConfig(db, CONFIG_KEYS.PEERJS_MY_PEER_ID, normalizedMyPeerId);\n await setConfig(\n db,\n CONFIG_KEYS.PEERJS_TRUSTED_PEER_IDS,\n JSON.stringify(normalizedTrustedPeerIds),\n );\n\n await setConfig(db, CONFIG_KEYS.PEERJS_SERVER_HOST, normalizedServerHost);\n await setConfig(\n db,\n CONFIG_KEYS.PEERJS_SERVER_PORT,\n normalizedServerPort ? String(normalizedServerPort) : \"\",\n );\n\n await setConfig(db, CONFIG_KEYS.PEERJS_SERVER_PATH, normalizedServerPath);\n await setConfig(\n db,\n CONFIG_KEYS.PEERJS_SERVER_SECURE,\n normalizedServerSecure ? \"true\" : \"false\",\n );\n\n const serverConfig = normalizedServerHost\n ? {\n host: normalizedServerHost,\n path: normalizedServerPath || undefined,\n port: normalizedServerPort || undefined,\n secure: normalizedServerSecure,\n }\n : {};\n\n orchestrator.peerjs.stop();\n orchestrator.peerjs.configure(\n normalizedMyPeerId,\n normalizedTrustedPeerIds,\n serverConfig,\n );\n\n if (normalizedMyPeerId && getChannelEnabled(orchestrator, \"peerjs\")) {\n orchestrator.peerjs.start();\n }\n}\n"],"mappings":";;;;;AAQA,eAAsB,gBACpB,cACA,IACA,UACA,gBACA,aAAa,IACb,aAAa,GACb,aAAa,IACb,eAAe,MACA;CACf,MAAM,qBAAqB,SAAS,KAAK;CACzC,MAAM,2BAA2B,oBAAoB,cAAc;CACnE,MAAM,uBAAuB,WAAW,KAAK;CAC7C,MAAM,uBAAuB,OAAO,SAAS,UAAU,IACnD,KAAK,IAAI,GAAG,KAAK,MAAM,UAAU,CAAC,IAClC;CAEJ,MAAM,uBAAuB,WAAW,KAAK;CAC7C,MAAM,yBAAyB,CAAC,CAAC;CAEjC,aAAa,iBAAiB;CAC9B,aAAa,uBAAuB;CACpC,aAAa,mBAAmB;CAChC,aAAa,mBAAmB;CAChC,aAAa,mBAAmB;CAChC,aAAa,qBAAqB;CAElC,MAAM,UAAU,IAAI,YAAY,mBAAmB,kBAAkB;CACrE,MAAM,UACJ,IACA,YAAY,yBACZ,KAAK,UAAU,wBAAwB,CACzC;CAEA,MAAM,UAAU,IAAI,YAAY,oBAAoB,oBAAoB;CACxE,MAAM,UACJ,IACA,YAAY,oBACZ,uBAAuB,OAAO,oBAAoB,IAAI,EACxD;CAEA,MAAM,UAAU,IAAI,YAAY,oBAAoB,oBAAoB;CACxE,MAAM,UACJ,IACA,YAAY,sBACZ,yBAAyB,SAAS,OACpC;CAEA,MAAM,eAAe,uBACjB;EACE,MAAM;EACN,MAAM,wBAAwB;EAC9B,MAAM,wBAAwB;EAC9B,QAAQ;CACV,IACA,CAAC;CAEL,aAAa,OAAO,KAAK;CACzB,aAAa,OAAO,UAClB,oBACA,0BACA,YACF;CAEA,IAAI,sBAAsB,kBAAkB,cAAc,QAAQ,GAChE,aAAa,OAAO,MAAM;AAE9B"}
1
+ {"version":3,"file":"configurePeerJs-oODzltaC.js","names":[],"sources":["../../src/core/orchestrator/utils/configurePeerJs.ts"],"sourcesContent":["import { CONFIG_KEYS } from \"../../../config/config.js\";\nimport { setConfig } from \"../../../db/setConfig.js\";\nimport { normalizeStringList } from \"./normalizeStringList.js\";\nimport { getChannelEnabled } from \"./operations/channel.js\";\n\nimport type { ShadowClawDatabase } from \"../../../db/db.js\";\nimport type { Orchestrator } from \"../orchestrator.js\";\n\nexport async function configurePeerJs(\n orchestrator: Orchestrator,\n db: ShadowClawDatabase,\n myPeerId: string,\n trustedPeerIds: string[],\n serverHost = \"\",\n serverPort = 0,\n serverPath = \"\",\n serverSecure = true,\n): Promise<void> {\n const normalizedMyPeerId = myPeerId.trim();\n const normalizedTrustedPeerIds = normalizeStringList(trustedPeerIds);\n const normalizedServerHost = serverHost.trim();\n const normalizedServerPort = Number.isFinite(serverPort)\n ? Math.max(0, Math.floor(serverPort))\n : 0;\n\n const normalizedServerPath = serverPath.trim();\n const normalizedServerSecure = !!serverSecure;\n\n orchestrator.peerjsMyPeerId = normalizedMyPeerId;\n orchestrator.peerjsTrustedPeerIds = normalizedTrustedPeerIds;\n orchestrator.peerjsServerHost = normalizedServerHost;\n orchestrator.peerjsServerPort = normalizedServerPort;\n orchestrator.peerjsServerPath = normalizedServerPath;\n orchestrator.peerjsServerSecure = normalizedServerSecure;\n\n await setConfig(db, CONFIG_KEYS.PEERJS_MY_PEER_ID, normalizedMyPeerId);\n await setConfig(\n db,\n CONFIG_KEYS.PEERJS_TRUSTED_PEER_IDS,\n JSON.stringify(normalizedTrustedPeerIds),\n );\n\n await setConfig(db, CONFIG_KEYS.PEERJS_SERVER_HOST, normalizedServerHost);\n await setConfig(\n db,\n CONFIG_KEYS.PEERJS_SERVER_PORT,\n normalizedServerPort ? String(normalizedServerPort) : \"\",\n );\n\n await setConfig(db, CONFIG_KEYS.PEERJS_SERVER_PATH, normalizedServerPath);\n await setConfig(\n db,\n CONFIG_KEYS.PEERJS_SERVER_SECURE,\n normalizedServerSecure ? \"true\" : \"false\",\n );\n\n const serverConfig = normalizedServerHost\n ? {\n host: normalizedServerHost,\n path: normalizedServerPath || undefined,\n port: normalizedServerPort || undefined,\n secure: normalizedServerSecure,\n }\n : {};\n\n orchestrator.peerjs.stop();\n orchestrator.peerjs.configure(\n normalizedMyPeerId,\n normalizedTrustedPeerIds,\n serverConfig,\n );\n\n if (normalizedMyPeerId && getChannelEnabled(orchestrator, \"peerjs\")) {\n orchestrator.peerjs.start();\n }\n}\n"],"mappings":";;;;;AAQA,eAAsB,gBACpB,cACA,IACA,UACA,gBACA,aAAa,IACb,aAAa,GACb,aAAa,IACb,eAAe,MACA;CACf,MAAM,qBAAqB,SAAS,KAAK;CACzC,MAAM,2BAA2B,oBAAoB,cAAc;CACnE,MAAM,uBAAuB,WAAW,KAAK;CAC7C,MAAM,uBAAuB,OAAO,SAAS,UAAU,IACnD,KAAK,IAAI,GAAG,KAAK,MAAM,UAAU,CAAC,IAClC;CAEJ,MAAM,uBAAuB,WAAW,KAAK;CAC7C,MAAM,yBAAyB,CAAC,CAAC;CAEjC,aAAa,iBAAiB;CAC9B,aAAa,uBAAuB;CACpC,aAAa,mBAAmB;CAChC,aAAa,mBAAmB;CAChC,aAAa,mBAAmB;CAChC,aAAa,qBAAqB;CAElC,MAAM,UAAU,IAAI,YAAY,mBAAmB,kBAAkB;CACrE,MAAM,UACJ,IACA,YAAY,yBACZ,KAAK,UAAU,wBAAwB,CACzC;CAEA,MAAM,UAAU,IAAI,YAAY,oBAAoB,oBAAoB;CACxE,MAAM,UACJ,IACA,YAAY,oBACZ,uBAAuB,OAAO,oBAAoB,IAAI,EACxD;CAEA,MAAM,UAAU,IAAI,YAAY,oBAAoB,oBAAoB;CACxE,MAAM,UACJ,IACA,YAAY,sBACZ,yBAAyB,SAAS,OACpC;CAEA,MAAM,eAAe,uBACjB;EACE,MAAM;EACN,MAAM,wBAAwB;EAC9B,MAAM,wBAAwB;EAC9B,QAAQ;CACV,IACA,CAAC;CAEL,aAAa,OAAO,KAAK;CACzB,aAAa,OAAO,UAClB,oBACA,0BACA,YACF;CAEA,IAAI,sBAAsB,kBAAkB,cAAc,QAAQ,GAChE,aAAa,OAAO,MAAM;AAE9B"}
@@ -66,6 +66,7 @@ export declare class ControlPlaneClient {
66
66
  private _stopHeartbeat;
67
67
  private _sendRegister;
68
68
  private _sendHeartbeat;
69
+ private _sendUnregister;
69
70
  private _sendMessage;
70
71
  private _handleMessage;
71
72
  }
@@ -1,5 +1,5 @@
1
1
  import { t as getGroupDir } from "./getGroupDir-m0f-ekgX.js";
2
- import { n as parsePath } from "./readGroupFileBytes-Bve-e5e_.js";
2
+ import { t as parsePath } from "./parsePath-DwC_YZjw.js";
3
3
 
4
4
  //#region src/storage/downloadGroupFile.ts
5
5
  /**
@@ -23,4 +23,4 @@ async function downloadGroupFile(db, groupId, filePath) {
23
23
 
24
24
  //#endregion
25
25
  export { downloadGroupFile as t };
26
- //# sourceMappingURL=downloadGroupFile-DboUjmp2.js.map
26
+ //# sourceMappingURL=downloadGroupFile-DmcBQU1n.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"downloadGroupFile-DboUjmp2.js","names":[],"sources":["../../src/storage/downloadGroupFile.ts"],"sourcesContent":["import { getGroupDir } from \"./getGroupDir.js\";\nimport { parsePath } from \"./parsePath.js\";\nimport type { ShadowClawDatabase } from \"../db/types.js\";\n\n/**\n * Download a single file\n */\nexport async function downloadGroupFile(\n db: ShadowClawDatabase,\n groupId: string,\n filePath: string,\n): Promise<void> {\n const groupDir = await getGroupDir(db, groupId);\n const { dirs, filename } = parsePath(filePath);\n\n let dir = groupDir;\n for (const seg of dirs) {\n dir = await dir.getDirectoryHandle(seg);\n }\n\n const fileHandle = await dir.getFileHandle(filename);\n const file = await fileHandle.getFile();\n\n // Create a download link and trigger download\n const url = URL.createObjectURL(file);\n const link = document.createElement(\"a\");\n\n link.href = url;\n link.download = filename;\n\n document.body.appendChild(link);\n\n link.click();\n\n document.body.removeChild(link);\n\n URL.revokeObjectURL(url);\n}\n"],"mappings":";;;;;;;AAOA,eAAsB,kBACpB,IACA,SACA,UACe;CACf,MAAM,WAAW,MAAM,YAAY,IAAI,OAAO;CAC9C,MAAM,EAAE,MAAM,aAAa,UAAU,QAAQ;CAE7C,IAAI,MAAM;CACV,KAAK,MAAM,OAAO,MAChB,MAAM,MAAM,IAAI,mBAAmB,GAAG;CAIxC,MAAM,OAAO,OAAM,MADM,IAAI,cAAc,QAAQ,EACtB,CAAC,QAAQ;CAGtC,MAAM,MAAM,IAAI,gBAAgB,IAAI;CACpC,MAAM,OAAO,SAAS,cAAc,GAAG;CAEvC,KAAK,OAAO;CACZ,KAAK,WAAW;CAEhB,SAAS,KAAK,YAAY,IAAI;CAE9B,KAAK,MAAM;CAEX,SAAS,KAAK,YAAY,IAAI;CAE9B,IAAI,gBAAgB,GAAG;AACzB"}
1
+ {"version":3,"file":"downloadGroupFile-DmcBQU1n.js","names":[],"sources":["../../src/storage/downloadGroupFile.ts"],"sourcesContent":["import { getGroupDir } from \"./getGroupDir.js\";\nimport { parsePath } from \"./parsePath.js\";\nimport type { ShadowClawDatabase } from \"../db/types.js\";\n\n/**\n * Download a single file\n */\nexport async function downloadGroupFile(\n db: ShadowClawDatabase,\n groupId: string,\n filePath: string,\n): Promise<void> {\n const groupDir = await getGroupDir(db, groupId);\n const { dirs, filename } = parsePath(filePath);\n\n let dir = groupDir;\n for (const seg of dirs) {\n dir = await dir.getDirectoryHandle(seg);\n }\n\n const fileHandle = await dir.getFileHandle(filename);\n const file = await fileHandle.getFile();\n\n // Create a download link and trigger download\n const url = URL.createObjectURL(file);\n const link = document.createElement(\"a\");\n\n link.href = url;\n link.download = filename;\n\n document.body.appendChild(link);\n\n link.click();\n\n document.body.removeChild(link);\n\n URL.revokeObjectURL(url);\n}\n"],"mappings":";;;;;;;AAOA,eAAsB,kBACpB,IACA,SACA,UACe;CACf,MAAM,WAAW,MAAM,YAAY,IAAI,OAAO;CAC9C,MAAM,EAAE,MAAM,aAAa,UAAU,QAAQ;CAE7C,IAAI,MAAM;CACV,KAAK,MAAM,OAAO,MAChB,MAAM,MAAM,IAAI,mBAAmB,GAAG;CAIxC,MAAM,OAAO,OAAM,MADM,IAAI,cAAc,QAAQ,EACtB,CAAC,QAAQ;CAGtC,MAAM,MAAM,IAAI,gBAAgB,IAAI;CACpC,MAAM,OAAO,SAAS,cAAc,GAAG;CAEvC,KAAK,OAAO;CACZ,KAAK,WAAW;CAEhB,SAAS,KAAK,YAAY,IAAI;CAE9B,KAAK,MAAM;CAEX,SAAS,KAAK,YAAY,IAAI;CAE9B,IAAI,gBAAgB,GAAG;AACzB"}
@@ -1,8 +1,9 @@
1
1
  import { t as Signal } from "./dist-Bxg3C_zy.js";
2
2
  import { t as getGroupDir } from "./getGroupDir-m0f-ekgX.js";
3
3
  import { o as DEFAULT_GROUP_ID } from "./config--CFrw3J3.js";
4
- import { n as parsePath, t as readGroupFileBytes } from "./readGroupFileBytes-Bve-e5e_.js";
5
- import { bn as readGroupFile } from "./orchestrator-DCfomsn9.js";
4
+ import { t as parsePath } from "./parsePath-DwC_YZjw.js";
5
+ import { o as readGroupFile } from "./tools-DwwB9RBa.js";
6
+ import { t as readGroupFileBytes } from "./readGroupFileBytes-C8oOe8Iu.js";
6
7
 
7
8
  //#region src/storage/getGroupFile.ts
8
9
  /**
@@ -147,4 +148,4 @@ const fileViewerStore = new FileViewerStore();
147
148
 
148
149
  //#endregion
149
150
  export { fileViewerStore as t };
150
- //# sourceMappingURL=file-viewer-BrK2Wxgh.js.map
151
+ //# sourceMappingURL=file-viewer-C3YKnq_-.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"file-viewer-BrK2Wxgh.js","names":[],"sources":["../../src/storage/getGroupFile.ts","../../src/stores/file-viewer.ts"],"sourcesContent":["import { getGroupDir } from \"./getGroupDir.js\";\nimport { parsePath } from \"./parsePath.js\";\nimport type { ShadowClawDatabase } from \"../db/types.js\";\n\n/**\n * Get a native File object from a file in a group's workspace.\n */\nexport async function getGroupFile(\n db: ShadowClawDatabase,\n groupId: string,\n filePath: string,\n): Promise<File> {\n const groupDir = await getGroupDir(db, groupId);\n const { dirs, filename } = parsePath(filePath);\n\n let dir = groupDir;\n for (const seg of dirs) {\n dir = await dir.getDirectoryHandle(seg);\n }\n\n const fileHandle = await dir.getFileHandle(filename);\n\n return await fileHandle.getFile();\n}\n","import { Signal } from \"signal-polyfill\";\n\nimport { readGroupFile } from \"../storage/readGroupFile.js\";\nimport { readGroupFileBytes } from \"../storage/readGroupFileBytes.js\";\nimport { getGroupFile } from \"../storage/getGroupFile.js\";\nimport { DEFAULT_GROUP_ID } from \"../config/config.js\";\nimport type { ShadowClawDatabase } from \"../db/types.js\";\n\nexport interface FileInfo {\n name: string;\n path?: string;\n groupId?: string;\n content: string;\n kind: \"text\" | \"pdf\" | \"binary\";\n binaryContent: Uint8Array | null;\n nativeFile?: File | null;\n mimeType: string;\n}\n\nexport interface FileViewerState {\n file: FileInfo | null;\n openFile: (\n db: ShadowClawDatabase,\n path: string,\n groupId?: string,\n ) => Promise<void>;\n closeFile: () => void;\n}\n\nexport class FileViewerStore {\n private _file: Signal.State<FileInfo | null>;\n\n constructor() {\n this._file = new Signal.State(null);\n }\n\n /**\n * Close the current file\n */\n closeFile() {\n this._file.set(null);\n }\n\n get file(): FileInfo | null {\n return this._file.get();\n }\n\n /**\n * Get current file\n */\n getFile(): FileInfo | null {\n return this.file;\n }\n\n /**\n * Get preview binary MIME type\n */\n getPreviewBinaryMimeType(fileName: string): string {\n const extension = fileName.toLowerCase().split(\".\").pop() || \"\";\n\n const mimeTypes: Record<string, string> = {\n \"3gp\": \"video/3gpp\",\n \"7z\": \"application/x-7z-compressed\",\n aac: \"audio/aac\",\n apng: \"image/apng\",\n avi: \"video/x-msvideo\",\n avif: \"image/avif\",\n bin: \"application/octet-stream\",\n bmp: \"image/bmp\",\n db: \"application/vnd.sqlite3\",\n dll: \"application/octet-stream\",\n dmg: \"application/octet-stream\",\n dylib: \"application/octet-stream\",\n exe: \"application/vnd.microsoft.portable-executable\",\n flac: \"audio/flac\",\n flv: \"video/x-flv\",\n gif: \"image/gif\",\n gz: \"application/gzip\",\n heic: \"image/heic\",\n heif: \"image/heif\",\n ico: \"image/x-icon\",\n iso: \"application/octet-stream\",\n jpeg: \"image/jpeg\",\n jpg: \"image/jpeg\",\n m4a: \"audio/mp4\",\n m4v: \"video/mp4\",\n mkv: \"video/x-matroska\",\n mov: \"video/mp4\",\n mp3: \"audio/mpeg\",\n mp4: \"video/mp4\",\n oga: \"audio/ogg\",\n ogg: \"audio/ogg\",\n ogv: \"video/ogg\",\n png: \"image/png\",\n rar: \"application/vnd.rar\",\n so: \"application/octet-stream\",\n sqlite: \"application/vnd.sqlite3\",\n sqlite3: \"application/vnd.sqlite3\",\n tar: \"application/x-tar\",\n tif: \"image/tiff\",\n tiff: \"image/tiff\",\n wasm: \"application/wasm\",\n wav: \"audio/wav\",\n weba: \"audio/webm\",\n webm: \"video/webm\",\n webp: \"image/webp\",\n wmv: \"video/x-ms-wmv\",\n zip: \"application/zip\",\n };\n\n return mimeTypes[extension] || \"\";\n }\n\n /**\n * Open a file\n */\n async openFile(\n db: ShadowClawDatabase,\n path: string,\n groupId: string = DEFAULT_GROUP_ID,\n ): Promise<void> {\n try {\n const name = path.split(\"/\").pop() || path;\n const isPdf = /\\.pdf$/i.test(name);\n const binaryMimeType = this.getPreviewBinaryMimeType(name);\n\n if (isPdf) {\n const binaryContent = await readGroupFileBytes(db, groupId, path);\n\n this._file.set({\n name,\n path,\n groupId,\n content: \"\",\n kind: \"pdf\",\n binaryContent,\n mimeType: \"application/pdf\",\n });\n\n return;\n }\n\n if (binaryMimeType) {\n const nativeFile = await getGroupFile(db, groupId, path);\n\n this._file.set({\n name,\n path,\n groupId,\n content: \"\",\n kind: \"binary\",\n binaryContent: null,\n nativeFile,\n mimeType: binaryMimeType,\n });\n\n return;\n }\n\n const content = await readGroupFile(db, groupId, path);\n this._file.set({\n name,\n path,\n groupId,\n content,\n kind: \"text\",\n binaryContent: null,\n mimeType: \"text/plain\",\n });\n } catch (err) {\n console.error(\"Failed to open file:\", path, err);\n\n throw err;\n }\n }\n}\n\nexport const fileViewerStore = new FileViewerStore();\n"],"mappings":";;;;;;;;;;AAOA,eAAsB,aACpB,IACA,SACA,UACe;CACf,MAAM,WAAW,MAAM,YAAY,IAAI,OAAO;CAC9C,MAAM,EAAE,MAAM,aAAa,UAAU,QAAQ;CAE7C,IAAI,MAAM;CACV,KAAK,MAAM,OAAO,MAChB,MAAM,MAAM,IAAI,mBAAmB,GAAG;CAKxC,OAAO,OAAM,MAFY,IAAI,cAAc,QAAQ,EAE5B,CAAC,QAAQ;AAClC;;;;ACMA,IAAa,kBAAb,MAA6B;CAC3B,AAAQ;CAER,cAAc;EACZ,KAAK,QAAQ,IAAI,OAAO,MAAM,IAAI;CACpC;;;;CAKA,YAAY;EACV,KAAK,MAAM,IAAI,IAAI;CACrB;CAEA,IAAI,OAAwB;EAC1B,OAAO,KAAK,MAAM,IAAI;CACxB;;;;CAKA,UAA2B;EACzB,OAAO,KAAK;CACd;;;;CAKA,yBAAyB,UAA0B;EAqDjD,OAAO;GAjDL,OAAO;GACP,MAAM;GACN,KAAK;GACL,MAAM;GACN,KAAK;GACL,MAAM;GACN,KAAK;GACL,KAAK;GACL,IAAI;GACJ,KAAK;GACL,KAAK;GACL,OAAO;GACP,KAAK;GACL,MAAM;GACN,KAAK;GACL,KAAK;GACL,IAAI;GACJ,MAAM;GACN,MAAM;GACN,KAAK;GACL,KAAK;GACL,MAAM;GACN,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,IAAI;GACJ,QAAQ;GACR,SAAS;GACT,KAAK;GACL,KAAK;GACL,MAAM;GACN,MAAM;GACN,KAAK;GACL,MAAM;GACN,MAAM;GACN,MAAM;GACN,KAAK;GACL,KAAK;EAGQ,EApDG,SAAS,YAAY,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,KAAK,OAoD9B;CACjC;;;;CAKA,MAAM,SACJ,IACA,MACA,UAAkB,kBACH;EACf,IAAI;GACF,MAAM,OAAO,KAAK,MAAM,GAAG,CAAC,CAAC,IAAI,KAAK;GACtC,MAAM,QAAQ,UAAU,KAAK,IAAI;GACjC,MAAM,iBAAiB,KAAK,yBAAyB,IAAI;GAEzD,IAAI,OAAO;IACT,MAAM,gBAAgB,MAAM,mBAAmB,IAAI,SAAS,IAAI;IAEhE,KAAK,MAAM,IAAI;KACb;KACA;KACA;KACA,SAAS;KACT,MAAM;KACN;KACA,UAAU;IACZ,CAAC;IAED;GACF;GAEA,IAAI,gBAAgB;IAClB,MAAM,aAAa,MAAM,aAAa,IAAI,SAAS,IAAI;IAEvD,KAAK,MAAM,IAAI;KACb;KACA;KACA;KACA,SAAS;KACT,MAAM;KACN,eAAe;KACf;KACA,UAAU;IACZ,CAAC;IAED;GACF;GAEA,MAAM,UAAU,MAAM,cAAc,IAAI,SAAS,IAAI;GACrD,KAAK,MAAM,IAAI;IACb;IACA;IACA;IACA;IACA,MAAM;IACN,eAAe;IACf,UAAU;GACZ,CAAC;EACH,SAAS,KAAK;GACZ,QAAQ,MAAM,wBAAwB,MAAM,GAAG;GAE/C,MAAM;EACR;CACF;AACF;AAEA,MAAa,kBAAkB,IAAI,gBAAgB"}
1
+ {"version":3,"file":"file-viewer-C3YKnq_-.js","names":[],"sources":["../../src/storage/getGroupFile.ts","../../src/stores/file-viewer.ts"],"sourcesContent":["import { getGroupDir } from \"./getGroupDir.js\";\nimport { parsePath } from \"./parsePath.js\";\nimport type { ShadowClawDatabase } from \"../db/types.js\";\n\n/**\n * Get a native File object from a file in a group's workspace.\n */\nexport async function getGroupFile(\n db: ShadowClawDatabase,\n groupId: string,\n filePath: string,\n): Promise<File> {\n const groupDir = await getGroupDir(db, groupId);\n const { dirs, filename } = parsePath(filePath);\n\n let dir = groupDir;\n for (const seg of dirs) {\n dir = await dir.getDirectoryHandle(seg);\n }\n\n const fileHandle = await dir.getFileHandle(filename);\n\n return await fileHandle.getFile();\n}\n","import { Signal } from \"signal-polyfill\";\n\nimport { readGroupFile } from \"../storage/readGroupFile.js\";\nimport { readGroupFileBytes } from \"../storage/readGroupFileBytes.js\";\nimport { getGroupFile } from \"../storage/getGroupFile.js\";\nimport { DEFAULT_GROUP_ID } from \"../config/config.js\";\nimport type { ShadowClawDatabase } from \"../db/types.js\";\n\nexport interface FileInfo {\n name: string;\n path?: string;\n groupId?: string;\n content: string;\n kind: \"text\" | \"pdf\" | \"binary\";\n binaryContent: Uint8Array | null;\n nativeFile?: File | null;\n mimeType: string;\n}\n\nexport interface FileViewerState {\n file: FileInfo | null;\n openFile: (\n db: ShadowClawDatabase,\n path: string,\n groupId?: string,\n ) => Promise<void>;\n closeFile: () => void;\n}\n\nexport class FileViewerStore {\n private _file: Signal.State<FileInfo | null>;\n\n constructor() {\n this._file = new Signal.State(null);\n }\n\n /**\n * Close the current file\n */\n closeFile() {\n this._file.set(null);\n }\n\n get file(): FileInfo | null {\n return this._file.get();\n }\n\n /**\n * Get current file\n */\n getFile(): FileInfo | null {\n return this.file;\n }\n\n /**\n * Get preview binary MIME type\n */\n getPreviewBinaryMimeType(fileName: string): string {\n const extension = fileName.toLowerCase().split(\".\").pop() || \"\";\n\n const mimeTypes: Record<string, string> = {\n \"3gp\": \"video/3gpp\",\n \"7z\": \"application/x-7z-compressed\",\n aac: \"audio/aac\",\n apng: \"image/apng\",\n avi: \"video/x-msvideo\",\n avif: \"image/avif\",\n bin: \"application/octet-stream\",\n bmp: \"image/bmp\",\n db: \"application/vnd.sqlite3\",\n dll: \"application/octet-stream\",\n dmg: \"application/octet-stream\",\n dylib: \"application/octet-stream\",\n exe: \"application/vnd.microsoft.portable-executable\",\n flac: \"audio/flac\",\n flv: \"video/x-flv\",\n gif: \"image/gif\",\n gz: \"application/gzip\",\n heic: \"image/heic\",\n heif: \"image/heif\",\n ico: \"image/x-icon\",\n iso: \"application/octet-stream\",\n jpeg: \"image/jpeg\",\n jpg: \"image/jpeg\",\n m4a: \"audio/mp4\",\n m4v: \"video/mp4\",\n mkv: \"video/x-matroska\",\n mov: \"video/mp4\",\n mp3: \"audio/mpeg\",\n mp4: \"video/mp4\",\n oga: \"audio/ogg\",\n ogg: \"audio/ogg\",\n ogv: \"video/ogg\",\n png: \"image/png\",\n rar: \"application/vnd.rar\",\n so: \"application/octet-stream\",\n sqlite: \"application/vnd.sqlite3\",\n sqlite3: \"application/vnd.sqlite3\",\n tar: \"application/x-tar\",\n tif: \"image/tiff\",\n tiff: \"image/tiff\",\n wasm: \"application/wasm\",\n wav: \"audio/wav\",\n weba: \"audio/webm\",\n webm: \"video/webm\",\n webp: \"image/webp\",\n wmv: \"video/x-ms-wmv\",\n zip: \"application/zip\",\n };\n\n return mimeTypes[extension] || \"\";\n }\n\n /**\n * Open a file\n */\n async openFile(\n db: ShadowClawDatabase,\n path: string,\n groupId: string = DEFAULT_GROUP_ID,\n ): Promise<void> {\n try {\n const name = path.split(\"/\").pop() || path;\n const isPdf = /\\.pdf$/i.test(name);\n const binaryMimeType = this.getPreviewBinaryMimeType(name);\n\n if (isPdf) {\n const binaryContent = await readGroupFileBytes(db, groupId, path);\n\n this._file.set({\n name,\n path,\n groupId,\n content: \"\",\n kind: \"pdf\",\n binaryContent,\n mimeType: \"application/pdf\",\n });\n\n return;\n }\n\n if (binaryMimeType) {\n const nativeFile = await getGroupFile(db, groupId, path);\n\n this._file.set({\n name,\n path,\n groupId,\n content: \"\",\n kind: \"binary\",\n binaryContent: null,\n nativeFile,\n mimeType: binaryMimeType,\n });\n\n return;\n }\n\n const content = await readGroupFile(db, groupId, path);\n this._file.set({\n name,\n path,\n groupId,\n content,\n kind: \"text\",\n binaryContent: null,\n mimeType: \"text/plain\",\n });\n } catch (err) {\n console.error(\"Failed to open file:\", path, err);\n\n throw err;\n }\n }\n}\n\nexport const fileViewerStore = new FileViewerStore();\n"],"mappings":";;;;;;;;;;;AAOA,eAAsB,aACpB,IACA,SACA,UACe;CACf,MAAM,WAAW,MAAM,YAAY,IAAI,OAAO;CAC9C,MAAM,EAAE,MAAM,aAAa,UAAU,QAAQ;CAE7C,IAAI,MAAM;CACV,KAAK,MAAM,OAAO,MAChB,MAAM,MAAM,IAAI,mBAAmB,GAAG;CAKxC,OAAO,OAAM,MAFY,IAAI,cAAc,QAAQ,EAE5B,CAAC,QAAQ;AAClC;;;;ACMA,IAAa,kBAAb,MAA6B;CAC3B,AAAQ;CAER,cAAc;EACZ,KAAK,QAAQ,IAAI,OAAO,MAAM,IAAI;CACpC;;;;CAKA,YAAY;EACV,KAAK,MAAM,IAAI,IAAI;CACrB;CAEA,IAAI,OAAwB;EAC1B,OAAO,KAAK,MAAM,IAAI;CACxB;;;;CAKA,UAA2B;EACzB,OAAO,KAAK;CACd;;;;CAKA,yBAAyB,UAA0B;EAqDjD,OAAO;GAjDL,OAAO;GACP,MAAM;GACN,KAAK;GACL,MAAM;GACN,KAAK;GACL,MAAM;GACN,KAAK;GACL,KAAK;GACL,IAAI;GACJ,KAAK;GACL,KAAK;GACL,OAAO;GACP,KAAK;GACL,MAAM;GACN,KAAK;GACL,KAAK;GACL,IAAI;GACJ,MAAM;GACN,MAAM;GACN,KAAK;GACL,KAAK;GACL,MAAM;GACN,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,IAAI;GACJ,QAAQ;GACR,SAAS;GACT,KAAK;GACL,KAAK;GACL,MAAM;GACN,MAAM;GACN,KAAK;GACL,MAAM;GACN,MAAM;GACN,MAAM;GACN,KAAK;GACL,KAAK;EAGQ,EApDG,SAAS,YAAY,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,KAAK,OAoD9B;CACjC;;;;CAKA,MAAM,SACJ,IACA,MACA,UAAkB,kBACH;EACf,IAAI;GACF,MAAM,OAAO,KAAK,MAAM,GAAG,CAAC,CAAC,IAAI,KAAK;GACtC,MAAM,QAAQ,UAAU,KAAK,IAAI;GACjC,MAAM,iBAAiB,KAAK,yBAAyB,IAAI;GAEzD,IAAI,OAAO;IACT,MAAM,gBAAgB,MAAM,mBAAmB,IAAI,SAAS,IAAI;IAEhE,KAAK,MAAM,IAAI;KACb;KACA;KACA;KACA,SAAS;KACT,MAAM;KACN;KACA,UAAU;IACZ,CAAC;IAED;GACF;GAEA,IAAI,gBAAgB;IAClB,MAAM,aAAa,MAAM,aAAa,IAAI,SAAS,IAAI;IAEvD,KAAK,MAAM,IAAI;KACb;KACA;KACA;KACA,SAAS;KACT,MAAM;KACN,eAAe;KACf;KACA,UAAU;IACZ,CAAC;IAED;GACF;GAEA,MAAM,UAAU,MAAM,cAAc,IAAI,SAAS,IAAI;GACrD,KAAK,MAAM,IAAI;IACb;IACA;IACA;IACA;IACA,MAAM;IACN,eAAe;IACf,UAAU;GACZ,CAAC;EACH,SAAS,KAAK;GACZ,QAAQ,MAAM,wBAAwB,MAAM,GAAG;GAE/C,MAAM;EACR;CACF;AACF;AAEA,MAAa,kBAAkB,IAAI,gBAAgB"}
package/dist/lib/index.js CHANGED
@@ -1,45 +1,45 @@
1
1
  import ShadowClawElement from "./components/shadow-claw-element.js";
2
2
  import { ulid } from "./utils/ulid.js";
3
- import { c as escapeHtml, d as handleSpecialLinkNavigation, f as sanitizeHtml, l as formatDateForFilename, o as bufferToHex, p as toArrayBuffer, s as computeSha256, u as formatTimestamp } from "./trusted-types-CkLDpLiZ.js";
3
+ import { c as escapeHtml, d as handleSpecialLinkNavigation, f as sanitizeHtml, l as formatDateForFilename, o as bufferToHex, p as toArrayBuffer, s as computeSha256, u as formatTimestamp } from "./trusted-types-Dx0RZlrd.js";
4
4
  import { a as showSuccess, i as showInfo, l as toastStore, o as showToast, r as showError, s as showWarning } from "./toast-DZ6r7_YI.js";
5
5
  import { getNamespacedItem, getNamespacedStorageKey, removeNamespacedItem, setNamespacedItem } from "./utils/namespacedStorage.js";
6
6
  import { applyJsonPatch } from "./utils/jsonPatch.js";
7
- import { t as ShadowClaw } from "./shadow-claw-D8xINM3c.js";
8
- import { t as ShadowClawChat } from "./shadow-claw-chat-B16MspoP.js";
9
- import { t as ShadowClawA2UI } from "./shadow-claw-a2ui-7rJqG4Ke.js";
7
+ import { t as ShadowClaw } from "./shadow-claw-6UHdiy4a.js";
8
+ import { t as ShadowClawChat } from "./shadow-claw-chat-BMoqQJRK.js";
9
+ import { t as ShadowClawA2UI } from "./shadow-claw-a2ui-CpZUTzlh.js";
10
10
  import { t as ShadowClawPageHeaderActionButton } from "./shadow-claw-page-header-action-button-BXXm5b5N.js";
11
11
  import { ShadowClawA2UIInterceptor } from "./components/shadow-claw-a2ui-interceptor.js";
12
12
  import { ShadowClawDialog } from "./components/shadow-claw-dialog.js";
13
- import { t as ShadowClawPageHeader } from "./shadow-claw-page-header-CcHUfFUx.js";
14
- import { t as ShadowClawFiles } from "./shadow-claw-files-EYhOPYIH.js";
13
+ import { t as ShadowClawPageHeader } from "./shadow-claw-page-header-Cti2fzf-.js";
14
+ import { t as ShadowClawFiles } from "./shadow-claw-files-DIREEnT2.js";
15
15
  import { t as ShadowClawEmptyState } from "./shadow-claw-empty-state-DPfDqaMA.js";
16
- import { t as ShadowClawFileViewer } from "./shadow-claw-file-viewer-BfDHHgpA.js";
16
+ import { t as ShadowClawFileViewer } from "./shadow-claw-file-viewer-DUxzVxDT.js";
17
17
  import { t as ShadowClawPdfViewer } from "./shadow-claw-pdf-viewer-D3leDhRq.js";
18
- import { t as ShadowClawTasks } from "./shadow-claw-tasks-DDHd8W4d.js";
19
- import { n as ShadowClawTerminal } from "./shadow-claw-terminal-kB6_tWKz.js";
20
- import { t as ShadowClawPages } from "./shadow-claw-pages-D54jF1Qq.js";
21
- import { t as ShadowClawSettings } from "./shadow-claw-settings-Bt1VAe-1.js";
22
- import { t as ShadowClawPeerJs } from "./shadow-claw-peerjs-B9-T8Nlx.js";
23
- import { t as ShadowClawChannelConfig } from "./shadow-claw-channel-config-Bj0-Nk3t.js";
24
- import { t as ShadowClawChannels } from "./shadow-claw-channels-C_jI4KhP.js";
18
+ import { t as ShadowClawTasks } from "./shadow-claw-tasks-i_evIufy.js";
19
+ import { n as ShadowClawTerminal } from "./shadow-claw-terminal-CwScROlu.js";
20
+ import { t as ShadowClawPages } from "./shadow-claw-pages-BgPyIEZO.js";
21
+ import { t as ShadowClawSettings } from "./shadow-claw-settings-CN89xRVU.js";
22
+ import { t as ShadowClawPeerJs } from "./shadow-claw-peerjs-xkBXILed.js";
23
+ import { t as ShadowClawChannelConfig } from "./shadow-claw-channel-config-DmfwJc6G.js";
24
+ import { t as ShadowClawChannels } from "./shadow-claw-channels-1N6Jl-By.js";
25
25
  import { t as ShadowClawProviderModelPicker } from "./shadow-claw-provider-model-picker-CsA-507a.js";
26
26
  import { t as ShadowClawProviderModuleSettings } from "./shadow-claw-provider-module-settings-3sCTnCSp.js";
27
- import { t as ShadowClawConversations } from "./shadow-claw-conversations-Ct1kAYdB.js";
27
+ import { t as ShadowClawConversations } from "./shadow-claw-conversations-BwXep3iu.js";
28
28
  import { t as ShadowClawToast } from "./shadow-claw-toast-C8oAkrMC.js";
29
- import { t as ShadowClawTools } from "./shadow-claw-tools-DxXIm0ku.js";
29
+ import { t as ShadowClawTools } from "./shadow-claw-tools-DD3fyXP4.js";
30
30
  import { t as ShadowClawActions } from "./shadow-claw-actions-G99P9oxr.js";
31
31
  import { t as ShadowClawCard } from "./shadow-claw-card-D9azfSMu.js";
32
- import { t as ShadowClawAccounts } from "./shadow-claw-accounts-CdruwN8A.js";
33
- import { t as ShadowClawControlPlane } from "./shadow-claw-control-plane-x8Ldid_h.js";
34
- import { t as ShadowClawGit } from "./shadow-claw-git-tcSpT-P0.js";
35
- import { t as ShadowClawIntegrations } from "./shadow-claw-integrations-NbcCx_ZI.js";
36
- import { t as ShadowClawLlm } from "./shadow-claw-llm-BazJdD5f.js";
37
- import { t as ShadowClawMcpRemote } from "./shadow-claw-mcp-remote-CYmhpg7a.js";
38
- import { t as ShadowClawNetworking } from "./shadow-claw-networking-DImPxe0H.js";
32
+ import { t as ShadowClawAccounts } from "./shadow-claw-accounts-03oJ__XC.js";
33
+ import { t as ShadowClawControlPlane } from "./shadow-claw-control-plane-UG0o7pCz.js";
34
+ import { t as ShadowClawGit } from "./shadow-claw-git-Bg1SWgsF.js";
35
+ import { t as ShadowClawIntegrations } from "./shadow-claw-integrations-Ds-CLPhj.js";
36
+ import { t as ShadowClawLlm } from "./shadow-claw-llm-CazBrVpM.js";
37
+ import { t as ShadowClawMcpRemote } from "./shadow-claw-mcp-remote-CT5Q-54E.js";
38
+ import { t as ShadowClawNetworking } from "./shadow-claw-networking-Df85tCbO.js";
39
39
  import { t as ShadowClawNotifications } from "./shadow-claw-notifications-v62FryTc.js";
40
- import { t as ShadowClawStorage } from "./shadow-claw-storage-CFOjGf1d.js";
41
- import { t as ShadowClawTaskServer } from "./shadow-claw-task-server-BiKa2GOm.js";
42
- import { t as ShadowClawWebvm } from "./shadow-claw-webvm-Dc8oo7ao.js";
40
+ import { t as ShadowClawStorage } from "./shadow-claw-storage-VnhcObCe.js";
41
+ import { t as ShadowClawTaskServer } from "./shadow-claw-task-server-jgEC2hHB.js";
42
+ import { t as ShadowClawWebvm } from "./shadow-claw-webvm-DbJq4I3-.js";
43
43
  import "./components/index.js";
44
44
  import { base64ToBytes, bytesToBase64 } from "./utils/base64.js";
45
45
  import { t as utils_exports } from "./utils/index.js";
@@ -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