shadow-claw 1.34.5 → 1.36.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 (208) hide show
  1. package/.well-known/mcp/server-card.json +1 -1
  2. package/.well-known/mcp.json +1 -1
  3. package/README.md +5 -1
  4. package/dist/cli/build/build.js +1 -1
  5. package/dist/cli/{chunk-B4a6SyOL.js → chunk-6dsqmo6-.js} +3 -3
  6. package/dist/cli/chunk-BCLxzLO92.js +5 -0
  7. package/dist/cli/chunk-BHNCi3ui2.js +1 -0
  8. package/dist/cli/chunk-BMPhLSn8.js +1 -0
  9. package/dist/cli/chunk-BMW6QB5-2.js +27 -0
  10. package/dist/cli/chunk-BQCWtrzh.js +1 -0
  11. package/dist/cli/chunk-BQCWtrzh2.js +1 -0
  12. package/dist/cli/chunk-BT2f5jvi.js +1 -0
  13. package/dist/cli/chunk-BdJUjMuz.js +1 -0
  14. package/dist/cli/{chunk-DoHbMaWn.js → chunk-BwtEsB9s.js} +6 -6
  15. package/dist/cli/chunk-C47WdxKx2.js +1 -0
  16. package/dist/cli/{chunk-BRiGkTIi.js → chunk-CAqvQuGr.js} +1 -1
  17. package/dist/cli/{chunk-DoVxObGa2.js → chunk-CHzhUS1N2.js} +1 -1
  18. package/dist/cli/chunk-CUMlq7Jw2.js +263 -0
  19. package/dist/cli/chunk-CXi9LU9e2.js +110 -0
  20. package/dist/cli/chunk-ChefnX-r.js +110 -0
  21. package/dist/cli/{chunk-zvi71-77.js → chunk-D3JxbzjI2.js} +15 -15
  22. package/dist/cli/chunk-D7VYMl092.js +1 -0
  23. package/dist/cli/chunk-DMRbWmO2.js +1 -0
  24. package/dist/cli/chunk-DNIduiJ82.js +91 -0
  25. package/dist/cli/{chunk-C4UfzPK4.js → chunk-DTbrldk_.js} +1 -1
  26. package/dist/cli/chunk-DZ8YBXax.js +969 -0
  27. package/dist/cli/chunk-DduRvw8B2.js +1 -0
  28. package/dist/cli/chunk-DnYxGjdu2.js +1 -0
  29. package/dist/cli/chunk-Du5qiUIk.js +2 -0
  30. package/dist/cli/chunk-Ea7nXmgb2.js +1 -0
  31. package/dist/cli/{chunk-D9dku_3t.js → chunk-EohNY8vW.js} +1 -1
  32. package/dist/cli/chunk-LIIpZlwP2.js +1 -0
  33. package/dist/cli/chunk-LIJZHJml2.js +1 -0
  34. package/dist/cli/chunk-MHBh2BgF2.js +91 -0
  35. package/dist/cli/{chunk-BQ7lHA7c.js → chunk-SKgLGyTY.js} +1 -1
  36. package/dist/cli/chunk-kcJSXcbq2.js +1 -0
  37. package/dist/cli/chunk-rJtMBaNB.js +2 -0
  38. package/dist/cli/cli.js +12 -11
  39. package/dist/headless-agent.js +191 -187
  40. package/dist/lib/components/index.js +21 -21
  41. package/dist/lib/components/settings/shadow-claw-channel-config.js +1 -1
  42. package/dist/lib/components/settings/shadow-claw-control-plane.js +1 -1
  43. package/dist/lib/components/settings/shadow-claw-git.js +1 -1
  44. package/dist/lib/components/settings/shadow-claw-llm.js +1 -1
  45. package/dist/lib/components/settings/shadow-claw-networking.js +1 -1
  46. package/dist/lib/components/settings/shadow-claw-notifications.js +1 -1
  47. package/dist/lib/components/settings/shadow-claw-peerjs.js +1 -1
  48. package/dist/lib/components/settings/shadow-claw-storage.js +1 -1
  49. package/dist/lib/components/settings/shadow-claw-task-server.js +1 -1
  50. package/dist/lib/components/settings/shadow-claw-webvm.js +1 -1
  51. package/dist/lib/components/shadow-claw-channel-config.js +1 -1
  52. package/dist/lib/components/shadow-claw-channels.js +1 -1
  53. package/dist/lib/components/shadow-claw-chat.js +1 -1
  54. package/dist/lib/components/shadow-claw-control-plane.js +1 -1
  55. package/dist/lib/components/shadow-claw-conversations.js +1 -1
  56. package/dist/lib/components/shadow-claw-file-viewer.js +1 -1
  57. package/dist/lib/components/shadow-claw-files.js +1 -1
  58. package/dist/lib/components/shadow-claw-git.js +1 -1
  59. package/dist/lib/components/shadow-claw-llm.js +1 -1
  60. package/dist/lib/components/shadow-claw-networking.js +1 -1
  61. package/dist/lib/components/shadow-claw-notifications.js +1 -1
  62. package/dist/lib/components/shadow-claw-pages.js +1 -1
  63. package/dist/lib/components/shadow-claw-peerjs.js +1 -1
  64. package/dist/lib/components/shadow-claw-settings.js +1 -1
  65. package/dist/lib/components/shadow-claw-storage.js +1 -1
  66. package/dist/lib/components/shadow-claw-task-server.js +1 -1
  67. package/dist/lib/components/shadow-claw-tasks.js +1 -1
  68. package/dist/lib/components/shadow-claw-terminal.js +1 -1
  69. package/dist/lib/components/shadow-claw-tools.js +1 -1
  70. package/dist/lib/components/shadow-claw-webvm.js +1 -1
  71. package/dist/lib/components/shadow-claw.js +1 -1
  72. package/dist/lib/{configurePeerJs-DSRcNp3v.js → configurePeerJs-CdPzmpyI.js} +2 -2
  73. package/dist/lib/{configurePeerJs-DSRcNp3v.js.map → configurePeerJs-CdPzmpyI.js.map} +1 -1
  74. package/dist/lib/index.js +21 -21
  75. package/dist/lib/{initControlPlane-CWfE_Oan.js → initControlPlane-BLymRW34.js} +7 -7
  76. package/dist/lib/{initControlPlane-CWfE_Oan.js.map → initControlPlane-BLymRW34.js.map} +1 -1
  77. package/dist/lib/{orchestrator-BEUug1TW.js → orchestrator-DZkhJj7f.js} +13 -2
  78. package/dist/lib/{orchestrator-BEUug1TW.js.map → orchestrator-DZkhJj7f.js.map} +1 -1
  79. package/dist/lib/{orchestrator-CGUzfGbE.js → orchestrator-ZsQTRknI.js} +5 -5
  80. package/dist/lib/{orchestrator-CGUzfGbE.js.map → orchestrator-ZsQTRknI.js.map} +1 -1
  81. package/dist/lib/{peerjs-BSD88rT3.js → peerjs-CJYfnR5V.js} +3 -3
  82. package/dist/lib/{peerjs-BSD88rT3.js.map → peerjs-CJYfnR5V.js.map} +1 -1
  83. package/dist/lib/{push-client-CC3qifgc.js → push-client-C9hIPqLZ.js} +2 -2
  84. package/dist/lib/{push-client-CC3qifgc.js.map → push-client-C9hIPqLZ.js.map} +1 -1
  85. package/dist/lib/{shadow-claw-BWS-UVnE.js → shadow-claw-8qL2-QoK.js} +4 -4
  86. package/dist/lib/{shadow-claw-BWS-UVnE.js.map → shadow-claw-8qL2-QoK.js.map} +1 -1
  87. package/dist/lib/{shadow-claw-channel-config-DwMn3nFJ.js → shadow-claw-channel-config-CvnbqGBy.js} +3 -3
  88. package/dist/lib/{shadow-claw-channel-config-DwMn3nFJ.js.map → shadow-claw-channel-config-CvnbqGBy.js.map} +1 -1
  89. package/dist/lib/{shadow-claw-channels-BdE4cUlx.js → shadow-claw-channels-CkCvjWn1.js} +2 -2
  90. package/dist/lib/{shadow-claw-channels-BdE4cUlx.js.map → shadow-claw-channels-CkCvjWn1.js.map} +1 -1
  91. package/dist/lib/{shadow-claw-chat-DqaMoE9C.js → shadow-claw-chat-B1YEHKN3.js} +3 -3
  92. package/dist/lib/{shadow-claw-chat-DqaMoE9C.js.map → shadow-claw-chat-B1YEHKN3.js.map} +1 -1
  93. package/dist/lib/{shadow-claw-control-plane-D3DUDO29.js → shadow-claw-control-plane-jjo789IE.js} +6 -6
  94. package/dist/lib/{shadow-claw-control-plane-D3DUDO29.js.map → shadow-claw-control-plane-jjo789IE.js.map} +1 -1
  95. package/dist/lib/{shadow-claw-conversations-XT-OXogj.js → shadow-claw-conversations-MMT7wYH3.js} +2 -2
  96. package/dist/lib/{shadow-claw-conversations-XT-OXogj.js.map → shadow-claw-conversations-MMT7wYH3.js.map} +1 -1
  97. package/dist/lib/{shadow-claw-file-viewer-DJqxyd97.js → shadow-claw-file-viewer-qSkD1RQK.js} +2 -2
  98. package/dist/lib/{shadow-claw-file-viewer-DJqxyd97.js.map → shadow-claw-file-viewer-qSkD1RQK.js.map} +1 -1
  99. package/dist/lib/{shadow-claw-files-CUEJlA1o.js → shadow-claw-files-Cg8ycQ_N.js} +2 -2
  100. package/dist/lib/{shadow-claw-files-CUEJlA1o.js.map → shadow-claw-files-Cg8ycQ_N.js.map} +1 -1
  101. package/dist/lib/{shadow-claw-git-D_iVcb86.js → shadow-claw-git-gaClz-ZC.js} +3 -3
  102. package/dist/lib/{shadow-claw-git-D_iVcb86.js.map → shadow-claw-git-gaClz-ZC.js.map} +1 -1
  103. package/dist/lib/{shadow-claw-llm-C2msAsyU.js → shadow-claw-llm-DyOz0qzT.js} +2 -2
  104. package/dist/lib/{shadow-claw-llm-C2msAsyU.js.map → shadow-claw-llm-DyOz0qzT.js.map} +1 -1
  105. package/dist/lib/{shadow-claw-networking-D2NvodC-.js → shadow-claw-networking-B2xx0UUR.js} +2 -2
  106. package/dist/lib/{shadow-claw-networking-D2NvodC-.js.map → shadow-claw-networking-B2xx0UUR.js.map} +1 -1
  107. package/dist/lib/{shadow-claw-notifications-BcvVn_vu.js → shadow-claw-notifications-BjKfZy0k.js} +2 -2
  108. package/dist/lib/{shadow-claw-notifications-BcvVn_vu.js.map → shadow-claw-notifications-BjKfZy0k.js.map} +1 -1
  109. package/dist/lib/{shadow-claw-pages-CTMXRhEX.js → shadow-claw-pages-CJ2tsMtL.js} +2 -2
  110. package/dist/lib/{shadow-claw-pages-CTMXRhEX.js.map → shadow-claw-pages-CJ2tsMtL.js.map} +1 -1
  111. package/dist/lib/{shadow-claw-peerjs-C2YvypqM.js → shadow-claw-peerjs-CazCkXQ1.js} +3 -3
  112. package/dist/lib/{shadow-claw-peerjs-C2YvypqM.js.map → shadow-claw-peerjs-CazCkXQ1.js.map} +1 -1
  113. package/dist/lib/{shadow-claw-settings-B0hiDwEt.js → shadow-claw-settings-qro6pO9I.js} +2 -2
  114. package/dist/lib/{shadow-claw-settings-B0hiDwEt.js.map → shadow-claw-settings-qro6pO9I.js.map} +1 -1
  115. package/dist/lib/{shadow-claw-storage-Dt4yg4Q4.js → shadow-claw-storage-ewDdvCGa.js} +2 -2
  116. package/dist/lib/{shadow-claw-storage-Dt4yg4Q4.js.map → shadow-claw-storage-ewDdvCGa.js.map} +1 -1
  117. package/dist/lib/{shadow-claw-task-server-B2gbZaz4.js → shadow-claw-task-server-DpqQcNIs.js} +2 -2
  118. package/dist/lib/{shadow-claw-task-server-B2gbZaz4.js.map → shadow-claw-task-server-DpqQcNIs.js.map} +1 -1
  119. package/dist/lib/{shadow-claw-tasks-Bxq-niuM.js → shadow-claw-tasks-B2fMF4qE.js} +2 -2
  120. package/dist/lib/{shadow-claw-tasks-Bxq-niuM.js.map → shadow-claw-tasks-B2fMF4qE.js.map} +1 -1
  121. package/dist/lib/{shadow-claw-terminal-BfbW3xtg.js → shadow-claw-terminal-B25kQJC3.js} +2 -2
  122. package/dist/lib/{shadow-claw-terminal-BfbW3xtg.js.map → shadow-claw-terminal-B25kQJC3.js.map} +1 -1
  123. package/dist/lib/{shadow-claw-tools-BNSAaK0Y.js → shadow-claw-tools-B0y8JzoA.js} +10 -3
  124. package/dist/lib/{shadow-claw-tools-BNSAaK0Y.js.map → shadow-claw-tools-B0y8JzoA.js.map} +1 -1
  125. package/dist/lib/{shadow-claw-webvm-Dc2KmEXq.js → shadow-claw-webvm-CoCedIza.js} +2 -2
  126. package/dist/lib/{shadow-claw-webvm-Dc2KmEXq.js.map → shadow-claw-webvm-CoCedIza.js.map} +1 -1
  127. package/dist/lib/{syncWebMcpRegistration-BIL83P0Q.js → syncWebMcpRegistration-JKLALq4e.js} +2 -2
  128. package/dist/lib/{syncWebMcpRegistration-BIL83P0Q.js.map → syncWebMcpRegistration-JKLALq4e.js.map} +1 -1
  129. package/dist/lib/worker/utils/sandboxedEval.d.ts +8 -0
  130. package/dist/public/.well-known/mcp/server-card.json +1 -1
  131. package/dist/public/.well-known/mcp.json +1 -1
  132. package/dist/public/AGENTS.md +1 -1
  133. package/dist/public/README.md +5 -1
  134. package/dist/public/agent.worker.js +1 -1
  135. package/dist/public/components/shadow-claw-tools/shadow-claw-tools.html +1 -1
  136. package/dist/public/{configurePeerJs-B925t9C7.js → configurePeerJs-BrHeJGw1.js} +1 -1
  137. package/dist/public/docs/decisions/headless-cli-agent-participant.md +1 -1
  138. package/dist/public/docs/example/article/index.html +1 -1
  139. package/dist/public/docs/publishing/index.html +1 -1
  140. package/dist/public/docs/skill-creator/index.html +1 -1
  141. package/dist/public/docs/subsystems/cli.md +43 -32
  142. package/dist/public/docs/subsystems/skills.md +17 -0
  143. package/dist/public/docs/subsystems/tools.md +1 -1
  144. package/dist/public/e2e/README.md +2 -2
  145. package/dist/public/{e2e-bridge-CE1xleGn.js → e2e-bridge-D_lyH__p.js} +1 -1
  146. package/dist/public/{executeTool-DtTrsZHV.js → executeTool-b6DnRhcv.js} +2 -1
  147. package/dist/public/{file-viewer-LEEStSq-.js → file-viewer-CKrQoxZi.js} +1 -1
  148. package/dist/public/index.html +1 -1
  149. package/dist/public/index.js +1 -1
  150. package/dist/public/{initControlPlane-e2JgxXEb.js → initControlPlane-Dn-XFuxg.js} +1 -1
  151. package/dist/public/llms.txt +2 -0
  152. package/dist/public/main/index.html +1 -1
  153. package/dist/public/main/memory/index.html +1 -1
  154. package/dist/public/{orchestrator-Baif6kmu.js → orchestrator-0BnBtxHO.js} +3 -2
  155. package/dist/public/{orchestrator-TndREZPL.js → orchestrator-C3GKZriH.js} +1 -1
  156. package/dist/public/{peerjs-DE6WF3h2.js → peerjs-CgfLEp2N.js} +1 -1
  157. package/dist/public/{push-client-B_IkTpNm.js → push-client-D6DLiY1s.js} +1 -1
  158. package/dist/public/service-worker.js +1 -1
  159. package/dist/public/{shadow-claw-channels-BCGz36Zl.js → shadow-claw-channels-DSijinZ9.js} +1 -1
  160. package/dist/public/{shadow-claw-chat-H9U9jbqD.js → shadow-claw-chat-BeHlAjnA.js} +1 -1
  161. package/dist/public/{shadow-claw-control-plane-CeKh64s2.js → shadow-claw-control-plane-BfF_AZSg.js} +2 -2
  162. package/dist/public/{shadow-claw-conversations-C26t1HXN.js → shadow-claw-conversations-Bb_2bVLJ.js} +1 -1
  163. package/dist/public/{shadow-claw-DBeXILmk.js → shadow-claw-f71DlRdV.js} +2 -2
  164. package/dist/public/{shadow-claw-file-viewer-DWUoTjkr.js → shadow-claw-file-viewer-B67000Mm.js} +1 -1
  165. package/dist/public/{shadow-claw-files-BQ8DSX-z.js → shadow-claw-files-DeZZYt01.js} +1 -1
  166. package/dist/public/{shadow-claw-git-CIXyISw-.js → shadow-claw-git-Ccy25LuW.js} +2 -2
  167. package/dist/public/{shadow-claw-llm-D_GpOSZE.js → shadow-claw-llm-XjYcTlXT.js} +1 -1
  168. package/dist/public/{shadow-claw-networking-BYp5K3B7.js → shadow-claw-networking-efXQtydQ.js} +1 -1
  169. package/dist/public/{shadow-claw-notifications-ZiXmPweY.js → shadow-claw-notifications-Cq2ZSeJa.js} +1 -1
  170. package/dist/public/{shadow-claw-pages-BHXwf3BD.js → shadow-claw-pages-BVFNSSb1.js} +1 -1
  171. package/dist/public/{shadow-claw-settings-BfvDvt9c.js → shadow-claw-settings-B3sHxPh9.js} +2 -2
  172. package/dist/public/{shadow-claw-storage-Bvn85DII.js → shadow-claw-storage-DNdlzCgC.js} +1 -1
  173. package/dist/public/{shadow-claw-task-server-DZL_d8FC.js → shadow-claw-task-server-BJq0rpju.js} +1 -1
  174. package/dist/public/{shadow-claw-tasks-Cy8jzd8q.js → shadow-claw-tasks-CkF1uMeZ.js} +1 -1
  175. package/dist/public/{shadow-claw-terminal-BgEXr82T.js → shadow-claw-terminal-CnHhcpA-.js} +1 -1
  176. package/dist/public/{shadow-claw-tools-BjnssRSi.js → shadow-claw-tools-iw0fljud.js} +8 -1
  177. package/dist/public/{shadow-claw-webvm-tZ1VDoVA.js → shadow-claw-webvm-Bliu4V__.js} +1 -1
  178. package/dist/public/{syncWebMcpRegistration-CLMvJ4kV.js → syncWebMcpRegistration-D91usEMu.js} +1 -1
  179. package/package.json +1 -1
  180. package/src/cli/build/build.test.ts +11 -0
  181. package/src/cli/build/build.ts +10 -9
  182. package/src/cli/cli.ts +31 -2
  183. package/src/cli/commands/agent.test.ts +421 -0
  184. package/src/cli/commands/agent.ts +270 -20
  185. package/src/cli/commands/skills-index.test.ts +84 -2
  186. package/src/cli/commands/skills-index.ts +20 -2
  187. package/src/components/shadow-claw-tools/shadow-claw-tools.html +7 -0
  188. package/src/worker/headless-agent.ts +14 -0
  189. package/src/worker/headless-types.ts +39 -0
  190. package/src/worker/utils/native-eval-executor.test.ts +36 -0
  191. package/src/worker/utils/native-eval-executor.ts +58 -0
  192. package/src/worker/utils/sandboxedEval.ts +36 -0
  193. package/dist/cli/chunk-1BmpU7jO2.js +0 -1
  194. package/dist/cli/chunk-54Euq8Ji2.js +0 -1
  195. package/dist/cli/chunk-BTitwCgT2.js +0 -88
  196. package/dist/cli/chunk-Bjh76Dai.js +0 -1081
  197. package/dist/cli/chunk-C2HeZQ6K.js +0 -1
  198. package/dist/cli/chunk-Cdq9DIrc.js +0 -1
  199. package/dist/cli/chunk-CxdpafWg.js +0 -1
  200. package/dist/cli/chunk-DBk6e4N-.js +0 -1
  201. package/dist/cli/chunk-DEy72ZNV2.js +0 -88
  202. package/dist/cli/chunk-Da1BZyqf.js +0 -1
  203. package/dist/cli/chunk-FHsJD-Sf2.js +0 -27
  204. package/dist/cli/chunk-JBAAPRpe.js +0 -2
  205. package/dist/cli/chunk-aWgoVB7x2.js +0 -1
  206. package/dist/cli/chunk-hOceZVB92.js +0 -371
  207. package/dist/cli/chunk-pwNc6VtC2.js +0 -1
  208. package/dist/cli/chunk-uOnw3tuc.js +0 -2
