shadow-claw 1.40.0 → 1.41.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 (373) hide show
  1. package/.well-known/mcp/server-card.json +2 -2
  2. package/.well-known/mcp/servers.json +1 -1
  3. package/.well-known/mcp.json +2 -2
  4. package/README.md +1 -0
  5. package/dist/cli/build/build.js +1 -1
  6. package/dist/cli/{chunk-Bfz2NYgD.js → chunk-0IeC97mU.js} +7 -7
  7. package/dist/cli/chunk-3oLxlxPn.js +1 -0
  8. package/dist/cli/{chunk-BXg4-9Rq2.js → chunk-8CrZyP1b2.js} +1 -1
  9. package/dist/cli/{chunk-BP5Hg6CM.js → chunk-B--ueArB.js} +1 -1
  10. package/dist/cli/chunk-BIh7rXlJ2.js +1 -0
  11. package/dist/cli/{chunk-Drr0VSGA2.js → chunk-BKnTOLLS2.js} +1 -1
  12. package/dist/cli/{chunk-C5PuRV08.js → chunk-BLMC1Bxv.js} +1 -1
  13. package/dist/cli/{chunk-B2tNSlFy2.js → chunk-BOigzz2U2.js} +1 -1
  14. package/dist/cli/{chunk-DOf3DZdR.js → chunk-BOzn335y.js} +1 -1
  15. package/dist/cli/chunk-BjOeVLb42.js +1 -0
  16. package/dist/cli/{chunk-DqTx0rRp2.js → chunk-Bjqh5_SU2.js} +1 -1
  17. package/dist/cli/chunk-BqWBd_jF2.js +1 -0
  18. package/dist/cli/{chunk-Bc9nRNyN.js → chunk-BvVUnHTq.js} +12 -9
  19. package/dist/cli/{chunk-DIbSoQmd2.js → chunk-C6FFByBU2.js} +2 -2
  20. package/dist/cli/{chunk-Drq18VZe.js → chunk-C9-aL3rF.js} +1 -1
  21. package/dist/cli/{chunk-BUhqHeEA2.js → chunk-C9czddEh2.js} +2 -2
  22. package/dist/cli/chunk-CCx8WOwz2.js +1 -0
  23. package/dist/cli/{chunk-BkMSjVJb.js → chunk-CK6ejMig.js} +1 -1
  24. package/dist/cli/chunk-CUUERioR2.js +1 -0
  25. package/dist/cli/chunk-CXAobnJd.js +1 -0
  26. package/dist/cli/chunk-CY1X0pOF2.js +1 -0
  27. package/dist/cli/chunk-CZvvgLVv.js +1 -0
  28. package/dist/cli/chunk-CbcwbfJB.js +1 -0
  29. package/dist/cli/{chunk-quilB3TV2.js → chunk-Ci9OJGcd2.js} +1 -1
  30. package/dist/cli/chunk-Cj9wl0qx.js +1 -0
  31. package/dist/cli/{chunk-3gRhOmGo2.js → chunk-CjJsVrKI2.js} +1 -1
  32. package/dist/cli/{chunk-CmEfzm-_.js → chunk-ClPZ4Rea.js} +1 -1
  33. package/dist/cli/{chunk-WMPAfIvV2.js → chunk-DHJCGRuG2.js} +1 -1
  34. package/dist/cli/{chunk-C7Y2xIk4.js → chunk-DKVkYTV9.js} +1 -1
  35. package/dist/cli/chunk-DR2XtWRo.js +1 -0
  36. package/dist/cli/{chunk-DID5VvOG.js → chunk-DTES-dE6.js} +3 -3
  37. package/dist/cli/{chunk-BiVJVh_S.js → chunk-DUlIqkaX.js} +7 -7
  38. package/dist/cli/{chunk-CkpueGaZ2.js → chunk-DjWle8FF2.js} +1 -1
  39. package/dist/cli/{chunk-CSvHmNOk.js → chunk-DmRXVLfy.js} +1 -1
  40. package/dist/cli/{chunk-BT1xXZn72.js → chunk-HlSiTC-u2.js} +1 -1
  41. package/dist/cli/{chunk-da0bsiOn.js → chunk-P4JSeFBI.js} +1 -1
  42. package/dist/cli/chunk-UcNbHaRQ.js +1 -0
  43. package/dist/cli/{chunk-BXFHFbEd.js → chunk-UweLmfQS.js} +1 -1
  44. package/dist/cli/chunk-bQQkVCw-.js +94 -0
  45. package/dist/cli/{chunk-CGiXWHTi2.js → chunk-gwpxl-0W2.js} +1 -1
  46. package/dist/cli/{chunk-NH8koEis2.js → chunk-nmDhxXH_2.js} +1 -1
  47. package/dist/cli/chunk-p0n_c-I2.js +1 -0
  48. package/dist/cli/{chunk-D7xP72La.js → chunk-q7r4FosZ.js} +1 -1
  49. package/dist/cli/cli.js +3 -3
  50. package/dist/cli/prerender/dsd-shell/prerender-dsd-shell.js +1 -1
  51. package/dist/electron/main.cjs +1 -1
  52. package/dist/headless-agent.js +1 -1
  53. package/dist/lib/{app-routes-BAEMLu9g.js → app-routes-CKkiX12g.js} +7 -2
  54. package/dist/lib/app-routes-CKkiX12g.js.map +1 -0
  55. package/dist/lib/components/index.js +26 -26
  56. package/dist/lib/components/settings/shadow-claw-accounts.js +1 -1
  57. package/dist/lib/components/settings/shadow-claw-channel-config.js +1 -1
  58. package/dist/lib/components/settings/shadow-claw-control-plane.js +1 -1
  59. package/dist/lib/components/settings/shadow-claw-git.js +1 -1
  60. package/dist/lib/components/settings/shadow-claw-integrations.js +1 -1
  61. package/dist/lib/components/settings/shadow-claw-llm.js +1 -1
  62. package/dist/lib/components/settings/shadow-claw-mcp-remote.js +1 -1
  63. package/dist/lib/components/settings/shadow-claw-networking.js +1 -1
  64. package/dist/lib/components/settings/shadow-claw-notifications.js +1 -1
  65. package/dist/lib/components/settings/shadow-claw-peerjs.js +1 -1
  66. package/dist/lib/components/settings/shadow-claw-storage.js +1 -1
  67. package/dist/lib/components/settings/shadow-claw-task-server.js +1 -1
  68. package/dist/lib/components/settings/shadow-claw-webvm.js +1 -1
  69. package/dist/lib/components/shadow-claw/utils/syncSlottedSidebarActiveLinks.d.ts +10 -0
  70. package/dist/lib/components/shadow-claw-a2ui.js +1 -1
  71. package/dist/lib/components/shadow-claw-accounts.js +1 -1
  72. package/dist/lib/components/shadow-claw-channel-config.js +1 -1
  73. package/dist/lib/components/shadow-claw-channels.js +1 -1
  74. package/dist/lib/components/shadow-claw-chat.js +1 -1
  75. package/dist/lib/components/shadow-claw-control-plane.js +1 -1
  76. package/dist/lib/components/shadow-claw-conversations.js +1 -1
  77. package/dist/lib/components/shadow-claw-file-viewer/shadow-claw-file-viewer.d.ts +1 -1
  78. package/dist/lib/components/shadow-claw-file-viewer.js +1 -1
  79. package/dist/lib/components/shadow-claw-files.js +1 -1
  80. package/dist/lib/components/shadow-claw-git.js +1 -1
  81. package/dist/lib/components/shadow-claw-integrations.js +1 -1
  82. package/dist/lib/components/shadow-claw-llm.js +1 -1
  83. package/dist/lib/components/shadow-claw-mcp-remote.js +1 -1
  84. package/dist/lib/components/shadow-claw-networking.js +1 -1
  85. package/dist/lib/components/shadow-claw-notifications.js +1 -1
  86. package/dist/lib/components/shadow-claw-page-header.js +1 -1
  87. package/dist/lib/components/shadow-claw-pages.js +1 -1
  88. package/dist/lib/components/shadow-claw-peerjs.js +1 -1
  89. package/dist/lib/components/shadow-claw-settings.js +1 -1
  90. package/dist/lib/components/shadow-claw-storage.js +1 -1
  91. package/dist/lib/components/shadow-claw-task-server.js +1 -1
  92. package/dist/lib/components/shadow-claw-tasks.js +1 -1
  93. package/dist/lib/components/shadow-claw-terminal.js +1 -1
  94. package/dist/lib/components/shadow-claw-tools.js +1 -1
  95. package/dist/lib/components/shadow-claw-webvm.js +1 -1
  96. package/dist/lib/components/shadow-claw.js +1 -1
  97. package/dist/lib/{config-CPHDmyTx.js → config-DZkF9LiO.js} +2 -2
  98. package/dist/lib/{config-CPHDmyTx.js.map → config-DZkF9LiO.js.map} +1 -1
  99. package/dist/lib/{configurePeerJs-BsJoycQd.js → configurePeerJs-B3IE9BY2.js} +3 -3
  100. package/dist/lib/{configurePeerJs-BsJoycQd.js.map → configurePeerJs-B3IE9BY2.js.map} +1 -1
  101. package/dist/lib/{connections-BdIru7bF.js → connections-CalJGWvZ.js} +2 -2
  102. package/dist/lib/{connections-BdIru7bF.js.map → connections-CalJGWvZ.js.map} +1 -1
  103. package/dist/lib/core/orchestrator/orchestrator-state.d.ts +2 -1
  104. package/dist/lib/core/orchestrator/orchestrator.d.ts +2 -1
  105. package/dist/lib/core/orchestrator/utils/operations/task.d.ts +1 -0
  106. package/dist/lib/{downloadGroupFile-Dn0KsMlV.js → downloadGroupFile-DDE1fIhJ.js} +2 -2
  107. package/dist/lib/{downloadGroupFile-Dn0KsMlV.js.map → downloadGroupFile-DDE1fIhJ.js.map} +1 -1
  108. package/dist/lib/{file-viewer-BYrXXu-X.js → file-viewer-Bll2EoGc.js} +5 -5
  109. package/dist/lib/{file-viewer-BYrXXu-X.js.map → file-viewer-Bll2EoGc.js.map} +1 -1
  110. package/dist/lib/{getGroupDir-DF-RZO8X.js → getGroupDir-MHv7Lvmp.js} +4 -4
  111. package/dist/lib/{getGroupDir-DF-RZO8X.js.map → getGroupDir-MHv7Lvmp.js.map} +1 -1
  112. package/dist/lib/{git-s_0cgKm1.js → git-Bv_M3dgw.js} +3 -3
  113. package/dist/lib/{git-s_0cgKm1.js.map → git-Bv_M3dgw.js.map} +1 -1
  114. package/dist/lib/{iframe-sanitizer-DFdda1jJ.js → iframe-sanitizer-C7ZGDjEI.js} +2 -2
  115. package/dist/lib/{iframe-sanitizer-DFdda1jJ.js.map → iframe-sanitizer-C7ZGDjEI.js.map} +1 -1
  116. package/dist/lib/{iframe-storage-proxy-qrhZmQyO.js → iframe-storage-proxy-CR8ZYHPd.js} +2 -2
  117. package/dist/lib/{iframe-storage-proxy-qrhZmQyO.js.map → iframe-storage-proxy-CR8ZYHPd.js.map} +1 -1
  118. package/dist/lib/index.js +27 -27
  119. package/dist/lib/{initChatSplitResize-DuNlwCuI.js → initChatSplitResize-DiKTI-wk.js} +2 -2
  120. package/dist/lib/{initChatSplitResize-DuNlwCuI.js.map → initChatSplitResize-DiKTI-wk.js.map} +1 -1
  121. package/dist/lib/{initControlPlane-D4UZ4EhV.js → initControlPlane-CzjtQ4aM.js} +15 -15
  122. package/dist/lib/{initControlPlane-D4UZ4EhV.js.map → initControlPlane-CzjtQ4aM.js.map} +1 -1
  123. package/dist/lib/{markdown-CRRwbN9h.js → markdown-k8wA9LKy.js} +4 -4
  124. package/dist/lib/{markdown-CRRwbN9h.js.map → markdown-k8wA9LKy.js.map} +1 -1
  125. package/dist/lib/{mcp-reconnect-COdZ-cea.js → mcp-reconnect-CGIdfZnS.js} +2 -2
  126. package/dist/lib/{mcp-reconnect-COdZ-cea.js.map → mcp-reconnect-CGIdfZnS.js.map} +1 -1
  127. package/dist/lib/{memoryStorage-BsMe2FOQ.js → memoryStorage-DL-Bo3dh.js} +2 -2
  128. package/dist/lib/{memoryStorage-BsMe2FOQ.js.map → memoryStorage-DL-Bo3dh.js.map} +1 -1
  129. package/dist/lib/{orchestrator-D9f5fDCb.js → orchestrator-DKHCoikY.js} +11 -11
  130. package/dist/lib/{orchestrator-D9f5fDCb.js.map → orchestrator-DKHCoikY.js.map} +1 -1
  131. package/dist/lib/{orchestrator-Bq9ft3uG.js → orchestrator-Dn1ZOz9B.js} +20 -24
  132. package/dist/lib/orchestrator-Dn1ZOz9B.js.map +1 -0
  133. package/dist/lib/{peerjs-6u8KtenE.js → peerjs-BK41iBvP.js} +7 -7
  134. package/dist/lib/{peerjs-6u8KtenE.js.map → peerjs-BK41iBvP.js.map} +1 -1
  135. package/dist/lib/{push-client-DCnB2-OU.js → push-client-DKgVFD2Z.js} +3 -3
  136. package/dist/lib/{push-client-DCnB2-OU.js.map → push-client-DKgVFD2Z.js.map} +1 -1
  137. package/dist/lib/{readGroupFileBytes-nKNJ6sbl.js → readGroupFileBytes-CgU_UfGv.js} +2 -2
  138. package/dist/lib/{readGroupFileBytes-nKNJ6sbl.js.map → readGroupFileBytes-CgU_UfGv.js.map} +1 -1
  139. package/dist/lib/{shadow-claw-MumteAJy.js → shadow-claw-CtCj5Rn_.js} +121 -16
  140. package/dist/lib/shadow-claw-CtCj5Rn_.js.map +1 -0
  141. package/dist/lib/{shadow-claw-a2ui-Dipe8nY2.js → shadow-claw-a2ui-CvK5w940.js} +2 -2
  142. package/dist/lib/{shadow-claw-a2ui-Dipe8nY2.js.map → shadow-claw-a2ui-CvK5w940.js.map} +1 -1
  143. package/dist/lib/{shadow-claw-accounts-BgCkz3Zv.js → shadow-claw-accounts-Br3XdHro.js} +3 -3
  144. package/dist/lib/{shadow-claw-accounts-BgCkz3Zv.js.map → shadow-claw-accounts-Br3XdHro.js.map} +1 -1
  145. package/dist/lib/{shadow-claw-channel-config-CIm_Bxd2.js → shadow-claw-channel-config-Da2dN19M.js} +3 -3
  146. package/dist/lib/{shadow-claw-channel-config-CIm_Bxd2.js.map → shadow-claw-channel-config-Da2dN19M.js.map} +1 -1
  147. package/dist/lib/{shadow-claw-channels-CaceK52s.js → shadow-claw-channels-BofYHgz8.js} +3 -3
  148. package/dist/lib/{shadow-claw-channels-CaceK52s.js.map → shadow-claw-channels-BofYHgz8.js.map} +1 -1
  149. package/dist/lib/{shadow-claw-chat-BD18-mAR.js → shadow-claw-chat-Dw32DPV2.js} +12 -12
  150. package/dist/lib/{shadow-claw-chat-BD18-mAR.js.map → shadow-claw-chat-Dw32DPV2.js.map} +1 -1
  151. package/dist/lib/{shadow-claw-control-plane-U6LsfRPm.js → shadow-claw-control-plane-CwFotFDh.js} +7 -7
  152. package/dist/lib/{shadow-claw-control-plane-U6LsfRPm.js.map → shadow-claw-control-plane-CwFotFDh.js.map} +1 -1
  153. package/dist/lib/{shadow-claw-conversations-CDsza_oB.js → shadow-claw-conversations-0UXge23k.js} +5 -5
  154. package/dist/lib/{shadow-claw-conversations-CDsza_oB.js.map → shadow-claw-conversations-0UXge23k.js.map} +1 -1
  155. package/dist/lib/{shadow-claw-file-viewer-CMOnFmcP.js → shadow-claw-file-viewer-CAsn9NxH.js} +30 -30
  156. package/dist/lib/{shadow-claw-file-viewer-CMOnFmcP.js.map → shadow-claw-file-viewer-CAsn9NxH.js.map} +1 -1
  157. package/dist/lib/{shadow-claw-files-BI0P3m8a.js → shadow-claw-files-xGGhsHNH.js} +9 -9
  158. package/dist/lib/{shadow-claw-files-BI0P3m8a.js.map → shadow-claw-files-xGGhsHNH.js.map} +1 -1
  159. package/dist/lib/{shadow-claw-git-xRApLEMN.js → shadow-claw-git-B606hcMU.js} +6 -6
  160. package/dist/lib/{shadow-claw-git-xRApLEMN.js.map → shadow-claw-git-B606hcMU.js.map} +1 -1
  161. package/dist/lib/{shadow-claw-integrations-B2e1Nfg1.js → shadow-claw-integrations-Bwq5cba1.js} +4 -4
  162. package/dist/lib/{shadow-claw-integrations-B2e1Nfg1.js.map → shadow-claw-integrations-Bwq5cba1.js.map} +1 -1
  163. package/dist/lib/{shadow-claw-llm-Bc2mWuGb.js → shadow-claw-llm-BgpcMBIy.js} +6 -6
  164. package/dist/lib/{shadow-claw-llm-Bc2mWuGb.js.map → shadow-claw-llm-BgpcMBIy.js.map} +1 -1
  165. package/dist/lib/{shadow-claw-mcp-remote-D_Bh3aeC.js → shadow-claw-mcp-remote-DvQCA-Bk.js} +4 -4
  166. package/dist/lib/{shadow-claw-mcp-remote-D_Bh3aeC.js.map → shadow-claw-mcp-remote-DvQCA-Bk.js.map} +1 -1
  167. package/dist/lib/{shadow-claw-networking-F5W3n5ci.js → shadow-claw-networking-Cxvf9c7E.js} +2 -2
  168. package/dist/lib/{shadow-claw-networking-F5W3n5ci.js.map → shadow-claw-networking-Cxvf9c7E.js.map} +1 -1
  169. package/dist/lib/{shadow-claw-notifications-lvMt9WJ1.js → shadow-claw-notifications-CGVcFYBy.js} +3 -3
  170. package/dist/lib/{shadow-claw-notifications-lvMt9WJ1.js.map → shadow-claw-notifications-CGVcFYBy.js.map} +1 -1
  171. package/dist/lib/{shadow-claw-page-header-6gq6EMqX.js → shadow-claw-page-header-DAYz3I_o.js} +2 -2
  172. package/dist/lib/{shadow-claw-page-header-6gq6EMqX.js.map → shadow-claw-page-header-DAYz3I_o.js.map} +1 -1
  173. package/dist/lib/{shadow-claw-pages-Bo8_z2S-.js → shadow-claw-pages-BLeEZb9k.js} +24 -12
  174. package/dist/lib/shadow-claw-pages-BLeEZb9k.js.map +1 -0
  175. package/dist/lib/{shadow-claw-peerjs-DRTLCVDQ.js → shadow-claw-peerjs-BcFnbK74.js} +3 -3
  176. package/dist/lib/{shadow-claw-peerjs-DRTLCVDQ.js.map → shadow-claw-peerjs-BcFnbK74.js.map} +1 -1
  177. package/dist/lib/{shadow-claw-settings-D00B4p4L.js → shadow-claw-settings-B7o0Z4hu.js} +9 -9
  178. package/dist/lib/{shadow-claw-settings-D00B4p4L.js.map → shadow-claw-settings-B7o0Z4hu.js.map} +1 -1
  179. package/dist/lib/{shadow-claw-storage-DgMe7-Zo.js → shadow-claw-storage-afMVqB7E.js} +5 -5
  180. package/dist/lib/{shadow-claw-storage-DgMe7-Zo.js.map → shadow-claw-storage-afMVqB7E.js.map} +1 -1
  181. package/dist/lib/{shadow-claw-task-server-D103YOuI.js → shadow-claw-task-server-B9-MQjl6.js} +2 -2
  182. package/dist/lib/{shadow-claw-task-server-D103YOuI.js.map → shadow-claw-task-server-B9-MQjl6.js.map} +1 -1
  183. package/dist/lib/{shadow-claw-tasks-6OhALkq1.js → shadow-claw-tasks-Dc4BC-t-.js} +8 -8
  184. package/dist/lib/{shadow-claw-tasks-6OhALkq1.js.map → shadow-claw-tasks-Dc4BC-t-.js.map} +1 -1
  185. package/dist/lib/{shadow-claw-terminal-BGtxA1qD.js → shadow-claw-terminal-BINcTdsk.js} +2 -2
  186. package/dist/lib/{shadow-claw-terminal-BGtxA1qD.js.map → shadow-claw-terminal-BINcTdsk.js.map} +1 -1
  187. package/dist/lib/{shadow-claw-tools-OeIwAnnd.js → shadow-claw-tools-BjFgXNLR.js} +7 -7
  188. package/dist/lib/{shadow-claw-tools-OeIwAnnd.js.map → shadow-claw-tools-BjFgXNLR.js.map} +1 -1
  189. package/dist/lib/{shadow-claw-webvm-gVFZ197u.js → shadow-claw-webvm-Xe3ByMDw.js} +3 -3
  190. package/dist/lib/{shadow-claw-webvm-gVFZ197u.js.map → shadow-claw-webvm-Xe3ByMDw.js.map} +1 -1
  191. package/dist/lib/subsystems/mcp/webmcp.d.ts +64 -0
  192. package/dist/lib/{syncWebMcpRegistration-Bbph0XZl.js → syncWebMcpRegistration-D7alChz0.js} +21 -6
  193. package/dist/lib/syncWebMcpRegistration-D7alChz0.js.map +1 -0
  194. package/dist/lib/{tools-D0OlSzMD.js → tools-Cmhpk3X8.js} +4 -4
  195. package/dist/lib/{tools-D0OlSzMD.js.map → tools-Cmhpk3X8.js.map} +1 -1
  196. package/dist/lib/utils/index.js +1 -1
  197. package/dist/lib/utils/namespacedStorage.js +1 -1
  198. package/dist/lib/utils/utils.js +1 -1
  199. package/dist/lib/{utils-DYdrO2KI.js → utils-CzgKe_XZ.js} +4 -4
  200. package/dist/lib/{utils-DYdrO2KI.js.map → utils-CzgKe_XZ.js.map} +1 -1
  201. package/dist/lib/{webmcp-D2bocsgh.js → webmcp-oEP9YpR2.js} +119 -3
  202. package/dist/lib/{webmcp-D2bocsgh.js.map → webmcp-oEP9YpR2.js.map} +1 -1
  203. package/dist/public/.well-known/mcp/server-card.json +2 -2
  204. package/dist/public/.well-known/mcp/servers.json +1 -1
  205. package/dist/public/.well-known/mcp.json +2 -2
  206. package/dist/public/AGENTS.md +2 -1
  207. package/dist/public/README.md +1 -0
  208. package/dist/public/agent.worker.js +1 -1
  209. package/dist/public/app-routes-C6-H2zPH.js +1 -0
  210. package/dist/public/components/shadow-claw/shadow-claw.css +1 -1
  211. package/dist/public/components/shadow-claw/shadow-claw.html +1 -1
  212. package/dist/public/components/shadow-claw-pages/shadow-claw-pages.css +1 -1
  213. package/dist/public/{config-D4lVqMs8.js → config-Dewnqegf.js} +1 -1
  214. package/dist/public/{configurePeerJs-DDOAVSaH.js → configurePeerJs-CaPU2sN5.js} +1 -1
  215. package/dist/public/{connections-CiukjGiH.js → connections-CwE7jE9l.js} +1 -1
  216. package/dist/public/{custom-element-security-piU2U-Ec.js → custom-element-security-DLgHMf5R.js} +1 -1
  217. package/dist/public/docs/decisions/native-web-components-and-signals.md +1 -1
  218. package/dist/public/docs/example/article/index.html +5 -5
  219. package/dist/public/docs/guides/publishing-to-github-pages.md +49 -6
  220. package/dist/public/docs/publishing/index.html +5 -5
  221. package/dist/public/docs/skill-creator/index.html +5 -5
  222. package/dist/public/docs/subsystems/pages.md +10 -3
  223. package/dist/public/docs/subsystems/webmcp.md +89 -1
  224. package/dist/public/{downloadGroupFile-BiZQYY-O.js → downloadGroupFile-ChWHuap_.js} +1 -1
  225. package/dist/public/e2e/README.md +2 -2
  226. package/dist/public/{e2e-bridge-CybB810Q.js → e2e-bridge-BkaldjV2.js} +1 -1
  227. package/dist/public/{file-viewer-DLUBvOVD.js → file-viewer-Df4qUJCn.js} +1 -1
  228. package/dist/public/{getGroupDir-CLz5c8cg.js → getGroupDir-CeSr4fzS.js} +1 -1
  229. package/dist/public/{git-Ba8AeviI.js → git-Bscc1tK-.js} +2 -2
  230. package/dist/public/{iframe-sanitizer-CKOO7cxp.js → iframe-sanitizer-BVdkQsor.js} +1 -1
  231. package/dist/public/{iframe-storage-proxy-BvRiccH0.js → iframe-storage-proxy-Cg8aFw7o.js} +1 -1
  232. package/dist/public/index.css +1 -1
  233. package/dist/public/index.html +5 -5
  234. package/dist/public/index.js +1 -1
  235. package/dist/public/{initChatSplitResize-osJXM2gu.js → initChatSplitResize-C3Rp1LeZ.js} +1 -1
  236. package/dist/public/{initControlPlane-CNggzsRw.js → initControlPlane-C1pnzG16.js} +1 -1
  237. package/dist/public/llms.txt +1 -1
  238. package/dist/public/main/index.html +5 -5
  239. package/dist/public/main/memory/index.html +5 -5
  240. package/dist/public/{markdown-CZA-Ye2Q.js → markdown-D3A902nT.js} +1 -1
  241. package/dist/public/{mcp-reconnect-BK1bYBdC.js → mcp-reconnect-BJWxQBm_.js} +1 -1
  242. package/dist/public/{memoryStorage-Bew1X8Uy.js → memoryStorage-ykv-Ri-y.js} +1 -1
  243. package/dist/public/{orchestrator-D6tel2Zp.js → orchestrator-BVnC4Vtt.js} +2 -2
  244. package/dist/public/{orchestrator-BLkS_jpm.js → orchestrator-CQcc7OFA.js} +2 -2
  245. package/dist/public/{peerjs-CYs1F7sq.js → peerjs-CYC2cI1Y.js} +1 -1
  246. package/dist/public/{push-client-_HUyJlFJ.js → push-client-BJrnOULM.js} +1 -1
  247. package/dist/public/service-worker/fetch-proxy.js +1 -1
  248. package/dist/public/service-worker.js +1 -1
  249. package/dist/public/{shadow-claw-DmrxnX3Q.js → shadow-claw-WwfOu-tu.js} +33 -3
  250. package/dist/public/{shadow-claw-accounts-BqGrm47Z.js → shadow-claw-accounts-BFZxrPsH.js} +1 -1
  251. package/dist/public/{shadow-claw-channels-Ci2UPaaA.js → shadow-claw-channels-C0w0c1EF.js} +1 -1
  252. package/dist/public/{shadow-claw-chat-BxR6cBYQ.js → shadow-claw-chat-DIJ0A-QN.js} +1 -1
  253. package/dist/public/{shadow-claw-control-plane-C1A-CZ9H.js → shadow-claw-control-plane-DZoxUd-1.js} +2 -2
  254. package/dist/public/{shadow-claw-conversations-DcwG05-H.js → shadow-claw-conversations-DMyG_5zj.js} +1 -1
  255. package/dist/public/{shadow-claw-file-viewer-a_uRA30F.js → shadow-claw-file-viewer-DYgZjZb9.js} +2 -2
  256. package/dist/public/{shadow-claw-files-B774Xz1d.js → shadow-claw-files-DIOUdKJr.js} +1 -1
  257. package/dist/public/{shadow-claw-git-CTIPP0vs.js → shadow-claw-git-if5S0QJr.js} +2 -2
  258. package/dist/public/{shadow-claw-integrations-CjtkA6l0.js → shadow-claw-integrations-BQt4hcWe.js} +1 -1
  259. package/dist/public/{shadow-claw-llm-DfmITHde.js → shadow-claw-llm-9uf1KFA0.js} +2 -2
  260. package/dist/public/{shadow-claw-mcp-remote-BPuV22So.js → shadow-claw-mcp-remote-COpNIzJd.js} +1 -1
  261. package/dist/public/{shadow-claw-networking-DEMMygy0.js → shadow-claw-networking-AOVRUn6B.js} +1 -1
  262. package/dist/public/{shadow-claw-notifications-B9Xhcj1P.js → shadow-claw-notifications-CKB-W1TA.js} +1 -1
  263. package/dist/public/{shadow-claw-page-header-CAXokjQy.js → shadow-claw-page-header-D4LmUigA.js} +1 -1
  264. package/dist/public/{shadow-claw-pages-BRQw8bTm.js → shadow-claw-pages-BpHRY4vH.js} +12 -3
  265. package/dist/public/{shadow-claw-settings-BGrDNyqh.js → shadow-claw-settings-CE-aUo_J.js} +3 -3
  266. package/dist/public/{shadow-claw-storage-DK3pf11w.js → shadow-claw-storage-CFKC-Y3V.js} +1 -1
  267. package/dist/public/{shadow-claw-task-server-CMp5Vjza.js → shadow-claw-task-server-B_ZjqK4B.js} +1 -1
  268. package/dist/public/{shadow-claw-tasks-BO8aXM2B.js → shadow-claw-tasks-CGsEv48K.js} +1 -1
  269. package/dist/public/{shadow-claw-terminal-BSeTuyDa.js → shadow-claw-terminal-DcaS7cPH.js} +1 -1
  270. package/dist/public/{shadow-claw-tools-Bj6DLZ-2.js → shadow-claw-tools-Cnu9hKy0.js} +1 -1
  271. package/dist/public/{shadow-claw-webvm-M7d5RH8H.js → shadow-claw-webvm-BB8SFvJ8.js} +1 -1
  272. package/dist/public/syncWebMcpRegistration-D2Zx4oA1.js +1 -0
  273. package/dist/public/theme-init.js +1 -1
  274. package/dist/public/{tools-nysPKnGT.js → tools-sOLCHTj8.js} +1 -1
  275. package/dist/public/{webmcp-Bo3KTgRb.js → webmcp-YFt6vM1_.js} +1 -1
  276. package/dist/server.js +189 -189
  277. package/package.json +1 -1
  278. package/src/cli/cli.ts +2 -2
  279. package/src/cli/prerender/dsd-shell/prerender-dsd-shell.test.ts +4 -1
  280. package/src/cli/prerender/dsd-shell/prerender-dsd-shell.ts +7 -1
  281. package/src/cli/prerender/utils/insert-before-closing-head.test.ts +12 -0
  282. package/src/cli/prerender/utils/insert-before-closing-head.ts +4 -6
  283. package/src/cli/site-config/apply.test.ts +90 -0
  284. package/src/cli/site-config/apply.ts +181 -13
  285. package/src/components/shadow-claw/shadow-claw.css +26 -0
  286. package/src/components/shadow-claw/shadow-claw.html +4 -0
  287. package/src/components/shadow-claw/utils/applyRoute.ts +3 -0
  288. package/src/components/shadow-claw/utils/bindEventListeners.test.ts +6 -0
  289. package/src/components/shadow-claw/utils/bindEventListeners.ts +30 -1
  290. package/src/components/shadow-claw/utils/getRoute.test.ts +52 -0
  291. package/src/components/shadow-claw/utils/getRoute.ts +18 -0
  292. package/src/components/shadow-claw/utils/navigateToRoute.test.ts +21 -0
  293. package/src/components/shadow-claw/utils/navigateToRoute.ts +10 -0
  294. package/src/components/shadow-claw/utils/sidebarVisibility.ts +12 -4
  295. package/src/components/shadow-claw/utils/syncSlottedSidebarActiveLinks.test.ts +93 -0
  296. package/src/components/shadow-claw/utils/syncSlottedSidebarActiveLinks.ts +100 -0
  297. package/src/components/shadow-claw-file-viewer/shadow-claw-file-viewer.ts +31 -31
  298. package/src/components/shadow-claw-pages/shadow-claw-pages.css +10 -1
  299. package/src/components/shadow-claw-pages/utils/removePreviewIframe.ts +3 -0
  300. package/src/core/effect.test.ts +19 -0
  301. package/src/core/orchestrator/orchestrator-state.ts +2 -1
  302. package/src/core/orchestrator/orchestrator.test.ts +686 -5
  303. package/src/core/orchestrator/orchestrator.ts +3 -10
  304. package/src/core/orchestrator/utils/compactContext.test.ts +423 -121
  305. package/src/core/orchestrator/utils/configurePeerJs.test.ts +27 -0
  306. package/src/core/orchestrator/utils/deliverResponse.test.ts +127 -0
  307. package/src/core/orchestrator/utils/dispatchSubagentInvoke.test.ts +23 -0
  308. package/src/core/orchestrator/utils/enqueue.test.ts +520 -86
  309. package/src/core/orchestrator/utils/handleWorkerMessage.test.ts +664 -144
  310. package/src/core/orchestrator/utils/initTasks.node.test.ts +147 -0
  311. package/src/core/orchestrator/utils/initTasks.test.ts +926 -191
  312. package/src/core/orchestrator/utils/initTasks.ts +5 -4
  313. package/src/core/orchestrator/utils/invokeAgent.test.ts +563 -110
  314. package/src/core/orchestrator/utils/invokeAgent.ts +8 -10
  315. package/src/core/orchestrator/utils/loadChannelConfigurations.test.ts +50 -0
  316. package/src/core/orchestrator/utils/operations/channel.test.ts +377 -170
  317. package/src/core/orchestrator/utils/operations/provider.test.ts +663 -85
  318. package/src/core/orchestrator/utils/operations/room.test.ts +74 -11
  319. package/src/core/orchestrator/utils/operations/task.test.ts +452 -56
  320. package/src/core/orchestrator/utils/operations/task.ts +1 -1
  321. package/src/core/orchestrator/utils/operations/vm.test.ts +66 -7
  322. package/src/core/orchestrator/utils/parseDirectToolCommand.test.ts +6 -0
  323. package/src/core/orchestrator/utils/settings.test.ts +248 -81
  324. package/src/core/orchestrator/utils/setupPushTaskListener.test.ts +58 -0
  325. package/src/core/orchestrator/utils/syncWebMcpRegistration.test.ts +392 -64
  326. package/src/core/orchestrator/utils/syncWebMcpRegistration.ts +32 -3
  327. package/src/server/middleware/static-files.test.ts +36 -0
  328. package/src/server/middleware/static-files.ts +14 -6
  329. package/src/server/routes/mcp.ts +2 -2
  330. package/src/storage/staticRouting.test.ts +36 -0
  331. package/src/storage/staticRouting.ts +31 -3
  332. package/src/stores/file-viewer.test.ts +11 -0
  333. package/src/stores/theme.test.ts +41 -2
  334. package/src/stores/toast.test.ts +25 -0
  335. package/src/subsystems/mcp/webmcp.test.ts +255 -0
  336. package/src/subsystems/mcp/webmcp.ts +253 -0
  337. package/src/worker/tools/bash/native-bash-executor.test.ts +31 -1
  338. package/src/worker/tools/git/utils/extractConflictPaths.test.ts +24 -0
  339. package/src/worker/tools/git/utils/parseConflictRegions.test.ts +46 -0
  340. package/src/worker/tools/git/utils/resolveCorsProxy.test.ts +26 -5
  341. package/src/worker/tools/git/utils/truncateSnippet.test.ts +16 -0
  342. package/src/worker/tools/node-transformers-executor.test.ts +105 -6
  343. package/src/worker/tools/remote-mcp/remote-mcp.test.ts +172 -47
  344. package/src/worker/tools/remote-mcp/utils/formatListToolsOutput.test.ts +19 -0
  345. package/src/worker/tools/remote-mcp/utils/isMcpReauthError.test.ts +45 -0
  346. package/src/worker/tools/remote-mcp/utils/resolveMcpReauth.test.ts +48 -0
  347. package/src/worker/tools/rooms/list-room-members.test.ts +24 -10
  348. package/src/worker/tools/tasks/list-tasks.test.ts +39 -8
  349. package/src/worker/tools/tasks/update-task.test.ts +78 -14
  350. package/src/worker/tools/ui/javascript.test.ts +70 -17
  351. package/src/worker/tools/ui/list-tool-profiles.test.ts +31 -9
  352. package/dist/cli/chunk-00GAzVPl2.js +0 -1
  353. package/dist/cli/chunk-2hnFoNNC.js +0 -1
  354. package/dist/cli/chunk-BKQL4nzF2.js +0 -1
  355. package/dist/cli/chunk-BQ4K3fqj2.js +0 -1
  356. package/dist/cli/chunk-BVCGo6uf2.js +0 -1
  357. package/dist/cli/chunk-BcTH_-FL.js +0 -1
  358. package/dist/cli/chunk-BmD_sPRt.js +0 -1
  359. package/dist/cli/chunk-BsxNqqer.js +0 -1
  360. package/dist/cli/chunk-CCcF5T-c.js +0 -1
  361. package/dist/cli/chunk-CFhvwUeL.js +0 -91
  362. package/dist/cli/chunk-CwWtvULn.js +0 -1
  363. package/dist/cli/chunk-Drf-hXIR2.js +0 -1
  364. package/dist/cli/chunk-Dt5HNYVi.js +0 -1
  365. package/dist/cli/chunk-DwZQi9Ax.js +0 -1
  366. package/dist/cli/chunk-m9ZX7TyF2.js +0 -1
  367. package/dist/lib/app-routes-BAEMLu9g.js.map +0 -1
  368. package/dist/lib/orchestrator-Bq9ft3uG.js.map +0 -1
  369. package/dist/lib/shadow-claw-MumteAJy.js.map +0 -1
  370. package/dist/lib/shadow-claw-pages-Bo8_z2S-.js.map +0 -1
  371. package/dist/lib/syncWebMcpRegistration-Bbph0XZl.js.map +0 -1
  372. package/dist/public/app-routes-BMQ4HFaM.js +0 -1
  373. package/dist/public/syncWebMcpRegistration-4bT0YUyZ.js +0 -1
