shadow-claw 1.23.3 → 1.23.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (89) hide show
  1. package/bin/assert-version-bump.mjs +60 -38
  2. package/bin/assert-version-bump.test.mjs +74 -11
  3. package/dist/public/agent.worker.js +6 -6
  4. package/dist/public/{app-routes-B0ePT49v.js → app-routes-Bs-riIvr.js} +1 -1
  5. package/dist/public/components/settings/shadow-claw-storage/shadow-claw-storage.html +1 -1
  6. package/dist/public/components/shadow-claw-files/shadow-claw-files.css +1 -1
  7. package/dist/public/components/shadow-claw-files/shadow-claw-files.html +1 -1
  8. package/dist/public/config-BYAuxx3j.js +1 -0
  9. package/dist/public/{configurePeerJs-B7kNU8AQ.js → configurePeerJs-B4Ym9VMj.js} +1 -1
  10. package/dist/public/{connections-xd_66YVU.js → connections-BEn6JYdu.js} +1 -1
  11. package/dist/public/{custom-element-security-CZ92anB8.js → custom-element-security-DdYlUozq.js} +1 -1
  12. package/dist/public/docs/architecture/storage.md +5 -2
  13. package/dist/public/docs/decisions/indexeddb-and-opfs-storage.md +5 -2
  14. package/dist/public/docs/example/article/index.html +2 -2
  15. package/dist/public/docs/publishing/index.html +19 -76
  16. package/dist/public/docs/skill-creator/index.html +2 -2
  17. package/dist/public/{downloadGroupFile-BABv_1mJ.js → downloadGroupFile-Drdvg1Ev.js} +1 -1
  18. package/dist/public/{e2e-bridge-DkS5xFGX.js → e2e-bridge-BQ4KzUt5.js} +1 -1
  19. package/dist/public/{file-viewer-CCSABMsE.js → file-viewer-CcZYw-PS.js} +1 -1
  20. package/dist/public/files/main/~/docs/publishing-to-github-pages.md +17 -82
  21. package/dist/public/{git-BkjrsRXX.js → git-DEUvQTUA.js} +2 -2
  22. package/dist/public/{iframe-sanitizer-L6Jyu__Z.js → iframe-sanitizer-0NS4XLOd.js} +1 -1
  23. package/dist/public/index.html +2 -2
  24. package/dist/public/index.js +1 -1
  25. package/dist/public/{initChatSplitResize-BslPXAXS.js → initChatSplitResize-llGkSJXg.js} +1 -1
  26. package/dist/public/main/index.html +2 -2
  27. package/dist/public/main/memory/index.html +2 -2
  28. package/dist/public/{markdown-6MBrIo-S.js → markdown-CyYR4App.js} +1 -1
  29. package/dist/public/mcp-reconnect-CSx4aMwy.js +1 -0
  30. package/dist/public/{memoryStorage-CjGseKI1.js → memoryStorage-Dwg8NhAZ.js} +1 -1
  31. package/dist/public/{orchestrator-B9KmIj8Q.js → orchestrator-DRfEudXk.js} +18 -18
  32. package/dist/public/orchestrator-o9Fj67BN.js +15 -0
  33. package/dist/public/pages/main/~/docs/publishing-to-github-pages.md +17 -82
  34. package/dist/public/{peerjs-Dv8JNm7v.js → peerjs-CurBuKvk.js} +1 -1
  35. package/dist/public/{push-client-Dqq06wbB.js → push-client-Dii-vPEh.js} +1 -1
  36. package/dist/public/service-worker/fetch-proxy.js +1 -1
  37. package/dist/public/service-worker.js +1 -1
  38. package/dist/public/{shadow-claw-Bd1rfuVC.js → shadow-claw-5IHaDDMJ.js} +2 -2
  39. package/dist/public/{shadow-claw-accounts-DL2l3oM0.js → shadow-claw-accounts-CZvz4iQz.js} +3 -3
  40. package/dist/public/{shadow-claw-channels-BGXDsQ38.js → shadow-claw-channels-BKXFyRS3.js} +1 -1
  41. package/dist/public/{shadow-claw-chat-NXg6zz_l.js → shadow-claw-chat-CCLuhWdI.js} +3 -3
  42. package/dist/public/{shadow-claw-conversations-C8eqGpP9.js → shadow-claw-conversations-DV-87UUh.js} +1 -1
  43. package/dist/public/shadow-claw-file-viewer-Dk2dbAUd.js +577 -0
  44. package/dist/public/shadow-claw-files-BpfpJIuP.js +840 -0
  45. package/dist/public/{shadow-claw-git-C0ntz7aX.js → shadow-claw-git-DRA7_qck.js} +3 -3
  46. package/dist/public/{shadow-claw-integrations-DCXV2r69.js → shadow-claw-integrations-1Xu5snuV.js} +1 -1
  47. package/dist/public/{shadow-claw-llm-CudgFQsS.js → shadow-claw-llm-6Aci1BDP.js} +2 -2
  48. package/dist/public/{shadow-claw-mcp-remote-B8RkpX28.js → shadow-claw-mcp-remote-BUjAeVXC.js} +1 -1
  49. package/dist/public/{shadow-claw-networking-BLiRsrsK.js → shadow-claw-networking-FQe4nCp3.js} +1 -1
  50. package/dist/public/{shadow-claw-notifications-CQhQcjtL.js → shadow-claw-notifications-DV2wibL3.js} +1 -1
  51. package/dist/public/{shadow-claw-page-header-NeRD0tKU.js → shadow-claw-page-header-B63S4HTU.js} +1 -1
  52. package/dist/public/{shadow-claw-pages-DCHnFh6r.js → shadow-claw-pages-DE3jWj5K.js} +3 -3
  53. package/dist/public/{shadow-claw-settings-VAfjKFQg.js → shadow-claw-settings-S6DAKfYx.js} +3 -3
  54. package/dist/public/shadow-claw-storage-DaacA3_K.js +219 -0
  55. package/dist/public/{shadow-claw-task-server-Dk33N_1G.js → shadow-claw-task-server-IjKX042p.js} +1 -1
  56. package/dist/public/{shadow-claw-tasks-xA1VfmWN.js → shadow-claw-tasks-Cy0JYmGU.js} +4 -4
  57. package/dist/public/{shadow-claw-terminal-Du2r0ciq.js → shadow-claw-terminal-znAt7HyP.js} +1 -1
  58. package/dist/public/{shadow-claw-tools-CZj4rq7l.js → shadow-claw-tools-Cutv9Si5.js} +2 -2
  59. package/dist/public/{shadow-claw-webvm-JYUkWICG.js → shadow-claw-webvm-BH8mPDEu.js} +1 -1
  60. package/dist/public/static-main/~/docs/publishing-to-github-pages.md +17 -82
  61. package/dist/public/static-main-manifest.json +1 -1
  62. package/dist/public/{syncWebMcpRegistration-DfpvASnh.js → syncWebMcpRegistration-BqJxaMGR.js} +1 -1
  63. package/package.json +1 -1
  64. package/src/components/settings/shadow-claw-storage/shadow-claw-storage.html +17 -0
  65. package/src/components/settings/shadow-claw-storage/shadow-claw-storage.test.ts +44 -0
  66. package/src/components/settings/shadow-claw-storage/shadow-claw-storage.ts +56 -0
  67. package/src/components/shadow-claw-file-viewer/shadow-claw-file-viewer.test.ts +105 -0
  68. package/src/components/shadow-claw-file-viewer/shadow-claw-file-viewer.ts +11 -9
  69. package/src/components/shadow-claw-files/shadow-claw-files.css +41 -17
  70. package/src/components/shadow-claw-files/shadow-claw-files.html +35 -0
  71. package/src/components/shadow-claw-files/shadow-claw-files.test.ts +219 -0
  72. package/src/components/shadow-claw-files/shadow-claw-files.ts +170 -6
  73. package/src/components/shadow-claw-pages/utils/resolveWorkspaceLinkPath.test.ts +31 -0
  74. package/src/components/shadow-claw-pages/utils/resolveWorkspaceLinkPath.ts +2 -1
  75. package/src/components/shadow-claw-pages/utils/rewriteWorkspacePreviewHtml.test.ts +15 -0
  76. package/src/config/config.test.ts +9 -0
  77. package/src/config/config.ts +5 -0
  78. package/src/core/app-routes.test.ts +56 -0
  79. package/src/core/app-routes.ts +8 -1
  80. package/src/db/openDatabase.test.ts +10 -1
  81. package/src/db/openDatabase.ts +3 -1
  82. package/src/storage/migrateLegacyOpfs.test.ts +327 -0
  83. package/src/storage/migrateLegacyOpfs.ts +117 -0
  84. package/dist/public/config-AL77QAx4.js +0 -1
  85. package/dist/public/mcp-reconnect-DoicazQd.js +0 -1
  86. package/dist/public/orchestrator-4su7iyWj.js +0 -15
  87. package/dist/public/shadow-claw-file-viewer-9Qkwc30T.js +0 -577
  88. package/dist/public/shadow-claw-files-aDyq6Hv7.js +0 -781
  89. package/dist/public/shadow-claw-storage-Cf31np81.js +0 -202
