shadow-claw 1.54.0 → 1.55.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (286) hide show
  1. package/.well-known/mcp/server-card.json +1 -1
  2. package/.well-known/mcp.json +1 -1
  3. package/README.md +1 -1
  4. package/dist/cli/build/build.js +1 -1
  5. package/dist/cli/{chunk-DO2t9bUI.js → chunk--IuVyWfT.js} +24 -23
  6. package/dist/cli/{chunk-2ZYd9gYC.js → chunk--JpdI-Ht.js} +1 -1
  7. package/dist/cli/{chunk-m4Ineemy.js → chunk-4O8yrQuN.js} +1 -1
  8. package/dist/cli/{chunk-BiH9IXnQ.js → chunk-7S9Ywlfy.js} +1 -1
  9. package/dist/cli/{chunk-BmMOdYvk.js → chunk-B0SqqDSK.js} +1 -1
  10. package/dist/cli/chunk-BNaWaEm-.js +1 -0
  11. package/dist/cli/chunk-BXCsxO9e.js +1 -0
  12. package/dist/cli/chunk-Bq37qDoZ.js +18 -0
  13. package/dist/cli/{chunk-C1htf-nO.js → chunk-BrEeCKIo.js} +2 -2
  14. package/dist/cli/{chunk-BI1SOTM1.js → chunk-Bu3ylrhT.js} +8 -8
  15. package/dist/cli/{chunk-3smiGQoQ.js → chunk-C1v_s0Kb.js} +1 -1
  16. package/dist/cli/{chunk-DGeysxz3.js → chunk-C44G533y.js} +1 -1
  17. package/dist/cli/{chunk-9KiBalKu.js → chunk-C7hJLmsL.js} +1 -1
  18. package/dist/cli/{chunk-BFv9XSNd.js → chunk-CAaQWd6t.js} +1 -1
  19. package/dist/cli/chunk-CIkgn5Fh.js +1 -0
  20. package/dist/cli/chunk-CWEIN2kc.js +1 -0
  21. package/dist/cli/{chunk-BDeDZ-0L.js → chunk-CYg1lO1a.js} +1 -1
  22. package/dist/cli/{chunk-DXLmEQ3i.js → chunk-Ce09lwXT.js} +1 -1
  23. package/dist/cli/{chunk-XsfHeN4m.js → chunk-CpdqRSO-.js} +1 -1
  24. package/dist/cli/chunk-DB4x5L-B.js +1 -0
  25. package/dist/cli/{chunk-DaNyMqrk.js → chunk-DBvObsBQ.js} +1 -1
  26. package/dist/cli/chunk-DGPpt7Ka.js +1 -0
  27. package/dist/cli/chunk-DGagHluH.js +1 -0
  28. package/dist/cli/chunk-DUIs23D9.js +1 -0
  29. package/dist/cli/{chunk-CyvfQV16.js → chunk-DaurYOqg.js} +1 -1
  30. package/dist/cli/{chunk-DSFrcSyA.js → chunk-DfwRL0Ue.js} +1 -1
  31. package/dist/cli/{chunk-M2tZrzY5.js → chunk-DudYQk0p.js} +1 -1
  32. package/dist/cli/chunk-DvKo50Tp.js +2 -0
  33. package/dist/cli/{chunk-H_Mw5ypp.js → chunk-Dvrqte5Q.js} +2 -2
  34. package/dist/cli/{chunk-BtNO-m9T.js → chunk-DzhSExU0.js} +1 -1
  35. package/dist/cli/{chunk-IOMO88kZ.js → chunk-ENKlt3i9.js} +1 -1
  36. package/dist/cli/{chunk-Bspgzwsm.js → chunk-FWRwAX75.js} +8 -8
  37. package/dist/cli/chunk-Lf-Z-h48.js +32 -0
  38. package/dist/cli/{chunk-BucXnZ4Z.js → chunk-VRfkSLrD.js} +1 -1
  39. package/dist/cli/chunk-uaTxD024.js +1 -0
  40. package/dist/cli/cli.js +1 -1
  41. package/dist/cli/prerender/dsd-shell/prerender-dsd-shell.js +1 -1
  42. package/dist/headless-agent.js +2 -2
  43. package/dist/lib/components/index.js +25 -25
  44. package/dist/lib/components/settings/shadow-claw-accounts.js +1 -1
  45. package/dist/lib/components/settings/shadow-claw-channel-config.js +1 -1
  46. package/dist/lib/components/settings/shadow-claw-control-plane.js +1 -1
  47. package/dist/lib/components/settings/shadow-claw-git.js +1 -1
  48. package/dist/lib/components/settings/shadow-claw-integrations.js +1 -1
  49. package/dist/lib/components/settings/shadow-claw-llm.js +1 -1
  50. package/dist/lib/components/settings/shadow-claw-mcp-remote.js +1 -1
  51. package/dist/lib/components/settings/shadow-claw-networking.js +1 -1
  52. package/dist/lib/components/settings/shadow-claw-notifications.js +1 -1
  53. package/dist/lib/components/settings/shadow-claw-peerjs.js +1 -1
  54. package/dist/lib/components/settings/shadow-claw-storage.js +1 -1
  55. package/dist/lib/components/settings/shadow-claw-task-server.js +1 -1
  56. package/dist/lib/components/settings/shadow-claw-webvm.js +1 -1
  57. package/dist/lib/components/shadow-claw/utils/get-route.d.ts +3 -0
  58. package/dist/lib/components/shadow-claw/utils/sync-slotted-sidebar-active-links.d.ts +1 -1
  59. package/dist/lib/components/shadow-claw-accounts.js +1 -1
  60. package/dist/lib/components/shadow-claw-channel-config.js +1 -1
  61. package/dist/lib/components/shadow-claw-channels.js +1 -1
  62. package/dist/lib/components/shadow-claw-chat.js +1 -1
  63. package/dist/lib/components/shadow-claw-control-plane.js +1 -1
  64. package/dist/lib/components/shadow-claw-conversations.js +1 -1
  65. package/dist/lib/components/shadow-claw-file-viewer.js +1 -1
  66. package/dist/lib/components/shadow-claw-files.js +1 -1
  67. package/dist/lib/components/shadow-claw-git.js +1 -1
  68. package/dist/lib/components/shadow-claw-integrations.js +1 -1
  69. package/dist/lib/components/shadow-claw-llm.js +1 -1
  70. package/dist/lib/components/shadow-claw-mcp-remote.js +1 -1
  71. package/dist/lib/components/shadow-claw-networking.js +1 -1
  72. package/dist/lib/components/shadow-claw-notifications.js +1 -1
  73. package/dist/lib/components/shadow-claw-page-header.js +1 -1
  74. package/dist/lib/components/shadow-claw-pages.js +1 -1
  75. package/dist/lib/components/shadow-claw-peerjs.js +1 -1
  76. package/dist/lib/components/shadow-claw-settings.js +1 -1
  77. package/dist/lib/components/shadow-claw-storage.js +1 -1
  78. package/dist/lib/components/shadow-claw-task-server.js +1 -1
  79. package/dist/lib/components/shadow-claw-tasks.js +1 -1
  80. package/dist/lib/components/shadow-claw-terminal.js +1 -1
  81. package/dist/lib/components/shadow-claw-tools.js +1 -1
  82. package/dist/lib/components/shadow-claw-webvm.js +1 -1
  83. package/dist/lib/components/shadow-claw.js +1 -1
  84. package/dist/lib/{configure-peer-js-D5jDCtLx.js → configure-peer-js-C9554Slv.js} +2 -2
  85. package/dist/lib/{configure-peer-js-D5jDCtLx.js.map → configure-peer-js-C9554Slv.js.map} +1 -1
  86. package/dist/lib/{file-viewer-B4CL4e0i.js → file-viewer-DBc5dxNy.js} +2 -2
  87. package/dist/lib/{file-viewer-B4CL4e0i.js.map → file-viewer-DBc5dxNy.js.map} +1 -1
  88. package/dist/lib/index.js +28 -27
  89. package/dist/lib/{init-control-plane-l2uFnhGV.js → init-control-plane-D-41Fm5q.js} +12 -12
  90. package/dist/lib/{init-control-plane-l2uFnhGV.js.map → init-control-plane-D-41Fm5q.js.map} +1 -1
  91. package/dist/lib/{markdown-0_p_zfxL.js → markdown-KnDWzWJJ.js} +2 -2
  92. package/dist/lib/{markdown-0_p_zfxL.js.map → markdown-KnDWzWJJ.js.map} +1 -1
  93. package/dist/lib/{orchestrator-D6wm8Sec.js → orchestrator-BEZcqgR5.js} +9 -9
  94. package/dist/lib/{orchestrator-D6wm8Sec.js.map → orchestrator-BEZcqgR5.js.map} +1 -1
  95. package/dist/lib/{orchestrator-Dh-hnIpK.js → orchestrator-Cda13e5U.js} +4 -4
  96. package/dist/lib/{orchestrator-Dh-hnIpK.js.map → orchestrator-Cda13e5U.js.map} +1 -1
  97. package/dist/lib/{peerjs-BWZnsD0B.js → peerjs-DYkUTcee.js} +5 -5
  98. package/dist/lib/{peerjs-BWZnsD0B.js.map → peerjs-DYkUTcee.js.map} +1 -1
  99. package/dist/lib/{push-client-MybDfOdi.js → push-client-CQtCFDaD.js} +3 -3
  100. package/dist/lib/{push-client-MybDfOdi.js.map → push-client-CQtCFDaD.js.map} +1 -1
  101. package/dist/lib/security/custom-element-security.d.ts +8 -4
  102. package/dist/lib/{shadow-claw-PdOpgTxH.js → shadow-claw-DYe9u6Tp.js} +142 -33
  103. package/dist/lib/shadow-claw-DYe9u6Tp.js.map +1 -0
  104. package/dist/lib/{shadow-claw-accounts-3bR76EOb.js → shadow-claw-accounts-D2URoHys.js} +2 -2
  105. package/dist/lib/{shadow-claw-accounts-3bR76EOb.js.map → shadow-claw-accounts-D2URoHys.js.map} +1 -1
  106. package/dist/lib/{shadow-claw-channel-config-ChdZ1iB8.js → shadow-claw-channel-config-buXoz2xv.js} +3 -3
  107. package/dist/lib/{shadow-claw-channel-config-ChdZ1iB8.js.map → shadow-claw-channel-config-buXoz2xv.js.map} +1 -1
  108. package/dist/lib/{shadow-claw-channels-CK9sc7h_.js → shadow-claw-channels-5yVJ1gLk.js} +3 -3
  109. package/dist/lib/{shadow-claw-channels-CK9sc7h_.js.map → shadow-claw-channels-5yVJ1gLk.js.map} +1 -1
  110. package/dist/lib/{shadow-claw-chat-B6uuZnJ7.js → shadow-claw-chat-CVc-7ycM.js} +7 -7
  111. package/dist/lib/{shadow-claw-chat-B6uuZnJ7.js.map → shadow-claw-chat-CVc-7ycM.js.map} +1 -1
  112. package/dist/lib/{shadow-claw-control-plane-BpRcl312.js → shadow-claw-control-plane-B5vsF91B.js} +6 -6
  113. package/dist/lib/{shadow-claw-control-plane-BpRcl312.js.map → shadow-claw-control-plane-B5vsF91B.js.map} +1 -1
  114. package/dist/lib/{shadow-claw-conversations-Dc_Xk2mB.js → shadow-claw-conversations-PGK5zqn3.js} +54 -12
  115. package/dist/lib/{shadow-claw-conversations-Dc_Xk2mB.js.map → shadow-claw-conversations-PGK5zqn3.js.map} +1 -1
  116. package/dist/lib/{shadow-claw-file-viewer-C4x1PtB2.js → shadow-claw-file-viewer-DSqn0hgx.js} +6 -6
  117. package/dist/lib/{shadow-claw-file-viewer-C4x1PtB2.js.map → shadow-claw-file-viewer-DSqn0hgx.js.map} +1 -1
  118. package/dist/lib/{shadow-claw-files-DhnHbXKf.js → shadow-claw-files-vOa9ZWbr.js} +6 -6
  119. package/dist/lib/{shadow-claw-files-DhnHbXKf.js.map → shadow-claw-files-vOa9ZWbr.js.map} +1 -1
  120. package/dist/lib/{shadow-claw-git-BeQ1ElUd.js → shadow-claw-git-D54Z85Bj.js} +4 -4
  121. package/dist/lib/{shadow-claw-git-BeQ1ElUd.js.map → shadow-claw-git-D54Z85Bj.js.map} +1 -1
  122. package/dist/lib/{shadow-claw-integrations-Bbdolk3w.js → shadow-claw-integrations-BTubMH9d.js} +2 -2
  123. package/dist/lib/{shadow-claw-integrations-Bbdolk3w.js.map → shadow-claw-integrations-BTubMH9d.js.map} +1 -1
  124. package/dist/lib/{shadow-claw-llm-DPda4L3C.js → shadow-claw-llm-8koGTNYs.js} +3 -3
  125. package/dist/lib/{shadow-claw-llm-DPda4L3C.js.map → shadow-claw-llm-8koGTNYs.js.map} +1 -1
  126. package/dist/lib/{shadow-claw-mcp-remote-Dn9c30WI.js → shadow-claw-mcp-remote-C2jwBsQt.js} +2 -2
  127. package/dist/lib/{shadow-claw-mcp-remote-Dn9c30WI.js.map → shadow-claw-mcp-remote-C2jwBsQt.js.map} +1 -1
  128. package/dist/lib/{shadow-claw-networking-zqNuyn3-.js → shadow-claw-networking-BV-rna16.js} +2 -2
  129. package/dist/lib/{shadow-claw-networking-zqNuyn3-.js.map → shadow-claw-networking-BV-rna16.js.map} +1 -1
  130. package/dist/lib/{shadow-claw-notifications-DFgdo33v.js → shadow-claw-notifications-Dku7VBLk.js} +2 -2
  131. package/dist/lib/{shadow-claw-notifications-DFgdo33v.js.map → shadow-claw-notifications-Dku7VBLk.js.map} +1 -1
  132. package/dist/lib/{shadow-claw-page-header-B7LFGQRf.js → shadow-claw-page-header-VPjYWfsT.js} +2 -2
  133. package/dist/lib/{shadow-claw-page-header-B7LFGQRf.js.map → shadow-claw-page-header-VPjYWfsT.js.map} +1 -1
  134. package/dist/lib/{shadow-claw-pages-DLspFqdK.js → shadow-claw-pages-DXrM6hgZ.js} +29 -19
  135. package/dist/lib/shadow-claw-pages-DXrM6hgZ.js.map +1 -0
  136. package/dist/lib/{shadow-claw-peerjs-D8xWwuWR.js → shadow-claw-peerjs-D3xonez5.js} +3 -3
  137. package/dist/lib/{shadow-claw-peerjs-D8xWwuWR.js.map → shadow-claw-peerjs-D3xonez5.js.map} +1 -1
  138. package/dist/lib/{shadow-claw-settings-NbvzXASD.js → shadow-claw-settings-DMTx6OS9.js} +5 -5
  139. package/dist/lib/{shadow-claw-settings-NbvzXASD.js.map → shadow-claw-settings-DMTx6OS9.js.map} +1 -1
  140. package/dist/lib/{shadow-claw-storage-B_NAoZmd.js → shadow-claw-storage-BJLnukxa.js} +3 -3
  141. package/dist/lib/{shadow-claw-storage-B_NAoZmd.js.map → shadow-claw-storage-BJLnukxa.js.map} +1 -1
  142. package/dist/lib/{shadow-claw-task-server-BaQJXhYJ.js → shadow-claw-task-server-DcMj20hD.js} +2 -2
  143. package/dist/lib/{shadow-claw-task-server-BaQJXhYJ.js.map → shadow-claw-task-server-DcMj20hD.js.map} +1 -1
  144. package/dist/lib/{shadow-claw-tasks-CAZua0-j.js → shadow-claw-tasks-BQBe4lVi.js} +7 -7
  145. package/dist/lib/{shadow-claw-tasks-CAZua0-j.js.map → shadow-claw-tasks-BQBe4lVi.js.map} +1 -1
  146. package/dist/lib/{shadow-claw-terminal-B2YJhkJL.js → shadow-claw-terminal-DPEzTxXv.js} +2 -2
  147. package/dist/lib/{shadow-claw-terminal-B2YJhkJL.js.map → shadow-claw-terminal-DPEzTxXv.js.map} +1 -1
  148. package/dist/lib/{shadow-claw-tools-CkZWxxTm.js → shadow-claw-tools-BCnU8FaK.js} +6 -6
  149. package/dist/lib/{shadow-claw-tools-CkZWxxTm.js.map → shadow-claw-tools-BCnU8FaK.js.map} +1 -1
  150. package/dist/lib/{shadow-claw-webvm-BL9cgrP9.js → shadow-claw-webvm-CnW-hoJ8.js} +2 -2
  151. package/dist/lib/{shadow-claw-webvm-BL9cgrP9.js.map → shadow-claw-webvm-CnW-hoJ8.js.map} +1 -1
  152. package/dist/lib/subsystems/mcp/webmcp.d.ts +15 -2
  153. package/dist/lib/{sync-web-mcp-registration-dW2MVCj4.js → sync-web-mcp-registration-DwpGjVdo.js} +10 -4
  154. package/dist/lib/sync-web-mcp-registration-DwpGjVdo.js.map +1 -0
  155. package/dist/lib/{tools-D7whby3H.js → tools-CP6G0HF7.js} +5 -6
  156. package/dist/lib/tools-CP6G0HF7.js.map +1 -0
  157. package/dist/lib/{trusted-types-d0cdkut_.js → trusted-types-0cu5Dm6M.js} +29 -4
  158. package/dist/lib/{trusted-types-d0cdkut_.js.map → trusted-types-0cu5Dm6M.js.map} +1 -1
  159. package/dist/lib/utils/index.d.ts +1 -0
  160. package/dist/lib/utils/index.js +4 -2
  161. package/dist/lib/utils/index.js.map +1 -1
  162. package/dist/lib/utils/resolve-page-script-dependencies.d.ts +19 -0
  163. package/dist/lib/utils/resolve-page-script-dependencies.js +98 -0
  164. package/dist/lib/utils/resolve-page-script-dependencies.js.map +1 -0
  165. package/dist/lib/utils/utils.js +1 -1
  166. package/dist/lib/webmcp-Bf9rT7uu.js +2001 -0
  167. package/dist/lib/webmcp-Bf9rT7uu.js.map +1 -0
  168. package/dist/public/.well-known/mcp/server-card.json +1 -1
  169. package/dist/public/.well-known/mcp.json +1 -1
  170. package/dist/public/AGENTS.md +3 -3
  171. package/dist/public/README.md +1 -1
  172. package/dist/public/agent.worker.js +2 -2
  173. package/dist/public/components/shadow-claw/shadow-claw.css +1 -1
  174. package/dist/public/components/shadow-claw/shadow-claw.html +1 -1
  175. package/dist/public/components/shadow-claw-conversations/shadow-claw-conversations.css +1 -1
  176. package/dist/public/components/shadow-claw-conversations/shadow-claw-conversations.html +1 -1
  177. package/dist/public/{configure-peer-js-WLRM7Qa7.js → configure-peer-js-OYl3V8sW.js} +1 -1
  178. package/dist/public/{custom-element-security-Cl991z-x.js → custom-element-security-BR4V40j4.js} +1 -1
  179. package/dist/public/docs/example/article/index.html +3 -3
  180. package/dist/public/docs/example/article.html +3 -3
  181. package/dist/public/docs/publishing/index.html +3 -3
  182. package/dist/public/docs/publishing.html +3 -3
  183. package/dist/public/docs/skill-creator/index.html +3 -3
  184. package/dist/public/docs/skill-creator.html +3 -3
  185. package/dist/public/docs/subsystems/custom-element-security.md +19 -5
  186. package/dist/public/docs/subsystems/pages.md +10 -2
  187. package/dist/public/docs/subsystems/tools.md +1 -2
  188. package/dist/public/docs/subsystems/webmcp.md +41 -6
  189. package/dist/public/{download-group-file-fFjoIIp4.js → download-group-file-BNmK8wac.js} +1 -1
  190. package/dist/public/e2e/README.md +2 -2
  191. package/dist/public/{e2e-bridge-CiSfBRT4.js → e2e-bridge-4phD1JUQ.js} +1 -1
  192. package/dist/public/{file-viewer-DFC3kfeO.js → file-viewer-Dbh3K9nL.js} +1 -1
  193. package/dist/public/index.html +3 -3
  194. package/dist/public/index.js +1 -1
  195. package/dist/public/{init-control-plane-BEbcwmmv.js → init-control-plane-DGOY_RNS.js} +1 -1
  196. package/dist/public/llms.txt +1 -1
  197. package/dist/public/main/index.html +3 -3
  198. package/dist/public/main/memory/index.html +3 -3
  199. package/dist/public/main/memory.html +3 -3
  200. package/dist/public/main.html +3 -3
  201. package/dist/public/{markdown-BeglYzw9.js → markdown-BPZYpfGm.js} +1 -1
  202. package/dist/public/{orchestrator-BlvEG3PO.js → orchestrator-OoUK7CF9.js} +1 -1
  203. package/dist/public/{orchestrator-DTNrntd4.js → orchestrator-a9047bGu.js} +1 -1
  204. package/dist/public/{peerjs-CnBdK94R.js → peerjs-Cbn310Tz.js} +1 -1
  205. package/dist/public/{push-client-DOHbdCyj.js → push-client-Dy4LGJy9.js} +1 -1
  206. package/dist/public/service-worker.js +1 -1
  207. package/dist/public/shadow-claw-B-HWC1uN.js +1180 -0
  208. package/dist/public/{shadow-claw-accounts-C6FXVw2K.js → shadow-claw-accounts-Di-anCZ1.js} +1 -1
  209. package/dist/public/{shadow-claw-channels-tr_r60Kq.js → shadow-claw-channels-RVwCE8pE.js} +1 -1
  210. package/dist/public/{shadow-claw-chat-BAAPhAOs.js → shadow-claw-chat-DI1q8UnX.js} +1 -1
  211. package/dist/public/{shadow-claw-control-plane-C_5VIx8E.js → shadow-claw-control-plane-KXEdLOGl.js} +2 -2
  212. package/dist/public/{shadow-claw-conversations-DGYZdDa3.js → shadow-claw-conversations-BCBGtS30.js} +40 -6
  213. package/dist/public/{shadow-claw-file-viewer-5j2-Z3fN.js → shadow-claw-file-viewer-CW3t6j-w.js} +1 -1
  214. package/dist/public/{shadow-claw-files-DKF4Yy0m.js → shadow-claw-files-JQ-o0ImX.js} +1 -1
  215. package/dist/public/{shadow-claw-git-CtUTJXKT.js → shadow-claw-git-D2M8VixW.js} +2 -2
  216. package/dist/public/{shadow-claw-integrations-CuBy9D3z.js → shadow-claw-integrations-Cgw6v9_1.js} +1 -1
  217. package/dist/public/{shadow-claw-llm-BIfNNjGL.js → shadow-claw-llm-74ieXp7i.js} +1 -1
  218. package/dist/public/{shadow-claw-mcp-remote-C17FXvrb.js → shadow-claw-mcp-remote-BX0BkSmy.js} +1 -1
  219. package/dist/public/{shadow-claw-networking-CjxQ1CLI.js → shadow-claw-networking-DNX8vaIQ.js} +1 -1
  220. package/dist/public/{shadow-claw-notifications-Brn2O3Ps.js → shadow-claw-notifications-BLTaGAny.js} +1 -1
  221. package/dist/public/{shadow-claw-page-header-Bn1P7Cxb.js → shadow-claw-page-header-CjFOdo9v.js} +1 -1
  222. package/dist/public/shadow-claw-pages-DOQqMm0_.js +645 -0
  223. package/dist/public/{shadow-claw-settings-CfDm0hVA.js → shadow-claw-settings-DFtl0Fy8.js} +2 -2
  224. package/dist/public/{shadow-claw-storage-DOOesRzw.js → shadow-claw-storage-gQGExZRq.js} +1 -1
  225. package/dist/public/{shadow-claw-task-server-H36iDDp2.js → shadow-claw-task-server-Ca45uY7S.js} +1 -1
  226. package/dist/public/{shadow-claw-tasks-4JsjSGkN.js → shadow-claw-tasks-CCTaaSdi.js} +1 -1
  227. package/dist/public/{shadow-claw-terminal-CTRTcYz-.js → shadow-claw-terminal-BfgulLkl.js} +1 -1
  228. package/dist/public/{shadow-claw-tools-Dm1LxNf4.js → shadow-claw-tools-V8NA4n18.js} +1 -1
  229. package/dist/public/{shadow-claw-webvm-JzuPe9Nr.js → shadow-claw-webvm-CxxI2bnC.js} +1 -1
  230. package/dist/public/sync-web-mcp-registration-CkCA8UFm.js +1 -0
  231. package/dist/public/{tools-FiTtOlIt.js → tools-CwQq5tJH.js} +2 -2
  232. package/dist/public/webmcp-CmtWOAFm.js +6 -0
  233. package/dist/server.js +2 -2
  234. package/package.json +3 -3
  235. package/src/cli/prerender/dsd-shell/prerender-dsd-shell.test.ts +16 -0
  236. package/src/cli/prerender/dsd-shell/prerender-dsd-shell.ts +62 -1
  237. package/src/cli/prerender/pretty-paths/prerender-pretty-paths.test.ts +277 -0
  238. package/src/cli/prerender/pretty-paths/prerender-pretty-paths.ts +28 -1
  239. package/src/cli/site-config/custom-elements/build-custom-element-script-tags.ts +13 -1
  240. package/src/components/shadow-claw/shadow-claw.css +12 -0
  241. package/src/components/shadow-claw/shadow-claw.html +12 -2
  242. package/src/components/shadow-claw/utils/bind-event-listeners.test.ts +18 -0
  243. package/src/components/shadow-claw/utils/bind-event-listeners.ts +14 -0
  244. package/src/components/shadow-claw/utils/get-route.test.ts +35 -0
  245. package/src/components/shadow-claw/utils/get-route.ts +18 -0
  246. package/src/components/shadow-claw/utils/sync-slotted-sidebar-active-links.test.ts +152 -1
  247. package/src/components/shadow-claw/utils/sync-slotted-sidebar-active-links.ts +139 -8
  248. package/src/components/shadow-claw-conversations/shadow-claw-conversations.css +11 -0
  249. package/src/components/shadow-claw-conversations/shadow-claw-conversations.html +27 -4
  250. package/src/components/shadow-claw-conversations/shadow-claw-conversations.ts +32 -4
  251. package/src/components/shadow-claw-pages/shadow-claw-pages-scripts.test.ts +266 -0
  252. package/src/components/shadow-claw-pages/shadow-claw-pages.ts +41 -17
  253. package/src/core/orchestrator/utils/sync-web-mcp-registration.test.ts +18 -1
  254. package/src/core/orchestrator/utils/sync-web-mcp-registration.ts +8 -0
  255. package/src/core/utils/init-control-plane.test.ts +9 -4
  256. package/src/security/custom-element-security.test.ts +65 -0
  257. package/src/security/custom-element-security.ts +67 -4
  258. package/src/stores/tools.test.ts +5 -3
  259. package/src/stores/tools.ts +5 -10
  260. package/src/subsystems/mcp/webmcp.test.ts +84 -13
  261. package/src/subsystems/mcp/webmcp.ts +73 -10
  262. package/src/utils/index.ts +1 -0
  263. package/src/utils/resolve-page-script-dependencies.test.ts +245 -0
  264. package/src/utils/resolve-page-script-dependencies.ts +198 -0
  265. package/dist/cli/chunk-B1hufJeO.js +0 -1
  266. package/dist/cli/chunk-BZpn8npn.js +0 -1
  267. package/dist/cli/chunk-Bw5aOTFr.js +0 -1
  268. package/dist/cli/chunk-C8nH01Gw.js +0 -32
  269. package/dist/cli/chunk-CK1ZoyoE.js +0 -17
  270. package/dist/cli/chunk-CVkhDr-7.js +0 -1
  271. package/dist/cli/chunk-Cum07Vlh.js +0 -1
  272. package/dist/cli/chunk-D3UhDDmV.js +0 -2
  273. package/dist/cli/chunk-D8GI6qj6.js +0 -1
  274. package/dist/cli/chunk-DEH-FvmP.js +0 -1
  275. package/dist/cli/chunk-DksvJ_kf.js +0 -1
  276. package/dist/cli/chunk-RGb9wM4R.js +0 -1
  277. package/dist/lib/shadow-claw-PdOpgTxH.js.map +0 -1
  278. package/dist/lib/shadow-claw-pages-DLspFqdK.js.map +0 -1
  279. package/dist/lib/sync-web-mcp-registration-dW2MVCj4.js.map +0 -1
  280. package/dist/lib/tools-D7whby3H.js.map +0 -1
  281. package/dist/lib/webmcp-CYTNZfkn.js +0 -1687
  282. package/dist/lib/webmcp-CYTNZfkn.js.map +0 -1
  283. package/dist/public/shadow-claw-CnNX-WCh.js +0 -1158
  284. package/dist/public/shadow-claw-pages-BwOOqRWW.js +0 -645
  285. package/dist/public/sync-web-mcp-registration-BnHVUjat.js +0 -1
  286. package/dist/public/webmcp-_TBqXlVW.js +0 -1