@@ -1,4 +1,4 @@
1
- import { n as applyBasePath } from "./app-routes-BAEMLu9g.js";
1
+ import { n as applyBasePath } from "./app-routes-CKkiX12g.js";
2
2
 
3
3
  //#region src/ui/iframe-theme.ts
4
4
  /**
@@ -342,4 +342,4 @@ async function iframeStorageClear(namespace) {
342
342
 
343
343
  //#endregion
344
344
  export { iframeStorageSet as a, getIframeThemeStyleHtml as c, iframeStorageGetAll as i, getIframeThemeStylesheetLink as l, iframeStorageDelete as n, IframeBroadcastProxy as o, iframeStorageGet as r, getIframeHtmlClass as s, iframeStorageClear as t };
345
- //# sourceMappingURL=iframe-storage-proxy-qrhZmQyO.js.map
345
+ //# sourceMappingURL=iframe-storage-proxy-CR8ZYHPd.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"iframe-storage-proxy-qrhZmQyO.js","names":[],"sources":["../../src/ui/iframe-theme.ts","../../src/components/shadow-claw-pages/utils/iframe-broadcast-proxy.ts","../../src/components/shadow-claw-pages/utils/iframe-storage-proxy.ts"],"sourcesContent":["import { applyBasePath } from \"../core/app-routes.js\";\n\n/**\n * Prefixes whose contents are flattened into the distribution root.\n */\nconst FLATTENED_STYLESHEET_PREFIXES = [\n \"pages/resources/\",\n \"pages/deps/\",\n \"resources/\",\n \"deps/\",\n \"pages/assets/\",\n \"pages/main/assets/\",\n];\n\n/**\n * Resolves a configured theme.stylesheet path to its actual distribution path.\n */\nexport function resolveThemeStylesheetHref(stylesheet: string): string {\n for (const prefix of FLATTENED_STYLESHEET_PREFIXES) {\n if (stylesheet.startsWith(prefix)) {\n return stylesheet.slice(prefix.length);\n }\n }\n return stylesheet;\n}\n\n/**\n * Generates an optional `<link rel=\"stylesheet\">` tag for the preview iframe\n * only when a theme stylesheet is explicitly configured in site configuration.\n * When not configured, returns an empty string to avoid 404 requests.\n */\nexport function getIframeThemeStylesheetLink(siteConfig?: unknown): string {\n let stylesheet: string | undefined;\n\n if (siteConfig && typeof siteConfig === \"object\") {\n const rawTheme = (siteConfig as { theme?: { stylesheet?: unknown } }).theme;\n if (\n typeof rawTheme?.stylesheet === \"string\" &&\n rawTheme.stylesheet.trim()\n ) {\n stylesheet = rawTheme.stylesheet.trim();\n }\n } else if (typeof document !== \"undefined\") {\n const configScript = document.getElementById(\"shadow-claw-site-config\");\n if (configScript?.textContent) {\n try {\n const config = JSON.parse(configScript.textContent);\n const rawTheme = config?.theme;\n if (\n typeof rawTheme?.stylesheet === \"string\" &&\n rawTheme.stylesheet.trim()\n ) {\n stylesheet = rawTheme.stylesheet.trim();\n }\n } catch {}\n }\n }\n\n if (!stylesheet) {\n return \"\";\n }\n\n const isExternal =\n stylesheet.startsWith(\"http://\") ||\n stylesheet.startsWith(\"https://\") ||\n stylesheet.startsWith(\"//\");\n\n if (isExternal) {\n return `<link rel=\"stylesheet\" href=\"${stylesheet}\">`;\n }\n\n const resolvedHref = resolveThemeStylesheetHref(stylesheet);\n const normalizedPath = resolvedHref.startsWith(\"/\")\n ? resolvedHref\n : `/${resolvedHref}`;\n\n return `<link rel=\"stylesheet\" href=\"${applyBasePath(normalizedPath)}\">`;\n}\n\n/**\n * Generates the CSS style block and html root class for sandboxed preview iframes\n * (file viewer and pages HTML preview) to synchronize theme CSS variables,\n * fonts, link styling, and dark/light mode color-scheme without FOUC.\n */\nexport function getIframeThemeStyleHtml(): string {\n const isDark =\n typeof document !== \"undefined\" &&\n document.documentElement.classList.contains(\"dark-mode\");\n const customProperties: string[] = [];\n\n if (typeof document !== \"undefined\") {\n const styles = getComputedStyle(document.documentElement);\n for (let i = 0; i < styles.length; i++) {\n const prop = styles[i];\n if (prop.startsWith(\"--\")) {\n customProperties.push(`${prop}: ${styles.getPropertyValue(prop)};`);\n }\n }\n }\n\n return [\n \"<style>\",\n \" :root {\",\n ` color-scheme: ${isDark ? \"dark\" : \"light\"};`,\n ` overflow: hidden;`,\n ` line-height: 1.5;`,\n ` ${customProperties.join(\"\\n \")}`,\n \" }\",\n \" * {\",\n \" scrollbar-width: thin;\",\n \" scrollbar-color: var(--shadow-claw-border-color) transparent;\",\n \" }\",\n \" ::-webkit-scrollbar {\",\n \" height: 0.5rem;\",\n \" width: 0.5rem;\",\n \" }\",\n \" ::-webkit-scrollbar-track {\",\n \" background: transparent;\",\n \" }\",\n \" ::-webkit-scrollbar-thumb {\",\n \" background: var(--shadow-claw-border-color);\",\n \" border-radius: 0.25rem;\",\n \" }\",\n \" ::-webkit-scrollbar-thumb:hover {\",\n \" background: var(--shadow-claw-text-tertiary);\",\n \" }\",\n \" body {\",\n \" color: var(--shadow-claw-text-primary);\",\n \" background-color: var(--shadow-claw-bg-primary);\",\n \" font-family: var(--shadow-claw-font-sans);\",\n \" margin: 0;\",\n \" }\",\n \" pre, code, kbd, samp {\",\n \" font-family: var(--shadow-claw-font-mono);\",\n \" }\",\n \" a {\",\n \" color: var(--shadow-claw-link);\",\n \" text-decoration: underline;\",\n \" text-underline-offset: 0.125rem;\",\n \" }\",\n \" a:hover {\",\n \" color: var(--shadow-claw-link-hover);\",\n \" }\",\n \" img {\",\n \" max-width: 100%;\",\n \" height: auto;\",\n \" }\",\n \" ul {\",\n \" line-height: 1.5;\",\n \" }\",\n \" article {\",\n \" padding: 1rem 1.5rem 1rem 1rem;\",\n \" }\",\n \" article > h1, article > h2 {\",\n \" margin-top: 0;\",\n \" }\",\n \"</style>\",\n ].join(\"\\n\");\n}\n\nexport function getIframeHtmlClass(): string {\n const isDark =\n typeof document !== \"undefined\" &&\n document.documentElement.classList.contains(\"dark-mode\");\n\n return isDark ? \"dark-mode\" : \"light-mode\";\n}\n","/**\n * iframe-broadcast-proxy.ts\n *\n * Parent-side BroadcastChannel proxy for sandboxed iframes.\n * When allow-same-origin is omitted from preview iframes, the iframe operates\n * under an opaque (null) origin. Browser BroadcastChannel instances are partitioned\n * by origin, preventing direct communication between parent/worker tools and the iframe.\n *\n * This proxy is completely AGNOSTIC and generic. It dynamically tracks BroadcastChannels\n * instantiated on the parent origin and extracts channel names declaratively from tool\n * definitions registered via site-config/toolsStore.\n */\n\nexport class IframeBroadcastProxy {\n private commandChannels: Map<string, BroadcastChannel> = new Map();\n private originalBroadcastChannel: typeof BroadcastChannel | null = null;\n\n constructor(private getTargetWindow: () => WindowProxy | null) {\n if (typeof BroadcastChannel !== \"undefined\") {\n this.patchParentBroadcastChannel();\n }\n }\n\n /**\n * Automatically intercept BroadcastChannel creation on parent window to\n * dynamically track and forward any channel used by tools or parent scripts.\n */\n private patchParentBroadcastChannel(): void {\n if ((globalThis as any)._shadowClawParentBcPatched) {\n return;\n }\n (globalThis as any)._shadowClawParentBcPatched = true;\n\n const self = this;\n const NativeBc = globalThis.BroadcastChannel;\n this.originalBroadcastChannel = NativeBc;\n\n const WrappedBc = function (this: BroadcastChannel, channelName: string) {\n const instance = new NativeBc(channelName);\n self.registerChannel(channelName);\n return instance;\n } as any;\n\n WrappedBc.prototype = NativeBc.prototype;\n globalThis.BroadcastChannel = WrappedBc;\n }\n\n /**\n * Declaratively scan tool execution code definitions for BroadcastChannel names\n * and register them automatically.\n */\n public registerChannelsFromTools(\n tools: Array<{ execution?: { code?: string }; code?: string }>,\n ): void {\n if (!Array.isArray(tools)) return;\n\n const bcRegex = /new\\s+BroadcastChannel\\s*\\(\\s*['\"`]([^'\"`]+)['\"`]\\s*\\)/g;\n for (const tool of tools) {\n const code = tool.execution?.code || tool.code || \"\";\n if (!code) continue;\n\n let match: RegExpExecArray | null;\n bcRegex.lastIndex = 0;\n while ((match = bcRegex.exec(code)) !== null) {\n if (match[1]) {\n this.registerChannel(match[1]);\n }\n }\n }\n }\n\n /**\n * Register a channel name to forward parent messages to the sandboxed iframe.\n */\n public registerChannel(channelName: string): void {\n if (\n typeof BroadcastChannel === \"undefined\" ||\n !channelName ||\n channelName.endsWith(\"-results\") ||\n this.commandChannels.has(channelName)\n ) {\n return;\n }\n this.listenOnCommandChannel(channelName);\n }\n\n private listenOnCommandChannel(channelName: string): void {\n try {\n const NativeBc =\n this.originalBroadcastChannel || globalThis.BroadcastChannel;\n const bc = new NativeBc(channelName);\n bc.onmessage = (evt) => {\n const target = this.getTargetWindow();\n if (target) {\n target.postMessage(\n {\n type: \"shadow-claw-broadcast-command\",\n channel: channelName,\n payload: evt.data,\n },\n \"*\",\n );\n }\n };\n this.commandChannels.set(channelName, bc);\n } catch (e) {\n console.warn(\n `[IframeBroadcastProxy] Failed to listen on channel ${channelName}:`,\n e,\n );\n }\n }\n\n /**\n * Handle incoming broadcast result/message from the sandboxed iframe and relay it\n * to the parent-origin BroadcastChannel.\n */\n public handleResultFromIframe(\n sourceWindow: WindowProxy,\n channelName: string,\n payload: unknown,\n ): boolean {\n const target = this.getTargetWindow();\n if (target && sourceWindow !== target) {\n return false;\n }\n\n if (channelName) {\n try {\n const NativeBc =\n this.originalBroadcastChannel || globalThis.BroadcastChannel;\n const resBc = new NativeBc(channelName);\n resBc.postMessage(payload);\n resBc.close();\n return true;\n } catch (e) {\n console.warn(\n `[IframeBroadcastProxy] Failed to relay result for channel ${channelName}:`,\n e,\n );\n }\n }\n return false;\n }\n\n public dispose(): void {\n for (const bc of this.commandChannels.values()) {\n try {\n bc.close();\n } catch (e) {}\n }\n this.commandChannels.clear();\n }\n}\n","/**\n * iframe-storage-proxy.ts\n *\n * Parent-side storage implementation for the iframe storage bridge.\n * Provides a namespaced IndexedDB key-value store that the parent frame\n * uses to proxy storage operations on behalf of sandboxed iframes that\n * lack direct storage access due to opaque-origin isolation.\n *\n * Each page gets its own namespace to prevent cross-page data leakage.\n */\n\nconst DB_NAME = \"shadow-claw-iframe-storage\";\nconst DB_VERSION = 1;\nconst STORE_NAME = \"kv\";\n\nlet dbPromise: Promise<IDBDatabase> | null = null;\n\nfunction openDb(): Promise<IDBDatabase> {\n if (dbPromise) {\n return dbPromise;\n }\n\n dbPromise = new Promise<IDBDatabase>((resolve, reject) => {\n const request = indexedDB.open(DB_NAME, DB_VERSION);\n\n request.onupgradeneeded = () => {\n const db = request.result;\n if (!db.objectStoreNames.contains(STORE_NAME)) {\n db.createObjectStore(STORE_NAME);\n }\n };\n\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => {\n dbPromise = null;\n reject(request.error);\n };\n });\n\n return dbPromise;\n}\n\n/**\n * Build a composite key from a namespace and item key.\n */\nfunction compositeKey(namespace: string, key: string): string {\n return `${namespace}\\0${key}`;\n}\n\n/**\n * Set a value in the namespaced store.\n */\nexport async function iframeStorageSet(\n namespace: string,\n key: string,\n value: unknown,\n): Promise<void> {\n const db = await openDb();\n return new Promise((resolve, reject) => {\n const tx = db.transaction(STORE_NAME, \"readwrite\");\n tx.objectStore(STORE_NAME).put(value, compositeKey(namespace, key));\n tx.oncomplete = () => resolve();\n tx.onerror = () => reject(tx.error);\n });\n}\n\n/**\n * Get a single value from the namespaced store.\n */\nexport async function iframeStorageGet(\n namespace: string,\n key: string,\n): Promise<unknown> {\n const db = await openDb();\n return new Promise((resolve, reject) => {\n const tx = db.transaction(STORE_NAME, \"readonly\");\n const req = tx.objectStore(STORE_NAME).get(compositeKey(namespace, key));\n req.onsuccess = () => resolve(req.result);\n req.onerror = () => reject(req.error);\n });\n}\n\n/**\n * Get all values for a namespace as a key-value object.\n */\nexport async function iframeStorageGetAll(\n namespace: string,\n): Promise<Record<string, unknown>> {\n const db = await openDb();\n return new Promise((resolve, reject) => {\n const tx = db.transaction(STORE_NAME, \"readonly\");\n const store = tx.objectStore(STORE_NAME);\n const result: Record<string, unknown> = {};\n const prefix = `${namespace}\\0`;\n const cursorReq = store.openCursor();\n\n cursorReq.onsuccess = () => {\n const cursor = cursorReq.result;\n if (!cursor) {\n resolve(result);\n return;\n }\n const cursorKey =\n typeof cursor.key === \"string\" ? cursor.key : String(cursor.key);\n if (cursorKey.startsWith(prefix)) {\n result[cursorKey.slice(prefix.length)] = cursor.value;\n }\n cursor.continue();\n };\n\n cursorReq.onerror = () => reject(cursorReq.error);\n });\n}\n\n/**\n * Delete a single value from the namespaced store.\n */\nexport async function iframeStorageDelete(\n namespace: string,\n key: string,\n): Promise<void> {\n const db = await openDb();\n return new Promise((resolve, reject) => {\n const tx = db.transaction(STORE_NAME, \"readwrite\");\n tx.objectStore(STORE_NAME).delete(compositeKey(namespace, key));\n tx.oncomplete = () => resolve();\n tx.onerror = () => reject(tx.error);\n });\n}\n\n/**\n * Clear all values for a namespace.\n */\nexport async function iframeStorageClear(namespace: string): Promise<void> {\n const db = await openDb();\n return new Promise((resolve, reject) => {\n const tx = db.transaction(STORE_NAME, \"readwrite\");\n const store = tx.objectStore(STORE_NAME);\n const prefix = `${namespace}\\0`;\n const cursorReq = store.openCursor();\n\n cursorReq.onsuccess = () => {\n const cursor = cursorReq.result;\n if (!cursor) {\n resolve();\n return;\n }\n const cursorKey =\n typeof cursor.key === \"string\" ? cursor.key : String(cursor.key);\n if (cursorKey.startsWith(prefix)) {\n cursor.delete();\n }\n cursor.continue();\n };\n\n cursorReq.onerror = () => reject(cursorReq.error);\n });\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"iframe-storage-proxy-CR8ZYHPd.js","names":[],"sources":["../../src/ui/iframe-theme.ts","../../src/components/shadow-claw-pages/utils/iframe-broadcast-proxy.ts","../../src/components/shadow-claw-pages/utils/iframe-storage-proxy.ts"],"sourcesContent":["import { applyBasePath } from \"../core/app-routes.js\";\n\n/**\n * Prefixes whose contents are flattened into the distribution root.\n */\nconst FLATTENED_STYLESHEET_PREFIXES = [\n \"pages/resources/\",\n \"pages/deps/\",\n \"resources/\",\n \"deps/\",\n \"pages/assets/\",\n \"pages/main/assets/\",\n];\n\n/**\n * Resolves a configured theme.stylesheet path to its actual distribution path.\n */\nexport function resolveThemeStylesheetHref(stylesheet: string): string {\n for (const prefix of FLATTENED_STYLESHEET_PREFIXES) {\n if (stylesheet.startsWith(prefix)) {\n return stylesheet.slice(prefix.length);\n }\n }\n return stylesheet;\n}\n\n/**\n * Generates an optional `<link rel=\"stylesheet\">` tag for the preview iframe\n * only when a theme stylesheet is explicitly configured in site configuration.\n * When not configured, returns an empty string to avoid 404 requests.\n */\nexport function getIframeThemeStylesheetLink(siteConfig?: unknown): string {\n let stylesheet: string | undefined;\n\n if (siteConfig && typeof siteConfig === \"object\") {\n const rawTheme = (siteConfig as { theme?: { stylesheet?: unknown } }).theme;\n if (\n typeof rawTheme?.stylesheet === \"string\" &&\n rawTheme.stylesheet.trim()\n ) {\n stylesheet = rawTheme.stylesheet.trim();\n }\n } else if (typeof document !== \"undefined\") {\n const configScript = document.getElementById(\"shadow-claw-site-config\");\n if (configScript?.textContent) {\n try {\n const config = JSON.parse(configScript.textContent);\n const rawTheme = config?.theme;\n if (\n typeof rawTheme?.stylesheet === \"string\" &&\n rawTheme.stylesheet.trim()\n ) {\n stylesheet = rawTheme.stylesheet.trim();\n }\n } catch {}\n }\n }\n\n if (!stylesheet) {\n return \"\";\n }\n\n const isExternal =\n stylesheet.startsWith(\"http://\") ||\n stylesheet.startsWith(\"https://\") ||\n stylesheet.startsWith(\"//\");\n\n if (isExternal) {\n return `<link rel=\"stylesheet\" href=\"${stylesheet}\">`;\n }\n\n const resolvedHref = resolveThemeStylesheetHref(stylesheet);\n const normalizedPath = resolvedHref.startsWith(\"/\")\n ? resolvedHref\n : `/${resolvedHref}`;\n\n return `<link rel=\"stylesheet\" href=\"${applyBasePath(normalizedPath)}\">`;\n}\n\n/**\n * Generates the CSS style block and html root class for sandboxed preview iframes\n * (file viewer and pages HTML preview) to synchronize theme CSS variables,\n * fonts, link styling, and dark/light mode color-scheme without FOUC.\n */\nexport function getIframeThemeStyleHtml(): string {\n const isDark =\n typeof document !== \"undefined\" &&\n document.documentElement.classList.contains(\"dark-mode\");\n const customProperties: string[] = [];\n\n if (typeof document !== \"undefined\") {\n const styles = getComputedStyle(document.documentElement);\n for (let i = 0; i < styles.length; i++) {\n const prop = styles[i];\n if (prop.startsWith(\"--\")) {\n customProperties.push(`${prop}: ${styles.getPropertyValue(prop)};`);\n }\n }\n }\n\n return [\n \"<style>\",\n \" :root {\",\n ` color-scheme: ${isDark ? \"dark\" : \"light\"};`,\n ` overflow: hidden;`,\n ` line-height: 1.5;`,\n ` ${customProperties.join(\"\\n \")}`,\n \" }\",\n \" * {\",\n \" scrollbar-width: thin;\",\n \" scrollbar-color: var(--shadow-claw-border-color) transparent;\",\n \" }\",\n \" ::-webkit-scrollbar {\",\n \" height: 0.5rem;\",\n \" width: 0.5rem;\",\n \" }\",\n \" ::-webkit-scrollbar-track {\",\n \" background: transparent;\",\n \" }\",\n \" ::-webkit-scrollbar-thumb {\",\n \" background: var(--shadow-claw-border-color);\",\n \" border-radius: 0.25rem;\",\n \" }\",\n \" ::-webkit-scrollbar-thumb:hover {\",\n \" background: var(--shadow-claw-text-tertiary);\",\n \" }\",\n \" body {\",\n \" color: var(--shadow-claw-text-primary);\",\n \" background-color: var(--shadow-claw-bg-primary);\",\n \" font-family: var(--shadow-claw-font-sans);\",\n \" margin: 0;\",\n \" }\",\n \" pre, code, kbd, samp {\",\n \" font-family: var(--shadow-claw-font-mono);\",\n \" }\",\n \" a {\",\n \" color: var(--shadow-claw-link);\",\n \" text-decoration: underline;\",\n \" text-underline-offset: 0.125rem;\",\n \" }\",\n \" a:hover {\",\n \" color: var(--shadow-claw-link-hover);\",\n \" }\",\n \" img {\",\n \" max-width: 100%;\",\n \" height: auto;\",\n \" }\",\n \" ul {\",\n \" line-height: 1.5;\",\n \" }\",\n \" article {\",\n \" padding: 1rem 1.5rem 1rem 1rem;\",\n \" }\",\n \" article > h1, article > h2 {\",\n \" margin-top: 0;\",\n \" }\",\n \"</style>\",\n ].join(\"\\n\");\n}\n\nexport function getIframeHtmlClass(): string {\n const isDark =\n typeof document !== \"undefined\" &&\n document.documentElement.classList.contains(\"dark-mode\");\n\n return isDark ? \"dark-mode\" : \"light-mode\";\n}\n","/**\n * iframe-broadcast-proxy.ts\n *\n * Parent-side BroadcastChannel proxy for sandboxed iframes.\n * When allow-same-origin is omitted from preview iframes, the iframe operates\n * under an opaque (null) origin. Browser BroadcastChannel instances are partitioned\n * by origin, preventing direct communication between parent/worker tools and the iframe.\n *\n * This proxy is completely AGNOSTIC and generic. It dynamically tracks BroadcastChannels\n * instantiated on the parent origin and extracts channel names declaratively from tool\n * definitions registered via site-config/toolsStore.\n */\n\nexport class IframeBroadcastProxy {\n private commandChannels: Map<string, BroadcastChannel> = new Map();\n private originalBroadcastChannel: typeof BroadcastChannel | null = null;\n\n constructor(private getTargetWindow: () => WindowProxy | null) {\n if (typeof BroadcastChannel !== \"undefined\") {\n this.patchParentBroadcastChannel();\n }\n }\n\n /**\n * Automatically intercept BroadcastChannel creation on parent window to\n * dynamically track and forward any channel used by tools or parent scripts.\n */\n private patchParentBroadcastChannel(): void {\n if ((globalThis as any)._shadowClawParentBcPatched) {\n return;\n }\n (globalThis as any)._shadowClawParentBcPatched = true;\n\n const self = this;\n const NativeBc = globalThis.BroadcastChannel;\n this.originalBroadcastChannel = NativeBc;\n\n const WrappedBc = function (this: BroadcastChannel, channelName: string) {\n const instance = new NativeBc(channelName);\n self.registerChannel(channelName);\n return instance;\n } as any;\n\n WrappedBc.prototype = NativeBc.prototype;\n globalThis.BroadcastChannel = WrappedBc;\n }\n\n /**\n * Declaratively scan tool execution code definitions for BroadcastChannel names\n * and register them automatically.\n */\n public registerChannelsFromTools(\n tools: Array<{ execution?: { code?: string }; code?: string }>,\n ): void {\n if (!Array.isArray(tools)) return;\n\n const bcRegex = /new\\s+BroadcastChannel\\s*\\(\\s*['\"`]([^'\"`]+)['\"`]\\s*\\)/g;\n for (const tool of tools) {\n const code = tool.execution?.code || tool.code || \"\";\n if (!code) continue;\n\n let match: RegExpExecArray | null;\n bcRegex.lastIndex = 0;\n while ((match = bcRegex.exec(code)) !== null) {\n if (match[1]) {\n this.registerChannel(match[1]);\n }\n }\n }\n }\n\n /**\n * Register a channel name to forward parent messages to the sandboxed iframe.\n */\n public registerChannel(channelName: string): void {\n if (\n typeof BroadcastChannel === \"undefined\" ||\n !channelName ||\n channelName.endsWith(\"-results\") ||\n this.commandChannels.has(channelName)\n ) {\n return;\n }\n this.listenOnCommandChannel(channelName);\n }\n\n private listenOnCommandChannel(channelName: string): void {\n try {\n const NativeBc =\n this.originalBroadcastChannel || globalThis.BroadcastChannel;\n const bc = new NativeBc(channelName);\n bc.onmessage = (evt) => {\n const target = this.getTargetWindow();\n if (target) {\n target.postMessage(\n {\n type: \"shadow-claw-broadcast-command\",\n channel: channelName,\n payload: evt.data,\n },\n \"*\",\n );\n }\n };\n this.commandChannels.set(channelName, bc);\n } catch (e) {\n console.warn(\n `[IframeBroadcastProxy] Failed to listen on channel ${channelName}:`,\n e,\n );\n }\n }\n\n /**\n * Handle incoming broadcast result/message from the sandboxed iframe and relay it\n * to the parent-origin BroadcastChannel.\n */\n public handleResultFromIframe(\n sourceWindow: WindowProxy,\n channelName: string,\n payload: unknown,\n ): boolean {\n const target = this.getTargetWindow();\n if (target && sourceWindow !== target) {\n return false;\n }\n\n if (channelName) {\n try {\n const NativeBc =\n this.originalBroadcastChannel || globalThis.BroadcastChannel;\n const resBc = new NativeBc(channelName);\n resBc.postMessage(payload);\n resBc.close();\n return true;\n } catch (e) {\n console.warn(\n `[IframeBroadcastProxy] Failed to relay result for channel ${channelName}:`,\n e,\n );\n }\n }\n return false;\n }\n\n public dispose(): void {\n for (const bc of this.commandChannels.values()) {\n try {\n bc.close();\n } catch (e) {}\n }\n this.commandChannels.clear();\n }\n}\n","/**\n * iframe-storage-proxy.ts\n *\n * Parent-side storage implementation for the iframe storage bridge.\n * Provides a namespaced IndexedDB key-value store that the parent frame\n * uses to proxy storage operations on behalf of sandboxed iframes that\n * lack direct storage access due to opaque-origin isolation.\n *\n * Each page gets its own namespace to prevent cross-page data leakage.\n */\n\nconst DB_NAME = \"shadow-claw-iframe-storage\";\nconst DB_VERSION = 1;\nconst STORE_NAME = \"kv\";\n\nlet dbPromise: Promise<IDBDatabase> | null = null;\n\nfunction openDb(): Promise<IDBDatabase> {\n if (dbPromise) {\n return dbPromise;\n }\n\n dbPromise = new Promise<IDBDatabase>((resolve, reject) => {\n const request = indexedDB.open(DB_NAME, DB_VERSION);\n\n request.onupgradeneeded = () => {\n const db = request.result;\n if (!db.objectStoreNames.contains(STORE_NAME)) {\n db.createObjectStore(STORE_NAME);\n }\n };\n\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => {\n dbPromise = null;\n reject(request.error);\n };\n });\n\n return dbPromise;\n}\n\n/**\n * Build a composite key from a namespace and item key.\n */\nfunction compositeKey(namespace: string, key: string): string {\n return `${namespace}\\0${key}`;\n}\n\n/**\n * Set a value in the namespaced store.\n */\nexport async function iframeStorageSet(\n namespace: string,\n key: string,\n value: unknown,\n): Promise<void> {\n const db = await openDb();\n return new Promise((resolve, reject) => {\n const tx = db.transaction(STORE_NAME, \"readwrite\");\n tx.objectStore(STORE_NAME).put(value, compositeKey(namespace, key));\n tx.oncomplete = () => resolve();\n tx.onerror = () => reject(tx.error);\n });\n}\n\n/**\n * Get a single value from the namespaced store.\n */\nexport async function iframeStorageGet(\n namespace: string,\n key: string,\n): Promise<unknown> {\n const db = await openDb();\n return new Promise((resolve, reject) => {\n const tx = db.transaction(STORE_NAME, \"readonly\");\n const req = tx.objectStore(STORE_NAME).get(compositeKey(namespace, key));\n req.onsuccess = () => resolve(req.result);\n req.onerror = () => reject(req.error);\n });\n}\n\n/**\n * Get all values for a namespace as a key-value object.\n */\nexport async function iframeStorageGetAll(\n namespace: string,\n): Promise<Record<string, unknown>> {\n const db = await openDb();\n return new Promise((resolve, reject) => {\n const tx = db.transaction(STORE_NAME, \"readonly\");\n const store = tx.objectStore(STORE_NAME);\n const result: Record<string, unknown> = {};\n const prefix = `${namespace}\\0`;\n const cursorReq = store.openCursor();\n\n cursorReq.onsuccess = () => {\n const cursor = cursorReq.result;\n if (!cursor) {\n resolve(result);\n return;\n }\n const cursorKey =\n typeof cursor.key === \"string\" ? cursor.key : String(cursor.key);\n if (cursorKey.startsWith(prefix)) {\n result[cursorKey.slice(prefix.length)] = cursor.value;\n }\n cursor.continue();\n };\n\n cursorReq.onerror = () => reject(cursorReq.error);\n });\n}\n\n/**\n * Delete a single value from the namespaced store.\n */\nexport async function iframeStorageDelete(\n namespace: string,\n key: string,\n): Promise<void> {\n const db = await openDb();\n return new Promise((resolve, reject) => {\n const tx = db.transaction(STORE_NAME, \"readwrite\");\n tx.objectStore(STORE_NAME).delete(compositeKey(namespace, key));\n tx.oncomplete = () => resolve();\n tx.onerror = () => reject(tx.error);\n });\n}\n\n/**\n * Clear all values for a namespace.\n */\nexport async function iframeStorageClear(namespace: string): Promise<void> {\n const db = await openDb();\n return new Promise((resolve, reject) => {\n const tx = db.transaction(STORE_NAME, \"readwrite\");\n const store = tx.objectStore(STORE_NAME);\n const prefix = `${namespace}\\0`;\n const cursorReq = store.openCursor();\n\n cursorReq.onsuccess = () => {\n const cursor = cursorReq.result;\n if (!cursor) {\n resolve();\n return;\n }\n const cursorKey =\n typeof cursor.key === \"string\" ? cursor.key : String(cursor.key);\n if (cursorKey.startsWith(prefix)) {\n cursor.delete();\n }\n cursor.continue();\n };\n\n cursorReq.onerror = () => reject(cursorReq.error);\n });\n}\n"],"mappings":"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"}
package/dist/lib/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import ShadowClawElement from "./components/shadow-claw-element.js";
2
2
  import { IMAGE_MIME_TYPES, MIME_TYPES, getImageMimeType, getMimeType, guessMimeTypeFromFilename, inferAttachmentMimeType, isImagePath, isMimeType, mime } from "./utils/mime.js";
