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
@@ -0,0 +1,328 @@
1
+ /**
2
+ * ShadowClaw CLI — `skills:index` command
3
+ * Generates and updates .well-known/agent-skills/index.json per the
4
+ * Cloudflare Agent Skills Discovery RFC (v0.2.0).
5
+ */
6
+
7
+ import crypto from "node:crypto";
8
+ import { mkdir, readdir, readFile, stat, writeFile } from "node:fs/promises";
9
+ import path from "node:path";
10
+ import process from "node:process";
11
+ import matter from "gray-matter";
12
+
13
+ /**
14
+ * Computes a standardized sha256:{hex} digest from Buffer or string.
15
+ */
16
+ export function computeSha256(content) {
17
+ const hash = crypto.createHash("sha256").update(content).digest("hex");
18
+ return `sha256:${hash.toLowerCase()}`;
19
+ }
20
+
21
+ async function pathExists(p) {
22
+ try {
23
+ await stat(p);
24
+ return true;
25
+ } catch {
26
+ return false;
27
+ }
28
+ }
29
+
30
+ /**
31
+ * Recursively find all files matching a filter under a root directory.
32
+ */
33
+ async function findFilesRecursively(dir, filterFn) {
34
+ const results = [];
35
+ if (!(await pathExists(dir))) return results;
36
+
37
+ async function walk(currentDir) {
38
+ const entries = await readdir(currentDir, { withFileTypes: true });
39
+ for (const entry of entries) {
40
+ const fullPath = path.join(currentDir, entry.name);
41
+ if (entry.isDirectory()) {
42
+ await walk(fullPath);
43
+ } else if (
44
+ entry.isFile() &&
45
+ (!filterFn || filterFn(entry.name, fullPath))
46
+ ) {
47
+ results.push(fullPath);
48
+ }
49
+ }
50
+ }
51
+
52
+ await walk(dir);
53
+ return results.sort();
54
+ }
55
+
56
+ /**
57
+ * Generates the Agent Skills Discovery index object.
58
+ */
59
+ export async function generateSkillsIndex(
60
+ contentRoot = process.cwd(),
61
+ options = {},
62
+ ) {
63
+ const resolvedRoot = path.resolve(contentRoot);
64
+ const wellKnownDirRel = options.outDir || ".well-known/agent-skills";
65
+
66
+ // 1. Read metadata from shadow-claw.config.json or package.json
67
+ let siteName = path.basename(resolvedRoot);
68
+ let siteDescription =
69
+ "Agent skills and tools collection, powered by ShadowClaw.";
70
+
71
+ const configPath = path.join(resolvedRoot, "shadow-claw.config.json");
72
+ if (await pathExists(configPath)) {
73
+ try {
74
+ const configStr = await readFile(configPath, "utf8");
75
+ const config = JSON.parse(configStr);
76
+ if (config.site?.title) siteName = config.site.title;
77
+ if (config.site?.description) siteDescription = config.site.description;
78
+ } catch {}
79
+ } else {
80
+ const pkgPath = path.join(resolvedRoot, "package.json");
81
+ if (await pathExists(pkgPath)) {
82
+ try {
83
+ const pkgStr = await readFile(pkgPath, "utf8");
84
+ const pkg = JSON.parse(pkgStr);
85
+ if (pkg.name) siteName = pkg.name;
86
+ if (pkg.description) siteDescription = pkg.description;
87
+ } catch {}
88
+ }
89
+ }
90
+
91
+ // 2. Discover Tools (.agents/tools/**/*.json)
92
+ const toolsDir = path.join(resolvedRoot, ".agents", "tools");
93
+ const toolFiles = await findFilesRecursively(toolsDir, (name) =>
94
+ name.endsWith(".json"),
95
+ );
96
+ const discoveredTools = [];
97
+
98
+ for (const fullToolPath of toolFiles) {
99
+ const relFromRoot = path.relative(resolvedRoot, fullToolPath);
100
+ const relUrl = path.posix.normalize(
101
+ path.posix.relative(
102
+ wellKnownDirRel,
103
+ relFromRoot.split(path.sep).join(path.posix.sep),
104
+ ),
105
+ );
106
+ const content = await readFile(fullToolPath);
107
+ const digest = computeSha256(content);
108
+
109
+ let name = path.basename(fullToolPath, ".json");
110
+ let description = "";
111
+
112
+ try {
113
+ const parsed = JSON.parse(content.toString("utf8"));
114
+ if (parsed.name) name = parsed.name;
115
+ if (parsed.description) description = parsed.description;
116
+ } catch {}
117
+
118
+ discoveredTools.push({
119
+ name,
120
+ description,
121
+ url: relUrl,
122
+ digest,
123
+ relFromRoot,
124
+ });
125
+ }
126
+
127
+ // 3. Discover Scripts (.agents/scripts/**/*.{js,mjs})
128
+ const scriptsDir = path.join(resolvedRoot, ".agents", "scripts");
129
+ const scriptFiles = await findFilesRecursively(
130
+ scriptsDir,
131
+ (name) => name.endsWith(".js") || name.endsWith(".mjs"),
132
+ );
133
+ const discoveredScripts = [];
134
+
135
+ for (const fullScriptPath of scriptFiles) {
136
+ const relFromRoot = path.relative(resolvedRoot, fullScriptPath);
137
+ const relUrl = path.posix.normalize(
138
+ path.posix.relative(
139
+ wellKnownDirRel,
140
+ relFromRoot.split(path.sep).join(path.posix.sep),
141
+ ),
142
+ );
143
+ const content = await readFile(fullScriptPath);
144
+ const digest = computeSha256(content);
145
+ const baseName = path.basename(
146
+ fullScriptPath,
147
+ path.extname(fullScriptPath),
148
+ );
149
+
150
+ discoveredScripts.push({
151
+ name: baseName,
152
+ description: `Portable ESM engine logic and tool execution handler for ${baseName}.`,
153
+ url: relUrl,
154
+ digest,
155
+ relFromRoot,
156
+ });
157
+ }
158
+
159
+ // 4. Discover Skills (.agents/skills/**/SKILL.md)
160
+ const skillsDir = path.join(resolvedRoot, ".agents", "skills");
161
+ const skillFiles = await findFilesRecursively(
162
+ skillsDir,
163
+ (name) => name === "SKILL.md",
164
+ );
165
+ const discoveredSkills = [];
166
+
167
+ for (const fullSkillPath of skillFiles) {
168
+ const relFromRoot = path.relative(resolvedRoot, fullSkillPath);
169
+ const relUrl = path.posix.normalize(
170
+ path.posix.relative(
171
+ wellKnownDirRel,
172
+ relFromRoot.split(path.sep).join(path.posix.sep),
173
+ ),
174
+ );
175
+ const rawContent = await readFile(fullSkillPath);
176
+ const digest = computeSha256(rawContent);
177
+
178
+ let frontmatter = {};
179
+ try {
180
+ const parsed = matter(rawContent.toString("utf8"));
181
+ frontmatter = parsed.data || {};
182
+ } catch {}
183
+
184
+ const parentDirName = path.basename(path.dirname(fullSkillPath));
185
+ const skillName = frontmatter.name || parentDirName;
186
+ const skillDesc = frontmatter.description || "";
187
+
188
+ // Identify associated tools
189
+ const associatedToolNames = new Set();
190
+ let hasExplicitTools = false;
191
+ if (Array.isArray(frontmatter.metadata?.execution?.tools)) {
192
+ for (const t of frontmatter.metadata.execution.tools) {
193
+ if (t?.name) {
194
+ associatedToolNames.add(t.name);
195
+ hasExplicitTools = true;
196
+ }
197
+ }
198
+ }
199
+ const allowedToolsRaw =
200
+ frontmatter.metadata?.["allowed-tools"] ||
201
+ frontmatter.metadata?.allowedTools ||
202
+ frontmatter["allowed-tools"];
203
+ if (typeof allowedToolsRaw === "string") {
204
+ allowedToolsRaw
205
+ .split(/[,\s]+/)
206
+ .filter(Boolean)
207
+ .forEach((t) => {
208
+ associatedToolNames.add(t);
209
+ hasExplicitTools = true;
210
+ });
211
+ }
212
+ // Only fallback if no explicit tools were declared in frontmatter
213
+ if (!hasExplicitTools) {
214
+ for (const tool of discoveredTools) {
215
+ const normTool = tool.name.replace(/[-_]/g, "");
216
+ const normSkill = skillName.replace(/[-_]/g, "");
217
+ if (normTool === normSkill) {
218
+ associatedToolNames.add(tool.name);
219
+ }
220
+ }
221
+ }
222
+
223
+ const matchingTools = discoveredTools
224
+ .filter((t) => associatedToolNames.has(t.name))
225
+ .map(({ name, url, digest }) => ({ name, url, digest }));
226
+
227
+ // Identify associated scripts
228
+ // Match by base name or if script base is a prefix/contains skill name base
229
+ const matchingScripts = discoveredScripts
230
+ .filter((s) => {
231
+ const normScript = s.name.toLowerCase().replace(/[-_]/g, "");
232
+ const normSkill = skillName.toLowerCase().replace(/[-_]/g, "");
233
+ return (
234
+ normSkill.startsWith(normScript) ||
235
+ normScript.startsWith(normSkill) ||
236
+ associatedToolNames.has(s.name)
237
+ );
238
+ })
239
+ .map(({ name, url, digest }) => ({ name, url, digest }));
240
+
241
+ discoveredSkills.push({
242
+ name: skillName,
243
+ type: "skill-md",
244
+ description: skillDesc,
245
+ url: relUrl,
246
+ digest,
247
+ ...(matchingTools.length ? { tools: matchingTools } : {}),
248
+ ...(matchingScripts.length ? { scripts: matchingScripts } : {}),
249
+ });
250
+ }
251
+
252
+ // 5. Construct Index Document
253
+ const indexDoc = {
254
+ $schema: "https://schemas.agentskills.io/discovery/0.2.0/schema.json",
255
+ name: siteName,
256
+ description: siteDescription,
257
+ skills: discoveredSkills,
258
+ ...(discoveredTools.length
259
+ ? {
260
+ tools: discoveredTools.map(({ name, description, url, digest }) => ({
261
+ name,
262
+ ...(description ? { description } : {}),
263
+ url,
264
+ digest,
265
+ })),
266
+ }
267
+ : {}),
268
+ ...(discoveredScripts.length
269
+ ? {
270
+ scripts: discoveredScripts.map(
271
+ ({ name, description, url, digest }) => ({
272
+ name,
273
+ ...(description ? { description } : {}),
274
+ url,
275
+ digest,
276
+ }),
277
+ ),
278
+ }
279
+ : {}),
280
+ ...(discoveredTools.length || discoveredScripts.length
281
+ ? {
282
+ dependencies: {
283
+ ...(discoveredTools.length
284
+ ? { tools: discoveredTools.map((t) => t.url) }
285
+ : {}),
286
+ ...(discoveredScripts.length
287
+ ? { scripts: discoveredScripts.map((s) => s.url) }
288
+ : {}),
289
+ },
290
+ }
291
+ : {}),
292
+ };
293
+
294
+ // 6. Output Handling
295
+ if (options.stdout) {
296
+ console.log(JSON.stringify(indexDoc, null, 2));
297
+ }
298
+
299
+ if (options.write !== false) {
300
+ const targetFile = options.outFile
301
+ ? path.resolve(options.outFile)
302
+ : path.join(resolvedRoot, wellKnownDirRel, "index.json");
303
+
304
+ await mkdir(path.dirname(targetFile), { recursive: true });
305
+ await writeFile(
306
+ targetFile,
307
+ JSON.stringify(indexDoc, null, 2) + "\n",
308
+ "utf8",
309
+ );
310
+ }
311
+
312
+ return indexDoc;
313
+ }
314
+
315
+ /**
316
+ * CLI command runner for `shadow-claw skills:index [dir]`.
317
+ */
318
+ export async function runSkillsIndexCommand(dir, options = {}) {
319
+ const targetDir = dir ? path.resolve(dir) : process.cwd();
320
+ console.log(`Generating Agent Skills Discovery index for ${targetDir}...`);
321
+
322
+ const result = await generateSkillsIndex(targetDir, options);
323
+ const count = result.skills ? result.skills.length : 0;
324
+ console.log(
325
+ `Indexed ${count} skill(s) into .well-known/agent-skills/index.json`,
326
+ );
327
+ return result;
328
+ }
@@ -0,0 +1,161 @@
1
+ import fs from "node:fs";
2
+ import { mkdir, mkdtemp, rm, writeFile } from "node:fs/promises";
3
+ import os from "node:os";
4
+ import path from "node:path";
5
+ import {
6
+ jest,
7
+ describe,
8
+ it,
9
+ expect,
10
+ beforeEach,
11
+ afterEach,
12
+ } from "@jest/globals";
13
+ import {
14
+ computeSha256,
15
+ generateSkillsIndex,
16
+ runSkillsIndexCommand,
17
+ } from "./skills-index.mjs";
18
+
19
+ describe("skills-index command and generator", () => {
20
+ let tempDir;
21
+
22
+ beforeEach(async () => {
23
+ tempDir = await mkdtemp(path.join(os.tmpdir(), "sc-skills-index-test-"));
24
+ });
25
+
26
+ afterEach(async () => {
27
+ if (tempDir && fs.existsSync(tempDir)) {
28
+ await rm(tempDir, { recursive: true, force: true });
29
+ }
30
+ });
31
+
32
+ it("computes standard sha256 format", () => {
33
+ const hash = computeSha256("hello world");
34
+ expect(hash).toMatch(/^sha256:[a-f0-9]{64}$/);
35
+ expect(hash).toBe(
36
+ "sha256:b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9",
37
+ );
38
+ });
39
+
40
+ it("indexes skills, tools, and scripts into .well-known/agent-skills/index.json", async () => {
41
+ // 1. Setup mock repo layout
42
+ const skillDir = path.join(
43
+ tempDir,
44
+ ".agents",
45
+ "skills",
46
+ "main",
47
+ "test-skill",
48
+ );
49
+ const toolDir = path.join(tempDir, ".agents", "tools", "main");
50
+ const scriptDir = path.join(tempDir, ".agents", "scripts", "main");
51
+
52
+ await mkdir(skillDir, { recursive: true });
53
+ await mkdir(toolDir, { recursive: true });
54
+ await mkdir(scriptDir, { recursive: true });
55
+
56
+ const skillContent = `---
57
+ name: test-skill
58
+ description: A test skill for discovery index.
59
+ metadata:
60
+ allowed-tools: test_tool
61
+ execution:
62
+ type: tools
63
+ tools:
64
+ - name: test_tool
65
+ ---
66
+ # Test Skill Body
67
+ `;
68
+ await writeFile(path.join(skillDir, "SKILL.md"), skillContent, "utf8");
69
+
70
+ const toolContent = JSON.stringify({
71
+ name: "test_tool",
72
+ description: "A test tool description.",
73
+ input_schema: { type: "object" },
74
+ });
75
+ await writeFile(path.join(toolDir, "test_tool.json"), toolContent, "utf8");
76
+
77
+ const scriptContent = `export function run() { return 42; }`;
78
+ await writeFile(
79
+ path.join(scriptDir, "test-skill.js"),
80
+ scriptContent,
81
+ "utf8",
82
+ );
83
+
84
+ // 2. Run generator
85
+ const indexDoc = await generateSkillsIndex(tempDir);
86
+
87
+ expect(indexDoc.$schema).toBe(
88
+ "https://schemas.agentskills.io/discovery/0.2.0/schema.json",
89
+ );
90
+ expect(indexDoc.skills).toHaveLength(1);
91
+
92
+ const skill = indexDoc.skills[0];
93
+ expect(skill.name).toBe("test-skill");
94
+ expect(skill.type).toBe("skill-md");
95
+ expect(skill.description).toBe("A test skill for discovery index.");
96
+ expect(skill.url).toBe("../../.agents/skills/main/test-skill/SKILL.md");
97
+ expect(skill.digest).toBe(computeSha256(skillContent));
98
+
99
+ // Check associated tools & scripts on skill
100
+ expect(skill.tools).toHaveLength(1);
101
+ expect(skill.tools[0].name).toBe("test_tool");
102
+ expect(skill.tools[0].url).toBe("../../.agents/tools/main/test_tool.json");
103
+ expect(skill.tools[0].digest).toBe(computeSha256(toolContent));
104
+
105
+ expect(skill.scripts).toHaveLength(1);
106
+ expect(skill.scripts[0].name).toBe("test-skill");
107
+ expect(skill.scripts[0].url).toBe(
108
+ "../../.agents/scripts/main/test-skill.js",
109
+ );
110
+ expect(skill.scripts[0].digest).toBe(computeSha256(scriptContent));
111
+
112
+ // Check top-level arrays
113
+ expect(indexDoc.tools).toHaveLength(1);
114
+ expect(indexDoc.scripts).toHaveLength(1);
115
+ expect(indexDoc.dependencies.tools).toContain(
116
+ "../../.agents/tools/main/test_tool.json",
117
+ );
118
+ expect(indexDoc.dependencies.scripts).toContain(
119
+ "../../.agents/scripts/main/test-skill.js",
120
+ );
121
+
122
+ // Verify written file on disk
123
+ const targetFile = path.join(
124
+ tempDir,
125
+ ".well-known",
126
+ "agent-skills",
127
+ "index.json",
128
+ );
129
+ expect(fs.existsSync(targetFile)).toBe(true);
130
+
131
+ const writtenJson = JSON.parse(
132
+ await fs.promises.readFile(targetFile, "utf8"),
133
+ );
134
+ expect(writtenJson.skills[0].name).toBe("test-skill");
135
+ });
136
+
137
+ it("respects write: false and custom output file options", async () => {
138
+ const skillDir = path.join(tempDir, ".agents", "skills", "main", "minimal");
139
+ await mkdir(skillDir, { recursive: true });
140
+ await writeFile(
141
+ path.join(skillDir, "SKILL.md"),
142
+ "---\nname: minimal\ndescription: Minimal.\n---\n",
143
+ "utf8",
144
+ );
145
+
146
+ const res = await generateSkillsIndex(tempDir, { write: false });
147
+ expect(res.skills).toHaveLength(1);
148
+
149
+ const standardPath = path.join(
150
+ tempDir,
151
+ ".well-known",
152
+ "agent-skills",
153
+ "index.json",
154
+ );
155
+ expect(fs.existsSync(standardPath)).toBe(false);
156
+
157
+ const customOut = path.join(tempDir, "custom", "index.json");
158
+ await generateSkillsIndex(tempDir, { outFile: customOut });
159
+ expect(fs.existsSync(customOut)).toBe(true);
160
+ });
161
+ });
@@ -9,6 +9,7 @@ describe("getApprovedCustomElementScripts", () => {
9
9
  "https://bad.example.com/x.mjs",
10
10
  "https://allowed.example.com/x.mjs",
11
11
  { src: "local.mjs" },
12
+ { src: "adapter.mjs", hasInit: true },
12
13
  ],
13
14
  ["allowed.example.com"],
14
15
  (message) => warns.push(message),
@@ -17,6 +18,7 @@ describe("getApprovedCustomElementScripts", () => {
17
18
  expect(approved).toEqual([
18
19
  "https://allowed.example.com/x.mjs",
19
20
  { src: "local.mjs" },
21
+ { src: "adapter.mjs", hasInit: true },
20
22
  ]);
21
23
  expect(warns).toEqual([
22
24
  "[Security] Skipping script from unapproved domain during build: https://bad.example.com/x.mjs",
@@ -38,11 +38,20 @@ describe("sanitizeEmbeddedCustomElementScripts", () => {
38
38
  });
39
39
 
40
40
  const removesMissingSrc = sanitizeEmbeddedCustomElementScripts(
41
- { customElements: { scripts: [{}, { src: "local.mjs" }] } },
41
+ {
42
+ customElements: {
43
+ scripts: [
44
+ {},
45
+ { src: "local.mjs" },
46
+ { src: "another.mjs", hasInit: true },
47
+ ],
48
+ },
49
+ },
42
50
  ["allowed.example.com"],
43
51
  );
44
52
  expect(removesMissingSrc.customElements.scripts).toEqual([
45
53
  { src: "local.mjs" },
54
+ { src: "another.mjs", hasInit: true },
46
55
  ]);
47
56
  });
48
57
  });
@@ -1,40 +1,40 @@
1
1
  import ShadowClawElement from "./shadow-claw-element.js";
2
2
  import { a as showSuccess, i as showInfo, l as toastStore, o as showToast, r as showError, s as showWarning } from "../toast-DZ6r7_YI.js";
3
- import { t as ShadowClaw } from "../shadow-claw-D8xINM3c.js";
4
- import { t as ShadowClawChat } from "../shadow-claw-chat-B16MspoP.js";
5
- import { t as ShadowClawA2UI } from "../shadow-claw-a2ui-7rJqG4Ke.js";
3
+ import { t as ShadowClaw } from "../shadow-claw-6UHdiy4a.js";
4
+ import { t as ShadowClawChat } from "../shadow-claw-chat-BMoqQJRK.js";
5
+ import { t as ShadowClawA2UI } from "../shadow-claw-a2ui-CpZUTzlh.js";
6
6
  import { t as ShadowClawPageHeaderActionButton } from "../shadow-claw-page-header-action-button-BXXm5b5N.js";
7
7
  import { ShadowClawA2UIInterceptor } from "./shadow-claw-a2ui-interceptor.js";
8
8
  import { ShadowClawDialog } from "./shadow-claw-dialog.js";
9
- import { t as ShadowClawPageHeader } from "../shadow-claw-page-header-CcHUfFUx.js";
10
- import { t as ShadowClawFiles } from "../shadow-claw-files-EYhOPYIH.js";
9
+ import { t as ShadowClawPageHeader } from "../shadow-claw-page-header-Cti2fzf-.js";
10
+ import { t as ShadowClawFiles } from "../shadow-claw-files-DIREEnT2.js";
11
11
  import { t as ShadowClawEmptyState } from "../shadow-claw-empty-state-DPfDqaMA.js";
12
- import { t as ShadowClawFileViewer } from "../shadow-claw-file-viewer-BfDHHgpA.js";
12
+ import { t as ShadowClawFileViewer } from "../shadow-claw-file-viewer-DUxzVxDT.js";
13
13
  import { t as ShadowClawPdfViewer } from "../shadow-claw-pdf-viewer-D3leDhRq.js";
14
- import { t as ShadowClawTasks } from "../shadow-claw-tasks-DDHd8W4d.js";
15
- import { n as ShadowClawTerminal } from "../shadow-claw-terminal-kB6_tWKz.js";
16
- import { t as ShadowClawPages } from "../shadow-claw-pages-D54jF1Qq.js";
17
- import { t as ShadowClawSettings } from "../shadow-claw-settings-Bt1VAe-1.js";
18
- import { t as ShadowClawPeerJs } from "../shadow-claw-peerjs-B9-T8Nlx.js";
19
- import { t as ShadowClawChannelConfig } from "../shadow-claw-channel-config-Bj0-Nk3t.js";
20
- import { t as ShadowClawChannels } from "../shadow-claw-channels-C_jI4KhP.js";
14
+ import { t as ShadowClawTasks } from "../shadow-claw-tasks-i_evIufy.js";
15
+ import { n as ShadowClawTerminal } from "../shadow-claw-terminal-CwScROlu.js";
16
+ import { t as ShadowClawPages } from "../shadow-claw-pages-BgPyIEZO.js";
17
+ import { t as ShadowClawSettings } from "../shadow-claw-settings-CN89xRVU.js";
18
+ import { t as ShadowClawPeerJs } from "../shadow-claw-peerjs-xkBXILed.js";
19
+ import { t as ShadowClawChannelConfig } from "../shadow-claw-channel-config-DmfwJc6G.js";
20
+ import { t as ShadowClawChannels } from "../shadow-claw-channels-1N6Jl-By.js";
21
21
  import { t as ShadowClawProviderModelPicker } from "../shadow-claw-provider-model-picker-CsA-507a.js";
22
22
  import { t as ShadowClawProviderModuleSettings } from "../shadow-claw-provider-module-settings-3sCTnCSp.js";
23
- import { t as ShadowClawConversations } from "../shadow-claw-conversations-Ct1kAYdB.js";
23
+ import { t as ShadowClawConversations } from "../shadow-claw-conversations-BwXep3iu.js";
24
24
  import { t as ShadowClawToast } from "../shadow-claw-toast-C8oAkrMC.js";
25
- import { t as ShadowClawTools } from "../shadow-claw-tools-DxXIm0ku.js";
25
+ import { t as ShadowClawTools } from "../shadow-claw-tools-DD3fyXP4.js";
26
26
  import { t as ShadowClawActions } from "../shadow-claw-actions-G99P9oxr.js";
27
27
  import { t as ShadowClawCard } from "../shadow-claw-card-D9azfSMu.js";
28
- import { t as ShadowClawAccounts } from "../shadow-claw-accounts-CdruwN8A.js";
29
- import { t as ShadowClawControlPlane } from "../shadow-claw-control-plane-x8Ldid_h.js";
30
- import { t as ShadowClawGit } from "../shadow-claw-git-tcSpT-P0.js";
31
- import { t as ShadowClawIntegrations } from "../shadow-claw-integrations-NbcCx_ZI.js";
32
- import { t as ShadowClawLlm } from "../shadow-claw-llm-BazJdD5f.js";
33
- import { t as ShadowClawMcpRemote } from "../shadow-claw-mcp-remote-CYmhpg7a.js";
34
- import { t as ShadowClawNetworking } from "../shadow-claw-networking-DImPxe0H.js";
28
+ import { t as ShadowClawAccounts } from "../shadow-claw-accounts-03oJ__XC.js";
29
+ import { t as ShadowClawControlPlane } from "../shadow-claw-control-plane-UG0o7pCz.js";
30
+ import { t as ShadowClawGit } from "../shadow-claw-git-Bg1SWgsF.js";
31
+ import { t as ShadowClawIntegrations } from "../shadow-claw-integrations-Ds-CLPhj.js";
32
+ import { t as ShadowClawLlm } from "../shadow-claw-llm-CazBrVpM.js";
33
+ import { t as ShadowClawMcpRemote } from "../shadow-claw-mcp-remote-CT5Q-54E.js";
34
+ import { t as ShadowClawNetworking } from "../shadow-claw-networking-Df85tCbO.js";
35
35
  import { t as ShadowClawNotifications } from "../shadow-claw-notifications-v62FryTc.js";
36
- import { t as ShadowClawStorage } from "../shadow-claw-storage-CFOjGf1d.js";
37
- import { t as ShadowClawTaskServer } from "../shadow-claw-task-server-BiKa2GOm.js";
38
- import { t as ShadowClawWebvm } from "../shadow-claw-webvm-Dc8oo7ao.js";
36
+ import { t as ShadowClawStorage } from "../shadow-claw-storage-VnhcObCe.js";
37
+ import { t as ShadowClawTaskServer } from "../shadow-claw-task-server-jgEC2hHB.js";
38
+ import { t as ShadowClawWebvm } from "../shadow-claw-webvm-DbJq4I3-.js";
39
39
 
40
40
  export { ShadowClaw, ShadowClawA2UI, ShadowClawA2UIInterceptor, ShadowClawAccounts, ShadowClawActions, ShadowClawCard, ShadowClawChannelConfig, ShadowClawChannels, ShadowClawChat, ShadowClawControlPlane, ShadowClawConversations, ShadowClawDialog, ShadowClawElement, ShadowClawEmptyState, ShadowClawFileViewer, ShadowClawFiles, ShadowClawGit, ShadowClawIntegrations, ShadowClawLlm, ShadowClawMcpRemote, ShadowClawNetworking, ShadowClawNotifications, ShadowClawPageHeader, ShadowClawPageHeaderActionButton, ShadowClawPages, ShadowClawPdfViewer, ShadowClawPeerJs, ShadowClawProviderModelPicker, ShadowClawProviderModuleSettings, ShadowClawSettings, ShadowClawStorage, ShadowClawTaskServer, ShadowClawTasks, ShadowClawTerminal, ShadowClawToast, ShadowClawTools, ShadowClawWebvm, showError, showInfo, showSuccess, showToast, showWarning, toastStore };
@@ -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 { 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 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 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 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 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,3 +1,3 @@
1
- import { t as ShadowClawA2UI } from "../shadow-claw-a2ui-7rJqG4Ke.js";
1
+ import { t as ShadowClawA2UI } from "../shadow-claw-a2ui-CpZUTzlh.js";
2
2
 
3
3
  export { ShadowClawA2UI };