@@ -1,4 +1,4 @@
1
- import{r as e}from"./config-AL77QAx4.js";import{n as t}from"./txPromise-EBECky1b.js";import{h as n}from"./custom-element-security-CZ92anB8.js";import{Z as r,a as i,c as a,ln as o,t as s}from"./orchestrator-B9KmIj8Q.js";import{n as c,r as l}from"./crypto-C8c5wMzN.js";import{n as u,r as d,t as f}from"./toast-D3gxhZpN.js";import{t as p}from"./shadow-claw-element-DIrv3P6A.js";import"./shadow-claw-page-header-NeRD0tKU.js";import{t as m}from"./config-value-oBfKgLT4.js";import"./shadow-claw-dialog-ByyHgxM9.js";function h(e){try{return JSON.parse(JSON.stringify(e))}catch{return null}}async function g(t,n){let r=[],i=[];for(let a of t){let t=a.key;if(t===e.STORAGE_HANDLE)continue;if(t===e.GIT_PASSWORD||t===e.API_KEY||t.startsWith(`api_key:`)||t===e.IMESSAGE_API_KEY||t===e.TELEGRAM_BOT_TOKEN){if(n&&typeof a.value==`string`){let e=await c(a.value);e&&i.push({key:t,path:[],value:e})}continue}let o=h(a.value);if(t===e.GIT_ACCOUNTS&&Array.isArray(o))for(let e=0;e<o.length;e+=1){let r=o[e];if(!r||typeof r!=`object`)continue;let a=r.password;if(typeof a==`string`&&a){if(n){let n=await c(a);n&&i.push({key:t,path:[e,`password`],value:n})}delete r.password}}if(t===e.INTEGRATION_CONNECTIONS&&Array.isArray(o))for(let e=0;e<o.length;e+=1){let r=o[e]?.credentialRef,a=r?.encryptedSecret;if(typeof a==`string`&&a){if(n){let n=await c(a);n&&i.push({key:t,path:[e,`credentialRef`,`encryptedSecret`],value:n})}delete r.encryptedSecret}}if(t===e.REMOTE_MCP_CONNECTIONS&&Array.isArray(o))for(let e=0;e<o.length;e+=1){let r=o[e]?.credentialRef,a=r?.encryptedValue;if(typeof a==`string`&&a){if(n){let n=await c(a);n&&i.push({key:t,path:[e,`credentialRef`,`encryptedValue`],value:n})}delete r.encryptedValue}}r.push({key:t,value:o})}return{configEntries:r,plaintextPasswords:i}}function _(e,t,n){if(t.length===0)return n;let r=e;for(let n=0;n<t.length-1;n+=1){let i=t[n];if(typeof i==`number`){if(!Array.isArray(r)||!r[i])return e;r=r[i]}else{if(!r||typeof r!=`object`)return e;let t=r[i];if(!t||typeof t!=`object`)return e;r=t}}let i=t[t.length-1];if(typeof i==`number`){if(!Array.isArray(r))return e;r[i]=n}else{if(!r||typeof r!=`object`)return e;r[i]=n}return e}async function v(e,t){let n=await g(e,t);return{kind:`shadowclaw-settings-backup`,version:1,exportedAt:Date.now(),includePlaintextPasswords:t,configEntries:n.configEntries,plaintextPasswords:t?n.plaintextPasswords:void 0}}async function y(e,t){let n=await v(e,t);return new Blob([JSON.stringify(n,null,2)],{type:`application/json`})}async function b(e,t,n){let r=await v(t,n);await o(e,JSON.stringify(r,null,2))}async function x(e,t){if(!t.length)return e;let n=e.map(e=>({key:e.key,value:h(e.value)}));for(let e of t){let t=await l(e.value);if(!t)continue;let r=n.find(t=>t.key===e.key);r?r.value=_(r.value,e.path,t):e.path.length===0&&n.push({key:e.key,value:t})}return n}function S(e){let t=JSON.parse(e);if(t?.kind!==`shadowclaw-settings-backup`||t.version!==1||!Array.isArray(t.configEntries))throw Error(`Invalid settings backup file`);let n=Array.isArray(t.plaintextPasswords)?t.plaintextPasswords.filter(e=>e&&typeof e.key==`string`&&Array.isArray(e.path)&&typeof e.value==`string`):[];return{kind:`shadowclaw-settings-backup`,version:1,exportedAt:typeof t.exportedAt==`number`?t.exportedAt:Date.now(),includePlaintextPasswords:!!t.includePlaintextPasswords,configEntries:t.configEntries.filter(e=>e&&typeof e.key==`string`).map(e=>({key:e.key,value:e.value})),plaintextPasswords:n}}const C=new CSSStyleSheet;C.replaceSync(`*,
1
+ import{r as e}from"./config-BYAuxx3j.js";import{n as t}from"./txPromise-EBECky1b.js";import{h as n}from"./custom-element-security-DdYlUozq.js";import{Z as r,a as i,c as a,ln as o,t as s}from"./orchestrator-DRfEudXk.js";import{n as c,r as l}from"./crypto-C8c5wMzN.js";import{n as u,r as d,t as f}from"./toast-D3gxhZpN.js";import{t as p}from"./shadow-claw-element-DIrv3P6A.js";import{t as m}from"./config-value-oBfKgLT4.js";import"./shadow-claw-page-header-B63S4HTU.js";import"./shadow-claw-dialog-ByyHgxM9.js";function h(e){try{return JSON.parse(JSON.stringify(e))}catch{return null}}async function g(t,n){let r=[],i=[];for(let a of t){let t=a.key;if(t===e.STORAGE_HANDLE)continue;if(t===e.GIT_PASSWORD||t===e.API_KEY||t.startsWith(`api_key:`)||t===e.IMESSAGE_API_KEY||t===e.TELEGRAM_BOT_TOKEN){if(n&&typeof a.value==`string`){let e=await c(a.value);e&&i.push({key:t,path:[],value:e})}continue}let o=h(a.value);if(t===e.GIT_ACCOUNTS&&Array.isArray(o))for(let e=0;e<o.length;e+=1){let r=o[e];if(!r||typeof r!=`object`)continue;let a=r.password;if(typeof a==`string`&&a){if(n){let n=await c(a);n&&i.push({key:t,path:[e,`password`],value:n})}delete r.password}}if(t===e.INTEGRATION_CONNECTIONS&&Array.isArray(o))for(let e=0;e<o.length;e+=1){let r=o[e]?.credentialRef,a=r?.encryptedSecret;if(typeof a==`string`&&a){if(n){let n=await c(a);n&&i.push({key:t,path:[e,`credentialRef`,`encryptedSecret`],value:n})}delete r.encryptedSecret}}if(t===e.REMOTE_MCP_CONNECTIONS&&Array.isArray(o))for(let e=0;e<o.length;e+=1){let r=o[e]?.credentialRef,a=r?.encryptedValue;if(typeof a==`string`&&a){if(n){let n=await c(a);n&&i.push({key:t,path:[e,`credentialRef`,`encryptedValue`],value:n})}delete r.encryptedValue}}r.push({key:t,value:o})}return{configEntries:r,plaintextPasswords:i}}function _(e,t,n){if(t.length===0)return n;let r=e;for(let n=0;n<t.length-1;n+=1){let i=t[n];if(typeof i==`number`){if(!Array.isArray(r)||!r[i])return e;r=r[i]}else{if(!r||typeof r!=`object`)return e;let t=r[i];if(!t||typeof t!=`object`)return e;r=t}}let i=t[t.length-1];if(typeof i==`number`){if(!Array.isArray(r))return e;r[i]=n}else{if(!r||typeof r!=`object`)return e;r[i]=n}return e}async function v(e,t){let n=await g(e,t);return{kind:`shadowclaw-settings-backup`,version:1,exportedAt:Date.now(),includePlaintextPasswords:t,configEntries:n.configEntries,plaintextPasswords:t?n.plaintextPasswords:void 0}}async function y(e,t){let n=await v(e,t);return new Blob([JSON.stringify(n,null,2)],{type:`application/json`})}async function b(e,t,n){let r=await v(t,n);await o(e,JSON.stringify(r,null,2))}async function x(e,t){if(!t.length)return e;let n=e.map(e=>({key:e.key,value:h(e.value)}));for(let e of t){let t=await l(e.value);if(!t)continue;let r=n.find(t=>t.key===e.key);r?r.value=_(r.value,e.path,t):e.path.length===0&&n.push({key:e.key,value:t})}return n}function S(e){let t=JSON.parse(e);if(t?.kind!==`shadowclaw-settings-backup`||t.version!==1||!Array.isArray(t.configEntries))throw Error(`Invalid settings backup file`);let n=Array.isArray(t.plaintextPasswords)?t.plaintextPasswords.filter(e=>e&&typeof e.key==`string`&&Array.isArray(e.path)&&typeof e.value==`string`):[];return{kind:`shadowclaw-settings-backup`,version:1,exportedAt:typeof t.exportedAt==`number`?t.exportedAt:Date.now(),includePlaintextPasswords:!!t.includePlaintextPasswords,configEntries:t.configEntries.filter(e=>e&&typeof e.key==`string`).map(e=>({key:e.key,value:e.value})),plaintextPasswords:n}}const C=new CSSStyleSheet;C.replaceSync(`*,
2
2
  *::before,
3
3
  *::after {
4
4
  font-family: var(--shadow-claw-font-sans);
@@ -878,7 +878,7 @@ import{r as e}from"./config-AL77QAx4.js";import{n as t}from"./txPromise-EBECky1b
878
878
  </div>
879
879
  </div>
880
880
  </template>
881
- `,`text/html`),T=w.querySelector(`template`);let E=[];E=T?Array.from(T.content.children):Array.from(w.head.children).concat(Array.from(w.body.children));var D=E;const O={ai:[()=>import(`./shadow-claw-llm-CudgFQsS.js`)],environment:[()=>import(`./shadow-claw-networking-BLiRsrsK.js`),()=>import(`./shadow-claw-webvm-JYUkWICG.js`),()=>import(`./shadow-claw-storage-Cf31np81.js`)],integrations:[()=>import(`./shadow-claw-git-C0ntz7aX.js`),()=>import(`./shadow-claw-accounts-DL2l3oM0.js`),()=>import(`./shadow-claw-mcp-remote-B8RkpX28.js`),()=>import(`./shadow-claw-integrations-DCXV2r69.js`),()=>import(`./shadow-claw-task-server-Dk33N_1G.js`),()=>import(`./shadow-claw-notifications-CQhQcjtL.js`)]},k=new Set;async function A(e){if(k.has(e))return;let t=O[e];t&&(k.add(e),await Promise.all(t.map(e=>e())))}const j=`shadow-claw-settings`;var M=class extends p{static styles=C;static template=D;activeTab=`ai`;db=null;orchestrator=null;pendingRestoreFile=null;constructor(){super()}async connectedCallback(){if(!this.shadowRoot)throw Error(`shadowRoot not found`);this.db=await t(),this.orchestrator=s.orchestrator,await this.render()}activateTab(e){!e||this.activeTab===e||(this.activeTab=e,this.applyTabState())}applyTabState(){A(this.activeTab).catch(console.error);let e=this.shadowRoot;e&&(e.querySelectorAll(`[data-tab-target]`).forEach(e=>{let t=e.dataset.tabTarget===this.activeTab;e.classList.toggle(`active`,t),e.setAttribute(`aria-selected`,String(t)),e.tabIndex=t?0:-1}),e.querySelectorAll(`[data-tab-panel]`).forEach(e=>{e.hidden=e.dataset.tabPanel!==this.activeTab}))}bindSettingsActions(){let e=this.shadowRoot;if(!e)return;e.querySelector(`[data-action="backup-settings"]`)?.addEventListener(`click`,()=>this.openBackupDialog());let t=e.querySelector(`.settings__restore-input`);e.querySelector(`[data-action="restore-settings"]`)?.addEventListener(`click`,()=>{t instanceof HTMLInputElement&&(t.value=``,t.click())}),t?.addEventListener(`change`,e=>{let t=e.target;if(!(t instanceof HTMLInputElement))return;let n=t.files?.[0]||null;n&&(this.pendingRestoreFile=n,this.openRestoreDialog(n.name))}),e.querySelector(`[data-action="clear-settings"]`)?.addEventListener(`click`,()=>this.openClearDialog()),e.querySelector(`[data-action="cancel-backup-settings"]`)?.addEventListener(`click`,()=>this.closeDialog(`.settings__backup-dialog`)),e.querySelector(`[data-action="confirm-backup-settings"]`)?.addEventListener(`click`,()=>{this.confirmBackup()}),e.querySelector(`[data-action="cancel-restore-settings"]`)?.addEventListener(`click`,()=>{this.pendingRestoreFile=null,this.closeDialog(`.settings__restore-dialog`)}),e.querySelector(`[data-action="confirm-restore-settings"]`)?.addEventListener(`click`,()=>{this.confirmRestore()}),e.querySelector(`[data-action="cancel-clear-settings"]`)?.addEventListener(`click`,()=>this.closeDialog(`.settings__clear-dialog`)),e.querySelector(`[data-action="confirm-clear-settings"]`)?.addEventListener(`click`,()=>{this.confirmClear()}),e.querySelector(`[data-action="save-assistant-name"]`)?.addEventListener(`click`,()=>this.saveAssistantName()),e.querySelector(`[data-setting="activity-log-disk-logging-toggle"]`)?.addEventListener(`change`,e=>{let t=e.target;t&&this.onActivityLogDiskLoggingToggle(t.checked)}),e.querySelector(`[data-setting="sidebar-hide-pages-toggle"]`)?.addEventListener(`change`,e=>{let t=e.target;t&&this.onSidebarHidePagesToggle(t.checked)}),e.querySelector(`[data-setting="sidebar-hide-chat-toggle"]`)?.addEventListener(`change`,e=>{let t=e.target;t&&this.onSidebarHideChatToggle(t.checked)}),e.querySelector(`[data-setting="sidebar-hide-tasks-toggle"]`)?.addEventListener(`change`,e=>{let t=e.target;t&&this.onSidebarHideTasksToggle(t.checked)}),e.querySelector(`[data-setting="sidebar-hide-files-toggle"]`)?.addEventListener(`change`,e=>{let t=e.target;t&&this.onSidebarHideFilesToggle(t.checked)}),e.querySelector(`[data-setting="chat-split-view-toggle"]`)?.addEventListener(`change`,e=>{let t=e.target;t&&this.onChatSplitViewToggle(t.checked)}),e.querySelector(`[data-setting="pages-auto-refresh-input"]`)?.addEventListener(`change`,e=>{let t=e.target;if(t){let e=parseInt(t.value,10);this.onPagesAutoRefreshInputChange(isNaN(e)?0:e)}}),e.querySelector(`[data-setting="override-prerender-skeleton-toggle"]`)?.addEventListener(`change`,e=>{let t=e.target;t&&this.onOverridePrerenderSkeletonToggle(t.checked)}),e.querySelector(`[data-action="save-dom-allowed-iframe-hosts"]`)?.addEventListener(`click`,()=>{this.saveDomAllowedIframeHosts()})}closeDialog(e){this.getDialog(e)?.close()}getDialog(e){let t=this.shadowRoot;if(!t)return null;let n=t.querySelector(e);return n instanceof HTMLDialogElement?n:null}handleTabKeydown(e,t){let n=this.shadowRoot;if(!n)return;let r=Array.from(n.querySelectorAll(`[data-tab-target]`)),i=r.indexOf(t);if(i<0)return;let a=-1;switch(e.key){case`ArrowRight`:case`ArrowDown`:a=(i+1)%r.length;break;case`ArrowLeft`:case`ArrowUp`:a=(i-1+r.length)%r.length;break;case`Home`:a=0;break;case`End`:a=r.length-1;break;default:return}e.preventDefault();let o=r[a];o.focus(),this.activateTab(o.dataset.tabTarget)}openBackupDialog(){let e=this.shadowRoot?.querySelector(`[data-setting="include-plaintext-passwords"]`);e instanceof HTMLInputElement&&(e.checked=!1),this.showDialog(`.settings__backup-dialog`)}openClearDialog(){this.showDialog(`.settings__clear-dialog`)}openRestoreDialog(e){let t=this.shadowRoot?.querySelector(`[data-info="restore-filename"]`);t instanceof HTMLElement&&(t.textContent=`Selected file: ${e}`),this.showDialog(`.settings__restore-dialog`)}showDialog(e){let t=this.getDialog(e);if(t){if(typeof t.showModal==`function`){t.showModal();return}t.setAttribute(`open`,``)}}async confirmBackup(){if(!this.db){f(`Settings database is unavailable`,5e3);return}let e=this.shadowRoot?.querySelector(`[data-setting="include-plaintext-passwords"]`),t=e instanceof HTMLInputElement&&e.checked;try{if(t){let e=await this.promptForPlaintextBackupHandle();if(!e)return;await b(e,await this.getAllConfigEntries(),t),this.closeDialog(`.settings__backup-dialog`),d(`Settings backup saved`,3e3);return}let e=await y(await this.getAllConfigEntries(),t),n=URL.createObjectURL(e),r=document.createElement(`a`);r.href=n,r.download=`shadowclaw-settings-backup-${Date.now()}.json`,document.body.appendChild(r),r.click(),document.body.removeChild(r),URL.revokeObjectURL(n),this.closeDialog(`.settings__backup-dialog`),d(`Settings backup downloaded`,3e3)}catch(e){f(`Failed to backup settings: ${e instanceof Error?e.message:String(e)}`,6e3)}}async confirmClear(){if(!this.db){f(`Settings database is unavailable`,5e3);return}try{await this.replaceConfigEntries([]),this.closeDialog(`.settings__clear-dialog`),u(`Settings cleared. Reloading app...`,3200),setTimeout(()=>{window.location.reload()},250)}catch(e){f(`Failed to clear settings: ${e instanceof Error?e.message:String(e)}`,6e3)}}async confirmRestore(){if(!this.db){f(`Settings database is unavailable`,5e3);return}let e=this.pendingRestoreFile;if(!e){f(`No backup file selected`,4e3);return}try{let t=S(await e.text()),n=await x(t.configEntries,t.plaintextPasswords||[]);await this.replaceConfigEntries(n),this.pendingRestoreFile=null,this.closeDialog(`.settings__restore-dialog`),d(`Settings restored. Reloading app...`,3200),setTimeout(()=>{window.location.reload()},250)}catch(e){f(`Failed to restore settings: ${e instanceof Error?e.message:String(e)}`,6e3)}}async getAllConfigEntries(){if(!this.db)throw Error(`Database is unavailable`);return await new Promise((e,t)=>{try{let n=this.db?.transaction(`config`,`readonly`);if(!n){t(Error(`Failed to open read transaction`));return}let r=n.objectStore(`config`).getAll();r.onsuccess=()=>{e((Array.isArray(r.result)?r.result:[]).filter(e=>e&&typeof e.key==`string`).map(e=>({key:e.key,value:e.value})))},r.onerror=()=>{t(r.error||Error(`Failed to read settings config`))}}catch(e){t(e)}})}async onActivityLogDiskLoggingToggle(t){if(this.db)try{let{setConfig:n}=await import(`./setConfig-DFMYnYLE.js`).then(e=>e.n);await n(this.db,e.ACTIVITY_LOG_DISK_LOGGING_ENABLED,t?`true`:`false`),d(t?`Activity log disk logging enabled`:`Activity log disk logging disabled`,2500)}catch(e){f(`Error saving activity log disk logging setting: `+(e instanceof Error?e.message:String(e)),6e3)}}async onChatSplitViewToggle(t){if(this.db)try{let{setConfig:n}=await import(`./setConfig-DFMYnYLE.js`).then(e=>e.n);await n(this.db,e.CHAT_SPLIT_VIEW_ENABLED,t?`true`:`false`),this.dispatchEvent(new CustomEvent(`chat-split-view-change`,{detail:{enabled:t},bubbles:!0,composed:!0})),d(t?`Horizontal Chat split view enabled`:`Horizontal Chat split view disabled`,2500)}catch(e){f(`Error saving Chat split view setting: `+(e instanceof Error?e.message:String(e)),6e3)}}async onOverridePrerenderSkeletonToggle(t){try{a(`shadow-claw-override-prerender-skeleton`,t?`true`:`false`)}catch(e){console.warn(`Unable to save setting to localStorage:`,e)}if(this.db)try{let{setConfig:n}=await import(`./setConfig-DFMYnYLE.js`).then(e=>e.n);await n(this.db,e.OVERRIDE_PRERENDER_SKELETON,t?`true`:`false`),d(t?`Pre-rendered content override enabled`:`Pre-rendered content override disabled`,2500)}catch(e){f(`Error saving pre-rendered content override setting: `+(e instanceof Error?e.message:String(e)),6e3)}}async onPagesAutoRefreshInputChange(t){if(!this.db)return;let n=Math.max(0,Math.min(t,86400));try{let{setConfig:t}=await import(`./setConfig-DFMYnYLE.js`).then(e=>e.n);await t(this.db,e.PAGES_AUTO_REFRESH_INTERVAL,String(n)),window.dispatchEvent(new CustomEvent(`shadow-claw-pages-auto-refresh-change`,{detail:{interval:n}})),d(n>0?`Pages auto refresh set to ${n}s`:`Pages auto refresh disabled`,2500)}catch(e){f(`Error saving Pages auto refresh interval: `+(e instanceof Error?e.message:String(e)),6e3)}}async onSidebarHideChatToggle(t){if(this.db)try{let{setConfig:n}=await import(`./setConfig-DFMYnYLE.js`).then(e=>e.n);await n(this.db,e.SIDEBAR_CHAT_HIDDEN,t?`true`:`false`),this.dispatchEvent(new CustomEvent(`sidebar-chat-visibility-change`,{detail:{hidden:t},bubbles:!0,composed:!0})),d(t?`Chat hidden in sidebar`:`Chat shown in sidebar`,2500)}catch(e){f(`Error saving sidebar Chat visibility: `+(e instanceof Error?e.message:String(e)),6e3)}}async onSidebarHideFilesToggle(t){if(this.db)try{let{setConfig:n}=await import(`./setConfig-DFMYnYLE.js`).then(e=>e.n);await n(this.db,e.SIDEBAR_FILES_HIDDEN,t?`true`:`false`),this.dispatchEvent(new CustomEvent(`sidebar-files-visibility-change`,{detail:{hidden:t},bubbles:!0,composed:!0})),d(t?`Files hidden in sidebar`:`Files shown in sidebar`,2500)}catch(e){f(`Error saving sidebar Files visibility: `+(e instanceof Error?e.message:String(e)),6e3)}}async onSidebarHidePagesToggle(t){if(this.db)try{let{setConfig:n}=await import(`./setConfig-DFMYnYLE.js`).then(e=>e.n);await n(this.db,e.SIDEBAR_PAGES_HIDDEN,t?`true`:`false`),this.dispatchEvent(new CustomEvent(`sidebar-pages-visibility-change`,{detail:{hidden:t},bubbles:!0,composed:!0})),d(t?`Pages hidden in sidebar`:`Pages shown in sidebar`,2500)}catch(e){f(`Error saving sidebar Pages visibility: `+(e instanceof Error?e.message:String(e)),6e3)}}async onSidebarHideTasksToggle(t){if(this.db)try{let{setConfig:n}=await import(`./setConfig-DFMYnYLE.js`).then(e=>e.n);await n(this.db,e.SIDEBAR_TASKS_HIDDEN,t?`true`:`false`),this.dispatchEvent(new CustomEvent(`sidebar-tasks-visibility-change`,{detail:{hidden:t},bubbles:!0,composed:!0})),d(t?`Tasks hidden in sidebar`:`Tasks shown in sidebar`,2500)}catch(e){f(`Error saving sidebar Tasks visibility: `+(e instanceof Error?e.message:String(e)),6e3)}}async populateAssistantSettings(){let t=this.shadowRoot;if(!t||!this.db)return;let n=t.querySelector(`[data-setting="assistant-name-input"]`);if(n){let{getConfig:t}=await import(`./getConfig-D89uJgo5.js`).then(e=>e.n),r=await t(this.db,e.ASSISTANT_NAME),i=this.orchestrator?.assistantName||s.orchestrator?.assistantName;n.value=typeof r==`string`&&r||i||`ShadowClaw`}let{getConfig:r}=await import(`./getConfig-D89uJgo5.js`).then(e=>e.n),o=await r(this.db,e.ACTIVITY_LOG_DISK_LOGGING_ENABLED),c=o===!0||o===`true`||o===1||o===`1`,l=t.querySelector(`[data-setting="activity-log-disk-logging-toggle"]`);l&&(l.checked=c);let u=await r(this.db,e.SIDEBAR_PAGES_HIDDEN),d=u===!0||u===`true`||u===1||u===`1`,f=t.querySelector(`[data-setting="sidebar-hide-pages-toggle"]`);f&&(f.checked=d);let p=await r(this.db,e.SIDEBAR_CHAT_HIDDEN),h=p===!0||p===`true`||p===1||p===`1`,g=t.querySelector(`[data-setting="sidebar-hide-chat-toggle"]`);g&&(g.checked=h);let _=await r(this.db,e.SIDEBAR_TASKS_HIDDEN),v=_===!0||_===`true`||_===1||_===`1`,y=t.querySelector(`[data-setting="sidebar-hide-tasks-toggle"]`);y&&(y.checked=v);let b=await r(this.db,e.SIDEBAR_FILES_HIDDEN),x=b===!0||b===`true`||b===1||b===`1`,S=t.querySelector(`[data-setting="sidebar-hide-files-toggle"]`);S&&(S.checked=x);let C=m(await r(this.db,e.CHAT_SPLIT_VIEW_ENABLED),!1),w=t.querySelector(`[data-setting="chat-split-view-toggle"]`);w&&(w.checked=C);let T=t.querySelector(`[data-setting="pages-auto-refresh-input"]`);if(T){let t=await r(this.db,e.PAGES_AUTO_REFRESH_INTERVAL);if(typeof t==`string`||typeof t==`number`){let e=parseInt(String(t),10);T.value=!isNaN(e)&&e>=0?String(e):`0`}else T.value=`0`}let E=await r(this.db,e.OVERRIDE_PRERENDER_SKELETON),D=null;try{D=i(`shadow-claw-override-prerender-skeleton`)}catch{}let O=!0;if(E==null?D!==null&&(O=D===`true`):O=m(E),O)try{a(`shadow-claw-override-prerender-skeleton`,`true`)}catch{}let k=t.querySelector(`[data-setting="override-prerender-skeleton-toggle"]`);k&&(k.checked=O);let A=t.querySelector(`[data-setting="dom-allowed-iframe-hosts"]`);if(A){let t=await r(this.db,e.ALLOWED_IFRAME_HOST_PATTERNS);if(typeof t==`string`&&t.trim().length>0){A.value=t;let{setAllowedIframeHostPatterns:e}=await import(`./iframe-sanitizer-L6Jyu__Z.js`).then(e=>e.r);e(t)}else{let{DEFAULT_ALLOWED_IFRAME_HOST_PATTERNS:e}=await import(`./iframe-sanitizer-L6Jyu__Z.js`).then(e=>e.r);A.value=e.join(`
881
+ `,`text/html`),T=w.querySelector(`template`);let E=[];E=T?Array.from(T.content.children):Array.from(w.head.children).concat(Array.from(w.body.children));var D=E;const O={ai:[()=>import(`./shadow-claw-llm-6Aci1BDP.js`)],environment:[()=>import(`./shadow-claw-networking-FQe4nCp3.js`),()=>import(`./shadow-claw-webvm-BH8mPDEu.js`),()=>import(`./shadow-claw-storage-DaacA3_K.js`)],integrations:[()=>import(`./shadow-claw-git-DRA7_qck.js`),()=>import(`./shadow-claw-accounts-CZvz4iQz.js`),()=>import(`./shadow-claw-mcp-remote-BUjAeVXC.js`),()=>import(`./shadow-claw-integrations-1Xu5snuV.js`),()=>import(`./shadow-claw-task-server-IjKX042p.js`),()=>import(`./shadow-claw-notifications-DV2wibL3.js`)]},k=new Set;async function A(e){if(k.has(e))return;let t=O[e];t&&(k.add(e),await Promise.all(t.map(e=>e())))}const j=`shadow-claw-settings`;var M=class extends p{static styles=C;static template=D;activeTab=`ai`;db=null;orchestrator=null;pendingRestoreFile=null;constructor(){super()}async connectedCallback(){if(!this.shadowRoot)throw Error(`shadowRoot not found`);this.db=await t(),this.orchestrator=s.orchestrator,await this.render()}activateTab(e){!e||this.activeTab===e||(this.activeTab=e,this.applyTabState())}applyTabState(){A(this.activeTab).catch(console.error);let e=this.shadowRoot;e&&(e.querySelectorAll(`[data-tab-target]`).forEach(e=>{let t=e.dataset.tabTarget===this.activeTab;e.classList.toggle(`active`,t),e.setAttribute(`aria-selected`,String(t)),e.tabIndex=t?0:-1}),e.querySelectorAll(`[data-tab-panel]`).forEach(e=>{e.hidden=e.dataset.tabPanel!==this.activeTab}))}bindSettingsActions(){let e=this.shadowRoot;if(!e)return;e.querySelector(`[data-action="backup-settings"]`)?.addEventListener(`click`,()=>this.openBackupDialog());let t=e.querySelector(`.settings__restore-input`);e.querySelector(`[data-action="restore-settings"]`)?.addEventListener(`click`,()=>{t instanceof HTMLInputElement&&(t.value=``,t.click())}),t?.addEventListener(`change`,e=>{let t=e.target;if(!(t instanceof HTMLInputElement))return;let n=t.files?.[0]||null;n&&(this.pendingRestoreFile=n,this.openRestoreDialog(n.name))}),e.querySelector(`[data-action="clear-settings"]`)?.addEventListener(`click`,()=>this.openClearDialog()),e.querySelector(`[data-action="cancel-backup-settings"]`)?.addEventListener(`click`,()=>this.closeDialog(`.settings__backup-dialog`)),e.querySelector(`[data-action="confirm-backup-settings"]`)?.addEventListener(`click`,()=>{this.confirmBackup()}),e.querySelector(`[data-action="cancel-restore-settings"]`)?.addEventListener(`click`,()=>{this.pendingRestoreFile=null,this.closeDialog(`.settings__restore-dialog`)}),e.querySelector(`[data-action="confirm-restore-settings"]`)?.addEventListener(`click`,()=>{this.confirmRestore()}),e.querySelector(`[data-action="cancel-clear-settings"]`)?.addEventListener(`click`,()=>this.closeDialog(`.settings__clear-dialog`)),e.querySelector(`[data-action="confirm-clear-settings"]`)?.addEventListener(`click`,()=>{this.confirmClear()}),e.querySelector(`[data-action="save-assistant-name"]`)?.addEventListener(`click`,()=>this.saveAssistantName()),e.querySelector(`[data-setting="activity-log-disk-logging-toggle"]`)?.addEventListener(`change`,e=>{let t=e.target;t&&this.onActivityLogDiskLoggingToggle(t.checked)}),e.querySelector(`[data-setting="sidebar-hide-pages-toggle"]`)?.addEventListener(`change`,e=>{let t=e.target;t&&this.onSidebarHidePagesToggle(t.checked)}),e.querySelector(`[data-setting="sidebar-hide-chat-toggle"]`)?.addEventListener(`change`,e=>{let t=e.target;t&&this.onSidebarHideChatToggle(t.checked)}),e.querySelector(`[data-setting="sidebar-hide-tasks-toggle"]`)?.addEventListener(`change`,e=>{let t=e.target;t&&this.onSidebarHideTasksToggle(t.checked)}),e.querySelector(`[data-setting="sidebar-hide-files-toggle"]`)?.addEventListener(`change`,e=>{let t=e.target;t&&this.onSidebarHideFilesToggle(t.checked)}),e.querySelector(`[data-setting="chat-split-view-toggle"]`)?.addEventListener(`change`,e=>{let t=e.target;t&&this.onChatSplitViewToggle(t.checked)}),e.querySelector(`[data-setting="pages-auto-refresh-input"]`)?.addEventListener(`change`,e=>{let t=e.target;if(t){let e=parseInt(t.value,10);this.onPagesAutoRefreshInputChange(isNaN(e)?0:e)}}),e.querySelector(`[data-setting="override-prerender-skeleton-toggle"]`)?.addEventListener(`change`,e=>{let t=e.target;t&&this.onOverridePrerenderSkeletonToggle(t.checked)}),e.querySelector(`[data-action="save-dom-allowed-iframe-hosts"]`)?.addEventListener(`click`,()=>{this.saveDomAllowedIframeHosts()})}closeDialog(e){this.getDialog(e)?.close()}getDialog(e){let t=this.shadowRoot;if(!t)return null;let n=t.querySelector(e);return n instanceof HTMLDialogElement?n:null}handleTabKeydown(e,t){let n=this.shadowRoot;if(!n)return;let r=Array.from(n.querySelectorAll(`[data-tab-target]`)),i=r.indexOf(t);if(i<0)return;let a=-1;switch(e.key){case`ArrowRight`:case`ArrowDown`:a=(i+1)%r.length;break;case`ArrowLeft`:case`ArrowUp`:a=(i-1+r.length)%r.length;break;case`Home`:a=0;break;case`End`:a=r.length-1;break;default:return}e.preventDefault();let o=r[a];o.focus(),this.activateTab(o.dataset.tabTarget)}openBackupDialog(){let e=this.shadowRoot?.querySelector(`[data-setting="include-plaintext-passwords"]`);e instanceof HTMLInputElement&&(e.checked=!1),this.showDialog(`.settings__backup-dialog`)}openClearDialog(){this.showDialog(`.settings__clear-dialog`)}openRestoreDialog(e){let t=this.shadowRoot?.querySelector(`[data-info="restore-filename"]`);t instanceof HTMLElement&&(t.textContent=`Selected file: ${e}`),this.showDialog(`.settings__restore-dialog`)}showDialog(e){let t=this.getDialog(e);if(t){if(typeof t.showModal==`function`){t.showModal();return}t.setAttribute(`open`,``)}}async confirmBackup(){if(!this.db){f(`Settings database is unavailable`,5e3);return}let e=this.shadowRoot?.querySelector(`[data-setting="include-plaintext-passwords"]`),t=e instanceof HTMLInputElement&&e.checked;try{if(t){let e=await this.promptForPlaintextBackupHandle();if(!e)return;await b(e,await this.getAllConfigEntries(),t),this.closeDialog(`.settings__backup-dialog`),d(`Settings backup saved`,3e3);return}let e=await y(await this.getAllConfigEntries(),t),n=URL.createObjectURL(e),r=document.createElement(`a`);r.href=n,r.download=`shadowclaw-settings-backup-${Date.now()}.json`,document.body.appendChild(r),r.click(),document.body.removeChild(r),URL.revokeObjectURL(n),this.closeDialog(`.settings__backup-dialog`),d(`Settings backup downloaded`,3e3)}catch(e){f(`Failed to backup settings: ${e instanceof Error?e.message:String(e)}`,6e3)}}async confirmClear(){if(!this.db){f(`Settings database is unavailable`,5e3);return}try{await this.replaceConfigEntries([]),this.closeDialog(`.settings__clear-dialog`),u(`Settings cleared. Reloading app...`,3200),setTimeout(()=>{window.location.reload()},250)}catch(e){f(`Failed to clear settings: ${e instanceof Error?e.message:String(e)}`,6e3)}}async confirmRestore(){if(!this.db){f(`Settings database is unavailable`,5e3);return}let e=this.pendingRestoreFile;if(!e){f(`No backup file selected`,4e3);return}try{let t=S(await e.text()),n=await x(t.configEntries,t.plaintextPasswords||[]);await this.replaceConfigEntries(n),this.pendingRestoreFile=null,this.closeDialog(`.settings__restore-dialog`),d(`Settings restored. Reloading app...`,3200),setTimeout(()=>{window.location.reload()},250)}catch(e){f(`Failed to restore settings: ${e instanceof Error?e.message:String(e)}`,6e3)}}async getAllConfigEntries(){if(!this.db)throw Error(`Database is unavailable`);return await new Promise((e,t)=>{try{let n=this.db?.transaction(`config`,`readonly`);if(!n){t(Error(`Failed to open read transaction`));return}let r=n.objectStore(`config`).getAll();r.onsuccess=()=>{e((Array.isArray(r.result)?r.result:[]).filter(e=>e&&typeof e.key==`string`).map(e=>({key:e.key,value:e.value})))},r.onerror=()=>{t(r.error||Error(`Failed to read settings config`))}}catch(e){t(e)}})}async onActivityLogDiskLoggingToggle(t){if(this.db)try{let{setConfig:n}=await import(`./setConfig-DFMYnYLE.js`).then(e=>e.n);await n(this.db,e.ACTIVITY_LOG_DISK_LOGGING_ENABLED,t?`true`:`false`),d(t?`Activity log disk logging enabled`:`Activity log disk logging disabled`,2500)}catch(e){f(`Error saving activity log disk logging setting: `+(e instanceof Error?e.message:String(e)),6e3)}}async onChatSplitViewToggle(t){if(this.db)try{let{setConfig:n}=await import(`./setConfig-DFMYnYLE.js`).then(e=>e.n);await n(this.db,e.CHAT_SPLIT_VIEW_ENABLED,t?`true`:`false`),this.dispatchEvent(new CustomEvent(`chat-split-view-change`,{detail:{enabled:t},bubbles:!0,composed:!0})),d(t?`Horizontal Chat split view enabled`:`Horizontal Chat split view disabled`,2500)}catch(e){f(`Error saving Chat split view setting: `+(e instanceof Error?e.message:String(e)),6e3)}}async onOverridePrerenderSkeletonToggle(t){try{a(`shadow-claw-override-prerender-skeleton`,t?`true`:`false`)}catch(e){console.warn(`Unable to save setting to localStorage:`,e)}if(this.db)try{let{setConfig:n}=await import(`./setConfig-DFMYnYLE.js`).then(e=>e.n);await n(this.db,e.OVERRIDE_PRERENDER_SKELETON,t?`true`:`false`),d(t?`Pre-rendered content override enabled`:`Pre-rendered content override disabled`,2500)}catch(e){f(`Error saving pre-rendered content override setting: `+(e instanceof Error?e.message:String(e)),6e3)}}async onPagesAutoRefreshInputChange(t){if(!this.db)return;let n=Math.max(0,Math.min(t,86400));try{let{setConfig:t}=await import(`./setConfig-DFMYnYLE.js`).then(e=>e.n);await t(this.db,e.PAGES_AUTO_REFRESH_INTERVAL,String(n)),window.dispatchEvent(new CustomEvent(`shadow-claw-pages-auto-refresh-change`,{detail:{interval:n}})),d(n>0?`Pages auto refresh set to ${n}s`:`Pages auto refresh disabled`,2500)}catch(e){f(`Error saving Pages auto refresh interval: `+(e instanceof Error?e.message:String(e)),6e3)}}async onSidebarHideChatToggle(t){if(this.db)try{let{setConfig:n}=await import(`./setConfig-DFMYnYLE.js`).then(e=>e.n);await n(this.db,e.SIDEBAR_CHAT_HIDDEN,t?`true`:`false`),this.dispatchEvent(new CustomEvent(`sidebar-chat-visibility-change`,{detail:{hidden:t},bubbles:!0,composed:!0})),d(t?`Chat hidden in sidebar`:`Chat shown in sidebar`,2500)}catch(e){f(`Error saving sidebar Chat visibility: `+(e instanceof Error?e.message:String(e)),6e3)}}async onSidebarHideFilesToggle(t){if(this.db)try{let{setConfig:n}=await import(`./setConfig-DFMYnYLE.js`).then(e=>e.n);await n(this.db,e.SIDEBAR_FILES_HIDDEN,t?`true`:`false`),this.dispatchEvent(new CustomEvent(`sidebar-files-visibility-change`,{detail:{hidden:t},bubbles:!0,composed:!0})),d(t?`Files hidden in sidebar`:`Files shown in sidebar`,2500)}catch(e){f(`Error saving sidebar Files visibility: `+(e instanceof Error?e.message:String(e)),6e3)}}async onSidebarHidePagesToggle(t){if(this.db)try{let{setConfig:n}=await import(`./setConfig-DFMYnYLE.js`).then(e=>e.n);await n(this.db,e.SIDEBAR_PAGES_HIDDEN,t?`true`:`false`),this.dispatchEvent(new CustomEvent(`sidebar-pages-visibility-change`,{detail:{hidden:t},bubbles:!0,composed:!0})),d(t?`Pages hidden in sidebar`:`Pages shown in sidebar`,2500)}catch(e){f(`Error saving sidebar Pages visibility: `+(e instanceof Error?e.message:String(e)),6e3)}}async onSidebarHideTasksToggle(t){if(this.db)try{let{setConfig:n}=await import(`./setConfig-DFMYnYLE.js`).then(e=>e.n);await n(this.db,e.SIDEBAR_TASKS_HIDDEN,t?`true`:`false`),this.dispatchEvent(new CustomEvent(`sidebar-tasks-visibility-change`,{detail:{hidden:t},bubbles:!0,composed:!0})),d(t?`Tasks hidden in sidebar`:`Tasks shown in sidebar`,2500)}catch(e){f(`Error saving sidebar Tasks visibility: `+(e instanceof Error?e.message:String(e)),6e3)}}async populateAssistantSettings(){let t=this.shadowRoot;if(!t||!this.db)return;let n=t.querySelector(`[data-setting="assistant-name-input"]`);if(n){let{getConfig:t}=await import(`./getConfig-D89uJgo5.js`).then(e=>e.n),r=await t(this.db,e.ASSISTANT_NAME),i=this.orchestrator?.assistantName||s.orchestrator?.assistantName;n.value=typeof r==`string`&&r||i||`ShadowClaw`}let{getConfig:r}=await import(`./getConfig-D89uJgo5.js`).then(e=>e.n),o=await r(this.db,e.ACTIVITY_LOG_DISK_LOGGING_ENABLED),c=o===!0||o===`true`||o===1||o===`1`,l=t.querySelector(`[data-setting="activity-log-disk-logging-toggle"]`);l&&(l.checked=c);let u=await r(this.db,e.SIDEBAR_PAGES_HIDDEN),d=u===!0||u===`true`||u===1||u===`1`,f=t.querySelector(`[data-setting="sidebar-hide-pages-toggle"]`);f&&(f.checked=d);let p=await r(this.db,e.SIDEBAR_CHAT_HIDDEN),h=p===!0||p===`true`||p===1||p===`1`,g=t.querySelector(`[data-setting="sidebar-hide-chat-toggle"]`);g&&(g.checked=h);let _=await r(this.db,e.SIDEBAR_TASKS_HIDDEN),v=_===!0||_===`true`||_===1||_===`1`,y=t.querySelector(`[data-setting="sidebar-hide-tasks-toggle"]`);y&&(y.checked=v);let b=await r(this.db,e.SIDEBAR_FILES_HIDDEN),x=b===!0||b===`true`||b===1||b===`1`,S=t.querySelector(`[data-setting="sidebar-hide-files-toggle"]`);S&&(S.checked=x);let C=m(await r(this.db,e.CHAT_SPLIT_VIEW_ENABLED),!1),w=t.querySelector(`[data-setting="chat-split-view-toggle"]`);w&&(w.checked=C);let T=t.querySelector(`[data-setting="pages-auto-refresh-input"]`);if(T){let t=await r(this.db,e.PAGES_AUTO_REFRESH_INTERVAL);if(typeof t==`string`||typeof t==`number`){let e=parseInt(String(t),10);T.value=!isNaN(e)&&e>=0?String(e):`0`}else T.value=`0`}let E=await r(this.db,e.OVERRIDE_PRERENDER_SKELETON),D=null;try{D=i(`shadow-claw-override-prerender-skeleton`)}catch{}let O=!0;if(E==null?D!==null&&(O=D===`true`):O=m(E),O)try{a(`shadow-claw-override-prerender-skeleton`,`true`)}catch{}let k=t.querySelector(`[data-setting="override-prerender-skeleton-toggle"]`);k&&(k.checked=O);let A=t.querySelector(`[data-setting="dom-allowed-iframe-hosts"]`);if(A){let t=await r(this.db,e.ALLOWED_IFRAME_HOST_PATTERNS);if(typeof t==`string`&&t.trim().length>0){A.value=t;let{setAllowedIframeHostPatterns:e}=await import(`./iframe-sanitizer-0NS4XLOd.js`).then(e=>e.r);e(t)}else{let{DEFAULT_ALLOWED_IFRAME_HOST_PATTERNS:e}=await import(`./iframe-sanitizer-0NS4XLOd.js`).then(e=>e.r);A.value=e.join(`
882
882
  `)}}let j=t.querySelector(`[data-setting="markdown-frontmatter-pages-toggle"]`);j&&(j.checked=m(await r(this.db,e.MARKDOWN_FRONTMATTER_PAGES),!0));let M=t.querySelector(`[data-setting="markdown-frontmatter-file-viewer-toggle"]`);M&&(M.checked=m(await r(this.db,e.MARKDOWN_FRONTMATTER_FILE_VIEWER),!0));let N=t.querySelector(`[data-setting="markdown-frontmatter-chat-toggle"]`);N&&(N.checked=m(await r(this.db,e.MARKDOWN_FRONTMATTER_CHAT),!0));let P=t.querySelector(`[data-setting="markdown-frontmatter-tasks-toggle"]`);P&&(P.checked=m(await r(this.db,e.MARKDOWN_FRONTMATTER_TASKS),!0))}async promptForPlaintextBackupHandle(){let e=Reflect.get(globalThis,`showSaveFilePicker`),t=typeof e==`function`?e.bind(globalThis):null;if(!t)throw Error(`Plaintext settings backup requires the File System Access API.`);try{return await t({id:`shadowclaw-settings-backup`,suggestedName:`shadowclaw-settings-backup-${n()}.json`,types:[{description:`JSON Files`,accept:{"application/json":[`.json`]}}]})}catch(e){if(e instanceof Error&&e.name===`AbortError`)return null;throw e}}async render(){let e=this.shadowRoot;if(!e)return;e.querySelector(`[data-action="show-channels-config"]`)?.addEventListener(`click`,()=>{this.dispatchEvent(new CustomEvent(`navigate`,{detail:{page:`channels`},bubbles:!0,composed:!0}))}),e.querySelector(`[data-action="show-tools-config"]`)?.addEventListener(`click`,()=>{this.dispatchEvent(new CustomEvent(`navigate`,{detail:{page:`tools`},bubbles:!0,composed:!0}))}),e.querySelectorAll(`[data-tab-target]`).forEach(e=>{e.addEventListener(`click`,()=>{this.activateTab(e.dataset.tabTarget)}),e.addEventListener(`keydown`,t=>{this.handleTabKeydown(t,e)})}),this.applyTabState(),this.bindSettingsActions();let t=e.querySelector(`[data-info="deployed-revision"]`);t&&(t.textContent=`Deployed revision: ${document.querySelector(`meta[name="revision"]`)?.getAttribute(`content`)?.trim()||`unknown`}`),await this.populateAssistantSettings()}async replaceConfigEntries(e){if(!this.db)throw Error(`Database is unavailable`);await new Promise((t,n)=>{try{let r=this.db?.transaction(`config`,`readwrite`);if(!r){n(Error(`Failed to open write transaction`));return}let i=r.objectStore(`config`);i.clear();for(let t of e)i.put({key:t.key,value:t.value});r.oncomplete=()=>t(),r.onerror=()=>n(r.error||Error(`Failed to update config`)),r.onabort=()=>n(r.error||Error(`Config update aborted`))}catch(e){n(e)}})}async saveAssistantName(){if(!this.db)return;let t=this.shadowRoot;if(!t)return;let n=t.querySelector(`[data-setting="assistant-name-input"]`);if(!n)return;let i=n.value.trim();if(!i){let{showWarning:e}=await import(`./toast-D3gxhZpN.js`).then(e=>e.o);e(`Please enter a name`,3e3);return}a(`assistantName`,i);try{let t=this.orchestrator||s.orchestrator;if(t)this.orchestrator=t,await r(t,this.db,i);else{let{setConfig:t}=await import(`./setConfig-DFMYnYLE.js`).then(e=>e.n);await t(this.db,e.ASSISTANT_NAME,i)}}catch(e){console.warn(`Could not update orchestrator:`,e)}d(`Assistant name saved`,3e3)}async saveDomAllowedIframeHosts(){let t=this.shadowRoot;if(!t||!this.db)return;let n=t.querySelector(`[data-setting="dom-allowed-iframe-hosts"]`);if(!n)return;let r=n.value.split(`
883
883
  `).map(e=>e.trim()).filter(e=>e.length>0),i=t.querySelector(`[data-setting="markdown-frontmatter-pages-toggle"]`),a=t.querySelector(`[data-setting="markdown-frontmatter-file-viewer-toggle"]`),o=t.querySelector(`[data-setting="markdown-frontmatter-chat-toggle"]`),s=t.querySelector(`[data-setting="markdown-frontmatter-tasks-toggle"]`);try{let{setConfig:t}=await import(`./setConfig-DFMYnYLE.js`).then(e=>e.n),n=r.join(`
884
- `);await t(this.db,e.ALLOWED_IFRAME_HOST_PATTERNS,n),await t(this.db,e.MARKDOWN_FRONTMATTER_PAGES,String(i?.checked??!0)),await t(this.db,e.MARKDOWN_FRONTMATTER_FILE_VIEWER,String(a?.checked??!0)),await t(this.db,e.MARKDOWN_FRONTMATTER_CHAT,String(o?.checked??!0)),await t(this.db,e.MARKDOWN_FRONTMATTER_TASKS,String(s?.checked??!0));let{setAllowedIframeHostPatterns:c}=await import(`./iframe-sanitizer-L6Jyu__Z.js`).then(e=>e.r);c(r),d(`DOM iframe embed settings saved`,2500)}catch(e){f(`Error saving DOM iframe embed settings: `+(e instanceof Error?e.message:String(e)),6e3)}}};customElements.get(j)||customElements.define(j,M);export{M as ShadowClawSettings};
884
+ `);await t(this.db,e.ALLOWED_IFRAME_HOST_PATTERNS,n),await t(this.db,e.MARKDOWN_FRONTMATTER_PAGES,String(i?.checked??!0)),await t(this.db,e.MARKDOWN_FRONTMATTER_FILE_VIEWER,String(a?.checked??!0)),await t(this.db,e.MARKDOWN_FRONTMATTER_CHAT,String(o?.checked??!0)),await t(this.db,e.MARKDOWN_FRONTMATTER_TASKS,String(s?.checked??!0));let{setAllowedIframeHostPatterns:c}=await import(`./iframe-sanitizer-0NS4XLOd.js`).then(e=>e.r);c(r),d(`DOM iframe embed settings saved`,2500)}catch(e){f(`Error saving DOM iframe embed settings: `+(e instanceof Error?e.message:String(e)),6e3)}}};customElements.get(j)||customElements.define(j,M);export{M as ShadowClawSettings};
@@ -0,0 +1,219 @@
1
+ import{r as e}from"./config-BYAuxx3j.js";import{n as t}from"./txPromise-EBECky1b.js";import{t as n}from"./getConfig-D89uJgo5.js";import{u as r}from"./custom-element-security-DdYlUozq.js";import{Dn as i,en as a,t as o,tn as s}from"./orchestrator-DRfEudXk.js";import{t as c}from"./setConfig-DFMYnYLE.js";import{a as l,r as u,t as d}from"./toast-D3gxhZpN.js";import{t as f}from"./shadow-claw-element-DIrv3P6A.js";import{t as p}from"./effect-BEsuusE8.js";import{t as m}from"./config-value-oBfKgLT4.js";async function h(){try{if(typeof navigator<`u`&&navigator.storage&&navigator.storage.estimate){let e=await navigator.storage.estimate();return{usage:e.usage||0,quota:e.quota||0}}}catch(e){console.warn(`Failed to get storage estimate:`,e)}return{usage:0,quota:0}}async function g(){try{if(typeof navigator<`u`&&navigator.storage&&navigator.storage.persisted)return await navigator.storage.persisted()}catch(e){console.warn(`Failed to check persistent storage:`,e)}return!1}async function _(){try{if(typeof navigator<`u`&&navigator.storage&&navigator.storage.persist)return await navigator.storage.persist()}catch(e){console.warn(`Failed to request persistent storage:`,e)}return!1}async function v(t){let n=Reflect.get(globalThis,`showDirectoryPicker`),r=typeof n==`function`?n.bind(globalThis):null;if(!r)throw Error(`Local folder picker is unavailable in this browser/context.`);try{let n=await r({mode:`readwrite`,id:`shadowclaw-storage`});return await c(t,e.STORAGE_HANDLE,n),await s(t),await a(t),!0}catch(e){if(e instanceof Error&&e.name===`AbortError`)return!1;throw e}}const y=new CSSStyleSheet;y.replaceSync(`*,
2
+ *::before,
3
+ *::after {
4
+ font-family: var(--shadow-claw-font-sans);
5
+ }
6
+
7
+ :host {
8
+ display: block;
9
+ }
10
+
11
+ .settings-section {
12
+ margin-bottom: 1.75rem;
13
+ }
14
+
15
+ .settings-section h3 {
16
+ align-items: center;
17
+ display: flex;
18
+ font-size: 1rem;
19
+ font-weight: 600;
20
+ gap: 0.5rem;
21
+ margin-bottom: 0.75rem;
22
+ }
23
+
24
+ .form-group {
25
+ margin-bottom: 1rem;
26
+ }
27
+
28
+ .form-label {
29
+ color: var(--shadow-claw-text-primary);
30
+ display: block;
31
+ font-size: 0.8125rem;
32
+ font-weight: 500;
33
+ margin-bottom: 0.375rem;
34
+ }
35
+
36
+ .form-helper {
37
+ color: var(--shadow-claw-text-tertiary);
38
+ font-size: 0.75rem;
39
+ margin-top: 0.25rem;
40
+ }
41
+
42
+ .hidden,
43
+ [hidden] {
44
+ display: none !important;
45
+ }
46
+
47
+ .storage-header {
48
+ display: flex;
49
+ font-size: 0.8125rem;
50
+ justify-content: space-between;
51
+ margin-bottom: 0.375rem;
52
+ }
53
+
54
+ .opacity-60 {
55
+ opacity: 0.6;
56
+ }
57
+
58
+ .storage-progress-container {
59
+ background-color: var(--shadow-claw-bg-tertiary);
60
+ border-radius: 0.25rem;
61
+ height: 0.5rem;
62
+ margin-bottom: 0.75rem;
63
+ overflow: hidden;
64
+ width: 100%;
65
+ }
66
+
67
+ .storage-progress-bar {
68
+ background-color: var(--shadow-claw-accent-primary);
69
+ height: 100%;
70
+ transition: width 0.3s;
71
+ width: 0%;
72
+ }
73
+
74
+ .storage-info-row {
75
+ align-items: center;
76
+ display: flex;
77
+ font-size: var(--shadow-claw-font-size-sm);
78
+ gap: 0.5rem;
79
+ margin-bottom: 0.5rem;
80
+ }
81
+
82
+ .storage-badge {
83
+ border-radius: 0.25rem;
84
+ display: none;
85
+ font-size: 0.6875rem;
86
+ font-weight: 600;
87
+ padding: 0.125rem 0.375rem;
88
+ }
89
+
90
+ .persistent-badge {
91
+ background-color: var(--shadow-claw-success-color);
92
+ border-radius: 0.25rem;
93
+ color: white;
94
+ display: none;
95
+ font-size: 0.6875rem;
96
+ font-weight: 600;
97
+ padding: 0.125rem 0.375rem;
98
+ }
99
+
100
+ .storage-buttons {
101
+ display: flex;
102
+ flex-wrap: wrap;
103
+ gap: 0.5rem;
104
+ }
105
+
106
+ .settings-btn {
107
+ background-color: transparent;
108
+ border: 0.0625rem solid var(--shadow-claw-border-color);
109
+ border-radius: 62.5rem;
110
+ color: var(--shadow-claw-text-secondary);
111
+ cursor: pointer;
112
+ font-size: 0.8125rem;
113
+ padding: 0.625rem 0.75rem;
114
+ transition: all 150ms cubic-bezier(0.33, 1, 0.68, 1);
115
+ width: auto;
116
+ }
117
+
118
+ .settings-btn:hover {
119
+ border-color: var(--shadow-claw-text-primary);
120
+ box-shadow: 0 0.625rem 1.875rem 0 rgba(0, 0, 0, 0.08);
121
+ color: var(--shadow-claw-text-primary);
122
+ }
123
+
124
+ .grant-storage-btn {
125
+ background-color: var(--shadow-claw-text-primary);
126
+ border-color: var(--shadow-claw-text-primary);
127
+ color: var(--shadow-claw-bg-primary);
128
+ }
129
+
130
+ .grant-storage-btn:hover {
131
+ background-color: var(--shadow-claw-accent-primary);
132
+ border-color: var(--shadow-claw-accent-primary);
133
+ color: var(--shadow-claw-on-primary);
134
+ }
135
+
136
+ .reset-storage-btn {
137
+ border-color: var(--shadow-claw-error-color);
138
+ color: var(--shadow-claw-error-color);
139
+ }
140
+ `);const b=new DOMParser().parseFromString(`<template>
141
+ <div class="settings-section">
142
+ <h3>💾 Storage</h3>
143
+ <div class="form-group">
144
+ <div class="storage-header">
145
+ <span data-info="storage-usage">0 B used</span>
146
+ <span class="opacity-60" data-info="storage-quota">of 0 B</span>
147
+ </div>
148
+ <div class="storage-progress-container">
149
+ <div class="storage-progress-bar" data-info="storage-progress"></div>
150
+ </div>
151
+ </div>
152
+
153
+ <div class="form-group">
154
+ <label class="form-label">Storage Type</label>
155
+ <div class="storage-info-row">
156
+ <span data-info="storage-type">Browser Internal (OPFS)</span>
157
+ <span class="storage-badge" data-info="storage-status-badge"></span>
158
+ <span class="persistent-badge" data-info="storage-persistent-badge">
159
+ PERSISTENT
160
+ </span>
161
+ </div>
162
+ <div class="storage-buttons">
163
+ <button
164
+ class="grant-storage-btn hidden settings-btn"
165
+ data-action="grant-storage-permission"
166
+ >
167
+ 🔓 Grant Permission
168
+ </button>
169
+ <button class="settings-btn" data-action="request-persistent">
170
+ 🔒 Request Persistent
171
+ </button>
172
+ <button class="settings-btn" data-action="change-storage-dir">
173
+ 📁 Change Location
174
+ </button>
175
+ <button
176
+ class="reset-storage-btn settings-btn"
177
+ data-action="reset-storage-dir"
178
+ >
179
+ ♻️ Reset to Default
180
+ </button>
181
+ <button class="settings-btn" data-action="reset-site-config">
182
+ ♻️ Reset Site Config
183
+ </button>
184
+ </div>
185
+ <div class="form-helper" data-info="storage-help-general">
186
+ Persistent storage prevents the browser from deleting your chat history
187
+ and configuration when disk space is low.
188
+ <b>Note:</b> Browsers often only grant this if you bookmark the site or
189
+ use it frequently.
190
+ </div>
191
+ <div class="form-helper" data-info="storage-help-local">
192
+ You can use a local folder on your computer for storage. This makes
193
+ files directly accessible on your disk.
194
+ </div>
195
+ </div>
196
+
197
+ <div class="form-group">
198
+ <div class="form-toggle">
199
+ <input
200
+ data-setting="files-upload-append-ulid-toggle"
201
+ id="files-upload-append-ulid-toggle"
202
+ type="checkbox"
203
+ />
204
+ <label class="form-label" for="files-upload-append-ulid-toggle">
205
+ Append unique ID (ULID) to uploaded file names
206
+ </label>
207
+ </div>
208
+ <div class="form-helper">
209
+ When enabled, uploads automatically prefix file names with a ULID (e.g.
210
+ 01J...-filename.ext). Default: disabled.
211
+ </div>
212
+ </div>
213
+ </div>
214
+ </template>
215
+ `,`text/html`),x=b.querySelector(`template`);let S=[];S=x?Array.from(x.content.children):Array.from(b.head.children).concat(Array.from(b.body.children));var C=S;const w=`shadow-claw-storage`;var T=class extends f{static styles=y;static template=C;db=null;constructor(){super()}async connectedCallback(){if(!this.shadowRoot)throw Error(`shadowRoot not found`);this.db=await t(),this.bindEventListeners(),this.setupEffects(),await this.updateStorageInfo()}disconnectedCallback(){super.disconnectedCallback()}bindEventListeners(){let e=this.shadowRoot;e&&(e.querySelector(`[data-action="request-persistent"]`)?.addEventListener(`click`,()=>this.handleRequestPersistent()),e.querySelector(`[data-action="change-storage-dir"]`)?.addEventListener(`click`,()=>this.handleChangeStorageDir()),e.querySelector(`[data-action="reset-storage-dir"]`)?.addEventListener(`click`,()=>this.handleResetStorageDir()),e.querySelector(`[data-action="reset-site-config"]`)?.addEventListener(`click`,()=>this.handleResetSiteConfig()),e.querySelector(`[data-action="grant-storage-permission"]`)?.addEventListener(`click`,()=>{this.db&&o.grantStorageAccess(this.db)}),e.querySelector(`[data-setting="files-upload-append-ulid-toggle"]`)?.addEventListener(`change`,e=>{let t=e.target;t&&this.onUploadAppendUlidToggle(t.checked)}))}formatBytes(e){if(e===0)return`0 B`;let t=1024,n=[`B`,`KB`,`MB`,`GB`,`TB`],r=Math.floor(Math.log(e)/Math.log(t));return parseFloat((e/t**r).toFixed(1))+` `+n[r]}setupEffects(){let e=this.shadowRoot;e&&this.addCleanup(p(()=>{let t=o.storageStatus;if(!t)return;let n=e.querySelector(`[data-info="storage-type"]`),r=e.querySelector(`[data-info="storage-status-badge"]`),i=e.querySelector(`[data-action="grant-storage-permission"]`);n&&(n.textContent=t.type===`local`?`Local Directory`:`Browser Internal (OPFS)`),r&&(r.style.display=t.type===`local`?`inline-block`:`none`,t.type===`local`&&(r.textContent=t.permission===`granted`?`CONNECTED`:`NEEDS PERMISSION`,r.style.backgroundColor=t.permission===`granted`?`var(--shadow-claw-success-color)`:`var(--shadow-claw-error-color)`,r.style.color=`white`)),i&&(i.style.display=t.type===`local`&&t.permission!==`granted`?`inline-block`:`none`)}))}async handleChangeStorageDir(){if(this.db)try{await v(this.db)&&(u(`Storage location changed. Existing OPFS files were not moved.`,4500),await this.updateStorageInfo(),await o.loadFiles(this.db))}catch(e){d(`Failed to change storage location: ${e instanceof Error?e.message:String(e)}`,6e3)}}async handleRequestPersistent(){if(this.db)try{await _()?u(`Persistent storage granted`,3500):l(`Persistent storage was not granted. Browsers may deny this based on site usage.`,5500),await this.updateStorageInfo()}catch(e){d(`Storage request failed: ${e instanceof Error?e.message:String(e)}`,6e3)}}async handleResetSiteConfig(){if(this.db&&await this.requestConfirmation({title:`Reset Site Config`,message:`Allow embedded site-config.json defaults to apply again after the next reload?`,confirmLabel:`Reset`,cancelLabel:`Cancel`}))try{await o.resetSiteConfigSeed(this.db),u(`Site config reset. Reload to apply its defaults again.`,5e3)}catch(e){d(`Failed to reset site config: ${e instanceof Error?e.message:String(e)}`,6e3)}}async onUploadAppendUlidToggle(t){if(this.db)try{let{setConfig:n}=await import(`./setConfig-DFMYnYLE.js`).then(e=>e.n);await n(this.db,e.FILES_UPLOAD_APPEND_ULID,t?`true`:`false`),u(t?`Unique ID prefix on file upload enabled`:`Unique ID prefix on file upload disabled`,2500)}catch(e){d(`Error saving unique ID file upload setting: `+(e instanceof Error?e.message:String(e)),6e3)}}async handleResetStorageDir(){if(this.db&&await this.requestConfirmation({title:`Reset Storage Location`,message:`Revert storage to browser-internal (OPFS)?`,confirmLabel:`Revert`,cancelLabel:`Cancel`}))try{await i(this.db),u(`Reverted to browser-internal storage`,3500),await this.updateStorageInfo(),await o.loadFiles(this.db)}catch(e){d(`Failed to reset storage location: ${e instanceof Error?e.message:String(e)}`,6e3)}}async requestConfirmation(e){let t=document.querySelector(`shadow-claw`);return t&&typeof t.requestDialog==`function`?await t.requestDialog({mode:`confirm`,...e}):(l(e.message,4500),!1)}async updateStorageInfo(){if(!this.db)return;let t=this.shadowRoot;if(t)try{let i=await h(),a=this.formatBytes(i.usage),o=this.formatBytes(i.quota),s=i.quota>0?i.usage/i.quota*100:0,c=t.querySelector(`[data-info="storage-usage"]`),l=t.querySelector(`[data-info="storage-quota"]`),u=t.querySelector(`[data-info="storage-progress"]`),d=t.querySelector(`[data-info="storage-type"]`),f=t.querySelector(`[data-info="storage-persistent-badge"]`);c&&(c.textContent=`${a} used`),l&&(l.textContent=`of ${o}`),u&&(u.style.width=`${s}%`);let p=await n(this.db,e.STORAGE_HANDLE);d&&(d.textContent=p?`Local Directory`:`Browser Internal (OPFS)`);let _=await g();f&&(f.style.display=_?`inline-block`:`none`);let v=t.querySelector(`[data-info="storage-help-general"]`),y=t.querySelector(`[data-info="storage-help-local"]`);v&&r(v,p?`Persistent storage protects your <b>chat history, tasks, and settings</b> in the browser database.
216
+ Without it, the browser might clear this data if your disk is almost full.`:`Persistent storage protects your <b>files, chat history, and settings</b> in the browser.
217
+ Without it, the browser might clear your data if your disk is almost full.`),y&&r(y,p?`ShadowClaw is currently <b>connected to a local folder</b>. Your files are safe on your disk,
218
+ but browser persistence is still recommended for your chat history.`:`You can use a local folder on your computer for storage. This makes files directly accessible
219
+ on your disk and independent of browser storage limits.`);let b=t.querySelector(`[data-action="request-persistent"]`);b&&(b.disabled=_);let x=await n(this.db,e.FILES_UPLOAD_APPEND_ULID),S=t.querySelector(`[data-setting="files-upload-append-ulid-toggle"]`);S&&(S.checked=m(x,!1))}catch(e){console.warn(`Failed to update storage info:`,e)}}};customElements.get(w)||customElements.define(w,T);export{T as ShadowClawStorage};
@@ -1,4 +1,4 @@
1
- import{n as e}from"./txPromise-EBECky1b.js";import{b as t,t as n,y as r}from"./orchestrator-B9KmIj8Q.js";import{r as i,t as a}from"./toast-D3gxhZpN.js";import{t as o}from"./shadow-claw-element-DIrv3P6A.js";import{t as s}from"./effect-BEsuusE8.js";const c=new CSSStyleSheet;c.replaceSync(`*,
1
+ import{n as e}from"./txPromise-EBECky1b.js";import{b as t,t as n,y as r}from"./orchestrator-DRfEudXk.js";import{r as i,t as a}from"./toast-D3gxhZpN.js";import{t as o}from"./shadow-claw-element-DIrv3P6A.js";import{t as s}from"./effect-BEsuusE8.js";const c=new CSSStyleSheet;c.replaceSync(`*,
2
2
  *::before,
3
3
  *::after {
4
4
  font-family: var(--shadow-claw-font-sans);
@@ -1,4 +1,4 @@
1
- import{r as e}from"./config-AL77QAx4.js";import{n as t}from"./txPromise-EBECky1b.js";import{t as n}from"./getConfig-D89uJgo5.js";import{m as r,u as i}from"./custom-element-security-CZ92anB8.js";import{t as a}from"./orchestrator-B9KmIj8Q.js";import{n as o,r as s,t as c}from"./toast-D3gxhZpN.js";import{t as l}from"./shadow-claw-element-DIrv3P6A.js";import"./shadow-claw-empty-state-obMInUIf.js";import{t as u}from"./effect-BEsuusE8.js";import"./shadow-claw-page-header-action-button-Bmua3mAb.js";import"./shadow-claw-page-header-NeRD0tKU.js";import{t as d}from"./markdown-6MBrIo-S.js";import{t as f}from"./file-viewer-CCSABMsE.js";import{t as p}from"./config-value-oBfKgLT4.js";import"./shadow-claw-dialog-ByyHgxM9.js";const m=new CSSStyleSheet;m.replaceSync(`*,
1
+ import{r as e}from"./config-BYAuxx3j.js";import{n as t}from"./txPromise-EBECky1b.js";import{t as n}from"./getConfig-D89uJgo5.js";import{m as r,u as i}from"./custom-element-security-DdYlUozq.js";import{t as a}from"./orchestrator-DRfEudXk.js";import{n as o,r as s,t as c}from"./toast-D3gxhZpN.js";import{t as l}from"./shadow-claw-element-DIrv3P6A.js";import"./shadow-claw-empty-state-obMInUIf.js";import{t as u}from"./effect-BEsuusE8.js";import{t as d}from"./config-value-oBfKgLT4.js";import"./shadow-claw-page-header-action-button-Bmua3mAb.js";import"./shadow-claw-page-header-B63S4HTU.js";import{t as f}from"./markdown-CyYR4App.js";import{t as p}from"./file-viewer-CcZYw-PS.js";import"./shadow-claw-dialog-ByyHgxM9.js";const m=new CSSStyleSheet;m.replaceSync(`*,
2
2
  *::before,
3
3
  *::after {
4
4
  font-family: var(--shadow-claw-font-sans);
@@ -929,7 +929,7 @@ dialog::backdrop {
929
929
  </div>
930
930
  </section>
931
931
  </template>
932
- `,`text/html`),g=h.querySelector(`template`);let _=[];_=g?Array.from(g.content.children):Array.from(h.head.children).concat(Array.from(h.body.children));var v=_;const y=`shadow-claw-tasks`;async function b(e,t){if(!e||typeof e.transaction!=`function`)return!0;try{return p(await n(e,t),!0)}catch{return!0}}var x=class extends l{static styles=m;static template=v;editingTask=null;editingTools=[];renderFrontmatter=!0;tasks=[];_autoScrollActive=!1;_autoScrollSpeed=0;_draggedTaskId=null;_keyboardGrabbedId=null;_touchDraggedTaskId=null;_touchId=null;constructor(){super()}async connectedCallback(){let n=this.shadowRoot;if(!n)throw Error(`shadowRoot not found`);n.addEventListener(`click`,e=>{e instanceof MouseEvent&&t().then(t=>this.handlePreviewLinkClick(e,t)).catch(console.error)}),n.querySelector(`.tasks__backup-btn`)?.addEventListener(`click`,()=>this.handleBackup());let r=n.querySelector(`.tasks__restore-btn`),o=n.querySelector(`.tasks__hidden-restore`);r?.addEventListener(`click`,()=>{o instanceof HTMLInputElement&&o.click()}),o?.addEventListener(`change`,e=>{if(e.target instanceof HTMLInputElement){let n=e.target;t().then(e=>this.handleRestore(e,n)).catch(console.error)}}),n.querySelector(`.tasks__clear-btn`)?.addEventListener(`click`,()=>{t().then(e=>this.handleClearAll(e)).catch(console.error)}),n.querySelector(`.tasks__add-btn`)?.addEventListener(`click`,()=>this.handleAdd());let s=n.querySelector(`dialog`),c=n.querySelector(`.tasks__dialog-close`),l=n.querySelector(`.tasks__btn-cancel`),d=n.querySelector(`.tasks__dialog-form`);c?.addEventListener(`click`,()=>{s?.close()}),l?.addEventListener(`click`,()=>{s?.close()}),d?.addEventListener(`submit`,e=>{e.preventDefault(),d&&t().then(e=>this.handleEditSubmit(e,d)).catch(console.error)}),s?.addEventListener(`click`,e=>{e.target===s&&s.close()});let f=n.querySelector(`textarea[name='prompt']`),p=n.querySelector(`.tasks__preview`),m=n.querySelectorAll(`input[name='taskType']`),h=n.querySelector(`.tasks__prompt-group`),g=n.querySelector(`.tasks__tools-group`),_=n.querySelector(`.tasks__add-tool-btn`),v=async()=>{p instanceof HTMLElement&&((Array.from(m).find(e=>e.checked)?.getAttribute(`value`)||`prompt`)===`tools`?i(p,this.renderToolsPreview(this.editingTools)):f instanceof HTMLTextAreaElement&&i(p,await this.renderPreview(f.value)))};f?.addEventListener(`input`,v),m.forEach(e=>{e.addEventListener(`change`,e=>{e.target.value===`tools`?(h?.setAttribute(`style`,`display: none;`),g?.removeAttribute(`style`),f?.removeAttribute(`required`)):(g?.setAttribute(`style`,`display: none;`),h?.removeAttribute(`style`)),v()})}),_?.addEventListener(`click`,()=>{this.editingTools.push({name:``,input:{}}),this.renderToolsEditor(),v()});let y=await t();this.renderFrontmatter=await b(y,e.MARKDOWN_FRONTMATTER_TASKS);try{let e=await(await fetch(`https://cdn.jsdelivr.net/npm/highlight.js@11.9.0/styles/atom-one-dark.min.css`)).text(),t=new CSSStyleSheet;t.replaceSync(e),this.shadowRoot?.adoptedStyleSheets&&this.shadowRoot.adoptedStyleSheets.push(t)}catch(e){console.warn(`Failed to load highlight.js styles:`,e)}n.addEventListener(`dragover`,e=>{this._draggedTaskId!==null&&this._updateAutoScrollSpeed(e.clientY)}),n.addEventListener(`dragend`,()=>{this._stopAutoScroll()}),n.addEventListener(`drop`,()=>{this._stopAutoScroll()}),this.render(),this.dispatchTerminalSlotReady(),this.cleanup=u(()=>{a.tasks,this.updateTaskList(y)})}disconnectedCallback(){this.cleanup()}cleanup=()=>{};dispatchTerminalSlotReady(){this.dispatchEvent(new CustomEvent(`shadow-claw-terminal-slot-ready`,{bubbles:!0,composed:!0}))}escapeHtml(e){let t=document.createElement(`div`);return t.textContent=e,t.innerHTML}handleAdd(){this.editingTask=null,this.editingTools=[];let e=this.shadowRoot;if(!e)return;let t=e.querySelector(`dialog`),n=e.querySelector(`.tasks__dialog-form`),r=e.querySelector(`.tasks__dialog-title`),a=e.querySelector(`.tasks__dialog-submit`);if(!n||!(n instanceof HTMLFormElement))return;r&&(r.textContent=`Add Task`),a&&(a.textContent=`Add Task`),n.reset();let o=n.querySelector(`input[name='name']`);o instanceof HTMLInputElement&&(o.value=``);let s=n.querySelector(`input[name='taskType'][value='prompt']`);s&&(s.checked=!0,s.dispatchEvent(new Event(`change`))),this.renderToolsEditor();let c=e.querySelector(`.tasks__preview`);c instanceof HTMLElement&&this.renderPreview(``,!1).then(e=>{i(c,e)}),t?.showModal()}handleEdit(e){this.editingTask=e,this.editingTools=JSON.parse(JSON.stringify(e.tools||[]));let t=this.shadowRoot;if(!t)return;let n=t.querySelector(`dialog`),r=t.querySelector(`.tasks__dialog-form`),a=t.querySelector(`.tasks__dialog-title`),o=t.querySelector(`.tasks__dialog-submit`);if(!r||!(r instanceof HTMLFormElement))return;a&&(a.textContent=`Edit Task`),o&&(o.textContent=`Save Changes`);let s=r.querySelector(`input[name='name']`);s instanceof HTMLInputElement&&(s.value=e.name||``);let c=r.querySelector(`input[name='schedule']`),l=r.querySelector(`textarea[name='prompt']`);c instanceof HTMLInputElement&&(c.value=e.schedule||``),l instanceof HTMLTextAreaElement&&(l.value=e.prompt||``);let u=r.querySelector(`input[name='freshContext']`);u instanceof HTMLInputElement&&(u.checked=!!e.freshContext);let d=r.querySelector(`input[name='subagent']`);d instanceof HTMLInputElement&&(d.checked=!!e.subagent);let f=r.querySelector(`input[name='taskType'][value='${e.type||`prompt`}']`);f&&(f.checked=!0,f.dispatchEvent(new Event(`change`))),this.renderToolsEditor();let p=t.querySelector(`.tasks__preview`);p instanceof HTMLElement&&(e.type===`tools`?i(p,this.renderToolsPreview(this.editingTools)):this.renderPreview(e.prompt).then(e=>{i(p,e)})),n?.showModal()}handleRun(e){a.runTask(e,!0)}renderToolsEditor(){let e=this.shadowRoot;if(!e)return;let t=e.querySelector(`.tasks__tools-list`);t&&(t.innerHTML=``,this.editingTools.forEach((n,r)=>{let a=document.createElement(`div`);a.className=`tasks__tool-item`;let o=document.createElement(`div`);o.className=`tasks__tool-header`;let s=document.createElement(`div`);s.className=`tasks__tool-title`,s.textContent=`Tool ${r+1}`;let c=document.createElement(`button`);c.type=`button`,c.className=`tasks__tool-remove-btn`,c.textContent=`Remove`,c.addEventListener(`click`,()=>{this.editingTools.splice(r,1),this.renderToolsEditor();let t=e.querySelector(`.tasks__preview`);t&&i(t,this.renderToolsPreview(this.editingTools))}),o.appendChild(s),o.appendChild(c);let l=document.createElement(`input`);l.type=`text`,l.className=`tasks__form-input`,l.placeholder=`Tool Name (e.g. show_toast)`,l.value=n.name||``,l.addEventListener(`input`,t=>{n.name=t.target.value;let r=e.querySelector(`.tasks__preview`);r&&i(r,this.renderToolsPreview(this.editingTools))});let u=document.createElement(`textarea`);u.className=`tasks__form-textarea`,u.placeholder=`{
932
+ `,`text/html`),g=h.querySelector(`template`);let _=[];_=g?Array.from(g.content.children):Array.from(h.head.children).concat(Array.from(h.body.children));var v=_;const y=`shadow-claw-tasks`;async function b(e,t){if(!e||typeof e.transaction!=`function`)return!0;try{return d(await n(e,t),!0)}catch{return!0}}var x=class extends l{static styles=m;static template=v;editingTask=null;editingTools=[];renderFrontmatter=!0;tasks=[];_autoScrollActive=!1;_autoScrollSpeed=0;_draggedTaskId=null;_keyboardGrabbedId=null;_touchDraggedTaskId=null;_touchId=null;constructor(){super()}async connectedCallback(){let n=this.shadowRoot;if(!n)throw Error(`shadowRoot not found`);n.addEventListener(`click`,e=>{e instanceof MouseEvent&&t().then(t=>this.handlePreviewLinkClick(e,t)).catch(console.error)}),n.querySelector(`.tasks__backup-btn`)?.addEventListener(`click`,()=>this.handleBackup());let r=n.querySelector(`.tasks__restore-btn`),o=n.querySelector(`.tasks__hidden-restore`);r?.addEventListener(`click`,()=>{o instanceof HTMLInputElement&&o.click()}),o?.addEventListener(`change`,e=>{if(e.target instanceof HTMLInputElement){let n=e.target;t().then(e=>this.handleRestore(e,n)).catch(console.error)}}),n.querySelector(`.tasks__clear-btn`)?.addEventListener(`click`,()=>{t().then(e=>this.handleClearAll(e)).catch(console.error)}),n.querySelector(`.tasks__add-btn`)?.addEventListener(`click`,()=>this.handleAdd());let s=n.querySelector(`dialog`),c=n.querySelector(`.tasks__dialog-close`),l=n.querySelector(`.tasks__btn-cancel`),d=n.querySelector(`.tasks__dialog-form`);c?.addEventListener(`click`,()=>{s?.close()}),l?.addEventListener(`click`,()=>{s?.close()}),d?.addEventListener(`submit`,e=>{e.preventDefault(),d&&t().then(e=>this.handleEditSubmit(e,d)).catch(console.error)}),s?.addEventListener(`click`,e=>{e.target===s&&s.close()});let f=n.querySelector(`textarea[name='prompt']`),p=n.querySelector(`.tasks__preview`),m=n.querySelectorAll(`input[name='taskType']`),h=n.querySelector(`.tasks__prompt-group`),g=n.querySelector(`.tasks__tools-group`),_=n.querySelector(`.tasks__add-tool-btn`),v=async()=>{p instanceof HTMLElement&&((Array.from(m).find(e=>e.checked)?.getAttribute(`value`)||`prompt`)===`tools`?i(p,this.renderToolsPreview(this.editingTools)):f instanceof HTMLTextAreaElement&&i(p,await this.renderPreview(f.value)))};f?.addEventListener(`input`,v),m.forEach(e=>{e.addEventListener(`change`,e=>{e.target.value===`tools`?(h?.setAttribute(`style`,`display: none;`),g?.removeAttribute(`style`),f?.removeAttribute(`required`)):(g?.setAttribute(`style`,`display: none;`),h?.removeAttribute(`style`)),v()})}),_?.addEventListener(`click`,()=>{this.editingTools.push({name:``,input:{}}),this.renderToolsEditor(),v()});let y=await t();this.renderFrontmatter=await b(y,e.MARKDOWN_FRONTMATTER_TASKS);try{let e=await(await fetch(`https://cdn.jsdelivr.net/npm/highlight.js@11.9.0/styles/atom-one-dark.min.css`)).text(),t=new CSSStyleSheet;t.replaceSync(e),this.shadowRoot?.adoptedStyleSheets&&this.shadowRoot.adoptedStyleSheets.push(t)}catch(e){console.warn(`Failed to load highlight.js styles:`,e)}n.addEventListener(`dragover`,e=>{this._draggedTaskId!==null&&this._updateAutoScrollSpeed(e.clientY)}),n.addEventListener(`dragend`,()=>{this._stopAutoScroll()}),n.addEventListener(`drop`,()=>{this._stopAutoScroll()}),this.render(),this.dispatchTerminalSlotReady(),this.cleanup=u(()=>{a.tasks,this.updateTaskList(y)})}disconnectedCallback(){this.cleanup()}cleanup=()=>{};dispatchTerminalSlotReady(){this.dispatchEvent(new CustomEvent(`shadow-claw-terminal-slot-ready`,{bubbles:!0,composed:!0}))}escapeHtml(e){let t=document.createElement(`div`);return t.textContent=e,t.innerHTML}handleAdd(){this.editingTask=null,this.editingTools=[];let e=this.shadowRoot;if(!e)return;let t=e.querySelector(`dialog`),n=e.querySelector(`.tasks__dialog-form`),r=e.querySelector(`.tasks__dialog-title`),a=e.querySelector(`.tasks__dialog-submit`);if(!n||!(n instanceof HTMLFormElement))return;r&&(r.textContent=`Add Task`),a&&(a.textContent=`Add Task`),n.reset();let o=n.querySelector(`input[name='name']`);o instanceof HTMLInputElement&&(o.value=``);let s=n.querySelector(`input[name='taskType'][value='prompt']`);s&&(s.checked=!0,s.dispatchEvent(new Event(`change`))),this.renderToolsEditor();let c=e.querySelector(`.tasks__preview`);c instanceof HTMLElement&&this.renderPreview(``,!1).then(e=>{i(c,e)}),t?.showModal()}handleEdit(e){this.editingTask=e,this.editingTools=JSON.parse(JSON.stringify(e.tools||[]));let t=this.shadowRoot;if(!t)return;let n=t.querySelector(`dialog`),r=t.querySelector(`.tasks__dialog-form`),a=t.querySelector(`.tasks__dialog-title`),o=t.querySelector(`.tasks__dialog-submit`);if(!r||!(r instanceof HTMLFormElement))return;a&&(a.textContent=`Edit Task`),o&&(o.textContent=`Save Changes`);let s=r.querySelector(`input[name='name']`);s instanceof HTMLInputElement&&(s.value=e.name||``);let c=r.querySelector(`input[name='schedule']`),l=r.querySelector(`textarea[name='prompt']`);c instanceof HTMLInputElement&&(c.value=e.schedule||``),l instanceof HTMLTextAreaElement&&(l.value=e.prompt||``);let u=r.querySelector(`input[name='freshContext']`);u instanceof HTMLInputElement&&(u.checked=!!e.freshContext);let d=r.querySelector(`input[name='subagent']`);d instanceof HTMLInputElement&&(d.checked=!!e.subagent);let f=r.querySelector(`input[name='taskType'][value='${e.type||`prompt`}']`);f&&(f.checked=!0,f.dispatchEvent(new Event(`change`))),this.renderToolsEditor();let p=t.querySelector(`.tasks__preview`);p instanceof HTMLElement&&(e.type===`tools`?i(p,this.renderToolsPreview(this.editingTools)):this.renderPreview(e.prompt).then(e=>{i(p,e)})),n?.showModal()}handleRun(e){a.runTask(e,!0)}renderToolsEditor(){let e=this.shadowRoot;if(!e)return;let t=e.querySelector(`.tasks__tools-list`);t&&(t.innerHTML=``,this.editingTools.forEach((n,r)=>{let a=document.createElement(`div`);a.className=`tasks__tool-item`;let o=document.createElement(`div`);o.className=`tasks__tool-header`;let s=document.createElement(`div`);s.className=`tasks__tool-title`,s.textContent=`Tool ${r+1}`;let c=document.createElement(`button`);c.type=`button`,c.className=`tasks__tool-remove-btn`,c.textContent=`Remove`,c.addEventListener(`click`,()=>{this.editingTools.splice(r,1),this.renderToolsEditor();let t=e.querySelector(`.tasks__preview`);t&&i(t,this.renderToolsPreview(this.editingTools))}),o.appendChild(s),o.appendChild(c);let l=document.createElement(`input`);l.type=`text`,l.className=`tasks__form-input`,l.placeholder=`Tool Name (e.g. show_toast)`,l.value=n.name||``,l.addEventListener(`input`,t=>{n.name=t.target.value;let r=e.querySelector(`.tasks__preview`);r&&i(r,this.renderToolsPreview(this.editingTools))});let u=document.createElement(`textarea`);u.className=`tasks__form-textarea`,u.placeholder=`{
933
933
  "key": "value"
934
934
  }`;try{u.value=n.input&&Object.keys(n.input).length?JSON.stringify(n.input,null,2):``}catch{u.value=``}u.addEventListener(`change`,t=>{let r=t.target.value;if(!r.trim())n.input={};else try{n.input=JSON.parse(r),t.target.style.borderColor=``}catch{t.target.style.borderColor=`var(--shadow-claw-error-color)`}let a=e.querySelector(`.tasks__preview`);a&&i(a,this.renderToolsPreview(this.editingTools))});let d=document.createElement(`label`);d.className=`tasks__tool-suppress`;let f=document.createElement(`input`);f.type=`checkbox`,f.checked=!!n.suppressOutput,f.addEventListener(`change`,t=>{n.suppressOutput=t.target.checked;let r=e.querySelector(`.tasks__preview`);r&&i(r,this.renderToolsPreview(this.editingTools))}),d.appendChild(f),d.appendChild(document.createTextNode(` Suppress Output`));let p=document.createElement(`label`);p.className=`tasks__tool-suppress`;let m=document.createElement(`input`);m.type=`checkbox`,m.checked=!!n.suppressToast,m.addEventListener(`change`,t=>{n.suppressToast=t.target.checked;let r=e.querySelector(`.tasks__preview`);r&&i(r,this.renderToolsPreview(this.editingTools))}),p.appendChild(m),p.appendChild(document.createTextNode(` Suppress Toast`)),a.appendChild(o),a.appendChild(l),a.appendChild(u),a.appendChild(d),a.appendChild(p),t.appendChild(a)}))}renderToolsPreview(e,t=!1){if(!e||e.length===0)return`<span class="tasks__preview-empty">No tools configured</span>`;let n=e.map((e,t)=>{let n=`{}`;try{n=JSON.stringify(e.input,null,2)}catch{n=`Invalid JSON`}return`<div><strong>${t+1}. ${r(e.name||`Unnamed Tool`)}</strong><pre><code>${r(n)}</code></pre></div>`}).join(``);return t&&e.length>2?`
935
935
  <details class="tasks__content-details">
@@ -939,8 +939,8 @@ dialog::backdrop {
939
939
  </summary>
940
940
  <div class="tasks__prompt">${n}</div>
941
941
  </details>
942
- `:`<div class="tasks__prompt">${n}</div>`}resolveWorkspaceLinkPath(e){let t=e.trim();if(!t||t.startsWith(`#`))return null;let n=t;if(/^[a-zA-Z][a-zA-Z\d+.-]*:/.test(t)||t.startsWith(`//`)){let e;try{e=new URL(t,window.location.href)}catch{return null}if(!(e.protocol===`http:`||e.protocol===`https:`)||e.host!==window.location.host)return null;n=`${e.pathname}${e.search}${e.hash}`}let r=n.split(/[?#]/,1)[0].replace(/\\/g,`/`);if(r=r.replace(/^\/+/,``),r=r.replace(/^\.\//,``),!r)return null;let i=r.split(`/`).filter(Boolean);return i.some(e=>e===`..`)?null:i.join(`/`)}async handleBackup(){try{let e=this.shadowRoot?.querySelector(`.tasks__backup-btn`);e?.toggleAttribute(`disabled`,!0),e&&(e.textContent=`⏳`);let t=a.getTasksForBackup(),n=JSON.stringify(t,null,2),r=new Blob([n],{type:`application/json`}),i=URL.createObjectURL(r),o=document.createElement(`a`);o.href=i,o.download=`shadowclaw-tasks-backup-${Date.now()}.json`,document.body.appendChild(o),o.click(),document.body.removeChild(o),URL.revokeObjectURL(i)}catch(e){c(`Failed to create backup: ${e instanceof Error?e.message:String(e)}`),console.error(`Backup error:`,e)}finally{let e=this.shadowRoot?.querySelector(`.tasks__backup-btn`);e?.toggleAttribute(`disabled`,!1),e&&(e.textContent=`💾 Backup`)}}async handleClearAll(e){if(await this.requestConfirmation({title:`Clear All Tasks`,message:`Delete ALL tasks? This cannot be undone!`,confirmLabel:`Delete All`,cancelLabel:`Cancel`}))try{let t=this.shadowRoot?.querySelector(`.tasks__clear-btn`);t?.toggleAttribute(`disabled`,!0),t&&(t.textContent=`⏳`),await a.clearAllTasks(e)}catch(e){c(`Failed to clear tasks: ${e instanceof Error?e.message:String(e)}`),console.error(`Clear error:`,e)}finally{let e=this.shadowRoot?.querySelector(`.tasks__clear-btn`);e?.toggleAttribute(`disabled`,!1),e&&(e.textContent=`🗑️ Clear All`)}}async handleCopyId(e){try{await navigator.clipboard.writeText(e),s(`Task ID copied to clipboard!`)}catch{c(`Failed to copy task ID.`)}}async handleDelete(e,t){if(await this.requestConfirmation({title:`Delete Scheduled Task`,message:`Are you sure you want to delete this scheduled task?`,confirmLabel:`Delete`,cancelLabel:`Cancel`}))try{await a.deleteTask(e,t)}catch(e){console.error(`Failed to delete task:`,e)}}async handleEditSubmit(e,t){let n=new FormData(t),r=n.get(`name`),i=n.get(`schedule`),s=n.get(`prompt`),l=n.get(`taskType`)||`prompt`,u=r?String(r).trim():``,d=i?String(i).trim():``;if(l===`prompt`&&!s){o(`Please provide a task prompt.`);return}let f=!!n.get(`freshContext`),p=!!n.get(`subagent`);try{let t;if(this.editingTask)t={...this.editingTask,name:u||void 0,schedule:d,type:l,prompt:String(s||``),tools:JSON.parse(JSON.stringify(this.editingTools)),freshContext:f,subagent:p};else{let e=a.activeGroupId;t={id:crypto.randomUUID?crypto.randomUUID():`task-${Date.now()}-${Math.random()}`,groupId:e,name:u||void 0,schedule:d,type:l,prompt:String(s||``),tools:JSON.parse(JSON.stringify(this.editingTools)),enabled:!0,lastRun:null,createdAt:Date.now(),freshContext:f,subagent:p}}await a.upsertTask(e,t),(this.shadowRoot?.querySelector(`dialog`))?.close(),this.editingTask=null}catch(e){c(`Failed to save task: ${e instanceof Error?e.message:String(e)}`),console.error(`Save error:`,e)}}async handlePreviewLinkClick(e,t){if(e.defaultPrevented||e.button!==0||e.metaKey||e.ctrlKey||e.shiftKey||e.altKey)return;let n=e.target;if(!(n instanceof Element))return;let r=n.closest(`a`);if(!(r instanceof HTMLAnchorElement))return;let i=r.getAttribute(`href`)||``,o=this.resolveWorkspaceLinkPath(i);if(!o)return;e.preventDefault();let s=[o],l=o.split(`/`).filter(Boolean).pop()||``;/\.[^./]+$/u.test(l)||s.push(`${o}.md`,`${o}/index.md`);for(let e of s)try{await f.openFile(t,e,a.activeGroupId);return}catch{}c(`Failed to open linked file: ${o}`,5e3)}async handleReorder(e,n,r){let i=await t();if(!i)return;if(r){await a.reorderTasks(i,a.activeGroupId,r);return}let o=(a.tasks||[]).map(e=>e.id),s=o.indexOf(e),c=o.indexOf(n);s<0||c<0||(o.splice(s,1),o.splice(c,0,e),await a.reorderTasks(i,a.activeGroupId,o))}async handleRestore(e,t){let n=t.files;if(!n||n.length===0)return;let r=n[0];if(!r.name.endsWith(`.json`)){o(`Please select a .json file`);return}if(!await this.requestConfirmation({title:`Restore Tasks`,message:`Restore from backup will replace all current tasks. Continue?`,confirmLabel:`Restore`,cancelLabel:`Cancel`})){t.value=``;return}try{let n=this.shadowRoot?.querySelector(`.tasks__restore-btn`);n?.toggleAttribute(`disabled`,!0),n&&(n.textContent=`⏳`);let i=await r.text(),o=JSON.parse(i);if(!Array.isArray(o))throw Error(`Invalid backup file format`);await a.restoreTasksFromBackup(e,o),t.value=``,s(`Tasks restored successfully!`)}catch(e){c(`Failed to restore from backup: ${e instanceof Error?e.message:String(e)}`),console.error(`Restore error:`,e)}finally{let e=this.shadowRoot?.querySelector(`.tasks__restore-btn`);e?.toggleAttribute(`disabled`,!1),e&&(e.textContent=`♻️ Restore`)}}async renderPreview(e,t=!1){if(!e.trim())return`<span class="tasks__preview-empty">No content</span>`;let n=e.split(`
943
- `),i=e.length>120||n.length>1,a=await d(e,{breaks:!0,renderFrontmatter:this.renderFrontmatter});return t&&i?`
942
+ `:`<div class="tasks__prompt">${n}</div>`}resolveWorkspaceLinkPath(e){let t=e.trim();if(!t||t.startsWith(`#`))return null;let n=t;if(/^[a-zA-Z][a-zA-Z\d+.-]*:/.test(t)||t.startsWith(`//`)){let e;try{e=new URL(t,window.location.href)}catch{return null}if(!(e.protocol===`http:`||e.protocol===`https:`)||e.host!==window.location.host)return null;n=`${e.pathname}${e.search}${e.hash}`}let r=n.split(/[?#]/,1)[0].replace(/\\/g,`/`);if(r=r.replace(/^\/+/,``),r=r.replace(/^\.\//,``),!r)return null;let i=r.split(`/`).filter(Boolean);return i.some(e=>e===`..`)?null:i.join(`/`)}async handleBackup(){try{let e=this.shadowRoot?.querySelector(`.tasks__backup-btn`);e?.toggleAttribute(`disabled`,!0),e&&(e.textContent=`⏳`);let t=a.getTasksForBackup(),n=JSON.stringify(t,null,2),r=new Blob([n],{type:`application/json`}),i=URL.createObjectURL(r),o=document.createElement(`a`);o.href=i,o.download=`shadowclaw-tasks-backup-${Date.now()}.json`,document.body.appendChild(o),o.click(),document.body.removeChild(o),URL.revokeObjectURL(i)}catch(e){c(`Failed to create backup: ${e instanceof Error?e.message:String(e)}`),console.error(`Backup error:`,e)}finally{let e=this.shadowRoot?.querySelector(`.tasks__backup-btn`);e?.toggleAttribute(`disabled`,!1),e&&(e.textContent=`💾 Backup`)}}async handleClearAll(e){if(await this.requestConfirmation({title:`Clear All Tasks`,message:`Delete ALL tasks? This cannot be undone!`,confirmLabel:`Delete All`,cancelLabel:`Cancel`}))try{let t=this.shadowRoot?.querySelector(`.tasks__clear-btn`);t?.toggleAttribute(`disabled`,!0),t&&(t.textContent=`⏳`),await a.clearAllTasks(e)}catch(e){c(`Failed to clear tasks: ${e instanceof Error?e.message:String(e)}`),console.error(`Clear error:`,e)}finally{let e=this.shadowRoot?.querySelector(`.tasks__clear-btn`);e?.toggleAttribute(`disabled`,!1),e&&(e.textContent=`🗑️ Clear All`)}}async handleCopyId(e){try{await navigator.clipboard.writeText(e),s(`Task ID copied to clipboard!`)}catch{c(`Failed to copy task ID.`)}}async handleDelete(e,t){if(await this.requestConfirmation({title:`Delete Scheduled Task`,message:`Are you sure you want to delete this scheduled task?`,confirmLabel:`Delete`,cancelLabel:`Cancel`}))try{await a.deleteTask(e,t)}catch(e){console.error(`Failed to delete task:`,e)}}async handleEditSubmit(e,t){let n=new FormData(t),r=n.get(`name`),i=n.get(`schedule`),s=n.get(`prompt`),l=n.get(`taskType`)||`prompt`,u=r?String(r).trim():``,d=i?String(i).trim():``;if(l===`prompt`&&!s){o(`Please provide a task prompt.`);return}let f=!!n.get(`freshContext`),p=!!n.get(`subagent`);try{let t;if(this.editingTask)t={...this.editingTask,name:u||void 0,schedule:d,type:l,prompt:String(s||``),tools:JSON.parse(JSON.stringify(this.editingTools)),freshContext:f,subagent:p};else{let e=a.activeGroupId;t={id:crypto.randomUUID?crypto.randomUUID():`task-${Date.now()}-${Math.random()}`,groupId:e,name:u||void 0,schedule:d,type:l,prompt:String(s||``),tools:JSON.parse(JSON.stringify(this.editingTools)),enabled:!0,lastRun:null,createdAt:Date.now(),freshContext:f,subagent:p}}await a.upsertTask(e,t),(this.shadowRoot?.querySelector(`dialog`))?.close(),this.editingTask=null}catch(e){c(`Failed to save task: ${e instanceof Error?e.message:String(e)}`),console.error(`Save error:`,e)}}async handlePreviewLinkClick(e,t){if(e.defaultPrevented||e.button!==0||e.metaKey||e.ctrlKey||e.shiftKey||e.altKey)return;let n=e.target;if(!(n instanceof Element))return;let r=n.closest(`a`);if(!(r instanceof HTMLAnchorElement))return;let i=r.getAttribute(`href`)||``,o=this.resolveWorkspaceLinkPath(i);if(!o)return;e.preventDefault();let s=[o],l=o.split(`/`).filter(Boolean).pop()||``;/\.[^./]+$/u.test(l)||s.push(`${o}.md`,`${o}/index.md`);for(let e of s)try{await p.openFile(t,e,a.activeGroupId);return}catch{}c(`Failed to open linked file: ${o}`,5e3)}async handleReorder(e,n,r){let i=await t();if(!i)return;if(r){await a.reorderTasks(i,a.activeGroupId,r);return}let o=(a.tasks||[]).map(e=>e.id),s=o.indexOf(e),c=o.indexOf(n);s<0||c<0||(o.splice(s,1),o.splice(c,0,e),await a.reorderTasks(i,a.activeGroupId,o))}async handleRestore(e,t){let n=t.files;if(!n||n.length===0)return;let r=n[0];if(!r.name.endsWith(`.json`)){o(`Please select a .json file`);return}if(!await this.requestConfirmation({title:`Restore Tasks`,message:`Restore from backup will replace all current tasks. Continue?`,confirmLabel:`Restore`,cancelLabel:`Cancel`})){t.value=``;return}try{let n=this.shadowRoot?.querySelector(`.tasks__restore-btn`);n?.toggleAttribute(`disabled`,!0),n&&(n.textContent=`⏳`);let i=await r.text(),o=JSON.parse(i);if(!Array.isArray(o))throw Error(`Invalid backup file format`);await a.restoreTasksFromBackup(e,o),t.value=``,s(`Tasks restored successfully!`)}catch(e){c(`Failed to restore from backup: ${e instanceof Error?e.message:String(e)}`),console.error(`Restore error:`,e)}finally{let e=this.shadowRoot?.querySelector(`.tasks__restore-btn`);e?.toggleAttribute(`disabled`,!1),e&&(e.textContent=`♻️ Restore`)}}async renderPreview(e,t=!1){if(!e.trim())return`<span class="tasks__preview-empty">No content</span>`;let n=e.split(`
943
+ `),i=e.length>120||n.length>1,a=await f(e,{breaks:!0,renderFrontmatter:this.renderFrontmatter});return t&&i?`
944
944
  <details class="tasks__content-details">
945
945
  <summary class="tasks__content-summary">
946
946
  <span class="tasks__summary-text">${r(e.trim())}</span>
@@ -1,4 +1,4 @@
1
- import{D as e,E as t,T as n,t as r}from"./orchestrator-B9KmIj8Q.js";import{t as i}from"./shadow-claw-element-DIrv3P6A.js";function a(e){if(!e)return``;let t=e.split(`
1
+ import{D as e,E as t,T as n,t as r}from"./orchestrator-DRfEudXk.js";import{t as i}from"./shadow-claw-element-DIrv3P6A.js";function a(e){if(!e)return``;let t=e.split(`
2
2
  `);for(let e=t.length-1;e>=0;--e){let n=t[e]||``;if(/[#$](?:\s|$)/.test(n))return n}return``}function o(e){return e.scrollHeight-(e.scrollTop+e.clientHeight)<=12}function s(e,t){let n=e[t+1];if(n===void 0)return{action:`ignore`,nextIndex:t+1,incomplete:!0};if(n===`[`){let n=t+2;for(;n<e.length;){let t=e.charCodeAt(n);if(t>=64&&t<=126){let t=e[n];return t===`J`?{action:`clear-screen`,nextIndex:n+1}:t===`K`?{action:`clear-line`,nextIndex:n+1}:{action:`ignore`,nextIndex:n+1}}n+=1}return{action:`ignore`,nextIndex:e.length,incomplete:!0}}if(n===`]`){let n=t+2;for(;n<e.length;){let t=e[n];if(t===`\x07`)return{action:`ignore`,nextIndex:n+1};if(t===`\x1B`&&e[n+1]===`\\`)return{action:`ignore`,nextIndex:n+2};n+=1}return{action:`ignore`,nextIndex:e.length,incomplete:!0}}return{action:`ignore`,nextIndex:Math.min(t+2,e.length)}}function c(e){return e.replace(/(?:^|\n)[^\n]*mkdir -p \/home\/user 2>&1; echo "?__BCDONE_\d+__\$\?"?[^\n]*(?:\n|$)/g,`
3
3
  `).replace(/(?:^|\n)\s*__BCDONE_\d+__(?:\d+|\$\?)?\s*(?:\n|$)/g,`
4
4
  `).replace(/^\n+(?=\S)/,``)}function l(e,t,n=``,r){let i=r?.respectEraseSequences??!0,a=n+t,o=e;for(let e=0;e<a.length;e++){let t=a[e];if(t===`\x1B`){let t=s(a,e);if(t.incomplete)return{text:o,pending:a.slice(e)};if(t.action===`clear-screen`&&i&&(o=``),t.action===`clear-line`&&i){let e=o.lastIndexOf(`
@@ -1,4 +1,4 @@
1
- import{P as e,k as t}from"./config-AL77QAx4.js";import{n}from"./txPromise-EBECky1b.js";import{gn as r,mn as i,t as a}from"./orchestrator-B9KmIj8Q.js";import{t as o}from"./ulid-BY7rQVLN.js";import{i as s,n as c,t as l}from"./syncWebMcpRegistration-DfpvASnh.js";import{n as u,r as d,t as f}from"./toast-D3gxhZpN.js";import{t as p}from"./shadow-claw-element-DIrv3P6A.js";import{t as m}from"./effect-BEsuusE8.js";import"./shadow-claw-page-header-action-button-Bmua3mAb.js";import"./shadow-claw-page-header-NeRD0tKU.js";import"./shadow-claw-dialog-ByyHgxM9.js";const h=new CSSStyleSheet;h.replaceSync(`*,
1
+ import{A as e,F as t}from"./config-BYAuxx3j.js";import{n}from"./txPromise-EBECky1b.js";import{gn as r,mn as i,t as a}from"./orchestrator-DRfEudXk.js";import{t as o}from"./ulid-BY7rQVLN.js";import{i as s,n as c,t as l}from"./syncWebMcpRegistration-BqJxaMGR.js";import{n as u,r as d,t as f}from"./toast-D3gxhZpN.js";import{t as p}from"./shadow-claw-element-DIrv3P6A.js";import{t as m}from"./effect-BEsuusE8.js";import"./shadow-claw-page-header-action-button-Bmua3mAb.js";import"./shadow-claw-page-header-B63S4HTU.js";import"./shadow-claw-dialog-ByyHgxM9.js";const h=new CSSStyleSheet;h.replaceSync(`*,
2
2
  *::before,
3
3
  *::after {
4
4
  font-family: var(--shadow-claw-font-sans);
@@ -1036,4 +1036,4 @@ dialog::backdrop {
1036
1036
  </shadow-claw-dialog>
1037
1037
  </section>
1038
1038
  </template>
1039
- `,`text/html`),_=g.querySelector(`template`);let v=[];v=_?Array.from(_.content.children):Array.from(g.head.children).concat(Array.from(g.body.children));var y=v;const b=new Set(r.map(e=>e.name)),x=`shadow-claw-tools`;var S=class extends p{static styles=h;static template=y;orchestrator=null;constructor(){super()}async connectedCallback(){let e=await n();this.orchestrator=a.orchestrator,await i.refreshDeclarativeTools(e),this.setupEffects(e),this.bindEventListeners(e)}disconnectedCallback(){super.disconnectedCallback()}bindEventListeners(n){let r=this.shadowRoot;if(!r)return;r.querySelector(`.tools__back-btn`)?.addEventListener(`click`,()=>{this.dispatchEvent(new CustomEvent(`navigate-back`,{bubbles:!0,composed:!0}))}),r.querySelector(`.tools__add-btn`)?.addEventListener(`click`,()=>{let e=r.querySelector(`dialog`);e&&(r.querySelector(`.tools__dialog-form`)?.reset(),e.showModal())}),r.querySelector(`.tools__backup-btn`)?.addEventListener(`click`,()=>{this.handleBackup()});let o=r.querySelector(`.tools__hidden-restore`);r.querySelector(`.tools__restore-btn`)?.addEventListener(`click`,()=>{o instanceof HTMLInputElement&&o.click()}),o?.addEventListener(`change`,e=>{e.target instanceof HTMLInputElement&&this.handleRestore(n,e.target)}),r.querySelector(`.tools__select-all-btn`)?.addEventListener(`click`,()=>{let e=i.allTools.map(e=>e.name);i.setAllEnabled(n,e);let t=i.declarativeTools.map(e=>e.name);i.setAllDeclarativeEnabled(n,t),u(`All tools enabled`)}),r.querySelector(`.tools__select-none-btn`)?.addEventListener(`click`,()=>{i.setAllEnabled(n,[]),i.setAllDeclarativeEnabled(n,[]),u(`All tools disabled`)});let s=r.querySelector(`.tools__webmcp-toggle`);s&&s.addEventListener(`change`,async()=>{let e=this.orchestrator??a.orchestrator;if(!e){s.checked=!1,f(`Orchestrator is not ready`);return}let t=s.checked;try{await c(e,n,t,{orchestrator:e}),u(t?`WebMCP tool registration enabled`:`WebMCP tool registration disabled`)}catch(e){s.checked=!t,f(`Failed to update WebMCP setting: ${e instanceof Error?e.message:String(e)}`)}});let p=r.querySelector(`.tools__internet-access-toggle`);p&&p.addEventListener(`change`,async()=>{let e=p.checked;try{await a.setVMBashFullInternetAccess(n,e),u(e?`Full internet access enabled for Bash and JavaScript tools`:`Full internet access disabled for Bash and JavaScript tools`)}catch(t){p.checked=!e,f(`Failed to update internet access setting: ${t instanceof Error?t.message:String(t)}`)}});let m=r.querySelector(`.tools__websearch-proxy-toggle`);m?.addEventListener(`change`,async()=>{try{await i.setWebSearchUseProxy(n,m.checked),u(m.checked?`Web Search local proxy enabled`:`Web Search local proxy disabled`)}catch(e){m.checked=!m.checked,f(`Failed to update Web Search proxy setting: ${e instanceof Error?e.message:String(e)}`)}}),r.querySelector(`.tools__save-searchfiles-btn`)?.addEventListener(`click`,async()=>{let e=r.querySelector(`.tools__searchfiles-max-file-bytes-input`),t=r.querySelector(`.tools__searchfiles-max-files-visited-input`),a=r.querySelector(`.tools__searchfiles-skip-dirs-input`),o=parseInt(e?.value||``,10),s=parseInt(t?.value||``,10),c=a?.value??``;try{!isNaN(o)&&o>0&&await i.setSearchFilesMaxFileBytes(n,o),!isNaN(s)&&s>0&&await i.setSearchFilesMaxFilesVisited(n,s),await i.setSearchFilesSkipDirs(n,c),d(`Search Files settings saved`)}catch(e){f(`Failed to save Search Files settings: ${e instanceof Error?e.message:String(e)}`)}}),r.querySelector(`.tools__save-websearch-btn`)?.addEventListener(`click`,async()=>{let e=r.querySelector(`.tools__websearch-proxy-url-input`),t=r.querySelector(`.tools__websearch-url-input`),a=e?.value.trim()||`/proxy`,o=t?.value.trim()||`https://html.duckduckgo.com/html/?q={query}`;try{await i.setWebSearchProxyUrl(n,a),await i.setWebSearchUrl(n,o),d(`Web Search settings saved`)}catch(e){f(`Failed to save Web Search settings: ${e instanceof Error?e.message:String(e)}`)}});let h=r.querySelector(`.tools__webmcp-mode`);h&&h.addEventListener(`change`,async()=>{let e=this.orchestrator??a.orchestrator;if(!e)return;let t=h.value;try{await l(e,n,t,{orchestrator:e}),u(`WebMCP mode set to ${t}`)}catch(e){f(`Failed to update WebMCP mode: ${e instanceof Error?e.message:String(e)}`)}}),r.querySelector(`.tools__save-prompt-btn`)?.addEventListener(`click`,()=>{let e=r.querySelector(`.tools__prompt-area`);e instanceof HTMLTextAreaElement&&(i.setSystemPromptOverride(n,e.value),d(`System prompt override saved`))}),r.querySelector(`.tools__clear-prompt-btn`)?.addEventListener(`click`,()=>{let e=r.querySelector(`.tools__prompt-area`);e instanceof HTMLTextAreaElement&&(e.value=``,i.setSystemPromptOverride(n,``),d(`System prompt override cleared`))});let g=r.querySelector(`.tools__dialog`),_=g?.querySelector(`.tools__dialog-close`),v=g?.querySelector(`.tools__btn-cancel`),y=r.querySelector(`.tools__dialog-form`);_?.addEventListener(`click`,()=>g?.close()),v?.addEventListener(`click`,()=>g?.close()),g?.addEventListener(`click`,e=>{e.target===g&&g.close()}),y?.addEventListener(`submit`,e=>{e.preventDefault(),y&&this.handleAddTool(n,y)});let b=r.querySelector(`.tools__clone-dialog`),x=r.querySelector(`.tools__clone-dialog-close`),S=r.querySelector(`.tools__clone-cancel-btn`),C=r.querySelector(`.tools__clone-dialog-form`);x?.addEventListener(`click`,()=>b?.close()),S?.addEventListener(`click`,()=>b?.close()),b?.addEventListener(`click`,e=>{e.target===b&&b.close()}),C?.addEventListener(`submit`,e=>{e.preventDefault(),C&&this.handleCloneTool(n,C)});let w=r.querySelector(`.tools__profile-dialog`),T=r.querySelector(`.tools__profile-dialog-close`),E=r.querySelector(`.tools__profile-cancel-btn`),D=r.querySelector(`.tools__profile-dialog-form`);T?.addEventListener(`click`,()=>w?.close()),E?.addEventListener(`click`,()=>w?.close()),w?.addEventListener(`click`,e=>{e.target===w&&w.close()}),D?.addEventListener(`submit`,e=>{e.preventDefault(),D&&this.handleSaveProfile(n,D)}),r.querySelector(`.tools__profile-select`)?.addEventListener(`change`,e=>{let t=e.target.value;t?(i.activateProfile(n,t),u(`Profile activated`)):(i.deactivateProfile(n),u(`Profile deactivated`))}),r.querySelector(`.tools__profile-new-btn`)?.addEventListener(`click`,()=>{if(w&&D){D.reset();let n=D.querySelector(`[name="providerId"]`);if(n){n.replaceChildren();let r=document.createElement(`option`);r.value=``,r.textContent=`— Any provider —`,n.append(r);for(let r of t()){let t=e(r);if(t){let e=document.createElement(`option`);e.value=r,e.textContent=t.name,n.appendChild(e)}}}w.showModal()}}),r.querySelector(`.tools__profile-save-btn`)?.addEventListener(`click`,async()=>{i.activeProfileId?(await i.saveToActiveProfile(n),d(`Profile saved`)):r.querySelector(`.tools__profile-new-btn`)?.dispatchEvent(new Event(`click`))}),r.querySelector(`.tools__profile-delete-btn`)?.addEventListener(`click`,async()=>{let e=i.activeProfileId;if(!e){u(`No profile selected`);return}if(e.startsWith(`__builtin_`)){u(`Built-in profiles cannot be deleted`);return}await i.deleteProfile(n,e),d(`Profile deleted`)})}handleBackup(){let e=i.exportBackup(),t=new Blob([e],{type:`application/json`}),n=URL.createObjectURL(t),r=document.createElement(`a`);r.href=n,r.download=`shadowclaw-tools-${Date.now()}.json`,r.click(),URL.revokeObjectURL(n),d(`Tools config exported`)}openCloneDialog(e){let t=this.shadowRoot;if(!t)return;let n=t.querySelector(`.tools__clone-dialog`),r=t.querySelector(`.tools__clone-dialog-form`);if(!n||!r)return;r.reset();let i=r.querySelector(`[name="source"]`);i&&(i.value=e),n.showModal()}setupEffects(e){let t=this.shadowRoot;if(!t)return;this.addCleanup(m(()=>{i.enabledToolNames,i.customTools,i.declarativeTools,i.declarativeToolNamesEnabled,i.systemPromptOverride,i.profiles,i.activeProfileId,this.updateToolList(e)}));let n=t.querySelector(`.tools__webmcp-toggle`),r=t.querySelector(`.tools__internet-access-toggle`),o=t.querySelector(`.tools__webmcp-mode`);n&&this.addCleanup(m(()=>{a.ready&&(this.orchestrator=a.orchestrator,n.checked=this.orchestrator?.webMcpToolsEnabled===!0,o&&this.orchestrator&&(o.value=s()||`polyfill`))})),r&&this.addCleanup(m(()=>{r.checked=a.vmBashFullInternetAccess}));let c=t.querySelector(`.tools__websearch-proxy-toggle`),l=t.querySelector(`.tools__websearch-proxy-url-input`),u=t.querySelector(`.tools__websearch-url-input`);c&&this.addCleanup(m(()=>{c.checked=i.webSearchUseProxy})),l&&this.addCleanup(m(()=>{document.activeElement!==l&&!l.matches(`:focus`)&&(l.value=i.webSearchProxyUrl)})),u&&this.addCleanup(m(()=>{document.activeElement!==u&&!u.matches(`:focus`)&&(u.value=i.webSearchUrl)}));let d=t.querySelector(`.tools__searchfiles-max-file-bytes-input`),f=t.querySelector(`.tools__searchfiles-max-files-visited-input`),p=t.querySelector(`.tools__searchfiles-skip-dirs-input`);d&&this.addCleanup(m(()=>{document.activeElement!==d&&!d.matches(`:focus`)&&(d.value=String(i.searchFilesMaxFileBytes))})),f&&this.addCleanup(m(()=>{document.activeElement!==f&&!f.matches(`:focus`)&&(f.value=String(i.searchFilesMaxFilesVisited))})),p&&this.addCleanup(m(()=>{document.activeElement!==p&&!p.matches(`:focus`)&&(p.value=i.searchFilesSkipDirs)}))}updateProfileSelector(){let t=this.shadowRoot;if(!t)return;let n=t.querySelector(`.tools__profile-select`);if(!n)return;let r=i.profiles,a=i.activeProfileId;n.replaceChildren();let o=document.createElement(`option`);o.value=``,o.textContent=`— No profile (manual config) —`,n.append(o);for(let t of r){let r=document.createElement(`option`);r.value=t.id;let i=t.id.startsWith(`__builtin_`),o=t.providerId?e(t.providerId)?.name||t.providerId:`any`,s=t.model||`any`;r.textContent=i?`⚡ ${t.name} (${o})`:`${t.name} (${o} / ${s})`,t.id===a&&(r.selected=!0),n.appendChild(r)}let s=t.querySelector(`.tools__profile-delete-btn`);if(s){let e=a?.startsWith(`__builtin_`);s.disabled=!!e,s.title=e?`Built-in profiles cannot be deleted`:``}}updateToolList(e){let t=this.shadowRoot;if(!t)return;let n=t.querySelector(`.tools__list`);if(!n)return;let r=i.enabledToolNames,a=i.allTools,o=i.declarativeTools,s=n.querySelectorAll(`.tools__item-checkbox[data-tool]`),c=Array.from(s).map(e=>e.getAttribute(`data-tool`)||``),l=[...a.map(e=>e.name),...o.map(e=>e.name)];if(c.length===l.length&&c.every((e,t)=>e===l[t]))for(let e of s){let t=e.getAttribute(`data-tool`);if(!t)continue;let n=o.some(e=>e.name===t)?i.isDeclarativeToolEnabled(t):r.has(t);e.checked!==n&&(e.checked=n)}else{n.replaceChildren();for(let t of a){let a=!b.has(t.name),o=r.has(t.name),s=t.description.split(`. `)[0],c=document.createElement(`div`);c.className=`tools__item`,c.setAttribute(`role`,`listitem`);let l=document.createElement(`input`);l.type=`checkbox`,l.className=`tools__item-checkbox`,l.setAttribute(`data-tool`,t.name),l.setAttribute(`aria-label`,`Enable ${t.name}`),l.checked=o;let d=document.createElement(`div`);d.className=`tools__item-info`;let f=document.createElement(`div`);f.className=`tools__item-name`,f.textContent=t.name;let p=document.createElement(`div`);p.className=`tools__item-desc`,p.setAttribute(`title`,t.description),p.textContent=s,d.append(f,p);let m=document.createElement(`button`);if(m.className=`tools__item-clone`,m.setAttribute(`data-clone`,t.name),m.setAttribute(`aria-label`,`Clone ${t.name}`),m.setAttribute(`title`,`Clone tool`),m.textContent=`📋`,c.append(l,d),a){let e=document.createElement(`span`);e.className=`tools__item-badge`,e.textContent=`custom`,c.append(e)}c.append(m);let h=null;a&&(h=document.createElement(`button`),h.className=`tools__item-delete`,h.setAttribute(`data-delete`,t.name),h.setAttribute(`aria-label`,`Delete ${t.name}`),h.textContent=`🗑️`,c.append(h)),l?.addEventListener(`change`,()=>{i.setToolEnabled(e,t.name,l.checked)}),m?.addEventListener(`click`,()=>{this.openCloneDialog(t.name)}),h?.addEventListener(`click`,()=>{i.removeCustomTool(e,t.name),u(`Removed custom tool: ${t.name}`)}),n.appendChild(c)}for(let t of o){let r=i.isDeclarativeToolEnabled(t.name),a=t.description.split(`. `)[0],o=document.createElement(`div`);o.className=`tools__item`,o.setAttribute(`role`,`listitem`);let s=document.createElement(`input`);s.type=`checkbox`,s.className=`tools__item-checkbox`,s.setAttribute(`data-tool`,t.name),s.setAttribute(`aria-label`,`Enable ${t.name}`),s.checked=r;let c=document.createElement(`div`);c.className=`tools__item-info`;let l=document.createElement(`div`);l.className=`tools__item-name`,l.textContent=t.name;let u=document.createElement(`div`);u.className=`tools__item-desc`,u.setAttribute(`title`,t.description),u.textContent=a,c.append(l,u);let d=document.createElement(`span`);d.className=`tools__item-badge tools__item-badge--declarative`,d.textContent=`declarative`,o.append(s,c,d),s.addEventListener(`change`,()=>{i.setDeclarativeToolEnabled(e,t.name,s.checked)}),n.appendChild(o)}}let d=t.querySelector(`.tools__count`);d&&(d.textContent=`${(i.enabledTools||[]).length+(i.enabledDeclarativeTools||[]).length} of ${a.length+o.length} enabled`);let f=t.querySelector(`.tools__prompt-area`);f instanceof HTMLTextAreaElement&&document.activeElement!==f&&!f.matches(`:focus`)&&(f.value=i.systemPromptOverride),this.updateProfileSelector()}async handleAddTool(e,t){let n=new FormData(t),r=String(n.get(`name`)||``).trim(),a=String(n.get(`description`)||``).trim(),o=String(n.get(`input_schema`)||``).trim();if(!r||!a){f(`Name and description are required`);return}if(i.allTools.some(e=>e.name===r)){f(`A tool named "${r}" already exists`);return}let s={type:`object`,properties:{}};if(o)try{s=JSON.parse(o)}catch{f(`Invalid JSON in input schema`);return}await i.addCustomTool(e,{name:r,description:a,input_schema:s}),d(`Added custom tool: ${r}`),(this.shadowRoot?.querySelector(`.tools__dialog`))?.close()}async handleCloneTool(e,t){let n=new FormData(t),r=String(n.get(`source`)||``).trim(),a=String(n.get(`name`)||``).trim(),o=String(n.get(`description`)||``).trim();if(!r||!a){f(`Source and new tool name are required`);return}if(!await i.cloneTool(e,r,a,o||void 0)){f(`Clone failed: source not found or name "${a}" already exists.`);return}d(`Cloned "${r}" → "${a}"`),(this.shadowRoot?.querySelector(`.tools__clone-dialog`))?.close()}async handleRestore(e,t){let n=t.files?.[0];if(n){try{let t=await n.text();await i.importBackup(e,t),d(`Tools config restored`)}catch(e){f(`Failed to restore: ${e instanceof Error?e.message:String(e)}`)}t.value=``}}async handleSaveProfile(e,t){let n=new FormData(t),r=String(n.get(`name`)||``).trim(),a=String(n.get(`providerId`)||``).trim(),s=String(n.get(`model`)||``).trim();if(!r){f(`Profile name is required`);return}let c={id:o(),name:r,providerId:a||void 0,model:s||void 0,enabledToolNames:[...i.enabledToolNames],customTools:[...i.customTools],systemPromptOverride:i.systemPromptOverride};await i.addProfile(e,c),await i.activateProfile(e,c.id),d(`Profile "${r}" created and activated`),(this.shadowRoot?.querySelector(`.tools__profile-dialog`))?.close()}};customElements.get(x)||customElements.define(x,S);export{S as ShadowClawTools};
1039
+ `,`text/html`),_=g.querySelector(`template`);let v=[];v=_?Array.from(_.content.children):Array.from(g.head.children).concat(Array.from(g.body.children));var y=v;const b=new Set(r.map(e=>e.name)),x=`shadow-claw-tools`;var S=class extends p{static styles=h;static template=y;orchestrator=null;constructor(){super()}async connectedCallback(){let e=await n();this.orchestrator=a.orchestrator,await i.refreshDeclarativeTools(e),this.setupEffects(e),this.bindEventListeners(e)}disconnectedCallback(){super.disconnectedCallback()}bindEventListeners(n){let r=this.shadowRoot;if(!r)return;r.querySelector(`.tools__back-btn`)?.addEventListener(`click`,()=>{this.dispatchEvent(new CustomEvent(`navigate-back`,{bubbles:!0,composed:!0}))}),r.querySelector(`.tools__add-btn`)?.addEventListener(`click`,()=>{let e=r.querySelector(`dialog`);e&&(r.querySelector(`.tools__dialog-form`)?.reset(),e.showModal())}),r.querySelector(`.tools__backup-btn`)?.addEventListener(`click`,()=>{this.handleBackup()});let o=r.querySelector(`.tools__hidden-restore`);r.querySelector(`.tools__restore-btn`)?.addEventListener(`click`,()=>{o instanceof HTMLInputElement&&o.click()}),o?.addEventListener(`change`,e=>{e.target instanceof HTMLInputElement&&this.handleRestore(n,e.target)}),r.querySelector(`.tools__select-all-btn`)?.addEventListener(`click`,()=>{let e=i.allTools.map(e=>e.name);i.setAllEnabled(n,e);let t=i.declarativeTools.map(e=>e.name);i.setAllDeclarativeEnabled(n,t),u(`All tools enabled`)}),r.querySelector(`.tools__select-none-btn`)?.addEventListener(`click`,()=>{i.setAllEnabled(n,[]),i.setAllDeclarativeEnabled(n,[]),u(`All tools disabled`)});let s=r.querySelector(`.tools__webmcp-toggle`);s&&s.addEventListener(`change`,async()=>{let e=this.orchestrator??a.orchestrator;if(!e){s.checked=!1,f(`Orchestrator is not ready`);return}let t=s.checked;try{await c(e,n,t,{orchestrator:e}),u(t?`WebMCP tool registration enabled`:`WebMCP tool registration disabled`)}catch(e){s.checked=!t,f(`Failed to update WebMCP setting: ${e instanceof Error?e.message:String(e)}`)}});let p=r.querySelector(`.tools__internet-access-toggle`);p&&p.addEventListener(`change`,async()=>{let e=p.checked;try{await a.setVMBashFullInternetAccess(n,e),u(e?`Full internet access enabled for Bash and JavaScript tools`:`Full internet access disabled for Bash and JavaScript tools`)}catch(t){p.checked=!e,f(`Failed to update internet access setting: ${t instanceof Error?t.message:String(t)}`)}});let m=r.querySelector(`.tools__websearch-proxy-toggle`);m?.addEventListener(`change`,async()=>{try{await i.setWebSearchUseProxy(n,m.checked),u(m.checked?`Web Search local proxy enabled`:`Web Search local proxy disabled`)}catch(e){m.checked=!m.checked,f(`Failed to update Web Search proxy setting: ${e instanceof Error?e.message:String(e)}`)}}),r.querySelector(`.tools__save-searchfiles-btn`)?.addEventListener(`click`,async()=>{let e=r.querySelector(`.tools__searchfiles-max-file-bytes-input`),t=r.querySelector(`.tools__searchfiles-max-files-visited-input`),a=r.querySelector(`.tools__searchfiles-skip-dirs-input`),o=parseInt(e?.value||``,10),s=parseInt(t?.value||``,10),c=a?.value??``;try{!isNaN(o)&&o>0&&await i.setSearchFilesMaxFileBytes(n,o),!isNaN(s)&&s>0&&await i.setSearchFilesMaxFilesVisited(n,s),await i.setSearchFilesSkipDirs(n,c),d(`Search Files settings saved`)}catch(e){f(`Failed to save Search Files settings: ${e instanceof Error?e.message:String(e)}`)}}),r.querySelector(`.tools__save-websearch-btn`)?.addEventListener(`click`,async()=>{let e=r.querySelector(`.tools__websearch-proxy-url-input`),t=r.querySelector(`.tools__websearch-url-input`),a=e?.value.trim()||`/proxy`,o=t?.value.trim()||`https://html.duckduckgo.com/html/?q={query}`;try{await i.setWebSearchProxyUrl(n,a),await i.setWebSearchUrl(n,o),d(`Web Search settings saved`)}catch(e){f(`Failed to save Web Search settings: ${e instanceof Error?e.message:String(e)}`)}});let h=r.querySelector(`.tools__webmcp-mode`);h&&h.addEventListener(`change`,async()=>{let e=this.orchestrator??a.orchestrator;if(!e)return;let t=h.value;try{await l(e,n,t,{orchestrator:e}),u(`WebMCP mode set to ${t}`)}catch(e){f(`Failed to update WebMCP mode: ${e instanceof Error?e.message:String(e)}`)}}),r.querySelector(`.tools__save-prompt-btn`)?.addEventListener(`click`,()=>{let e=r.querySelector(`.tools__prompt-area`);e instanceof HTMLTextAreaElement&&(i.setSystemPromptOverride(n,e.value),d(`System prompt override saved`))}),r.querySelector(`.tools__clear-prompt-btn`)?.addEventListener(`click`,()=>{let e=r.querySelector(`.tools__prompt-area`);e instanceof HTMLTextAreaElement&&(e.value=``,i.setSystemPromptOverride(n,``),d(`System prompt override cleared`))});let g=r.querySelector(`.tools__dialog`),_=g?.querySelector(`.tools__dialog-close`),v=g?.querySelector(`.tools__btn-cancel`),y=r.querySelector(`.tools__dialog-form`);_?.addEventListener(`click`,()=>g?.close()),v?.addEventListener(`click`,()=>g?.close()),g?.addEventListener(`click`,e=>{e.target===g&&g.close()}),y?.addEventListener(`submit`,e=>{e.preventDefault(),y&&this.handleAddTool(n,y)});let b=r.querySelector(`.tools__clone-dialog`),x=r.querySelector(`.tools__clone-dialog-close`),S=r.querySelector(`.tools__clone-cancel-btn`),C=r.querySelector(`.tools__clone-dialog-form`);x?.addEventListener(`click`,()=>b?.close()),S?.addEventListener(`click`,()=>b?.close()),b?.addEventListener(`click`,e=>{e.target===b&&b.close()}),C?.addEventListener(`submit`,e=>{e.preventDefault(),C&&this.handleCloneTool(n,C)});let w=r.querySelector(`.tools__profile-dialog`),T=r.querySelector(`.tools__profile-dialog-close`),E=r.querySelector(`.tools__profile-cancel-btn`),D=r.querySelector(`.tools__profile-dialog-form`);T?.addEventListener(`click`,()=>w?.close()),E?.addEventListener(`click`,()=>w?.close()),w?.addEventListener(`click`,e=>{e.target===w&&w.close()}),D?.addEventListener(`submit`,e=>{e.preventDefault(),D&&this.handleSaveProfile(n,D)}),r.querySelector(`.tools__profile-select`)?.addEventListener(`change`,e=>{let t=e.target.value;t?(i.activateProfile(n,t),u(`Profile activated`)):(i.deactivateProfile(n),u(`Profile deactivated`))}),r.querySelector(`.tools__profile-new-btn`)?.addEventListener(`click`,()=>{if(w&&D){D.reset();let n=D.querySelector(`[name="providerId"]`);if(n){n.replaceChildren();let r=document.createElement(`option`);r.value=``,r.textContent=`— Any provider —`,n.append(r);for(let r of e()){let e=t(r);if(e){let t=document.createElement(`option`);t.value=r,t.textContent=e.name,n.appendChild(t)}}}w.showModal()}}),r.querySelector(`.tools__profile-save-btn`)?.addEventListener(`click`,async()=>{i.activeProfileId?(await i.saveToActiveProfile(n),d(`Profile saved`)):r.querySelector(`.tools__profile-new-btn`)?.dispatchEvent(new Event(`click`))}),r.querySelector(`.tools__profile-delete-btn`)?.addEventListener(`click`,async()=>{let e=i.activeProfileId;if(!e){u(`No profile selected`);return}if(e.startsWith(`__builtin_`)){u(`Built-in profiles cannot be deleted`);return}await i.deleteProfile(n,e),d(`Profile deleted`)})}handleBackup(){let e=i.exportBackup(),t=new Blob([e],{type:`application/json`}),n=URL.createObjectURL(t),r=document.createElement(`a`);r.href=n,r.download=`shadowclaw-tools-${Date.now()}.json`,r.click(),URL.revokeObjectURL(n),d(`Tools config exported`)}openCloneDialog(e){let t=this.shadowRoot;if(!t)return;let n=t.querySelector(`.tools__clone-dialog`),r=t.querySelector(`.tools__clone-dialog-form`);if(!n||!r)return;r.reset();let i=r.querySelector(`[name="source"]`);i&&(i.value=e),n.showModal()}setupEffects(e){let t=this.shadowRoot;if(!t)return;this.addCleanup(m(()=>{i.enabledToolNames,i.customTools,i.declarativeTools,i.declarativeToolNamesEnabled,i.systemPromptOverride,i.profiles,i.activeProfileId,this.updateToolList(e)}));let n=t.querySelector(`.tools__webmcp-toggle`),r=t.querySelector(`.tools__internet-access-toggle`),o=t.querySelector(`.tools__webmcp-mode`);n&&this.addCleanup(m(()=>{a.ready&&(this.orchestrator=a.orchestrator,n.checked=this.orchestrator?.webMcpToolsEnabled===!0,o&&this.orchestrator&&(o.value=s()||`polyfill`))})),r&&this.addCleanup(m(()=>{r.checked=a.vmBashFullInternetAccess}));let c=t.querySelector(`.tools__websearch-proxy-toggle`),l=t.querySelector(`.tools__websearch-proxy-url-input`),u=t.querySelector(`.tools__websearch-url-input`);c&&this.addCleanup(m(()=>{c.checked=i.webSearchUseProxy})),l&&this.addCleanup(m(()=>{document.activeElement!==l&&!l.matches(`:focus`)&&(l.value=i.webSearchProxyUrl)})),u&&this.addCleanup(m(()=>{document.activeElement!==u&&!u.matches(`:focus`)&&(u.value=i.webSearchUrl)}));let d=t.querySelector(`.tools__searchfiles-max-file-bytes-input`),f=t.querySelector(`.tools__searchfiles-max-files-visited-input`),p=t.querySelector(`.tools__searchfiles-skip-dirs-input`);d&&this.addCleanup(m(()=>{document.activeElement!==d&&!d.matches(`:focus`)&&(d.value=String(i.searchFilesMaxFileBytes))})),f&&this.addCleanup(m(()=>{document.activeElement!==f&&!f.matches(`:focus`)&&(f.value=String(i.searchFilesMaxFilesVisited))})),p&&this.addCleanup(m(()=>{document.activeElement!==p&&!p.matches(`:focus`)&&(p.value=i.searchFilesSkipDirs)}))}updateProfileSelector(){let e=this.shadowRoot;if(!e)return;let n=e.querySelector(`.tools__profile-select`);if(!n)return;let r=i.profiles,a=i.activeProfileId;n.replaceChildren();let o=document.createElement(`option`);o.value=``,o.textContent=`— No profile (manual config) —`,n.append(o);for(let e of r){let r=document.createElement(`option`);r.value=e.id;let i=e.id.startsWith(`__builtin_`),o=e.providerId?t(e.providerId)?.name||e.providerId:`any`,s=e.model||`any`;r.textContent=i?`⚡ ${e.name} (${o})`:`${e.name} (${o} / ${s})`,e.id===a&&(r.selected=!0),n.appendChild(r)}let s=e.querySelector(`.tools__profile-delete-btn`);if(s){let e=a?.startsWith(`__builtin_`);s.disabled=!!e,s.title=e?`Built-in profiles cannot be deleted`:``}}updateToolList(e){let t=this.shadowRoot;if(!t)return;let n=t.querySelector(`.tools__list`);if(!n)return;let r=i.enabledToolNames,a=i.allTools,o=i.declarativeTools,s=n.querySelectorAll(`.tools__item-checkbox[data-tool]`),c=Array.from(s).map(e=>e.getAttribute(`data-tool`)||``),l=[...a.map(e=>e.name),...o.map(e=>e.name)];if(c.length===l.length&&c.every((e,t)=>e===l[t]))for(let e of s){let t=e.getAttribute(`data-tool`);if(!t)continue;let n=o.some(e=>e.name===t)?i.isDeclarativeToolEnabled(t):r.has(t);e.checked!==n&&(e.checked=n)}else{n.replaceChildren();for(let t of a){let a=!b.has(t.name),o=r.has(t.name),s=t.description.split(`. `)[0],c=document.createElement(`div`);c.className=`tools__item`,c.setAttribute(`role`,`listitem`);let l=document.createElement(`input`);l.type=`checkbox`,l.className=`tools__item-checkbox`,l.setAttribute(`data-tool`,t.name),l.setAttribute(`aria-label`,`Enable ${t.name}`),l.checked=o;let d=document.createElement(`div`);d.className=`tools__item-info`;let f=document.createElement(`div`);f.className=`tools__item-name`,f.textContent=t.name;let p=document.createElement(`div`);p.className=`tools__item-desc`,p.setAttribute(`title`,t.description),p.textContent=s,d.append(f,p);let m=document.createElement(`button`);if(m.className=`tools__item-clone`,m.setAttribute(`data-clone`,t.name),m.setAttribute(`aria-label`,`Clone ${t.name}`),m.setAttribute(`title`,`Clone tool`),m.textContent=`📋`,c.append(l,d),a){let e=document.createElement(`span`);e.className=`tools__item-badge`,e.textContent=`custom`,c.append(e)}c.append(m);let h=null;a&&(h=document.createElement(`button`),h.className=`tools__item-delete`,h.setAttribute(`data-delete`,t.name),h.setAttribute(`aria-label`,`Delete ${t.name}`),h.textContent=`🗑️`,c.append(h)),l?.addEventListener(`change`,()=>{i.setToolEnabled(e,t.name,l.checked)}),m?.addEventListener(`click`,()=>{this.openCloneDialog(t.name)}),h?.addEventListener(`click`,()=>{i.removeCustomTool(e,t.name),u(`Removed custom tool: ${t.name}`)}),n.appendChild(c)}for(let t of o){let r=i.isDeclarativeToolEnabled(t.name),a=t.description.split(`. `)[0],o=document.createElement(`div`);o.className=`tools__item`,o.setAttribute(`role`,`listitem`);let s=document.createElement(`input`);s.type=`checkbox`,s.className=`tools__item-checkbox`,s.setAttribute(`data-tool`,t.name),s.setAttribute(`aria-label`,`Enable ${t.name}`),s.checked=r;let c=document.createElement(`div`);c.className=`tools__item-info`;let l=document.createElement(`div`);l.className=`tools__item-name`,l.textContent=t.name;let u=document.createElement(`div`);u.className=`tools__item-desc`,u.setAttribute(`title`,t.description),u.textContent=a,c.append(l,u);let d=document.createElement(`span`);d.className=`tools__item-badge tools__item-badge--declarative`,d.textContent=`declarative`,o.append(s,c,d),s.addEventListener(`change`,()=>{i.setDeclarativeToolEnabled(e,t.name,s.checked)}),n.appendChild(o)}}let d=t.querySelector(`.tools__count`);d&&(d.textContent=`${(i.enabledTools||[]).length+(i.enabledDeclarativeTools||[]).length} of ${a.length+o.length} enabled`);let f=t.querySelector(`.tools__prompt-area`);f instanceof HTMLTextAreaElement&&document.activeElement!==f&&!f.matches(`:focus`)&&(f.value=i.systemPromptOverride),this.updateProfileSelector()}async handleAddTool(e,t){let n=new FormData(t),r=String(n.get(`name`)||``).trim(),a=String(n.get(`description`)||``).trim(),o=String(n.get(`input_schema`)||``).trim();if(!r||!a){f(`Name and description are required`);return}if(i.allTools.some(e=>e.name===r)){f(`A tool named "${r}" already exists`);return}let s={type:`object`,properties:{}};if(o)try{s=JSON.parse(o)}catch{f(`Invalid JSON in input schema`);return}await i.addCustomTool(e,{name:r,description:a,input_schema:s}),d(`Added custom tool: ${r}`),(this.shadowRoot?.querySelector(`.tools__dialog`))?.close()}async handleCloneTool(e,t){let n=new FormData(t),r=String(n.get(`source`)||``).trim(),a=String(n.get(`name`)||``).trim(),o=String(n.get(`description`)||``).trim();if(!r||!a){f(`Source and new tool name are required`);return}if(!await i.cloneTool(e,r,a,o||void 0)){f(`Clone failed: source not found or name "${a}" already exists.`);return}d(`Cloned "${r}" → "${a}"`),(this.shadowRoot?.querySelector(`.tools__clone-dialog`))?.close()}async handleRestore(e,t){let n=t.files?.[0];if(n){try{let t=await n.text();await i.importBackup(e,t),d(`Tools config restored`)}catch(e){f(`Failed to restore: ${e instanceof Error?e.message:String(e)}`)}t.value=``}}async handleSaveProfile(e,t){let n=new FormData(t),r=String(n.get(`name`)||``).trim(),a=String(n.get(`providerId`)||``).trim(),s=String(n.get(`model`)||``).trim();if(!r){f(`Profile name is required`);return}let c={id:o(),name:r,providerId:a||void 0,model:s||void 0,enabledToolNames:[...i.enabledToolNames],customTools:[...i.customTools],systemPromptOverride:i.systemPromptOverride};await i.addProfile(e,c),await i.activateProfile(e,c.id),d(`Profile "${r}" created and activated`),(this.shadowRoot?.querySelector(`.tools__profile-dialog`))?.close()}};customElements.get(x)||customElements.define(x,S);export{S as ShadowClawTools};
@@ -1,4 +1,4 @@
1
- import{f as e,n as t,r as n}from"./config-AL77QAx4.js";import{n as r}from"./txPromise-EBECky1b.js";import{t as i}from"./getConfig-D89uJgo5.js";import{A as a,O as o,S as s,k as c,t as l}from"./orchestrator-B9KmIj8Q.js";import{a as u,r as d,t as f}from"./toast-D3gxhZpN.js";import{t as p}from"./shadow-claw-element-DIrv3P6A.js";import{t as m}from"./effect-BEsuusE8.js";const h=new CSSStyleSheet;h.replaceSync(`*,
1
+ import{f as e,n as t,r as n}from"./config-BYAuxx3j.js";import{n as r}from"./txPromise-EBECky1b.js";import{t as i}from"./getConfig-D89uJgo5.js";import{A as a,O as o,S as s,k as c,t as l}from"./orchestrator-DRfEudXk.js";import{a as u,r as d,t as f}from"./toast-D3gxhZpN.js";import{t as p}from"./shadow-claw-element-DIrv3P6A.js";import{t as m}from"./effect-BEsuusE8.js";const h=new CSSStyleSheet;h.replaceSync(`*,
2
2
  *::before,
3
3
  *::after {
4
4
  font-family: var(--shadow-claw-font-sans);