3
3
  import { ulid } from "./utils/ulid.js";
4
- import { a as formatTimestamp, c as toArrayBuffer, i as formatDateForFilename, n as computeSha256, o as handleSpecialLinkNavigation, r as escapeHtml, s as sanitizeHtml, t as bufferToHex } from "./utils-DYdrO2KI.js";
4
+ import { a as formatTimestamp, c as toArrayBuffer, i as formatDateForFilename, n as computeSha256, o as handleSpecialLinkNavigation, r as escapeHtml, s as sanitizeHtml, t as bufferToHex } from "./utils-CzgKe_XZ.js";
5
5
  import { isTruthyConfigValue, parseBooleanConfig } from "./utils/parseBooleanConfig.js";
6
6
  import { asNumber, asStringArray, asUidArray, coerce, coerceArray, coerceNumber, coerceStringArray, coerceUidArray } from "./utils/coerce.js";
7
7
  import { base64, base64ToBytes, bytesToBase64 } from "./utils/base64.js";
@@ -13,42 +13,42 @@ import { normalizeStringList } from "./utils/normalizeStringList.js";
13
13
  import { a as showSuccess, i as showInfo, l as toastStore, o as showToast, r as showError, s as showWarning } from "./toast-DZ6r7_YI.js";
14
14
  import { getNamespacedItem, getNamespacedStorageKey, removeNamespacedItem, setNamespacedItem } from "./utils/namespacedStorage.js";
