shadow-claw 1.23.3 → 1.23.4

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 (89) hide show
  1. package/bin/assert-version-bump.mjs +60 -38
  2. package/bin/assert-version-bump.test.mjs +74 -11
  3. package/dist/public/agent.worker.js +6 -6
  4. package/dist/public/{app-routes-B0ePT49v.js → app-routes-Bs-riIvr.js} +1 -1
  5. package/dist/public/components/settings/shadow-claw-storage/shadow-claw-storage.html +1 -1
  6. package/dist/public/components/shadow-claw-files/shadow-claw-files.css +1 -1
  7. package/dist/public/components/shadow-claw-files/shadow-claw-files.html +1 -1
  8. package/dist/public/config-BYAuxx3j.js +1 -0
  9. package/dist/public/{configurePeerJs-B7kNU8AQ.js → configurePeerJs-B4Ym9VMj.js} +1 -1
  10. package/dist/public/{connections-xd_66YVU.js → connections-BEn6JYdu.js} +1 -1
  11. package/dist/public/{custom-element-security-CZ92anB8.js → custom-element-security-DdYlUozq.js} +1 -1
  12. package/dist/public/docs/architecture/storage.md +5 -2
  13. package/dist/public/docs/decisions/indexeddb-and-opfs-storage.md +5 -2
  14. package/dist/public/docs/example/article/index.html +2 -2
  15. package/dist/public/docs/publishing/index.html +19 -76
  16. package/dist/public/docs/skill-creator/index.html +2 -2
  17. package/dist/public/{downloadGroupFile-BABv_1mJ.js → downloadGroupFile-Drdvg1Ev.js} +1 -1
  18. package/dist/public/{e2e-bridge-DkS5xFGX.js → e2e-bridge-BQ4KzUt5.js} +1 -1
  19. package/dist/public/{file-viewer-CCSABMsE.js → file-viewer-CcZYw-PS.js} +1 -1
  20. package/dist/public/files/main/~/docs/publishing-to-github-pages.md +17 -82
  21. package/dist/public/{git-BkjrsRXX.js → git-DEUvQTUA.js} +2 -2
  22. package/dist/public/{iframe-sanitizer-L6Jyu__Z.js → iframe-sanitizer-0NS4XLOd.js} +1 -1
  23. package/dist/public/index.html +2 -2
  24. package/dist/public/index.js +1 -1
  25. package/dist/public/{initChatSplitResize-BslPXAXS.js → initChatSplitResize-llGkSJXg.js} +1 -1
  26. package/dist/public/main/index.html +2 -2
  27. package/dist/public/main/memory/index.html +2 -2
  28. package/dist/public/{markdown-6MBrIo-S.js → markdown-CyYR4App.js} +1 -1
  29. package/dist/public/mcp-reconnect-CSx4aMwy.js +1 -0
  30. package/dist/public/{memoryStorage-CjGseKI1.js → memoryStorage-Dwg8NhAZ.js} +1 -1
  31. package/dist/public/{orchestrator-B9KmIj8Q.js → orchestrator-DRfEudXk.js} +18 -18
  32. package/dist/public/orchestrator-o9Fj67BN.js +15 -0
  33. package/dist/public/pages/main/~/docs/publishing-to-github-pages.md +17 -82
  34. package/dist/public/{peerjs-Dv8JNm7v.js → peerjs-CurBuKvk.js} +1 -1
  35. package/dist/public/{push-client-Dqq06wbB.js → push-client-Dii-vPEh.js} +1 -1
  36. package/dist/public/service-worker/fetch-proxy.js +1 -1
  37. package/dist/public/service-worker.js +1 -1
  38. package/dist/public/{shadow-claw-Bd1rfuVC.js → shadow-claw-5IHaDDMJ.js} +2 -2
  39. package/dist/public/{shadow-claw-accounts-DL2l3oM0.js → shadow-claw-accounts-CZvz4iQz.js} +3 -3
  40. package/dist/public/{shadow-claw-channels-BGXDsQ38.js → shadow-claw-channels-BKXFyRS3.js} +1 -1
  41. package/dist/public/{shadow-claw-chat-NXg6zz_l.js → shadow-claw-chat-CCLuhWdI.js} +3 -3
  42. package/dist/public/{shadow-claw-conversations-C8eqGpP9.js → shadow-claw-conversations-DV-87UUh.js} +1 -1
  43. package/dist/public/shadow-claw-file-viewer-Dk2dbAUd.js +577 -0
  44. package/dist/public/shadow-claw-files-BpfpJIuP.js +840 -0
  45. package/dist/public/{shadow-claw-git-C0ntz7aX.js → shadow-claw-git-DRA7_qck.js} +3 -3
  46. package/dist/public/{shadow-claw-integrations-DCXV2r69.js → shadow-claw-integrations-1Xu5snuV.js} +1 -1
  47. package/dist/public/{shadow-claw-llm-CudgFQsS.js → shadow-claw-llm-6Aci1BDP.js} +2 -2
  48. package/dist/public/{shadow-claw-mcp-remote-B8RkpX28.js → shadow-claw-mcp-remote-BUjAeVXC.js} +1 -1
  49. package/dist/public/{shadow-claw-networking-BLiRsrsK.js → shadow-claw-networking-FQe4nCp3.js} +1 -1
  50. package/dist/public/{shadow-claw-notifications-CQhQcjtL.js → shadow-claw-notifications-DV2wibL3.js} +1 -1
  51. package/dist/public/{shadow-claw-page-header-NeRD0tKU.js → shadow-claw-page-header-B63S4HTU.js} +1 -1
  52. package/dist/public/{shadow-claw-pages-DCHnFh6r.js → shadow-claw-pages-DE3jWj5K.js} +3 -3
  53. package/dist/public/{shadow-claw-settings-VAfjKFQg.js → shadow-claw-settings-S6DAKfYx.js} +3 -3
  54. package/dist/public/shadow-claw-storage-DaacA3_K.js +219 -0
  55. package/dist/public/{shadow-claw-task-server-Dk33N_1G.js → shadow-claw-task-server-IjKX042p.js} +1 -1
  56. package/dist/public/{shadow-claw-tasks-xA1VfmWN.js → shadow-claw-tasks-Cy0JYmGU.js} +4 -4
  57. package/dist/public/{shadow-claw-terminal-Du2r0ciq.js → shadow-claw-terminal-znAt7HyP.js} +1 -1
  58. package/dist/public/{shadow-claw-tools-CZj4rq7l.js → shadow-claw-tools-Cutv9Si5.js} +2 -2
  59. package/dist/public/{shadow-claw-webvm-JYUkWICG.js → shadow-claw-webvm-BH8mPDEu.js} +1 -1
  60. package/dist/public/static-main/~/docs/publishing-to-github-pages.md +17 -82
  61. package/dist/public/static-main-manifest.json +1 -1
  62. package/dist/public/{syncWebMcpRegistration-DfpvASnh.js → syncWebMcpRegistration-BqJxaMGR.js} +1 -1
  63. package/package.json +1 -1
  64. package/src/components/settings/shadow-claw-storage/shadow-claw-storage.html +17 -0
  65. package/src/components/settings/shadow-claw-storage/shadow-claw-storage.test.ts +44 -0
  66. package/src/components/settings/shadow-claw-storage/shadow-claw-storage.ts +56 -0
  67. package/src/components/shadow-claw-file-viewer/shadow-claw-file-viewer.test.ts +105 -0
  68. package/src/components/shadow-claw-file-viewer/shadow-claw-file-viewer.ts +11 -9
  69. package/src/components/shadow-claw-files/shadow-claw-files.css +41 -17
  70. package/src/components/shadow-claw-files/shadow-claw-files.html +35 -0
  71. package/src/components/shadow-claw-files/shadow-claw-files.test.ts +219 -0
  72. package/src/components/shadow-claw-files/shadow-claw-files.ts +170 -6
  73. package/src/components/shadow-claw-pages/utils/resolveWorkspaceLinkPath.test.ts +31 -0
  74. package/src/components/shadow-claw-pages/utils/resolveWorkspaceLinkPath.ts +2 -1
  75. package/src/components/shadow-claw-pages/utils/rewriteWorkspacePreviewHtml.test.ts +15 -0
  76. package/src/config/config.test.ts +9 -0
  77. package/src/config/config.ts +5 -0
  78. package/src/core/app-routes.test.ts +56 -0
  79. package/src/core/app-routes.ts +8 -1
  80. package/src/db/openDatabase.test.ts +10 -1
  81. package/src/db/openDatabase.ts +3 -1
  82. package/src/storage/migrateLegacyOpfs.test.ts +327 -0
  83. package/src/storage/migrateLegacyOpfs.ts +117 -0
  84. package/dist/public/config-AL77QAx4.js +0 -1
  85. package/dist/public/mcp-reconnect-DoicazQd.js +0 -1
  86. package/dist/public/orchestrator-4su7iyWj.js +0 -15
  87. package/dist/public/shadow-claw-file-viewer-9Qkwc30T.js +0 -577
  88. package/dist/public/shadow-claw-files-aDyq6Hv7.js +0 -781
  89. package/dist/public/shadow-claw-storage-Cf31np81.js +0 -202
