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.
- package/bin/assert-version-bump.mjs +60 -38
- package/bin/assert-version-bump.test.mjs +74 -11
- package/dist/public/agent.worker.js +6 -6
- package/dist/public/{app-routes-B0ePT49v.js → app-routes-Bs-riIvr.js} +1 -1
- package/dist/public/components/settings/shadow-claw-storage/shadow-claw-storage.html +1 -1
- package/dist/public/components/shadow-claw-files/shadow-claw-files.css +1 -1
- package/dist/public/components/shadow-claw-files/shadow-claw-files.html +1 -1
- package/dist/public/config-BYAuxx3j.js +1 -0
- package/dist/public/{configurePeerJs-B7kNU8AQ.js → configurePeerJs-B4Ym9VMj.js} +1 -1
- package/dist/public/{connections-xd_66YVU.js → connections-BEn6JYdu.js} +1 -1
- package/dist/public/{custom-element-security-CZ92anB8.js → custom-element-security-DdYlUozq.js} +1 -1
- package/dist/public/docs/architecture/storage.md +5 -2
- package/dist/public/docs/decisions/indexeddb-and-opfs-storage.md +5 -2
- package/dist/public/docs/example/article/index.html +2 -2
- package/dist/public/docs/publishing/index.html +19 -76
- package/dist/public/docs/skill-creator/index.html +2 -2
- package/dist/public/{downloadGroupFile-BABv_1mJ.js → downloadGroupFile-Drdvg1Ev.js} +1 -1
- package/dist/public/{e2e-bridge-DkS5xFGX.js → e2e-bridge-BQ4KzUt5.js} +1 -1
- package/dist/public/{file-viewer-CCSABMsE.js → file-viewer-CcZYw-PS.js} +1 -1
- package/dist/public/files/main/~/docs/publishing-to-github-pages.md +17 -82
- package/dist/public/{git-BkjrsRXX.js → git-DEUvQTUA.js} +2 -2
- package/dist/public/{iframe-sanitizer-L6Jyu__Z.js → iframe-sanitizer-0NS4XLOd.js} +1 -1
- package/dist/public/index.html +2 -2
- package/dist/public/index.js +1 -1
- package/dist/public/{initChatSplitResize-BslPXAXS.js → initChatSplitResize-llGkSJXg.js} +1 -1
- package/dist/public/main/index.html +2 -2
- package/dist/public/main/memory/index.html +2 -2
- package/dist/public/{markdown-6MBrIo-S.js → markdown-CyYR4App.js} +1 -1
- package/dist/public/mcp-reconnect-CSx4aMwy.js +1 -0
- package/dist/public/{memoryStorage-CjGseKI1.js → memoryStorage-Dwg8NhAZ.js} +1 -1
- package/dist/public/{orchestrator-B9KmIj8Q.js → orchestrator-DRfEudXk.js} +18 -18
- package/dist/public/orchestrator-o9Fj67BN.js +15 -0
- package/dist/public/pages/main/~/docs/publishing-to-github-pages.md +17 -82
- package/dist/public/{peerjs-Dv8JNm7v.js → peerjs-CurBuKvk.js} +1 -1
- package/dist/public/{push-client-Dqq06wbB.js → push-client-Dii-vPEh.js} +1 -1
- package/dist/public/service-worker/fetch-proxy.js +1 -1
- package/dist/public/service-worker.js +1 -1
- package/dist/public/{shadow-claw-Bd1rfuVC.js → shadow-claw-5IHaDDMJ.js} +2 -2
- package/dist/public/{shadow-claw-accounts-DL2l3oM0.js → shadow-claw-accounts-CZvz4iQz.js} +3 -3
- package/dist/public/{shadow-claw-channels-BGXDsQ38.js → shadow-claw-channels-BKXFyRS3.js} +1 -1
- package/dist/public/{shadow-claw-chat-NXg6zz_l.js → shadow-claw-chat-CCLuhWdI.js} +3 -3
- package/dist/public/{shadow-claw-conversations-C8eqGpP9.js → shadow-claw-conversations-DV-87UUh.js} +1 -1
- package/dist/public/shadow-claw-file-viewer-Dk2dbAUd.js +577 -0
- package/dist/public/shadow-claw-files-BpfpJIuP.js +840 -0
- package/dist/public/{shadow-claw-git-C0ntz7aX.js → shadow-claw-git-DRA7_qck.js} +3 -3
- package/dist/public/{shadow-claw-integrations-DCXV2r69.js → shadow-claw-integrations-1Xu5snuV.js} +1 -1
- package/dist/public/{shadow-claw-llm-CudgFQsS.js → shadow-claw-llm-6Aci1BDP.js} +2 -2
- package/dist/public/{shadow-claw-mcp-remote-B8RkpX28.js → shadow-claw-mcp-remote-BUjAeVXC.js} +1 -1
- package/dist/public/{shadow-claw-networking-BLiRsrsK.js → shadow-claw-networking-FQe4nCp3.js} +1 -1
- package/dist/public/{shadow-claw-notifications-CQhQcjtL.js → shadow-claw-notifications-DV2wibL3.js} +1 -1
- package/dist/public/{shadow-claw-page-header-NeRD0tKU.js → shadow-claw-page-header-B63S4HTU.js} +1 -1
- package/dist/public/{shadow-claw-pages-DCHnFh6r.js → shadow-claw-pages-DE3jWj5K.js} +3 -3
- package/dist/public/{shadow-claw-settings-VAfjKFQg.js → shadow-claw-settings-S6DAKfYx.js} +3 -3
- package/dist/public/shadow-claw-storage-DaacA3_K.js +219 -0
- package/dist/public/{shadow-claw-task-server-Dk33N_1G.js → shadow-claw-task-server-IjKX042p.js} +1 -1
- package/dist/public/{shadow-claw-tasks-xA1VfmWN.js → shadow-claw-tasks-Cy0JYmGU.js} +4 -4
- package/dist/public/{shadow-claw-terminal-Du2r0ciq.js → shadow-claw-terminal-znAt7HyP.js} +1 -1
- package/dist/public/{shadow-claw-tools-CZj4rq7l.js → shadow-claw-tools-Cutv9Si5.js} +2 -2
- package/dist/public/{shadow-claw-webvm-JYUkWICG.js → shadow-claw-webvm-BH8mPDEu.js} +1 -1
- package/dist/public/static-main/~/docs/publishing-to-github-pages.md +17 -82
- package/dist/public/static-main-manifest.json +1 -1
- package/dist/public/{syncWebMcpRegistration-DfpvASnh.js → syncWebMcpRegistration-BqJxaMGR.js} +1 -1
- package/package.json +1 -1
- package/src/components/settings/shadow-claw-storage/shadow-claw-storage.html +17 -0
- package/src/components/settings/shadow-claw-storage/shadow-claw-storage.test.ts +44 -0
- package/src/components/settings/shadow-claw-storage/shadow-claw-storage.ts +56 -0
- package/src/components/shadow-claw-file-viewer/shadow-claw-file-viewer.test.ts +105 -0
- package/src/components/shadow-claw-file-viewer/shadow-claw-file-viewer.ts +11 -9
- package/src/components/shadow-claw-files/shadow-claw-files.css +41 -17
- package/src/components/shadow-claw-files/shadow-claw-files.html +35 -0
- package/src/components/shadow-claw-files/shadow-claw-files.test.ts +219 -0
- package/src/components/shadow-claw-files/shadow-claw-files.ts +170 -6
- package/src/components/shadow-claw-pages/utils/resolveWorkspaceLinkPath.test.ts +31 -0
- package/src/components/shadow-claw-pages/utils/resolveWorkspaceLinkPath.ts +2 -1
- package/src/components/shadow-claw-pages/utils/rewriteWorkspacePreviewHtml.test.ts +15 -0
- package/src/config/config.test.ts +9 -0
- package/src/config/config.ts +5 -0
- package/src/core/app-routes.test.ts +56 -0
- package/src/core/app-routes.ts +8 -1
- package/src/db/openDatabase.test.ts +10 -1
- package/src/db/openDatabase.ts +3 -1
- package/src/storage/migrateLegacyOpfs.test.ts +327 -0
- package/src/storage/migrateLegacyOpfs.ts +117 -0
- package/dist/public/config-AL77QAx4.js +0 -1
- package/dist/public/mcp-reconnect-DoicazQd.js +0 -1
- package/dist/public/orchestrator-4su7iyWj.js +0 -15
- package/dist/public/shadow-claw-file-viewer-9Qkwc30T.js +0 -577
- package/dist/public/shadow-claw-files-aDyq6Hv7.js +0 -781
- package/dist/public/shadow-claw-storage-Cf31np81.js +0 -202
|
@@ -1 +1 @@
|
|
|
1
|
-
import{n as e}from"./rolldown-runtime-aKtaBQYM.js";let t=null;function n(){let e=y(`/static-routing.json`);if(typeof window<`u`&&window.location?.origin)try{return new URL(e,window.location.origin).toString()}catch{return e}return e}function r(e){return e.replace(/^\/+|\/+$/g,``)}function i(e){let t=r(e);return t.endsWith(`/index.html`)?t=t.slice(0,-11):t.endsWith(`index.html`)&&(t=t.slice(0,-10)),r(t)}function a(e){let t=r(e),n=t.split(`/`).filter(Boolean);if(n.length===0)return null;let i=n[0].toLowerCase();if(i===`pages`){if(n.length>=3){let e=n[1];return{page:`pages`,groupId:e===`main`?`br:main`:e.startsWith(`br-`)?`br:${e.slice(3)}`:e,path:n.slice(2).join(`/`)}}return{page:`pages`,groupId:`br:main`,path:n.slice(1).join(`/`)}}if(i===`files`){let e=n[1]||`main`;return{page:`files`,groupId:e===`main`?`br:main`:e.startsWith(`br-`)?`br:${e.slice(3)}`:e,path:n.slice(2).join(`/`)||void 0}}if(i===`chat`){let e=n[1]||`main`;return{page:`chat`,groupId:e===`main`?`br:main`:e.startsWith(`br-`)?`br:${e.slice(3)}`:e}}if(i===`tasks`){let e=n[1]||`main`;return{page:`tasks`,groupId:e===`main`?`br:main`:e.startsWith(`br-`)?`br:${e.slice(3)}`:e}}return i===`main`?{page:`pages`,groupId:`br:main`,path:n.slice(1).join(`/`)}:{page:`pages`,groupId:`br:main`,path:t}}function o(){if(typeof document<`u`){let e=document.getElementById(`shadow-claw-static-routing`);if(e&&e.textContent)try{let t=JSON.parse(e.textContent);if(t&&typeof t==`object`&&t.routes)return t}catch(e){console.warn(`Failed to parse embedded static routing manifest:`,e)}}return null}async function s(){if(t)return t;let e=o(),r=n();if(!e&&typeof fetch==`function`)try{let t=await fetch(r);if(t.ok){let n=await t.json();n&&typeof n==`object`&&(e=n)}}catch{}return e?(e.routes||={},t=e,t):{routes:{}}}function c(e,n){let r=n||t||o();if(!r||!r.routes)return null;let s=i(e);if(!s)return null;for(let[e,t]of Object.entries(r.routes))if(!(!t||!t.prettyPath)&&i(t.prettyPath)===s)return a(e);return null}async function l(e){let t=c(e);if(t)return t;let r=await s();if(!r||!r.subRoutes)return null;let a=r,o=n(),l=5;for(;a&&a.subRoutes&&l>0;){let t=null,n=i(e);if(Array.isArray(a.subRoutes))for(let e of a.subRoutes){let r=e.replace(/\/routes\.json$/,``);if(n.startsWith(r)){t=e;break}}else if(typeof a.subRoutes==`object`){let e=``;for(let[r,o]of Object.entries(a.subRoutes)){let a=i(r);n.startsWith(a)&&a.length>e.length&&(e=a,t=o)}}if(!t||typeof fetch!=`function`)break;try{let n=t;try{if(t.startsWith(`http://`)||t.startsWith(`https://`))n=t;else if(t.startsWith(`/`)){let e=y(t);n=typeof window<`u`&&window.location?.origin?new URL(e,window.location.origin).toString():e}else n=new URL(t,o).toString()}catch{}let i=await fetch(n);if(!i.ok)break;let s=await i.json();if(!s||typeof s!=`object`)break;s.routes&&Object.assign(r.routes,s.routes);let u=c(e,r);if(u)return u;a=s,o=n,l--}catch(e){console.warn(`Failed to lazy load subRoute:`,t,e);break}}return null}function u(e,n){let i=n||t||o();if(!i||!i.routes)return null;let{page:a,groupId:s,path:c}=e;if(!a)return null;let l=s===`br:main`||s===`main`?`main`:s?.startsWith(`br:`)?`br-${s.slice(3)}`:s,u=[];if(a===`pages`&&c){let e=r(c);l===`main`?(u.push(`/pages/main/${e}`),u.push(`pages/main/${e}`),u.push(`/pages/br:main/${e}`),u.push(`/pages/br-main/${e}`),u.push(`/main/${e}`),u.push(`main/${e}`),u.push(`/${e}`),u.push(e)):l&&(u.push(`/pages/${l}/${e}`),u.push(`pages/${l}/${e}`),u.push(`/pages/${s}/${e}`))}else if(a===`files`&&c){let e=r(c);l&&(u.push(`/files/${l}/${e}`),u.push(`files/${l}/${e}`),u.push(`/files/${s}/${e}`))}for(let e of u){let t=r(e);for(let[e,n]of Object.entries(i.routes))if(r(e)===t&&n?.prettyPath)return n.prettyPath}return null}var d=e({applyBasePath:()=>y,buildRoutePath:()=>C,getAppBasePath:()=>v,getDeploymentNamespace:()=>_,getFileRouteDirPath:()=>O,getWorkspaceRouteRequestPath:()=>k,isPossibleAppRoute:()=>T,parseRouteFromUrl:()=>w,parseRouteFromUrlAsync:()=>E,resetAppBasePathCache:()=>g,resolveHrefAgainstRoute:()=>D});function f(e){return e===`br:main`?`main`:e.startsWith(`br:`)?`br-${e.slice(3)}`:encodeURIComponent(e)}function p(e){try{return decodeURIComponent(e)}catch{return e}}let m=null;const h=new Set([`chat`,`files`,`tasks`,`pages`,`settings`,`tools`,`channels`]);function g(){m=null}typeof globalThis<`u`&&(globalThis.__applyBasePathCacheReset=g);function _(){let e=typeof window<`u`?window:typeof self<`u`?self:globalThis;if(e&&e.__SHADOWCLAW_DEPLOY_ID__){let t=String(e.__SHADOWCLAW_DEPLOY_ID__).trim();if(t)return t.replace(/[^a-zA-Z0-9_-]/g,`-`)}let t=globalThis.process;if(t&&t.env&&t.env.SHADOWCLAW_DEPLOY_ID){let e=String(t.env.SHADOWCLAW_DEPLOY_ID).trim();if(e)return e.replace(/[^a-zA-Z0-9_-]/g,`-`)}let n=v();return!n||n===`/`?``:n.replace(/^\/+|\/+$/g,``).replace(/[^a-zA-Z0-9_-]/g,`-`)}function v(){if(m!==null)return m;if((typeof window>`u`||globalThis.WorkerGlobalScope!==void 0&&typeof self<`u`&&self instanceof globalThis.WorkerGlobalScope)&&typeof self<`u`&&self.location){let e=(self.location.pathname||`/`).split(`/`).filter(Boolean);if(e.length<=1)return m=`/`,m;let t=e[0].toLowerCase(),n=t===`service-worker.js`||t===`sw.js`||t===`manifest.json`||t===`sitemap.xml`||t===`favicon.ico`||t===`index.html`||t===`service-worker`||t===`assets`||t===`dist`||t===`public`;if(n&&e.length===2)return m=`/`,m;if(!n)return m=`/`+e[0]+`/`,m}let e=typeof window<`u`&&window.location?window.location:typeof self<`u`&&self.location?self.location:null;if(!e)return`/`;if(typeof document<`u`&&typeof document.querySelector==`function`){let t=document.querySelector(`base[href]`);if(t){let n=t.getAttribute(`href`);if(n)try{let t=new URL(n,e.origin).pathname;return t.endsWith(`/`)||(t+=`/`),m=t,m}catch{}}}let t=e.pathname||`/`;if(t===`/`)return m=`/`,m;let n=t.split(`/`).filter(Boolean),r=n.findIndex(e=>h.has(e.toLowerCase()));return r>=0?r===0?(m=`/`,m):(m=`/`+n.slice(0,r).join(`/`)+`/`,m):c(t)?(m=`/`,m):n.length===1&&!t.includes(`.`)?(m=`/`+n[0]+`/`,m):(m=`/`,m)}function y(e){let t=v();if(t===`/`)return e;let[n,...r]=e.split(/(?=[?#])/);if(n===t||n.startsWith(t))return e;let i=t+(n.startsWith(`/`)?n.slice(1):n);return i=i.replace(/\/{2,}/g,`/`),i+r.join(``)}function b(e){return e.replace(/^\/+|\/+$/g,``)}function x(e){return e&&(e===`main`?`br:main`:e.startsWith(`br-`)?`br:${e.slice(3)}`:e)}function S(e){if(!e)return;let t=b(e.replace(/\\/g,`/`));if(!t)return;let n=t.split(`/`).filter(Boolean).filter(e=>e!==`.`&&e!==`..`);if(n.length!==0)return n.join(`/`)}function C(e){let t=e.anchor?`#${e.anchor.replace(/^#/,``)}`:``,n=u(e);if(n){let e=n;return e.startsWith(`/`)||(e=`/${e}`),`${e}${t}`}switch(e.page){case`chat`:return`${e.groupId?`/chat/${f(e.groupId)}/`:`/chat`}${t}`;case`tasks`:return`${e.groupId?`/tasks/${f(e.groupId)}/`:`/tasks`}${t}`;case`files`:{let n=S(e.path);return e.groupId?n?`/files/${f(e.groupId)}/${n}${t}`:`/files/${f(e.groupId)}/${t}`:`/files${t}`}case`pages`:{let n=S(e.path);return n?e.groupId?`/pages/${f(e.groupId)}/${n}${t}`:`/pages/${n}${t}`:`/pages${t}`}case`tools`:return`/settings/tool-configuration${t}`;case`channels`:return`/settings/channel-configuration${t}`;default:return`/settings${t}`}}function w(e,t){let n=e.pathname,r=v();r!==`/`&&n.startsWith(r)&&(n=`/`+n.slice(r.length));let i=c(n);if(i){let t=e.hash?e.hash.replace(/^#/,``):void 0;return{...i,anchor:t||i.anchor}}let a=n.split(`/`).filter(Boolean).map(e=>p(e)),o=e.hash?e.hash.replace(/^#/,``):void 0;if(a.length===0)return null;let s=a[0].toLowerCase();if(s===`chat`)return{page:`chat`,groupId:x(a[1]||t),anchor:o};if(s===`tasks`)return{page:`tasks`,groupId:x(a[1]||t),anchor:o};if(s===`files`)return{page:`files`,groupId:x(a[1]||t),path:S(a.slice(2).join(`/`)),anchor:o};if(s===`pages`)return a.length>=3?{page:`pages`,groupId:x(a[1]),path:S(a.slice(2).join(`/`)),anchor:o}:{page:`pages`,groupId:x(t),path:S(a.slice(1).join(`/`)),anchor:o};if(s===`settings`){let e=(a[1]||``).toLowerCase();return e===`tool-configuration`?{page:`tools`,anchor:o}:e===`channel-configuration`?{page:`channels`,anchor:o}:{page:`settings`,anchor:o}}return s===`tools`?{page:`tools`,anchor:o}:s===`channels`?{page:`channels`,anchor:o}:null}function T(e){let t=e,n=v();if(n!==`/`&&t.startsWith(n))t=`/`+t.slice(n.length);else if(n!==`/`&&!t.startsWith(n))return!1;let r=t.split(`/`).filter(Boolean);if(r.length===0)return!0;let i=r[0].toLowerCase();return!!(h.has(i)||c(t))}async function E(e,t){let n=w(e,t);if(n)return n;let r=e.pathname,i=v();i!==`/`&&r.startsWith(i)&&(r=`/`+r.slice(i.length));let a=await l(r);if(a){let t=e.hash?e.hash.replace(/^#/,``):void 0;return{...a,anchor:t||a.anchor}}return null}function D(e,t,n){let r=e.trim();if(!r||r.startsWith(`javascript:`))return null;if(r.startsWith(`/`))try{let e=y(r);return new URL(e,n)}catch{return null}let i=new URL(t,n);try{return new URL(r,i)}catch{return null}}function O(e,t){let n=S(t);if(!n)return C({page:`files`,groupId:e});let r=n.split(`/`);r.pop();let i=r.length>0?`${r.join(`/`)}/`:``;return`/files/${f(e)}/${i}`}function k(e){let t=e.split(`/`).filter(Boolean).map(e=>p(e));if(
|
|
1
|
+
import{n as e}from"./rolldown-runtime-aKtaBQYM.js";let t=null;function n(){let e=y(`/static-routing.json`);if(typeof window<`u`&&window.location?.origin)try{return new URL(e,window.location.origin).toString()}catch{return e}return e}function r(e){return e.replace(/^\/+|\/+$/g,``)}function i(e){let t=r(e);return t.endsWith(`/index.html`)?t=t.slice(0,-11):t.endsWith(`index.html`)&&(t=t.slice(0,-10)),r(t)}function a(e){let t=r(e),n=t.split(`/`).filter(Boolean);if(n.length===0)return null;let i=n[0].toLowerCase();if(i===`pages`){if(n.length>=3){let e=n[1];return{page:`pages`,groupId:e===`main`?`br:main`:e.startsWith(`br-`)?`br:${e.slice(3)}`:e,path:n.slice(2).join(`/`)}}return{page:`pages`,groupId:`br:main`,path:n.slice(1).join(`/`)}}if(i===`files`){let e=n[1]||`main`;return{page:`files`,groupId:e===`main`?`br:main`:e.startsWith(`br-`)?`br:${e.slice(3)}`:e,path:n.slice(2).join(`/`)||void 0}}if(i===`chat`){let e=n[1]||`main`;return{page:`chat`,groupId:e===`main`?`br:main`:e.startsWith(`br-`)?`br:${e.slice(3)}`:e}}if(i===`tasks`){let e=n[1]||`main`;return{page:`tasks`,groupId:e===`main`?`br:main`:e.startsWith(`br-`)?`br:${e.slice(3)}`:e}}return i===`main`?{page:`pages`,groupId:`br:main`,path:n.slice(1).join(`/`)}:{page:`pages`,groupId:`br:main`,path:t}}function o(){if(typeof document<`u`){let e=document.getElementById(`shadow-claw-static-routing`);if(e&&e.textContent)try{let t=JSON.parse(e.textContent);if(t&&typeof t==`object`&&t.routes)return t}catch(e){console.warn(`Failed to parse embedded static routing manifest:`,e)}}return null}async function s(){if(t)return t;let e=o(),r=n();if(!e&&typeof fetch==`function`)try{let t=await fetch(r);if(t.ok){let n=await t.json();n&&typeof n==`object`&&(e=n)}}catch{}return e?(e.routes||={},t=e,t):{routes:{}}}function c(e,n){let r=n||t||o();if(!r||!r.routes)return null;let s=i(e);if(!s)return null;for(let[e,t]of Object.entries(r.routes))if(!(!t||!t.prettyPath)&&i(t.prettyPath)===s)return a(e);return null}async function l(e){let t=c(e);if(t)return t;let r=await s();if(!r||!r.subRoutes)return null;let a=r,o=n(),l=5;for(;a&&a.subRoutes&&l>0;){let t=null,n=i(e);if(Array.isArray(a.subRoutes))for(let e of a.subRoutes){let r=e.replace(/\/routes\.json$/,``);if(n.startsWith(r)){t=e;break}}else if(typeof a.subRoutes==`object`){let e=``;for(let[r,o]of Object.entries(a.subRoutes)){let a=i(r);n.startsWith(a)&&a.length>e.length&&(e=a,t=o)}}if(!t||typeof fetch!=`function`)break;try{let n=t;try{if(t.startsWith(`http://`)||t.startsWith(`https://`))n=t;else if(t.startsWith(`/`)){let e=y(t);n=typeof window<`u`&&window.location?.origin?new URL(e,window.location.origin).toString():e}else n=new URL(t,o).toString()}catch{}let i=await fetch(n);if(!i.ok)break;let s=await i.json();if(!s||typeof s!=`object`)break;s.routes&&Object.assign(r.routes,s.routes);let u=c(e,r);if(u)return u;a=s,o=n,l--}catch(e){console.warn(`Failed to lazy load subRoute:`,t,e);break}}return null}function u(e,n){let i=n||t||o();if(!i||!i.routes)return null;let{page:a,groupId:s,path:c}=e;if(!a)return null;let l=s===`br:main`||s===`main`?`main`:s?.startsWith(`br:`)?`br-${s.slice(3)}`:s,u=[];if(a===`pages`&&c){let e=r(c);l===`main`?(u.push(`/pages/main/${e}`),u.push(`pages/main/${e}`),u.push(`/pages/br:main/${e}`),u.push(`/pages/br-main/${e}`),u.push(`/main/${e}`),u.push(`main/${e}`),u.push(`/${e}`),u.push(e)):l&&(u.push(`/pages/${l}/${e}`),u.push(`pages/${l}/${e}`),u.push(`/pages/${s}/${e}`))}else if(a===`files`&&c){let e=r(c);l&&(u.push(`/files/${l}/${e}`),u.push(`files/${l}/${e}`),u.push(`/files/${s}/${e}`))}for(let e of u){let t=r(e);for(let[e,n]of Object.entries(i.routes))if(r(e)===t&&n?.prettyPath)return n.prettyPath}return null}var d=e({applyBasePath:()=>y,buildRoutePath:()=>C,getAppBasePath:()=>v,getDeploymentNamespace:()=>_,getFileRouteDirPath:()=>O,getWorkspaceRouteRequestPath:()=>k,isPossibleAppRoute:()=>T,parseRouteFromUrl:()=>w,parseRouteFromUrlAsync:()=>E,resetAppBasePathCache:()=>g,resolveHrefAgainstRoute:()=>D});function f(e){return e===`br:main`?`main`:e.startsWith(`br:`)?`br-${e.slice(3)}`:encodeURIComponent(e)}function p(e){try{return decodeURIComponent(e)}catch{return e}}let m=null;const h=new Set([`chat`,`files`,`tasks`,`pages`,`settings`,`tools`,`channels`]);function g(){m=null}typeof globalThis<`u`&&(globalThis.__applyBasePathCacheReset=g);function _(){let e=typeof window<`u`?window:typeof self<`u`?self:globalThis;if(e&&e.__SHADOWCLAW_DEPLOY_ID__){let t=String(e.__SHADOWCLAW_DEPLOY_ID__).trim();if(t)return t.replace(/[^a-zA-Z0-9_-]/g,`-`)}let t=globalThis.process;if(t&&t.env&&t.env.SHADOWCLAW_DEPLOY_ID){let e=String(t.env.SHADOWCLAW_DEPLOY_ID).trim();if(e)return e.replace(/[^a-zA-Z0-9_-]/g,`-`)}let n=v();return!n||n===`/`?``:n.replace(/^\/+|\/+$/g,``).replace(/[^a-zA-Z0-9_-]/g,`-`)}function v(){if(m!==null)return m;if((typeof window>`u`||globalThis.WorkerGlobalScope!==void 0&&typeof self<`u`&&self instanceof globalThis.WorkerGlobalScope)&&typeof self<`u`&&self.location){let e=(self.location.pathname||`/`).split(`/`).filter(Boolean);if(e.length<=1)return m=`/`,m;let t=e[0].toLowerCase(),n=t===`service-worker.js`||t===`sw.js`||t===`manifest.json`||t===`sitemap.xml`||t===`favicon.ico`||t===`index.html`||t===`service-worker`||t===`assets`||t===`dist`||t===`public`;if(n&&e.length===2)return m=`/`,m;if(!n)return m=`/`+e[0]+`/`,m}let e=typeof window<`u`&&window.location?window.location:typeof self<`u`&&self.location?self.location:null;if(!e)return`/`;if(typeof document<`u`&&typeof document.querySelector==`function`){let t=document.querySelector(`base[href]`);if(t){let n=t.getAttribute(`href`);if(n)try{let t=new URL(n,e.origin).pathname;return t.endsWith(`/`)||(t+=`/`),m=t,m}catch{}}}let t=e.pathname||`/`;if(t===`/`)return m=`/`,m;let n=t.split(`/`).filter(Boolean),r=n.findIndex(e=>h.has(e.toLowerCase()));return r>=0?r===0?(m=`/`,m):(m=`/`+n.slice(0,r).join(`/`)+`/`,m):c(t)?(m=`/`,m):n.length===1&&!t.includes(`.`)?(m=`/`+n[0]+`/`,m):(m=`/`,m)}function y(e){let t=v();if(t===`/`)return e;let[n,...r]=e.split(/(?=[?#])/);if(n===t||n.startsWith(t))return e;let i=t+(n.startsWith(`/`)?n.slice(1):n);return i=i.replace(/\/{2,}/g,`/`),i+r.join(``)}function b(e){return e.replace(/^\/+|\/+$/g,``)}function x(e){return e&&(e===`main`?`br:main`:e.startsWith(`br-`)?`br:${e.slice(3)}`:e)}function S(e){if(!e)return;let t=b(e.replace(/\\/g,`/`));if(!t)return;let n=t.split(`/`).filter(Boolean).filter(e=>e!==`.`&&e!==`..`);if(n.length!==0)return n.join(`/`)}function C(e){let t=e.anchor?`#${e.anchor.replace(/^#/,``)}`:``,n=u(e);if(n){let e=n;return e.startsWith(`/`)||(e=`/${e}`),`${e}${t}`}switch(e.page){case`chat`:return`${e.groupId?`/chat/${f(e.groupId)}/`:`/chat`}${t}`;case`tasks`:return`${e.groupId?`/tasks/${f(e.groupId)}/`:`/tasks`}${t}`;case`files`:{let n=S(e.path);return e.groupId?n?`/files/${f(e.groupId)}/${n}${t}`:`/files/${f(e.groupId)}/${t}`:`/files${t}`}case`pages`:{let n=S(e.path);return n?e.groupId?`/pages/${f(e.groupId)}/${n}${t}`:`/pages/${n}${t}`:`/pages${t}`}case`tools`:return`/settings/tool-configuration${t}`;case`channels`:return`/settings/channel-configuration${t}`;default:return`/settings${t}`}}function w(e,t){let n=e.pathname,r=v();r!==`/`&&n.startsWith(r)&&(n=`/`+n.slice(r.length));let i=c(n);if(i){let t=e.hash?e.hash.replace(/^#/,``):void 0;return{...i,anchor:t||i.anchor}}let a=n.split(`/`).filter(Boolean).map(e=>p(e)),o=e.hash?e.hash.replace(/^#/,``):void 0;if(a.length===0)return null;let s=a[0].toLowerCase();if(s===`chat`)return{page:`chat`,groupId:x(a[1]||t),anchor:o};if(s===`tasks`)return{page:`tasks`,groupId:x(a[1]||t),anchor:o};if(s===`files`)return{page:`files`,groupId:x(a[1]||t),path:S(a.slice(2).join(`/`)),anchor:o};if(s===`pages`)return a.length>=3?{page:`pages`,groupId:x(a[1]),path:S(a.slice(2).join(`/`)),anchor:o}:{page:`pages`,groupId:x(t),path:S(a.slice(1).join(`/`)),anchor:o};if(s===`settings`){let e=(a[1]||``).toLowerCase();return e===`tool-configuration`?{page:`tools`,anchor:o}:e===`channel-configuration`?{page:`channels`,anchor:o}:{page:`settings`,anchor:o}}return s===`tools`?{page:`tools`,anchor:o}:s===`channels`?{page:`channels`,anchor:o}:null}function T(e){let t=e,n=v();if(n!==`/`&&t.startsWith(n))t=`/`+t.slice(n.length);else if(n!==`/`&&!t.startsWith(n))return!1;let r=t.split(`/`).filter(Boolean);if(r.length===0)return!0;let i=r[0].toLowerCase();return!!(h.has(i)||c(t))}async function E(e,t){let n=w(e,t);if(n)return n;let r=e.pathname,i=v();i!==`/`&&r.startsWith(i)&&(r=`/`+r.slice(i.length));let a=await l(r);if(a){let t=e.hash?e.hash.replace(/^#/,``):void 0;return{...a,anchor:t||a.anchor}}return null}function D(e,t,n){let r=e.trim();if(!r||r.startsWith(`javascript:`))return null;if(r.startsWith(`/`))try{let e=y(r);return new URL(e,n)}catch{return null}let i=new URL(t,n);try{return new URL(r,i)}catch{return null}}function O(e,t){let n=S(t);if(!n)return C({page:`files`,groupId:e});let r=n.split(`/`);r.pop();let i=r.length>0?`${r.join(`/`)}/`:``;return`/files/${f(e)}/${i}`}function k(e){let t=e,n=v();n!==`/`&&t.startsWith(n)&&(t=`/`+t.slice(n.length));let r=t.split(`/`).filter(Boolean).map(e=>p(e));if(r.length<3||r[0]!==`files`)return null;let i=x(r[1])||r[1],a=S(r.slice(2).join(`/`));return!i||!a?null:{groupId:i,path:a}}export{O as a,w as c,_ as i,E as l,y as n,k as o,C as r,T as s,d as t,D as u};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<template><div class="settings-section"> <h3>💾 Storage</h3> <div class="form-group"> <div class="storage-header"> <span data-info="storage-usage">0 B used</span> <span class="opacity-60" data-info="storage-quota">of 0 B</span> </div> <div class="storage-progress-container"> <div class="storage-progress-bar" data-info="storage-progress"></div> </div> </div> <div class="form-group"> <label class="form-label">Storage Type</label> <div class="storage-info-row"> <span data-info="storage-type">Browser Internal (OPFS)</span> <span class="storage-badge" data-info="storage-status-badge"></span> <span class="persistent-badge" data-info="storage-persistent-badge"> PERSISTENT </span> </div> <div class="storage-buttons"> <button class="grant-storage-btn hidden settings-btn" data-action="grant-storage-permission"> 🔓 Grant Permission </button> <button class="settings-btn" data-action="request-persistent"> 🔒 Request Persistent </button> <button class="settings-btn" data-action="change-storage-dir"> 📁 Change Location </button> <button class="reset-storage-btn settings-btn" data-action="reset-storage-dir"> ♻️ Reset to Default </button> <button class="settings-btn" data-action="reset-site-config"> ♻️ Reset Site Config </button> </div> <div class="form-helper" data-info="storage-help-general"> Persistent storage prevents the browser from deleting your chat history and configuration when disk space is low. <b>Note:</b> Browsers often only grant this if you bookmark the site or use it frequently. </div> <div class="form-helper" data-info="storage-help-local"> You can use a local folder on your computer for storage. This makes files directly accessible on your disk. </div> </div> </div></template>
|
|
1
|
+
<template><div class="settings-section"> <h3>💾 Storage</h3> <div class="form-group"> <div class="storage-header"> <span data-info="storage-usage">0 B used</span> <span class="opacity-60" data-info="storage-quota">of 0 B</span> </div> <div class="storage-progress-container"> <div class="storage-progress-bar" data-info="storage-progress"></div> </div> </div> <div class="form-group"> <label class="form-label">Storage Type</label> <div class="storage-info-row"> <span data-info="storage-type">Browser Internal (OPFS)</span> <span class="storage-badge" data-info="storage-status-badge"></span> <span class="persistent-badge" data-info="storage-persistent-badge"> PERSISTENT </span> </div> <div class="storage-buttons"> <button class="grant-storage-btn hidden settings-btn" data-action="grant-storage-permission"> 🔓 Grant Permission </button> <button class="settings-btn" data-action="request-persistent"> 🔒 Request Persistent </button> <button class="settings-btn" data-action="change-storage-dir"> 📁 Change Location </button> <button class="reset-storage-btn settings-btn" data-action="reset-storage-dir"> ♻️ Reset to Default </button> <button class="settings-btn" data-action="reset-site-config"> ♻️ Reset Site Config </button> </div> <div class="form-helper" data-info="storage-help-general"> Persistent storage prevents the browser from deleting your chat history and configuration when disk space is low. <b>Note:</b> Browsers often only grant this if you bookmark the site or use it frequently. </div> <div class="form-helper" data-info="storage-help-local"> You can use a local folder on your computer for storage. This makes files directly accessible on your disk. </div> </div> <div class="form-group"> <div class="form-toggle"> <input data-setting="files-upload-append-ulid-toggle" id="files-upload-append-ulid-toggle" type="checkbox"> <label class="form-label" for="files-upload-append-ulid-toggle"> Append unique ID (ULID) to uploaded file names </label> </div> <div class="form-helper"> When enabled, uploads automatically prefix file names with a ULID (e.g. 01J...-filename.ext). Default: disabled. </div> </div> </div></template>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
*,:after,:before{font-family:var(--shadow-claw-font-sans);scrollbar-color:var(--shadow-claw-border-color) transparent;scrollbar-width:thin}::-webkit-scrollbar{height:.5rem;width:.5rem}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:var(--shadow-claw-border-color);border-radius:.25rem}::-webkit-scrollbar-thumb:hover{background:var(--shadow-claw-text-tertiary)}.hidden,[hidden]{display:none!important}:host{display:flex;flex-direction:column;font-family:var(--shadow-claw-font-sans,system-ui,sans-serif);height:100%;min-height:0;overflow:hidden}.files{display:flex;flex:1;flex-direction:column;min-height:0;overflow:hidden;width:100%}.files__breadcrumbs{align-items:center;display:flex;flex-wrap:wrap;font-size:.8125rem;gap:.5rem}.files__breadcrumbs-spacer{flex:1}.files__sync-btn{background-color:var(--shadow-claw-bg-primary);border:.0625rem solid var(--shadow-claw-border-color);border-radius:.375rem;color:var(--shadow-claw-text-secondary);cursor:pointer;font-size:.75rem;padding:.25rem .5rem;white-space:nowrap}.files__sync-btn:focus-visible,.files__sync-btn:hover{border-color:var(--shadow-claw-accent-primary);color:var(--shadow-claw-accent-primary);outline:none}.files__sync-btn:disabled{cursor:not-allowed;opacity:.6}.files__breadcrumb-btn{background-color:var(--shadow-claw-bg-primary);border:.0625rem solid var(--shadow-claw-border-color);border-radius:.1875rem;color:var(--shadow-claw-accent-primary);cursor:pointer;padding:.25rem .5rem;transition:all .1s}.files__breadcrumb-btn:focus-visible,.files__breadcrumb-btn:hover{background-color:var(--shadow-claw-bg-tertiary);border-color:var(--shadow-claw-accent-primary);outline:none}.files__breadcrumb-separator{color:var(--shadow-claw-text-tertiary)}.files__content{border-radius:var(--shadow-claw-radius-m);flex:1;min-height:0;overflow-y:auto;padding:1rem;position:relative}.files__content--dragover{background-color:color-mix(in oklab,var(--shadow-claw-accent-primary) 8%,transparent);outline:.125rem dashed var(--shadow-claw-accent-primary);outline-offset:-.25rem}.files__drop-hint{color:var(--shadow-claw-text-tertiary);font-size:.75rem;margin-bottom:.625rem}.files__upload-progress{background-color:var(--shadow-claw-bg-secondary);border:.0625rem solid var(--shadow-claw-border-color);border-radius:var(--shadow-claw-radius-m);display:none;margin-bottom:.75rem;padding:.625rem}.files__upload-progress.active{display:block}.files__upload-progress-label{color:var(--shadow-claw-text-secondary);display:block;font-size:.75rem;font-weight:600;margin-bottom:.375rem}.files__upload-progress-track{background-color:var(--shadow-claw-bg-tertiary);border-radius:62.5rem;height:.5rem;overflow:hidden;width:100%}.files__upload-progress-bar{background-color:var(--shadow-claw-accent-primary);height:100%;transition:width .2s ease;width:0}.files__terminal-slot{margin-bottom:1rem}.files__terminal-slot:empty{display:none;margin-bottom:0}.files__list{display:grid;gap:.75rem;grid-template-columns:repeat(auto-fill,minmax(9.375rem,1fr))}.files__item{background-color:var(--shadow-claw-bg-secondary);border:.0625rem solid var(--shadow-claw-border-color);border-radius:var(--shadow-claw-radius-m,1rem);display:flex;flex-direction:column;position:relative;transition:all .15s}.files__item:focus-within,.files__item:hover{background-color:var(--shadow-claw-bg-tertiary);border-color:var(--shadow-claw-accent-primary);transform:translateY(-.125rem)}.files__item-main{align-items:center;background:transparent;border:none;color:inherit;cursor:pointer;display:flex;flex-direction:column;gap:.5rem;height:100%;padding:.75rem;text-align:center;width:100%}.files__item-main:focus-visible{outline:.125rem solid var(--shadow-claw-accent-primary);outline-offset:-.125rem}.files__actions{display:none;flex-wrap:wrap;gap:.25rem;position:absolute;right:2.75rem;top:.25rem;width:6rem;z-index:10}.files__item.show-actions .files__actions{display:flex}.files__actions-toggle{background-color:var(--shadow-claw-bg-primary);border:.0625rem solid var(--shadow-claw-border-color);border-radius:var(--shadow-claw-radius-s);color:var(--shadow-claw-text-primary);cursor:pointer;font-size:.6875rem;padding:.25rem .75rem;position:absolute;right:.25rem;top:.25rem;transition:all .1s;z-index:11}.files__actions-toggle:focus-visible,.files__actions-toggle:hover{background-color:var(--shadow-claw-accent-primary);border-color:var(--shadow-claw-accent-primary);color:var(--shadow-claw-on-primary);outline:none}.files__action-btn{background-color:var(--shadow-claw-bg-primary);border:.0625rem solid var(--shadow-claw-border-color);border-radius:var(--shadow-claw-radius-s);color:var(--shadow-claw-text-primary);cursor:pointer;font-size:.6875rem;padding:.25rem .375rem;transition:all .1s}.files__action-btn:focus-visible,.files__action-btn:hover{background-color:var(--shadow-claw-accent-primary);border-color:var(--shadow-claw-accent-primary);color:var(--shadow-claw-on-primary);outline:none}.files__action-btn--delete{border-color:var(--shadow-claw-error-color);color:var(--shadow-claw-error-color)}.files__action-btn--delete:focus-visible,.files__action-btn--delete:hover{background-color:var(--shadow-claw-error-color);color:var(--shadow-claw-on-error,#fff);outline:none}.files__icon{font-size:2rem}.files__name{-webkit-box-orient:vertical;color:var(--shadow-claw-text-primary);display:-webkit-box;font-size:.8125rem;font-weight:500;-webkit-line-clamp:2;overflow:hidden;word-break:break-all}.files__empty{align-items:center;color:var(--shadow-claw-text-tertiary);display:flex;flex-direction:column;grid-column:1/-1;height:100%;justify-content:center;text-align:center}.files__empty p{font-size:var(--shadow-claw-font-size-sm)}.files__hidden-input{display:none}.files__empty-hint{font-size:.75rem}.files__sr-only{border:0;clip:rect(0 0 0 0);height:.0625rem;margin:-.0625rem;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:.0625rem}.files__new-dialog,.files__rename-dialog{background-color:var(--shadow-claw-bg-primary);border:.0625rem solid var(--shadow-claw-border-color);border-radius:var(--shadow-claw-radius-l,1.5rem);color:var(--shadow-claw-text-primary);max-width:22rem;padding:0;width:calc(100vw - 2rem)}.files__new-dialog::backdrop,.files__rename-dialog::backdrop{background-color:rgba(0,0,0,.35)}.files__new-form,.files__rename-form{display:flex;flex-direction:column;gap:.75rem;padding:1rem}.files__new-label,.files__paste-rename-label,.files__rename-label{color:var(--shadow-claw-text-secondary);font-size:var(--shadow-claw-font-size-sm);font-weight:600}.files__new-input,.files__paste-rename-input,.files__rename-input{background-color:var(--shadow-claw-bg-primary);border:.0625rem solid var(--shadow-claw-border-color);border-radius:var(--shadow-claw-radius-s);color:var(--shadow-claw-text-primary);font-size:var(--shadow-claw-font-size-sm);min-height:2rem;padding:.375rem .5rem}.files__paste-rename-container{display:flex;flex-direction:column;gap:.5rem}.files__new-kind{align-items:center;color:var(--shadow-claw-text-secondary);cursor:pointer;display:inline-flex;font-size:var(--shadow-claw-font-size-sm);gap:.5rem;width:fit-content}.files__new-is-folder{accent-color:var(--shadow-claw-accent-primary)}.files__new-input:focus,.files__paste-rename-input:focus,.files__rename-input:focus{border-color:var(--shadow-claw-accent-primary);box-shadow:0 0 0 .125rem var(--shadow-claw-bg-tertiary);outline:none}.files__new-actions,.files__rename-actions{display:flex;gap:.5rem;justify-content:flex-end}.files__new-cancel,.files__new-ok,.files__rename-cancel,.files__rename-ok{background-color:transparent;border:.0625rem solid var(--shadow-claw-border-color);border-radius:var(--shadow-claw-radius-pill);color:var(--shadow-claw-text-primary);cursor:pointer;font-size:.8125rem;font-weight:600;min-height:2rem;min-width:4.5rem;padding:.375rem .625rem}.files__new-ok,.files__rename-ok{background-color:var(--shadow-claw-text-primary);border-color:var(--shadow-claw-text-primary);color:var(--shadow-claw-bg-primary)}.files__new-ok:focus-visible,.files__new-ok:hover,.files__rename-ok:focus-visible,.files__rename-ok:hover{background-color:var(--shadow-claw-accent-primary);border-color:var(--shadow-claw-accent-primary);color:var(--shadow-claw-on-primary);outline:none}.files__new-cancel:focus-visible,.files__new-cancel:hover,.files__rename-cancel:focus-visible,.files__rename-cancel:hover{border-color:var(--shadow-claw-text-primary);box-shadow:var(--shadow-claw-shadow-md);outline:none}.files__new-cancel:disabled,.files__new-ok:disabled,.files__rename-cancel:disabled,.files__rename-ok:disabled{cursor:not-allowed;opacity:.6}.files__item--cut{border-style:dashed;opacity:.5}.files__paste-dialog{background-color:var(--shadow-claw-bg-primary);border:.0625rem solid var(--shadow-claw-border-color);border-radius:var(--shadow-claw-radius-l,1.5rem);color:var(--shadow-claw-text-primary);max-width:26rem;padding:0;width:calc(100vw - 2rem)}.files__paste-dialog::backdrop{background-color:rgba(0,0,0,.35)}.files__paste-form{display:flex;flex-direction:column;gap:1rem;padding:1.5rem}.files__paste-title{font-size:1.1rem;font-weight:700;margin:0}.files__paste-message{color:var(--shadow-claw-text-secondary);font-size:var(--shadow-claw-font-size-sm);line-height:1.4;margin:0}.files__paste-actions{display:flex;gap:.5rem;justify-content:flex-end;margin-top:.5rem}.files__paste-apply,.files__paste-cancel,.files__paste-continue,.files__paste-ok,.files__paste-overwrite{background-color:transparent;border:.0625rem solid var(--shadow-claw-border-color);border-radius:var(--shadow-claw-radius-pill);color:var(--shadow-claw-text-primary);cursor:pointer;font-size:.8125rem;font-weight:600;min-height:2rem;min-width:4.5rem;padding:.375rem .625rem;transition:all .15s ease}.files__paste-overwrite{border-color:var(--shadow-claw-error-color);color:var(--shadow-claw-error-color)}.files__paste-overwrite:focus-visible,.files__paste-overwrite:hover{background-color:var(--shadow-claw-error-color);color:var(--shadow-claw-on-error,#fff);outline:none}.files__paste-apply,.files__paste-continue,.files__paste-ok{background-color:var(--shadow-claw-text-primary);border-color:var(--shadow-claw-text-primary);color:var(--shadow-claw-bg-primary)}.files__paste-apply:focus-visible,.files__paste-apply:hover,.files__paste-continue:focus-visible,.files__paste-continue:hover,.files__paste-ok:focus-visible,.files__paste-ok:hover{background-color:var(--shadow-claw-accent-primary);border-color:var(--shadow-claw-accent-primary);color:var(--shadow-claw-on-primary);outline:none}.files__paste-cancel:focus-visible,.files__paste-cancel:hover{border-color:var(--shadow-claw-text-primary);box-shadow:var(--shadow-claw-shadow-md);outline:none}.files__paste-apply:disabled,.files__paste-cancel:disabled,.files__paste-continue:disabled,.files__paste-ok:disabled{cursor:not-allowed;opacity:.6}
|
|
1
|
+
*,:after,:before{font-family:var(--shadow-claw-font-sans);scrollbar-color:var(--shadow-claw-border-color) transparent;scrollbar-width:thin}::-webkit-scrollbar{height:.5rem;width:.5rem}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:var(--shadow-claw-border-color);border-radius:.25rem}::-webkit-scrollbar-thumb:hover{background:var(--shadow-claw-text-tertiary)}.hidden,[hidden]{display:none!important}:host{display:flex;flex-direction:column;font-family:var(--shadow-claw-font-sans,system-ui,sans-serif);height:100%;min-height:0;overflow:hidden}.files{display:flex;flex:1;flex-direction:column;min-height:0;overflow:hidden;width:100%}.files__breadcrumbs{align-items:center;display:flex;flex-wrap:wrap;font-size:.8125rem;gap:.5rem}.files__breadcrumbs-spacer{flex:1}.files__sync-btn{background-color:var(--shadow-claw-bg-primary);border:.0625rem solid var(--shadow-claw-border-color);border-radius:.375rem;color:var(--shadow-claw-text-secondary);cursor:pointer;font-size:.75rem;padding:.25rem .5rem;white-space:nowrap}.files__sync-btn:focus-visible,.files__sync-btn:hover{border-color:var(--shadow-claw-accent-primary);color:var(--shadow-claw-accent-primary);outline:none}.files__sync-btn:disabled{cursor:not-allowed;opacity:.6}.files__breadcrumb-btn{background-color:var(--shadow-claw-bg-primary);border:.0625rem solid var(--shadow-claw-border-color);border-radius:.1875rem;color:var(--shadow-claw-accent-primary);cursor:pointer;padding:.25rem .5rem;transition:all .1s}.files__breadcrumb-btn:focus-visible,.files__breadcrumb-btn:hover{background-color:var(--shadow-claw-bg-tertiary);border-color:var(--shadow-claw-accent-primary);outline:none}.files__breadcrumb-separator{color:var(--shadow-claw-text-tertiary)}.files__content{border-radius:var(--shadow-claw-radius-m);flex:1;min-height:0;overflow-y:auto;padding:1rem;position:relative}.files__content--dragover{background-color:color-mix(in oklab,var(--shadow-claw-accent-primary) 8%,transparent);outline:.125rem dashed var(--shadow-claw-accent-primary);outline-offset:-.25rem}.files__drop-hint{color:var(--shadow-claw-text-tertiary);font-size:.75rem;margin-bottom:.625rem}.files__upload-progress{background-color:var(--shadow-claw-bg-secondary);border:.0625rem solid var(--shadow-claw-border-color);border-radius:var(--shadow-claw-radius-m);display:none;margin-bottom:.75rem;padding:.625rem}.files__upload-progress.active{display:block}.files__upload-progress-label{color:var(--shadow-claw-text-secondary);display:block;font-size:.75rem;font-weight:600;margin-bottom:.375rem}.files__upload-progress-track{background-color:var(--shadow-claw-bg-tertiary);border-radius:62.5rem;height:.5rem;overflow:hidden;width:100%}.files__upload-progress-bar{background-color:var(--shadow-claw-accent-primary);height:100%;transition:width .2s ease;width:0}.files__terminal-slot{margin-bottom:1rem}.files__terminal-slot:empty{display:none;margin-bottom:0}.files__list{display:grid;gap:.75rem;grid-template-columns:repeat(auto-fill,minmax(9.375rem,1fr))}.files__item{background-color:var(--shadow-claw-bg-secondary);border:.0625rem solid var(--shadow-claw-border-color);border-radius:var(--shadow-claw-radius-m,1rem);display:flex;flex-direction:column;position:relative;transition:all .15s}.files__item:focus-within,.files__item:hover{background-color:var(--shadow-claw-bg-tertiary);border-color:var(--shadow-claw-accent-primary);transform:translateY(-.125rem)}.files__item-main{align-items:center;background:transparent;border:none;color:inherit;cursor:pointer;display:flex;flex-direction:column;gap:.5rem;height:100%;padding:.75rem;text-align:center;width:100%}.files__item-main:focus-visible{outline:.125rem solid var(--shadow-claw-accent-primary);outline-offset:-.125rem}.files__actions{display:none;flex-wrap:wrap;gap:.25rem;position:absolute;right:2.75rem;top:.25rem;width:6rem;z-index:10}.files__item.show-actions .files__actions{display:flex}.files__actions-toggle{background-color:var(--shadow-claw-bg-primary);border:.0625rem solid var(--shadow-claw-border-color);border-radius:var(--shadow-claw-radius-s);color:var(--shadow-claw-text-primary);cursor:pointer;font-size:.6875rem;padding:.25rem .75rem;position:absolute;right:.25rem;top:.25rem;transition:all .1s;z-index:11}.files__actions-toggle:focus-visible,.files__actions-toggle:hover{background-color:var(--shadow-claw-accent-primary);border-color:var(--shadow-claw-accent-primary);color:var(--shadow-claw-on-primary);outline:none}.files__action-btn{background-color:var(--shadow-claw-bg-primary);border:.0625rem solid var(--shadow-claw-border-color);border-radius:var(--shadow-claw-radius-s);color:var(--shadow-claw-text-primary);cursor:pointer;font-size:.6875rem;padding:.25rem .375rem;transition:all .1s}.files__action-btn:focus-visible,.files__action-btn:hover{background-color:var(--shadow-claw-accent-primary);border-color:var(--shadow-claw-accent-primary);color:var(--shadow-claw-on-primary);outline:none}.files__action-btn--delete{border-color:var(--shadow-claw-error-color);color:var(--shadow-claw-error-color)}.files__action-btn--delete:focus-visible,.files__action-btn--delete:hover{background-color:var(--shadow-claw-error-color);color:var(--shadow-claw-on-error,#fff);outline:none}.files__icon{font-size:2rem}.files__name{-webkit-box-orient:vertical;color:var(--shadow-claw-text-primary);display:-webkit-box;font-size:.8125rem;font-weight:500;-webkit-line-clamp:2;overflow:hidden;word-break:break-all}.files__empty{align-items:center;color:var(--shadow-claw-text-tertiary);display:flex;flex-direction:column;grid-column:1/-1;height:100%;justify-content:center;text-align:center}.files__empty p{font-size:var(--shadow-claw-font-size-sm)}.files__hidden-input{display:none}.files__empty-hint{font-size:.75rem}.files__sr-only{border:0;clip:rect(0 0 0 0);height:.0625rem;margin:-.0625rem;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:.0625rem}.files__new-dialog,.files__rename-dialog{background-color:var(--shadow-claw-bg-primary);border:.0625rem solid var(--shadow-claw-border-color);border-radius:var(--shadow-claw-radius-l,1.5rem);color:var(--shadow-claw-text-primary);max-width:22rem;padding:0;width:calc(100vw - 2rem)}.files__new-dialog::backdrop,.files__rename-dialog::backdrop{background-color:rgba(0,0,0,.35)}.files__new-form,.files__rename-form{display:flex;flex-direction:column;gap:.75rem;padding:1rem}.files__new-label,.files__paste-rename-label,.files__rename-label,.files__upload-conflict-rename-label{color:var(--shadow-claw-text-secondary);font-size:var(--shadow-claw-font-size-sm);font-weight:600}.files__new-input,.files__paste-rename-input,.files__rename-input,.files__upload-conflict-rename-input{background-color:var(--shadow-claw-bg-primary);border:.0625rem solid var(--shadow-claw-border-color);border-radius:var(--shadow-claw-radius-s);color:var(--shadow-claw-text-primary);font-size:var(--shadow-claw-font-size-sm);min-height:2rem;padding:.375rem .5rem}.files__paste-rename-container,.files__upload-conflict-rename-container{display:flex;flex-direction:column;gap:.5rem}.files__new-kind{align-items:center;color:var(--shadow-claw-text-secondary);cursor:pointer;display:inline-flex;font-size:var(--shadow-claw-font-size-sm);gap:.5rem;width:fit-content}.files__new-is-folder{accent-color:var(--shadow-claw-accent-primary)}.files__new-input:focus,.files__paste-rename-input:focus,.files__rename-input:focus,.files__upload-conflict-rename-input:focus{border-color:var(--shadow-claw-accent-primary);box-shadow:0 0 0 .125rem var(--shadow-claw-bg-tertiary);outline:none}.files__new-actions,.files__rename-actions{display:flex;gap:.5rem;justify-content:flex-end}.files__new-cancel,.files__new-ok,.files__rename-cancel,.files__rename-ok{background-color:transparent;border:.0625rem solid var(--shadow-claw-border-color);border-radius:var(--shadow-claw-radius-pill);color:var(--shadow-claw-text-primary);cursor:pointer;font-size:.8125rem;font-weight:600;min-height:2rem;min-width:4.5rem;padding:.375rem .625rem}.files__new-ok,.files__rename-ok{background-color:var(--shadow-claw-text-primary);border-color:var(--shadow-claw-text-primary);color:var(--shadow-claw-bg-primary)}.files__new-ok:focus-visible,.files__new-ok:hover,.files__rename-ok:focus-visible,.files__rename-ok:hover{background-color:var(--shadow-claw-accent-primary);border-color:var(--shadow-claw-accent-primary);color:var(--shadow-claw-on-primary);outline:none}.files__new-cancel:focus-visible,.files__new-cancel:hover,.files__rename-cancel:focus-visible,.files__rename-cancel:hover{border-color:var(--shadow-claw-text-primary);box-shadow:var(--shadow-claw-shadow-md);outline:none}.files__new-cancel:disabled,.files__new-ok:disabled,.files__rename-cancel:disabled,.files__rename-ok:disabled{cursor:not-allowed;opacity:.6}.files__item--cut{border-style:dashed;opacity:.5}.files__paste-dialog,.files__upload-conflict-dialog{background-color:var(--shadow-claw-bg-primary);border:.0625rem solid var(--shadow-claw-border-color);border-radius:var(--shadow-claw-radius-l,1.5rem);color:var(--shadow-claw-text-primary);max-width:26rem;padding:0;width:calc(100vw - 2rem)}.files__paste-dialog::backdrop,.files__upload-conflict-dialog::backdrop{background-color:rgba(0,0,0,.35)}.files__paste-form,.files__upload-conflict-form{display:flex;flex-direction:column;gap:1rem;padding:1.5rem}.files__paste-title,.files__upload-conflict-title{font-size:1.1rem;font-weight:700;margin:0}.files__paste-message,.files__upload-conflict-message{color:var(--shadow-claw-text-secondary);font-size:var(--shadow-claw-font-size-sm);line-height:1.4;margin:0}.files__paste-actions,.files__upload-conflict-actions{display:flex;gap:.5rem;justify-content:flex-end;margin-top:.5rem}.files__paste-apply,.files__paste-cancel,.files__paste-continue,.files__paste-ok,.files__paste-overwrite,.files__upload-conflict-cancel,.files__upload-conflict-ok,.files__upload-conflict-overwrite{background-color:transparent;border:.0625rem solid var(--shadow-claw-border-color);border-radius:var(--shadow-claw-radius-pill);color:var(--shadow-claw-text-primary);cursor:pointer;font-size:.8125rem;font-weight:600;min-height:2rem;min-width:4.5rem;padding:.375rem .625rem;transition:all .15s ease}.files__paste-overwrite,.files__upload-conflict-overwrite{border-color:var(--shadow-claw-error-color);color:var(--shadow-claw-error-color)}.files__paste-overwrite:focus-visible,.files__paste-overwrite:hover,.files__upload-conflict-overwrite:focus-visible,.files__upload-conflict-overwrite:hover{background-color:var(--shadow-claw-error-color);color:var(--shadow-claw-on-error,#fff);outline:none}.files__paste-apply,.files__paste-continue,.files__paste-ok,.files__upload-conflict-ok{background-color:var(--shadow-claw-text-primary);border-color:var(--shadow-claw-text-primary);color:var(--shadow-claw-bg-primary)}.files__paste-apply:focus-visible,.files__paste-apply:hover,.files__paste-continue:focus-visible,.files__paste-continue:hover,.files__paste-ok:focus-visible,.files__paste-ok:hover,.files__upload-conflict-ok:focus-visible,.files__upload-conflict-ok:hover{background-color:var(--shadow-claw-accent-primary);border-color:var(--shadow-claw-accent-primary);color:var(--shadow-claw-on-primary);outline:none}.files__paste-cancel:focus-visible,.files__paste-cancel:hover,.files__upload-conflict-cancel:focus-visible,.files__upload-conflict-cancel:hover{border-color:var(--shadow-claw-text-primary);box-shadow:var(--shadow-claw-shadow-md);outline:none}.files__paste-apply:disabled,.files__paste-cancel:disabled,.files__paste-continue:disabled,.files__paste-ok:disabled,.files__upload-conflict-cancel:disabled,.files__upload-conflict-ok:disabled,.files__upload-conflict-overwrite:disabled{cursor:not-allowed;opacity:.6}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<template><section class="files" aria-label="Files"> <shadow-claw-page-header icon="📁" title="Files"> <shadow-claw-page-header-action-button slot="actions" title="Refresh file list" class="files__refresh-btn"> 🔄 Refresh </shadow-claw-page-header-action-button> <shadow-claw-page-header-action-button slot="actions" title="Upload files to workspace" class="files__upload-btn"> 📤 Upload </shadow-claw-page-header-action-button> <shadow-claw-page-header-action-button slot="actions" title="Create a new file or folder" class="files__new-btn"> ➕ New </shadow-claw-page-header-action-button> <shadow-claw-page-header-action-button slot="actions" title="Paste clipboard file or folder" class="files__paste-btn" hidden disabled> 📋 Paste </shadow-claw-page-header-action-button> <shadow-claw-page-header-action-button slot="actions" title="Backup workspace files" class="files__backup-btn"> 💾 Backup </shadow-claw-page-header-action-button> <shadow-claw-page-header-action-button slot="actions" title="Restore workspace from backup" class="files__restore-btn"> ♻️ Restore </shadow-claw-page-header-action-button> <shadow-claw-page-header-action-button slot="actions" title="Delete all workspace files" class="files__clear-btn" variant="danger"> 🗑️ Clear All </shadow-claw-page-header-action-button> <nav slot="breadcrumbs" class="files__breadcrumbs" aria-label="Current folder"> <span class="files__breadcrumbs-path" data-breadcrumb-path></span> <span class="files__breadcrumbs-spacer" aria-hidden="true" hidden></span> <button type="button" class="files__sync-btn files__sync-host-btn" title="Push host Files panel changes into /home/user inside WebVM" hidden> Host → VM </button> <button type="button" class="files__sync-btn files__sync-vm-btn" title="Pull /home/user changes from WebVM terminal back into Files panel" hidden> VM → Host </button> </nav> </shadow-claw-page-header> <input type="file" class="files__hidden-input files__hidden-upload" multiple accept="*/*" aria-label="Upload files"> <input type="file" class="files__hidden-input files__hidden-restore" accept=".zip,application/zip" aria-label="Restore files from zip backup"> <shadow-claw-dialog dialog-class="files__new-dialog" dialog-aria-label="Create new item"> <form class="files__new-form" method="dialog"> <label class="files__new-label" for="files-new-name">Name</label> <input class="files__new-input" id="files-new-name" name="files-new-name" type="text" autocomplete="off" required> <label class="files__new-kind"> <input class="files__new-is-folder" id="files-new-is-folder" name="files-new-is-folder" type="checkbox"> Create as folder </label> <div class="files__new-actions"> <button class="files__new-cancel" type="button">Cancel</button> <button class="files__new-ok" type="submit">OK</button> </div> </form> </shadow-claw-dialog> <shadow-claw-dialog dialog-class="files__rename-dialog" dialog-aria-label="Rename file or folder"> <form class="files__rename-form" method="dialog"> <label class="files__rename-label" for="files-rename-name">Name</label> <input class="files__rename-input" id="files-rename-name" name="files-rename-name" type="text" autocomplete="off" required> <div class="files__rename-actions"> <button class="files__rename-cancel" type="button">Cancel</button> <button class="files__rename-ok" type="submit">Rename</button> </div> </form> </shadow-claw-dialog> <shadow-claw-dialog dialog-class="files__paste-dialog" dialog-aria-label="Paste file or folder"> <form class="files__paste-form" method="dialog"> <h3 class="files__paste-title">Confirm Paste</h3> <p class="files__paste-message"></p> <div class="files__paste-rename-container" hidden> <label class="files__paste-rename-label" for="files-paste-name">New Name</label> <input class="files__paste-rename-input" id="files-paste-name" name="files-paste-name" type="text" autocomplete="off"> </div> <div class="files__paste-actions"> <button class="files__paste-cancel" type="button">Cancel</button> <button class="files__paste-overwrite" type="button" hidden> Overwrite </button> <button class="files__paste-ok" type="submit">OK</button> </div> </form> </shadow-claw-dialog> <div class="files__content"> <div class="files__terminal-slot" data-terminal-slot hidden></div> <p class="files__drop-hint">Drop files here to upload</p> <div class="files__upload-progress" aria-live="polite" aria-label="Upload progress"> <span class="files__upload-progress-label">Uploading files...</span> <div class="files__upload-progress-track"> <div class="files__upload-progress-bar"></div> </div> </div> <div class="files__list" role="list" aria-live="polite"></div> </div> </section></template>
|
|
1
|
+
<template><section class="files" aria-label="Files"> <shadow-claw-page-header icon="📁" title="Files"> <shadow-claw-page-header-action-button slot="actions" title="Refresh file list" class="files__refresh-btn"> 🔄 Refresh </shadow-claw-page-header-action-button> <shadow-claw-page-header-action-button slot="actions" title="Upload files to workspace" class="files__upload-btn"> 📤 Upload </shadow-claw-page-header-action-button> <shadow-claw-page-header-action-button slot="actions" title="Create a new file or folder" class="files__new-btn"> ➕ New </shadow-claw-page-header-action-button> <shadow-claw-page-header-action-button slot="actions" title="Paste clipboard file or folder" class="files__paste-btn" hidden disabled> 📋 Paste </shadow-claw-page-header-action-button> <shadow-claw-page-header-action-button slot="actions" title="Backup workspace files" class="files__backup-btn"> 💾 Backup </shadow-claw-page-header-action-button> <shadow-claw-page-header-action-button slot="actions" title="Restore workspace from backup" class="files__restore-btn"> ♻️ Restore </shadow-claw-page-header-action-button> <shadow-claw-page-header-action-button slot="actions" title="Delete all workspace files" class="files__clear-btn" variant="danger"> 🗑️ Clear All </shadow-claw-page-header-action-button> <nav slot="breadcrumbs" class="files__breadcrumbs" aria-label="Current folder"> <span class="files__breadcrumbs-path" data-breadcrumb-path></span> <span class="files__breadcrumbs-spacer" aria-hidden="true" hidden></span> <button type="button" class="files__sync-btn files__sync-host-btn" title="Push host Files panel changes into /home/user inside WebVM" hidden> Host → VM </button> <button type="button" class="files__sync-btn files__sync-vm-btn" title="Pull /home/user changes from WebVM terminal back into Files panel" hidden> VM → Host </button> </nav> </shadow-claw-page-header> <input type="file" class="files__hidden-input files__hidden-upload" multiple accept="*/*" aria-label="Upload files"> <input type="file" class="files__hidden-input files__hidden-restore" accept=".zip,application/zip" aria-label="Restore files from zip backup"> <shadow-claw-dialog dialog-class="files__new-dialog" dialog-aria-label="Create new item"> <form class="files__new-form" method="dialog"> <label class="files__new-label" for="files-new-name">Name</label> <input class="files__new-input" id="files-new-name" name="files-new-name" type="text" autocomplete="off" required> <label class="files__new-kind"> <input class="files__new-is-folder" id="files-new-is-folder" name="files-new-is-folder" type="checkbox"> Create as folder </label> <div class="files__new-actions"> <button class="files__new-cancel" type="button">Cancel</button> <button class="files__new-ok" type="submit">OK</button> </div> </form> </shadow-claw-dialog> <shadow-claw-dialog dialog-class="files__rename-dialog" dialog-aria-label="Rename file or folder"> <form class="files__rename-form" method="dialog"> <label class="files__rename-label" for="files-rename-name">Name</label> <input class="files__rename-input" id="files-rename-name" name="files-rename-name" type="text" autocomplete="off" required> <div class="files__rename-actions"> <button class="files__rename-cancel" type="button">Cancel</button> <button class="files__rename-ok" type="submit">Rename</button> </div> </form> </shadow-claw-dialog> <shadow-claw-dialog dialog-class="files__paste-dialog" dialog-aria-label="Paste file or folder"> <form class="files__paste-form" method="dialog"> <h3 class="files__paste-title">Confirm Paste</h3> <p class="files__paste-message"></p> <div class="files__paste-rename-container" hidden> <label class="files__paste-rename-label" for="files-paste-name">New Name</label> <input class="files__paste-rename-input" id="files-paste-name" name="files-paste-name" type="text" autocomplete="off"> </div> <div class="files__paste-actions"> <button class="files__paste-cancel" type="button">Cancel</button> <button class="files__paste-overwrite" type="button" hidden> Overwrite </button> <button class="files__paste-ok" type="submit">OK</button> </div> </form> </shadow-claw-dialog> <shadow-claw-dialog dialog-class="files__upload-conflict-dialog" dialog-aria-label="File upload conflict"> <form class="files__upload-conflict-form" method="dialog"> <h3 class="files__upload-conflict-title">File Already Exists</h3> <p class="files__upload-conflict-message"></p> <div class="files__upload-conflict-rename-container"> <label class="files__upload-conflict-rename-label" for="files-upload-conflict-name">New Name</label> <input class="files__upload-conflict-rename-input" id="files-upload-conflict-name" name="files-upload-conflict-name" type="text" autocomplete="off" required> </div> <div class="files__upload-conflict-actions"> <button class="files__upload-conflict-cancel" type="button"> Cancel </button> <button class="files__upload-conflict-overwrite" type="button"> Overwrite </button> <button class="files__upload-conflict-ok" type="submit"> Rename </button> </div> </form> </shadow-claw-dialog> <div class="files__content"> <div class="files__terminal-slot" data-terminal-slot hidden></div> <p class="files__drop-hint">Drop files here to upload</p> <div class="files__upload-progress" aria-live="polite" aria-label="Upload progress"> <span class="files__upload-progress-label">Uploading files...</span> <div class="files__upload-progress-track"> <div class="files__upload-progress-bar"></div> </div> </div> <div class="files__list" role="list" aria-live="polite"></div> </div> </section></template>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{n as e}from"./rolldown-runtime-aKtaBQYM.js";import{i as t}from"./app-routes-Bs-riIvr.js";const n=new class{loading=!1;models=new Map;getModelInfo(e){return this.models.get(e.toLowerCase())??null}registerModelInfo(e,t){this.models.set(e.toLowerCase(),t)}clear(){this.models.clear()}async fetchModelInfo(e,t,n){if(e.modelsUrl){this.loading=!0;try{let r=new Headers;if(r.set(`Content-Type`,`application/json`),e.headers)for(let[t,n]of Object.entries(e.headers))r.set(t,n);if(n)for(let[e,t]of Object.entries(n))r.set(e,t);if(t&&e.apiKeyHeader){let n=e.apiKeyHeaderFormat;r.set(e.apiKeyHeader,n?n.replace(`{key}`,t):t)}let i=await fetch(e.modelsUrl,{headers:r});if(!i.ok)throw Error(`HTTP ${i.status} ${i.statusText}`);let a=await i.json(),o=Array.isArray(a.data)?a.data:Array.isArray(a.models)?a.models:[];for(let e of o){if(!e.id)continue;let t=e.context_length??e.context_window??0,n=e.max_completion_tokens||e.per_request_limits?.completion_tokens||e.top_provider?.max_completion_tokens||null,r=typeof e.supports_tools==`boolean`?e.supports_tools:typeof e.supportsTools==`boolean`?e.supportsTools:void 0,i=this.extractModalities(e,`input`),a=this.extractModalities(e,`output`),o=this.modalitiesInclude(i,`image`,`vision`),s=this.modalitiesInclude(i,`audio`,`voice`,`hearing`),c=this.modalitiesInclude(i,`video`),l=e.id===`openrouter/free`||this.supportedParametersInclude(e,`image`,`vision`,`audio`,`tool`,`structured`),u=this.extractReasoning(e);!t&&Array.isArray(e.providers)&&e.providers.length>0&&(t=e.providers[0]?.context_length||0),this.registerModelInfo(e.id,{contextWindow:t,maxOutput:n,...r!==void 0&&{supportsTools:r},...i.length>0&&{inputModalities:i},...a.length>0&&{outputModalities:a},...o!==void 0&&{supportsImageInput:o},...s!==void 0&&{supportsAudioInput:s},...c!==void 0&&{supportsVideoInput:c},...u&&{reasoning:u},...l&&{routesByRequestFeatures:l}})}o.length>0&&console.log(`[ModelRegistry] Registered ${o.length} models for provider "${e.id}"`)}catch(t){console.error(`[ModelRegistry] Error fetching models for ${e.id}:`,t)}finally{this.loading=!1}}}extractModalities(e,t){let n=t===`input`?e.input_modalities||e.inputModalities:e.output_modalities||e.outputModalities,r=e.architecture||{},i=t===`input`?r.input_modalities||r.inputModalities:r.output_modalities||r.outputModalities,a=typeof r.modality==`string`?r.modality:``,o=this.parseArchitectureModality(a,t),s=[...this.normalizeStringArray(n),...this.normalizeStringArray(i),...o];return Array.from(new Set(s))}extractReasoning(e){let t=e?.reasoning;if(!t||typeof t!=`object`)return;let n=this.normalizeStringArray(t.supported_efforts),r=typeof t.default_effort==`string`?t.default_effort.toLowerCase():void 0,i=typeof t.default_enabled==`boolean`?t.default_enabled:void 0,a=typeof t.supports_max_tokens==`boolean`?t.supports_max_tokens:void 0,o=typeof t.mandatory==`boolean`?t.mandatory:void 0;if(!(n.length===0&&r===void 0&&i===void 0&&a===void 0&&o===void 0))return{...n.length>0&&{supportedEfforts:n},...r!==void 0&&{defaultEffort:r},...i!==void 0&&{defaultEnabled:i},...a!==void 0&&{supportsMaxTokens:a},...o!==void 0&&{mandatory:o}}}modalitiesInclude(e,...t){if(e.length!==0)return t.some(t=>e.some(e=>e.includes(t)))}normalizeStringArray(e){return Array.isArray(e)?e.filter(e=>typeof e==`string`).map(e=>e.toLowerCase()):[]}parseArchitectureModality(e,t){if(!e)return[];let[n=``,r=``]=e.toLowerCase().split(`->`).map(e=>e.trim());return(t===`input`?n:r).split(/[+,/\s]+/).map(e=>e.trim()).filter(Boolean)}supportedParametersInclude(e,...t){let n=this.normalizeStringArray(e.supported_parameters||e.supportedParameters);return t.some(e=>n.some(t=>t.includes(e)))}};var r=e({ASSISTANT_NAME:()=>i,BASH_DEFAULT_TIMEOUT_SEC:()=>900,BASH_MAX_TIMEOUT_SEC:()=>f,BEDROCK_PROXY_MODELS_URL:()=>E,BEDROCK_PROXY_URL:()=>T,CONFIG_KEYS:()=>H,CONTEXT_WINDOW_SIZE:()=>50,DB_VERSION:()=>2,DEFAULT_DEV_HOST:()=>U,DEFAULT_DEV_IP:()=>DEFAULT_DEV_IP,DEFAULT_DEV_PORT:()=>W,DEFAULT_FILES_UPLOAD_APPEND_ULID:()=>!1,DEFAULT_GROUP_ID:()=>y,DEFAULT_MAX_ITERATIONS:()=>50,DEFAULT_MAX_TOKENS:()=>o,DEFAULT_PROMPT_API_BACKEND:()=>DEFAULT_PROMPT_API_BACKEND,DEFAULT_PROMPT_API_DTYPE_STRATEGY:()=>DEFAULT_PROMPT_API_DTYPE_STRATEGY,DEFAULT_PROMPT_API_FALLBACK_MODEL:()=>K,DEFAULT_PROVIDER:()=>l,DEFAULT_SUBAGENT_MAX_PARALLEL:()=>5,DEFAULT_SUBAGENT_WORKSPACE_MODE:()=>G,DEFAULT_TASK_SERVER_ENABLED:()=>!1,DEFAULT_TASK_SERVER_URL:()=>q,DEFAULT_TRANSFORMERS_JS_BACKEND:()=>DEFAULT_TRANSFORMERS_JS_BACKEND,DEFAULT_TRANSFORMERS_JS_DTYPE_STRATEGY:()=>DEFAULT_TRANSFORMERS_JS_DTYPE_STRATEGY,DEFAULT_TRANSFORMERS_JS_MODEL:()=>DEFAULT_TRANSFORMERS_JS_MODEL,DEFAULT_VM_BOOT_HOST:()=>m,DEFAULT_VM_NETWORK_RELAY_URL:()=>p,FETCH_MAX_RESPONSE:()=>d,GENERAL_ACCOUNT_PROVIDER_CAPABILITIES:()=>N,IMESSAGE_POLL_TIMEOUT:()=>25,IMESSAGE_REQUEST_TIMEOUT_MS:()=>C,LEGACY_DB_NAME:()=>h,LEGACY_OPFS_ROOT:()=>_,LLAMAFILE_PROXY_MODELS_URL:()=>A,LLAMAFILE_PROXY_URL:()=>k,MODEL_OUTPUT_LIMITS:()=>s,OAUTH_PROVIDER_DEFINITIONS:()=>P,OLLAMA_PROXY_MODELS_URL:()=>M,OLLAMA_PROXY_URL:()=>j,OPFS_ROOT:()=>v,PEERJS_DEFAULT_HOST:()=>w,PEERJS_DEFAULT_PATH:()=>`/`,PEERJS_DEFAULT_PORT:()=>443,PEERJS_DEFAULT_SECURE:()=>!0,PROCESS_LOOP_INTERVAL:()=>100,PROVIDERS:()=>F,SCHEDULER_INTERVAL:()=>u,TELEGRAM_API_BASE:()=>b,TELEGRAM_MAX_LENGTH:()=>S,TELEGRAM_POLL_TIMEOUT:()=>30,TELEGRAM_PROXY_BASE:()=>x,TRANSFORMERS_JS_PROXY_MODELS_URL:()=>O,TRANSFORMERS_JS_PROXY_URL:()=>D,buildTriggerPattern:()=>a,getAvailableProviders:()=>R,getDbName:()=>g,getDefaultProvider:()=>L,getGeneralAccountProviderCapabilities:()=>B,getModelMaxTokens:()=>c,getProvider:()=>I,getProviderApiKeyConfigKey:()=>z,getProviderTokenAuthScheme:()=>V});const i=`ShadowClaw`;function a(e){let t=e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`);return RegExp(`(^|\\s)@${t}\\b`,`i`)}a(i);const o=8192,s=[{pattern:`claude-fable-5`,maxTokens:128e3},{pattern:`claude-sonnet-5`,maxTokens:128e3},{pattern:`claude-opus-5`,maxTokens:128e3},{pattern:`claude-opus-4-8`,maxTokens:128e3},{pattern:`claude-opus-4`,maxTokens:128e3},{pattern:`claude-sonnet-4`,maxTokens:64e3},{pattern:`claude-haiku-4`,maxTokens:64e3},{pattern:`claude-3-5`,maxTokens:8192},{pattern:`claude-3`,maxTokens:4096},{pattern:`gpt-5`,maxTokens:128e3},{pattern:`gpt-4o`,maxTokens:16384},{pattern:`gpt-4.1`,maxTokens:32768},{pattern:`gpt-4-turbo`,maxTokens:4096},{pattern:`gpt-4`,maxTokens:8192},{pattern:`gpt-3.5`,maxTokens:4096},{pattern:`qwen-2.5`,maxTokens:32768},{pattern:`Qwen3.5`,maxTokens:32768},{pattern:`qwen3.5`,maxTokens:32768},{pattern:`Qwen3`,maxTokens:32768},{pattern:`qwen3`,maxTokens:32768},{pattern:`gemma-4`,maxTokens:16384},{pattern:`gemini-nano`,maxTokens:4096},{pattern:`phi-mini`,maxTokens:9216},{pattern:`aion`,maxTokens:9216},{pattern:`gemma-3-1b-it-ONNX-GQA`,maxTokens:32768},{pattern:`gemma-3-1b-it-ONNX`,maxTokens:32768},{pattern:`gemma-3`,maxTokens:32768},{pattern:`Qwen3-0.6B-ONNX`,maxTokens:32768},{pattern:`Qwen3.5`,maxTokens:32768},{pattern:`Llama-3.2`,maxTokens:32768},{pattern:`SmolLM`,maxTokens:8192},{pattern:`DeepSeek-R1`,maxTokens:32768},{pattern:`Phi-4`,maxTokens:16384},{pattern:`Phi-3.5`,maxTokens:16384},{pattern:`LFM2`,maxTokens:16384},{pattern:`gpt-oss`,maxTokens:32768},{pattern:`browser-built-in`,maxTokens:4096},{pattern:`mesh`,maxTokens:32768},{pattern:`openrouter/free`,maxTokens:32768},{pattern:`qwen3:8b`,maxTokens:4096},{pattern:`llama3:8b`,maxTokens:8192}];function c(e){if(!e)return o;let t=n.getModelInfo(e);if(t){if(typeof t.maxOutput==`number`){let e=t.contextWindow?Math.max(8192,Math.floor(t.contextWindow/2)):32768;return Math.min(t.maxOutput,e)}if(t.contextWindow){let e;return e=t.contextWindow>=2e5?131072:t.contextWindow>=1e5?65536:32768,Math.min(e,Math.floor(t.contextWindow/2))}}for(let{pattern:t,maxTokens:n}of s)if(e.includes(t))return n;return o}const l=`prompt_api`,u=6e4,d=102400,f=1800,p=`wss://relay.widgetry.org/`,m=`http://localhost:8888`,h=`shadowclaw`;function g(){let e=t();return e?`shadowclaw-${e}`:h}g();const _=`shadowclaw`,v=`shadowclaw`,y=`br:main`,b=`https://api.telegram.org/bot`,x=`/telegram/bot`,S=4096,C=15e3,w=`0.peerjs.com`,T=`http://localhost:8888/bedrock-proxy/invoke`,E=`http://localhost:8888/bedrock-proxy/models`,D=`http://localhost:8888/transformers-js-proxy/chat/completions`,O=`http://localhost:8888/transformers-js-proxy/models`,k=`http://localhost:8888/llamafile-proxy/chat/completions`,A=`http://localhost:8888/llamafile-proxy/models`,j=`http://localhost:8888/ollama-proxy/chat/completions`,M=`http://localhost:8888/ollama-proxy/models`,N={github:{providerId:`github`,name:`GitHub`,aliases:[`github`,`api.github.com`],modes:[`oauth`,`token`],defaultMode:`oauth`,serviceTypes:[`http_api`,`git_remote`],authTypes:[`token`,`oauth`],tokenAuth:{token:{headerName:`Authorization`,headerPrefix:`token `},oauth:{headerName:`Authorization`,headerPrefix:`Bearer `}},oauth:{authorizeUrl:`https://github.com/login/oauth/authorize`,tokenUrl:`https://github.com/login/oauth/access_token`,defaultScopes:[`repo`,`read:user`],usePkce:!0,clientAuthMethod:`request_body`,scopeSeparator:`space`}},gitlab:{providerId:`gitlab`,name:`GitLab`,aliases:[`gitlab`,`gitlab.com`],modes:[`oauth`,`token`],defaultMode:`oauth`,serviceTypes:[`http_api`,`git_remote`],authTypes:[`token`,`oauth`],tokenAuth:{token:{headerName:`PRIVATE-TOKEN`,headerPrefix:``},oauth:{headerName:`Authorization`,headerPrefix:`Bearer `}},tokenAuthByServiceType:{git_remote:{token:{headerName:`Authorization`,headerPrefix:`Bearer `},oauth:{headerName:`Authorization`,headerPrefix:`Bearer `}}},oauth:{authorizeUrl:`https://gitlab.com/oauth/authorize`,tokenUrl:`https://gitlab.com/oauth/token`,defaultScopes:[`read_api`,`read_user`],usePkce:!0,clientAuthMethod:`request_body`,scopeSeparator:`space`}},figma:{providerId:`figma`,name:`Figma`,aliases:[`figma`,`api.figma.com`],modes:[`oauth`,`token`],defaultMode:`oauth`,serviceTypes:[`http_api`],authTypes:[`token`,`oauth`],tokenAuth:{token:{headerName:`X-Figma-Token`,headerPrefix:``},oauth:{headerName:`Authorization`,headerPrefix:`Bearer `}},oauth:{authorizeUrl:`https://www.figma.com/oauth`,tokenUrl:`https://api.figma.com/v1/oauth/token`,refreshUrl:`https://api.figma.com/v1/oauth/refresh`,defaultScopes:[],usePkce:!0,clientAuthMethod:`basic_header`,scopeSeparator:`space`}},notion:{providerId:`notion`,name:`Notion`,aliases:[`notion`,`api.notion.com`,`notion.so`],modes:[`oauth`,`token`],defaultMode:`oauth`,serviceTypes:[`http_api`],authTypes:[`token`,`oauth`],tokenAuth:{token:{headerName:`Authorization`,headerPrefix:`Bearer `},oauth:{headerName:`Authorization`,headerPrefix:`Bearer `}},oauth:{authorizeUrl:`https://api.notion.com/v1/oauth/authorize`,tokenUrl:`https://api.notion.com/v1/oauth/token`,defaultScopes:[],usePkce:!0,clientAuthMethod:`basic_header`,scopeSeparator:`space`}},microsoft_graph:{providerId:`microsoft_graph`,name:`Microsoft Graph`,aliases:[`microsoft`,`graph.microsoft.com`,`microsoft_graph`],modes:[`oauth`,`token`],defaultMode:`oauth`,serviceTypes:[`http_api`],authTypes:[`token`,`oauth`],tokenAuth:{token:{headerName:`Authorization`,headerPrefix:`Bearer `},oauth:{headerName:`Authorization`,headerPrefix:`Bearer `}},oauth:{authorizeUrl:`https://login.microsoftonline.com/common/oauth2/v2.0/authorize`,tokenUrl:`https://login.microsoftonline.com/common/oauth2/v2.0/token`,defaultScopes:[`openid`,`profile`,`offline_access`,`User.Read`],usePkce:!0,clientAuthMethod:`request_body`,scopeSeparator:`space`}},yahoo_mail:{providerId:`yahoo_mail`,name:`Yahoo Mail`,aliases:[`yahoo`,`yahoo_mail`,`mail.yahoo.com`],modes:[`oauth`,`token`],defaultMode:`oauth`,serviceTypes:[`http_api`],authTypes:[`token`,`oauth`],tokenAuth:{token:{headerName:`Authorization`,headerPrefix:`Bearer `},oauth:{headerName:`Authorization`,headerPrefix:`Bearer `}},oauth:{authorizeUrl:`https://api.login.yahoo.com/oauth2/request_auth`,tokenUrl:`https://api.login.yahoo.com/oauth2/get_token`,defaultScopes:[`mail-r`,`mail-w`],usePkce:!0,clientAuthMethod:`request_body`,scopeSeparator:`space`}},google:{providerId:`google`,name:`Google`,aliases:[`google`,`googleapis.com`],modes:[`oauth`,`token`],defaultMode:`oauth`,serviceTypes:[`http_api`],authTypes:[`token`,`oauth`],tokenAuth:{token:{headerName:`Authorization`,headerPrefix:`Bearer `},oauth:{headerName:`Authorization`,headerPrefix:`Bearer `}},oauth:{authorizeUrl:`https://accounts.google.com/o/oauth2/v2/auth`,tokenUrl:`https://oauth2.googleapis.com/token`,defaultScopes:[`openid`,`profile`,`email`],usePkce:!0,clientAuthMethod:`request_body`,scopeSeparator:`space`}},atlassian:{providerId:`atlassian`,name:`Atlassian`,aliases:[`atlassian`,`api.atlassian.com`],modes:[`oauth`,`token`,`basic`],defaultMode:`basic`,serviceTypes:[`http_api`,`git_remote`],authTypes:[`token`,`oauth`,`basic_userpass`],tokenAuth:{token:{headerName:`Authorization`,headerPrefix:`Bearer `},oauth:{headerName:`Authorization`,headerPrefix:`Bearer `},basic:{headerName:`Authorization`,headerPrefix:`Basic `}},oauth:{authorizeUrl:`https://auth.atlassian.com/authorize`,tokenUrl:`https://auth.atlassian.com/oauth/token`,defaultScopes:[],usePkce:!0,clientAuthMethod:`request_body`,scopeSeparator:`space`}},slack:{providerId:`slack`,name:`Slack`,aliases:[`slack`,`slack.com`],modes:[`oauth`,`token`],defaultMode:`oauth`,serviceTypes:[`http_api`],authTypes:[`token`,`oauth`],tokenAuth:{token:{headerName:`Authorization`,headerPrefix:`Bearer `},oauth:{headerName:`Authorization`,headerPrefix:`Bearer `}},oauth:{authorizeUrl:`https://slack.com/oauth/v2/authorize`,tokenUrl:`https://slack.com/api/oauth.v2.access`,defaultScopes:[],usePkce:!1,clientAuthMethod:`request_body`,scopeSeparator:`comma`}},linear:{providerId:`linear`,name:`Linear`,aliases:[`linear`,`api.linear.app`,`linear.app`],modes:[`oauth`,`token`],defaultMode:`oauth`,serviceTypes:[`http_api`],authTypes:[`token`,`oauth`],tokenAuth:{token:{headerName:`Authorization`,headerPrefix:`Bearer `},oauth:{headerName:`Authorization`,headerPrefix:`Bearer `}},oauth:{authorizeUrl:`https://linear.app/oauth/authorize`,tokenUrl:`https://api.linear.app/oauth/token`,defaultScopes:[],usePkce:!0,clientAuthMethod:`request_body`,scopeSeparator:`space`}},azure_devops:{providerId:`azure_devops`,name:`Azure DevOps`,aliases:[`azure_devops`,`dev.azure.com`],modes:[`oauth`,`token`],defaultMode:`oauth`,serviceTypes:[`http_api`,`git_remote`],authTypes:[`token`,`oauth`,`basic_userpass`,`ssh_key`],tokenAuth:{token:{headerName:`Authorization`,headerPrefix:`Bearer `},oauth:{headerName:`Authorization`,headerPrefix:`Bearer `}},tokenAuthByServiceType:{git_remote:{token:{headerName:`Authorization`,headerPrefix:`Basic `},oauth:{headerName:`Authorization`,headerPrefix:`Basic `}}},oauth:{authorizeUrl:`https://app.vssps.visualstudio.com/oauth2/authorize`,tokenUrl:`https://app.vssps.visualstudio.com/oauth2/token`,defaultScopes:[`vso.code`,`vso.profile`,`offline_access`],usePkce:!1,clientAuthMethod:`request_body`,scopeSeparator:`space`}},custom_mcp:{providerId:`custom_mcp`,name:`Custom MCP`,aliases:[`custom_mcp`],modes:[`oauth`,`token`],defaultMode:`oauth`,serviceTypes:[`mcp_remote`,`webmcp_local`],authTypes:[`none`,`token`,`oauth`,`custom_header`,`ssh_key`],tokenAuth:{token:{headerName:`Authorization`,headerPrefix:`Bearer `},oauth:{headerName:`Authorization`,headerPrefix:`Bearer `}},oauth:{authorizeUrl:`https://example.com/oauth/authorize`,tokenUrl:`https://example.com/oauth/token`,defaultScopes:[],usePkce:!0,clientAuthMethod:`request_body`,scopeSeparator:`space`}}},P=Object.fromEntries(Object.values(N).filter(e=>!!e.oauth).map(e=>{let t=e.oauth;return[e.providerId,{id:e.providerId,name:e.name,authorizeUrl:t.authorizeUrl,tokenUrl:t.tokenUrl,redirectUri:t.redirectUri,defaultScopes:t.defaultScopes,usePkce:t.usePkce,clientAuthMethod:t.clientAuthMethod,scopeSeparator:t.scopeSeparator}]}));Object.fromEntries(Object.values(N).map(e=>[e.providerId,{providerId:e.providerId,modes:e.modes,defaultMode:e.defaultMode}]));const F={openrouter:{id:`openrouter`,name:`OpenRouter`,baseUrl:`https://openrouter.ai/api/v1/chat/completions`,format:`openai`,apiKeyHeader:`Authorization`,apiKeyHeaderFormat:`Bearer {key}`,headers:{"HTTP-Referer":`https://xt-ml.github.io/shadow-claw/`,"X-OpenRouter-Title":`ShadowClaw`},defaultModel:`openrouter/free`,modelsUrl:`https://openrouter.ai/api/v1/models`,requiresApiKey:!0,supportsStreaming:!0,reasoningParam:`reasoning`},huggingface:{id:`huggingface`,name:`HuggingFace`,baseUrl:`https://router.huggingface.co/v1/chat/completions`,format:`openai`,apiKeyHeader:`Authorization`,apiKeyHeaderFormat:`Bearer {key}`,headers:{},defaultModel:`meta-llama/Llama-3.1-8B-Instruct`,modelsUrl:`https://router.huggingface.co/v1/models`,requiresApiKey:!0,supportsStreaming:!0},bedrock_proxy:{id:`bedrock_proxy`,name:`AWS Bedrock (Local Proxy)`,baseUrl:T,format:`anthropic`,apiKeyHeader:`Authorization`,headers:{},defaultModel:`anthropic.claude-sonnet-4-6-v1:0`,modelsUrl:E,requiresApiKey:!1,supportsStreaming:!0,reasoningParam:`thinking`},gemini_proxy:{id:`gemini_proxy`,name:`Gemini (Local Proxy)`,baseUrl:`http://localhost:8888/gemini-proxy/chat/completions`,format:`openai`,apiKeyHeader:`x-goog-api-key`,headers:{},defaultModel:`gemini-2.0-flash`,modelsUrl:`http://localhost:8888/gemini-proxy/models`,requiresApiKey:!0,supportsStreaming:!0,reasoningParam:`thinkingConfig`},vertex_ai:{id:`vertex_ai`,name:`Vertex AI (Local Proxy)`,baseUrl:`http://localhost:8888/vertex-ai-proxy/chat/completions`,format:`openai`,apiKeyHeader:`x-vertex-project`,headers:{},defaultModel:`gemini-2.5-flash`,modelsUrl:`http://localhost:8888/vertex-ai-proxy/models`,requiresApiKey:!0,supportsStreaming:!0,reasoningParam:`thinkingConfig`},"mesh-llm":{id:`mesh-llm`,name:`Mesh LLM (Local Proxy)`,baseUrl:`http://localhost:8888/mesh-llm-proxy/chat/completions`,format:`mesh-llm`,apiKeyHeader:`Authorization`,headers:{},defaultModel:`mesh`,modelsUrl:`http://localhost:8888/mesh-llm-proxy/models`,requiresApiKey:!1,supportsStreaming:!0},ollama:{id:`ollama`,name:`Ollama (Local Proxy)`,baseUrl:j,format:`openai`,apiKeyHeader:`Authorization`,headers:{},defaultModel:`qwen3:8b`,modelsUrl:M,requiresApiKey:!1,supportsStreaming:!0},llamafile:{id:`llamafile`,name:`Llamafile (Local Proxy)`,baseUrl:k,format:`openai`,apiKeyHeader:`Authorization`,headers:{},defaultModel:`Qwen3.5-9B-Q5_K_S`,modelsUrl:A,requiresApiKey:!1,supportsStreaming:!0},transformers_js_local:{id:`transformers_js_local`,name:`Transformers.js (Local Proxy)`,baseUrl:D,format:`openai`,apiKeyHeader:`Authorization`,headers:{},defaultModel:`onnx-community/Qwen3-0.6B-ONNX`,modelsUrl:O,models:[`onnx-community/DeepSeek-R1-Distill-Qwen-1.5B-ONNX`,`onnx-community/gemma-3-1b-it-ONNX-GQA`,`onnx-community/gemma-3-1b-it-ONNX`,`onnx-community/gemma-4-E2B-it-ONNX`,`onnx-community/gemma-4-E2B-it-qat-mobile-ONNX`,`onnx-community/gemma-4-E4B-it-ONNX`,`onnx-community/gemma-4-E4B-it-qat-mobile-ONNX`,`onnx-community/gemma-4-E9B-it-ONNX`,`onnx-community/gemma-4-12B-it-ONNX`,`onnx-community/gemma-4-12B-it-qat-mobile-ONNX`,`onnx-community/gemma-4-E27B-it-ONNX`,`onnx-community/gpt-oss-20b-ONNX`,`onnx-community/LFM2-1.2B-ONNX`,`onnx-community/Llama-3.2-1B-Instruct-ONNX`,`onnx-community/Llama-3.2-3B-Instruct-ONNX`,`onnx-community/Phi-3.5-mini-instruct-onnx-web`,`onnx-community/Phi-4-mini-instruct-ONNX`,`onnx-community/Qwen3-0.6B-ONNX`,`onnx-community/Qwen3.5-0.8B-ONNX-OPT`,`onnx-community/Qwen3.5-4B-ONNX-OPT`,`HuggingFaceTB/SmolLM3-3B-ONNX`,`LiquidAI/LFM2.5-1.2B-Thinking-ONNX`,`webgpu/Qwen3-4B-ONNX`],requiresApiKey:!1,supportsStreaming:!0},transformers_js_browser:{id:`transformers_js_browser`,name:`Transformers.js (Browser)`,baseUrl:`local://transformers-js`,format:`transformers_js`,apiKeyHeader:`Authorization`,headers:{},defaultModel:`onnx-community/Qwen3-0.6B-ONNX`,modelsUrl:`https://huggingface.co/api/models?author=onnx-community`,models:[`onnx-community/Qwen3-0.6B-ONNX`,`onnx-community/gemma-3-1b-it-ONNX`,`onnx-community/gemma-3-1b-it-ONNX-GQA`,`onnx-community/gemma-4-E2B-it-ONNX`,`onnx-community/gemma-4-E4B-it-ONNX`,`onnx-community/gemma-4-E9B-it-ONNX`,`onnx-community/gemma-4-E27B-it-ONNX`,`onnx-community/gemma-4-12B-it-ONNX`,`onnx-community/gemma-4-E2B-it-qat-mobile-ONNX`,`onnx-community/gemma-4-E4B-it-qat-mobile-ONNX`,`onnx-community/gemma-4-12B-it-qat-mobile-ONNX`,`onnx-community/Phi-3.5-mini-instruct-onnx-web`,`onnx-community/Phi-4-mini-instruct-ONNX`,`onnx-community/Llama-3.2-1B-Instruct-ONNX`,`onnx-community/Llama-3.2-3B-Instruct-ONNX`,`webgpu/Qwen3-4B-ONNX`,`onnx-community/DeepSeek-R1-Distill-Qwen-1.5B-ONNX`,`onnx-community/gpt-oss-20b-ONNX`,`onnx-community/LFM2-1.2B-ONNX`,`LiquidAI/LFM2.5-1.2B-Thinking-ONNX`,`HuggingFaceTB/SmolLM3-3B-ONNX`,`onnx-community/Qwen3.5-0.8B-ONNX-OPT`,`onnx-community/Qwen3.5-4B-ONNX-OPT`],requiresApiKey:!1,supportsStreaming:!1},litert_lm_browser:{id:`litert_lm_browser`,name:`LiteRT-LM (Browser)`,baseUrl:`local://litert-lm`,format:`transformers_js`,apiKeyHeader:`Authorization`,headers:{},defaultModel:`litert-community/gemma-4-E2B-it-litert-lm`,models:[`litert-community/gemma-4-E2B-it-litert-lm`,`litert-community/gemma-4-E4B-it-litert-lm`],requiresApiKey:!1,supportsStreaming:!1},prompt_api:{id:`prompt_api`,name:`Prompt API (Browser)`,baseUrl:`builtin://language-model`,format:`prompt_api`,apiKeyHeader:`Authorization`,headers:{},defaultModel:`browser-built-in`,models:[`browser-built-in`],requiresApiKey:!1,supportsStreaming:!1}};function I(e){return F[e]||null}function L(){return F[l]}function R(){return Object.keys(F)}function z(e){return`api_key:${e}`}function B(e){return N[e]||null}function V(e,t,n=`http_api`){let r=B(e);return r&&(r.tokenAuthByServiceType?.[n]?.[t]||r.tokenAuth[t])||null}const H={ACTIVE_TOOL_PROFILE:`active_tool_profile`,ACTIVITY_LOG_DISK_LOGGING_ENABLED:`activity_log_disk_logging_enabled`,ALLOWED_CUSTOM_ELEMENTS:`allowed_custom_elements`,ALLOWED_CUSTOM_ELEMENT_HOST_PATTERNS:`allowed_custom_element_host_patterns`,ALLOWED_IFRAME_HOST_PATTERNS:`allowed_iframe_host_patterns`,API_KEY:`api_key`,ASSISTANT_NAME:`assistant_name`,BEDROCK_AUTH_MODE:`bedrock_auth_mode`,BEDROCK_PROFILE_FALLBACK:`bedrock_profile_fallback`,BEDROCK_REGION_FALLBACK:`bedrock_region_fallback`,BUILTIN_AI_SUBAGENT_ROUTING:`builtin_ai_subagent_routing`,BUILTIN_AI_TOOLS_BACKEND:`builtin_ai_tools_backend`,CHANNEL_ENABLED_PREFIX:`channel_enabled:`,CHAT_INPUT_AREA_HEIGHT:`chat_input_area_height`,CHAT_SPLIT_VIEW_ENABLED:`chat_split_view_enabled`,CHAT_SPLIT_VIEW_HEIGHT:`chat_split_view_height`,COMPACTION_ENGINE_PREFERENCE:`compaction_engine_preference`,CONTEXT_COMPRESSION_ENABLED:`context_compression_enabled`,CONVERSATIONS_HEIGHT:`conversations_height`,CUSTOM_TOOLS:`custom_tools`,DB_MIGRATED_FROM_LEGACY:`db_migrated_from_legacy`,DECLARATIVE_TOOLS_ENABLED:`declarative_tools_enabled`,DEFAULT_PINNED_PAGE:`default_pinned_page`,DIRECT_TOOL_COMMAND_POLICY:`direct_tool_command_policy`,ENABLED_TOOLS:`enabled_tools`,FILES_UPLOAD_APPEND_ULID:`files_upload_append_ulid`,GIT_ACCOUNTS:`git_accounts`,GIT_AUTHOR_EMAIL:`git_author_email`,GIT_AUTHOR_NAME:`git_author_name`,GIT_CORS_PROXY:`git_cors_proxy`,GIT_DEFAULT_ACCOUNT:`git_default_account`,GIT_PASSWORD:`git_password`,GIT_PROXY_URL:`git_proxy_url`,GIT_TOKEN:`git_token`,GIT_USERNAME:`git_username`,IMESSAGE_API_KEY:`imessage_api_key`,IMESSAGE_CHAT_IDS:`imessage_chat_ids`,IMESSAGE_SERVER_URL:`imessage_server_url`,INTEGRATION_CONNECTIONS:`integration_connections`,MARKDOWN_FRONTMATTER_CHAT:`markdown_frontmatter_chat`,MARKDOWN_FRONTMATTER_FILE_VIEWER:`markdown_frontmatter_file_viewer`,MARKDOWN_FRONTMATTER_PAGES:`markdown_frontmatter_pages`,MARKDOWN_FRONTMATTER_TASKS:`markdown_frontmatter_tasks`,LAST_ACTIVE_GROUP:`last_active_group`,LAST_ACTIVE_PAGE:`last_active_page`,LAST_SELECTED_PINNED_PAGE:`last_selected_pinned_page`,LLAMAFILE_HOST:`llamafile_host`,LLAMAFILE_MODE:`llamafile_mode`,LLAMAFILE_OFFLINE:`llamafile_offline`,LLAMAFILE_PORT:`llamafile_port`,MAIN_GROUP_INDEX_SUPPRESSED:`main_group_index_suppressed`,MAIN_GROUP_README_SUPPRESSED:`main_group_readme_suppressed`,MAX_ITERATIONS:`max_iterations`,MAX_TOKENS:`max_tokens`,MESH_LLM_HOST:`mesh_llm_host`,MODEL:`model`,OAUTH_PROVIDER_DEFINITIONS:`oauth_provider_definitions`,OPFS_MIGRATED_FROM_LEGACY:`opfs_migrated_from_legacy`,OVERRIDE_PRERENDER_SKELETON:`override_prerender_skeleton`,PAGES_AUTO_REFRESH_INTERVAL:`pages_auto_refresh_interval`,PAGES_LIST:`pages_list`,PASSPHRASE_SALT:`passphrase_salt`,PASSPHRASE_VERIFY:`passphrase_verify`,PROMPT_API_BACKEND:`prompt_api_backend`,PROMPT_API_DTYPE_STRATEGY:`prompt_api_dtype_strategy`,PROMPT_API_FALLBACK_MODEL:`prompt_api_fallback_model`,PROMPT_API_ONBOARDING_SEEN:`prompt_api_onboarding_seen`,PEERJS_MY_ALIAS:`peerjs_my_alias`,PEERJS_MY_PEER_ID:`peerjs_my_peer_id`,PEERJS_PEER_ALIASES:`peerjs_peer_aliases`,PEERJS_SERVER_HOST:`peerjs_server_host`,PEERJS_SERVER_PATH:`peerjs_server_path`,PEERJS_SERVER_PORT:`peerjs_server_port`,PEERJS_SERVER_SECURE:`peerjs_server_secure`,PEERJS_TRUSTED_PEER_IDS:`peerjs_trusted_peer_ids`,PROVIDER:`provider`,PROXY_URL:`proxy_url`,PUSH_PROXY_URL:`push_proxy_url`,RATE_LIMIT_AUTO_ADAPT:`rate_limit_auto_adapt`,RATE_LIMIT_CALLS_PER_MINUTE:`rate_limit_calls_per_minute`,REASONING_EFFORT:`reasoning_effort`,REMOTE_MCP_CONNECTIONS:`remote_mcp_connections`,SERVICE_ACCOUNTS:`service_accounts`,SERVICE_DEFAULT_ACCOUNT:`service_default_account`,SIDEBAR_CHAT_HIDDEN:`sidebar_chat_hidden`,SIDEBAR_DEFAULT_PAGE:`sidebar_default_page`,SIDEBAR_FILES_HIDDEN:`sidebar_files_hidden`,SIDEBAR_PAGES_HIDDEN:`sidebar_pages_hidden`,SIDEBAR_TASKS_HIDDEN:`sidebar_tasks_hidden`,SIDEBAR_WIDTH:`sidebar_width`,SITE_CONFIG_SEEDED:`site_config_seeded`,STATIC_MAIN_SITE_SEEDED:`static_main_site_seeded`,STORAGE_HANDLE:`storage_handle`,SUBSCRIBER_ID:`subscriber_id`,STREAMING_ENABLED:`streaming_enabled`,SUBAGENT_MAX_PARALLEL:`subagent_max_parallel`,SUBAGENT_WORKSPACE_MODE:`subagent_workspace_mode`,SUPPRESSED_PAGES_LIST:`suppressed_pages_list`,SYSTEM_PROMPT_OVERRIDE:`system_prompt_override`,TASK_SERVER_ENABLED:`task_server_enabled`,TASK_SERVER_URL:`task_server_url`,TASK_SYNC_OUTBOX:`task_sync_outbox`,TELEGRAM_BOT_TOKEN:`telegram_bot_token`,TELEGRAM_CHAT_IDS:`telegram_chat_ids`,TELEGRAM_USE_PROXY:`telegram_use_proxy`,TOOL_PROFILES:`tool_profiles`,TRANSFORMERS_JS_BACKEND:`transformers_js_backend`,TRANSFORMERS_JS_DTYPE_STRATEGY:`transformers_js_dtype_strategy`,TRIGGER_PATTERN:`trigger_pattern`,USE_PROXY:`use_proxy`,VAPID_SUBJECT:`vapid_subject`,VM_BASH_FULL_INTERNET_ACCESS:`vm_bash_full_internet_access`,VM_BASH_TIMEOUT_SEC:`vm_bash_timeout_sec`,VM_BOOT_HOST:`vm_boot_host`,VM_BOOT_MODE:`vm_boot_mode`,VM_NETWORK_RELAY_URL:`vm_network_relay_url`,WEBMCP_MODE:`webmcp_mode`,WEBMCP_TOOLS_ENABLED:`webmcp_tools_enabled`,WEB_SEARCH_PROXY_URL:`web_search_proxy_url`,WEB_SEARCH_URL:`web_search_url`,WEB_SEARCH_USE_PROXY:`web_search_use_proxy`,SEARCH_FILES_MAX_FILE_BYTES:`search_files_max_file_bytes`,SEARCH_FILES_MAX_FILES_VISITED:`search_files_max_files_visited`,SEARCH_FILES_SKIP_DIRS:`search_files_skip_dirs`},U=`localhost`,W=8888,G=`automatic`,K=`onnx-community/Qwen3-0.6B-ONNX`,q=`http://localhost:8888/schedule`;export{R as A,F as C,x as D,S as E,I as F,z as I,V as L,L as M,B as N,a as O,c as P,n as R,w as S,b as T,h as _,W as a,P as b,K as c,q as d,m as f,C as g,N as h,U as i,g as j,r as k,l,d as m,f as n,y as o,p,H as r,o as s,i as t,G as u,_ as v,u as w,v as x,k as y};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as e}from"./config-
|
|
1
|
+
import{r as e}from"./config-BYAuxx3j.js";import{Ct as t,ht as n}from"./orchestrator-DRfEudXk.js";import{t as r}from"./setConfig-DFMYnYLE.js";async function i(i,a,o,s,c=``,l=0,u=``,d=!0){let f=o.trim(),p=t(s),m=c.trim(),h=Number.isFinite(l)?Math.max(0,Math.floor(l)):0,g=u.trim(),_=!!d;i.peerjsMyPeerId=f,i.peerjsTrustedPeerIds=p,i.peerjsServerHost=m,i.peerjsServerPort=h,i.peerjsServerPath=g,i.peerjsServerSecure=_,await r(a,e.PEERJS_MY_PEER_ID,f),await r(a,e.PEERJS_TRUSTED_PEER_IDS,JSON.stringify(p)),await r(a,e.PEERJS_SERVER_HOST,m),await r(a,e.PEERJS_SERVER_PORT,h?String(h):``),await r(a,e.PEERJS_SERVER_PATH,g),await r(a,e.PEERJS_SERVER_SECURE,_?`true`:`false`);let v=m?{host:m,path:g||void 0,port:h||void 0,secure:_}:{};i.peerjs.stop(),i.peerjs.configure(f,p,v),f&&n(i,`peerjs`)&&i.peerjs.start()}export{i as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as e}from"./config-
|
|
1
|
+
import{r as e}from"./config-BYAuxx3j.js";import{t}from"./getConfig-D89uJgo5.js";import{t as n}from"./setConfig-DFMYnYLE.js";import{t as r}from"./ulid-BY7rQVLN.js";const i=[{id:`imap`,name:`IMAP Mail`,protocol:`imap`,description:`Read mailboxes and fetch message metadata/content.`,version:`0.1.0`,actions:[`messages.read`,`messages.send`],authTypes:[`basic_userpass`,`oauth`],serviceTypes:[`http_api`],configurableFields:[`host`,`port`,`secure`,`mailboxPath`,`smtpHost`,`smtpPort`,`smtpSecure`,`fromAddress`,`executionMode`,`pollIntervalSec`]}];function a(){return[...i].sort((e,t)=>e.id.localeCompare(t.id))}function o(e){return e&&i.find(t=>t.id===e)||null}function s(e){if(!e||typeof e!=`object`)return null;let t=e;return!t.serviceType||!t.authType?null:{serviceType:t.serviceType,authType:t.authType,providerId:t.providerId||void 0,accountId:t.accountId||void 0,username:t.username||void 0,headerName:t.headerName||void 0,encryptedSecret:t.encryptedSecret||void 0}}function c(e){if(!e||typeof e!=`object`)return null;let t=e;return!t.id||!t.label||!t.pluginId||typeof t.enabled!=`boolean`||typeof t.createdAt!=`number`||typeof t.updatedAt!=`number`||!o(t.pluginId)?null:{id:t.id,label:t.label,pluginId:t.pluginId,enabled:t.enabled,config:t.config&&typeof t.config==`object`?{...t.config}:{},credentialRef:s(t.credentialRef),createdAt:t.createdAt,updatedAt:t.updatedAt}}async function l(n){let r=await t(n,e.INTEGRATION_CONNECTIONS);if(!Array.isArray(r))return[];let i=[];for(let e of r){let t=c(e);t&&i.push(t)}return i}async function u(t,r){await n(t,e.INTEGRATION_CONNECTIONS,r)}async function d(e){return l(e)}async function f(e,t){if(!t)return null;let n=await l(e);return n.find(e=>e.id===t)||n.find(e=>e.label.toLowerCase()===t.toLowerCase())||null}async function p(e,t){if(!t.label?.trim())throw Error(`Email connection label is required`);let n=o(t.pluginId);if(!n)throw Error(`Unknown email plugin: ${t.pluginId}`);let i=await l(e),a=Date.now();if(t.id){let r=i.findIndex(e=>e.id===t.id);if(r!==-1){let o=i[r],s={...o,label:t.label.trim(),pluginId:n.id,enabled:t.enabled??o.enabled,config:t.config?{...t.config}:o.config,updatedAt:a};return i[r]=s,await u(e,i),s}}let s={id:t.id||r(),label:t.label.trim(),pluginId:n.id,enabled:t.enabled??!0,config:t.config?{...t.config}:{},credentialRef:null,createdAt:a,updatedAt:a};return i.push(s),await u(e,i),s}async function m(e,t,n){if(!t)return null;let r=await l(e),i=r.findIndex(e=>e.id===t);if(i===-1)return null;let a={...r[i],credentialRef:n?s(n):null,updatedAt:Date.now()};return r[i]=a,await u(e,r),a}async function h(e,t){if(!t)return!1;let n=await l(e),r=n.filter(e=>e.id!==t);return r.length===n.length?!1:(await u(e,r),!0)}export{p as a,d as i,h as n,o,f as r,a as s,m as t};
|
package/dist/public/{custom-element-security-CZ92anB8.js → custom-element-security-DdYlUozq.js}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as e}from"./config-
|
|
1
|
+
import{r as e}from"./config-BYAuxx3j.js";import{c as t}from"./app-routes-Bs-riIvr.js";import{n}from"./txPromise-EBECky1b.js";import{t as r}from"./getConfig-D89uJgo5.js";import{i,n as a,t as o}from"./iframe-sanitizer-0NS4XLOd.js";function s(e=new Date){let t=e=>String(e).padStart(2,`0`);return`${e.getFullYear()}-${t(e.getMonth()+1)}-${t(e.getDate())}_${t(e.getHours())}-${t(e.getMinutes())}-${t(e.getSeconds())}`}function c(e){let t=new Date(e);return new Intl.DateTimeFormat(`en-US`,{weekday:`short`,month:`short`,day:`numeric`,hour:`numeric`,minute:`2-digit`,hour12:!0}).format(t)}function l(e){let t=document.createElement(`div`);return t.textContent=e,t.innerHTML}function u(e=``,t={}){return o(),ie(),a().sanitize(e,{ADD_TAGS:[`iframe`,`figure`,`figcaption`],ADD_ATTR:[`allow`,`allowfullscreen`,`frameborder`,`scrolling`,`referrerpolicy`,`loading`],CUSTOM_ELEMENT_HANDLING:{tagNameCheck:e=>M(e),attributeNameCheck:()=>!0,allowCustomizedBuiltInElements:!1},...t})}function d(e,n=``,r){let i=e.trim();if(!i)return!1;let a=i.indexOf(`?`);if(a!==-1&&(i=i.slice(0,a+1)+i.slice(a+1).replace(/\?/g,`&`)),i.startsWith(`/#`)||i.startsWith(`#`)){let e=(i.startsWith(`/#`)?i.slice(2):i.slice(1)).split(/[?#]/,1)[0].toLowerCase();if([`chat`,`files`,`tasks`,`pages`,`settings`].includes(e)){let t=i.startsWith(`/#`)?i.replace(/^\/#/,`http://local/`):i.replace(/^#/,`http://local/`),n=new URL(t,`http://local/`),a=n.searchParams.get(`groupId`)||n.searchParams.get(`conversationId`)||r,o=n.searchParams.get(`file`)||n.searchParams.get(`path`)||void 0,s=n.searchParams.get(`anchor`)||(n.hash?n.hash.slice(1):void 0),c={page:e,groupId:a||void 0,path:o||void 0,anchor:s||void 0};return document.dispatchEvent(new CustomEvent(`shadow-claw-navigate`,{detail:c,bubbles:!0,composed:!0})),!0}}if(i.startsWith(`/`))try{let e=new URL(i,window.location.origin),n=t(e,r);if(n)return document.dispatchEvent(new CustomEvent(`shadow-claw-navigate`,{detail:{page:n.page,groupId:n.groupId,path:n.path,anchor:n.anchor||(e.hash?e.hash.slice(1):void 0)},bubbles:!0,composed:!0})),!0}catch{}if(!/^[a-zA-Z][a-zA-Z\d+.-]*:/.test(i)&&!i.startsWith(`//`)&&!i.startsWith(`javascript:`)){let e=i.split(/[?#]/,1)[0].replace(/\\/g,`/`),t=e.startsWith(`/`);e=e.replace(/^\/+/,``);let a=new URL(i,`http://local/`),o=a.hash?a.hash.slice(1):void 0,s=e;if(!t&&n){let t=n.replace(/\\/g,`/`).replace(/^\/+/,``).split(`/`).filter(Boolean);t.pop();let r=e.split(`/`),i=[...t];for(let e of r)!e||e===`.`||(e===`..`?i.pop():i.push(e));s=i.join(`/`)}if(s){let e={page:`files`,groupId:r||void 0,path:s,anchor:o||void 0};return document.dispatchEvent(new CustomEvent(`shadow-claw-navigate`,{detail:e,bubbles:!0,composed:!0})),!0}}return!1}const f=`shadowclaw`;let p;function m(){let e=globalThis.trustedTypes;return!e||typeof e.createPolicy!=`function`?null:e}function h(){if(p!==void 0)return p;let e=m();if(!e)return p=null,p;if(typeof e.getPolicy==`function`){let t=e.getPolicy(f);if(t)return p=t,p}try{p=e.createPolicy(f,{createHTML:e=>e,createScriptURL:e=>e})}catch{p=typeof e.getPolicy==`function`?e.getPolicy(f)??null:null}return p}function g(e=``,t={}){let n=u(e,t),r=h();return r?r.createHTML(n):n}function _(e,t={}){return u(e,t)}function v(e){let t=h();return t?t.createHTML(e):e}function y(e,t=``,n={}){let r=g(t,n);return e.innerHTML=r,r}function ee(e,t){let n=v(t);return e.srcdoc=n,n}function b(e){let t=h();return!t||typeof t.createScriptURL!=`function`?e:t.createScriptURL(e)}const x=[],S=[];let C=new Set(x.map(e=>e.toLowerCase().trim())),w=[...S],T=[];function E(e){T=e.map(e=>i(e)).filter(Boolean)}E(w);function D(e){return Array.isArray(e)?e.map(e=>typeof e==`string`?e.toLowerCase().trim():``).filter(Boolean):typeof e==`string`?e.split(/[\n,]+/).map(e=>e.toLowerCase().trim()).filter(Boolean):[]}function O(e){return Array.isArray(e)?e.map(e=>typeof e==`string`?e.trim():``).filter(Boolean):typeof e==`string`?e.split(/[\n,]+/).map(e=>e.trim()).filter(Boolean):[]}function k(e){let t=D(e);C=new Set(t)}function A(e){let t=O(e);w=t,E(t)}function j(){return[...w]}function M(e){if(!e||typeof e!=`string`)return!1;let t=e.trim().toLowerCase();return!t.includes(`-`)||t===`shadow-claw`||t.startsWith(`shadow-claw-`)?!0:C.has(t)}function te(e){if(!e||typeof e!=`string`)return!1;let t=e.trim();if(!t||/^(?:javascript|data|vbscript):/i.test(t))return!1;if(/^blob:/i.test(t))return!0;try{let e=typeof window<`u`&&window.location?.origin&&window.location.origin!==`null`?window.location.origin:`http://localhost`,n=new URL(t,e);if(n.protocol!==`http:`&&n.protocol!==`https:`)return!1;if(typeof window<`u`&&window.location?.origin&&window.location.origin!==`null`&&n.origin===window.location.origin)return!0;let r=n.hostname.toLowerCase();return T.some(e=>e(r))}catch{return!1}}const N=`allow-modals allow-scripts allow-popups allow-popups-to-escape-sandbox`,P=[`'self'`,`blob:`,`data:`],F=[`'self'`,`blob:`,`data:`],I=[`'self'`,`'unsafe-inline'`,`https:`,`http:`],L=[`'self'`,`blob:`,`data:`,`https:`,`http:`];let R=N,z=[...P],B=[...F],V=[],H=[...I],U=[...L];function W(){return R}function G(e){R=Array.isArray(e)?e.map(e=>typeof e==`string`?e.trim():``).filter(Boolean).join(` `):typeof e==`string`&&e.trim()?e.trim():N}function K(e){let t=j(),n=Y(),r=new Set;for(let e of t)e&&/^(\*\.)?[a-zA-Z0-9.-]+(?::[0-9]+)?$/.test(e)&&(r.add(`https://${e}`),r.add(`http://${e}`));for(let e of n)try{let t=new URL(e,typeof window<`u`&&window.location?.origin?window.location.origin:`http://localhost`);r.add(t.origin)}catch{}let i=[`'nonce-${e}'`,...Array.from(r),...V],a=[...B,...Array.from(r)];return[`script-src ${Array.from(new Set(i)).join(` `)}`,`worker-src ${Array.from(new Set(z)).join(` `)}`,`connect-src ${Array.from(new Set(a)).join(` `)}`,`style-src ${Array.from(new Set(H)).join(` `)}`,`img-src ${Array.from(new Set(U)).join(` `)}`].join(`; `)}function q(e){if(!e||typeof e!=`object`)return;let t=e.allowedCustomElements||(typeof e.customElements==`object`&&!Array.isArray(e.customElements)?e.customElements?.allowedElements:void 0);t!==void 0&&k(t);let n=e.allowedCustomElementDomains||(typeof e.customElements==`object`&&!Array.isArray(e.customElements)?e.customElements?.allowedDomains:void 0);n!==void 0&&A(n),e.security?.iframeSandbox===void 0?(e.security?.allowSameOrigin===!0||e.security?.allowIframeSameOrigin===!0)&&(R.includes(`allow-same-origin`)||(R=`${R} allow-same-origin`.trim())):G(e.security.iframeSandbox),e.security?.workerSrc!==void 0&&(z=O(e.security.workerSrc)),e.security?.connectSrc!==void 0&&(B=O(e.security.connectSrc)),e.security?.scriptSrc!==void 0&&(V=O(e.security.scriptSrc)),e.security?.styleSrc!==void 0&&(H=O(e.security.styleSrc)),e.security?.imgSrc!==void 0&&(U=O(e.security.imgSrc))}function J(){if(typeof document>`u`)return;let e=document.getElementById(`shadow-claw-site-config`);if(e&&e.textContent)try{q(JSON.parse(e.textContent))}catch{}}function Y(){if(typeof document>`u`)return[];let e=document.getElementById(`shadow-claw-site-config`);if(!e||!e.textContent)return[];try{let t=JSON.parse(e.textContent),n=typeof t.customElements==`object`&&!Array.isArray(t.customElements)?t.customElements?.scripts:void 0;if(Array.isArray(n))return n.map(e=>typeof e==`string`?e:e?.src).filter(e=>typeof e==`string`&&te(e))}catch{}return[]}async function X(t){try{let i=t??await n();if(!i)return;let[a,o]=await Promise.all([r(i,e.ALLOWED_CUSTOM_ELEMENTS),r(i,e.ALLOWED_CUSTOM_ELEMENT_HOST_PATTERNS)]);if(typeof a==`string`&&a.trim())try{k(JSON.parse(a))}catch{k(a)}if(typeof o==`string`&&o.trim())try{A(JSON.parse(o))}catch{A(o)}}catch(e){console.warn(`Failed to load custom element security from db:`,e)}}let Z=null,Q=!1;function ne(){J(),!(Q||typeof customElements>`u`||typeof customElements.define!=`function`)&&(Z=customElements.define.bind(customElements),customElements.define=function(e,t,n){if(!M((e||``).toLowerCase().trim())){let t=`[Security] Registration blocked: <${e}> is not an approved custom element.`;throw console.error(t),Error(t)}return Z(e,t,n)},Q=!0)}function re(e=typeof document<`u`?document.documentElement:null){if(typeof MutationObserver>`u`||!e)return null;if(typeof e.querySelectorAll==`function`)try{e.querySelectorAll(`*`).forEach(e=>{let t=e.tagName?e.tagName.toLowerCase():``;t.includes(`-`)&&!M(t)&&(console.warn(`[Security] Removing existing unapproved custom element: <${t}>`),e.remove())})}catch{}let t=new MutationObserver(e=>{for(let t of e)t.addedNodes.forEach(e=>{if(e.nodeType===1){let t=e,n=t.tagName?t.tagName.toLowerCase():``;n.includes(`-`)&&!M(n)&&(console.warn(`[Security] Removing unapproved custom element: <${n}>`),t.remove())}})});return t.observe(e,{childList:!0,subtree:!0}),t}let $=!1;function ie(){if($)return;let e=a();if(e&&typeof e.addHook==`function`){let t=e=>{if(e&&e.nodeType===1){let t=e,n=(t.tagName||``).toLowerCase();n.includes(`-`)&&!M(n)&&(typeof t.remove==`function`&&t.remove(),t.parentNode&&t.parentNode.removeChild(t))}};e.addHook(`uponSanitizeElement`,t),e.addHook(`afterSanitizeElements`,t),$=!0}}export{d as _,re as a,X as c,ee as d,v as f,c as g,s as h,W as i,_ as l,l as m,Y as n,ne as o,b as p,K as r,M as s,q as t,y as u};
|
|
@@ -213,7 +213,10 @@ To prevent storage state leakage when multiple instances are deployed under subp
|
|
|
213
213
|
Computes database names as `shadowclaw-${namespace}` (falling back to legacy `"shadowclaw"` when unnamespaced).
|
|
214
214
|
3. **OPFS Root Directory Scope (`getOpfsRootName()`):**
|
|
215
215
|
Computes OPFS root directory handles as `shadow-claw-opfs-${namespace}` (falling back to `"shadowclaw"` when unnamespaced).
|
|
216
|
-
4. **Automated Legacy Migration (`migrateLegacyDatabase.ts`):**
|
|
217
|
-
When booting a namespaced
|
|
216
|
+
4. **Automated Legacy Migration (`migrateLegacyDatabase.ts` & `migrateLegacyOpfs.ts`):**
|
|
217
|
+
When booting a namespaced deployment for the first time, ShadowClaw checks if data was previously stored under `"shadowclaw"`.
|
|
218
|
+
- **IndexedDB**: Copies all object stores into the new namespaced database in a single non-destructive pass, setting `DB_MIGRATED_FROM_LEGACY`.
|
|
219
|
+
- **OPFS**: Recursively copies all legacy workspace directories and files from `"shadowclaw"` into `"shadowclaw-${namespace}"` (with Safari worker write fallback), setting `OPFS_MIGRATED_FROM_LEGACY`.
|
|
220
|
+
The legacy storage is left intact as a fallback seed.
|
|
218
221
|
5. **Namespaced `localStorage` (`namespacedStorage.ts`):**
|
|
219
222
|
Key pattern `shadowclaw:${namespace}:${key}` with automatic one-time copy-on-read from legacy unprefixed keys.
|
|
@@ -136,8 +136,11 @@ To prevent storage state leakage when multiple instances are deployed under subp
|
|
|
136
136
|
Derived automatically from subpath routing (`getAppBasePath()`) or explicit overrides (`window.__SHADOWCLAW_DEPLOY_ID__` / `process.env.SHADOWCLAW_DEPLOY_ID`).
|
|
137
137
|
2. **IndexedDB Scope (`getDbName()`):**
|
|
138
138
|
Computes database names as `shadowclaw-${namespace}` (falling back to legacy `"shadowclaw"` when unnamespaced).
|
|
139
|
-
3. **Automated Legacy Migration (`migrateLegacyDatabase.ts`):**
|
|
140
|
-
When booting a namespaced
|
|
139
|
+
3. **Automated Legacy Migration (`migrateLegacyDatabase.ts` & `migrateLegacyOpfs.ts`):**
|
|
140
|
+
When booting a namespaced deployment for the first time, ShadowClaw checks if data was previously stored under `"shadowclaw"`.
|
|
141
|
+
- **IndexedDB**: Copies all object stores into the new namespaced database in a single non-destructive pass, setting `DB_MIGRATED_FROM_LEGACY`.
|
|
142
|
+
- **OPFS**: Recursively copies all legacy workspace directories and files from `"shadowclaw"` into `"shadowclaw-${namespace}"` (with Safari worker write fallback), setting `OPFS_MIGRATED_FROM_LEGACY`.
|
|
143
|
+
The legacy storage is left intact as a fallback seed.
|
|
141
144
|
4. **Namespaced `localStorage` (`namespacedStorage.ts`):**
|
|
142
145
|
Key pattern `shadowclaw:${namespace}:${key}` with automatic one-time copy-on-read from legacy unprefixed keys.
|
|
143
146
|
5. **Isolation Assurance:**
|