15
15
  import { applyJsonPatch } from "./utils/jsonPatch.js";
16
- import { t as ShadowClaw } from "./shadow-claw-MumteAJy.js";
17
- import { t as ShadowClawChat } from "./shadow-claw-chat-BD18-mAR.js";
18
- import { t as ShadowClawA2UI } from "./shadow-claw-a2ui-Dipe8nY2.js";
16
+ import { t as ShadowClaw } from "./shadow-claw-CtCj5Rn_.js";
17
+ import { t as ShadowClawChat } from "./shadow-claw-chat-Dw32DPV2.js";
18
+ import { t as ShadowClawA2UI } from "./shadow-claw-a2ui-CvK5w940.js";
19
19
  import { t as ShadowClawPageHeaderActionButton } from "./shadow-claw-page-header-action-button-BXXm5b5N.js";
20
20
  import { ShadowClawA2UIInterceptor } from "./components/shadow-claw-a2ui-interceptor.js";
21
21
  import { ShadowClawDialog } from "./components/shadow-claw-dialog.js";
22
- import { t as ShadowClawPageHeader } from "./shadow-claw-page-header-6gq6EMqX.js";
23
- import { t as ShadowClawFiles } from "./shadow-claw-files-BI0P3m8a.js";
22
+ import { t as ShadowClawPageHeader } from "./shadow-claw-page-header-DAYz3I_o.js";
23
+ import { t as ShadowClawFiles } from "./shadow-claw-files-xGGhsHNH.js";
24
24
  import { t as ShadowClawEmptyState } from "./shadow-claw-empty-state-D9bnqWMF.js";