@@ -1,202 +0,0 @@
1
- import{r as e}from"./config-AL77QAx4.js";import{n as t}from"./txPromise-EBECky1b.js";import{t as n}from"./getConfig-D89uJgo5.js";import{u as r}from"./custom-element-security-CZ92anB8.js";import{Dn as i,en as a,t as o,tn as s}from"./orchestrator-B9KmIj8Q.js";import{t as c}from"./setConfig-DFMYnYLE.js";import{a as l,r as u,t as d}from"./toast-D3gxhZpN.js";import{t as f}from"./shadow-claw-element-DIrv3P6A.js";import{t as p}from"./effect-BEsuusE8.js";async function m(){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 h(){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 g(){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 _(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 s(t),await a(t),!0}catch(e){if(e instanceof Error&&e.name===`AbortError`)return!1;throw e}}const v=new CSSStyleSheet;v.replaceSync(`*,
2
- *::before,
3
- *::after {
4
- font-family: var(--shadow-claw-font-sans);
5
- }
6
-
7
- :host {
8
- display: block;
9
- }
10
-
11
- .settings-section {
12
- margin-bottom: 1.75rem;
13
- }
14
-
15
- .settings-section h3 {
16
- align-items: center;
17
- display: flex;
18
- font-size: 1rem;
19
- font-weight: 600;
20
- gap: 0.5rem;
21
- margin-bottom: 0.75rem;
22
- }
23
-
24
- .form-group {
25
- margin-bottom: 1rem;
26
- }
27
-
28
- .form-label {
29
- color: var(--shadow-claw-text-primary);
30
- display: block;
31
- font-size: 0.8125rem;
32
- font-weight: 500;
33
- margin-bottom: 0.375rem;
34
- }
35
-
36
- .form-helper {
37
- color: var(--shadow-claw-text-tertiary);
38
- font-size: 0.75rem;
39
- margin-top: 0.25rem;
40
- }
41
-
42
- .hidden,
43
- [hidden] {
44
- display: none !important;
45
- }
46
-
47
- .storage-header {
48
- display: flex;
49
- font-size: 0.8125rem;
50
- justify-content: space-between;
51
- margin-bottom: 0.375rem;
52
- }
53
-
54
- .opacity-60 {
55
- opacity: 0.6;
56
- }
57
-
58
- .storage-progress-container {
59
- background-color: var(--shadow-claw-bg-tertiary);
60
- border-radius: 0.25rem;
61
- height: 0.5rem;
62
- margin-bottom: 0.75rem;
63
- overflow: hidden;
64
- width: 100%;
65
- }
66
-
67
- .storage-progress-bar {
68
- background-color: var(--shadow-claw-accent-primary);
69
- height: 100%;
70
- transition: width 0.3s;
71
- width: 0%;
72
- }
73
-
74
- .storage-info-row {
75
- align-items: center;
76
- display: flex;
77
- font-size: var(--shadow-claw-font-size-sm);
78
- gap: 0.5rem;
79
- margin-bottom: 0.5rem;
80
- }
81
-
82
- .storage-badge {
83
- border-radius: 0.25rem;
84
- display: none;
85
- font-size: 0.6875rem;
86
- font-weight: 600;
87
- padding: 0.125rem 0.375rem;
88
- }
89
-
90
- .persistent-badge {
91
- background-color: var(--shadow-claw-success-color);
92
- border-radius: 0.25rem;
93
- color: white;
94
- display: none;
95
- font-size: 0.6875rem;
96
- font-weight: 600;
97
- padding: 0.125rem 0.375rem;
98
- }
99
-
100
- .storage-buttons {
101
- display: flex;
102
- flex-wrap: wrap;
103
- gap: 0.5rem;
104
- }
105
-
106
- .settings-btn {
107
- background-color: transparent;
108
- border: 0.0625rem solid var(--shadow-claw-border-color);
109
- border-radius: 62.5rem;
110
- color: var(--shadow-claw-text-secondary);
111
- cursor: pointer;
112
- font-size: 0.8125rem;
113
- padding: 0.625rem 0.75rem;
114
- transition: all 150ms cubic-bezier(0.33, 1, 0.68, 1);
115
- width: auto;
116
- }
117
-
118
- .settings-btn:hover {
119
- border-color: var(--shadow-claw-text-primary);
120
- box-shadow: 0 0.625rem 1.875rem 0 rgba(0, 0, 0, 0.08);
121
- color: var(--shadow-claw-text-primary);
122
- }
123
-
124
- .grant-storage-btn {
125
- background-color: var(--shadow-claw-text-primary);
126
- border-color: var(--shadow-claw-text-primary);
127
- color: var(--shadow-claw-bg-primary);
128
- }
129
-
130
- .grant-storage-btn:hover {
131
- background-color: var(--shadow-claw-accent-primary);
132
- border-color: var(--shadow-claw-accent-primary);
133
- color: var(--shadow-claw-on-primary);
134
- }
135
-
136
- .reset-storage-btn {
137
- border-color: var(--shadow-claw-error-color);
138
- color: var(--shadow-claw-error-color);
139
- }
140
- `);const y=new DOMParser().parseFromString(`<template>
141
- <div class="settings-section">
142
- <h3>💾 Storage</h3>
143
- <div class="form-group">
144
- <div class="storage-header">
145
- <span data-info="storage-usage">0 B used</span>
146
- <span class="opacity-60" data-info="storage-quota">of 0 B</span>
147
- </div>
148
- <div class="storage-progress-container">
149
- <div class="storage-progress-bar" data-info="storage-progress"></div>
150
- </div>
151
- </div>
152
-
153
- <div class="form-group">
154
- <label class="form-label">Storage Type</label>
155
- <div class="storage-info-row">
156
- <span data-info="storage-type">Browser Internal (OPFS)</span>
157
- <span class="storage-badge" data-info="storage-status-badge"></span>
158
- <span class="persistent-badge" data-info="storage-persistent-badge">
159
- PERSISTENT
160
- </span>
161
- </div>
162
- <div class="storage-buttons">
163
- <button
164
- class="grant-storage-btn hidden settings-btn"
165
- data-action="grant-storage-permission"
166
- >
167
- 🔓 Grant Permission
168
- </button>
169
- <button class="settings-btn" data-action="request-persistent">
170
- 🔒 Request Persistent
171
- </button>
172
- <button class="settings-btn" data-action="change-storage-dir">
173
- 📁 Change Location
174
- </button>
175
- <button
176
- class="reset-storage-btn settings-btn"
177
- data-action="reset-storage-dir"
178
- >
179
- ♻️ Reset to Default
180
- </button>
181
- <button class="settings-btn" data-action="reset-site-config">
182
- ♻️ Reset Site Config
183
- </button>
184
- </div>
185
- <div class="form-helper" data-info="storage-help-general">
186
- Persistent storage prevents the browser from deleting your chat history
187
- and configuration when disk space is low.
188
- <b>Note:</b> Browsers often only grant this if you bookmark the site or
189
- use it frequently.
190
- </div>
191
- <div class="form-helper" data-info="storage-help-local">
192
- You can use a local folder on your computer for storage. This makes
193
- files directly accessible on your disk.
194
- </div>
195
- </div>
196
- </div>
197
- </template>
198
- `,`text/html`),b=y.querySelector(`template`);let x=[];x=b?Array.from(b.content.children):Array.from(y.head.children).concat(Array.from(y.body.children));var S=x;const C=`shadow-claw-storage`;var w=class extends f{static styles=v;static template=S;db=null;constructor(){super()}async connectedCallback(){if(!this.shadowRoot)throw Error(`shadowRoot not found`);this.db=await t(),this.bindEventListeners(),this.setupEffects(),await this.updateStorageInfo()}disconnectedCallback(){super.disconnectedCallback()}bindEventListeners(){let e=this.shadowRoot;e&&(e.querySelector(`[data-action="request-persistent"]`)?.addEventListener(`click`,()=>this.handleRequestPersistent()),e.querySelector(`[data-action="change-storage-dir"]`)?.addEventListener(`click`,()=>this.handleChangeStorageDir()),e.querySelector(`[data-action="reset-storage-dir"]`)?.addEventListener(`click`,()=>this.handleResetStorageDir()),e.querySelector(`[data-action="reset-site-config"]`)?.addEventListener(`click`,()=>this.handleResetSiteConfig()),e.querySelector(`[data-action="grant-storage-permission"]`)?.addEventListener(`click`,()=>{this.db&&o.grantStorageAccess(this.db)}))}formatBytes(e){if(e===0)return`0 B`;let t=1024,n=[`B`,`KB`,`MB`,`GB`,`TB`],r=Math.floor(Math.log(e)/Math.log(t));return parseFloat((e/t**r).toFixed(1))+` `+n[r]}setupEffects(){let e=this.shadowRoot;e&&this.addCleanup(p(()=>{let t=o.storageStatus;if(!t)return;let n=e.querySelector(`[data-info="storage-type"]`),r=e.querySelector(`[data-info="storage-status-badge"]`),i=e.querySelector(`[data-action="grant-storage-permission"]`);n&&(n.textContent=t.type===`local`?`Local Directory`:`Browser Internal (OPFS)`),r&&(r.style.display=t.type===`local`?`inline-block`:`none`,t.type===`local`&&(r.textContent=t.permission===`granted`?`CONNECTED`:`NEEDS PERMISSION`,r.style.backgroundColor=t.permission===`granted`?`var(--shadow-claw-success-color)`:`var(--shadow-claw-error-color)`,r.style.color=`white`)),i&&(i.style.display=t.type===`local`&&t.permission!==`granted`?`inline-block`:`none`)}))}async handleChangeStorageDir(){if(this.db)try{await _(this.db)&&(u(`Storage location changed. Existing OPFS files were not moved.`,4500),await this.updateStorageInfo(),await o.loadFiles(this.db))}catch(e){d(`Failed to change storage location: ${e instanceof Error?e.message:String(e)}`,6e3)}}async handleRequestPersistent(){if(this.db)try{await g()?u(`Persistent storage granted`,3500):l(`Persistent storage was not granted. Browsers may deny this based on site usage.`,5500),await this.updateStorageInfo()}catch(e){d(`Storage request failed: ${e instanceof Error?e.message:String(e)}`,6e3)}}async handleResetSiteConfig(){if(this.db&&await this.requestConfirmation({title:`Reset Site Config`,message:`Allow embedded site-config.json defaults to apply again after the next reload?`,confirmLabel:`Reset`,cancelLabel:`Cancel`}))try{await o.resetSiteConfigSeed(this.db),u(`Site config reset. Reload to apply its defaults again.`,5e3)}catch(e){d(`Failed to reset site config: ${e instanceof Error?e.message:String(e)}`,6e3)}}async handleResetStorageDir(){if(this.db&&await this.requestConfirmation({title:`Reset Storage Location`,message:`Revert storage to browser-internal (OPFS)?`,confirmLabel:`Revert`,cancelLabel:`Cancel`}))try{await i(this.db),u(`Reverted to browser-internal storage`,3500),await this.updateStorageInfo(),await o.loadFiles(this.db)}catch(e){d(`Failed to reset storage location: ${e instanceof Error?e.message:String(e)}`,6e3)}}async requestConfirmation(e){let t=document.querySelector(`shadow-claw`);return t&&typeof t.requestDialog==`function`?await t.requestDialog({mode:`confirm`,...e}):(l(e.message,4500),!1)}async updateStorageInfo(){if(!this.db)return;let t=this.shadowRoot;if(t)try{let i=await m(),a=this.formatBytes(i.usage),o=this.formatBytes(i.quota),s=i.quota>0?i.usage/i.quota*100:0,c=t.querySelector(`[data-info="storage-usage"]`),l=t.querySelector(`[data-info="storage-quota"]`),u=t.querySelector(`[data-info="storage-progress"]`),d=t.querySelector(`[data-info="storage-type"]`),f=t.querySelector(`[data-info="storage-persistent-badge"]`);c&&(c.textContent=`${a} used`),l&&(l.textContent=`of ${o}`),u&&(u.style.width=`${s}%`);let p=await n(this.db,e.STORAGE_HANDLE);d&&(d.textContent=p?`Local Directory`:`Browser Internal (OPFS)`);let g=await h();f&&(f.style.display=g?`inline-block`:`none`);let _=t.querySelector(`[data-info="storage-help-general"]`),v=t.querySelector(`[data-info="storage-help-local"]`);_&&r(_,p?`Persistent storage protects your <b>chat history, tasks, and settings</b> in the browser database.
199
- Without it, the browser might clear this data if your disk is almost full.`:`Persistent storage protects your <b>files, chat history, and settings</b> in the browser.
200
- Without it, the browser might clear your data if your disk is almost full.`),v&&r(v,p?`ShadowClaw is currently <b>connected to a local folder</b>. Your files are safe on your disk,
201
- but browser persistence is still recommended for your chat history.`:`You can use a local folder on your computer for storage. This makes files directly accessible
202
- on your disk and independent of browser storage limits.`);let y=t.querySelector(`[data-action="request-persistent"]`);y&&(y.disabled=g)}catch(e){console.warn(`Failed to update storage info:`,e)}}};customElements.get(C)||customElements.define(C,w);export{w as ShadowClawStorage};