@@ -1,4 +1,4 @@
1
- import{r as e}from"./config-D4lVqMs8.js";import{c as t,d as n,n as r,o as i,r as a,s as o}from"./app-routes-BMQ4HFaM.js";import{r as s}from"./txPromise-C2iYogHX.js";import{t as c}from"./getConfig-4saf0Tkq.js";import{d as l,i as u,l as d,n as f,r as p,s as m,u as h}from"./custom-element-security-CU1rI7Pw.js";import{t as g}from"./dist-B9m1QM9v.js";import{a as _,c as v,r as y,s as b,t as x,tn as S}from"./orchestrator-Baif6kmu.js";import{f as C,o as w,t as ee}from"./tools-BCttQkSs.js";import{t as T}from"./buffer-9oRIc-5Z.js";import{a as E,r as D,s as te}from"./toast-BXgUfbyh.js";import{t as ne}from"./shadow-claw-element-DIrv3P6A.js";import{t as O}from"./effect-BJCrpFdp.js";import{t as re}from"./config-value-oBfKgLT4.js";import"./shadow-claw-page-header-action-button-Bmua3mAb.js";import"./shadow-claw-page-header-Dmjiz5ah.js";import{n as k,t as ie}from"./markdown-BwIoGEdD.js";import{t as ae}from"./file-viewer-LEEStSq-.js";import{a as A,c as oe,i as se,l as ce,n as le,o as ue,r as de,s as fe,t as pe}from"./iframe-storage-proxy-BvRiccH0.js";function me(e,t,n){n&&(n.textContent=`Navigated to page: ${t||e.path}`)}function j(e,t){if(e===t||e===`main`&&t===`br:main`||e===`br:main`&&t===`main`)return!0;if(!e.includes(`:`)&&!t.includes(`:`))return!1;let n=e=>e.trim().replace(/:/g,`-`);return n(e)===n(t)}function M(e,t,a,s=typeof window<`u`?window.location.origin:``){let c=e.trim();if(!c||c.startsWith(`#`))return null;let l=c.split(/[?#]/,1)[0],u=l.replace(/^(?:\.\/)+/u,``),d=[];if(u.startsWith(`files/`)&&d.push(`/${u}`),l.startsWith(`/`)){let e=l.lastIndexOf(`/files/`);e>0&&d.push(l.slice(e)),d.push(l)}for(let e of d){let t=o(e);if(t&&j(t.groupId,a))return t.path}let f=n(c,r(i(a,t)),s||(typeof window<`u`?window.location.origin:``));if(!f||s&&f.origin!==s)return null;let p=o(f.pathname);return!p||!j(p.groupId,a)?null:p.path}function N(e,r,i,a,o=typeof window<`u`?window.location.origin:``){if(!e)return e;let s=o||(typeof window<`u`?window.location.origin:``),c=new DOMParser().parseFromString(e,`text/html`),l=(e,o)=>{let l=Array.from(c.querySelectorAll(e));for(let e of l){let c=(e.getAttribute(o)||``).trim();if(!c||c.startsWith(`#`)||c.startsWith(`javascript:`))continue;let l=n(c,i,s);!l||s&&l.origin!==s||o===`href`&&!(t(l.pathname)||M(c,r,a,s))||e.setAttribute(o,`${l.pathname}${l.search}${l.hash}`)}};return l(`a[href]`,`href`),l(`img[src]`,`src`),l(`audio[src]`,`src`),l(`video[src]`,`src`),l(`source[src]`,`src`),c.body.innerHTML}const he={ALLOWED_URI_REGEXP:/^(?:(?:https?|mailto|ftp|tel|file|blob|data):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i,ADD_TAGS:[`iframe`,`figure`,`figcaption`],CUSTOM_ELEMENT_HANDLING:{tagNameCheck:e=>m(e),attributeNameCheck:()=>!0,allowCustomizedBuiltInElements:!1},ADD_ATTR:[`allow`,`allowfullscreen`,`frameborder`,`scrolling`,`referrerpolicy`,`loading`]};async function ge({content:e,filePath:t,searchParams:n=``,groupId:a,origin:o=typeof window<`u`?window.location?.origin:``,sanitizeOptions:s=he,resolveRelativeImagesInHtmlFn:c}){let l=r(i(a,t)),u=N(e,t,l,a,o),m=d(c?await c(u,t,a):u,s),h=crypto.randomUUID().replace(/-/g,``),g=r(`/assets/file-viewer-preview-bridge.js`),_=r(`/assets/iframe-storage-bridge.js`),v=f(),y=p(h),b=typeof document<`u`?document.getElementById(`shadow-claw-site-config`):null,x=b&&b.textContent?`<script id="shadow-claw-site-config" type="application/json">${b.textContent}<\/script>`:``,S=n?`<script nonce="${h}">(function(){try{Object.defineProperty(globalThis.location,"search",{get:function(){return ${JSON.stringify(n)};},configurable:true});}catch(e){}})();<\/script>`:``,C=v.map(({src:e,hasInit:t})=>{let n=e.startsWith(`http://`)||e.startsWith(`https://`)||e.startsWith(`//`)?e:r(e.startsWith(`/`)?e:`/${e.replace(/^pages\/main\//,``)}`),i=[`<script type="module" src="${n}" nonce="${h}"><\/script>`];return t&&i.push(`<script type="module" nonce="${h}">import("${n}").then((m) => { try { if (typeof m?.init === "function") m.init(); } catch (e) { console.error("[ShadowClaw] Error executing init for " + ${JSON.stringify(n)}, e); } }).catch(() => {});<\/script>`),i.join(`
1
+ import{r as e}from"./config-D4lVqMs8.js";import{c as t,d as n,n as r,o as i,r as a,s as o}from"./app-routes-BMQ4HFaM.js";import{r as s}from"./txPromise-C2iYogHX.js";import{t as c}from"./getConfig-4saf0Tkq.js";import{d as l,i as u,l as d,n as f,r as p,s as m,u as h}from"./custom-element-security-CU1rI7Pw.js";import{t as g}from"./dist-B9m1QM9v.js";import{a as _,c as v,r as y,s as b,t as x,tn as S}from"./orchestrator-0BnBtxHO.js";import{f as C,o as w,t as ee}from"./tools-BCttQkSs.js";import{t as T}from"./buffer-9oRIc-5Z.js";import{a as E,r as D,s as te}from"./toast-BXgUfbyh.js";import{t as ne}from"./shadow-claw-element-DIrv3P6A.js";import{t as O}from"./effect-BJCrpFdp.js";import{t as re}from"./config-value-oBfKgLT4.js";import"./shadow-claw-page-header-action-button-Bmua3mAb.js";import"./shadow-claw-page-header-Dmjiz5ah.js";import{n as k,t as ie}from"./markdown-BwIoGEdD.js";import{t as ae}from"./file-viewer-CKrQoxZi.js";import{a as A,c as oe,i as se,l as ce,n as le,o as ue,r as de,s as fe,t as pe}from"./iframe-storage-proxy-BvRiccH0.js";function me(e,t,n){n&&(n.textContent=`Navigated to page: ${t||e.path}`)}function j(e,t){if(e===t||e===`main`&&t===`br:main`||e===`br:main`&&t===`main`)return!0;if(!e.includes(`:`)&&!t.includes(`:`))return!1;let n=e=>e.trim().replace(/:/g,`-`);return n(e)===n(t)}function M(e,t,a,s=typeof window<`u`?window.location.origin:``){let c=e.trim();if(!c||c.startsWith(`#`))return null;let l=c.split(/[?#]/,1)[0],u=l.replace(/^(?:\.\/)+/u,``),d=[];if(u.startsWith(`files/`)&&d.push(`/${u}`),l.startsWith(`/`)){let e=l.lastIndexOf(`/files/`);e>0&&d.push(l.slice(e)),d.push(l)}for(let e of d){let t=o(e);if(t&&j(t.groupId,a))return t.path}let f=n(c,r(i(a,t)),s||(typeof window<`u`?window.location.origin:``));if(!f||s&&f.origin!==s)return null;let p=o(f.pathname);return!p||!j(p.groupId,a)?null:p.path}function N(e,r,i,a,o=typeof window<`u`?window.location.origin:``){if(!e)return e;let s=o||(typeof window<`u`?window.location.origin:``),c=new DOMParser().parseFromString(e,`text/html`),l=(e,o)=>{let l=Array.from(c.querySelectorAll(e));for(let e of l){let c=(e.getAttribute(o)||``).trim();if(!c||c.startsWith(`#`)||c.startsWith(`javascript:`))continue;let l=n(c,i,s);!l||s&&l.origin!==s||o===`href`&&!(t(l.pathname)||M(c,r,a,s))||e.setAttribute(o,`${l.pathname}${l.search}${l.hash}`)}};return l(`a[href]`,`href`),l(`img[src]`,`src`),l(`audio[src]`,`src`),l(`video[src]`,`src`),l(`source[src]`,`src`),c.body.innerHTML}const he={ALLOWED_URI_REGEXP:/^(?:(?:https?|mailto|ftp|tel|file|blob|data):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i,ADD_TAGS:[`iframe`,`figure`,`figcaption`],CUSTOM_ELEMENT_HANDLING:{tagNameCheck:e=>m(e),attributeNameCheck:()=>!0,allowCustomizedBuiltInElements:!1},ADD_ATTR:[`allow`,`allowfullscreen`,`frameborder`,`scrolling`,`referrerpolicy`,`loading`]};async function ge({content:e,filePath:t,searchParams:n=``,groupId:a,origin:o=typeof window<`u`?window.location?.origin:``,sanitizeOptions:s=he,resolveRelativeImagesInHtmlFn:c}){let l=r(i(a,t)),u=N(e,t,l,a,o),m=d(c?await c(u,t,a):u,s),h=crypto.randomUUID().replace(/-/g,``),g=r(`/assets/file-viewer-preview-bridge.js`),_=r(`/assets/iframe-storage-bridge.js`),v=f(),y=p(h),b=typeof document<`u`?document.getElementById(`shadow-claw-site-config`):null,x=b&&b.textContent?`<script id="shadow-claw-site-config" type="application/json">${b.textContent}<\/script>`:``,S=n?`<script nonce="${h}">(function(){try{Object.defineProperty(globalThis.location,"search",{get:function(){return ${JSON.stringify(n)};},configurable:true});}catch(e){}})();<\/script>`:``,C=v.map(({src:e,hasInit:t})=>{let n=e.startsWith(`http://`)||e.startsWith(`https://`)||e.startsWith(`//`)?e:r(e.startsWith(`/`)?e:`/${e.replace(/^pages\/main\//,``)}`),i=[`<script type="module" src="${n}" nonce="${h}"><\/script>`];return t&&i.push(`<script type="module" nonce="${h}">import("${n}").then((m) => { try { if (typeof m?.init === "function") m.init(); } catch (e) { console.error("[ShadowClaw] Error executing init for " + ${JSON.stringify(n)}, e); } }).catch(() => {});<\/script>`),i.join(`
2
2
  `)}).join(`
3
3
  `),w=ce();return[`<!doctype html>`,`<html class="${fe()}"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">`,`<meta http-equiv="Content-Security-Policy" content="${y}">`,`<base href="${l}" target="_blank">`,S,x,`<script src="${_}" nonce="${h}"><\/script>`,`<script src="${g}" nonce="${h}"><\/script>`,oe(),w,C,`</head><body>`,m,`</body></html>`].join(``)}function _e(e,t){return t===0?{isPrevDisabled:!0,isNextDisabled:!0}:{isPrevDisabled:e<=0,isNextDisabled:e<0||e>=t-1}}async function P(e,t,n=e=>x.removeAllPages(e)){return!e||!await t({title:`Remove All Pages`,message:`Remove ALL saved pages from Pages? This cannot be undone!`,confirmLabel:`Remove All`,cancelLabel:`Cancel`})?!1:(await n(e),!0)}const F={setItem:A,deleteItem:le,clear:pe,getAll:se,getItem:de,putItem:A};async function I(e,t,n,r=F){switch(e){case`setItem`:await r.setItem(n,String(t.key||``),t.value);return;case`removeItem`:await r.deleteItem(n,String(t.key||``));return;case`clear`:await r.clear(n);return;case`getAllItems`:return await r.getAll(n);case`idb-get`:return await r.getItem(`${n}::idb::${t.dbName}::${t.storeName}`,String(t.key||``));case`idb-getAll`:return await r.getAll(`${n}::idb::${t.dbName}::${t.storeName}`);case`idb-put`:{let e=t.key==null?`__auto_${Date.now()}`:String(t.key);return await r.putItem(`${n}::idb::${t.dbName}::${t.storeName}`,e,t.value),e}case`idb-delete`:await r.deleteItem(`${n}::idb::${t.dbName}::${t.storeName}`,String(t.key||``));return;case`idb-clear`:await r.clear(`${n}::idb::${t.dbName}::${t.storeName}`);return;case`idb-deleteDatabase`:await r.clear(`${n}::idb::${t.dbName}::__default__`);return;case`idb-count`:{let e=await r.getAll(`${n}::idb::${t.dbName}::${t.storeName}`);return Object.keys(e).length}default:throw Error(`Unknown storage proxy method: ${e}`)}}async function ve(e,t,n,r,i,a=F){if(t)try{let o=await I(n,r,i,a);e.postMessage({type:`shadow-claw-storage-proxy-result`,requestId:t,result:o??null},`*`)}catch(n){e.postMessage({type:`shadow-claw-storage-proxy-result`,requestId:t,error:n instanceof Error?n.message:String(n)},`*`)}}function ye({root:e,rendered:t,selectedPath:n,onIframeLoad:r}){let i=e.querySelector(`[data-pages-iframe]`);if(i instanceof HTMLIFrameElement)return i;let a=document.createElement(`iframe`);return a.className=`pages__iframe`,a.setAttribute(`data-pages-iframe`,``),a.setAttribute(`title`,n?`Preview: ${n}`:`Page preview`),a.setAttribute(`sandbox`,u()),a.setAttribute(`allow`,`fullscreen`),a.hidden=!0,r&&a.addEventListener(`load`,()=>{r(a.contentWindow)}),t.before(a),a}function L(e){if(typeof e==`string`||typeof e==`number`){let t=parseInt(String(e),10);if(!isNaN(t)&&t>=0)return Math.min(t,86400)}return 0}async function be(t,n=c){if(!t)return 0;try{return L(await n(t,e.PAGES_AUTO_REFRESH_INTERVAL))}catch{return 0}}function R(e){if(!e)return``;let t=e.groupId;return t===`main`&&(t=`br:main`),`${t}\u0000${e.path}`}function z(e,t=[]){if(!e)return-1;let n=R(e);return t.findIndex(e=>R(e)===n)}function xe(e=[]){let t=new Map;return e.forEach(e=>{let n=t.get(e.groupId)||[];n.push(e),t.set(e.groupId,n)}),t}function Se(e,t){if(!t||t.hidden)return!1;let n=e.replace(/^#/,``),r=t.querySelector(`[id="${n}"]`)||t.querySelector(`a[name="${n}"]`);return r?(r.scrollIntoView({behavior:`smooth`,block:`start`}),!0):!1}function Ce(e){let t=e.detail;return t&&t.interval!==void 0?L(t.interval):null}function we(e,t){return!e||!t||!e.groupId||!e.path||e.path!==t.path?!1:e.groupId===t.groupId||j(e.groupId,t.groupId)}function Te(e,t){let n=e.detail;return we(n,t)}function B(e,t){let n=[`data-no-nav`,`data-no-swipe`,`data-no-page-nav`,`data-prevent-nav`,`data-prevent-page-nav`,`data-isolate-input`,`data-isolate-navigation`,`data-game-controls`],r=e=>{if(!e||!(e instanceof HTMLElement))return!1;let t=e.tagName.toLowerCase();return!!(t===`input`||t===`textarea`||t===`select`||t===`option`||t===`iframe`||e.classList.contains(`pages__preview-frame`)||e.isContentEditable||e.contentEditable===`true`||e.getAttribute(`contenteditable`)===`true`||e.hasAttribute(`contenteditable`)||e.closest(`[data-pages-list]`)||e.closest(`[data-pages-dropdown]`)||e.closest(`.pages__sidebar`)||e.closest(`.pages__preview-frame`)||e.closest(`iframe`)||n.some(t=>e.closest(`[${t}]`)))};if(t&&r(t))return!0;if(e){let t=typeof e.composedPath==`function`?e.composedPath():[];for(let e of t)if(e instanceof HTMLElement){let t=e.tagName.toLowerCase();if(n.some(t=>e.hasAttribute(t))||t===`input`||t===`textarea`||t===`select`||t===`option`||t===`iframe`||e.classList.contains(`pages__preview-frame`)||e.isContentEditable||e.contentEditable===`true`||e.getAttribute(`contenteditable`)===`true`||e.hasAttribute(`contenteditable`))return!0}if(e.target&&r(e.target))return!0}return!1}function Ee(e,t){return t||e.key!==`ArrowLeft`&&e.key!==`ArrowRight`||e.ctrlKey||e.altKey||e.metaKey?null:e.key===`ArrowLeft`?`previous`:`next`}function De(e,t,n,r){if(!t)return;let i=n?.activeElement||document.activeElement,a=Ee(e,B(e,e.target||null)||B(void 0,i));a&&(e.preventDefault(),r(a))}function Oe(e,t,n=Date.now()){return e.button!==0||t?{mouseStartX:0,mouseStartY:0,mouseStartTime:0,isMouseDown:!1}:{mouseStartX:e.clientX,mouseStartY:e.clientY,mouseStartTime:n,isMouseDown:!0}}function V(e,t,n,r,i,a=Date.now(),o=50,s=600){let c=n-e,l=r-t,u=a-i;return Math.abs(c)>=o&&Math.abs(c)>Math.abs(l)&&u<=s?c<0?`next`:`previous`:null}function ke(e,t,n,r,i=Date.now()){return!t.isMouseDown||n||r?null:V(t.mouseStartX,t.mouseStartY,e.clientX,e.clientY,t.mouseStartTime,i)}function Ae(e,t,n){if(t===n||t<0||t>=e.length||n<0||n>=e.length)return e;let r=[...e],[i]=r.splice(t,1);return r.splice(n,0,i),r}async function je({db:e,currentPages:t,fromIndex:n,toIndex:r,reorderStoreFn:i=(e,t)=>x.reorderPages(e,t)}){if(!e||n===r)return{reordered:!1,reorderedPages:t,movedToFirst:null};let a=Ae(t,n,r);if(a===t)return{reordered:!1,reorderedPages:t,movedToFirst:null};await i(e,a);let o=a[r]||null;return{reordered:!0,reorderedPages:a,movedToFirst:r===0?o:null}}function Me(e,t,n,r=Date.now()){if(!t.touchStartTime||n)return null;if(e.changedTouches&&e.changedTouches.length===1){let n=e.changedTouches[0].clientX,i=e.changedTouches[0].clientY;return V(t.touchStartX,t.touchStartY,n,i,t.touchStartTime,r)}return null}function Ne(e,t,n=Date.now()){return t?{touchStartX:0,touchStartY:0,touchStartTime:0}:e.touches&&e.touches.length===1?{touchStartX:e.touches[0].clientX,touchStartY:e.touches[0].clientY,touchStartTime:n}:null}function Pe(e,t,n){return!e&&t?`render-and-timer`:e&&n?`clear-timer`:`noop`}function Fe(e,t){return!e&&t}function Ie(e){return/\.(html?|xhtml)$/iu.test(e)}function Le(e){return/\.(md|markdown)$/iu.test(e)}function Re(e){if(!e||typeof e!=`object`)return null;let t=e;return t.type===`shadow-claw-broadcast-result`&&typeof t.channel==`string`?{kind:`broadcast-result`,channel:t.channel,payload:t.payload}:t.type===`shadow-claw-storage-proxy`?{kind:`storage-proxy`,requestId:String(t.requestId||``),method:String(t.method||``),args:t.args&&typeof t.args==`object`?t.args:{}}:t.type===`shadow-claw-swipe`&&typeof t.direction==`string`?{kind:`swipe`,direction:t.direction}:t.type===`shadow-claw-iframe-resize`&&typeof t.height==`number`?{kind:`iframe-resize`,height:t.height}:t.type===`shadow-claw-file-viewer-link`&&typeof t.href==`string`?{kind:`file-viewer-link`,href:t.href}:null}var H=T();function U(e){return{apng:`image/apng`,avif:`image/avif`,gif:`image/gif`,jpg:`image/jpeg`,jpeg:`image/jpeg`,png:`image/png`,svg:`image/svg+xml`,webp:`image/webp`}[e]??`image/jpeg`}async function ze({db:e,groupId:t,workspacePath:n,readGroupFileBytesFn:i=S,writeGroupFileFn:a=w,fetchFn:o=typeof fetch<`u`?fetch:void 0}){if(e)try{let r=await i(e,t,n),a=U(n.split(`.`).pop()?.toLowerCase()||``),o=new Uint8Array(r.byteLength);return o.set(new Uint8Array(r)),`data:${a};base64,${H.Buffer.from(o).toString(`base64`)}`}catch{}if(!o)return null;try{let i=n.replace(/^\/+/,``),s=[r(`/files/main/${i}`),r(`/static-main/${i}`),r(`/pages/main/${i}`)];for(let r of s)try{let i=await o(typeof window<`u`&&window.location?.origin?new URL(r,window.location.origin).toString():r);if(i.ok){let r=await i.blob();if(e)try{let i=await r.arrayBuffer();await a(e,t,n,new Uint8Array(i))}catch{}if(typeof FileReader<`u`)return await new Promise((e,t)=>{let n=new FileReader;n.onload=()=>e(n.result),n.onerror=t,n.readAsDataURL(r)});let o=await r.arrayBuffer(),s=H.Buffer.from(o).toString(`base64`);return`data:${r.type||U(n.split(`.`).pop()||``)};base64,${s}`}}catch{}}catch{}return null}function W(e){let t=e.querySelector(`[data-pages-iframe]`);t instanceof HTMLIFrameElement&&(t.removeAttribute(`srcdoc`),t.remove())}async function G(e,t=typeof document<`u`?document.querySelector(`shadow-claw`):null,n=te){return t&&typeof t.requestDialog==`function`?await t.requestDialog({mode:`confirm`,...e}):(n(e.message,4500),!1)}async function Be(e,t,n=c){if(!e||typeof e.transaction!=`function`)return!0;try{return re(await n(e,t),!0)}catch{return!0}}function Ve(e,t,n=[]){if(e===t||j(e,t))return t;let r=n.find(t=>t.groupId===e);if(r)return r.groupId;let i=n.find(t=>j(e,t.groupId));return i?i.groupId:e||null}function He(e,t,n,r=[],i=typeof window<`u`?window.location.origin:``){let a=e.trim();if(!a||a.startsWith(`#`))return null;let s=[],c=a.split(/[?#]/,1)[0];if(/^[a-zA-Z][a-zA-Z\d+.-]*:/u.test(c)||c.startsWith(`//`)){let e;try{e=new URL(c,i||(typeof window<`u`?window.location.origin:``))}catch{return null}if(i&&e.origin!==i)return null;c=e.pathname}let l=c.replace(/^(?:\.\/)+/u,``);if(l.startsWith(`files/`)&&s.push(`/${l}`),c.startsWith(`/`)){let e=c.lastIndexOf(`/files/`);e>0&&s.push(c.slice(e)),s.push(c)}for(let e of s){let t=o(e);if(!t)continue;let i=Ve(t.groupId,n,r);if(i)return{groupId:i,path:t.path}}let u=M(a,t,n,i);return u?{groupId:n,path:u}:null}async function Ue({container:e,groupId:t,filePath:n,groups:r,readImageAsDataUrlFn:i}){let a=Array.from(e.querySelectorAll(`img[src]`));a.length!==0&&await Promise.all(a.map(async e=>{let a=e.getAttribute(`src`)||``;if(!a||/^(?:blob:|data:|#)/u.test(a))return;let o=He(a,n,t,r);if(!o)return;let s=await i(o.groupId,o.path);s&&e.setAttribute(`src`,s)}))}function K(e,t,n){return e>0&&!t&&n}function q(e){if(!e)return;let t=typeof document<`u`&&document.documentElement.classList.contains(`dark-mode`),n={};if(typeof document<`u`&&typeof getComputedStyle<`u`){let e=getComputedStyle(document.documentElement);for(let t=0;t<e.length;t++){let r=e[t];r.startsWith(`--`)&&(n[r]=e.getPropertyValue(r))}}e.postMessage({type:`shadow-claw-theme-update`,theme:t?`dark`:`light`,customProperties:n},`*`)}function We({root:e,currentOpen:t,force:n}){if(!e)return t;let r=e.querySelector(`[data-pages-dropdown]`),i=r instanceof HTMLDetailsElement&&r.open,a;a=n===void 0?!(i||t):n;let o=e.querySelector(`.pages__sidebar`),s=e.querySelector(`.pages__content`);return o&&o.classList.toggle(`collapsed`,!a),s&&s.classList.toggle(`pages__content--sidebar-collapsed`,!a),r instanceof HTMLDetailsElement&&(a?r.setAttribute(`open`,``):r.removeAttribute(`open`)),a}const J=new CSSStyleSheet;J.replaceSync(`* {
4
4
  box-sizing: border-box;
@@ -1,4 +1,4 @@
1
- import{r as e}from"./config-D4lVqMs8.js";import{n as t,r as n}from"./txPromise-C2iYogHX.js";import{g as r}from"./custom-element-security-CU1rI7Pw.js";import{Z as i,a,c as o,t as s}from"./orchestrator-Baif6kmu.js";import{s as c}from"./tools-BCttQkSs.js";import{n as l,r as u}from"./crypto-C8c5wMzN.js";import{a as d,i as f,r as p}from"./toast-BXgUfbyh.js";import{t as m}from"./shadow-claw-element-DIrv3P6A.js";import{t as h}from"./config-value-oBfKgLT4.js";import"./shadow-claw-page-header-Dmjiz5ah.js";import"./shadow-claw-dialog-BrOwAOdk.js";function g(e){try{return JSON.parse(JSON.stringify(e))}catch{return null}}async function _(t,n){let r=[],i=[];for(let a of t){let t=a.key;if(t===e.STORAGE_HANDLE)continue;if(t===e.GIT_PASSWORD||t===e.API_KEY||t.startsWith(`api_key:`)||t===e.IMESSAGE_API_KEY||t===e.TELEGRAM_BOT_TOKEN){if(n&&typeof a.value==`string`){let e=await l(a.value);e&&i.push({key:t,path:[],value:e})}continue}let o=g(a.value);if(t===e.GIT_ACCOUNTS&&Array.isArray(o))for(let e=0;e<o.length;e+=1){let r=o[e];if(!r||typeof r!=`object`)continue;let a=r.password;if(typeof a==`string`&&a){if(n){let n=await l(a);n&&i.push({key:t,path:[e,`password`],value:n})}delete r.password}}if(t===e.INTEGRATION_CONNECTIONS&&Array.isArray(o))for(let e=0;e<o.length;e+=1){let r=o[e]?.credentialRef,a=r?.encryptedSecret;if(typeof a==`string`&&a){if(n){let n=await l(a);n&&i.push({key:t,path:[e,`credentialRef`,`encryptedSecret`],value:n})}delete r.encryptedSecret}}if(t===e.REMOTE_MCP_CONNECTIONS&&Array.isArray(o))for(let e=0;e<o.length;e+=1){let r=o[e]?.credentialRef,a=r?.encryptedValue;if(typeof a==`string`&&a){if(n){let n=await l(a);n&&i.push({key:t,path:[e,`credentialRef`,`encryptedValue`],value:n})}delete r.encryptedValue}}r.push({key:t,value:o})}return{configEntries:r,plaintextPasswords:i}}function v(e,t,n){if(t.length===0)return n;let r=e;for(let n=0;n<t.length-1;n+=1){let i=t[n];if(typeof i==`number`){if(!Array.isArray(r)||!r[i])return e;r=r[i]}else{if(!r||typeof r!=`object`)return e;let t=r[i];if(!t||typeof t!=`object`)return e;r=t}}let i=t[t.length-1];if(typeof i==`number`){if(!Array.isArray(r))return e;r[i]=n}else{if(!r||typeof r!=`object`)return e;r[i]=n}return e}async function y(e,t){let n=await _(e,t);return{kind:`shadowclaw-settings-backup`,version:1,exportedAt:Date.now(),includePlaintextPasswords:t,configEntries:n.configEntries,plaintextPasswords:t?n.plaintextPasswords:void 0}}async function b(e,t){let n=await y(e,t);return new Blob([JSON.stringify(n,null,2)],{type:`application/json`})}async function x(e,t,n){let r=await y(t,n);await c(e,JSON.stringify(r,null,2))}async function S(e,t){if(!t.length)return e;let n=e.map(e=>({key:e.key,value:g(e.value)}));for(let e of t){let t=await u(e.value);if(!t)continue;let r=n.find(t=>t.key===e.key);r?r.value=v(r.value,e.path,t):e.path.length===0&&n.push({key:e.key,value:t})}return n}function C(e){let t=JSON.parse(e);if(t?.kind!==`shadowclaw-settings-backup`||t.version!==1||!Array.isArray(t.configEntries))throw Error(`Invalid settings backup file`);let n=Array.isArray(t.plaintextPasswords)?t.plaintextPasswords.filter(e=>e&&typeof e.key==`string`&&Array.isArray(e.path)&&typeof e.value==`string`):[];return{kind:`shadowclaw-settings-backup`,version:1,exportedAt:typeof t.exportedAt==`number`?t.exportedAt:Date.now(),includePlaintextPasswords:!!t.includePlaintextPasswords,configEntries:t.configEntries.filter(e=>e&&typeof e.key==`string`).map(e=>({key:e.key,value:e.value})),plaintextPasswords:n}}const w=new CSSStyleSheet;w.replaceSync(`*,
1
+ import{r as e}from"./config-D4lVqMs8.js";import{n as t,r as n}from"./txPromise-C2iYogHX.js";import{g as r}from"./custom-element-security-CU1rI7Pw.js";import{Z as i,a,c as o,t as s}from"./orchestrator-0BnBtxHO.js";import{s as c}from"./tools-BCttQkSs.js";import{n as l,r as u}from"./crypto-C8c5wMzN.js";import{a as d,i as f,r as p}from"./toast-BXgUfbyh.js";import{t as m}from"./shadow-claw-element-DIrv3P6A.js";import{t as h}from"./config-value-oBfKgLT4.js";import"./shadow-claw-page-header-Dmjiz5ah.js";import"./shadow-claw-dialog-BrOwAOdk.js";function g(e){try{return JSON.parse(JSON.stringify(e))}catch{return null}}async function _(t,n){let r=[],i=[];for(let a of t){let t=a.key;if(t===e.STORAGE_HANDLE)continue;if(t===e.GIT_PASSWORD||t===e.API_KEY||t.startsWith(`api_key:`)||t===e.IMESSAGE_API_KEY||t===e.TELEGRAM_BOT_TOKEN){if(n&&typeof a.value==`string`){let e=await l(a.value);e&&i.push({key:t,path:[],value:e})}continue}let o=g(a.value);if(t===e.GIT_ACCOUNTS&&Array.isArray(o))for(let e=0;e<o.length;e+=1){let r=o[e];if(!r||typeof r!=`object`)continue;let a=r.password;if(typeof a==`string`&&a){if(n){let n=await l(a);n&&i.push({key:t,path:[e,`password`],value:n})}delete r.password}}if(t===e.INTEGRATION_CONNECTIONS&&Array.isArray(o))for(let e=0;e<o.length;e+=1){let r=o[e]?.credentialRef,a=r?.encryptedSecret;if(typeof a==`string`&&a){if(n){let n=await l(a);n&&i.push({key:t,path:[e,`credentialRef`,`encryptedSecret`],value:n})}delete r.encryptedSecret}}if(t===e.REMOTE_MCP_CONNECTIONS&&Array.isArray(o))for(let e=0;e<o.length;e+=1){let r=o[e]?.credentialRef,a=r?.encryptedValue;if(typeof a==`string`&&a){if(n){let n=await l(a);n&&i.push({key:t,path:[e,`credentialRef`,`encryptedValue`],value:n})}delete r.encryptedValue}}r.push({key:t,value:o})}return{configEntries:r,plaintextPasswords:i}}function v(e,t,n){if(t.length===0)return n;let r=e;for(let n=0;n<t.length-1;n+=1){let i=t[n];if(typeof i==`number`){if(!Array.isArray(r)||!r[i])return e;r=r[i]}else{if(!r||typeof r!=`object`)return e;let t=r[i];if(!t||typeof t!=`object`)return e;r=t}}let i=t[t.length-1];if(typeof i==`number`){if(!Array.isArray(r))return e;r[i]=n}else{if(!r||typeof r!=`object`)return e;r[i]=n}return e}async function y(e,t){let n=await _(e,t);return{kind:`shadowclaw-settings-backup`,version:1,exportedAt:Date.now(),includePlaintextPasswords:t,configEntries:n.configEntries,plaintextPasswords:t?n.plaintextPasswords:void 0}}async function b(e,t){let n=await y(e,t);return new Blob([JSON.stringify(n,null,2)],{type:`application/json`})}async function x(e,t,n){let r=await y(t,n);await c(e,JSON.stringify(r,null,2))}async function S(e,t){if(!t.length)return e;let n=e.map(e=>({key:e.key,value:g(e.value)}));for(let e of t){let t=await u(e.value);if(!t)continue;let r=n.find(t=>t.key===e.key);r?r.value=v(r.value,e.path,t):e.path.length===0&&n.push({key:e.key,value:t})}return n}function C(e){let t=JSON.parse(e);if(t?.kind!==`shadowclaw-settings-backup`||t.version!==1||!Array.isArray(t.configEntries))throw Error(`Invalid settings backup file`);let n=Array.isArray(t.plaintextPasswords)?t.plaintextPasswords.filter(e=>e&&typeof e.key==`string`&&Array.isArray(e.path)&&typeof e.value==`string`):[];return{kind:`shadowclaw-settings-backup`,version:1,exportedAt:typeof t.exportedAt==`number`?t.exportedAt:Date.now(),includePlaintextPasswords:!!t.includePlaintextPasswords,configEntries:t.configEntries.filter(e=>e&&typeof e.key==`string`).map(e=>({key:e.key,value:e.value})),plaintextPasswords:n}}const w=new CSSStyleSheet;w.replaceSync(`*,
2
2
  *::before,
3
3
  *::after {
4
4
  font-family: var(--shadow-claw-font-sans);
@@ -885,7 +885,7 @@ import{r as e}from"./config-D4lVqMs8.js";import{n as t,r as n}from"./txPromise-C
885
885
  </div>
886
886
  </div>
887
887
  </template>
888
- `,`text/html`),E=T.querySelector(`template`);let D=[];D=E?Array.from(E.content.children):Array.from(T.head.children).concat(Array.from(T.body.children));var O=D;const k={ai:[()=>import(`./shadow-claw-llm-D_GpOSZE.js`)],environment:[()=>import(`./shadow-claw-networking-BYp5K3B7.js`),()=>import(`./shadow-claw-webvm-tZ1VDoVA.js`),()=>import(`./shadow-claw-storage-Bvn85DII.js`)],integrations:[()=>import(`./shadow-claw-git-CIXyISw-.js`),()=>import(`./shadow-claw-accounts-mwEG6uCb.js`),()=>import(`./shadow-claw-mcp-remote-BOywQXjw.js`),()=>import(`./shadow-claw-control-plane-CeKh64s2.js`),()=>import(`./shadow-claw-integrations-DdKq5-Qx.js`),()=>import(`./shadow-claw-task-server-DZL_d8FC.js`),()=>import(`./shadow-claw-notifications-ZiXmPweY.js`)]},A=new Set;async function j(e){if(A.has(e))return;let t=k[e];t&&(A.add(e),await Promise.all(t.map(e=>e())))}const M=`shadow-claw-settings`;var N=class extends m{static styles=w;static template=O;activeTab=`ai`;db=null;orchestrator=null;pendingRestoreFile=null;constructor(){super()}async connectedCallback(){if(!this.shadowRoot)throw Error(`shadowRoot not found`);this.db=await n(),this.orchestrator=s.orchestrator,await this.render()}activateTab(e){!e||this.activeTab===e||(this.activeTab=e,this.applyTabState())}applyTabState(){j(this.activeTab).catch(console.error);let e=this.shadowRoot;e&&(e.querySelectorAll(`[data-tab-target]`).forEach(e=>{let t=e.dataset.tabTarget===this.activeTab;e.classList.toggle(`active`,t),e.setAttribute(`aria-selected`,String(t)),e.tabIndex=t?0:-1}),e.querySelectorAll(`[data-tab-panel]`).forEach(e=>{e.hidden=e.dataset.tabPanel!==this.activeTab}))}bindSettingsActions(){let e=this.shadowRoot;if(!e)return;e.querySelector(`[data-action="backup-settings"]`)?.addEventListener(`click`,()=>this.openBackupDialog());let t=e.querySelector(`.settings__restore-input`);e.querySelector(`[data-action="restore-settings"]`)?.addEventListener(`click`,()=>{t instanceof HTMLInputElement&&(t.value=``,t.click())}),t?.addEventListener(`change`,e=>{let t=e.target;if(!(t instanceof HTMLInputElement))return;let n=t.files?.[0]||null;n&&(this.pendingRestoreFile=n,this.openRestoreDialog(n.name))}),e.querySelector(`[data-action="clear-settings"]`)?.addEventListener(`click`,()=>this.openClearDialog()),e.querySelector(`[data-action="cancel-backup-settings"]`)?.addEventListener(`click`,()=>this.closeDialog(`.settings__backup-dialog`)),e.querySelector(`[data-action="confirm-backup-settings"]`)?.addEventListener(`click`,()=>{this.confirmBackup()}),e.querySelector(`[data-action="cancel-restore-settings"]`)?.addEventListener(`click`,()=>{this.pendingRestoreFile=null,this.closeDialog(`.settings__restore-dialog`)}),e.querySelector(`[data-action="confirm-restore-settings"]`)?.addEventListener(`click`,()=>{this.confirmRestore()}),e.querySelector(`[data-action="cancel-clear-settings"]`)?.addEventListener(`click`,()=>this.closeDialog(`.settings__clear-dialog`)),e.querySelector(`[data-action="confirm-clear-settings"]`)?.addEventListener(`click`,()=>{this.confirmClear()}),e.querySelector(`[data-action="save-assistant-name"]`)?.addEventListener(`click`,()=>this.saveAssistantName()),e.querySelector(`[data-setting="activity-log-disk-logging-toggle"]`)?.addEventListener(`change`,e=>{let t=e.target;t&&this.onActivityLogDiskLoggingToggle(t.checked)}),e.querySelector(`[data-setting="sidebar-hide-pages-toggle"]`)?.addEventListener(`change`,e=>{let t=e.target;t&&this.onSidebarHidePagesToggle(t.checked)}),e.querySelector(`[data-setting="sidebar-hide-chat-toggle"]`)?.addEventListener(`change`,e=>{let t=e.target;t&&this.onSidebarHideChatToggle(t.checked)}),e.querySelector(`[data-setting="sidebar-hide-tasks-toggle"]`)?.addEventListener(`change`,e=>{let t=e.target;t&&this.onSidebarHideTasksToggle(t.checked)}),e.querySelector(`[data-setting="sidebar-hide-files-toggle"]`)?.addEventListener(`change`,e=>{let t=e.target;t&&this.onSidebarHideFilesToggle(t.checked)}),e.querySelector(`[data-setting="chat-split-view-toggle"]`)?.addEventListener(`change`,e=>{let t=e.target;t&&this.onChatSplitViewToggle(t.checked)}),e.querySelector(`[data-setting="pages-auto-refresh-input"]`)?.addEventListener(`change`,e=>{let t=e.target;if(t){let e=parseInt(t.value,10);this.onPagesAutoRefreshInputChange(isNaN(e)?0:e)}}),e.querySelector(`[data-setting="override-prerender-skeleton-toggle"]`)?.addEventListener(`change`,e=>{let t=e.target;t&&this.onOverridePrerenderSkeletonToggle(t.checked)}),e.querySelector(`[data-action="save-dom-allowed-iframe-hosts"]`)?.addEventListener(`click`,()=>{this.saveDomAllowedIframeHosts()})}closeDialog(e){this.getDialog(e)?.close()}getDialog(e){let t=this.shadowRoot;if(!t)return null;let n=t.querySelector(e);return n instanceof HTMLDialogElement?n:null}handleTabKeydown(e,t){let n=this.shadowRoot;if(!n)return;let r=Array.from(n.querySelectorAll(`[data-tab-target]`)),i=r.indexOf(t);if(i<0)return;let a=-1;switch(e.key){case`ArrowRight`:case`ArrowDown`:a=(i+1)%r.length;break;case`ArrowLeft`:case`ArrowUp`:a=(i-1+r.length)%r.length;break;case`Home`:a=0;break;case`End`:a=r.length-1;break;default:return}e.preventDefault();let o=r[a];o.focus(),this.activateTab(o.dataset.tabTarget)}openBackupDialog(){let e=this.shadowRoot?.querySelector(`[data-setting="include-plaintext-passwords"]`);e instanceof HTMLInputElement&&(e.checked=!1),this.showDialog(`.settings__backup-dialog`)}openClearDialog(){this.showDialog(`.settings__clear-dialog`)}openRestoreDialog(e){let t=this.shadowRoot?.querySelector(`[data-info="restore-filename"]`);t instanceof HTMLElement&&(t.textContent=`Selected file: ${e}`),this.showDialog(`.settings__restore-dialog`)}showDialog(e){let t=this.getDialog(e);if(t){if(typeof t.showModal==`function`){t.showModal();return}t.setAttribute(`open`,``)}}async confirmBackup(){if(!this.db){p(`Settings database is unavailable`,5e3);return}let e=this.shadowRoot?.querySelector(`[data-setting="include-plaintext-passwords"]`),t=e instanceof HTMLInputElement&&e.checked;try{if(t){let e=await this.promptForPlaintextBackupHandle();if(!e)return;await x(e,await this.getAllConfigEntries(),t),this.closeDialog(`.settings__backup-dialog`),d(`Settings backup saved`,3e3);return}let e=await b(await this.getAllConfigEntries(),t),n=URL.createObjectURL(e),r=document.createElement(`a`);r.href=n,r.download=`shadowclaw-settings-backup-${Date.now()}.json`,document.body.appendChild(r),r.click(),document.body.removeChild(r),URL.revokeObjectURL(n),this.closeDialog(`.settings__backup-dialog`),d(`Settings backup downloaded`,3e3)}catch(e){p(`Failed to backup settings: ${e instanceof Error?e.message:String(e)}`,6e3)}}async confirmClear(){if(!this.db){p(`Settings database is unavailable`,5e3);return}try{await this.replaceConfigEntries([]),this.closeDialog(`.settings__clear-dialog`),f(`Settings cleared. Reloading app...`,3200),setTimeout(()=>{window.location.reload()},250)}catch(e){p(`Failed to clear settings: ${e instanceof Error?e.message:String(e)}`,6e3)}}async confirmRestore(){if(!this.db){p(`Settings database is unavailable`,5e3);return}let e=this.pendingRestoreFile;if(!e){p(`No backup file selected`,4e3);return}try{let t=C(await e.text()),n=await S(t.configEntries,t.plaintextPasswords||[]);await this.replaceConfigEntries(n),this.pendingRestoreFile=null,this.closeDialog(`.settings__restore-dialog`),d(`Settings restored. Reloading app...`,3200),setTimeout(()=>{window.location.reload()},250)}catch(e){p(`Failed to restore settings: ${e instanceof Error?e.message:String(e)}`,6e3)}}async getAllConfigEntries(){if(!this.db)throw Error(`Database is unavailable`);if(t(this.db))return(this.db.db.prepare(`SELECT key, value FROM config ORDER BY key`).all()??[]).filter(e=>e&&typeof e.key==`string`).map(e=>({key:e.key,value:e.value}));let e=this.db;return await new Promise((t,n)=>{try{let r=e.transaction(`config`,`readonly`);if(!r){n(Error(`Failed to open read transaction`));return}let i=r.objectStore(`config`).getAll();i.onsuccess=()=>{t((Array.isArray(i.result)?i.result:[]).filter(e=>e&&typeof e.key==`string`).map(e=>({key:e.key,value:e.value})))},i.onerror=()=>{n(i.error||Error(`Failed to read settings config`))}}catch(e){n(e)}})}async onActivityLogDiskLoggingToggle(t){if(this.db)try{let{setConfig:n}=await import(`./setConfig-DdSThoKj.js`).then(e=>e.n);await n(this.db,e.ACTIVITY_LOG_DISK_LOGGING_ENABLED,t?`true`:`false`),d(t?`Activity log disk logging enabled`:`Activity log disk logging disabled`,2500)}catch(e){p(`Error saving activity log disk logging setting: `+(e instanceof Error?e.message:String(e)),6e3)}}async onChatSplitViewToggle(t){if(this.db)try{let{setConfig:n}=await import(`./setConfig-DdSThoKj.js`).then(e=>e.n);await n(this.db,e.CHAT_SPLIT_VIEW_ENABLED,t?`true`:`false`),this.dispatchEvent(new CustomEvent(`chat-split-view-change`,{detail:{enabled:t},bubbles:!0,composed:!0})),d(t?`Horizontal Chat split view enabled`:`Horizontal Chat split view disabled`,2500)}catch(e){p(`Error saving Chat split view setting: `+(e instanceof Error?e.message:String(e)),6e3)}}async onOverridePrerenderSkeletonToggle(t){try{o(`shadow-claw-override-prerender-skeleton`,t?`true`:`false`)}catch(e){console.warn(`Unable to save setting to localStorage:`,e)}if(this.db)try{let{setConfig:n}=await import(`./setConfig-DdSThoKj.js`).then(e=>e.n);await n(this.db,e.OVERRIDE_PRERENDER_SKELETON,t?`true`:`false`),d(t?`Pre-rendered content override enabled`:`Pre-rendered content override disabled`,2500)}catch(e){p(`Error saving pre-rendered content override setting: `+(e instanceof Error?e.message:String(e)),6e3)}}async onPagesAutoRefreshInputChange(t){if(!this.db)return;let n=Math.max(0,Math.min(t,86400));try{let{setConfig:t}=await import(`./setConfig-DdSThoKj.js`).then(e=>e.n);await t(this.db,e.PAGES_AUTO_REFRESH_INTERVAL,String(n)),window.dispatchEvent(new CustomEvent(`shadow-claw-pages-auto-refresh-change`,{detail:{interval:n}})),d(n>0?`Pages auto refresh set to ${n}s`:`Pages auto refresh disabled`,2500)}catch(e){p(`Error saving Pages auto refresh interval: `+(e instanceof Error?e.message:String(e)),6e3)}}async onSidebarHideChatToggle(t){if(this.db)try{let{setConfig:n}=await import(`./setConfig-DdSThoKj.js`).then(e=>e.n);await n(this.db,e.SIDEBAR_CHAT_HIDDEN,t?`true`:`false`),this.dispatchEvent(new CustomEvent(`sidebar-chat-visibility-change`,{detail:{hidden:t},bubbles:!0,composed:!0})),d(t?`Chat hidden in sidebar`:`Chat shown in sidebar`,2500)}catch(e){p(`Error saving sidebar Chat visibility: `+(e instanceof Error?e.message:String(e)),6e3)}}async onSidebarHideFilesToggle(t){if(this.db)try{let{setConfig:n}=await import(`./setConfig-DdSThoKj.js`).then(e=>e.n);await n(this.db,e.SIDEBAR_FILES_HIDDEN,t?`true`:`false`),this.dispatchEvent(new CustomEvent(`sidebar-files-visibility-change`,{detail:{hidden:t},bubbles:!0,composed:!0})),d(t?`Files hidden in sidebar`:`Files shown in sidebar`,2500)}catch(e){p(`Error saving sidebar Files visibility: `+(e instanceof Error?e.message:String(e)),6e3)}}async onSidebarHidePagesToggle(t){if(this.db)try{let{setConfig:n}=await import(`./setConfig-DdSThoKj.js`).then(e=>e.n);await n(this.db,e.SIDEBAR_PAGES_HIDDEN,t?`true`:`false`),this.dispatchEvent(new CustomEvent(`sidebar-pages-visibility-change`,{detail:{hidden:t},bubbles:!0,composed:!0})),d(t?`Pages hidden in sidebar`:`Pages shown in sidebar`,2500)}catch(e){p(`Error saving sidebar Pages visibility: `+(e instanceof Error?e.message:String(e)),6e3)}}async onSidebarHideTasksToggle(t){if(this.db)try{let{setConfig:n}=await import(`./setConfig-DdSThoKj.js`).then(e=>e.n);await n(this.db,e.SIDEBAR_TASKS_HIDDEN,t?`true`:`false`),this.dispatchEvent(new CustomEvent(`sidebar-tasks-visibility-change`,{detail:{hidden:t},bubbles:!0,composed:!0})),d(t?`Tasks hidden in sidebar`:`Tasks shown in sidebar`,2500)}catch(e){p(`Error saving sidebar Tasks visibility: `+(e instanceof Error?e.message:String(e)),6e3)}}async populateAssistantSettings(){let t=this.shadowRoot;if(!t||!this.db)return;let n=t.querySelector(`[data-setting="assistant-name-input"]`);if(n){let{getConfig:t}=await import(`./getConfig-4saf0Tkq.js`).then(e=>e.n),r=await t(this.db,e.ASSISTANT_NAME),i=this.orchestrator?.assistantName||s.orchestrator?.assistantName;n.value=typeof r==`string`&&r||i||`ShadowClaw`}let{getConfig:r}=await import(`./getConfig-4saf0Tkq.js`).then(e=>e.n),i=await r(this.db,e.ACTIVITY_LOG_DISK_LOGGING_ENABLED),c=i===!0||i===`true`||i===1||i===`1`,l=t.querySelector(`[data-setting="activity-log-disk-logging-toggle"]`);l&&(l.checked=c);let u=await r(this.db,e.SIDEBAR_PAGES_HIDDEN),d=u===!0||u===`true`||u===1||u===`1`,f=t.querySelector(`[data-setting="sidebar-hide-pages-toggle"]`);f&&(f.checked=d);let p=await r(this.db,e.SIDEBAR_CHAT_HIDDEN),m=p===!0||p===`true`||p===1||p===`1`,g=t.querySelector(`[data-setting="sidebar-hide-chat-toggle"]`);g&&(g.checked=m);let _=await r(this.db,e.SIDEBAR_TASKS_HIDDEN),v=_===!0||_===`true`||_===1||_===`1`,y=t.querySelector(`[data-setting="sidebar-hide-tasks-toggle"]`);y&&(y.checked=v);let b=await r(this.db,e.SIDEBAR_FILES_HIDDEN),x=b===!0||b===`true`||b===1||b===`1`,S=t.querySelector(`[data-setting="sidebar-hide-files-toggle"]`);S&&(S.checked=x);let C=h(await r(this.db,e.CHAT_SPLIT_VIEW_ENABLED),!1),w=t.querySelector(`[data-setting="chat-split-view-toggle"]`);w&&(w.checked=C);let T=t.querySelector(`[data-setting="pages-auto-refresh-input"]`);if(T){let t=await r(this.db,e.PAGES_AUTO_REFRESH_INTERVAL);if(typeof t==`string`||typeof t==`number`){let e=parseInt(String(t),10);T.value=!isNaN(e)&&e>=0?String(e):`0`}else T.value=`0`}let E=await r(this.db,e.OVERRIDE_PRERENDER_SKELETON),D=null;try{D=a(`shadow-claw-override-prerender-skeleton`)}catch{}let O=!0;if(E==null?D!==null&&(O=D===`true`):O=h(E),O)try{o(`shadow-claw-override-prerender-skeleton`,`true`)}catch{}let k=t.querySelector(`[data-setting="override-prerender-skeleton-toggle"]`);k&&(k.checked=O);let A=t.querySelector(`[data-setting="dom-allowed-iframe-hosts"]`);if(A){let t=await r(this.db,e.ALLOWED_IFRAME_HOST_PATTERNS);if(typeof t==`string`&&t.trim().length>0){A.value=t;let{setAllowedIframeHostPatterns:e}=await import(`./iframe-sanitizer-CKOO7cxp.js`).then(e=>e.r);e(t)}else{let{DEFAULT_ALLOWED_IFRAME_HOST_PATTERNS:e}=await import(`./iframe-sanitizer-CKOO7cxp.js`).then(e=>e.r);A.value=e.join(`
888
+ `,`text/html`),E=T.querySelector(`template`);let D=[];D=E?Array.from(E.content.children):Array.from(T.head.children).concat(Array.from(T.body.children));var O=D;const k={ai:[()=>import(`./shadow-claw-llm-XjYcTlXT.js`)],environment:[()=>import(`./shadow-claw-networking-efXQtydQ.js`),()=>import(`./shadow-claw-webvm-Bliu4V__.js`),()=>import(`./shadow-claw-storage-DNdlzCgC.js`)],integrations:[()=>import(`./shadow-claw-git-Ccy25LuW.js`),()=>import(`./shadow-claw-accounts-mwEG6uCb.js`),()=>import(`./shadow-claw-mcp-remote-BOywQXjw.js`),()=>import(`./shadow-claw-control-plane-BfF_AZSg.js`),()=>import(`./shadow-claw-integrations-DdKq5-Qx.js`),()=>import(`./shadow-claw-task-server-BJq0rpju.js`),()=>import(`./shadow-claw-notifications-Cq2ZSeJa.js`)]},A=new Set;async function j(e){if(A.has(e))return;let t=k[e];t&&(A.add(e),await Promise.all(t.map(e=>e())))}const M=`shadow-claw-settings`;var N=class extends m{static styles=w;static template=O;activeTab=`ai`;db=null;orchestrator=null;pendingRestoreFile=null;constructor(){super()}async connectedCallback(){if(!this.shadowRoot)throw Error(`shadowRoot not found`);this.db=await n(),this.orchestrator=s.orchestrator,await this.render()}activateTab(e){!e||this.activeTab===e||(this.activeTab=e,this.applyTabState())}applyTabState(){j(this.activeTab).catch(console.error);let e=this.shadowRoot;e&&(e.querySelectorAll(`[data-tab-target]`).forEach(e=>{let t=e.dataset.tabTarget===this.activeTab;e.classList.toggle(`active`,t),e.setAttribute(`aria-selected`,String(t)),e.tabIndex=t?0:-1}),e.querySelectorAll(`[data-tab-panel]`).forEach(e=>{e.hidden=e.dataset.tabPanel!==this.activeTab}))}bindSettingsActions(){let e=this.shadowRoot;if(!e)return;e.querySelector(`[data-action="backup-settings"]`)?.addEventListener(`click`,()=>this.openBackupDialog());let t=e.querySelector(`.settings__restore-input`);e.querySelector(`[data-action="restore-settings"]`)?.addEventListener(`click`,()=>{t instanceof HTMLInputElement&&(t.value=``,t.click())}),t?.addEventListener(`change`,e=>{let t=e.target;if(!(t instanceof HTMLInputElement))return;let n=t.files?.[0]||null;n&&(this.pendingRestoreFile=n,this.openRestoreDialog(n.name))}),e.querySelector(`[data-action="clear-settings"]`)?.addEventListener(`click`,()=>this.openClearDialog()),e.querySelector(`[data-action="cancel-backup-settings"]`)?.addEventListener(`click`,()=>this.closeDialog(`.settings__backup-dialog`)),e.querySelector(`[data-action="confirm-backup-settings"]`)?.addEventListener(`click`,()=>{this.confirmBackup()}),e.querySelector(`[data-action="cancel-restore-settings"]`)?.addEventListener(`click`,()=>{this.pendingRestoreFile=null,this.closeDialog(`.settings__restore-dialog`)}),e.querySelector(`[data-action="confirm-restore-settings"]`)?.addEventListener(`click`,()=>{this.confirmRestore()}),e.querySelector(`[data-action="cancel-clear-settings"]`)?.addEventListener(`click`,()=>this.closeDialog(`.settings__clear-dialog`)),e.querySelector(`[data-action="confirm-clear-settings"]`)?.addEventListener(`click`,()=>{this.confirmClear()}),e.querySelector(`[data-action="save-assistant-name"]`)?.addEventListener(`click`,()=>this.saveAssistantName()),e.querySelector(`[data-setting="activity-log-disk-logging-toggle"]`)?.addEventListener(`change`,e=>{let t=e.target;t&&this.onActivityLogDiskLoggingToggle(t.checked)}),e.querySelector(`[data-setting="sidebar-hide-pages-toggle"]`)?.addEventListener(`change`,e=>{let t=e.target;t&&this.onSidebarHidePagesToggle(t.checked)}),e.querySelector(`[data-setting="sidebar-hide-chat-toggle"]`)?.addEventListener(`change`,e=>{let t=e.target;t&&this.onSidebarHideChatToggle(t.checked)}),e.querySelector(`[data-setting="sidebar-hide-tasks-toggle"]`)?.addEventListener(`change`,e=>{let t=e.target;t&&this.onSidebarHideTasksToggle(t.checked)}),e.querySelector(`[data-setting="sidebar-hide-files-toggle"]`)?.addEventListener(`change`,e=>{let t=e.target;t&&this.onSidebarHideFilesToggle(t.checked)}),e.querySelector(`[data-setting="chat-split-view-toggle"]`)?.addEventListener(`change`,e=>{let t=e.target;t&&this.onChatSplitViewToggle(t.checked)}),e.querySelector(`[data-setting="pages-auto-refresh-input"]`)?.addEventListener(`change`,e=>{let t=e.target;if(t){let e=parseInt(t.value,10);this.onPagesAutoRefreshInputChange(isNaN(e)?0:e)}}),e.querySelector(`[data-setting="override-prerender-skeleton-toggle"]`)?.addEventListener(`change`,e=>{let t=e.target;t&&this.onOverridePrerenderSkeletonToggle(t.checked)}),e.querySelector(`[data-action="save-dom-allowed-iframe-hosts"]`)?.addEventListener(`click`,()=>{this.saveDomAllowedIframeHosts()})}closeDialog(e){this.getDialog(e)?.close()}getDialog(e){let t=this.shadowRoot;if(!t)return null;let n=t.querySelector(e);return n instanceof HTMLDialogElement?n:null}handleTabKeydown(e,t){let n=this.shadowRoot;if(!n)return;let r=Array.from(n.querySelectorAll(`[data-tab-target]`)),i=r.indexOf(t);if(i<0)return;let a=-1;switch(e.key){case`ArrowRight`:case`ArrowDown`:a=(i+1)%r.length;break;case`ArrowLeft`:case`ArrowUp`:a=(i-1+r.length)%r.length;break;case`Home`:a=0;break;case`End`:a=r.length-1;break;default:return}e.preventDefault();let o=r[a];o.focus(),this.activateTab(o.dataset.tabTarget)}openBackupDialog(){let e=this.shadowRoot?.querySelector(`[data-setting="include-plaintext-passwords"]`);e instanceof HTMLInputElement&&(e.checked=!1),this.showDialog(`.settings__backup-dialog`)}openClearDialog(){this.showDialog(`.settings__clear-dialog`)}openRestoreDialog(e){let t=this.shadowRoot?.querySelector(`[data-info="restore-filename"]`);t instanceof HTMLElement&&(t.textContent=`Selected file: ${e}`),this.showDialog(`.settings__restore-dialog`)}showDialog(e){let t=this.getDialog(e);if(t){if(typeof t.showModal==`function`){t.showModal();return}t.setAttribute(`open`,``)}}async confirmBackup(){if(!this.db){p(`Settings database is unavailable`,5e3);return}let e=this.shadowRoot?.querySelector(`[data-setting="include-plaintext-passwords"]`),t=e instanceof HTMLInputElement&&e.checked;try{if(t){let e=await this.promptForPlaintextBackupHandle();if(!e)return;await x(e,await this.getAllConfigEntries(),t),this.closeDialog(`.settings__backup-dialog`),d(`Settings backup saved`,3e3);return}let e=await b(await this.getAllConfigEntries(),t),n=URL.createObjectURL(e),r=document.createElement(`a`);r.href=n,r.download=`shadowclaw-settings-backup-${Date.now()}.json`,document.body.appendChild(r),r.click(),document.body.removeChild(r),URL.revokeObjectURL(n),this.closeDialog(`.settings__backup-dialog`),d(`Settings backup downloaded`,3e3)}catch(e){p(`Failed to backup settings: ${e instanceof Error?e.message:String(e)}`,6e3)}}async confirmClear(){if(!this.db){p(`Settings database is unavailable`,5e3);return}try{await this.replaceConfigEntries([]),this.closeDialog(`.settings__clear-dialog`),f(`Settings cleared. Reloading app...`,3200),setTimeout(()=>{window.location.reload()},250)}catch(e){p(`Failed to clear settings: ${e instanceof Error?e.message:String(e)}`,6e3)}}async confirmRestore(){if(!this.db){p(`Settings database is unavailable`,5e3);return}let e=this.pendingRestoreFile;if(!e){p(`No backup file selected`,4e3);return}try{let t=C(await e.text()),n=await S(t.configEntries,t.plaintextPasswords||[]);await this.replaceConfigEntries(n),this.pendingRestoreFile=null,this.closeDialog(`.settings__restore-dialog`),d(`Settings restored. Reloading app...`,3200),setTimeout(()=>{window.location.reload()},250)}catch(e){p(`Failed to restore settings: ${e instanceof Error?e.message:String(e)}`,6e3)}}async getAllConfigEntries(){if(!this.db)throw Error(`Database is unavailable`);if(t(this.db))return(this.db.db.prepare(`SELECT key, value FROM config ORDER BY key`).all()??[]).filter(e=>e&&typeof e.key==`string`).map(e=>({key:e.key,value:e.value}));let e=this.db;return await new Promise((t,n)=>{try{let r=e.transaction(`config`,`readonly`);if(!r){n(Error(`Failed to open read transaction`));return}let i=r.objectStore(`config`).getAll();i.onsuccess=()=>{t((Array.isArray(i.result)?i.result:[]).filter(e=>e&&typeof e.key==`string`).map(e=>({key:e.key,value:e.value})))},i.onerror=()=>{n(i.error||Error(`Failed to read settings config`))}}catch(e){n(e)}})}async onActivityLogDiskLoggingToggle(t){if(this.db)try{let{setConfig:n}=await import(`./setConfig-DdSThoKj.js`).then(e=>e.n);await n(this.db,e.ACTIVITY_LOG_DISK_LOGGING_ENABLED,t?`true`:`false`),d(t?`Activity log disk logging enabled`:`Activity log disk logging disabled`,2500)}catch(e){p(`Error saving activity log disk logging setting: `+(e instanceof Error?e.message:String(e)),6e3)}}async onChatSplitViewToggle(t){if(this.db)try{let{setConfig:n}=await import(`./setConfig-DdSThoKj.js`).then(e=>e.n);await n(this.db,e.CHAT_SPLIT_VIEW_ENABLED,t?`true`:`false`),this.dispatchEvent(new CustomEvent(`chat-split-view-change`,{detail:{enabled:t},bubbles:!0,composed:!0})),d(t?`Horizontal Chat split view enabled`:`Horizontal Chat split view disabled`,2500)}catch(e){p(`Error saving Chat split view setting: `+(e instanceof Error?e.message:String(e)),6e3)}}async onOverridePrerenderSkeletonToggle(t){try{o(`shadow-claw-override-prerender-skeleton`,t?`true`:`false`)}catch(e){console.warn(`Unable to save setting to localStorage:`,e)}if(this.db)try{let{setConfig:n}=await import(`./setConfig-DdSThoKj.js`).then(e=>e.n);await n(this.db,e.OVERRIDE_PRERENDER_SKELETON,t?`true`:`false`),d(t?`Pre-rendered content override enabled`:`Pre-rendered content override disabled`,2500)}catch(e){p(`Error saving pre-rendered content override setting: `+(e instanceof Error?e.message:String(e)),6e3)}}async onPagesAutoRefreshInputChange(t){if(!this.db)return;let n=Math.max(0,Math.min(t,86400));try{let{setConfig:t}=await import(`./setConfig-DdSThoKj.js`).then(e=>e.n);await t(this.db,e.PAGES_AUTO_REFRESH_INTERVAL,String(n)),window.dispatchEvent(new CustomEvent(`shadow-claw-pages-auto-refresh-change`,{detail:{interval:n}})),d(n>0?`Pages auto refresh set to ${n}s`:`Pages auto refresh disabled`,2500)}catch(e){p(`Error saving Pages auto refresh interval: `+(e instanceof Error?e.message:String(e)),6e3)}}async onSidebarHideChatToggle(t){if(this.db)try{let{setConfig:n}=await import(`./setConfig-DdSThoKj.js`).then(e=>e.n);await n(this.db,e.SIDEBAR_CHAT_HIDDEN,t?`true`:`false`),this.dispatchEvent(new CustomEvent(`sidebar-chat-visibility-change`,{detail:{hidden:t},bubbles:!0,composed:!0})),d(t?`Chat hidden in sidebar`:`Chat shown in sidebar`,2500)}catch(e){p(`Error saving sidebar Chat visibility: `+(e instanceof Error?e.message:String(e)),6e3)}}async onSidebarHideFilesToggle(t){if(this.db)try{let{setConfig:n}=await import(`./setConfig-DdSThoKj.js`).then(e=>e.n);await n(this.db,e.SIDEBAR_FILES_HIDDEN,t?`true`:`false`),this.dispatchEvent(new CustomEvent(`sidebar-files-visibility-change`,{detail:{hidden:t},bubbles:!0,composed:!0})),d(t?`Files hidden in sidebar`:`Files shown in sidebar`,2500)}catch(e){p(`Error saving sidebar Files visibility: `+(e instanceof Error?e.message:String(e)),6e3)}}async onSidebarHidePagesToggle(t){if(this.db)try{let{setConfig:n}=await import(`./setConfig-DdSThoKj.js`).then(e=>e.n);await n(this.db,e.SIDEBAR_PAGES_HIDDEN,t?`true`:`false`),this.dispatchEvent(new CustomEvent(`sidebar-pages-visibility-change`,{detail:{hidden:t},bubbles:!0,composed:!0})),d(t?`Pages hidden in sidebar`:`Pages shown in sidebar`,2500)}catch(e){p(`Error saving sidebar Pages visibility: `+(e instanceof Error?e.message:String(e)),6e3)}}async onSidebarHideTasksToggle(t){if(this.db)try{let{setConfig:n}=await import(`./setConfig-DdSThoKj.js`).then(e=>e.n);await n(this.db,e.SIDEBAR_TASKS_HIDDEN,t?`true`:`false`),this.dispatchEvent(new CustomEvent(`sidebar-tasks-visibility-change`,{detail:{hidden:t},bubbles:!0,composed:!0})),d(t?`Tasks hidden in sidebar`:`Tasks shown in sidebar`,2500)}catch(e){p(`Error saving sidebar Tasks visibility: `+(e instanceof Error?e.message:String(e)),6e3)}}async populateAssistantSettings(){let t=this.shadowRoot;if(!t||!this.db)return;let n=t.querySelector(`[data-setting="assistant-name-input"]`);if(n){let{getConfig:t}=await import(`./getConfig-4saf0Tkq.js`).then(e=>e.n),r=await t(this.db,e.ASSISTANT_NAME),i=this.orchestrator?.assistantName||s.orchestrator?.assistantName;n.value=typeof r==`string`&&r||i||`ShadowClaw`}let{getConfig:r}=await import(`./getConfig-4saf0Tkq.js`).then(e=>e.n),i=await r(this.db,e.ACTIVITY_LOG_DISK_LOGGING_ENABLED),c=i===!0||i===`true`||i===1||i===`1`,l=t.querySelector(`[data-setting="activity-log-disk-logging-toggle"]`);l&&(l.checked=c);let u=await r(this.db,e.SIDEBAR_PAGES_HIDDEN),d=u===!0||u===`true`||u===1||u===`1`,f=t.querySelector(`[data-setting="sidebar-hide-pages-toggle"]`);f&&(f.checked=d);let p=await r(this.db,e.SIDEBAR_CHAT_HIDDEN),m=p===!0||p===`true`||p===1||p===`1`,g=t.querySelector(`[data-setting="sidebar-hide-chat-toggle"]`);g&&(g.checked=m);let _=await r(this.db,e.SIDEBAR_TASKS_HIDDEN),v=_===!0||_===`true`||_===1||_===`1`,y=t.querySelector(`[data-setting="sidebar-hide-tasks-toggle"]`);y&&(y.checked=v);let b=await r(this.db,e.SIDEBAR_FILES_HIDDEN),x=b===!0||b===`true`||b===1||b===`1`,S=t.querySelector(`[data-setting="sidebar-hide-files-toggle"]`);S&&(S.checked=x);let C=h(await r(this.db,e.CHAT_SPLIT_VIEW_ENABLED),!1),w=t.querySelector(`[data-setting="chat-split-view-toggle"]`);w&&(w.checked=C);let T=t.querySelector(`[data-setting="pages-auto-refresh-input"]`);if(T){let t=await r(this.db,e.PAGES_AUTO_REFRESH_INTERVAL);if(typeof t==`string`||typeof t==`number`){let e=parseInt(String(t),10);T.value=!isNaN(e)&&e>=0?String(e):`0`}else T.value=`0`}let E=await r(this.db,e.OVERRIDE_PRERENDER_SKELETON),D=null;try{D=a(`shadow-claw-override-prerender-skeleton`)}catch{}let O=!0;if(E==null?D!==null&&(O=D===`true`):O=h(E),O)try{o(`shadow-claw-override-prerender-skeleton`,`true`)}catch{}let k=t.querySelector(`[data-setting="override-prerender-skeleton-toggle"]`);k&&(k.checked=O);let A=t.querySelector(`[data-setting="dom-allowed-iframe-hosts"]`);if(A){let t=await r(this.db,e.ALLOWED_IFRAME_HOST_PATTERNS);if(typeof t==`string`&&t.trim().length>0){A.value=t;let{setAllowedIframeHostPatterns:e}=await import(`./iframe-sanitizer-CKOO7cxp.js`).then(e=>e.r);e(t)}else{let{DEFAULT_ALLOWED_IFRAME_HOST_PATTERNS:e}=await import(`./iframe-sanitizer-CKOO7cxp.js`).then(e=>e.r);A.value=e.join(`
889
889
  `)}}let j=t.querySelector(`[data-setting="markdown-frontmatter-pages-toggle"]`);j&&(j.checked=h(await r(this.db,e.MARKDOWN_FRONTMATTER_PAGES),!0));let M=t.querySelector(`[data-setting="markdown-frontmatter-file-viewer-toggle"]`);M&&(M.checked=h(await r(this.db,e.MARKDOWN_FRONTMATTER_FILE_VIEWER),!0));let N=t.querySelector(`[data-setting="markdown-frontmatter-chat-toggle"]`);N&&(N.checked=h(await r(this.db,e.MARKDOWN_FRONTMATTER_CHAT),!0));let P=t.querySelector(`[data-setting="markdown-frontmatter-tasks-toggle"]`);P&&(P.checked=h(await r(this.db,e.MARKDOWN_FRONTMATTER_TASKS),!0))}async promptForPlaintextBackupHandle(){let e=Reflect.get(globalThis,`showSaveFilePicker`),t=typeof e==`function`?e.bind(globalThis):null;if(!t)throw Error(`Plaintext settings backup requires the File System Access API.`);try{return await t({id:`shadowclaw-settings-backup`,suggestedName:`shadowclaw-settings-backup-${r()}.json`,types:[{description:`JSON Files`,accept:{"application/json":[`.json`]}}]})}catch(e){if(e instanceof Error&&e.name===`AbortError`)return null;throw e}}async render(){let e=this.shadowRoot;if(!e)return;e.querySelector(`[data-action="show-channels-config"]`)?.addEventListener(`click`,()=>{this.dispatchEvent(new CustomEvent(`navigate`,{detail:{page:`channels`},bubbles:!0,composed:!0}))}),e.querySelector(`[data-action="show-tools-config"]`)?.addEventListener(`click`,()=>{this.dispatchEvent(new CustomEvent(`navigate`,{detail:{page:`tools`},bubbles:!0,composed:!0}))}),e.querySelectorAll(`[data-tab-target]`).forEach(e=>{e.addEventListener(`click`,()=>{this.activateTab(e.dataset.tabTarget)}),e.addEventListener(`keydown`,t=>{this.handleTabKeydown(t,e)})}),this.applyTabState(),this.bindSettingsActions();let t=e.querySelector(`[data-info="deployed-revision"]`);t&&(t.textContent=`Deployed revision: ${document.querySelector(`meta[name="revision"]`)?.getAttribute(`content`)?.trim()||`unknown`}`),await this.populateAssistantSettings()}async replaceConfigEntries(e){if(!this.db)throw Error(`Database is unavailable`);if(t(this.db)){let t=this.db.db;t.prepare(`DELETE FROM config`).run();let n=t.prepare(`INSERT OR REPLACE INTO config (key, value) VALUES (?, ?)`);for(let t of e)n.run(t.key,typeof t.value==`string`?t.value:JSON.stringify(t.value));return}let n=this.db;await new Promise((t,r)=>{try{let i=n.transaction(`config`,`readwrite`);if(!i){r(Error(`Failed to open write transaction`));return}let a=i.objectStore(`config`);a.clear();for(let t of e)a.put({key:t.key,value:t.value});i.oncomplete=()=>t(),i.onerror=()=>r(i.error||Error(`Failed to update config`)),i.onabort=()=>r(i.error||Error(`Config update aborted`))}catch(e){r(e)}})}async saveAssistantName(){if(!this.db)return;let t=this.shadowRoot;if(!t)return;let n=t.querySelector(`[data-setting="assistant-name-input"]`);if(!n)return;let r=n.value.trim();if(!r){let{showWarning:e}=await import(`./toast-BXgUfbyh.js`).then(e=>e.c);e(`Please enter a name`,3e3);return}o(`assistantName`,r);try{let t=this.orchestrator||s.orchestrator;if(t)this.orchestrator=t,await i(t,this.db,r);else{let{setConfig:t}=await import(`./setConfig-DdSThoKj.js`).then(e=>e.n);await t(this.db,e.ASSISTANT_NAME,r)}}catch(e){console.warn(`Could not update orchestrator:`,e)}d(`Assistant name saved`,3e3)}async saveDomAllowedIframeHosts(){let t=this.shadowRoot;if(!t||!this.db)return;let n=t.querySelector(`[data-setting="dom-allowed-iframe-hosts"]`);if(!n)return;let r=n.value.split(`
890
890
  `).map(e=>e.trim()).filter(e=>e.length>0),i=t.querySelector(`[data-setting="markdown-frontmatter-pages-toggle"]`),a=t.querySelector(`[data-setting="markdown-frontmatter-file-viewer-toggle"]`),o=t.querySelector(`[data-setting="markdown-frontmatter-chat-toggle"]`),s=t.querySelector(`[data-setting="markdown-frontmatter-tasks-toggle"]`);try{let{setConfig:t}=await import(`./setConfig-DdSThoKj.js`).then(e=>e.n),n=r.join(`
891
891
  `);await t(this.db,e.ALLOWED_IFRAME_HOST_PATTERNS,n),await t(this.db,e.MARKDOWN_FRONTMATTER_PAGES,String(i?.checked??!0)),await t(this.db,e.MARKDOWN_FRONTMATTER_FILE_VIEWER,String(a?.checked??!0)),await t(this.db,e.MARKDOWN_FRONTMATTER_CHAT,String(o?.checked??!0)),await t(this.db,e.MARKDOWN_FRONTMATTER_TASKS,String(s?.checked??!0));let{setAllowedIframeHostPatterns:c}=await import(`./iframe-sanitizer-CKOO7cxp.js`).then(e=>e.r);c(r),d(`DOM iframe embed settings saved`,2500)}catch(e){p(`Error saving DOM iframe embed settings: `+(e instanceof Error?e.message:String(e)),6e3)}}};customElements.get(M)||customElements.define(M,N);export{N as ShadowClawSettings};
@@ -1,4 +1,4 @@
1
- import{r as e}from"./config-D4lVqMs8.js";import{r as t}from"./txPromise-C2iYogHX.js";import{t as n}from"./getConfig-4saf0Tkq.js";import{u as r}from"./custom-element-security-CU1rI7Pw.js";import{Gt as i,Wt as a,t as o}from"./orchestrator-Baif6kmu.js";import{c as s}from"./getGroupDir-CLz5c8cg.js";import{t as c}from"./setConfig-DdSThoKj.js";import{a as l,r as u,s as d}from"./toast-BXgUfbyh.js";import{t as f}from"./shadow-claw-element-DIrv3P6A.js";import{t as p}from"./effect-BJCrpFdp.js";import{t as m}from"./config-value-oBfKgLT4.js";async function h(){try{if(typeof navigator<`u`&&navigator.storage&&navigator.storage.estimate){let e=await navigator.storage.estimate();return{usage:e.usage||0,quota:e.quota||0}}}catch(e){console.warn(`Failed to get storage estimate:`,e)}return{usage:0,quota:0}}async function g(){try{if(typeof navigator<`u`&&navigator.storage&&navigator.storage.persisted)return await navigator.storage.persisted()}catch(e){console.warn(`Failed to check persistent storage:`,e)}return!1}async function _(){try{if(typeof navigator<`u`&&navigator.storage&&navigator.storage.persist)return await navigator.storage.persist()}catch(e){console.warn(`Failed to request persistent storage:`,e)}return!1}async function v(t){let n=Reflect.get(globalThis,`showDirectoryPicker`),r=typeof n==`function`?n.bind(globalThis):null;if(!r)throw Error(`Local folder picker is unavailable in this browser/context.`);try{let n=await r({mode:`readwrite`,id:`shadowclaw-storage`});return await c(t,e.STORAGE_HANDLE,n),await i(t),await a(t),!0}catch(e){if(e instanceof Error&&e.name===`AbortError`)return!1;throw e}}const y=new CSSStyleSheet;y.replaceSync(`*,
1
+ import{r as e}from"./config-D4lVqMs8.js";import{r as t}from"./txPromise-C2iYogHX.js";import{t as n}from"./getConfig-4saf0Tkq.js";import{u as r}from"./custom-element-security-CU1rI7Pw.js";import{Gt as i,Wt as a,t as o}from"./orchestrator-0BnBtxHO.js";import{c as s}from"./getGroupDir-CLz5c8cg.js";import{t as c}from"./setConfig-DdSThoKj.js";import{a as l,r as u,s as d}from"./toast-BXgUfbyh.js";import{t as f}from"./shadow-claw-element-DIrv3P6A.js";import{t as p}from"./effect-BJCrpFdp.js";import{t as m}from"./config-value-oBfKgLT4.js";async function h(){try{if(typeof navigator<`u`&&navigator.storage&&navigator.storage.estimate){let e=await navigator.storage.estimate();return{usage:e.usage||0,quota:e.quota||0}}}catch(e){console.warn(`Failed to get storage estimate:`,e)}return{usage:0,quota:0}}async function g(){try{if(typeof navigator<`u`&&navigator.storage&&navigator.storage.persisted)return await navigator.storage.persisted()}catch(e){console.warn(`Failed to check persistent storage:`,e)}return!1}async function _(){try{if(typeof navigator<`u`&&navigator.storage&&navigator.storage.persist)return await navigator.storage.persist()}catch(e){console.warn(`Failed to request persistent storage:`,e)}return!1}async function v(t){let n=Reflect.get(globalThis,`showDirectoryPicker`),r=typeof n==`function`?n.bind(globalThis):null;if(!r)throw Error(`Local folder picker is unavailable in this browser/context.`);try{let n=await r({mode:`readwrite`,id:`shadowclaw-storage`});return await c(t,e.STORAGE_HANDLE,n),await i(t),await a(t),!0}catch(e){if(e instanceof Error&&e.name===`AbortError`)return!1;throw e}}const y=new CSSStyleSheet;y.replaceSync(`*,
2
2
  *::before,
3
3
  *::after {
4
4
  font-family: var(--shadow-claw-font-sans);
@@ -1,4 +1,4 @@
1
- import{r as e}from"./txPromise-C2iYogHX.js";import{b as t,t as n,y as r}from"./orchestrator-Baif6kmu.js";import{a as i,r as a}from"./toast-BXgUfbyh.js";import{t as o}from"./shadow-claw-element-DIrv3P6A.js";import{t as s}from"./effect-BJCrpFdp.js";const c=new CSSStyleSheet;c.replaceSync(`*,
1
+ import{r as e}from"./txPromise-C2iYogHX.js";import{b as t,t as n,y as r}from"./orchestrator-0BnBtxHO.js";import{a as i,r as a}from"./toast-BXgUfbyh.js";import{t as o}from"./shadow-claw-element-DIrv3P6A.js";import{t as s}from"./effect-BJCrpFdp.js";const c=new CSSStyleSheet;c.replaceSync(`*,
2
2
  *::before,
3
3
  *::after {
4
4
  font-family: var(--shadow-claw-font-sans);
@@ -1,4 +1,4 @@
1
- import{r as e}from"./config-D4lVqMs8.js";import{i as t}from"./app-routes-BMQ4HFaM.js";import{r as n}from"./txPromise-C2iYogHX.js";import{t as r}from"./getConfig-4saf0Tkq.js";import{h as i,u as a}from"./custom-element-security-CU1rI7Pw.js";import{t as o}from"./orchestrator-Baif6kmu.js";import{a as s,i as c,r as l}from"./toast-BXgUfbyh.js";import{t as u}from"./shadow-claw-element-DIrv3P6A.js";import"./shadow-claw-empty-state-CkvLk0-B.js";import{t as d}from"./effect-BJCrpFdp.js";import{t as f}from"./config-value-oBfKgLT4.js";import"./shadow-claw-page-header-action-button-Bmua3mAb.js";import"./shadow-claw-page-header-Dmjiz5ah.js";import{t as p}from"./markdown-BwIoGEdD.js";import{t as m}from"./file-viewer-LEEStSq-.js";import"./shadow-claw-dialog-BrOwAOdk.js";const h=new CSSStyleSheet;h.replaceSync(`*,
1
+ import{r as e}from"./config-D4lVqMs8.js";import{i as t}from"./app-routes-BMQ4HFaM.js";import{r as n}from"./txPromise-C2iYogHX.js";import{t as r}from"./getConfig-4saf0Tkq.js";import{h as i,u as a}from"./custom-element-security-CU1rI7Pw.js";import{t as o}from"./orchestrator-0BnBtxHO.js";import{a as s,i as c,r as l}from"./toast-BXgUfbyh.js";import{t as u}from"./shadow-claw-element-DIrv3P6A.js";import"./shadow-claw-empty-state-CkvLk0-B.js";import{t as d}from"./effect-BJCrpFdp.js";import{t as f}from"./config-value-oBfKgLT4.js";import"./shadow-claw-page-header-action-button-Bmua3mAb.js";import"./shadow-claw-page-header-Dmjiz5ah.js";import{t as p}from"./markdown-BwIoGEdD.js";import{t as m}from"./file-viewer-CKrQoxZi.js";import"./shadow-claw-dialog-BrOwAOdk.js";const h=new CSSStyleSheet;h.replaceSync(`*,
2
2
  *::before,
3
3
  *::after {
4
4
  font-family: var(--shadow-claw-font-sans);
@@ -1,4 +1,4 @@
1
- import{D as e,E as t,T as n,t as r}from"./orchestrator-Baif6kmu.js";import{t as i}from"./shadow-claw-element-DIrv3P6A.js";function a(e){if(!e)return``;let t=e.split(`
1
+ import{D as e,E as t,T as n,t as r}from"./orchestrator-0BnBtxHO.js";import{t as i}from"./shadow-claw-element-DIrv3P6A.js";function a(e){if(!e)return``;let t=e.split(`
2
2
  `);for(let e=t.length-1;e>=0;--e){let n=t[e]||``;if(/[#$](?:\s|$)/.test(n))return n}return``}function o(e){return e.scrollHeight-(e.scrollTop+e.clientHeight)<=12}function s(e,t){let n=e[t+1];if(n===void 0)return{action:`ignore`,nextIndex:t+1,incomplete:!0};if(n===`[`){let n=t+2;for(;n<e.length;){let t=e.charCodeAt(n);if(t>=64&&t<=126){let t=e[n];return t===`J`?{action:`clear-screen`,nextIndex:n+1}:t===`K`?{action:`clear-line`,nextIndex:n+1}:{action:`ignore`,nextIndex:n+1}}n+=1}return{action:`ignore`,nextIndex:e.length,incomplete:!0}}if(n===`]`){let n=t+2;for(;n<e.length;){let t=e[n];if(t===`\x07`)return{action:`ignore`,nextIndex:n+1};if(t===`\x1B`&&e[n+1]===`\\`)return{action:`ignore`,nextIndex:n+2};n+=1}return{action:`ignore`,nextIndex:e.length,incomplete:!0}}return{action:`ignore`,nextIndex:Math.min(t+2,e.length)}}function c(e){return e.replace(/(?:^|\n)[^\n]*mkdir -p \/home\/user 2>&1; echo "?__BCDONE_\d+__\$\?"?[^\n]*(?:\n|$)/g,`
3
3
  `).replace(/(?:^|\n)\s*__BCDONE_\d+__(?:\d+|\$\?)?\s*(?:\n|$)/g,`
4
4
  `).replace(/^\n+(?=\S)/,``)}function l(e,t,n=``,r){let i=r?.respectEraseSequences??!0,a=n+t,o=e;for(let e=0;e<a.length;e++){let t=a[e];if(t===`\x1B`){let t=s(a,e);if(t.incomplete)return{text:o,pending:a.slice(e)};if(t.action===`clear-screen`&&i&&(o=``),t.action===`clear-line`&&i){let e=o.lastIndexOf(`
@@ -1,4 +1,4 @@
1
- import{A as e,F as t}from"./config-D4lVqMs8.js";import{r as n}from"./txPromise-C2iYogHX.js";import{t as r}from"./orchestrator-Baif6kmu.js";import{t as i}from"./tools-BCttQkSs.js";import{t as a}from"./ulid-BY7rQVLN.js";import{t as o}from"./tools-CcgG5XuA.js";import{n as s,t as c}from"./syncWebMcpRegistration-CLMvJ4kV.js";import"./tools-B-PzsLc2.js";import{a as l,i as u,r as d}from"./toast-BXgUfbyh.js";import{t as f}from"./shadow-claw-element-DIrv3P6A.js";import{t as p}from"./effect-BJCrpFdp.js";import"./shadow-claw-page-header-action-button-Bmua3mAb.js";import"./shadow-claw-page-header-Dmjiz5ah.js";import"./shadow-claw-dialog-BrOwAOdk.js";import{t as m}from"./webmcp-CcIw3_V3.js";const h=new CSSStyleSheet;h.replaceSync(`*,
1
+ import{A as e,F as t}from"./config-D4lVqMs8.js";import{r as n}from"./txPromise-C2iYogHX.js";import{t as r}from"./orchestrator-0BnBtxHO.js";import{t as i}from"./tools-BCttQkSs.js";import{t as a}from"./ulid-BY7rQVLN.js";import{t as o}from"./tools-CcgG5XuA.js";import{n as s,t as c}from"./syncWebMcpRegistration-D91usEMu.js";import"./tools-B-PzsLc2.js";import{a as l,i as u,r as d}from"./toast-BXgUfbyh.js";import{t as f}from"./shadow-claw-element-DIrv3P6A.js";import{t as p}from"./effect-BJCrpFdp.js";import"./shadow-claw-page-header-action-button-Bmua3mAb.js";import"./shadow-claw-page-header-Dmjiz5ah.js";import"./shadow-claw-dialog-BrOwAOdk.js";import{t as m}from"./webmcp-CcIw3_V3.js";const h=new CSSStyleSheet;h.replaceSync(`*,
2
2
  *::before,
3
3
  *::after {
4
4
  font-family: var(--shadow-claw-font-sans);
@@ -1253,6 +1253,13 @@ dialog::backdrop {
1253
1253
  >
1254
1254
  🌱 Block Garden Knowledge Hub
1255
1255
  </button>
1256
+ <button
1257
+ class="tools__preset-btn"
1258
+ data-url="https://xt-ml.github.io/shadow-claw-agent-cli-weather"
1259
+ type="button"
1260
+ >
1261
+ 🌦️ Weather Agent (Open-Meteo)
1262
+ </button>
1256
1263
  </div>
1257
1264
  </div>
1258
1265
 
@@ -1,4 +1,4 @@
1
- import{f as e,n as t,r as n}from"./config-D4lVqMs8.js";import{r}from"./txPromise-C2iYogHX.js";import{t as i}from"./getConfig-4saf0Tkq.js";import{A as a,O as o,S as s,k as c,t as l}from"./orchestrator-Baif6kmu.js";import{a as u,r as d,s as f}from"./toast-BXgUfbyh.js";import{t as p}from"./shadow-claw-element-DIrv3P6A.js";import{t as m}from"./effect-BJCrpFdp.js";const h=new CSSStyleSheet;h.replaceSync(`*,
1
+ import{f as e,n as t,r as n}from"./config-D4lVqMs8.js";import{r}from"./txPromise-C2iYogHX.js";import{t as i}from"./getConfig-4saf0Tkq.js";import{A as a,O as o,S as s,k as c,t as l}from"./orchestrator-0BnBtxHO.js";import{a as u,r as d,s as f}from"./toast-BXgUfbyh.js";import{t as p}from"./shadow-claw-element-DIrv3P6A.js";import{t as m}from"./effect-BJCrpFdp.js";const h=new CSSStyleSheet;h.replaceSync(`*,
2
2
  *::before,
3
3
  *::after {
4
4
  font-family: var(--shadow-claw-font-sans);
@@ -1 +1 @@
1
- import{r as e}from"./config-D4lVqMs8.js";import{M as t,Mt as n,t as r}from"./orchestrator-Baif6kmu.js";import{t as i}from"./tools-BCttQkSs.js";import{t as a}from"./setConfig-DdSThoKj.js";import{t as o}from"./effect-BJCrpFdp.js";import{i as s,n as c,r as l}from"./webmcp-CcIw3_V3.js";const u={name:`activate_skill`,description:`Load the full instructions for a workspace skill when its description matches the current task.`,input_schema:{type:`object`,properties:{name:{type:`string`,description:`The exact skill name from the available skills catalog.`}},required:[`name`]}};function d(e,a){if(typeof e.webMcpEffectCleanup==`function`&&(e.webMcpEffectCleanup(),e.webMcpEffectCleanup=null),!e.webMcpToolsEnabled){s();return}e.webMcpEffectCleanup=o(()=>{let o=r.activeGroupId,l=i.allTools,d=i.enabledTools;i.declarativeTools,i.declarativeToolNamesEnabled;let f=r.groups.find(e=>e.groupId===o);e.webMcpRegistrationLock=e.webMcpRegistrationLock.then(async()=>{s(),await new Promise(e=>setTimeout(e,0));let r=[];try{r=await i.refreshDeclarativeTools(a,o)}catch{}let p=r.filter(e=>i.isDeclarativeToolEnabled(e.name)),m=[...l,...r],h=f?.toolTags&&f.toolTags.length>0?m.filter(e=>f.toolTags.includes(e.name)):[...d,...p],g={skills:[]};try{g=await n(a,o)}catch{}g.skills.length>0&&!h.some(e=>e.name===u.name)&&(h=[...h,u]),await c(e.agentWorker,async n=>{await t(e,a,n)},o,h)}).catch(e=>{console.error(`WebMCP registration failed:`,e)})})}async function f(t,n,r,i){s(),l(r),await a(n,e.WEBMCP_MODE,r),d(i.orchestrator,n)}async function p(t,n,r,i){t.webMcpToolsEnabled=!!r,await a(n,e.WEBMCP_TOOLS_ENABLED,t.webMcpToolsEnabled?`true`:`false`),d(i.orchestrator,n)}export{u as i,p as n,d as r,f as t};
1
+ import{r as e}from"./config-D4lVqMs8.js";import{M as t,Mt as n,t as r}from"./orchestrator-0BnBtxHO.js";import{t as i}from"./tools-BCttQkSs.js";import{t as a}from"./setConfig-DdSThoKj.js";import{t as o}from"./effect-BJCrpFdp.js";import{i as s,n as c,r as l}from"./webmcp-CcIw3_V3.js";const u={name:`activate_skill`,description:`Load the full instructions for a workspace skill when its description matches the current task.`,input_schema:{type:`object`,properties:{name:{type:`string`,description:`The exact skill name from the available skills catalog.`}},required:[`name`]}};function d(e,a){if(typeof e.webMcpEffectCleanup==`function`&&(e.webMcpEffectCleanup(),e.webMcpEffectCleanup=null),!e.webMcpToolsEnabled){s();return}e.webMcpEffectCleanup=o(()=>{let o=r.activeGroupId,l=i.allTools,d=i.enabledTools;i.declarativeTools,i.declarativeToolNamesEnabled;let f=r.groups.find(e=>e.groupId===o);e.webMcpRegistrationLock=e.webMcpRegistrationLock.then(async()=>{s(),await new Promise(e=>setTimeout(e,0));let r=[];try{r=await i.refreshDeclarativeTools(a,o)}catch{}let p=r.filter(e=>i.isDeclarativeToolEnabled(e.name)),m=[...l,...r],h=f?.toolTags&&f.toolTags.length>0?m.filter(e=>f.toolTags.includes(e.name)):[...d,...p],g={skills:[]};try{g=await n(a,o)}catch{}g.skills.length>0&&!h.some(e=>e.name===u.name)&&(h=[...h,u]),await c(e.agentWorker,async n=>{await t(e,a,n)},o,h)}).catch(e=>{console.error(`WebMCP registration failed:`,e)})})}async function f(t,n,r,i){s(),l(r),await a(n,e.WEBMCP_MODE,r),d(i.orchestrator,n)}async function p(t,n,r,i){t.webMcpToolsEnabled=!!r,await a(n,e.WEBMCP_TOOLS_ENABLED,t.webMcpToolsEnabled?`true`:`false`),d(i.orchestrator,n)}export{u as i,p as n,d as r,f as t};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "shadow-claw",
3
- "version": "1.34.5",
3
+ "version": "1.36.0",
4
4
  "type": "module",
5
5
  "license": "AGPL-3.0",
6
6
  "description": "Browser-native personal AI assistant.",
@@ -307,6 +307,17 @@ describe("build without and with pages", () => {
307
307
  expect(contentIndex.skills.map((s: any) => s.name)).toEqual(
308
308
  expect.arrayContaining(["custom-skill", "skill-creator"]),
309
309
  );
310
+
311
+ // Verify skill-creator was materialized on disk so the advertised relative URL does not 404
312
+ const contentSkillCreatorPath = path.join(
313
+ tempConsumerRoot,
314
+ ".agents",
315
+ "skills",
316
+ "main",
317
+ "skill-creator",
318
+ "SKILL.md",
319
+ );
320
+ expect(fs.existsSync(contentSkillCreatorPath)).toBe(true);
310
321
  } finally {
311
322
  logSpy.mockRestore();
312
323
  await rm(tempConsumerRoot, { recursive: true, force: true });
@@ -417,21 +417,22 @@ export async function runBuild(options: RunBuildOptions = {}): Promise<void> {
417
417
  });
418
418
  }
419
419
 
420
- // 6. Copy .agents from contentRoot (fallback to toolchainRoot)
420
+ // 6. Copy .agents from contentRoot and toolchainRoot
421
421
  const contentSkills = join(contentRoot, ".agents/skills");
422
422
  if (await pathExists(contentSkills)) {
423
423
  await cp(contentSkills, join(distPublicDir, ".agents/skills"), {
424
424
  recursive: true,
425
425
  force: true,
426
426
  });
427
- } else {
428
- const toolchainSkills = join(toolchainRoot, ".agents/skills");
429
- if (await pathExists(toolchainSkills)) {
430
- await cp(toolchainSkills, join(distPublicDir, ".agents/skills"), {
431
- recursive: true,
432
- force: true,
433
- });
434
- }
427
+ }
428
+
429
+ const toolchainSkills = join(toolchainRoot, ".agents/skills");
430
+ if (contentRoot !== toolchainRoot && (await pathExists(toolchainSkills))) {
431
+ await cp(toolchainSkills, join(distPublicDir, ".agents/skills"), {
432
+ recursive: true,
433
+ force: false,
434
+ errorOnExist: false,
435
+ });
435
436
  }
436
437
 
437
438
  const contentTools = join(contentRoot, ".agents/tools");
package/src/cli/cli.ts CHANGED
@@ -1071,6 +1071,11 @@ program
1071
1071
  "Explicit path to shadow-claw.config.json or site-config.json",
1072
1072
  )
1073
1073
  .optionsGroup("Generation Options:")
1074
+ .option(
1075
+ "--bundled",
1076
+ "Include and materialize bundled ShadowClaw skills in index and .agents/skills",
1077
+ false,
1078
+ )
1074
1079
  .option("--no-bundled", "Exclude bundled ShadowClaw skills from index")
1075
1080
  .option("--stdout", "Print generated index.json to stdout", false)
1076
1081
  .option("--no-write", "Skip writing file to disk")
@@ -1091,7 +1096,7 @@ program.commandsGroup("Headless Agent:");
1091
1096
  program
1092
1097
  .command("agent [action] [args...]")
1093
1098
  .description(
1094
- "Run the headless CLI agent (init | model | skills | tools | tool | skill | run)",
1099
+ "Run the headless CLI agent (init | model | skills | tools | tool | skill | import | run)",
1095
1100
  )
1096
1101
  .optionsGroup("Agent Options:")
1097
1102
  .option("--workspace <dir>", "Workspace directory (default: .cache)")
@@ -1138,7 +1143,31 @@ program
1138
1143
  )
1139
1144
  .option(
1140
1145
  "--tools <tools>",
1141
- "Comma-separated list of tools to enable (e.g. bash,read_file)",
1146
+ "Comma-separated list of tools to enable or import (e.g. bash,read_file)",
1147
+ )
1148
+ .option(
1149
+ "--skills <skills>",
1150
+ "Comma-separated list of skills to filter or import",
1151
+ )
1152
+ .option("--scripts <scripts>", "Comma-separated list of scripts to import")
1153
+ .option(
1154
+ "--all",
1155
+ "Import all tools, skills, and scripts from discovery manifest",
1156
+ false,
1157
+ )
1158
+ .option(
1159
+ "--overwrite",
1160
+ "Overwrite existing skills, tools, or scripts during import",
1161
+ false,
1162
+ )
1163
+ .option(
1164
+ "--auto-enable",
1165
+ "Automatically enable imported declarative tools (default: true)",
1166
+ true,
1167
+ )
1168
+ .option(
1169
+ "--no-auto-enable",
1170
+ "Do not automatically enable imported declarative tools",
1142
1171
  )
1143
1172
  .option(
1144
1173
  "--tools-profile <name>",