@@ -1,1158 +0,0 @@
1
- import{r as e}from"./config-y_2Fg77m.js";import{a as t,d as n,h as r,l as i,m as a,n as o,r as s}from"./app-routes-H23VN-4O.js";import{r as c}from"./db-BUuJo1Gf.js";import{t as l}from"./get-config-Bkvl__ZS.js";import{t as u}from"./dist-CeFyqf9k.js";import{D as d,Dn as f,Tn as p,V as m,c as h,d as g,ft as _,i as ee,l as te,t as v,tn as ne,ut as re,wt as y,xt as ie}from"./orchestrator-BlvEG3PO.js";import{a as ae}from"./tools-FiTtOlIt.js";import{t as oe}from"./set-config-DSiuMe0k.js";import{t as b}from"./ulid-BSJxYh6W.js";import{t as se}from"./parse-boolean-config-BigJ9U46.js";import{a as x,r as S}from"./toast-CtIuHprH.js";import{n as ce,r as le,t as ue}from"./constants-DiETpg52.js";import{t as de}from"./shadow-claw-element-DIrv3P6A.js";import{t as C}from"./effect-xrx5qhzv.js";import{t as fe}from"./prompt-api-BWe_j3Wg.js";import{t as w}from"./configure-peer-js-WLRM7Qa7.js";import{t as T}from"./file-viewer-DFC3kfeO.js";const E={Light:`light`,Dark:`dark`,System:`system`},D=`shadow-claw-theme`;function O(){return typeof window.matchMedia==`function`&&window.matchMedia(`(prefers-color-scheme: dark)`).matches?`dark`:`light`}function k(e){return e===`system`?O():e}function A(e){let t=document.documentElement;e===`dark`?(t.classList.add(`dark-mode`),t.classList.remove(`light-mode`)):(t.classList.add(`light-mode`),t.classList.remove(`dark-mode`));let n=document.querySelector(`shadow-claw`);n&&(e===`dark`?(n.classList.add(`dark-mode`),n.classList.remove(`light-mode`)):(n.classList.add(`light-mode`),n.classList.remove(`dark-mode`))),window.dispatchEvent(new CustomEvent(`shadow-claw-theme-change`,{detail:{theme:e}}))}const pe=h(D)||`system`,me=k(pe);A(me);const j=new class{_resolved;_theme;constructor(){this._theme=new u.State(pe),this._resolved=new u.State(me)}getTheme(){return{theme:this.theme,resolved:this.resolved}}init(){typeof window.matchMedia==`function`&&window.matchMedia(`(prefers-color-scheme: dark)`).addEventListener(`change`,()=>{let e=O();g(D,`system`),A(e),this._theme.set(`system`),this._resolved.set(e)}),window.addEventListener(`storage`,e=>{let t=te(D);e.key===t&&e.newValue&&this.setTheme(e.newValue)})}get resolved(){return this._resolved.get()}setTheme(e){let t=k(e);g(D,e),A(t),this._theme.set(e),this._resolved.set(t)}get theme(){return this._theme.get()}};j.init();async function M(e,t=3){for(let n=0;n<t;n++){if(e())return;await new Promise(e=>{requestAnimationFrame(()=>e())})}}function N(e,t){let n=e.sidebarDefaultPage,r=[n,`pages`,`chat`,`tasks`,`files`];if(!t)return n===`pages`||n===`chat`||n===`tasks`||n===`files`?n:`chat`;for(let e of r){if(e===`pages`&&!t.pagesSidebarHidden)return`pages`;if(e===`chat`&&!t.chatSidebarHidden)return`chat`;if(e===`tasks`&&!t.tasksSidebarHidden)return`tasks`;if(e===`files`&&!t.filesSidebarHidden)return`files`}return`pages`}function he(e,t,n){return n&&t===`pages`?N(e):t}function ge(e,t){if(!e||![`chat`,`tasks`,`files`].includes(t))return null;let n=e.querySelector(`[data-page-id="${t}"]`);if(!(n instanceof HTMLElement))return null;let r=n.querySelector(`shadow-claw-chat, shadow-claw-tasks, shadow-claw-files`),i=r instanceof HTMLElement?r.shadowRoot?.querySelector(`[data-terminal-slot]`):null;return i instanceof HTMLElement?i:null}function _e(e,t,n,r){let i=n;if(!i)return;let a=ge(e,t);if(!a)return;i.parentElement!==a&&a.appendChild(i);let o=!r;i.hidden=o,o?(a.setAttribute(`hidden`,`hidden`),e?.querySelector(`shadow-claw-terminal`)?.setAttribute(`hidden`,`hidden`)):(a.removeAttribute(`hidden`),e?.querySelector(`shadow-claw-terminal`)?.removeAttribute(`hidden`))}const ve={pages:()=>import(`./shadow-claw-pages-BwOOqRWW.js`),chat:()=>import(`./shadow-claw-chat-BAAPhAOs.js`),tasks:()=>import(`./shadow-claw-tasks-4JsjSGkN.js`),files:()=>import(`./shadow-claw-files-DKF4Yy0m.js`),settings:()=>import(`./shadow-claw-settings-CfDm0hVA.js`),tools:()=>import(`./shadow-claw-tools-Dm1LxNf4.js`),channels:()=>import(`./shadow-claw-channels-tr_r60Kq.js`),terminal:()=>import(`./shadow-claw-terminal-CTRTcYz-.js`),"file-viewer":()=>import(`./shadow-claw-file-viewer-5j2-Z3fN.js`),"pdf-viewer":()=>import(`./shadow-claw-pdf-viewer-BtDKlBOs.js`)},P=/* @__PURE__ */ new Map;async function F(e){let t=P.get(e);if(!t){let n=ve[e];n?(t=n().then(()=>void 0),P.set(e,t)):t=Promise.resolve()}await t}function I(e,t,n,r,i){r&&F(`terminal`).catch(console.error),i!==null&&cancelAnimationFrame(i),i=requestAnimationFrame(()=>{i=null,_e(e,t,n,r)})}function ye(e){if(!e)return[];let t=[`shadow-claw-chat`,`shadow-claw-tasks`,`shadow-claw-files`,`shadow-claw-pages`,`shadow-claw-settings`,`shadow-claw-tools`,`shadow-claw-channels`],n=[];for(let r of t){let t=e.querySelector(r);if(!(t instanceof HTMLElement))continue;let i=t.shadowRoot?.querySelector(`shadow-claw-page-header`);i instanceof HTMLElement&&n.push(i)}return n}function L(e,t){if(e)for(let n of ye(e))n.setMainCollapsedOverride?.(t)}function R(e,t,n){if(!e)return;let r=e.querySelector(`.activity-log-toggle`);r instanceof HTMLButtonElement&&(r.hidden=t!==`chat`||n===0)}function z(e){if(!e)return null;let t=e.querySelector(`.page.active`);if(!(t instanceof HTMLElement))return null;let n=t.querySelector(`shadow-claw-chat, shadow-claw-tasks, shadow-claw-files, shadow-claw-pages, shadow-claw-settings, shadow-claw-tools, shadow-claw-channels`);if(!(n instanceof HTMLElement))return null;let r=n.shadowRoot?.querySelector(`shadow-claw-page-header`);return r instanceof HTMLElement?r:null}function B(e,t){if(!e)return;let n=e.querySelector(`.header-main-toggle`);if(!(n instanceof HTMLButtonElement))return;let r=typeof t==`boolean`?t:z(e)?.isMainCollapsed?.()??!1;n.setAttribute(`aria-label`,r?`Show action header`:`Hide action header`),n.setAttribute(`title`,r?`Show action header`:`Hide action header`),n.setAttribute(`aria-pressed`,String(r))}function V(e,t,n,r){if(!e)return;let i=e.querySelector(`.webvm-toggle`);if(!(i instanceof HTMLButtonElement))return;let a=t===`chat`||t===`files`;i.hidden=!a,i.classList.toggle(`hidden`,!a),i.classList.remove(`webvm-toggle--hidden`,`webvm-toggle--visible`,`webvm-toggle--booting`,`webvm-toggle--ready`,`webvm-toggle--error`),a?(i.classList.add(n?`webvm-toggle--visible`:`webvm-toggle--hidden`),r.ready?i.classList.add(`webvm-toggle--ready`):(r.booting||r.bootAttempted)&&i.classList.add(`webvm-toggle--booting`),i.setAttribute(`aria-label`,n?`Hide WebVM terminal`:`Show WebVM terminal`),i.setAttribute(`title`,n?`Hide WebVM terminal`:`Show WebVM terminal`),i.setAttribute(`aria-pressed`,String(n))):i.classList.add(`webvm-toggle--error`)}const H={chat:`shadow-claw-chat`,tasks:`shadow-claw-tasks`,files:`shadow-claw-files`,settings:`shadow-claw-settings`,tools:`shadow-claw-tools`,channels:`shadow-claw-channels`};function U(e,t){let n=H[t];if(!n)return;let r=e.querySelector(`[data-page-id="${t}"]`);!r||r.children.length>0||r.appendChild(document.createElement(n))}function W(e,t,n,r,i,a=!0){if(!e)return;let o=he(r,i,t.pagesSidebarHidden),s=!!t.chatSplitViewEnabled&&o!==`chat`,c=e.querySelector(`.main-content`),l=e.querySelector(`.chat-split-resize-handle`);if(s){let t=H.chat;t&&customElements.get(t)?U(e,`chat`):F(`chat`).then(()=>{e&&U(e,`chat`)}).catch(console.error),c&&c.classList.add(`split-chat-active`),l&&l.removeAttribute(`hidden`)}else c&&c.classList.remove(`split-chat-active`),l&&l.setAttribute(`hidden`,`hidden`);let u=H[o];u&&customElements.get(u)?U(e,o):F(o).then(()=>{e&&U(e,o)}).catch(console.error),e.querySelectorAll(`.page`).forEach(e=>{e.classList.remove(`active`)}),e.querySelectorAll(`.nav-item`).forEach(e=>{e.classList.remove(`active`)});let d=e.querySelector(`[data-page-id="${o}"]`);d&&d.classList.add(`active`);let f=e.querySelector(`[data-page="${o}"]`);f&&f.classList.add(`active`),t.currentPage=o,a&&n&&r.setActivePage(n,o).catch(console.error),I(e,t.currentPage,t.terminalElement,t.terminalVisible,t.terminalPlacementFrame),L(e,t.headerMainCollapsedOverride),B(e,t.headerMainCollapsedOverride),R(e,t.currentPage,r.activityLog.length),V(e,t.currentPage,t.terminalVisible,t.vmStatus);let p=e.querySelector(`.page.active`);if(p){let e=p;typeof e.scrollTo==`function`&&e.scrollTo(0,0)}if(o===`chat`){let t=e.querySelector(`shadow-claw-chat`);t&&typeof t.checkPromptApiOnboarding==`function`&&t.checkPromptApiOnboarding()}if(o===`files`&&n&&r.loadFiles(n).catch(console.error),o===`pages`){let t=e.querySelector(`shadow-claw-pages`);t&&typeof t.renderSelectedPage==`function`&&(t.renderSelectedPage(),typeof t.setupAutoRefreshTimer==`function`&&t.setupAutoRefreshTimer())}}function G(e,t){if(!e||typeof e.querySelectorAll!=`function`)return;let n=t||(typeof window<`u`&&window.location?.href?new URL(window.location.href):null);if(!n)return;let r=n.pathname.replace(/\/+$/,``)||`/`;e.querySelectorAll(`[slot="sidebar"] a[href], [slot="sidebar-nav"] a[href], [slot="sidebar-content"] a[href], [slot="sidebar-footer"] a[href], .sidebar-custom-sections a[href]`).forEach(e=>{try{let t=e.getAttribute(`href`)||``;if(!t||t.startsWith(`#`)||t.startsWith(`javascript:`)||t.startsWith(`mailto:`)||t.startsWith(`tel:`))return;let i=new URL(t,n.origin);if(i.origin!==n.origin){e.classList.remove(`active`),e.removeAttribute(`aria-current`);return}(i.pathname.replace(/\/+$/,``)||`/`)===r&&(i.hash?i.hash===n.hash:!n.hash)?(e.classList.add(`active`),e.setAttribute(`aria-current`,`page`)):(e.classList.remove(`active`),e.removeAttribute(`aria-current`))}catch{}})}function be(e){if(!e||typeof window>`u`)return()=>{};let t=()=>G(e);t(),window.addEventListener(`popstate`,t,{passive:!0});let n=window.navigation;return n&&typeof n.addEventListener==`function`&&n.addEventListener(`navigate`,t,{passive:!0}),()=>{window.removeEventListener(`popstate`,t),n&&typeof n.removeEventListener==`function`&&n.removeEventListener(`navigate`,t)}}async function K(e,t,n,r,i,a){let{page:o,groupId:s,path:c,anchor:l}=a;if(!n)return;let u=o?String(o).toLowerCase():``;if(u&&r.file&&(u!==`files`||!c||c!==r.file.path||s&&s!==i.activeGroupId)){let t=e?.querySelector(`shadow-claw-file-viewer`);if(t&&typeof t.requestCloseViewer==`function`){if(!await t.requestCloseViewer())return}else r.closeFile()}if(s&&s!==i.activeGroupId?await i.switchConversation(n,s,u===`chat`):s&&(i.loadHistory(),(u===`tasks`||u===`files`)&&n&&i.loadFiles(n)),u&&W(e,t,n,i,u),u===`files`&&c){if(/\.[^./]+$/u.test(c))try{await r.openFile(n,c,s||i.activeGroupId),l&&await M(()=>{let t=e?.querySelector(`shadow-claw-file-viewer`);return t&&typeof t.handleAnchorNavigation==`function`?!!t.handleAnchorNavigation(l):!1})}catch(e){console.error(`Failed to open file via route navigation:`,c,e)}else try{await i.setCurrentPath(n,c),r.closeFile()}catch(e){console.error(`Failed to open folder via route navigation:`,c,e)}}if(u===`pages`){if(typeof customElements<`u`&&await customElements.whenDefined(`shadow-claw-pages`),c){let e=s||i.activeGroupId||`br:main`;if(typeof i.isPageAllowed!=`function`||i.isPageAllowed(c,e))await i.setActivePinnedPage(n,{groupId:e,path:c});else{let e=i.effectiveDefaultPage||i.pages&&i.pages[0]||null;await i.setActivePinnedPage(n,e)}}else{let e=i.effectiveDefaultPage||i.pages&&i.pages[0]||null;e&&await i.setActivePinnedPage(n,e)}let t=e?.querySelector(`shadow-claw-pages`);t&&typeof t.renderSelectedPage==`function`&&(await t.renderSelectedPage(),typeof t.setupAutoRefreshTimer==`function`&&t.setupAutoRefreshTimer(),l&&await M(()=>typeof t.handleAnchorNavigation==`function`&&!!t.handleAnchorNavigation(l)))}G(t)}async function q(e,i,s,c,l,u){let d=u.pathname,f=t();f!==`/`&&d.startsWith(f)&&(d=`/`+d.slice(f.length));let p=d.split(`/`).filter(Boolean),m=p.length===0||p.length===1&&p[0]===`index.html`,h=l.defaultPinnedPage||a(ee()),g=h||l.effectiveDefaultPage;if(m&&g){let t={page:`pages`,groupId:g.groupId||l.activeGroupId||`br:main`,path:g.path};if(h){let e=await r(t);if(e&&e!==`/`&&typeof window<`u`&&window.history){let t=o(e);window.history.replaceState(null,``,t)}}await K(e,i,s,c,l,t);return}let _=await n(u,l.activeGroupId);_&&await K(e,i,s,c,l,_)}function J(e,t){let n=e?.querySelector(`.app-body`);if(!(n instanceof HTMLElement))return Math.max(200,Math.min(560,t));let r=Math.max(200,n.getBoundingClientRect().width-260);return Math.max(200,Math.min(Math.min(560,r),t))}async function Y(t,n){if(t)try{await oe(t,e.SIDEBAR_WIDTH,n)}catch{}}function X(e,t){let n=e?.querySelector(`.app-body`);if(!(n instanceof HTMLElement))return;let r=J(e,t);n.style.setProperty(`--sidebar-width`,`${r}px`)}async function xe(t,n,r,i){if(!t)return;let a=t.querySelector(`.sidebar-resize-handle`);if(!(a instanceof HTMLElement))return;a.setAttribute(`tabindex`,`0`),a.setAttribute(`role`,`separator`),a.setAttribute(`aria-orientation`,`vertical`),a.setAttribute(`aria-label`,`Resize sidebar width`);let o=()=>{let e=t.querySelector(`.app-body`);if(!(e instanceof HTMLElement))return 250;let n=parseFloat(e.style.getPropertyValue(`--sidebar-width`));return Number.isFinite(n)&&n>0?n:r.getBoundingClientRect().width||250},s=()=>{let e=Math.round(J(t,o())),n=Math.round(J(t,2**53-1));a.setAttribute(`aria-valuemin`,`200`),a.setAttribute(`aria-valuemax`,String(n)),a.setAttribute(`aria-valuenow`,String(e))};try{let n=i?await l(i,e.SIDEBAR_WIDTH):void 0;typeof n==`number`&&Number.isFinite(n)&&n>0?X(t,n):X(t,250)}catch{X(t,250)}let c=null,u=0,d=0,f=e=>{if(e.pointerId!==c)return;let n=e.clientX-u;X(t,d+n),s()},p=()=>{if(c===null)return;c=null,a.classList.remove(`active`),document.removeEventListener(`pointermove`,f);let e=t.querySelector(`.app-body`);if(e instanceof HTMLElement){let t=parseFloat(e.style.getPropertyValue(`--sidebar-width`));Number.isFinite(t)&&t>0&&i&&Y(i,t)}},m=e=>{e.pointerId===c&&p()};a.addEventListener(`pointerdown`,e=>{(e.pointerType!==`mouse`||e.button===0||e.button===-1)&&(window.innerWidth<896||(e.preventDefault(),c=e.pointerId,u=e.clientX,d=r.getBoundingClientRect().width,a.classList.add(`active`),a.setPointerCapture(e.pointerId),document.addEventListener(`pointermove`,f)))}),a.addEventListener(`pointerup`,m),a.addEventListener(`pointercancel`,p),a.addEventListener(`dblclick`,()=>{X(t,250),i&&Y(i,250),s()}),a.addEventListener(`keydown`,e=>{if(window.innerWidth<896)return;let n=e.shiftKey?32:12,r=o(),a=null;e.key===`ArrowRight`?a=r+n:e.key===`ArrowLeft`?a=r-n:e.key===`Home`?a=200:e.key===`End`&&(a=J(t,2**53-1)),a!==null&&(e.preventDefault(),X(t,a),s(),i&&Y(i,J(t,o())))}),s(),n.addCleanup(()=>{p(),a.removeEventListener(`pointerup`,m),a.removeEventListener(`pointercancel`,p)})}async function Z(e,t,n){if(!t)return!1;let r=t.querySelector(`.app-dialog`),i=t.querySelector(`.app-dialog__title`),a=t.querySelector(`.app-dialog__message`),o=t.querySelector(`.app-dialog__details`),s=t.querySelector(`.app-dialog__links`),c=t.querySelector(`.app-dialog__btn--confirm`),l=t.querySelector(`.app-dialog__btn--cancel`),u=t.querySelector(`.app-dialog__countdown`);if(!r||!i||!a||!o||!s||!c||!l)return!1;r._autoCloseTimer&&=(clearInterval(r._autoCloseTimer),null),r.open&&r.close(),i.textContent=n.title,a.textContent=n.message,o.replaceChildren(),s.replaceChildren();let d=Array.isArray(n.details)?n.details:[];o.hidden=d.length===0;for(let t of d){let n=e.createElement(`li`);n.textContent=t,o.appendChild(n)}let f=Array.isArray(n.links)?n.links:[];s.hidden=f.length===0;for(let t of f){let n=e.createElement(`a`);n.className=`app-dialog__link`,n.href=t.href,n.rel=`noreferrer`,n.target=`_blank`,n.textContent=t.label,s.appendChild(n)}let p=n.mode||`confirm`,m=n.confirmLabel||(p===`info`?`OK`:`Confirm`);l.textContent=n.cancelLabel||`Cancel`,l.hidden=p===`info`;let h=null,g=()=>{h&&=(clearInterval(h),null),r._autoCloseTimer&&=null};if(typeof n.autoCloseSeconds==`number`&&n.autoCloseSeconds>0){let e=Math.max(1,Math.round(n.autoCloseSeconds));c.textContent=`${m} (${e}s)`,u&&(u.hidden=!1,u.textContent=`Auto-closing in ${e}s...`,u.setAttribute(`role`,`status`),u.setAttribute(`aria-live`,`polite`),u.setAttribute(`aria-atomic`,`true`)),h=setInterval(()=>{e--,e>0?(c.textContent=`${m} (${e}s)`,u&&(u.textContent=`Auto-closing in ${e}s...`)):(g(),r.returnValue=p===`info`?`confirm`:`cancel`,r.close(r.returnValue))},1e3),r._autoCloseTimer=h}else c.textContent=m,u&&(u.hidden=!0,u.textContent=``);return r.returnValue=``,await new Promise(e=>{let t=()=>{g(),r.removeEventListener(`close`,t),e(r.returnValue===`confirm`)};r.addEventListener(`close`,t),r.showModal()})}const Se={pages:e.SIDEBAR_PAGES_HIDDEN,chat:e.SIDEBAR_CHAT_HIDDEN,tasks:e.SIDEBAR_TASKS_HIDDEN,files:e.SIDEBAR_FILES_HIDDEN};function Ce(e,t,n){if(!e)return;let r=e.querySelector(`.nav-item[data-page="${t}"]`);if(r&&(r.hidden=n,r.setAttribute(`aria-hidden`,String(n))),t===`chat`){let t=e.querySelector(`shadow-claw-conversations`);t&&(t.hidden=n,t.setAttribute(`aria-hidden`,String(n)))}}function we(e){switch(e){case`pages`:return`pagesSidebarHidden`;case`chat`:return`chatSidebarHidden`;case`tasks`:return`tasksSidebarHidden`;case`files`:return`filesSidebarHidden`}}async function Te(e,t,n,r){for(let[n,i]of Object.entries(Se)){let a=n,o=!1;if(r)try{let e=await l(r,i);o=se(e)}catch{o=!1}let s=we(a);t[s]=o,Ce(e,a,o)}}function Q(e,t,n,r,i,a){switch(i){case`pages`:t.pagesSidebarHidden=a;break;case`chat`:t.chatSidebarHidden=a;break;case`tasks`:t.tasksSidebarHidden=a;break;case`files`:t.filesSidebarHidden=a}Ce(e,i,a),a&&t.currentPage===i&&W(e,t,r,n,N(n,t))}function Ee(e,t,n,r,i){Q(e,t,n,r,`pages`,i)}function De(){let e=window.navigation;return!!(e&&typeof e.addEventListener==`function`&&typeof e.navigate==`function`)}function Oe(e,t,n,r={}){let i=r.debounceMs??250,a=r.minSleepDurationMs??1e3,o=0,s=null,c=!1,l=e=>{e&&(c=!0),s!==null&&clearTimeout(s),s=setTimeout(()=>{s=null;let e=c;c=!1,n.ensureAllConnections({force:e})},i)},u=()=>{s!==null&&(clearTimeout(s),s=null),c=!1},d=()=>{if(t.visibilityState===`hidden`)o=Date.now(),u();else if(t.visibilityState===`visible`){let e=o>0&&Date.now()-o>=a;l(e)}},f=e=>{let n=!!(e&&e.persisted);l(n||t.visibilityState===`visible`)},p=()=>{t.visibilityState===`visible`&&l(!1)},m=()=>{l(!0)};return t.addEventListener(`visibilitychange`,d),e.addEventListener(`pageshow`,f),e.addEventListener(`focus`,p),e.addEventListener(`online`,m),()=>{u(),t.removeEventListener(`visibilitychange`,d),e.removeEventListener(`pageshow`,f),e.removeEventListener(`focus`,p),e.removeEventListener(`online`,m)}}function ke(e,t){if(!e)return;let n=e.querySelector(`shadow-claw-chat`);n&&typeof n.setActivityLogCollapsedOverride==`function`&&n.setActivityLogCollapsedOverride(t)}function Ae(e,t){if(!e)return;let n=e.querySelector(`.activity-log-toggle`);if(!(n instanceof HTMLButtonElement))return;let r=typeof globalThis.matchMedia==`function`&&!globalThis.matchMedia(`(min-width: 56rem) and (min-height: 401px)`).matches,i=typeof t==`boolean`?t:r;n.setAttribute(`aria-label`,i?`Show activity log`:`Hide activity log`),n.setAttribute(`title`,i?`Show activity log`:`Hide activity log`),n.setAttribute(`aria-pressed`,String(i))}function je(e){let t=typeof globalThis.matchMedia==`function`&&!globalThis.matchMedia(`(min-width: 56rem) and (min-height: 401px)`).matches;e.activityLogCollapsedOverride=!(typeof e.activityLogCollapsedOverride==`boolean`?e.activityLogCollapsedOverride:t),ke(e.shadowRoot,e.activityLogCollapsedOverride),Ae(e.shadowRoot,e.activityLogCollapsedOverride)}function Me(e){e.headerMainCollapsedOverride=!(typeof e.headerMainCollapsedOverride==`boolean`?e.headerMainCollapsedOverride:z(e.shadowRoot)?.isMainCollapsed?.()??!1),L(e.shadowRoot,e.headerMainCollapsedOverride),B(e.shadowRoot,e.headerMainCollapsedOverride)}function Ne(e,t){t.terminalVisible=!t.terminalVisible,V(e,t.currentPage,t.terminalVisible,t.vmStatus),I(e,t.currentPage,t.terminalElement,t.terminalVisible,t.terminalPlacementFrame)}function Pe(e,t){e===E.Dark?(t.add(`dark-mode`),t.remove(`light-mode`)):(t.add(`light-mode`),t.remove(`dark-mode`))}function Fe(e,t){if(!e)return;let n=e.querySelector(`.sun-icon`),r=e.querySelector(`.moon-icon`);n&&r&&(t===E.Dark?(n.style.display=`block`,n.removeAttribute(`hidden`),n.classList.remove(`hidden`),r.style.display=`none`,r.setAttribute(`hidden`,`hidden`),r.classList.add(`hidden`)):(n.style.display=`none`,n.setAttribute(`hidden`,`hidden`),n.classList.add(`hidden`),r.style.display=`block`,r.removeAttribute(`hidden`),r.classList.remove(`hidden`)))}function Ie(e,t,n,r,i,a,o,s,c){if(!n||!e||!t)return;n.querySelectorAll(`.nav-item[data-page]`).forEach(e=>{let r=e;r.addEventListener(`click`,()=>{let e=r.dataset.page||N(a);n.querySelectorAll(`.nav-item`).forEach(e=>e.classList.remove(`active`)),r.classList.add(`active`),setTimeout(()=>{t.dispatchEvent(new CustomEvent(`shadow-claw-navigate`,{detail:{page:e},bubbles:!0,composed:!0}))},0)})});let l=n.getElementById(`menu-button`),u=n.querySelector(`.sidebar`);if(l&&u){l.addEventListener(`click`,()=>{u.classList.toggle(`open`)}),n.querySelectorAll(`.nav-item, .settings-btn`).forEach(t=>{t.addEventListener(`click`,()=>{e.innerWidth<896&&u.classList.remove(`open`)})}),u.addEventListener(`click`,t=>{let n=t.target;e.innerWidth<896&&n?.closest(`a, button, .nav-item, .sidebar-link, .sidebar-item`)&&u.classList.remove(`open`)}),typeof r?.addEventListener==`function`&&r.addEventListener(`click`,t=>{let n=t.target;e.innerWidth<896&&n?.closest(`[slot^="sidebar"] a, .sidebar-custom-sections a`)&&u.classList.remove(`open`)}),t.addEventListener(`click`,t=>{let n=t.composedPath();e.innerWidth<896&&u.classList.contains(`open`)&&!n.includes(u)&&!n.includes(l)&&u.classList.remove(`open`)});let a=e.matchMedia?e.matchMedia(`(min-width: 56rem)`):{matches:!1,addEventListener:()=>{},removeEventListener:()=>{}},o=e=>{e.matches&&u.classList.remove(`open`)};o(a),a.addEventListener(`change`,o),xe(n,r,u,i)}let d=n.querySelector(`[data-action="show-settings"]`);d&&d.addEventListener(`click`,()=>{t.dispatchEvent(new CustomEvent(`shadow-claw-navigate`,{detail:{page:`settings`},bubbles:!0,composed:!0}))}),n.querySelector(`.header-main-toggle`)?.addEventListener(`click`,()=>{Me(r)}),n.querySelector(`.activity-log-toggle`)?.addEventListener(`click`,()=>{je(r)}),n.addEventListener(`navigate`,e=>{let n=e.detail?.page;n&&t.dispatchEvent(new CustomEvent(`shadow-claw-navigate`,{detail:{page:n},bubbles:!0,composed:!0}))}),n.addEventListener(`sidebar-pages-visibility-change`,e=>{Ee(n,r,a,i,!!e.detail?.hidden)}),n.addEventListener(`sidebar-chat-visibility-change`,e=>{Q(n,r,a,i,`chat`,!!e.detail?.hidden)}),n.addEventListener(`sidebar-tasks-visibility-change`,e=>{Q(n,r,a,i,`tasks`,!!e.detail?.hidden)}),n.addEventListener(`sidebar-files-visibility-change`,e=>{Q(n,r,a,i,`files`,!!e.detail?.hidden)}),n.addEventListener(`chat-split-view-change`,e=>{r.chatSplitViewEnabled=!!e.detail?.enabled,W(n,r,i,a,r.currentPage,!1)}),n.addEventListener(`navigate-back`,()=>t.dispatchEvent(new CustomEvent(`shadow-claw-navigate`,{detail:{page:`settings`},bubbles:!0,composed:!0})));let f=n.querySelector(`.theme-mode-toggle`);f&&f.addEventListener(`click`,()=>{let{resolved:e}=s.getTheme(),t=e===E.Dark?E.Light:E.Dark;s.setTheme(t)}),n.querySelector(`.webvm-toggle`)?.addEventListener(`click`,()=>Ne(n,r)),n.addEventListener(`shadow-claw-terminal-slot-ready`,()=>{I(n,r.currentPage,r.terminalElement,r.terminalVisible,r.terminalPlacementFrame),L(n,r.headerMainCollapsedOverride),B(n,r.headerMainCollapsedOverride)}),e.addEventListener(`resize`,()=>{r.headerMainCollapsedOverride===null&&B(n,r.headerMainCollapsedOverride)}),t.addEventListener(`shadow-claw-navigate`,r.shadowClawNav),De()?(e.navigation.addEventListener(`navigate`,r.handleNavigationApiNavigate),r.navigationListenerAttached=!0):(r.popstateListener=t=>{let s=t?.state||e.history?.state;s?.inFeedScroll||s?.scrollSpy||s?.suppressRouter||q(n,r,i,o,a,new URL(e.location.href))},e.addEventListener(`popstate`,r.popstateListener),t.addEventListener(`click`,r.fallbackClickListener),r.fallbackClickListenerAttached=!0),e.addEventListener(`shadow-claw-theme-change`,e=>{let t=e.detail.theme;Fe(n,t),Pe(t,r.classList)}),e.addEventListener(`shadow-claw-peer-error`,e=>{let r=e.detail,i=r.remotePeerId,a=r.error;Z(t,n,{mode:`info`,title:`Peer Connection Error`,message:i?`Failed to communicate with peer ${i}: ${a}`:`PeerJS error: ${a}`,confirmLabel:`Dismiss`,autoCloseSeconds:30})});let p=s.resolved;Fe(n,p),Pe(p,r.classList),r.appLifecycleCleanup&&=(r.appLifecycleCleanup(),null),r.orchestrator&&(r.appLifecycleCleanup=Oe(e,t,r.orchestrator)),be(r)}function Le(e){if(e===void 0)return;e.documentElement.classList.remove(ce,`sc-prerender-override`);let t=e.querySelector(`shadow-claw`);t?.removeAttribute(ue),t?.removeAttribute(le)}function Re(e,t){if(!e)return;let n=t;if(n.navigationType===`reload`)return;let r=(typeof n?.destination?.getState==`function`?n.destination.getState():null)||(n.navigationType===`replace`&&typeof history<`u`?history.state:null);if(r?.inFeedScroll||r?.scrollSpy||r?.suppressRouter)return;let a=n?.destination?.url;if(typeof a!=`string`)return;let o=new URL(a);if(o.origin===window.location.origin&&i(o.pathname))return{parsedUrl:o,navigateEvent:n}}function ze(e,t){if(t.defaultPrevented||t.button!==0||t.metaKey||t.ctrlKey||t.shiftKey||t.altKey)return null;let n=t.composedPath(),r=null;for(let e of n)if(e instanceof HTMLAnchorElement){r=e;break}if(!r)return null;let a=r.getAttribute(`href`)||``;return!a||a.startsWith(`javascript:`)||a.startsWith(`mailto:`)||a.startsWith(`tel:`)||r.target&&r.target!==`_self`||r.origin!==e.origin||!i(r.pathname)||r.pathname===e.pathname&&r.search===e.search&&r.hash!==e.hash?null:(t.preventDefault(),`${r.pathname}${r.search}${r.hash}`)}async function Be(e,t,n){if(!t)return null;let r=t.querySelector(`.app-prompt-dialog`),i=t.querySelector(`.app-prompt-dialog__message`),a=t.querySelector(`.app-prompt-dialog__input-area`);if(!r||!i||!a)return null;if(r.open&&r.close(),i.textContent=n.question,a.replaceChildren(),Array.isArray(n.options)&&n.options.length>0){let t=e.createElement(`select`);t.className=`app-prompt-dialog__input`,t.name=`prompt-response`;for(let r of n.options){let n=e.createElement(`option`);n.value=r,n.textContent=r,t.appendChild(n)}a.appendChild(t)}else{let t=e.createElement(`input`);t.type=`text`,t.className=`app-prompt-dialog__input`,t.name=`prompt-response`,t.placeholder=`Enter your response...`,t.autocomplete=`off`,a.appendChild(t),setTimeout(()=>t.focus(),50)}return r.returnValue=``,await new Promise(e=>{let t=()=>{if(r.removeEventListener(`close`,t),r.returnValue===`submit`){let t=a.querySelector(`[name='prompt-response']`);e(t?t.value:null)}else e(null)};r.addEventListener(`close`,t),r.showModal()})}async function Ve(e,t,n,r){let i=await Be(e,t,r);d(n.orchestrator,r.id,i)}async function He(e,t,n,r){let i=r.path,a=r.groupId||t.activeGroupId;if(i&&e)for(let t=0;t<=3;t++)try{await n.openFile(e,i,a);return}catch(e){let n=e instanceof DOMException&&e.name===`NotFoundError`;if(t<3&&n){await new Promise(e=>setTimeout(e,150*(t+1)));continue}let r=e instanceof Error?e.message:String(e);S(`Failed to open file from tool: ${r}`,5e3);return}}async function Ue(e,t,n){n?.providerId===`llamafile`?await Z(e,t,_(n.reason)):n?.providerId===`transformers_js_local`?await Z(e,t,re(n.reason)):n?.providerId===`prompt_api`?await Z(e,t,fe(n.reason)):n?.providerId&&n.helpType&&await Z(e,t,p(n.providerId,n.helpType,n.reason))}async function We(e,t,n,r,i,a){if(r&&a?.roomId&&a?.hostPeerId&&await Z(e,t,{mode:`confirm`,title:`Room invitation`,message:`${a.fromAlias||a.fromPeerId} invited you to join "${a.roomName}".`,confirmLabel:`Join`,cancelLabel:`Decline`}))try{m(n.orchestrator,a.roomId,a.hostPeerId,a.roomName),await i.switchConversation(r,`room:${a.roomId}`),W(t,n,r,i,`chat`),x(`Joined room "${a.roomName}"`)}catch(e){let t=e instanceof Error?e.message:String(e);S(`Failed to join room: ${t}`,6e3)}}function Ge(e,t,n){let r=n.useTrailingSlash&&!t.includes(`#`)?t.endsWith(`/`)?t:t+`/`:t;n.replace?e.replaceState({},``,r):e.pushState({},``,r)}async function Ke(e,t,n,r,i,a,c={replace:!1}){let l=s(a),u=o(l),d=typeof window<`u`&&window.location?`${window.location.pathname}${window.location.search}${window.location.hash}`:``;d&&u===d?await K(e,t,n,r,i,a):De()?window.navigation.navigate(u,{history:c.replace?`replace`:`push`}):(u!==window.location.pathname&&Ge(globalThis.history,u,{...c,useTrailingSlash:!1}),await K(e,t,n,r,i,a))}function qe(e){let t=String(e||`chat`).toLowerCase();return t===`chat`||t===`files`||t===`tasks`||t===`pages`||t===`settings`||t===`tools`||t===`channels`?t:`chat`}async function Je(e,t,n,r,i,a){let o=a.detail;o&&await Ke(e,t,n,r,i,{page:qe(String(o.page||`chat`)),groupId:o.groupId,path:o.path,anchor:o.anchor})}async function Ye(e,t,n,r){await Te(e,t,n,r)}async function Xe(e,t,n,r){if(!n)return;let i=new URL(window.location?.href||`http://localhost/`),a=i.searchParams.get(`peer`);if(!a)return;let o=a.trim();if(o)try{let a=ie(r),s=a.myPeerId;s||=b().toLowerCase();let c=new Set(a.trustedPeerIds);c.add(o),await w(r,n,s,Array.from(c),a.serverHost,a.serverPort,a.serverPath,a.serverSecure),a.enabled||await y(r,n,`peerjs`,!0);let l=await v.ensurePeerConversation(n,o);await v.switchConversation(n,l),W(e,t,n,v,`chat`),i.searchParams.delete(`peer`);let u=`${i.pathname}${i.search}${i.hash}`;window.history.replaceState({},``,u||`/`),x(`Connected to Peer: ${o.substring(0,8)}`)}catch(e){let t=e instanceof Error?e.message:String(e);S(`Failed to process peer parameter: ${t}`,6e3)}}const Ze=`pendingShares`;function Qe(e){return{id:typeof e?.id==`string`?e.id:``,createdAt:typeof e?.createdAt==`number`?e.createdAt:0,title:typeof e?.title==`string`?e.title:``,text:typeof e?.text==`string`?e.text:``,url:typeof e?.url==`string`?e.url:``,fileName:typeof e?.fileName==`string`?e.fileName:``,fileType:typeof e?.fileType==`string`?e.fileType:``,fileBytes:e?.fileBytes instanceof ArrayBuffer?e.fileBytes:null}}async function $e(e){return!e||typeof e.transaction!=`function`?[]:new Promise((t,n)=>{let r;try{r=e.transaction(Ze,`readwrite`)}catch(e){if(e instanceof DOMException&&e.name===`NotFoundError`){t([]);return}n(e);return}let i=r.objectStore(Ze),a=i.getAll();a.onerror=()=>{n(a.error||/* @__PURE__ */ Error(`Failed to read pending shares`))},a.onsuccess=()=>{let e=Array.isArray(a.result)?a.result.map(Qe).filter(e=>typeof e.id==`string`&&e.id.length>0).sort((e,t)=>e.createdAt-t.createdAt):[],r=i.clear();r.onerror=()=>{n(r.error||/* @__PURE__ */ Error(`Failed to clear pending shares`))},r.onsuccess=()=>{t(e)}},r.onabort=()=>{n(r.error||/* @__PURE__ */ Error(`Pending share transaction aborted`))}})}function et(e){let t=[`# Shared Content`,``];return e.title&&t.push(`Title: ${e.title}`),e.url&&t.push(`URL: ${e.url}`),e.text&&t.push(``,e.text),t.join(`
2
- `).trim()+`
3
- `}async function tt(e,t){let n=/* @__PURE__ */ new Date,r=`Shared Files ${`${String(n.getFullYear())}-${String(n.getMonth()+1).padStart(2,`0`)}-${String(n.getDate()).padStart(2,`0`)}`}`,i=t.groups.find(e=>e.name===r);return i?(await t.switchConversation(e,i.groupId),i.groupId):(await t.createConversation(e,r)).groupId}function nt(e,t){return(e.replace(/\\/g,`/`).split(`/`).filter(Boolean).pop()||``).replace(/\s+/g,`-`).replace(/[^A-Za-z0-9._-]/g,`-`).replace(/-+/g,`-`).replace(/^-+|-+$/g,``)||`${t}.txt`}async function rt(e,t,n,r,i,a,o){if(!a)return;let s=await $e(a);if(s.length!==0)try{let c=await tt(a,r),l=[];for(let e=0;e<s.length;e++){let t=s[e],n=`shared-${Date.now()}-${e+1}`;if(t.fileBytes instanceof ArrayBuffer){let e=nt(t.fileName||(t.fileType===`application/pdf`?`${n}.pdf`:`${n}.bin`),n);await ne(a,c,e,new Uint8Array(t.fileBytes)),l.push(e);continue}let r=nt(t.fileName||`${n}.md`,n),i=et(t);await ae(a,c,r,i),l.push(r)}await r.loadFiles(a),W(t,n,a,r,`files`),l.length>0&&await i.openFile(a,l[0],c),x(`Imported ${l.length} shared item${l.length===1?``:`s`}.`);let u=o;if(u.searchParams.has(`share-target`)){u.searchParams.delete(`share-target`);let t=`${u.pathname}${u.search}${u.hash}`;e.history.replaceState({},``,t||`/`)}}catch(e){let t=e instanceof Error?e.message:String(e);S(`Failed to import shared content: ${t}`,6e3)}}async function it(e,t,n,r,i,a){if(!r)return;let o=new URL(window.location?.href||`http://localhost/`),s=(o.searchParams.get(`room`)||``).trim(),c=(o.searchParams.get(`host`)||``).trim(),l=(o.searchParams.get(`name`)||``).trim()||`Room`;if(s&&c)try{let u=ie(i),d=u.myPeerId;d||=b().toLowerCase();let f=new Set(u.trustedPeerIds);f.add(c),await w(i,r,d,Array.from(f),u.serverHost,u.serverPort,u.serverPath,u.serverSecure),u.enabled||await y(i,r,`peerjs`,!0),m(i,s,c,l),await a.switchConversation(r,`room:${s}`),W(t,n,r,a,`chat`),o.searchParams.delete(`room`),o.searchParams.delete(`host`),o.searchParams.delete(`name`);let p=`${o.pathname}${o.search}${o.hash}`;e.history.replaceState({},``,p||`/`),x(`Joined room "${l}"`)}catch(e){let t=e instanceof Error?e.message:String(e);S(`Failed to join room: ${t}`,6e3)}}function at(e,t,n,r){e&&(C(()=>{let t=T.file;t&&(F(`file-viewer`).then(()=>{if(e&&!e.querySelector(`shadow-claw-file-viewer`)){let t=e.querySelector(`.main-content`);if(t){let e=document.createElement(`shadow-claw-file-viewer`);e.id=`file-viewer`,t.appendChild(e)}}}).catch(console.error),t.kind===`pdf`&&F(`pdf-viewer`).catch(console.error))}),C(()=>{let e=r.state;e===`idle`&&(t.previousOrchestratorState===`thinking`||t.previousOrchestratorState===`responding`)&&x(`Response complete`,2500),t.previousOrchestratorState=e}),C(()=>{let i=r.activePage;i!==t.currentPage&&W(e,t,n,r,i,!1)}),C(()=>{r.activityLog,R(e,t.currentPage,r.activityLog.length)}))}const ot=new CSSStyleSheet;ot.replaceSync(`*,
4
- *::before,
5
- *::after {
6
- box-sizing: border-box;
7
- }
8
-
9
- .hidden,
10
- [hidden] {
11
- display: none !important;
12
- }
13
-
14
- a {
15
- color: var(--shadow-claw-link);
16
- text-decoration: underline;
17
- text-underline-offset: 0.125rem;
18
- }
19
-
20
- a:hover {
21
- color: var(--shadow-claw-link-hover);
22
- }
23
-
24
- .header {
25
- align-items: center;
26
- background-color: var(--shadow-claw-bg-secondary);
27
- border-bottom: 0.0625rem solid var(--shadow-claw-border-color);
28
- display: flex;
29
- gap: 0.5rem;
30
- height: 4rem;
31
- justify-content: start;
32
- max-height: 4rem;
33
- padding: 0.5rem 1rem;
34
- width: 100%;
35
- }
36
-
37
- .header h1 {
38
- align-items: center;
39
- color: var(--shadow-claw-text-primary);
40
- display: flex;
41
- flex-direction: row;
42
- margin: 0;
43
- width: 100%;
44
- }
45
-
46
- #menu-button {
47
- align-items: center;
48
- background: transparent;
49
- border: none;
50
- border-radius: 0.25rem;
51
- color: var(--shadow-claw-text-secondary);
52
- cursor: pointer;
53
- display: flex;
54
- justify-content: center;
55
- padding: 0.5rem;
56
- }
57
-
58
- #menu-button:hover,
59
- .theme-toggle:hover {
60
- background-color: var(--shadow-claw-bg-tertiary);
61
- color: var(--shadow-claw-text-primary);
62
- }
63
-
64
- .header-actions {
65
- align-items: center;
66
- display: flex;
67
- gap: 0.5rem;
68
- margin-left: auto;
69
- }
70
-
71
- .theme-toggle {
72
- align-items: center;
73
- background: transparent;
74
- border: none;
75
- border-radius: 0.25rem;
76
- color: var(--shadow-claw-text-secondary);
77
- cursor: pointer;
78
- display: flex;
79
- justify-content: center;
80
- padding: 0.5rem;
81
- }
82
-
83
- .theme-mode-toggle .sun-icon {
84
- display: none;
85
- }
86
-
87
- .theme-mode-toggle .moon-icon {
88
- display: block;
89
- }
90
-
91
- .theme-toggle svg {
92
- transition: transform 0.2s ease;
93
- }
94
-
95
- .header-main-toggle {
96
- display: var(--shadow-claw-header-main-toggle-display, block);
97
- }
98
-
99
- .header-main-toggle[aria-pressed="true"],
100
- .activity-log-toggle[aria-pressed="true"] {
101
- box-shadow: 0 0 0.5rem
102
- color-mix(
103
- in srgb,
104
- var(--shadow-claw-warning-color, #d97706) 50%,
105
- transparent
106
- );
107
- color: var(--shadow-claw-warning-color, #d97706);
108
- }
109
-
110
- .header-main-toggle[aria-pressed="true"] svg {
111
- transform: rotate(180deg);
112
- }
113
-
114
- .activity-log-toggle[aria-pressed="true"] svg {
115
- transform: rotate(180deg);
116
- }
117
-
118
- .webvm-toggle--booting,
119
- .webvm-toggle--ready,
120
- .webvm-toggle--visible {
121
- color: var(--shadow-claw-success-color);
122
- }
123
-
124
- .webvm-toggle--error {
125
- color: var(--shadow-claw-error-color);
126
- }
127
-
128
- .app {
129
- background-color: var(--shadow-claw-bg-primary);
130
- color: var(--shadow-claw-text-primary);
131
- display: flex;
132
- flex-direction: column;
133
- font-family: var(--shadow-claw-font-sans);
134
- /* Punch through the \`visibility: hidden\` set on the shadow-claw host
135
- by the sc-prerender-override global CSS rule. The existing boot-pending
136
- opacity rules still hide the real pre-rendered content; the skeleton
137
- overlays and header remain fully visible. */
138
- visibility: visible;
139
- width: 100%;
140
- }
141
-
142
- .app-body {
143
- --sidebar-width: 15.625rem;
144
- display: flex;
145
- flex: 1;
146
- flex-direction: row;
147
- min-height: 0;
148
- overflow: hidden;
149
- }
150
-
151
- .sidebar {
152
- background-color: var(--shadow-claw-bg-secondary);
153
- border-right: 0.0625rem solid var(--shadow-claw-bg-tertiary);
154
- display: flex;
155
- flex: none;
156
- flex-direction: column;
157
- overflow-y: auto;
158
- position: relative;
159
- width: var(--sidebar-width);
160
- }
161
-
162
- .sidebar-resize-handle {
163
- background: transparent;
164
- cursor: col-resize;
165
- flex: none;
166
- outline: none;
167
- position: relative;
168
- touch-action: none;
169
- user-select: none;
170
- width: 0.75rem;
171
- }
172
-
173
- .sidebar-resize-handle::before {
174
- background: color-mix(
175
- in srgb,
176
- var(--shadow-claw-bg-secondary) 72%,
177
- var(--shadow-claw-border-color)
178
- );
179
- border: 0.0625rem solid
180
- color-mix(in srgb, var(--shadow-claw-border-color) 80%, transparent);
181
- border-radius: var(--shadow-claw-radius-pill);
182
- content: "";
183
- height: 4.25rem;
184
- left: 50%;
185
- position: absolute;
186
- top: 50%;
187
- transform: translate(-50%, -50%);
188
- transition:
189
- background-color 0.15s,
190
- border-color 0.15s,
191
- box-shadow 0.15s;
192
- width: 0.5625rem;
193
- }
194
-
195
- .sidebar-resize-handle::after {
196
- background: var(--shadow-claw-border-color);
197
- border-radius: var(--shadow-claw-radius-pill);
198
- content: "";
199
- height: 2.75rem;
200
- left: 50%;
201
- position: absolute;
202
- top: 50%;
203
- transform: translate(-50%, -50%);
204
- transition: background-color 0.15s;
205
- width: 0.1875rem;
206
- }
207
-
208
- .sidebar-resize-handle:hover::before,
209
- .sidebar-resize-handle.active::before {
210
- background: color-mix(
211
- in srgb,
212
- var(--shadow-claw-accent-primary) 20%,
213
- var(--shadow-claw-bg-secondary)
214
- );
215
- border-color: color-mix(
216
- in srgb,
217
- var(--shadow-claw-accent-primary) 45%,
218
- transparent
219
- );
220
- box-shadow: 0 0 0.5rem
221
- color-mix(in srgb, var(--shadow-claw-accent-primary) 18%, transparent);
222
- }
223
-
224
- .sidebar-resize-handle:hover::after,
225
- .sidebar-resize-handle.active::after {
226
- background: var(--shadow-claw-accent-primary);
227
- }
228
-
229
- .sidebar-resize-handle:focus-visible::before {
230
- background: color-mix(
231
- in srgb,
232
- var(--shadow-claw-accent-primary) 20%,
233
- var(--shadow-claw-bg-secondary)
234
- );
235
- border-color: color-mix(
236
- in srgb,
237
- var(--shadow-claw-accent-primary) 45%,
238
- transparent
239
- );
240
- box-shadow: 0 0 0.5rem
241
- color-mix(in srgb, var(--shadow-claw-accent-primary) 18%, transparent);
242
- }
243
-
244
- .sidebar-resize-handle:focus-visible::after {
245
- background: var(--shadow-claw-accent-primary);
246
- }
247
-
248
- .sidebar-resize-handle:focus-visible {
249
- outline: 0.125rem solid
250
- color-mix(in srgb, var(--shadow-claw-accent-primary) 60%, transparent);
251
- outline-offset: 0.0625rem;
252
- }
253
-
254
- @media (max-width: 55.9375rem) {
255
- .sidebar {
256
- display: none;
257
- }
258
-
259
- .sidebar.open {
260
- border-radius: 0 var(--shadow-claw-radius-m) var(--shadow-claw-radius-m) 0;
261
- box-shadow: var(--shadow-claw-shadow-lg);
262
- display: flex;
263
- height: calc(100vh - 4rem);
264
- height: calc(100dvh - 4rem);
265
- position: absolute;
266
- width: min(85vw, 20rem);
267
- z-index: 100;
268
- }
269
-
270
- .sidebar-resize-handle {
271
- display: none;
272
- }
273
- }
274
-
275
- @media (min-width: 56rem) {
276
- #menu-button {
277
- display: none;
278
- }
279
- }
280
-
281
- .nav-menu {
282
- display: var(--shadow-claw-sidebar-nav-display, flex);
283
- flex-direction: column;
284
- flex: none;
285
- list-style: none;
286
- margin: 0;
287
- padding: 0.5rem;
288
- }
289
-
290
- .nav-menu:not(:has(.nav-item:not([hidden]))) {
291
- display: none;
292
- }
293
-
294
- slot[name="sidebar"],
295
- slot[name="sidebar-nav"],
296
- slot[name="sidebar-content"],
297
- slot[name="sidebar-footer"] {
298
- display: block;
299
- }
300
-
301
- ::slotted([slot="sidebar"]),
302
- ::slotted([slot="sidebar-nav"]),
303
- ::slotted([slot="sidebar-content"]),
304
- ::slotted([slot="sidebar-footer"]) {
305
- display: block;
306
- }
307
-
308
- .sidebar-footer {
309
- display: var(--shadow-claw-sidebar-footer-display, block);
310
- }
311
-
312
- .sidebar-spacer {
313
- flex: 1;
314
- }
315
-
316
- shadow-claw-conversations {
317
- display: flex;
318
- flex: none;
319
- flex-direction: column;
320
- min-height: 0;
321
- overflow: hidden;
322
- }
323
-
324
- .nav-item {
325
- border-radius: var(--shadow-claw-radius-m);
326
- color: var(--shadow-claw-text-secondary);
327
- cursor: pointer;
328
- font-size: var(--shadow-claw-font-size-sm);
329
- font-weight: 500;
330
- margin-bottom: 0.5rem;
331
- padding: 0.625rem 0.75rem;
332
- transition:
333
- background-color 0.15s,
334
- color 0.15s;
335
- }
336
-
337
- .nav-item:hover {
338
- background-color: var(--shadow-claw-text-secondary);
339
- color: var(--shadow-claw-on-primary);
340
- }
341
-
342
- .nav-item.active {
343
- background-color: var(--shadow-claw-accent-primary);
344
- color: var(--shadow-claw-on-primary);
345
- }
346
-
347
- .sidebar-footer {
348
- border-top: 0.0625rem solid var(--shadow-claw-border-color);
349
- flex: none;
350
- margin-bottom: 0.5rem;
351
- padding: 0.75rem;
352
- }
353
-
354
- .settings-btn {
355
- background-color: transparent;
356
- border: 0.0625rem solid var(--shadow-claw-border-color);
357
- border-radius: var(--shadow-claw-radius-pill);
358
- color: var(--shadow-claw-text-secondary);
359
- cursor: pointer;
360
- font-size: 0.8125rem;
361
- padding: 0.625rem 0.75rem;
362
- transition: all var(--shadow-claw-duration-min) var(--shadow-claw-ease-out);
363
- width: 100%;
364
- }
365
-
366
- .settings-btn:hover {
367
- border-color: var(--shadow-claw-text-primary);
368
- box-shadow: var(--shadow-claw-shadow-md);
369
- color: var(--shadow-claw-text-primary);
370
- }
371
-
372
- .main-content {
373
- --chat-split-height: 20rem;
374
- display: flex;
375
- flex: 1;
376
- flex-direction: column;
377
- height: calc(100vh - 4rem);
378
- height: calc(100dvh - 4rem);
379
- min-height: 0;
380
- overflow: hidden;
381
- position: relative;
382
- }
383
-
384
- .page {
385
- display: flex;
386
- display: none;
387
- flex: 1;
388
- flex-direction: column;
389
- min-height: 0;
390
- overflow: auto;
391
- }
392
-
393
- .page.active {
394
- display: flex;
395
- }
396
-
397
- .chat-split-resize-handle {
398
- background: transparent;
399
- cursor: row-resize;
400
- display: none;
401
- flex: none;
402
- height: 0.75rem;
403
- outline: none;
404
- position: relative;
405
- touch-action: none;
406
- user-select: none;
407
- width: 100%;
408
- }
409
-
410
- .main-content.split-chat-active .page.active {
411
- order: 1;
412
- }
413
-
414
- .main-content.split-chat-active .chat-split-resize-handle {
415
- display: flex;
416
- margin-bottom: -0.375rem;
417
- margin-top: -0.375rem;
418
- order: 2;
419
- z-index: 10;
420
- }
421
-
422
- .chat-split-resize-handle::before {
423
- background: color-mix(
424
- in srgb,
425
- var(--shadow-claw-bg-secondary) 72%,
426
- var(--shadow-claw-border-color)
427
- );
428
- border: 0.0625rem solid
429
- color-mix(in srgb, var(--shadow-claw-border-color) 80%, transparent);
430
- border-radius: var(--shadow-claw-radius-pill);
431
- content: "";
432
- height: 0.5625rem;
433
- left: 50%;
434
- position: absolute;
435
- top: 50%;
436
- transform: translate(-50%, -50%);
437
- transition:
438
- background-color 0.15s,
439
- border-color 0.15s,
440
- box-shadow 0.15s;
441
- width: 4.25rem;
442
- }
443
-
444
- .chat-split-resize-handle::after {
445
- background: var(--shadow-claw-border-color);
446
- border-radius: var(--shadow-claw-radius-pill);
447
- content: "";
448
- height: 0.1875rem;
449
- left: 50%;
450
- position: absolute;
451
- top: 50%;
452
- transform: translate(-50%, -50%);
453
- transition: background-color 0.15s;
454
- width: 2.75rem;
455
- }
456
-
457
- .chat-split-resize-handle:hover::before,
458
- .chat-split-resize-handle.active::before,
459
- .chat-split-resize-handle:focus-visible::before {
460
- background: color-mix(
461
- in srgb,
462
- var(--shadow-claw-accent-primary) 20%,
463
- var(--shadow-claw-bg-secondary)
464
- );
465
- border-color: color-mix(
466
- in srgb,
467
- var(--shadow-claw-accent-primary) 45%,
468
- transparent
469
- );
470
- box-shadow: 0 0 0.5rem
471
- color-mix(in srgb, var(--shadow-claw-accent-primary) 18%, transparent);
472
- }
473
-
474
- .chat-split-resize-handle:hover::after,
475
- .chat-split-resize-handle.active::after,
476
- .chat-split-resize-handle:focus-visible::after {
477
- background: var(--shadow-claw-accent-primary);
478
- }
479
-
480
- .chat-split-resize-handle:focus-visible {
481
- outline: 0.125rem solid
482
- color-mix(in srgb, var(--shadow-claw-accent-primary) 60%, transparent);
483
- outline-offset: 0.0625rem;
484
- }
485
-
486
- .main-content.split-chat-active .chat-page:not(.active) {
487
- border-top: 0.0625rem solid var(--shadow-claw-border-color);
488
- display: flex;
489
- flex: none;
490
- height: var(--chat-split-height);
491
- max-height: calc(100% - 6.25rem);
492
- min-height: 9.375rem;
493
- order: 3;
494
- }
495
-
496
- @media (max-width: 55.9375rem) {
497
- .chat-split-resize-handle {
498
- display: none !important;
499
- }
500
-
501
- .main-content.split-chat-active .chat-page:not(.active) {
502
- display: none !important;
503
- }
504
- }
505
-
506
- .app-dialog {
507
- background: var(--shadow-claw-bg-secondary);
508
- border: 0.0625rem solid var(--shadow-claw-border-color);
509
- border-radius: var(--shadow-claw-radius-l);
510
- box-shadow: var(--shadow-claw-shadow-lg);
511
- color: var(--shadow-claw-text-primary);
512
- max-width: min(90vw, 28rem);
513
- padding: 0;
514
- }
515
-
516
- .app-dialog::backdrop {
517
- background: color-mix(in srgb, black 50%, transparent);
518
- }
519
-
520
- .app-confirm-dialog__form {
521
- display: flex;
522
- flex-direction: column;
523
- gap: 0.75rem;
524
- margin: 0;
525
- padding: 1rem;
526
- }
527
-
528
- .app-dialog__title {
529
- font-size: 1rem;
530
- margin: 0;
531
- }
532
-
533
- .app-dialog__message {
534
- color: var(--shadow-claw-text-secondary);
535
- margin: 0;
536
- }
537
-
538
- .app-dialog__details {
539
- color: var(--shadow-claw-text-secondary);
540
- display: flex;
541
- flex-direction: column;
542
- gap: 0.25rem;
543
- margin: 0;
544
- padding-left: 1rem;
545
- }
546
-
547
- .app-dialog__links {
548
- display: flex;
549
- flex-wrap: wrap;
550
- gap: 0.5rem;
551
- }
552
-
553
- .app-dialog__link {
554
- color: var(--shadow-claw-accent-primary);
555
- font-size: 0.9375rem;
556
- text-decoration: none;
557
- }
558
-
559
- .app-dialog__link:hover,
560
- .app-dialog__link:focus-visible {
561
- text-decoration: underline;
562
- }
563
-
564
- .app-dialog__countdown {
565
- color: var(--shadow-claw-text-secondary);
566
- font-size: 0.875rem;
567
- margin: 0;
568
- }
569
-
570
- .app-confirm-dialog__actions {
571
- display: flex;
572
- gap: 0.5rem;
573
- justify-content: flex-end;
574
- }
575
-
576
- .app-dialog__btn {
577
- border: 0.0625rem solid var(--shadow-claw-border-color);
578
- border-radius: var(--shadow-claw-radius-m);
579
- cursor: pointer;
580
- font: inherit;
581
- padding: 0.5rem 0.75rem;
582
- }
583
-
584
- .app-dialog__btn--cancel {
585
- background: var(--shadow-claw-bg-primary);
586
- color: var(--shadow-claw-text-primary);
587
- }
588
-
589
- .app-dialog__btn--confirm {
590
- background: var(--shadow-claw-accent-primary);
591
- border-color: var(--shadow-claw-accent-primary);
592
- color: var(--shadow-claw-on-primary);
593
- }
594
-
595
- .app-prompt-dialog__form {
596
- display: flex;
597
- flex-direction: column;
598
- gap: 0.75rem;
599
- margin: 0;
600
- padding: 1rem;
601
- }
602
-
603
- .app-prompt-dialog__title {
604
- font-size: 1rem;
605
- margin: 0;
606
- }
607
-
608
- .app-prompt-dialog__message {
609
- color: var(--shadow-claw-text-secondary);
610
- margin: 0;
611
- }
612
-
613
- .app-prompt-dialog__input-area {
614
- display: flex;
615
- flex-direction: column;
616
- gap: 0.5rem;
617
- margin-top: 0.5rem;
618
- }
619
-
620
- .app-prompt-dialog__input {
621
- background: var(--shadow-claw-bg-primary);
622
- border: 0.0625rem solid var(--shadow-claw-border-color);
623
- border-radius: var(--shadow-claw-radius-s);
624
- color: var(--shadow-claw-text-primary);
625
- font: inherit;
626
- padding: 0.5rem;
627
- width: 100%;
628
- }
629
-
630
- .app-prompt-dialog__actions {
631
- display: flex;
632
- gap: 0.5rem;
633
- justify-content: flex-end;
634
- margin-top: 0.5rem;
635
- }
636
-
637
- .chat-page {
638
- flex-direction: column;
639
- }
640
-
641
- :host([data-prerender-no-seed="true"]) .nav-item,
642
- :host([data-prerender-no-seed="true"]) shadow-claw-conversations,
643
- :host([data-prerender-no-seed="true"]) .sidebar-footer,
644
- :host([data-prerender-no-seed="true"]) .page.active,
645
- :host([data-prerender-no-seed="true"]) shadow-claw-file-viewer,
646
- :host([data-prerender-no-seed="true"]) shadow-claw-toast {
647
- opacity: 1;
648
- transform: translateY(0);
649
- transition:
650
- opacity var(--shadow-claw-duration-min) var(--shadow-claw-ease-out),
651
- transform var(--shadow-claw-duration-min) var(--shadow-claw-ease-out);
652
- }
653
-
654
- :host([data-prerender-no-seed="true"][data-hydration-pending="true"]) .nav-item,
655
- :host([data-prerender-no-seed="true"][data-hydration-pending="true"])
656
- shadow-claw-conversations,
657
- :host([data-prerender-no-seed="true"][data-hydration-pending="true"])
658
- .sidebar-footer,
659
- :host([data-prerender-no-seed="true"][data-hydration-pending="true"])
660
- .page.active,
661
- :host([data-prerender-no-seed="true"][data-hydration-pending="true"])
662
- shadow-claw-file-viewer,
663
- :host([data-prerender-no-seed="true"][data-hydration-pending="true"])
664
- shadow-claw-toast,
665
- :host([data-prerender-no-seed="true"][data-js-boot-pending="true"]) .nav-item,
666
- :host([data-prerender-no-seed="true"][data-js-boot-pending="true"])
667
- shadow-claw-conversations,
668
- :host([data-prerender-no-seed="true"][data-js-boot-pending="true"])
669
- .sidebar-footer,
670
- :host([data-prerender-no-seed="true"][data-js-boot-pending="true"])
671
- .page.active,
672
- :host([data-prerender-no-seed="true"][data-js-boot-pending="true"])
673
- shadow-claw-file-viewer,
674
- :host([data-prerender-no-seed="true"][data-js-boot-pending="true"])
675
- shadow-claw-toast {
676
- opacity: 0;
677
- pointer-events: none;
678
- transform: translateY(0.25rem);
679
- }
680
-
681
- @media (prefers-reduced-motion: reduce) {
682
- :host([data-prerender-no-seed="true"]) .nav-item,
683
- :host([data-prerender-no-seed="true"]) shadow-claw-conversations,
684
- :host([data-prerender-no-seed="true"]) .sidebar-footer,
685
- :host([data-prerender-no-seed="true"]) .page.active,
686
- :host([data-prerender-no-seed="true"]) shadow-claw-file-viewer,
687
- :host([data-prerender-no-seed="true"]) shadow-claw-toast {
688
- transform: none;
689
- transition: none;
690
- }
691
- }
692
-
693
- /* Premium Loading & Hydration Skeletons */
694
- .sidebar-boot-skeleton {
695
- background-color: var(--shadow-claw-bg-secondary);
696
- bottom: 0;
697
- display: flex;
698
- flex-direction: column;
699
- left: 0;
700
- opacity: 0;
701
- padding: 1rem 0.75rem;
702
- pointer-events: none;
703
- position: absolute;
704
- right: 0;
705
- top: 0;
706
- transition:
707
- opacity var(--shadow-claw-duration-regular) var(--shadow-claw-ease-out),
708
- visibility var(--shadow-claw-duration-regular) var(--shadow-claw-ease-out);
709
- visibility: hidden;
710
- z-index: 10;
711
- }
712
-
713
- :host([data-js-boot-pending="true"]) .sidebar-boot-skeleton,
714
- :host([data-hydration-pending="true"]) .sidebar-boot-skeleton {
715
- opacity: 1;
716
- pointer-events: auto;
717
- visibility: visible;
718
- }
719
-
720
- .skeleton-nav-wrapper {
721
- display: none;
722
- flex-direction: column;
723
- gap: 0.5rem;
724
- margin-bottom: 0.5rem;
725
- }
726
-
727
- :host([data-prerender-no-seed="true"]) .skeleton-nav-wrapper {
728
- display: flex;
729
- }
730
-
731
- .skeleton-divider {
732
- border-top: 0.0625rem solid var(--shadow-claw-border-color);
733
- display: none;
734
- margin: 0.75rem 0;
735
- }
736
-
737
- :host([data-prerender-no-seed="true"]) .skeleton-divider {
738
- display: block;
739
- }
740
-
741
- .skeleton-convo-wrapper {
742
- display: flex;
743
- flex-direction: column;
744
- gap: 0.75rem;
745
- margin-top: 0.5rem;
746
- }
747
-
748
- .skeleton-item {
749
- animation: skeleton-pulse 1.8s ease-in-out infinite;
750
- background: linear-gradient(
751
- 90deg,
752
- var(--shadow-claw-bg-secondary) 25%,
753
- var(--shadow-claw-bg-tertiary) 50%,
754
- var(--shadow-claw-bg-secondary) 75%
755
- );
756
- background-size: 200% 100%;
757
- }
758
-
759
- .skeleton-nav {
760
- border-radius: var(--shadow-claw-radius-m);
761
- height: 2.25rem;
762
- width: 100%;
763
- }
764
-
765
- /* Give items dynamic-looking varied widths for extra premium feel */
766
- .skeleton-nav:nth-child(1) {
767
- width: 85%;
768
- }
769
-
770
- .skeleton-nav:nth-child(2) {
771
- width: 90%;
772
- }
773
-
774
- .skeleton-nav:nth-child(3) {
775
- width: 75%;
776
- }
777
-
778
- .skeleton-nav:nth-child(4) {
779
- width: 80%;
780
- }
781
-
782
- .skeleton-convo {
783
- border-radius: var(--shadow-claw-radius-m);
784
- height: 3.5rem;
785
- width: 100%;
786
- }
787
-
788
- .main-content-boot-skeleton {
789
- align-items: center;
790
- background-color: var(--shadow-claw-bg-primary);
791
- bottom: 0;
792
- display: flex;
793
- flex-direction: column;
794
- justify-content: center;
795
- left: 0;
796
- opacity: 0;
797
- padding: 2rem;
798
- pointer-events: none;
799
- position: absolute;
800
- right: 0;
801
- top: 0;
802
- transition:
803
- opacity var(--shadow-claw-duration-regular) var(--shadow-claw-ease-out),
804
- visibility var(--shadow-claw-duration-regular) var(--shadow-claw-ease-out);
805
- visibility: hidden;
806
- z-index: 10;
807
- }
808
-
809
- :host([data-prerender-no-seed="true"][data-js-boot-pending="true"])
810
- .main-content-boot-skeleton,
811
- :host([data-prerender-no-seed="true"][data-hydration-pending="true"])
812
- .main-content-boot-skeleton {
813
- opacity: 1;
814
- pointer-events: auto;
815
- visibility: visible;
816
- }
817
-
818
- .boot-loading-svg {
819
- color: var(--shadow-claw-text-secondary);
820
- height: 4.5rem;
821
- opacity: 0.85;
822
- transition: color var(--shadow-claw-duration-min) var(--shadow-claw-ease-out);
823
- width: 4.5rem;
824
- }
825
-
826
- .boot-loading-text {
827
- color: var(--shadow-claw-text-secondary);
828
- font-size: var(--shadow-claw-font-size-sm);
829
- font-weight: 600;
830
- letter-spacing: 0.075em;
831
- margin-top: 1.25rem;
832
- text-transform: uppercase;
833
- }
834
-
835
- @keyframes skeleton-pulse {
836
- 0% {
837
- background-position: 200% 0;
838
- }
839
-
840
- 100% {
841
- background-position: -200% 0;
842
- }
843
- }
844
- `);const $=new DOMParser().parseFromString(`<template>
845
- <div class="app">
846
- <!-- Header -->
847
- <header class="header">
848
- <button aria-label="Open menu" title="Open menu" id="menu-button">
849
- <svg
850
- height="1.5rem"
851
- fill="currentColor"
852
- viewBox="0 -960 960 960"
853
- width="1.5rem"
854
- xmlns="http://www.w3.org/2000/svg"
855
- >
856
- <path d="M120-680v-80h720v80zm0 480v-80h720v80zm0-240v-80h720v80z" />
857
- </svg>
858
- </button>
859
- <h1>
860
- <slot name="header-title-link"></slot>
861
- <div class="header-actions">
862
- <button
863
- aria-label="Toggle theme"
864
- title="Toggle theme"
865
- class="theme-toggle theme-mode-toggle"
866
- >
867
- <svg
868
- class="sun-icon"
869
- height="1.5rem"
870
- fill="currentColor"
871
- hidden
872
- viewBox="0 -960 960 960"
873
- width="1.5rem"
874
- xmlns="http://www.w3.org/2000/svg"
875
- >
876
- <path
877
- d="M480-360q50 0 85-35t35-85q0-50-35-85t-85-35q-50 0-85 35t-35 85q0 50 35 85t85 35zm0 80q-83 0-141.5-58.5T280-480q0-83 58.5-141.5T480-680q83 0 141.5 58.5T680-480q0 83-58.5 141.5T480-280zM200-440H40v-80h160v80zm720 0H760v-80h160v80zM440-760v-160h80v160h-80zm0 720v-160h80v160h-80zM256-650l-101-97 57-59 96 100-52 56zm492 496-97-101 53-55 101 97-57 59zm-98-550 97-101 59 57-101 97-55-53zM158-190l97-101 55 53-101 97-51-49z"
878
- />
879
- </svg>
880
- <svg
881
- class="moon-icon"
882
- height="1.5rem"
883
- fill="currentColor"
884
- viewBox="0 -960 960 960"
885
- width="1.5rem"
886
- xmlns="http://www.w3.org/2000/svg"
887
- >
888
- <path
889
- d="M480-120q-150 0-255-105T120-480q0-150 105-255t255-105q14 0 27.5 1t26.5 3q-41 29-65.5 75.5T444-660q0 90 63 153t153 63q52 0 99-24.5t75-65.5q2 13 3 26.5t1 27.5q0 150-105 255T480-120zm0-80q88 0 158-48.5T740-375q-20 5-40 8t-40 3q-123 0-209.5-86.5T364-660q0-20 3-40t8-40q-74 30-122.5 100T204-480q0 116 82 198t194 82zm-12-274z"
890
- />
891
- </svg>
892
- </button>
893
- <button
894
- aria-label="Hide action header"
895
- title="Hide action header"
896
- aria-pressed="false"
897
- class="theme-toggle header-main-toggle"
898
- type="button"
899
- >
900
- <svg
901
- height="1.5rem"
902
- fill="currentColor"
903
- viewBox="0 -960 960 960"
904
- width="1.5rem"
905
- xmlns="http://www.w3.org/2000/svg"
906
- >
907
- <path
908
- d="M280-200h400v-80H280v80Zm200-200L280-600l56-56 104 104v-328h80v328l104-104 56 56-200 200Z"
909
- />
910
- </svg>
911
- </button>
912
- <button
913
- aria-label="Hide activity log"
914
- title="Hide activity log"
915
- aria-pressed="false"
916
- class="theme-toggle activity-log-toggle"
917
- type="button"
918
- hidden
919
- >
920
- <svg
921
- xmlns="http://www.w3.org/2000/svg"
922
- height="24px"
923
- viewBox="0 -960 960 960"
924
- width="24px"
925
- fill="currentColor"
926
- >
927
- <path
928
- d="M80-600v-160q0-33 23.5-56.5T160-840h640q33 0 56.5 23.5T880-760v160h-80v-160H160v160H80Zm80 360q-33 0-56.5-23.5T80-320v-200h80v200h640v-200h80v200q0 33-23.5 56.5T800-240H160ZM40-120v-80h880v80H40Zm440-420ZM80-520v-80h240q11 0 21 6t15 16l47 93 123-215q5-9 14-14.5t20-5.5q11 0 21 5.5t15 16.5l49 98h235v80H620q-11 0-21-5.5T584-542l-26-53-123 215q-5 10-15 15t-21 5q-11 0-20.5-6T364-382l-69-138H80Z"
929
- />
930
- </svg>
931
- </button>
932
- <button
933
- aria-label="Hide WebVM terminal"
934
- title="Hide WebVM terminal"
935
- aria-pressed="true"
936
- class="theme-toggle webvm-toggle"
937
- type="button"
938
- hidden
939
- >
940
- <svg
941
- height="1.5rem"
942
- fill="currentColor"
943
- viewBox="0 -960 960 960"
944
- width="1.5rem"
945
- xmlns="http://www.w3.org/2000/svg"
946
- >
947
- <path
948
- d="M320-280 120-480l200-200 56 56-104 104h568v80H272l104 104-56 56Zm320 0-56-56 104-104H120v-80h568L584-624l56-56 200 200-200 200Z"
949
- />
950
- </svg>
951
- </button>
952
- <slot name="header-actions-logo"></slot>
953
- </div>
954
- </h1>
955
- </header>
956
-
957
- <!-- Main Body -->
958
- <div class="app-body">
959
- <!-- Sidebar -->
960
- <aside class="sidebar">
961
- <div class="sidebar-boot-skeleton" aria-hidden="true">
962
- <div class="skeleton-nav-wrapper">
963
- <div class="skeleton-item skeleton-nav"></div>
964
- <div class="skeleton-item skeleton-nav"></div>
965
- <div class="skeleton-item skeleton-nav"></div>
966
- <div class="skeleton-item skeleton-nav"></div>
967
- </div>
968
- <div class="skeleton-divider"></div>
969
- <div class="skeleton-convo-wrapper">
970
- <div class="skeleton-item skeleton-convo"></div>
971
- <div class="skeleton-item skeleton-convo"></div>
972
- <div class="skeleton-item skeleton-convo"></div>
973
- </div>
974
- </div>
975
-
976
- <nav>
977
- <ul class="nav-menu">
978
- <li class="nav-item active" data-page="pages">📚 Pages</li>
979
- <li class="nav-item" data-page="chat">💬 Chat</li>
980
- <li class="nav-item" data-page="tasks">&nbsp;✓&nbsp;Tasks</li>
981
- <li class="nav-item" data-page="files">📁 Files</li>
982
- </ul>
983
- </nav>
984
- <slot name="sidebar-nav"></slot>
985
- <slot name="sidebar"></slot>
986
- <slot name="sidebar-content"></slot>
987
- <div class="sidebar-spacer"></div>
988
- <shadow-claw-conversations></shadow-claw-conversations>
989
- <slot name="sidebar-footer"></slot>
990
- <div class="sidebar-footer">
991
- <button class="settings-btn" data-action="show-settings">
992
- ⚙️ Settings
993
- </button>
994
- </div>
995
- </aside>
996
- <div class="sidebar-resize-handle" title="Drag to resize sidebar"></div>
997
-
998
- <!-- Main Content -->
999
- <main class="main-content">
1000
- <div class="main-content-boot-skeleton" aria-hidden="true">
1001
- <svg
1002
- class="boot-loading-svg"
1003
- viewBox="0 0 44 44"
1004
- xmlns="http://www.w3.org/2000/svg"
1005
- >
1006
- <g
1007
- fill="none"
1008
- fill-rule="evenodd"
1009
- stroke-width="2"
1010
- stroke="currentColor"
1011
- >
1012
- <circle cx="22" cy="22" r="1">
1013
- <animate
1014
- attributeName="r"
1015
- begin="0s"
1016
- dur="1.8s"
1017
- values="1; 20"
1018
- calcMode="spline"
1019
- keyTimes="0; 1"
1020
- keySplines="0.165, 0.84, 0.44, 1"
1021
- repeatCount="indefinite"
1022
- />
1023
- <animate
1024
- attributeName="stroke-opacity"
1025
- begin="0s"
1026
- dur="1.8s"
1027
- values="1; 0"
1028
- calcMode="spline"
1029
- keyTimes="0; 1"
1030
- keySplines="0.3, 0.61, 0.355, 1"
1031
- repeatCount="indefinite"
1032
- />
1033
- </circle>
1034
- <circle cx="22" cy="22" r="1">
1035
- <animate
1036
- attributeName="r"
1037
- begin="-0.9s"
1038
- dur="1.8s"
1039
- values="1; 20"
1040
- calcMode="spline"
1041
- keyTimes="0; 1"
1042
- keySplines="0.165, 0.84, 0.44, 1"
1043
- repeatCount="indefinite"
1044
- />
1045
- <animate
1046
- attributeName="stroke-opacity"
1047
- begin="-0.9s"
1048
- dur="1.8s"
1049
- values="1; 0"
1050
- calcMode="spline"
1051
- keyTimes="0; 1"
1052
- keySplines="0.3, 0.61, 0.355, 1"
1053
- repeatCount="indefinite"
1054
- />
1055
- </circle>
1056
- </g>
1057
- </svg>
1058
- <div class="boot-loading-text">Preparing workspace...</div>
1059
- </div>
1060
-
1061
- <!-- Chat Page — element stamped on first navigation via showPage() -->
1062
- <div class="page chat-page" data-page-id="chat"></div>
1063
-
1064
- <!-- Tasks Page — element stamped on first navigation via showPage() -->
1065
- <div class="page" data-page-id="tasks"></div>
1066
-
1067
- <!-- Files Page — element stamped on first navigation via showPage() -->
1068
- <div class="page" data-page-id="files"></div>
1069
-
1070
- <!-- Pages Page — pre-stamped: this is the default landing route -->
1071
- <div class="page active" data-page-id="pages">
1072
- <shadow-claw-pages></shadow-claw-pages>
1073
- </div>
1074
-
1075
- <!-- Settings Page — element stamped on first navigation via showPage() -->
1076
- <div class="page" data-page-id="settings"></div>
1077
-
1078
- <!-- Tools Config Page — element stamped on first navigation via showPage() -->
1079
- <div class="page" data-page-id="tools"></div>
1080
-
1081
- <!-- Channels Config Page — element stamped on first navigation via showPage() -->
1082
- <div class="page" data-page-id="channels"></div>
1083
-
1084
- <!-- Chat Split View Resize Handle -->
1085
- <div
1086
- class="chat-split-resize-handle"
1087
- title="Drag to resize chat panel"
1088
- hidden
1089
- ></div>
1090
-
1091
- <!-- file-viewer is stamped lazily by setupEffects when a file is opened -->
1092
- <shadow-claw-toast></shadow-claw-toast>
1093
- </main>
1094
- </div>
1095
-
1096
- <shadow-claw-dialog
1097
- dialog-class="app-dialog"
1098
- dialog-aria-labelledby="appDialogTitle"
1099
- >
1100
- <form method="dialog" class="app-confirm-dialog__form">
1101
- <h2 id="appDialogTitle" class="app-dialog__title">Confirm</h2>
1102
- <p class="app-dialog__message"></p>
1103
- <ul class="app-dialog__details" hidden></ul>
1104
- <div class="app-dialog__links" hidden></div>
1105
- <p
1106
- class="app-dialog__countdown"
1107
- hidden
1108
- role="status"
1109
- aria-live="polite"
1110
- aria-atomic="true"
1111
- ></p>
1112
- <div class="app-confirm-dialog__actions">
1113
- <button
1114
- type="submit"
1115
- value="cancel"
1116
- class="app-dialog__btn app-dialog__btn--cancel"
1117
- >
1118
- Cancel
1119
- </button>
1120
- <button
1121
- type="submit"
1122
- value="confirm"
1123
- class="app-dialog__btn app-dialog__btn--confirm"
1124
- >
1125
- Confirm
1126
- </button>
1127
- </div>
1128
- </form>
1129
- </shadow-claw-dialog>
1130
-
1131
- <shadow-claw-dialog
1132
- dialog-class="app-dialog app-prompt-dialog"
1133
- dialog-aria-labelledby="appPromptTitle"
1134
- >
1135
- <form method="dialog" class="app-prompt-dialog__form">
1136
- <h2 id="appPromptTitle" class="app-prompt-dialog__title">
1137
- Agent Question
1138
- </h2>
1139
- <p class="app-prompt-dialog__message"></p>
1140
-
1141
- <div class="app-prompt-dialog__input-area">
1142
- <!-- Will be populated dynamically with either a select or text input -->
1143
- </div>
1144
-
1145
- <div class="app-prompt-dialog__actions">
1146
- <button
1147
- type="submit"
1148
- value="submit"
1149
- class="app-dialog__btn app-dialog__btn--confirm app-prompt-dialog__submit"
1150
- >
1151
- Submit
1152
- </button>
1153
- </div>
1154
- </form>
1155
- </shadow-claw-dialog>
1156
- </div>
1157
- </template>
1158
- `,`text/html`),st=$.querySelector(`template`);let ct=[];ct=st?Array.from(st.content.children):Array.from($.head.children).concat(Array.from($.body.children));var lt=ct;const ut=`shadow-claw`;var dt=class extends de{static styles=ot;static template=lt;activityLogCollapsedOverride=null;appLifecycleCleanup=null;chatSidebarHidden=!1;chatSplitViewEnabled=!1;currentPage=v.sidebarDefaultPage;db=null;fallbackClickListenerAttached=!1;filesSidebarHidden=!1;headerMainCollapsedOverride=null;navigationListenerAttached=!1;orchestrator;pagesSidebarHidden=!1;popstateListener=null;previousOrchestratorState=`idle`;tasksSidebarHidden=!1;terminalElement=null;terminalPlacementFrame=null;terminalVisible=!1;vmStatus={ready:!1,booting:!1,bootAttempted:!1,error:null};vmStatusCleanup=null;constructor(){super()}async connectedCallback(){if(!this.shadowRoot)throw Error(`shadowRoot not found`);await f();try{let{Orchestrator:e}=await import(`./orchestrator-DTNrntd4.js`);await f();let t=()=>{Promise.all([import(`./shadow-claw-conversations-DGYZdDa3.js`),import(`./shadow-claw-dialog-BVGf_c3S.js`),import(`./shadow-claw-toast-BmcOhMgX.js`)]).catch(console.error)};typeof window<`u`&&`requestIdleCallback`in window?window.requestIdleCallback(t):setTimeout(t,200),await f(),this.orchestrator||=new e,this.db=await this.orchestrator.init(),await f(),await v.init(this.db,this.orchestrator),c(this.db),await f(),await this.render(),await f();let n=v.activePage===`pages`&&this.pagesSidebarHidden||v.activePage===`chat`&&this.chatSidebarHidden||v.activePage===`tasks`&&this.tasksSidebarHidden||v.activePage===`files`&&this.filesSidebarHidden;if(v.hadPersistedActivePage&&!n?W(this.shadowRoot,this,this.db,v,v.activePage,!1):n?W(this.shadowRoot,this,this.db,v,N(v,this),!1):W(this.shadowRoot,this,this.db,v,v.activePage,!1),await q(this.shadowRoot,this,this.db,T,v,new URL(window.location.href)),await Xe(this.shadowRoot,this,this.db,this.orchestrator),await it(window,this.shadowRoot,this,this.db,this.orchestrator,v),await rt(window,this.shadowRoot,this,v,T,this.db,new URL(window.location.href)),console.log(`ShadowClaw UI initialized`),typeof customElements<`u`&&await customElements.whenDefined(`shadow-claw-${this.currentPage}`),this.currentPage===`pages`){let e=this.shadowRoot?.querySelector(`shadow-claw-pages`);e&&typeof e.renderSelectedPage==`function`&&!e.renderedKey&&await e.renderSelectedPage()}let{isMemoryStorageFallbackActive:r}=await import(`./memory-storage-BXMAJJV7.js`).then(e=>e.n);if(r()){let{showWarning:e}=await import(`./toast-CtIuHprH.js`).then(e=>e.c);e(`Private Browsing / Limited Storage: Operating in temporary in-memory mode. Files and changes will not persist across page reloads.`,7e3)}v.setReady()}finally{Le(document)}}disconnectedCallback(){if(super.disconnectedCallback(),this.vmStatusCleanup&&=(this.vmStatusCleanup(),null),this.appLifecycleCleanup&&=(this.appLifecycleCleanup(),null),this.terminalPlacementFrame!==null&&(cancelAnimationFrame(this.terminalPlacementFrame),this.terminalPlacementFrame=null),document.removeEventListener(`shadow-claw-navigate`,this.shadowClawNav),this.popstateListener&&=(window.removeEventListener(`popstate`,this.popstateListener),null),this.fallbackClickListenerAttached&&=(document.removeEventListener(`click`,this.fallbackClickListener),!1),this.navigationListenerAttached){let e=window.navigation;e&&typeof e.removeEventListener==`function`&&e.removeEventListener(`navigate`,this.handleNavigationApiNavigate),this.navigationListenerAttached=!1}}addCleanup(e){super.addCleanup(e)}fallbackClickListener=e=>{if(typeof window>`u`||!window.location)return;let t=ze(window.location,e);t&&(Ge(globalThis.history,t,{replace:!1,useTrailingSlash:!1}),q(this.shadowRoot,this,this.db,T,v,new URL(window.location.href)))};handleNavigationApiNavigate=e=>{let{parsedUrl:t,navigateEvent:n}=Re(this.db,e)??{};t&&n&&typeof n.intercept==`function`&&n.intercept({handler:async()=>{let{parseRouteFromUrlAsync:e}=await import(`./app-routes-H23VN-4O.js`).then(e=>e.t),n=await e(t,v.activeGroupId);n&&await K(this.shadowRoot,this,this.db,T,v,n)}})};shadowClawNav=e=>{this.shadowRoot&&this.db&&Je(this.shadowRoot,this,this.db,T,v,e)};async render(){if(Ie(window,document,this.shadowRoot,this,this.db,v,T,j,new URL(window.location.href)),await Ye(this.shadowRoot,this,v,this.db),this.db)try{let{getConfig:e}=await import(`./get-config-Bkvl__ZS.js`).then(e=>e.n),{isTruthyConfigValue:t}=await import(`./parse-boolean-config-BigJ9U46.js`).then(e=>e.r),{CONFIG_KEYS:n}=await import(`./config-y_2Fg77m.js`).then(e=>e.k),r=await e(this.db,n.CHAT_SPLIT_VIEW_ENABLED);this.chatSplitViewEnabled=t(r)}catch{this.chatSplitViewEnabled=!1}let e=this.shadowRoot?.querySelector(`.chat-split-resize-handle`);if(this.shadowRoot&&e instanceof HTMLElement){let{initChatSplitResize:t}=await import(`./init-chat-split-resize-B3imbCxV.js`);await t(this.shadowRoot,this,e,this.db)}this.terminalElement=document.createElement(`shadow-claw-terminal`),this.terminalElement&&(this.terminalElement.orchestrator=this.orchestrator),V(this.shadowRoot,this.currentPage,this.terminalVisible,this.vmStatus),I(this.shadowRoot,this.currentPage,this.terminalElement,this.terminalVisible,this.terminalPlacementFrame),L(this.shadowRoot,this.headerMainCollapsedOverride),B(this.shadowRoot,this.headerMainCollapsedOverride),R(this.shadowRoot,this.currentPage,v.activityLog.length);let t=e=>{this.vmStatus=e,e.error&&this.terminalVisible&&(this.terminalVisible=!1,this.terminalElement&&(this.terminalElement.hidden=!0),I(this.shadowRoot,this.currentPage,this.terminalElement,this.terminalVisible,this.terminalPlacementFrame)),V(this.shadowRoot,this.currentPage,this.terminalVisible,this.vmStatus)};this.vmStatus=this.orchestrator.vmStatus||this.vmStatus,V(this.shadowRoot,this.currentPage,this.terminalVisible,this.vmStatus),this.orchestrator.events.on?.(`vm-status`,t),this.vmStatusCleanup=()=>{this.orchestrator.events.off?.(`vm-status`,t)},this.orchestrator.events.on(`open-file`,e=>He(this.db,v,T,e)),this.orchestrator.events.on(`provider-help`,e=>Ue(document,this.shadowRoot,e)),this.orchestrator.events.on(`room-invite`,e=>We(document,this.shadowRoot,this,this.db,v,e)),this.orchestrator.events.on(`ask-user`,e=>Ve(document,this.shadowRoot,this,e)),at(this.shadowRoot,this,this.db,v)}async requestDialog(e){return Z(document,this.shadowRoot,e)}};customElements.get(ut)||customElements.define(ut,dt);