25
- import { t as ShadowClawFileViewer } from "./shadow-claw-file-viewer-CMOnFmcP.js";
25
+ import { t as ShadowClawFileViewer } from "./shadow-claw-file-viewer-CAsn9NxH.js";
26
26
  import { t as ShadowClawPdfViewer } from "./shadow-claw-pdf-viewer-D3leDhRq.js";
27
- import { t as ShadowClawTasks } from "./shadow-claw-tasks-6OhALkq1.js";
28
- import { n as ShadowClawTerminal } from "./shadow-claw-terminal-BGtxA1qD.js";
29
- import { t as ShadowClawPages } from "./shadow-claw-pages-Bo8_z2S-.js";
30
- import { t as ShadowClawSettings } from "./shadow-claw-settings-D00B4p4L.js";
31
- import { t as ShadowClawPeerJs } from "./shadow-claw-peerjs-DRTLCVDQ.js";
32
- import { t as ShadowClawChannelConfig } from "./shadow-claw-channel-config-CIm_Bxd2.js";
33
- import { t as ShadowClawChannels } from "./shadow-claw-channels-CaceK52s.js";
27
+ import { t as ShadowClawTasks } from "./shadow-claw-tasks-Dc4BC-t-.js";
28
+ import { n as ShadowClawTerminal } from "./shadow-claw-terminal-BINcTdsk.js";
29
+ import { t as ShadowClawPages } from "./shadow-claw-pages-BLeEZb9k.js";
30
+ import { t as ShadowClawSettings } from "./shadow-claw-settings-B7o0Z4hu.js";
31
+ import { t as ShadowClawPeerJs } from "./shadow-claw-peerjs-BcFnbK74.js";
32
+ import { t as ShadowClawChannelConfig } from "./shadow-claw-channel-config-Da2dN19M.js";
33
+ import { t as ShadowClawChannels } from "./shadow-claw-channels-BofYHgz8.js";
34
34
  import { t as ShadowClawProviderModelPicker } from "./shadow-claw-provider-model-picker-CsA-507a.js";
35
35
  import { t as ShadowClawProviderModuleSettings } from "./shadow-claw-provider-module-settings-3sCTnCSp.js";
36
- import { t as ShadowClawConversations } from "./shadow-claw-conversations-CDsza_oB.js";
36
+ import { t as ShadowClawConversations } from "./shadow-claw-conversations-0UXge23k.js";
37
37
  import { t as ShadowClawToast } from "./shadow-claw-toast-aRLHKnSl.js";
38
- import { t as ShadowClawTools } from "./shadow-claw-tools-OeIwAnnd.js";
38
+ import { t as ShadowClawTools } from "./shadow-claw-tools-BjFgXNLR.js";
39
39
  import { t as ShadowClawActions } from "./shadow-claw-actions-G99P9oxr.js";
40
40
  import { t as ShadowClawCard } from "./shadow-claw-card-D9azfSMu.js";
41
- import { t as ShadowClawAccounts } from "./shadow-claw-accounts-BgCkz3Zv.js";
42
- import { t as ShadowClawControlPlane } from "./shadow-claw-control-plane-U6LsfRPm.js";
43
- import { t as ShadowClawGit } from "./shadow-claw-git-xRApLEMN.js";
44
- import { t as ShadowClawIntegrations } from "./shadow-claw-integrations-B2e1Nfg1.js";
45
- import { t as ShadowClawLlm } from "./shadow-claw-llm-Bc2mWuGb.js";
46
- import { t as ShadowClawMcpRemote } from "./shadow-claw-mcp-remote-D_Bh3aeC.js";
47
- import { t as ShadowClawNetworking } from "./shadow-claw-networking-F5W3n5ci.js";
48
- import { t as ShadowClawNotifications } from "./shadow-claw-notifications-lvMt9WJ1.js";
49
- import { t as ShadowClawStorage } from "./shadow-claw-storage-DgMe7-Zo.js";
50
- import { t as ShadowClawTaskServer } from "./shadow-claw-task-server-D103YOuI.js";
51
- import { t as ShadowClawWebvm } from "./shadow-claw-webvm-gVFZ197u.js";
41
+ import { t as ShadowClawAccounts } from "./shadow-claw-accounts-Br3XdHro.js";
42
+ import { t as ShadowClawControlPlane } from "./shadow-claw-control-plane-CwFotFDh.js";
43
+ import { t as ShadowClawGit } from "./shadow-claw-git-B606hcMU.js";
44
+ import { t as ShadowClawIntegrations } from "./shadow-claw-integrations-Bwq5cba1.js";
45
+ import { t as ShadowClawLlm } from "./shadow-claw-llm-BgpcMBIy.js";
46
+ import { t as ShadowClawMcpRemote } from "./shadow-claw-mcp-remote-DvQCA-Bk.js";
47
+ import { t as ShadowClawNetworking } from "./shadow-claw-networking-Cxvf9c7E.js";
48
+ import { t as ShadowClawNotifications } from "./shadow-claw-notifications-CGVcFYBy.js";
49
+ import { t as ShadowClawStorage } from "./shadow-claw-storage-afMVqB7E.js";
50
+ import { t as ShadowClawTaskServer } from "./shadow-claw-task-server-B9-MQjl6.js";
51
+ import { t as ShadowClawWebvm } from "./shadow-claw-webvm-Xe3ByMDw.js";
52
52
  import "./components/index.js";
53
53
  import { parseStoredStringList } from "./utils/parseStoredStringList.js";
54
54
  import { t as utils_exports } from "./utils/index.js";
@@ -1,4 +1,4 @@
1
- import { r as CONFIG_KEYS } from "./config-CPHDmyTx.js";
1
+ import { r as CONFIG_KEYS } from "./config-DZkF9LiO.js";
2
2
  import { t as getConfig } from "./getConfig-B7JdRqIY.js";
3
3
  import { t as setConfig } from "./setConfig-CmvLryM3.js";
4
4
 
@@ -128,4 +128,4 @@ async function initChatSplitResize(shadow, shadowClaw, handle, db) {
128
128
 
129
129
  //#endregion
130
130
  export { initChatSplitResize };
131
- //# sourceMappingURL=initChatSplitResize-DuNlwCuI.js.map
131
+ //# sourceMappingURL=initChatSplitResize-DiKTI-wk.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"initChatSplitResize-DuNlwCuI.js","names":[],"sources":["../../src/components/shadow-claw/utils/clampChatSplitHeight.ts","../../src/components/shadow-claw/utils/persistChatSplitHeight.ts","../../src/components/shadow-claw/utils/setChatSplitHeight.ts","../../src/components/shadow-claw/utils/initChatSplitResize.ts"],"sourcesContent":["import { MIN_CHAT_SPLIT_HEIGHT_PX } from \"../constants.js\";\n\nexport function clampChatSplitHeight(\n shadow: ShadowRoot | null,\n px: number,\n): number {\n const mainContent = shadow?.querySelector(\".main-content\");\n\n if (!(mainContent instanceof HTMLElement)) {\n return Math.max(MIN_CHAT_SPLIT_HEIGHT_PX, px);\n }\n\n const containerHeight =\n mainContent.getBoundingClientRect().height || window.innerHeight || 600;\n const maxByContainer = Math.max(\n MIN_CHAT_SPLIT_HEIGHT_PX,\n containerHeight - 100,\n );\n\n return Math.max(MIN_CHAT_SPLIT_HEIGHT_PX, Math.min(maxByContainer, px));\n}\n","import { CONFIG_KEYS } from \"../../../config/config.js\";\nimport { setConfig } from \"../../../db/setConfig.js\";\n\nimport type { ShadowClawDatabase } from \"../../../db/types.js\";\n\nexport async function persistChatSplitHeight(\n db: ShadowClawDatabase,\n px: number,\n): Promise<void> {\n if (!db) {\n return;\n }\n\n try {\n await setConfig(db, CONFIG_KEYS.CHAT_SPLIT_VIEW_HEIGHT, px);\n } catch {\n // Ignore persistence failures so resize remains usable in degraded test/runtime states.\n }\n}\n","import { clampChatSplitHeight } from \"./clampChatSplitHeight.js\";\n\nexport function setChatSplitHeight(\n shadow: ShadowRoot | null,\n px: number,\n): void {\n const mainContent = shadow?.querySelector(\".main-content\");\n\n if (!(mainContent instanceof HTMLElement)) {\n return;\n }\n\n const clamped = clampChatSplitHeight(shadow, px);\n mainContent.style.setProperty(\"--chat-split-height\", `${clamped}px`);\n}\n","import { CONFIG_KEYS } from \"../../../config/config.js\";\nimport { getConfig } from \"../../../db/getConfig.js\";\n\nimport {\n DEFAULT_CHAT_SPLIT_HEIGHT_PX,\n MIN_CHAT_SPLIT_HEIGHT_PX,\n} from \"../constants.js\";\n\nimport { clampChatSplitHeight } from \"./clampChatSplitHeight.js\";\nimport { persistChatSplitHeight } from \"./persistChatSplitHeight.js\";\nimport { setChatSplitHeight } from \"./setChatSplitHeight.js\";\n\nimport type { ShadowClawDatabase } from \"../../../db/types.js\";\n\ninterface ChatSplitResizeHost {\n addCleanup: (fn: () => void) => void;\n}\n\nexport async function initChatSplitResize(\n shadow: ShadowRoot | null,\n shadowClaw: ChatSplitResizeHost,\n handle: HTMLElement,\n db: ShadowClawDatabase | undefined,\n): Promise<void> {\n if (!shadow || !handle) {\n return;\n }\n\n handle.setAttribute(\"tabindex\", \"0\");\n handle.setAttribute(\"role\", \"separator\");\n handle.setAttribute(\"aria-orientation\", \"horizontal\");\n handle.setAttribute(\"aria-label\", \"Resize chat panel height\");\n\n const getCurrentHeight = () => {\n const mainContent = shadow.querySelector(\".main-content\");\n if (!(mainContent instanceof HTMLElement)) {\n return DEFAULT_CHAT_SPLIT_HEIGHT_PX;\n }\n\n const stored = parseFloat(\n mainContent.style.getPropertyValue(\"--chat-split-height\"),\n );\n if (Number.isFinite(stored) && stored > 0) {\n return stored;\n }\n\n const chatPage = shadow.querySelector(\".chat-page\");\n return (\n (chatPage instanceof HTMLElement &&\n chatPage.getBoundingClientRect().height) ||\n DEFAULT_CHAT_SPLIT_HEIGHT_PX\n );\n };\n\n const updateAria = () => {\n const current = Math.round(\n clampChatSplitHeight(shadow, getCurrentHeight()),\n );\n const max = Math.round(\n clampChatSplitHeight(shadow, Number.MAX_SAFE_INTEGER),\n );\n handle.setAttribute(\"aria-valuemin\", String(MIN_CHAT_SPLIT_HEIGHT_PX));\n handle.setAttribute(\"aria-valuemax\", String(max));\n handle.setAttribute(\"aria-valuenow\", String(current));\n };\n\n try {\n const saved = db\n ? await getConfig(db, CONFIG_KEYS.CHAT_SPLIT_VIEW_HEIGHT)\n : undefined;\n\n if (typeof saved === \"number\" && Number.isFinite(saved) && saved > 0) {\n setChatSplitHeight(shadow, saved);\n } else if (typeof saved === \"string\" && !isNaN(parseFloat(saved))) {\n setChatSplitHeight(shadow, parseFloat(saved));\n } else {\n setChatSplitHeight(shadow, DEFAULT_CHAT_SPLIT_HEIGHT_PX);\n }\n } catch {\n setChatSplitHeight(shadow, DEFAULT_CHAT_SPLIT_HEIGHT_PX);\n }\n\n let activePointerId: number | null = null;\n let startY = 0;\n let startHeight = 0;\n\n const onPointerMove = (event: PointerEvent) => {\n if (event.pointerId !== activePointerId) {\n return;\n }\n\n // Dragging handle UP (delta > 0) increases height of bottom chat panel\n const delta = startY - event.clientY;\n const nextHeight = startHeight + delta;\n setChatSplitHeight(shadow, nextHeight);\n updateAria();\n };\n\n const stopResize = () => {\n if (activePointerId === null) {\n return;\n }\n\n activePointerId = null;\n handle.classList.remove(\"active\");\n document.removeEventListener(\"pointermove\", onPointerMove);\n\n const mainContent = shadow.querySelector(\".main-content\");\n if (mainContent instanceof HTMLElement) {\n const value = parseFloat(\n mainContent.style.getPropertyValue(\"--chat-split-height\"),\n );\n if (Number.isFinite(value) && value > 0 && db) {\n void persistChatSplitHeight(db, value);\n }\n }\n };\n\n const onPointerUp = (event: PointerEvent) => {\n if (event.pointerId !== activePointerId) {\n return;\n }\n\n stopResize();\n };\n\n handle.addEventListener(\"pointerdown\", (event: PointerEvent) => {\n if (\n event.pointerType === \"mouse\" &&\n event.button !== 0 &&\n event.button !== -1\n ) {\n return;\n }\n\n if (window.innerWidth < 896) {\n return;\n }\n\n event.preventDefault();\n activePointerId = event.pointerId;\n startY = event.clientY;\n const chatPage = shadow.querySelector(\".chat-page\");\n startHeight =\n chatPage instanceof HTMLElement &&\n chatPage.getBoundingClientRect().height > 0\n ? chatPage.getBoundingClientRect().height\n : getCurrentHeight();\n handle.classList.add(\"active\");\n\n handle.setPointerCapture(event.pointerId);\n document.addEventListener(\"pointermove\", onPointerMove);\n });\n\n handle.addEventListener(\"pointerup\", onPointerUp);\n handle.addEventListener(\"pointercancel\", stopResize);\n handle.addEventListener(\"dblclick\", () => {\n setChatSplitHeight(shadow, DEFAULT_CHAT_SPLIT_HEIGHT_PX);\n if (db) {\n void persistChatSplitHeight(db, DEFAULT_CHAT_SPLIT_HEIGHT_PX);\n }\n\n updateAria();\n });\n\n handle.addEventListener(\"keydown\", (event: KeyboardEvent) => {\n if (window.innerWidth < 896) {\n return;\n }\n\n const step = event.shiftKey ? 32 : 12;\n const current = getCurrentHeight();\n let next: number | null = null;\n\n if (event.key === \"ArrowUp\") {\n next = current + step;\n } else if (event.key === \"ArrowDown\") {\n next = current - step;\n } else if (event.key === \"Home\") {\n next = MIN_CHAT_SPLIT_HEIGHT_PX;\n } else if (event.key === \"End\") {\n next = clampChatSplitHeight(shadow, Number.MAX_SAFE_INTEGER);\n }\n\n if (next === null) {\n return;\n }\n\n event.preventDefault();\n setChatSplitHeight(shadow, next);\n updateAria();\n if (db) {\n void persistChatSplitHeight(\n db,\n clampChatSplitHeight(shadow, getCurrentHeight()),\n );\n }\n });\n\n updateAria();\n\n shadowClaw.addCleanup(() => {\n stopResize();\n handle.removeEventListener(\"pointerup\", onPointerUp);\n handle.removeEventListener(\"pointercancel\", stopResize);\n });\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"initChatSplitResize-DiKTI-wk.js","names":[],"sources":["../../src/components/shadow-claw/utils/clampChatSplitHeight.ts","../../src/components/shadow-claw/utils/persistChatSplitHeight.ts","../../src/components/shadow-claw/utils/setChatSplitHeight.ts","../../src/components/shadow-claw/utils/initChatSplitResize.ts"],"sourcesContent":["import { MIN_CHAT_SPLIT_HEIGHT_PX } from \"../constants.js\";\n\nexport function clampChatSplitHeight(\n shadow: ShadowRoot | null,\n px: number,\n): number {\n const mainContent = shadow?.querySelector(\".main-content\");\n\n if (!(mainContent instanceof HTMLElement)) {\n return Math.max(MIN_CHAT_SPLIT_HEIGHT_PX, px);\n }\n\n const containerHeight =\n mainContent.getBoundingClientRect().height || window.innerHeight || 600;\n const maxByContainer = Math.max(\n MIN_CHAT_SPLIT_HEIGHT_PX,\n containerHeight - 100,\n );\n\n return Math.max(MIN_CHAT_SPLIT_HEIGHT_PX, Math.min(maxByContainer, px));\n}\n","import { CONFIG_KEYS } from \"../../../config/config.js\";\nimport { setConfig } from \"../../../db/setConfig.js\";\n\nimport type { ShadowClawDatabase } from \"../../../db/types.js\";\n\nexport async function persistChatSplitHeight(\n db: ShadowClawDatabase,\n px: number,\n): Promise<void> {\n if (!db) {\n return;\n }\n\n try {\n await setConfig(db, CONFIG_KEYS.CHAT_SPLIT_VIEW_HEIGHT, px);\n } catch {\n // Ignore persistence failures so resize remains usable in degraded test/runtime states.\n }\n}\n","import { clampChatSplitHeight } from \"./clampChatSplitHeight.js\";\n\nexport function setChatSplitHeight(\n shadow: ShadowRoot | null,\n px: number,\n): void {\n const mainContent = shadow?.querySelector(\".main-content\");\n\n if (!(mainContent instanceof HTMLElement)) {\n return;\n }\n\n const clamped = clampChatSplitHeight(shadow, px);\n mainContent.style.setProperty(\"--chat-split-height\", `${clamped}px`);\n}\n","import { CONFIG_KEYS } from \"../../../config/config.js\";\nimport { getConfig } from \"../../../db/getConfig.js\";\n\nimport {\n DEFAULT_CHAT_SPLIT_HEIGHT_PX,\n MIN_CHAT_SPLIT_HEIGHT_PX,\n} from \"../constants.js\";\n\nimport { clampChatSplitHeight } from \"./clampChatSplitHeight.js\";\nimport { persistChatSplitHeight } from \"./persistChatSplitHeight.js\";\nimport { setChatSplitHeight } from \"./setChatSplitHeight.js\";\n\nimport type { ShadowClawDatabase } from \"../../../db/types.js\";\n\ninterface ChatSplitResizeHost {\n addCleanup: (fn: () => void) => void;\n}\n\nexport async function initChatSplitResize(\n shadow: ShadowRoot | null,\n shadowClaw: ChatSplitResizeHost,\n handle: HTMLElement,\n db: ShadowClawDatabase | undefined,\n): Promise<void> {\n if (!shadow || !handle) {\n return;\n }\n\n handle.setAttribute(\"tabindex\", \"0\");\n handle.setAttribute(\"role\", \"separator\");\n handle.setAttribute(\"aria-orientation\", \"horizontal\");\n handle.setAttribute(\"aria-label\", \"Resize chat panel height\");\n\n const getCurrentHeight = () => {\n const mainContent = shadow.querySelector(\".main-content\");\n if (!(mainContent instanceof HTMLElement)) {\n return DEFAULT_CHAT_SPLIT_HEIGHT_PX;\n }\n\n const stored = parseFloat(\n mainContent.style.getPropertyValue(\"--chat-split-height\"),\n );\n if (Number.isFinite(stored) && stored > 0) {\n return stored;\n }\n\n const chatPage = shadow.querySelector(\".chat-page\");\n return (\n (chatPage instanceof HTMLElement &&\n chatPage.getBoundingClientRect().height) ||\n DEFAULT_CHAT_SPLIT_HEIGHT_PX\n );\n };\n\n const updateAria = () => {\n const current = Math.round(\n clampChatSplitHeight(shadow, getCurrentHeight()),\n );\n const max = Math.round(\n clampChatSplitHeight(shadow, Number.MAX_SAFE_INTEGER),\n );\n handle.setAttribute(\"aria-valuemin\", String(MIN_CHAT_SPLIT_HEIGHT_PX));\n handle.setAttribute(\"aria-valuemax\", String(max));\n handle.setAttribute(\"aria-valuenow\", String(current));\n };\n\n try {\n const saved = db\n ? await getConfig(db, CONFIG_KEYS.CHAT_SPLIT_VIEW_HEIGHT)\n : undefined;\n\n if (typeof saved === \"number\" && Number.isFinite(saved) && saved > 0) {\n setChatSplitHeight(shadow, saved);\n } else if (typeof saved === \"string\" && !isNaN(parseFloat(saved))) {\n setChatSplitHeight(shadow, parseFloat(saved));\n } else {\n setChatSplitHeight(shadow, DEFAULT_CHAT_SPLIT_HEIGHT_PX);\n }\n } catch {\n setChatSplitHeight(shadow, DEFAULT_CHAT_SPLIT_HEIGHT_PX);\n }\n\n let activePointerId: number | null = null;\n let startY = 0;\n let startHeight = 0;\n\n const onPointerMove = (event: PointerEvent) => {\n if (event.pointerId !== activePointerId) {\n return;\n }\n\n // Dragging handle UP (delta > 0) increases height of bottom chat panel\n const delta = startY - event.clientY;\n const nextHeight = startHeight + delta;\n setChatSplitHeight(shadow, nextHeight);\n updateAria();\n };\n\n const stopResize = () => {\n if (activePointerId === null) {\n return;\n }\n\n activePointerId = null;\n handle.classList.remove(\"active\");\n document.removeEventListener(\"pointermove\", onPointerMove);\n\n const mainContent = shadow.querySelector(\".main-content\");\n if (mainContent instanceof HTMLElement) {\n const value = parseFloat(\n mainContent.style.getPropertyValue(\"--chat-split-height\"),\n );\n if (Number.isFinite(value) && value > 0 && db) {\n void persistChatSplitHeight(db, value);\n }\n }\n };\n\n const onPointerUp = (event: PointerEvent) => {\n if (event.pointerId !== activePointerId) {\n return;\n }\n\n stopResize();\n };\n\n handle.addEventListener(\"pointerdown\", (event: PointerEvent) => {\n if (\n event.pointerType === \"mouse\" &&\n event.button !== 0 &&\n event.button !== -1\n ) {\n return;\n }\n\n if (window.innerWidth < 896) {\n return;\n }\n\n event.preventDefault();\n activePointerId = event.pointerId;\n startY = event.clientY;\n const chatPage = shadow.querySelector(\".chat-page\");\n startHeight =\n chatPage instanceof HTMLElement &&\n chatPage.getBoundingClientRect().height > 0\n ? chatPage.getBoundingClientRect().height\n : getCurrentHeight();\n handle.classList.add(\"active\");\n\n handle.setPointerCapture(event.pointerId);\n document.addEventListener(\"pointermove\", onPointerMove);\n });\n\n handle.addEventListener(\"pointerup\", onPointerUp);\n handle.addEventListener(\"pointercancel\", stopResize);\n handle.addEventListener(\"dblclick\", () => {\n setChatSplitHeight(shadow, DEFAULT_CHAT_SPLIT_HEIGHT_PX);\n if (db) {\n void persistChatSplitHeight(db, DEFAULT_CHAT_SPLIT_HEIGHT_PX);\n }\n\n updateAria();\n });\n\n handle.addEventListener(\"keydown\", (event: KeyboardEvent) => {\n if (window.innerWidth < 896) {\n return;\n }\n\n const step = event.shiftKey ? 32 : 12;\n const current = getCurrentHeight();\n let next: number | null = null;\n\n if (event.key === \"ArrowUp\") {\n next = current + step;\n } else if (event.key === \"ArrowDown\") {\n next = current - step;\n } else if (event.key === \"Home\") {\n next = MIN_CHAT_SPLIT_HEIGHT_PX;\n } else if (event.key === \"End\") {\n next = clampChatSplitHeight(shadow, Number.MAX_SAFE_INTEGER);\n }\n\n if (next === null) {\n return;\n }\n\n event.preventDefault();\n setChatSplitHeight(shadow, next);\n updateAria();\n if (db) {\n void persistChatSplitHeight(\n db,\n clampChatSplitHeight(shadow, getCurrentHeight()),\n );\n }\n });\n\n updateAria();\n\n shadowClaw.addCleanup(() => {\n stopResize();\n handle.removeEventListener(\"pointerup\", onPointerUp);\n handle.removeEventListener(\"pointercancel\", stopResize);\n });\n}\n"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { i as __toESM } from "./rolldown-runtime-DZ8SGSJo.js";
2
2
  import { r as getDb } from "./txPromise-DdeRXi7G.js";
3
- import { r as CONFIG_KEYS } from "./config-CPHDmyTx.js";
4
- import { a as getDeploymentNamespace } from "./app-routes-BAEMLu9g.js";
3
+ import { r as CONFIG_KEYS } from "./config-DZkF9LiO.js";
4
+ import { a as getDeploymentNamespace } from "./app-routes-CKkiX12g.js";
5
5
  import { ulid } from "./utils/ulid.js";
6
6
  import { t as require_browser } from "./browser-FvTfy_Ym.js";
7
7
  import { t as getAllTasks } from "./getAllTasks-DEko4xIn.js";
@@ -430,7 +430,7 @@ async function executeClientControlCommand(action, args = {}, options = {}) {
430
430
  switch (action) {
431
431
  case "send-message": {
432
432
  if (!args.text) throw new Error("Missing text parameter");
433
- const { orchestratorStore } = await import("./orchestrator-D9f5fDCb.js").then((n) => n.n);
433
+ const { orchestratorStore } = await import("./orchestrator-DKHCoikY.js").then((n) => n.n);
434
434
  const orch = options.orchestrator || orchestratorStore.orchestrator;
435
435
  const targetGroupId = args.groupId || orchestratorStore.activeGroupId || "br:main";
436
436
  if (orch?.browserChat?.submit) {
@@ -465,7 +465,7 @@ async function executeClientControlCommand(action, args = {}, options = {}) {
465
465
  return { tasks };
466
466
  }
467
467
  case "read-state": {
468
- const { orchestratorStore } = await import("./orchestrator-D9f5fDCb.js").then((n) => n.n);
468
+ const { orchestratorStore } = await import("./orchestrator-DKHCoikY.js").then((n) => n.n);
469
469
  const orch = options.orchestrator || orchestratorStore.orchestrator;
470
470
  return {
471
471
  clientId,
@@ -478,7 +478,7 @@ async function executeClientControlCommand(action, args = {}, options = {}) {
478
478
  }
479
479
  case "list-tools": {
480
480
  try {
481
- const { getWebMcpTools } = await import("./webmcp-D2bocsgh.js").then((n) => n.a);
481
+ const { getWebMcpTools } = await import("./webmcp-oEP9YpR2.js").then((n) => n.s);
482
482
  const webMcpTools = await getWebMcpTools();
483
483
  if (webMcpTools && webMcpTools.length > 0) return { tools: webMcpTools.map((t) => ({
484
484
  name: t.name,
@@ -488,13 +488,13 @@ async function executeClientControlCommand(action, args = {}, options = {}) {
488
488
  })) };
489
489
  } catch (_) {}
490
490
  try {
491
- const { orchestratorStore } = await import("./orchestrator-D9f5fDCb.js").then((n) => n.n);
491
+ const { orchestratorStore } = await import("./orchestrator-DKHCoikY.js").then((n) => n.n);
492
492
  const orch = options.orchestrator || orchestratorStore.orchestrator || (typeof document !== "undefined" ? document.querySelector("shadow-claw")?.orchestrator : null);
493
493
  const activeGroupId = args.groupId || orch?.activeGroupId || orchestratorStore.activeGroupId || "br:main";
494
494
  const group = orchestratorStore.groups.find((g) => g.groupId === activeGroupId);
495
495
  if (group?.toolTags && group.toolTags.length > 0) {
496
496
  const { TOOL_DEFINITIONS } = await import("./tools-BQpz4Hkp.js").then((n) => n.n);
497
- const { parseWebMcpInputSchema } = await import("./webmcp-D2bocsgh.js").then((n) => n.a);
497
+ const { parseWebMcpInputSchema } = await import("./webmcp-oEP9YpR2.js").then((n) => n.s);
498
498
  return { tools: TOOL_DEFINITIONS.filter((t) => group.toolTags.includes(t.name)).map((t) => ({
499
499
  name: t.name,
500
500
  description: t.description,
@@ -503,7 +503,7 @@ async function executeClientControlCommand(action, args = {}, options = {}) {
503
503
  }
504
504
  } catch (_) {}
505
505
  const { TOOL_DEFINITIONS } = await import("./tools-BQpz4Hkp.js").then((n) => n.n);
506
- const { parseWebMcpInputSchema } = await import("./webmcp-D2bocsgh.js").then((n) => n.a);
506
+ const { parseWebMcpInputSchema } = await import("./webmcp-oEP9YpR2.js").then((n) => n.s);
507
507
  return { tools: TOOL_DEFINITIONS.map((t) => ({
508
508
  name: t.name,
509
509
  description: t.description,
@@ -513,8 +513,8 @@ async function executeClientControlCommand(action, args = {}, options = {}) {
513
513
  case "invoke-tool": {
514
514
  if (!args.toolName) throw new Error("Missing toolName parameter");
515
515
  try {
516
- const { orchestratorStore } = await import("./orchestrator-D9f5fDCb.js").then((n) => n.n);
517
- const { toolsStore } = await import("./tools-D0OlSzMD.js").then((n) => n.n);
516
+ const { orchestratorStore } = await import("./orchestrator-DKHCoikY.js").then((n) => n.n);
517
+ const { toolsStore } = await import("./tools-Cmhpk3X8.js").then((n) => n.n);
518
518
  const orch = options.orchestrator || orchestratorStore.orchestrator || (typeof document !== "undefined" ? document.querySelector("shadow-claw")?.orchestrator : null);
519
519
  const activeGroupId = args.groupId || orch?.activeGroupId || orchestratorStore.activeGroupId || "br:main";
520
520
  const group = orchestratorStore.groups.find((g) => g.groupId === activeGroupId);
@@ -541,7 +541,7 @@ async function executeClientControlCommand(action, args = {}, options = {}) {
541
541
  } catch (err) {
542
542
  if (err.message && err.message.includes("is not enabled")) throw err;
543
543
  }
544
- const { executeWebMcpTool } = await import("./webmcp-D2bocsgh.js").then((n) => n.a);
544
+ const { executeWebMcpTool } = await import("./webmcp-oEP9YpR2.js").then((n) => n.s);
545
545
  if (typeof ctx.executeTool === "function") {
546
546
  if (matchedTool) try {
547
547
  return { result: await executeWebMcpTool(ctx, matchedTool, args.input) };
@@ -567,7 +567,7 @@ async function executeClientControlCommand(action, args = {}, options = {}) {
567
567
  return { result: await ctx.invoke(args.toolName, typeof args.input === "string" ? JSON.parse(args.input) : args.input || {}) };
568
568
  } catch (_) {}
569
569
  }
570
- const { orchestratorStore } = await import("./orchestrator-D9f5fDCb.js").then((n) => n.n);
570
+ const { orchestratorStore } = await import("./orchestrator-DKHCoikY.js").then((n) => n.n);
571
571
  const orch = options.orchestrator || orchestratorStore.orchestrator || (typeof document !== "undefined" ? document.querySelector("shadow-claw")?.orchestrator : null);
572
572
  const worker = orch?.agentWorker;
573
573
  if (worker && typeof worker.postMessage === "function") {
@@ -603,10 +603,10 @@ async function executeClientControlCommand(action, args = {}, options = {}) {
603
603
  throw new Error(`Tool ${args.toolName} could not be executed (no context or worker available)`);
604
604
  }
605
605
  case "trigger-backup": {
606
- const { orchestratorStore } = await import("./orchestrator-D9f5fDCb.js").then((n) => n.n);
606
+ const { orchestratorStore } = await import("./orchestrator-DKHCoikY.js").then((n) => n.n);
607
607
  const targetGroupId = args.groupId || options.orchestrator?.activeGroupId || orchestratorStore.activeGroupId || "br:main";
608
608
  const db = await getDb();
609
- const { getGroupDir } = await import("./getGroupDir-DF-RZO8X.js").then((n) => n.n);
609
+ const { getGroupDir } = await import("./getGroupDir-MHv7Lvmp.js").then((n) => n.n);
610
610
  const groupDir = await getGroupDir(db, targetGroupId);
611
611
  async function collectFiles(dir, prefix = "") {
612
612
  const result = [];
@@ -724,4 +724,4 @@ async function ensureControlPlaneConnected(options = {}) {
724
724
 
725
725
  //#endregion
726
726
  export { detectDeviceLabel, ensureControlPlaneConnected, executeClientControlCommand, getOrCreateControlPlaneClientId, isControlPlaneEnabled, shouldConnectControlPlane, stopControlPlaneClient };
727
- //# sourceMappingURL=initControlPlane-D4UZ4EhV.js.map
727
+ //# sourceMappingURL=initControlPlane-CzjtQ4aM.js.map