@shawnstack/quickforge 1.6.10 → 1.6.12

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 (30) hide show
  1. package/README.md +292 -452
  2. package/dist/assets/{AgentProfilesPage-BtZpDV-3.js → AgentProfilesPage-CooGLweI.js} +1 -1
  3. package/dist/assets/ChatPanelHost-TEbv0lnL.js +260 -0
  4. package/dist/assets/{PluginsPage-CCIj8-Mn.js → PluginsPage-qXTjDrpd.js} +1 -1
  5. package/dist/assets/{ScheduledTasksPage-DIMewQ3i.js → ScheduledTasksPage-BBor8Yb2.js} +1 -1
  6. package/dist/assets/{SettingsWorkspacePage-BPD495WT.js → SettingsWorkspacePage-CnFDmGvW.js} +190 -120
  7. package/dist/assets/{SharedConversationPage-B_oMTp7B.js → SharedConversationPage-CkQ-XwYS.js} +1 -1
  8. package/dist/assets/{TerminalDock-wgW7kSC4.js → TerminalDock-CvqBBMPg.js} +1 -1
  9. package/dist/assets/{WorkspaceInspector-CdX45r3u.js → WorkspaceInspector-6JGc6VGb.js} +1 -1
  10. package/dist/assets/index-DxNzlPmc.js +63 -0
  11. package/dist/assets/index-HVxfqXfB.css +3 -0
  12. package/dist/assets/{mcp-servers-dialog-jHlDR9jP.js → mcp-servers-dialog-CsRQxx7A.js} +1 -1
  13. package/dist/assets/{skills-dialog-DvSnPPzu.js → skills-dialog-CmVLi_h6.js} +1 -1
  14. package/dist/index.html +4 -4
  15. package/package.json +1 -1
  16. package/server/agent-manager.mjs +45 -3
  17. package/server/approval-store.mjs +4 -0
  18. package/server/global-memory.mjs +168 -0
  19. package/server/index.mjs +7 -0
  20. package/server/project-config.mjs +3 -0
  21. package/server/routes/memory.mjs +26 -0
  22. package/server/routes/project.mjs +3 -18
  23. package/server/routes/tools.mjs +5 -3
  24. package/server/system-prompt.mjs +22 -0
  25. package/server/tools/definitions.mjs +14 -0
  26. package/server/tools/index.mjs +6 -0
  27. package/server/utils/platform.mjs +20 -3
  28. package/dist/assets/ChatPanelHost-BF1V-xOV.js +0 -244
  29. package/dist/assets/index-Bxg5fT2p.css +0 -3
  30. package/dist/assets/index-DKmdePUP.js +0 -63
@@ -1,5 +1,5 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/AgentProfilesPage-BtZpDV-3.js","assets/rolldown-runtime-DWdDZTNf.js","assets/index-DKmdePUP.js","assets/pi-ai-Cr3rpCXT.js","assets/pi-web-ui-DoRGtREc.js","assets/lit-vendor-Dr3cpBGF.js","assets/css-utils-rkE68RDy.js","assets/icons-C7j5jdKo.js","assets/react-vendor-VqdnQHHS.js","assets/skills-dialog-DvSnPPzu.js","assets/logger-B65Akg8A.js","assets/index-Bxg5fT2p.css","assets/mcp-servers-dialog-jHlDR9jP.js","assets/PluginsPage-CCIj8-Mn.js","assets/plugin-api-BbUkYm3Y.js","assets/ScheduledTasksPage-DIMewQ3i.js"])))=>i.map(i=>d[i]);
2
- import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r,Nt as i,Rt as a,S as o,Vt as s,_ as c,c as l,g as u,j as d,mt as f,p,pt as m,u as h,yt as g,zt as ee}from"./icons-C7j5jdKo.js";import{n as te,r as ne}from"./react-vendor-VqdnQHHS.js";import{p as _}from"./lit-vendor-Dr3cpBGF.js";import{m as v,x as y}from"./pi-web-ui-DoRGtREc.js";import{J as b}from"./pi-ai-Cr3rpCXT.js";import{t as x}from"./logger-B65Akg8A.js";import{$ as re,A as S,B as ie,C as ae,D as oe,E as se,F as ce,H as C,I as le,L as ue,M as de,O as fe,Q as pe,T as me,V as w,Z as T,at as E,ct as he,dt as ge,ft as _e,ht as D,it as ve,k as O,mt as ye,ot as be,pt as xe,rt as Se,tt as Ce,ut as we,w as Te,z as Ee}from"./index-DKmdePUP.js";var k=e(s(),1),De={openai:{name:`OpenAI`,baseUrl:`https://api.openai.com/v1`,protocol:`openai-completions`,modelId:`gpt-4o`,supportsImages:!0},deepseek:{name:`DeepSeek`,baseUrl:`https://api.deepseek.com/v1`,protocol:`openai-completions`,modelId:`deepseek-chat`},glm:{name:`Zhipu GLM`,baseUrl:`https://open.bigmodel.cn/api/paas/v4`,protocol:`openai-completions`,modelId:`glm-4-plus`},ollama:{name:`Ollama`,baseUrl:`http://localhost:11434/v1`,protocol:`openai-completions`,modelId:`llama3.1`},litellm:{name:T.name,baseUrl:T.baseUrl,protocol:`openai-completions`,modelId:T.modelId,supportsImages:T.supportsImages}},Oe=[{key:`openai`,label:D(`presetOpenai`)},{key:`deepseek`,label:D(`presetDeepseek`)},{key:`glm`,label:D(`presetGlm`)},{key:`ollama`,label:D(`presetOllama`)},{key:`litellm`,label:D(`presetLitellm`)},{key:`custom`,label:D(`presetCustom`)}],A=()=>({modelId:``,contextWindow:T.contextWindow,maxTokens:T.maxTokens,reasoning:!0,supportsImages:!1,open:!1}),j=()=>({name:T.name,baseUrl:T.baseUrl,apiKey:``,headerRows:[],protocol:`openai-completions`,models:[A()]}),ke=class extends v{providers=[];form=j();editingProviderId;formOpen=!1;loading=!0;apiKeyVisible=!1;advancedOpen=!1;activePreset=``;testing=!1;testResult=`idle`;testError=``;autoEditProviderName=null;async connectedCallback(){if(super.connectedCallback(),await this.loadProviders(),this.autoEditProviderName){let e=this.providers.find(e=>e.name===this.autoEditProviderName);e&&await this.openEditForm(e),this.autoEditProviderName=null}}getTabName(){return D(`customModels`)}async loadProviders(){this.loading=!0,this.requestUpdate();try{this.providers=await y().customProviders.getAll()}catch(e){x.error(`Failed to load custom providers:`,e),this.providers=[]}finally{this.loading=!1,this.requestUpdate()}}resetTestState(){this.testing=!1,this.testResult=`idle`,this.testError=``}openAddForm(){this.editingProviderId=void 0,this.form=j(),this.apiKeyVisible=!1,this.advancedOpen=!1,this.activePreset=``,this.resetTestState(),this.formOpen=!0,this.requestUpdate()}async openEditForm(e){let t=await y().providerKeys.get(e.name)??e.apiKey??``,n=e.models??[],r=n.length>0?n.map(e=>({modelId:e.id,contextWindow:e.contextWindow??T.contextWindow,maxTokens:e.maxTokens??T.maxTokens,reasoning:e.reasoning===!0,supportsImages:e.input?.includes(`image`)===!0,open:!1})):[A()],i=n[0]?.headers??{},a=Object.entries(i).map(([e,t])=>({key:e,value:String(t)}));this.editingProviderId=e.id,this.form={providerId:e.id,id:e.id,name:e.name,baseUrl:e.baseUrl,apiKey:t,headerRows:a,protocol:e.type===`anthropic-messages`?`anthropic-messages`:`openai-completions`,models:r},this.apiKeyVisible=!1,this.advancedOpen=a.length>0||e.type===`anthropic-messages`,this.activePreset=``,this.resetTestState(),this.formOpen=!0,this.requestUpdate()}closeForm(){this.formOpen=!1,this.editingProviderId=void 0,this.form=j(),this.apiKeyVisible=!1,this.advancedOpen=!1,this.activePreset=``,this.resetTestState(),this.requestUpdate()}toggleApiKeyVisibility(){this.apiKeyVisible=!this.apiKeyVisible,this.requestUpdate()}updateForm(e,t){this.form={...this.form,[e]:t},(e===`name`||e===`baseUrl`)&&(this.activePreset=``),this.resetTestState(),this.requestUpdate()}updateModelField(e,t,n){let r=this.form.models.map((r,i)=>i===e?{...r,[t]:n}:r);this.form={...this.form,models:r},t===`modelId`&&(this.activePreset=``,this.resetTestState()),this.requestUpdate()}addModelRow(){this.form={...this.form,models:[...this.form.models,A()]},this.requestUpdate()}removeModelRow(e){let t=this.form.models.filter((t,n)=>n!==e);this.form={...this.form,models:t},this.requestUpdate()}toggleModelExpanded(e){let t=this.form.models.map((t,n)=>n===e?{...t,open:!t.open}:t);this.form={...this.form,models:t},this.requestUpdate()}addHeaderRow(){this.form={...this.form,headerRows:[...this.form.headerRows,{key:``,value:``}]},this.requestUpdate()}updateHeaderRow(e,t,n){let r=this.form.headerRows.map((r,i)=>i===e?{...r,[t]:n}:r);this.form={...this.form,headerRows:r},this.requestUpdate()}removeHeaderRow(e){let t=this.form.headerRows.filter((t,n)=>n!==e);this.form={...this.form,headerRows:t},this.requestUpdate()}applyPreset(e){if(this.activePreset=e,e===`custom`)this.form={...this.form,name:``,baseUrl:``,protocol:`openai-completions`,models:[A()]};else{let t=De[e];this.form={...this.form,name:t.name,baseUrl:t.baseUrl,protocol:t.protocol,models:[{...A(),modelId:t.modelId,supportsImages:t.supportsImages===!0,open:!1}]}}this.resetTestState(),this.requestUpdate()}buildHeadersFromRows(){let e={};for(let t of this.form.headerRows){let n=t.key.trim(),r=t.value.trim();n&&r&&(e[n]=r)}return e}buildModel(e,t){let n=this.form.name.trim(),r=this.form.baseUrl.trim(),i=e.reasoning===!0,a=e.supportsImages===!0?[`text`,`image`]:[`text`],o=r.includes(`api.deepseek.com`);return Se({id:e.modelId,name:`${e.modelId} (${n})`,api:this.form.protocol,provider:n,baseUrl:r.replace(/\/$/,``),reasoning:i,input:a,cost:{input:0,output:0,cacheRead:0,cacheWrite:0},contextWindow:Number(e.contextWindow)||T.contextWindow,maxTokens:Number(e.maxTokens)||T.maxTokens,headers:Object.keys(t).length>0?t:void 0,thinkingLevelMap:o&&i?{low:`high`,medium:`high`,high:`high`,xhigh:`max`}:void 0,compat:this.form.protocol===`openai-completions`?{supportsStore:!1,supportsDeveloperRole:!1,supportsReasoningEffort:i,supportsUsageInStreaming:!1,supportsStrictMode:!1,maxTokensField:`max_tokens`,...o&&i?{requiresReasoningContentOnAssistantMessages:!0,thinkingFormat:`deepseek`}:{}}:void 0})}async testConnection(){let e=this.form.baseUrl.trim(),t=this.form.models.find(e=>e.modelId.trim());if(!e||!t){this.testing=!1,this.testResult=`fail`,this.testError=D(`testRequiresFields`),this.requestUpdate();return}let n=this.buildHeadersFromRows(),r=this.buildModel(t,n);this.testing=!0,this.testResult=`idle`,this.testError=``,this.requestUpdate();try{let e=await(await fetch(`/api/models/test-connection`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({model:r,apiKey:this.form.apiKey.trim()})})).json().catch(()=>({}));e?.ok?(this.testResult=`ok`,this.testError=``):(this.testResult=`fail`,this.testError=e?.error||D(`connectionFailed`))}catch(e){this.testResult=`fail`,this.testError=e?.message||D(`connectionFailed`)}finally{this.testing=!1,this.requestUpdate()}}async saveModel(){let e=this.form.name.trim(),t=this.form.baseUrl.trim();if(!e||!t){w(D(`fillProviderBaseUrlModel`));return}let n=this.form.models.filter(e=>e.modelId.trim());if(n.length===0){w(D(`atLeastOneModel`));return}let r=n.map(e=>e.modelId.trim());if(new Set(r).size!==r.length){w(D(`duplicateModelId`));return}let i=this.buildHeadersFromRows(),a=n.map(e=>this.buildModel(e,i)),o=this.form.apiKey.trim(),s=this.editingProviderId?this.providers.find(e=>e.id===this.editingProviderId):void 0,c={id:this.editingProviderId??be(),name:e,type:this.form.protocol,baseUrl:a[0].baseUrl,apiKey:o||void 0,models:a};try{let e=y();await e.customProviders.set(c),s&&s.name!==c.name&&await e.providerKeys.delete(s.name),o?await e.providerKeys.set(c.name,o):await e.providerKeys.delete(c.name),this.closeForm(),await this.loadProviders()}catch(e){x.error(`Failed to save custom model:`,e),w(D(`saveCustomModelFailed`))}}async deleteProvider(e){if(await C({description:D(`confirmDeleteProvider`,{name:e.name}),confirmLabel:D(`confirmDelete`),cancelLabel:D(`cancel`),variant:`destructive`}))try{let t=y();await t.customProviders.delete(e.id),await t.providerKeys.delete(e.name),await this.loadProviders()}catch(e){x.error(`Failed to delete custom provider:`,e),w(D(`deleteFailed`))}}renderProvider(e){let t=e.models??[],n=t.length,r=e.type===`anthropic-messages`?`Anthropic Messages`:`OpenAI Compatible`;return _`
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/AgentProfilesPage-CooGLweI.js","assets/rolldown-runtime-DWdDZTNf.js","assets/index-DxNzlPmc.js","assets/pi-ai-Cr3rpCXT.js","assets/pi-web-ui-DoRGtREc.js","assets/lit-vendor-Dr3cpBGF.js","assets/css-utils-rkE68RDy.js","assets/icons-C7j5jdKo.js","assets/react-vendor-VqdnQHHS.js","assets/skills-dialog-CmVLi_h6.js","assets/logger-B65Akg8A.js","assets/index-HVxfqXfB.css","assets/mcp-servers-dialog-CsRQxx7A.js","assets/PluginsPage-qXTjDrpd.js","assets/plugin-api-BbUkYm3Y.js","assets/ScheduledTasksPage-BBor8Yb2.js"])))=>i.map(i=>d[i]);
2
+ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r,Nt as i,Pt as a,Rt as o,S as s,Vt as c,_ as ee,c as l,g as u,j as d,mt as f,p,pt as m,u as h,yt as te,zt as ne}from"./icons-C7j5jdKo.js";import{n as re,r as ie}from"./react-vendor-VqdnQHHS.js";import{p as g}from"./lit-vendor-Dr3cpBGF.js";import{m as _,x as v}from"./pi-web-ui-DoRGtREc.js";import{J as y}from"./pi-ai-Cr3rpCXT.js";import{t as b}from"./logger-B65Akg8A.js";import{$ as ae,A as x,B as oe,C as se,D as ce,E as le,F as ue,H as S,I as de,L as fe,M as pe,O as me,Q as he,T as ge,V as C,Z as w,at as T,ct as _e,dt as E,ft as ve,ht as D,it as ye,k as O,mt as be,ot as xe,pt as Se,rt as Ce,tt as we,ut as Te,w as Ee,z as De}from"./index-DxNzlPmc.js";var k=e(c(),1),Oe={openai:{name:`OpenAI`,baseUrl:`https://api.openai.com/v1`,protocol:`openai-completions`,modelId:`gpt-4o`,supportsImages:!0},deepseek:{name:`DeepSeek`,baseUrl:`https://api.deepseek.com/v1`,protocol:`openai-completions`,modelId:`deepseek-chat`},glm:{name:`Zhipu GLM`,baseUrl:`https://open.bigmodel.cn/api/paas/v4`,protocol:`openai-completions`,modelId:`glm-4-plus`},ollama:{name:`Ollama`,baseUrl:`http://localhost:11434/v1`,protocol:`openai-completions`,modelId:`llama3.1`},litellm:{name:w.name,baseUrl:w.baseUrl,protocol:`openai-completions`,modelId:w.modelId,supportsImages:w.supportsImages}},ke=[{key:`openai`,label:D(`presetOpenai`)},{key:`deepseek`,label:D(`presetDeepseek`)},{key:`glm`,label:D(`presetGlm`)},{key:`ollama`,label:D(`presetOllama`)},{key:`litellm`,label:D(`presetLitellm`)},{key:`custom`,label:D(`presetCustom`)}],A=()=>({modelId:``,contextWindow:w.contextWindow,maxTokens:w.maxTokens,reasoning:!0,supportsImages:!1,open:!1}),j=()=>({name:w.name,baseUrl:w.baseUrl,apiKey:``,headerRows:[],protocol:`openai-completions`,models:[A()]}),Ae=class extends _{providers=[];form=j();editingProviderId;formOpen=!1;loading=!0;apiKeyVisible=!1;advancedOpen=!1;activePreset=``;testing=!1;testResult=`idle`;testError=``;autoEditProviderName=null;async connectedCallback(){if(super.connectedCallback(),await this.loadProviders(),this.autoEditProviderName){let e=this.providers.find(e=>e.name===this.autoEditProviderName);e&&await this.openEditForm(e),this.autoEditProviderName=null}}getTabName(){return D(`customModels`)}async loadProviders(){this.loading=!0,this.requestUpdate();try{this.providers=await v().customProviders.getAll()}catch(e){b.error(`Failed to load custom providers:`,e),this.providers=[]}finally{this.loading=!1,this.requestUpdate()}}resetTestState(){this.testing=!1,this.testResult=`idle`,this.testError=``}openAddForm(){this.editingProviderId=void 0,this.form=j(),this.apiKeyVisible=!1,this.advancedOpen=!1,this.activePreset=``,this.resetTestState(),this.formOpen=!0,this.requestUpdate()}async openEditForm(e){let t=await v().providerKeys.get(e.name)??e.apiKey??``,n=e.models??[],r=n.length>0?n.map(e=>({modelId:e.id,contextWindow:e.contextWindow??w.contextWindow,maxTokens:e.maxTokens??w.maxTokens,reasoning:e.reasoning===!0,supportsImages:e.input?.includes(`image`)===!0,open:!1})):[A()],i=n[0]?.headers??{},a=Object.entries(i).map(([e,t])=>({key:e,value:String(t)}));this.editingProviderId=e.id,this.form={providerId:e.id,id:e.id,name:e.name,baseUrl:e.baseUrl,apiKey:t,headerRows:a,protocol:e.type===`anthropic-messages`?`anthropic-messages`:`openai-completions`,models:r},this.apiKeyVisible=!1,this.advancedOpen=a.length>0||e.type===`anthropic-messages`,this.activePreset=``,this.resetTestState(),this.formOpen=!0,this.requestUpdate()}closeForm(){this.formOpen=!1,this.editingProviderId=void 0,this.form=j(),this.apiKeyVisible=!1,this.advancedOpen=!1,this.activePreset=``,this.resetTestState(),this.requestUpdate()}toggleApiKeyVisibility(){this.apiKeyVisible=!this.apiKeyVisible,this.requestUpdate()}updateForm(e,t){this.form={...this.form,[e]:t},(e===`name`||e===`baseUrl`)&&(this.activePreset=``),this.resetTestState(),this.requestUpdate()}updateModelField(e,t,n){let r=this.form.models.map((r,i)=>i===e?{...r,[t]:n}:r);this.form={...this.form,models:r},t===`modelId`&&(this.activePreset=``,this.resetTestState()),this.requestUpdate()}addModelRow(){this.form={...this.form,models:[...this.form.models,A()]},this.requestUpdate()}removeModelRow(e){let t=this.form.models.filter((t,n)=>n!==e);this.form={...this.form,models:t},this.requestUpdate()}toggleModelExpanded(e){let t=this.form.models.map((t,n)=>n===e?{...t,open:!t.open}:t);this.form={...this.form,models:t},this.requestUpdate()}addHeaderRow(){this.form={...this.form,headerRows:[...this.form.headerRows,{key:``,value:``}]},this.requestUpdate()}updateHeaderRow(e,t,n){let r=this.form.headerRows.map((r,i)=>i===e?{...r,[t]:n}:r);this.form={...this.form,headerRows:r},this.requestUpdate()}removeHeaderRow(e){let t=this.form.headerRows.filter((t,n)=>n!==e);this.form={...this.form,headerRows:t},this.requestUpdate()}applyPreset(e){if(this.activePreset=e,e===`custom`)this.form={...this.form,name:``,baseUrl:``,protocol:`openai-completions`,models:[A()]};else{let t=Oe[e];this.form={...this.form,name:t.name,baseUrl:t.baseUrl,protocol:t.protocol,models:[{...A(),modelId:t.modelId,supportsImages:t.supportsImages===!0,open:!1}]}}this.resetTestState(),this.requestUpdate()}buildHeadersFromRows(){let e={};for(let t of this.form.headerRows){let n=t.key.trim(),r=t.value.trim();n&&r&&(e[n]=r)}return e}buildModel(e,t){let n=this.form.name.trim(),r=this.form.baseUrl.trim(),i=e.reasoning===!0,a=e.supportsImages===!0?[`text`,`image`]:[`text`],o=r.includes(`api.deepseek.com`);return Ce({id:e.modelId,name:`${e.modelId} (${n})`,api:this.form.protocol,provider:n,baseUrl:r.replace(/\/$/,``),reasoning:i,input:a,cost:{input:0,output:0,cacheRead:0,cacheWrite:0},contextWindow:Number(e.contextWindow)||w.contextWindow,maxTokens:Number(e.maxTokens)||w.maxTokens,headers:Object.keys(t).length>0?t:void 0,thinkingLevelMap:o&&i?{low:`high`,medium:`high`,high:`high`,xhigh:`max`}:void 0,compat:this.form.protocol===`openai-completions`?{supportsStore:!1,supportsDeveloperRole:!1,supportsReasoningEffort:i,supportsUsageInStreaming:!1,supportsStrictMode:!1,maxTokensField:`max_tokens`,...o&&i?{requiresReasoningContentOnAssistantMessages:!0,thinkingFormat:`deepseek`}:{}}:void 0})}async testConnection(){let e=this.form.baseUrl.trim(),t=this.form.models.find(e=>e.modelId.trim());if(!e||!t){this.testing=!1,this.testResult=`fail`,this.testError=D(`testRequiresFields`),this.requestUpdate();return}let n=this.buildHeadersFromRows(),r=this.buildModel(t,n);this.testing=!0,this.testResult=`idle`,this.testError=``,this.requestUpdate();try{let e=await(await fetch(`/api/models/test-connection`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({model:r,apiKey:this.form.apiKey.trim()})})).json().catch(()=>({}));e?.ok?(this.testResult=`ok`,this.testError=``):(this.testResult=`fail`,this.testError=e?.error||D(`connectionFailed`))}catch(e){this.testResult=`fail`,this.testError=e?.message||D(`connectionFailed`)}finally{this.testing=!1,this.requestUpdate()}}async saveModel(){let e=this.form.name.trim(),t=this.form.baseUrl.trim();if(!e||!t){C(D(`fillProviderBaseUrlModel`));return}let n=this.form.models.filter(e=>e.modelId.trim());if(n.length===0){C(D(`atLeastOneModel`));return}let r=n.map(e=>e.modelId.trim());if(new Set(r).size!==r.length){C(D(`duplicateModelId`));return}let i=this.buildHeadersFromRows(),a=n.map(e=>this.buildModel(e,i)),o=this.form.apiKey.trim(),s=this.editingProviderId?this.providers.find(e=>e.id===this.editingProviderId):void 0,c={id:this.editingProviderId??xe(),name:e,type:this.form.protocol,baseUrl:a[0].baseUrl,apiKey:o||void 0,models:a};try{let e=v();await e.customProviders.set(c),s&&s.name!==c.name&&await e.providerKeys.delete(s.name),o?await e.providerKeys.set(c.name,o):await e.providerKeys.delete(c.name),this.closeForm(),await this.loadProviders()}catch(e){b.error(`Failed to save custom model:`,e),C(D(`saveCustomModelFailed`))}}async deleteProvider(e){if(await S({description:D(`confirmDeleteProvider`,{name:e.name}),confirmLabel:D(`confirmDelete`),cancelLabel:D(`cancel`),variant:`destructive`}))try{let t=v();await t.customProviders.delete(e.id),await t.providerKeys.delete(e.name),await this.loadProviders()}catch(e){b.error(`Failed to delete custom provider:`,e),C(D(`deleteFailed`))}}renderProvider(e){let t=e.models??[],n=t.length,r=e.type===`anthropic-messages`?`Anthropic Messages`:`OpenAI Compatible`;return g`
3
3
  <div class="quickforge-settings-list-item">
4
4
  <div class="quickforge-settings-list-item-main">
5
5
  <div class="flex min-w-0 items-start gap-3">
@@ -10,14 +10,14 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
10
10
  <div class="quickforge-settings-meta">
11
11
  <span class="quickforge-settings-badge quickforge-settings-badge-muted">${D(`providerProtocol`)}: ${r}</span>
12
12
  <span class="quickforge-settings-badge quickforge-settings-badge-info">${D(`modelsCount`,{count:n})}</span>
13
- ${n===0?_`<span class="quickforge-settings-badge quickforge-settings-badge-warning">${D(`noModelAdded`)}</span>`:null}
13
+ ${n===0?g`<span class="quickforge-settings-badge quickforge-settings-badge-warning">${D(`noModelAdded`)}</span>`:null}
14
14
  </div>
15
- ${n>0?_`
15
+ ${n>0?g`
16
16
  <div class="quickforge-settings-meta">
17
- ${t.slice(0,6).map(e=>_`
17
+ ${t.slice(0,6).map(e=>g`
18
18
  <code class="quickforge-settings-command-name">${e.id}</code>
19
19
  `)}
20
- ${t.length>6?_`<span class="quickforge-settings-badge quickforge-settings-badge-muted">+${t.length-6}</span>`:null}
20
+ ${t.length>6?g`<span class="quickforge-settings-badge quickforge-settings-badge-muted">+${t.length-6}</span>`:null}
21
21
  </div>
22
22
  `:null}
23
23
  </div>
@@ -40,11 +40,11 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
40
40
  </button>
41
41
  </div>
42
42
  </div>
43
- `}renderPresetChips(){return _`
43
+ `}renderPresetChips(){return g`
44
44
  <div class="quickforge-settings-form-row">
45
45
  <span class="quickforge-settings-form-label">${D(`presets`)}</span>
46
46
  <div class="quickforge-settings-segmented quickforge-settings-segmented-wrap">
47
- ${Oe.map(e=>_`
47
+ ${ke.map(e=>g`
48
48
  <button
49
49
  class="quickforge-settings-segmented-option ${this.activePreset===e.key?`quickforge-settings-segmented-option-active`:``}"
50
50
  type="button"
@@ -55,7 +55,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
55
55
  `)}
56
56
  </div>
57
57
  </div>
58
- `}renderModelRow(e,t){let n=e.open===!0;return _`
58
+ `}renderModelRow(e,t){let n=e.open===!0;return g`
59
59
  <div class="quickforge-settings-subrow quickforge-settings-row-align-start">
60
60
  <button
61
61
  class="quickforge-settings-icon-action"
@@ -73,7 +73,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
73
73
  @input=${e=>this.updateModelField(t,`modelId`,e.target.value)}
74
74
  placeholder=${D(`modelIdPlaceholder`)}
75
75
  />
76
- ${n?_`
76
+ ${n?g`
77
77
  <div class="quickforge-settings-model-grid mt-3">
78
78
  <label class="quickforge-settings-form-row">
79
79
  <span class="quickforge-settings-form-label">${D(`contextWindow`)}</span>
@@ -115,7 +115,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
115
115
  </label>
116
116
  `:null}
117
117
  </div>
118
- ${this.form.models.length>1?_`
118
+ ${this.form.models.length>1?g`
119
119
  <button
120
120
  class="quickforge-settings-icon-action quickforge-settings-icon-action-danger"
121
121
  type="button"
@@ -126,15 +126,15 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
126
126
  </button>
127
127
  `:null}
128
128
  </div>
129
- `}renderHeadersEditor(){return _`
129
+ `}renderHeadersEditor(){return g`
130
130
  <div class="quickforge-settings-form-row">
131
131
  <span class="quickforge-settings-form-label">
132
132
  ${D(`customHeaders`)}
133
133
  <quickforge-info-tip .label=${D(`customHeadersHelp`)}></quickforge-info-tip>
134
134
  </span>
135
- ${this.form.headerRows.length===0?_``:_`
135
+ ${this.form.headerRows.length===0?g``:g`
136
136
  <div class="quickforge-settings-nested-list">
137
- ${this.form.headerRows.map((e,t)=>_`
137
+ ${this.form.headerRows.map((e,t)=>g`
138
138
  <div class="quickforge-settings-subrow">
139
139
  <input
140
140
  class="quickforge-settings-input"
@@ -168,7 +168,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
168
168
  + ${D(`addHeader`)}
169
169
  </button>
170
170
  </div>
171
- `}renderTestStatus(){return this.testResult===`idle`&&!this.testing?_``:this.testing?_`<span class="quickforge-settings-status">${D(`testingConnection`)}</span>`:this.testResult===`ok`?_`<span class="quickforge-settings-badge quickforge-settings-badge-success">✓ ${D(`connectionOk`)}</span>`:_`<span class="quickforge-settings-alert">✗ ${this.testError||D(`connectionFailed`)}</span>`}renderForm(){return _`
171
+ `}renderTestStatus(){return this.testResult===`idle`&&!this.testing?g``:this.testing?g`<span class="quickforge-settings-status">${D(`testingConnection`)}</span>`:this.testResult===`ok`?g`<span class="quickforge-settings-badge quickforge-settings-badge-success">✓ ${D(`connectionOk`)}</span>`:g`<span class="quickforge-settings-alert">✗ ${this.testError||D(`connectionFailed`)}</span>`}renderForm(){return g`
172
172
  <section class="quickforge-settings-section" aria-label=${this.editingProviderId?D(`editCustomModel`):D(`addCustomModel`)}>
173
173
  <div class="quickforge-settings-toolbar">
174
174
  <button
@@ -226,7 +226,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
226
226
  aria-pressed=${this.apiKeyVisible?`true`:`false`}
227
227
  @click=${()=>this.toggleApiKeyVisibility()}
228
228
  >
229
- ${this.apiKeyVisible?_`<svg class="size-4" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10.73 5.08A10.43 10.43 0 0 1 12 5c7 0 10 7 10 7a13.16 13.16 0 0 1-1.67 2.68"/><path d="M6.61 6.61A13.53 13.53 0 0 0 2 12s3 7 10 7a9.74 9.74 0 0 0 5.39-1.61"/><line x1="2" y1="2" x2="22" y2="22"/><path d="M8.53 8.53A5 5 0 0 0 12 17a5 5 0 0 0 3.47-8.53"/></svg>`:_`<svg class="size-4" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M2 12s3-7 10-7 10 7 10 7-3 7-10 7-10-7-10-7Z"/><circle cx="12" cy="12" r="3"/></svg>`}
229
+ ${this.apiKeyVisible?g`<svg class="size-4" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10.73 5.08A10.43 10.43 0 0 1 12 5c7 0 10 7 10 7a13.16 13.16 0 0 1-1.67 2.68"/><path d="M6.61 6.61A13.53 13.53 0 0 0 2 12s3 7 10 7a9.74 9.74 0 0 0 5.39-1.61"/><line x1="2" y1="2" x2="22" y2="22"/><path d="M8.53 8.53A5 5 0 0 0 12 17a5 5 0 0 0 3.47-8.53"/></svg>`:g`<svg class="size-4" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M2 12s3-7 10-7 10 7 10 7-3 7-10 7-10-7-10-7Z"/><circle cx="12" cy="12" r="3"/></svg>`}
230
230
  </button>
231
231
  </div>
232
232
  </label>
@@ -257,7 +257,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
257
257
  ${D(`providerAdvanced`)}
258
258
  </button>
259
259
 
260
- ${this.advancedOpen?_`
260
+ ${this.advancedOpen?g`
261
261
  <div class="quickforge-settings-form-grid rounded-lg border border-border p-3">
262
262
  <label class="quickforge-settings-form-row">
263
263
  <span class="quickforge-settings-form-label">
@@ -308,7 +308,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
308
308
  </div>
309
309
  </div>
310
310
  </section>
311
- `}render(){return this.formOpen?_`
311
+ `}render(){return this.formOpen?g`
312
312
  <div class="quickforge-settings-stack">
313
313
  <div class="quickforge-settings-heading">
314
314
  <h3 class="quickforge-settings-title">
@@ -318,7 +318,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
318
318
  </div>
319
319
  ${this.renderForm()}
320
320
  </div>
321
- `:_`
321
+ `:g`
322
322
  <div class="quickforge-settings-stack">
323
323
  <section class="quickforge-settings-section" aria-label=${D(`customModelsTitle`)}>
324
324
  <div class="quickforge-settings-toolbar">
@@ -335,10 +335,10 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
335
335
  </button>
336
336
  </div>
337
337
 
338
- ${this.loading?_`<div class="quickforge-settings-empty-row">${D(`loading`)}</div>`:this.providers.length===0?_`<div class="quickforge-settings-empty-row">${D(`noCustomModels`)}</div>`:this.providers.map(e=>this.renderProvider(e))}
338
+ ${this.loading?g`<div class="quickforge-settings-empty-row">${D(`loading`)}</div>`:this.providers.length===0?g`<div class="quickforge-settings-empty-row">${D(`noCustomModels`)}</div>`:this.providers.map(e=>this.renderProvider(e))}
339
339
  </section>
340
340
  </div>
341
- `}},M=`quickforge-custom-providers-only-tab`;customElements.get(M)||customElements.define(M,ke);function Ae(e){let t=document.createElement(M);return e&&(t.autoEditProviderName=e),t}var je=[{value:`light`,label:()=>D(`lightTheme`)},{value:`dark`,label:()=>D(`darkTheme`)}],Me=class extends v{theme=se();interfaceFontSizePx=O.interfaceFontSizePx;messageFontSizePx=O.messageFontSizePx;loading=!0;error=``;getTabName(){return D(`appearance`)}async connectedCallback(){super.connectedCallback(),await this.loadSettings()}async loadSettings(){this.loading=!0,this.error=``,this.requestUpdate();try{let e=y(),[t,n]=await Promise.all([oe(e),ce(e)]);this.theme=t.theme,this.interfaceFontSizePx=n.interfaceFontSizePx,this.messageFontSizePx=n.messageFontSizePx}catch(e){this.error=e instanceof Error?e.message:D(`requestFailed`)}finally{this.loading=!1,this.requestUpdate()}}async selectTheme(e){if(this.theme!==e){this.theme=e,this.requestUpdate();try{await fe(y(),{theme:e}),this.error=``,this.requestUpdate()}catch(e){this.error=e instanceof Error?e.message:D(`requestFailed`),this.requestUpdate()}}}currentFontSizeSettings(){return le({interfaceFontSizePx:this.interfaceFontSizePx,messageFontSizePx:this.messageFontSizePx})}previewFontSize(e){let t=le(e);this.interfaceFontSizePx=t.interfaceFontSizePx,this.messageFontSizePx=t.messageFontSizePx,de(t),this.requestUpdate()}updateInterfaceFontSize(e){this.previewFontSize({...this.currentFontSizeSettings(),interfaceFontSizePx:Number(e)||O.interfaceFontSizePx})}updateMessageFontSize(e){this.previewFontSize({...this.currentFontSizeSettings(),messageFontSizePx:Number(e)||O.messageFontSizePx})}async saveFontSize(){try{await ue(y(),this.currentFontSizeSettings()),this.error=``,this.requestUpdate()}catch(e){this.error=e instanceof Error?e.message:D(`requestFailed`),this.requestUpdate()}}renderThemeOption(e){let t=this.theme===e.value;return _`
341
+ `}},M=`quickforge-custom-providers-only-tab`;customElements.get(M)||customElements.define(M,Ae);function je(e){let t=document.createElement(M);return e&&(t.autoEditProviderName=e),t}var Me=[{value:`light`,label:()=>D(`lightTheme`)},{value:`dark`,label:()=>D(`darkTheme`)}],Ne=class extends _{theme=le();interfaceFontSizePx=O.interfaceFontSizePx;messageFontSizePx=O.messageFontSizePx;loading=!0;error=``;getTabName(){return D(`appearance`)}async connectedCallback(){super.connectedCallback(),await this.loadSettings()}async loadSettings(){this.loading=!0,this.error=``,this.requestUpdate();try{let e=v(),[t,n]=await Promise.all([ce(e),ue(e)]);this.theme=t.theme,this.interfaceFontSizePx=n.interfaceFontSizePx,this.messageFontSizePx=n.messageFontSizePx}catch(e){this.error=e instanceof Error?e.message:D(`requestFailed`)}finally{this.loading=!1,this.requestUpdate()}}async selectTheme(e){if(this.theme!==e){this.theme=e,this.requestUpdate();try{await me(v(),{theme:e}),this.error=``,this.requestUpdate()}catch(e){this.error=e instanceof Error?e.message:D(`requestFailed`),this.requestUpdate()}}}currentFontSizeSettings(){return de({interfaceFontSizePx:this.interfaceFontSizePx,messageFontSizePx:this.messageFontSizePx})}previewFontSize(e){let t=de(e);this.interfaceFontSizePx=t.interfaceFontSizePx,this.messageFontSizePx=t.messageFontSizePx,pe(t),this.requestUpdate()}updateInterfaceFontSize(e){this.previewFontSize({...this.currentFontSizeSettings(),interfaceFontSizePx:Number(e)||O.interfaceFontSizePx})}updateMessageFontSize(e){this.previewFontSize({...this.currentFontSizeSettings(),messageFontSizePx:Number(e)||O.messageFontSizePx})}async saveFontSize(){try{await fe(v(),this.currentFontSizeSettings()),this.error=``,this.requestUpdate()}catch(e){this.error=e instanceof Error?e.message:D(`requestFailed`),this.requestUpdate()}}renderThemeOption(e){let t=this.theme===e.value;return g`
342
342
  <button
343
343
  type="button"
344
344
  class="quickforge-settings-segmented-option ${t?`quickforge-settings-segmented-option-active`:``}"
@@ -347,12 +347,12 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
347
347
  >
348
348
  ${e.label()}
349
349
  </button>
350
- `}getFontSizeRangeProgress(e){return(e-S.min)/(S.max-S.min)*100}renderFontSizeSlider(e,t,n,r){return _`
350
+ `}getFontSizeRangeProgress(e){return(e-x.min)/(x.max-x.min)*100}renderFontSizeSlider(e,t,n,r){return g`
351
351
  <div class="quickforge-settings-row">
352
352
  <div class="quickforge-settings-row-main">
353
353
  <div class="quickforge-settings-row-title">
354
354
  ${e}
355
- ${t?_`<quickforge-info-tip .label=${t}></quickforge-info-tip>`:null}
355
+ ${t?g`<quickforge-info-tip .label=${t}></quickforge-info-tip>`:null}
356
356
  </div>
357
357
  <div class="quickforge-settings-row-description">${D(`fontSizeRangeDescription`)}</div>
358
358
  </div>
@@ -362,8 +362,8 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
362
362
  class="quickforge-font-size-slider"
363
363
  style=${`--quickforge-font-size-slider-progress: ${this.getFontSizeRangeProgress(n)}%`}
364
364
  type="range"
365
- min=${String(S.min)}
366
- max=${String(S.max)}
365
+ min=${String(x.min)}
366
+ max=${String(x.max)}
367
367
  step="1"
368
368
  .value=${String(n)}
369
369
  @input=${e=>r(e.target.value)}
@@ -371,7 +371,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
371
371
  />
372
372
  </div>
373
373
  </div>
374
- `}render(){return this.loading?_`<div class="text-sm text-muted-foreground">${D(`loading`)}</div>`:_`
374
+ `}render(){return this.loading?g`<div class="text-sm text-muted-foreground">${D(`loading`)}</div>`:g`
375
375
  <div class="quickforge-settings-stack">
376
376
  <section class="quickforge-settings-section" aria-label=${D(`appearance`)}>
377
377
  <div class="quickforge-settings-row">
@@ -384,7 +384,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
384
384
  </div>
385
385
  <div class="quickforge-settings-row-control">
386
386
  <div class="quickforge-settings-segmented" role="group" aria-label=${D(`theme`)}>
387
- ${je.map(e=>this.renderThemeOption(e))}
387
+ ${Me.map(e=>this.renderThemeOption(e))}
388
388
  </div>
389
389
  </div>
390
390
  </div>
@@ -394,32 +394,32 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
394
394
  ${this.renderFontSizeSlider(D(`messageFontSize`),D(`messageFontSizeNote`),this.messageFontSizePx,e=>this.updateMessageFontSize(e))}
395
395
  </section>
396
396
 
397
- ${this.error?_`<span class="quickforge-settings-error">${this.error}</span>`:null}
397
+ ${this.error?g`<span class="quickforge-settings-error">${this.error}</span>`:null}
398
398
  </div>
399
- `}},N=`quickforge-appearance-settings-tab`;customElements.get(N)||customElements.define(N,Me);function Ne(){return document.createElement(N)}var Pe=`auto-compact-settings`,P={enabled:!0,thresholdPercent:80,keepRecentTurns:3,minSourceChars:1600,requireConfirmation:!0};function F(e,t,n,r){let i=Number(e);return Number.isFinite(i)?Math.min(r,Math.max(n,Math.round(i))):t}function Fe(e){if(!e||typeof e!=`object`)return{...P};let t=e;return{enabled:t.enabled!==!1,thresholdPercent:F(t.thresholdPercent,P.thresholdPercent,50,95),keepRecentTurns:F(t.keepRecentTurns,P.keepRecentTurns,1,20),minSourceChars:F(t.minSourceChars,P.minSourceChars,0,2e5),requireConfirmation:t.requireConfirmation!==!1}}async function Ie(e){return Fe(await e.settings.get(Pe))}async function Le(e,t){await e.settings.set(Pe,Fe(t))}var Re=[{value:`off`,label:()=>D(`thinkingOff`)},{value:`low`,label:()=>D(`thinkingLow`)},{value:`medium`,label:()=>D(`thinkingMedium`)},{value:`high`,label:()=>D(`thinkingHigh`)},{value:`xhigh`,label:()=>D(`thinkingXHigh`)}];function ze(e){return(e??``).trim().replace(/\/$/,``)}function I(e){return JSON.stringify([e.provider,e.id,e.api,ze(e.baseUrl)])}function Be(e){return`${e.provider} / ${e.id}`}function Ve(){return`custom_${globalThis.crypto?.randomUUID?.().slice(0,8)||Date.now().toString(36)}`}function He(e){let t=e.trim(),n=t.split(/[\\/]/).pop()?.replace(/^"|"$/g,``)||t;return/^bash(\.exe)?$/i.test(n)?`Bash`:/^zsh$/i.test(n)?`Zsh`:/^fish$/i.test(n)?`Fish`:/^cmd(\.exe)?$/i.test(n)?`Command Prompt`:/^powershell(\.exe)?$/i.test(n)?`Windows PowerShell`:/^pwsh(\.exe)?$/i.test(n)?`PowerShell 7+`:n||`Custom Shell`}var Ue=_`
399
+ `}},N=`quickforge-appearance-settings-tab`;customElements.get(N)||customElements.define(N,Ne);function Pe(){return document.createElement(N)}var Fe=`auto-compact-settings`,P={enabled:!0,thresholdPercent:80,keepRecentTurns:3,minSourceChars:1600,requireConfirmation:!0};function F(e,t,n,r){let i=Number(e);return Number.isFinite(i)?Math.min(r,Math.max(n,Math.round(i))):t}function Ie(e){if(!e||typeof e!=`object`)return{...P};let t=e;return{enabled:t.enabled!==!1,thresholdPercent:F(t.thresholdPercent,P.thresholdPercent,50,95),keepRecentTurns:F(t.keepRecentTurns,P.keepRecentTurns,1,20),minSourceChars:F(t.minSourceChars,P.minSourceChars,0,2e5),requireConfirmation:t.requireConfirmation!==!1}}async function Le(e){return Ie(await e.settings.get(Fe))}async function Re(e,t){await e.settings.set(Fe,Ie(t))}var ze=[{value:`off`,label:()=>D(`thinkingOff`)},{value:`low`,label:()=>D(`thinkingLow`)},{value:`medium`,label:()=>D(`thinkingMedium`)},{value:`high`,label:()=>D(`thinkingHigh`)},{value:`xhigh`,label:()=>D(`thinkingXHigh`)}];function Be(e){return(e??``).trim().replace(/\/$/,``)}function I(e){return JSON.stringify([e.provider,e.id,e.api,Be(e.baseUrl)])}function Ve(e){return`${e.provider} / ${e.id}`}function He(){return`custom_${globalThis.crypto?.randomUUID?.().slice(0,8)||Date.now().toString(36)}`}function Ue(e){let t=e.trim(),n=t.split(/[\\/]/).pop()?.replace(/^"|"$/g,``)||t;return/^bash(\.exe)?$/i.test(n)?`Bash`:/^zsh$/i.test(n)?`Zsh`:/^fish$/i.test(n)?`Fish`:/^cmd(\.exe)?$/i.test(n)?`Command Prompt`:/^powershell(\.exe)?$/i.test(n)?`Windows PowerShell`:/^pwsh(\.exe)?$/i.test(n)?`PowerShell 7+`:n||`Custom Shell`}var We=g`
400
400
  <svg class="size-3.5" viewBox="0 0 16 16" fill="none" aria-hidden="true">
401
401
  <path d="M3.5 8.2 6.6 11.3 12.7 4.7" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" />
402
402
  </svg>
403
- `,We=_`
403
+ `,Ge=g`
404
404
  <svg class="size-3.5" viewBox="0 0 16 16" fill="none" aria-hidden="true">
405
405
  <circle cx="8" cy="8" r="4.8" stroke="currentColor" stroke-width="1.5" />
406
406
  </svg>
407
- `,Ge=_`
407
+ `,Ke=g`
408
408
  <svg class="size-3.5" viewBox="0 0 16 16" fill="none" aria-hidden="true">
409
409
  <path d="M4.5 4.5 11.5 11.5M11.5 4.5 4.5 11.5" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" />
410
410
  </svg>
411
- `,Ke=class extends v{models=[];selectedModel;thinkingLevel=`off`;showToolDetails=!1;expandToolsByDefault=!1;autoCompactEnabled=!0;autoCompactRequireConfirmation=!0;autoCompactThresholdPercent=80;autoCompactThresholdPercentInput=`80`;autoCompactKeepRecentTurns=3;selectedLanguage=xe();loading=!0;saved=!1;savedMessage=``;error=``;terminalShellConfig={terminalShell:`auto`,defaultProfileId:`auto`,profiles:[]};customShellCommand=``;getTabName(){return D(`defaultOptions`)}async connectedCallback(){super.connectedCallback(),await this.loadSettings()}updated(){this.syncSelectValues()}syncSelectValues(){let e=this.querySelector(`[data-default-model-select]`);e&&this.selectedModel&&(e.value=I(this.selectedModel));let t=this.querySelector(`[data-default-thinking-select]`);t&&(t.value=this.thinkingLevel);let n=this.querySelector(`[data-language-select]`);n&&(n.value=this.selectedLanguage)}async loadSettings(){this.loading=!0,this.error=``,this.requestUpdate();try{let e=y(),[t,n,r,i]=await Promise.all([re(e),Ce(e),Ee(e),Ie(e)]);this.models=t,this.selectedModel=n.model?t.find(e=>I(e)===I(n.model))??n.model:t[0],this.thinkingLevel=n.thinkingLevel??pe(this.selectedModel),this.showToolDetails=r.showToolDetails,this.expandToolsByDefault=r.expandToolsByDefault,this.autoCompactEnabled=i.enabled,this.autoCompactRequireConfirmation=i.requireConfirmation,this.autoCompactThresholdPercent=i.thresholdPercent,this.autoCompactThresholdPercentInput=String(i.thresholdPercent),this.autoCompactKeepRecentTurns=i.keepRecentTurns,await this.loadTerminalShell()}catch(e){this.error=e instanceof Error?e.message:D(`requestFailed`)}finally{this.loading=!1,this.requestUpdate()}}updateModel(e){let t=this.models.find(t=>I(t)===e);this.selectedModel=t,this.thinkingLevel=pe(t),this.saved=!1,this.requestUpdate(),this.saveDefaultModelOptions()}updateThinkingLevel(e){this.thinkingLevel=Re.some(t=>t.value===e)?e:`off`,this.saved=!1,this.requestUpdate(),this.saveDefaultModelOptions()}updateLanguage(e){this.selectedLanguage=e===`zh`?`zh`:`en`,this.requestUpdate(),this.applyLanguage()}async applyLanguage(){await _e(y(),this.selectedLanguage)}updateShowToolDetails(e){this.showToolDetails=e,this.saved=!1,this.requestUpdate(),this.saveToolDisplayOptions()}updateExpandToolsByDefault(e){this.expandToolsByDefault=e,this.saved=!1,this.requestUpdate(),this.saveToolDisplayOptions()}updateAutoCompactEnabled(e){this.autoCompactEnabled=e,this.saved=!1,this.requestUpdate(),this.saveAutoCompactOptions()}updateAutoCompactRequireConfirmation(e){this.autoCompactRequireConfirmation=e,this.saved=!1,this.requestUpdate(),this.saveAutoCompactOptions()}updateAutoCompactThresholdPercent(e){this.autoCompactThresholdPercentInput=e;let t=Number(e);e!==``&&Number.isFinite(t)&&(this.autoCompactThresholdPercent=t),this.saved=!1,this.requestUpdate()}updateAutoCompactKeepRecentTurns(e){this.autoCompactKeepRecentTurns=Number(e)||3,this.saved=!1,this.requestUpdate()}commitAutoCompactThresholdPercent(){let e=Number(this.autoCompactThresholdPercentInput);if(!Number.isFinite(e)){this.autoCompactThresholdPercentInput=String(this.autoCompactThresholdPercent),this.requestUpdate();return}let t=Math.max(50,Math.min(95,Math.round(e)));this.autoCompactThresholdPercent=t,this.autoCompactThresholdPercentInput=String(t),this.requestUpdate(),this.saveAutoCompactOptions()}commitAutoCompactKeepRecentTurns(){let e=Math.max(1,Math.min(20,Math.round(this.autoCompactKeepRecentTurns||3)));this.autoCompactKeepRecentTurns=e,this.requestUpdate(),this.saveAutoCompactOptions()}markSaved(e=D(`defaultOptionsSaved`)){this.saved=!0,this.savedMessage=e,this.error=``,this.requestUpdate()}customShellProfiles(){return this.terminalShellConfig.profiles.filter(e=>!e.builtin)}async loadTerminalShell(){try{let e=await fetch(`/api/system/terminal-shell`,{cache:`no-store`}),t=await e.json().catch(()=>null);if(!e.ok)throw Error(t?.error||D(`requestFailed`));this.terminalShellConfig={terminalShell:t?.terminalShell||`auto`,defaultProfileId:t?.defaultProfileId||`auto`,profiles:Array.isArray(t?.profiles)?t.profiles:[]}}catch(e){this.error=e instanceof Error?e.message:D(`requestFailed`)}}async saveTerminalShellConfig(e,t=this.customShellProfiles(),n=D(`terminalShellSaved`)){try{let r=await fetch(`/api/system/terminal-shell`,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify({defaultProfileId:e,profiles:t})}),i=await r.json().catch(()=>null);if(!r.ok)throw Error(i?.error||D(`requestFailed`));this.terminalShellConfig=i,this.markSaved(n)}catch(e){this.error=e instanceof Error?e.message:D(`requestFailed`),this.requestUpdate()}}async addCustomTerminalShell(){let e=this.customShellCommand.trim();if(!e){this.error=D(`terminalShellProfileRequired`),this.requestUpdate();return}let t=[...this.customShellProfiles(),{id:Ve(),name:He(e),command:e,builtin:!1}];this.customShellCommand=``,await this.saveTerminalShellConfig(this.terminalShellConfig.defaultProfileId,t,D(`terminalShellProfilesSaved`))}async deleteCustomTerminalShell(e){let t=this.terminalShellConfig.profiles.find(t=>t.id===e);if(!t||t.builtin||!await C({description:D(`terminalShellDeleteConfirm`,{name:t.name}),confirmLabel:D(`confirmDelete`),cancelLabel:D(`cancel`),variant:`destructive`}))return;let n=this.customShellProfiles().filter(t=>t.id!==e),r=this.terminalShellConfig.defaultProfileId===e?`auto`:this.terminalShellConfig.defaultProfileId;await this.saveTerminalShellConfig(r,n,D(`terminalShellProfilesSaved`))}async saveDefaultModelOptions(){try{let e=this.selectedModel?.reasoning?this.thinkingLevel:`off`;await ve(y(),{model:this.selectedModel,thinkingLevel:e}),this.markSaved()}catch(e){this.error=e instanceof Error?e.message:D(`requestFailed`),this.requestUpdate()}}async saveToolDisplayOptions(){try{await ie(y(),{showToolDetails:this.showToolDetails,expandToolsByDefault:this.expandToolsByDefault}),this.markSaved()}catch(e){this.error=e instanceof Error?e.message:D(`requestFailed`),this.requestUpdate()}}async saveAutoCompactOptions(){try{await Le(y(),{enabled:this.autoCompactEnabled,thresholdPercent:this.autoCompactThresholdPercent,keepRecentTurns:this.autoCompactKeepRecentTurns,minSourceChars:1600,requireConfirmation:this.autoCompactRequireConfirmation}),this.markSaved()}catch(e){this.error=e instanceof Error?e.message:D(`requestFailed`),this.requestUpdate()}}modelOptions(){if(!this.selectedModel)return this.models;let e=I(this.selectedModel);return this.models.some(t=>I(t)===e)?this.models:[this.selectedModel,...this.models]}shellProfileRow(e,t=!1){let n=e.id===this.terminalShellConfig.defaultProfileId||this.terminalShellConfig.defaultProfileId===`auto`&&t;return _`
411
+ `,qe=class extends _{models=[];selectedModel;thinkingLevel=`off`;showToolDetails=!1;expandToolsByDefault=!1;autoCompactEnabled=!0;autoCompactRequireConfirmation=!0;autoCompactThresholdPercent=80;autoCompactThresholdPercentInput=`80`;autoCompactKeepRecentTurns=3;selectedLanguage=Se();loading=!0;saved=!1;savedMessage=``;error=``;terminalShellConfig={terminalShell:`auto`,defaultProfileId:`auto`,profiles:[]};customShellCommand=``;getTabName(){return D(`defaultOptions`)}async connectedCallback(){super.connectedCallback(),await this.loadSettings()}updated(){this.syncSelectValues()}syncSelectValues(){let e=this.querySelector(`[data-default-model-select]`);e&&this.selectedModel&&(e.value=I(this.selectedModel));let t=this.querySelector(`[data-default-thinking-select]`);t&&(t.value=this.thinkingLevel);let n=this.querySelector(`[data-language-select]`);n&&(n.value=this.selectedLanguage)}async loadSettings(){this.loading=!0,this.error=``,this.requestUpdate();try{let e=v(),[t,n,r,i]=await Promise.all([ae(e),we(e),De(e),Le(e)]);this.models=t,this.selectedModel=n.model?t.find(e=>I(e)===I(n.model))??n.model:t[0],this.thinkingLevel=n.thinkingLevel??he(this.selectedModel),this.showToolDetails=r.showToolDetails,this.expandToolsByDefault=r.expandToolsByDefault,this.autoCompactEnabled=i.enabled,this.autoCompactRequireConfirmation=i.requireConfirmation,this.autoCompactThresholdPercent=i.thresholdPercent,this.autoCompactThresholdPercentInput=String(i.thresholdPercent),this.autoCompactKeepRecentTurns=i.keepRecentTurns,await this.loadTerminalShell()}catch(e){this.error=e instanceof Error?e.message:D(`requestFailed`)}finally{this.loading=!1,this.requestUpdate()}}updateModel(e){let t=this.models.find(t=>I(t)===e);this.selectedModel=t,this.thinkingLevel=he(t),this.saved=!1,this.requestUpdate(),this.saveDefaultModelOptions()}updateThinkingLevel(e){this.thinkingLevel=ze.some(t=>t.value===e)?e:`off`,this.saved=!1,this.requestUpdate(),this.saveDefaultModelOptions()}updateLanguage(e){this.selectedLanguage=e===`zh`?`zh`:`en`,this.requestUpdate(),this.applyLanguage()}async applyLanguage(){await ve(v(),this.selectedLanguage)}updateShowToolDetails(e){this.showToolDetails=e,this.saved=!1,this.requestUpdate(),this.saveToolDisplayOptions()}updateExpandToolsByDefault(e){this.expandToolsByDefault=e,this.saved=!1,this.requestUpdate(),this.saveToolDisplayOptions()}updateAutoCompactEnabled(e){this.autoCompactEnabled=e,this.saved=!1,this.requestUpdate(),this.saveAutoCompactOptions()}updateAutoCompactRequireConfirmation(e){this.autoCompactRequireConfirmation=e,this.saved=!1,this.requestUpdate(),this.saveAutoCompactOptions()}updateAutoCompactThresholdPercent(e){this.autoCompactThresholdPercentInput=e;let t=Number(e);e!==``&&Number.isFinite(t)&&(this.autoCompactThresholdPercent=t),this.saved=!1,this.requestUpdate()}updateAutoCompactKeepRecentTurns(e){this.autoCompactKeepRecentTurns=Number(e)||3,this.saved=!1,this.requestUpdate()}commitAutoCompactThresholdPercent(){let e=Number(this.autoCompactThresholdPercentInput);if(!Number.isFinite(e)){this.autoCompactThresholdPercentInput=String(this.autoCompactThresholdPercent),this.requestUpdate();return}let t=Math.max(50,Math.min(95,Math.round(e)));this.autoCompactThresholdPercent=t,this.autoCompactThresholdPercentInput=String(t),this.requestUpdate(),this.saveAutoCompactOptions()}commitAutoCompactKeepRecentTurns(){let e=Math.max(1,Math.min(20,Math.round(this.autoCompactKeepRecentTurns||3)));this.autoCompactKeepRecentTurns=e,this.requestUpdate(),this.saveAutoCompactOptions()}markSaved(e=D(`defaultOptionsSaved`)){this.saved=!0,this.savedMessage=e,this.error=``,this.requestUpdate()}customShellProfiles(){return this.terminalShellConfig.profiles.filter(e=>!e.builtin)}async loadTerminalShell(){try{let e=await fetch(`/api/system/terminal-shell`,{cache:`no-store`}),t=await e.json().catch(()=>null);if(!e.ok)throw Error(t?.error||D(`requestFailed`));this.terminalShellConfig={terminalShell:t?.terminalShell||`auto`,defaultProfileId:t?.defaultProfileId||`auto`,profiles:Array.isArray(t?.profiles)?t.profiles:[]}}catch(e){this.error=e instanceof Error?e.message:D(`requestFailed`)}}async saveTerminalShellConfig(e,t=this.customShellProfiles(),n=D(`terminalShellSaved`)){try{let r=await fetch(`/api/system/terminal-shell`,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify({defaultProfileId:e,profiles:t})}),i=await r.json().catch(()=>null);if(!r.ok)throw Error(i?.error||D(`requestFailed`));this.terminalShellConfig=i,this.markSaved(n)}catch(e){this.error=e instanceof Error?e.message:D(`requestFailed`),this.requestUpdate()}}async addCustomTerminalShell(){let e=this.customShellCommand.trim();if(!e){this.error=D(`terminalShellProfileRequired`),this.requestUpdate();return}let t=[...this.customShellProfiles(),{id:He(),name:Ue(e),command:e,builtin:!1}];this.customShellCommand=``,await this.saveTerminalShellConfig(this.terminalShellConfig.defaultProfileId,t,D(`terminalShellProfilesSaved`))}async deleteCustomTerminalShell(e){let t=this.terminalShellConfig.profiles.find(t=>t.id===e);if(!t||t.builtin||!await S({description:D(`terminalShellDeleteConfirm`,{name:t.name}),confirmLabel:D(`confirmDelete`),cancelLabel:D(`cancel`),variant:`destructive`}))return;let n=this.customShellProfiles().filter(t=>t.id!==e),r=this.terminalShellConfig.defaultProfileId===e?`auto`:this.terminalShellConfig.defaultProfileId;await this.saveTerminalShellConfig(r,n,D(`terminalShellProfilesSaved`))}async saveDefaultModelOptions(){try{let e=this.selectedModel?.reasoning?this.thinkingLevel:`off`;await ye(v(),{model:this.selectedModel,thinkingLevel:e}),this.markSaved()}catch(e){this.error=e instanceof Error?e.message:D(`requestFailed`),this.requestUpdate()}}async saveToolDisplayOptions(){try{await oe(v(),{showToolDetails:this.showToolDetails,expandToolsByDefault:this.expandToolsByDefault}),this.markSaved()}catch(e){this.error=e instanceof Error?e.message:D(`requestFailed`),this.requestUpdate()}}async saveAutoCompactOptions(){try{await Re(v(),{enabled:this.autoCompactEnabled,thresholdPercent:this.autoCompactThresholdPercent,keepRecentTurns:this.autoCompactKeepRecentTurns,minSourceChars:1600,requireConfirmation:this.autoCompactRequireConfirmation}),this.markSaved()}catch(e){this.error=e instanceof Error?e.message:D(`requestFailed`),this.requestUpdate()}}modelOptions(){if(!this.selectedModel)return this.models;let e=I(this.selectedModel);return this.models.some(t=>I(t)===e)?this.models:[this.selectedModel,...this.models]}shellProfileRow(e,t=!1){let n=e.id===this.terminalShellConfig.defaultProfileId||this.terminalShellConfig.defaultProfileId===`auto`&&t;return g`
412
412
  <div class="quickforge-settings-subrow">
413
413
  <div class="quickforge-settings-row-main">
414
414
  <div class="quickforge-settings-row-title">${e.name}</div>
415
415
  <div class="quickforge-settings-row-description quickforge-settings-mono" title=${e.command}>${e.command}</div>
416
416
  </div>
417
417
  <div class="quickforge-settings-row-control quickforge-settings-icon-actions">
418
- ${n?_`
418
+ ${n?g`
419
419
  <span class="quickforge-settings-icon-action quickforge-settings-icon-action-success" title=${D(`terminalShellDefaultBadge`)} aria-label=${D(`terminalShellDefaultBadge`)}>
420
- ${Ue}
420
+ ${We}
421
421
  </span>
422
- `:_`
422
+ `:g`
423
423
  <button
424
424
  class="quickforge-settings-icon-action"
425
425
  type="button"
@@ -427,10 +427,10 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
427
427
  aria-label=${D(`terminalShellSetDefault`)}
428
428
  @click=${()=>this.saveTerminalShellConfig(e.id)}
429
429
  >
430
- ${We}
430
+ ${Ge}
431
431
  </button>
432
432
  `}
433
- ${e.builtin?null:_`
433
+ ${e.builtin?null:g`
434
434
  <button
435
435
  class="quickforge-settings-icon-action quickforge-settings-icon-action-danger"
436
436
  type="button"
@@ -438,12 +438,12 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
438
438
  aria-label=${D(`delete`)}
439
439
  @click=${()=>this.deleteCustomTerminalShell(e.id)}
440
440
  >
441
- ${Ge}
441
+ ${Ke}
442
442
  </button>
443
443
  `}
444
444
  </div>
445
445
  </div>
446
- `}terminalShellSettings(){let e=this.terminalShellConfig.profiles;return _`
446
+ `}terminalShellSettings(){let e=this.terminalShellConfig.profiles;return g`
447
447
  <section class="quickforge-settings-section" aria-label=${D(`terminalShell`)}>
448
448
  <div class="quickforge-settings-row quickforge-settings-row-top">
449
449
  <div class="quickforge-settings-row-main">
@@ -456,7 +456,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
456
456
  </div>
457
457
 
458
458
  <div class="quickforge-settings-nested-list">
459
- ${e.length>0?e.map((e,t)=>this.shellProfileRow(e,t===0)):_`<div class="quickforge-settings-empty-row">${D(`terminalShellNoDetected`)}</div>`}
459
+ ${e.length>0?e.map((e,t)=>this.shellProfileRow(e,t===0)):g`<div class="quickforge-settings-empty-row">${D(`terminalShellNoDetected`)}</div>`}
460
460
  </div>
461
461
 
462
462
  <div class="quickforge-settings-row">
@@ -484,7 +484,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
484
484
  </div>
485
485
  </div>
486
486
  </section>
487
- `}renderSwitch(e,t,n=!1){return _`
487
+ `}renderSwitch(e,t,n=!1){return g`
488
488
  <label class="quickforge-settings-switch" aria-disabled=${n?`true`:`false`}>
489
489
  <input
490
490
  type="checkbox"
@@ -494,7 +494,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
494
494
  />
495
495
  <span aria-hidden="true"></span>
496
496
  </label>
497
- `}render(){return this.loading?_`<div class="text-sm text-muted-foreground">${D(`loading`)}</div>`:_`
497
+ `}render(){return this.loading?g`<div class="text-sm text-muted-foreground">${D(`loading`)}</div>`:g`
498
498
  <div class="quickforge-settings-stack">
499
499
  <section class="quickforge-settings-section" aria-label=${D(`defaultOptions`)}>
500
500
  <div class="quickforge-settings-row">
@@ -530,8 +530,8 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
530
530
  .value=${this.selectedModel?I(this.selectedModel):``}
531
531
  @change=${e=>this.updateModel(e.target.value)}
532
532
  >
533
- ${this.modelOptions().length===0?_`<option value="">${D(`noModelAvailable`)}</option>`:this.modelOptions().map(e=>_`
534
- <option .value=${I(e)}>${Be(e)}</option>
533
+ ${this.modelOptions().length===0?g`<option value="">${D(`noModelAvailable`)}</option>`:this.modelOptions().map(e=>g`
534
+ <option .value=${I(e)}>${Ve(e)}</option>
535
535
  `)}
536
536
  </select>
537
537
  </div>
@@ -552,7 +552,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
552
552
  ?disabled=${!this.selectedModel?.reasoning}
553
553
  @change=${e=>this.updateThinkingLevel(e.target.value)}
554
554
  >
555
- ${Re.map(e=>_`
555
+ ${ze.map(e=>g`
556
556
  <option .value=${e.value}>${e.label()}</option>
557
557
  `)}
558
558
  </select>
@@ -653,10 +653,80 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
653
653
 
654
654
  ${this.terminalShellSettings()}
655
655
 
656
- ${this.saved?_`<div class="quickforge-settings-message">${this.savedMessage||D(`defaultOptionsSaved`)}</div>`:null}
657
- ${this.error?_`<div class="quickforge-settings-alert">${this.error}</div>`:null}
656
+ ${this.saved?g`<div class="quickforge-settings-message">${this.savedMessage||D(`defaultOptionsSaved`)}</div>`:null}
657
+ ${this.error?g`<div class="quickforge-settings-alert">${this.error}</div>`:null}
658
+ </div>
659
+ `}},L=`quickforge-default-options-settings-tab`;customElements.get(L)||customElements.define(L,qe);function Je(){return document.createElement(L)}var Ye=`memory-settings`,Xe={enabled:!0};function Ze(e){return!e||typeof e!=`object`?{...Xe}:{enabled:e.enabled!==!1}}async function Qe(e){return Ze(await e.settings.get(Ye))}async function $e(e,t){await e.settings.set(Ye,Ze(t))}var et=class extends _{enabled=!0;loading=!0;saving=!1;loadingDocument=!1;markdown=``;savedMarkdown=``;memoryPath=`~/.quickforge/MEMORY.md`;message=``;error=``;getTabName(){return D(`memory`)}async connectedCallback(){super.connectedCallback(),await this.loadSettings()}async loadSettings(){this.loading=!0,this.error=``,this.requestUpdate();try{let[e]=await Promise.all([Qe(v()),this.loadDocument()]);this.enabled=e.enabled}catch(e){this.error=e instanceof Error?e.message:D(`requestFailed`)}finally{this.loading=!1,this.requestUpdate()}}async loadDocument(e=!1){this.loadingDocument=!0,this.error=``,e&&(this.message=``),this.requestUpdate();try{let t=await fetch(`/api/memory`,{cache:`no-store`}),n=await t.json().catch(()=>null);if(!t.ok||!n)throw Error(n?.error||D(`requestFailed`));this.markdown=n.markdown,this.savedMarkdown=n.markdown,this.memoryPath=n.path||this.memoryPath,e&&(this.message=D(`memoryReloaded`))}finally{this.loadingDocument=!1,this.requestUpdate()}}async updateEnabled(e){let t=this.enabled;this.enabled=e,this.saving=!0,this.message=``,this.error=``,this.requestUpdate();try{await $e(v(),{enabled:e}),this.message=D(e?`memoryEnabledSaved`:`memoryDisabledSaved`)}catch(e){this.enabled=t,this.error=e instanceof Error?e.message:D(`requestFailed`)}finally{this.saving=!1,this.requestUpdate()}}async reloadDocument(){try{await this.loadDocument(!0)}catch(e){this.error=e instanceof Error?e.message:D(`requestFailed`),this.requestUpdate()}}async saveDocument(){if(!(!this.enabled||this.saving)){this.saving=!0,this.message=``,this.error=``,this.requestUpdate();try{let e=await fetch(`/api/memory`,{method:`PUT`,headers:{"content-type":`application/json`},body:JSON.stringify({markdown:this.markdown})}),t=await e.json().catch(()=>null);if(!e.ok||!t)throw Error(t?.error||D(`requestFailed`));this.markdown=t.markdown,this.savedMarkdown=t.markdown,this.memoryPath=t.path||this.memoryPath,this.message=D(`memoryContentSaved`)}catch(e){this.error=e instanceof Error?e.message:D(`requestFailed`)}finally{this.saving=!1,this.requestUpdate()}}}renderSwitch(){return g`
660
+ <label class="quickforge-settings-switch" aria-disabled=${this.saving?`true`:`false`}>
661
+ <input
662
+ type="checkbox"
663
+ .checked=${this.enabled}
664
+ ?disabled=${this.saving}
665
+ @change=${e=>void this.updateEnabled(e.target.checked)}
666
+ />
667
+ <span aria-hidden="true"></span>
668
+ </label>
669
+ `}render(){if(this.loading)return g`<div class="text-sm text-muted-foreground">${D(`loading`)}</div>`;let e=this.markdown!==this.savedMarkdown,t=this.saving||this.loadingDocument;return g`
670
+ <div class="quickforge-settings-stack">
671
+ <section class="quickforge-settings-section" aria-label=${D(`memory`)}>
672
+ <div class="quickforge-settings-row">
673
+ <div class="quickforge-settings-row-main">
674
+ <div class="quickforge-settings-row-title">
675
+ ${D(`globalMemory`)}
676
+ <quickforge-info-tip .label=${D(`globalMemoryInfo`)}></quickforge-info-tip>
677
+ </div>
678
+ <div class="quickforge-settings-row-description">${D(`globalMemoryDescription`)}</div>
679
+ </div>
680
+ <div class="quickforge-settings-row-control">${this.renderSwitch()}</div>
681
+ </div>
682
+
683
+ <div class="quickforge-settings-row">
684
+ <div class="quickforge-settings-row-main">
685
+ <div class="quickforge-settings-row-title">${D(`memoryFile`)}</div>
686
+ <div class="quickforge-settings-row-description">${D(`memoryFileDescription`)}</div>
687
+ </div>
688
+ <div class="quickforge-settings-row-control quickforge-settings-row-control-wide">
689
+ <code class="text-xs text-muted-foreground">${this.memoryPath}</code>
690
+ </div>
691
+ </div>
692
+
693
+ <div class="quickforge-settings-row quickforge-settings-row-align-start quickforge-memory-content-row">
694
+ <div class="quickforge-settings-row-main">
695
+ <div class="quickforge-settings-row-title">${D(`memoryContent`)}</div>
696
+ <div class="quickforge-settings-row-description">${this.enabled?D(`memoryContentDescription`):D(`memoryContentDisabledDescription`)}</div>
697
+ </div>
698
+ <div class="quickforge-memory-editor-control">
699
+ <textarea
700
+ class="quickforge-settings-textarea quickforge-settings-mono quickforge-memory-editor"
701
+ .value=${this.markdown}
702
+ ?disabled=${!this.enabled||t}
703
+ spellcheck="false"
704
+ @input=${e=>{this.markdown=e.target.value,this.message=``,this.requestUpdate()}}
705
+ ></textarea>
706
+ <div class="quickforge-memory-editor-actions">
707
+ <button
708
+ class="quickforge-settings-button quickforge-settings-button-secondary"
709
+ type="button"
710
+ ?disabled=${t}
711
+ @click=${()=>void this.reloadDocument()}
712
+ >${this.loadingDocument?D(`loading`):D(`memoryReload`)}</button>
713
+ <button
714
+ class="quickforge-settings-button quickforge-settings-button-primary"
715
+ type="button"
716
+ ?disabled=${!this.enabled||t||!e}
717
+ @click=${()=>void this.saveDocument()}
718
+ >${this.saving?D(`saving`):D(`memorySave`)}</button>
719
+ </div>
720
+ </div>
721
+ </div>
722
+
723
+ <div class="quickforge-settings-note">${D(`memoryCurrentSessionNote`)}</div>
724
+ </section>
725
+
726
+ ${this.message?g`<div class="quickforge-settings-message">${this.message}</div>`:null}
727
+ ${this.error?g`<div class="quickforge-settings-alert">${this.error}</div>`:null}
658
728
  </div>
659
- `}},L=`quickforge-default-options-settings-tab`;customElements.get(L)||customElements.define(L,Ke);function qe(){return document.createElement(L)}var Je=`quickforge-backup`,R=[{id:`settings`,countKey:`settings`,label:()=>D(`restoreSettings`),description:()=>D(`restoreSettingsDescription`)},{id:`mcp`,countKey:`mcp`,label:()=>D(`restoreMcp`),description:()=>D(`restoreMcpDescription`)},{id:`providerKeys`,countKey:`providerKeys`,label:()=>D(`restoreProviderKeys`),description:()=>D(`restoreProviderKeysDescription`)},{id:`customProviders`,countKey:`customProviders`,label:()=>D(`restoreCustomProviders`),description:()=>D(`restoreCustomProvidersDescription`)},{id:`projects`,countKey:`projects`,label:()=>D(`restoreProjects`),description:()=>D(`restoreProjectsDescription`)},{id:`scheduledTasks`,countKey:`scheduledTasks`,label:()=>D(`restoreScheduledTasks`),description:()=>D(`restoreScheduledTasksDescription`)}],Ye=R;function Xe(e,t){let n=new Blob([`${JSON.stringify(t,null,2)}\n`],{type:`application/json`}),r=URL.createObjectURL(n),i=document.createElement(`a`);i.href=r,i.download=e,document.body.appendChild(i),i.click(),i.remove(),URL.revokeObjectURL(r)}function Ze(){return new Date().toISOString().replace(/[:.]/g,`-`)}function Qe(e){return e?Object.entries(e).map(([e,t])=>`${e}: ${t}`).join(`, `):``}function $e(e){return Ye.filter(t=>(e.sections?.[t.countKey]??0)>0)}function et(e){return $e(e).map(e=>e.id)}function tt(e){return e instanceof RangeError||e instanceof Error&&e.message.includes(`Invalid string length`)}function z(e,t){return tt(e)?D(`backupStringTooLarge`):e instanceof Error?e.message:t}var nt=class extends v{exportSections=new Set(R.map(e=>e.id));busy=!1;message=``;error=``;safetyBackupPath=``;pendingImport=null;getTabName(){return D(`backupRestore`)}toggleExportSection(e,t){t?this.exportSections.add(e):this.exportSections.delete(e),this.clearStatus(),this.requestUpdate()}clearStatus(){this.message=``,this.error=``,this.safetyBackupPath=``}async exportBackup(){if(this.exportSections.size===0){this.error=D(`selectAtLeastOneExportSection`),this.requestUpdate();return}this.busy=!0,this.clearStatus(),this.requestUpdate();try{let e=new URLSearchParams({sections:[...this.exportSections].join(`,`)}),t=await fetch(`/api/backup/export?${e.toString()}`,{cache:`no-store`}),n=await t.json().catch(()=>null);if(!t.ok)throw Error(n?.error||D(`backupExportFailed`));Xe(`${Je}-settings-${Ze()}.json`,n),this.message=D(`backupExported`)}catch(e){this.error=z(e,D(`backupExportFailed`))}finally{this.busy=!1,this.requestUpdate()}}async inspectBackupFile(e){let t=await fetch(`/api/backup/inspect-file`,{method:`POST`,headers:{"content-type":`application/json`},body:e}),n=await t.json().catch(()=>null);if(!t.ok)throw Error(n?.error||D(`backupInspectFailed`));if(!n)throw Error(D(`backupInspectFailed`));return n}async importBackupFromFile(e){this.busy=!0,this.clearStatus(),this.pendingImport=null,this.requestUpdate();try{let t=await this.inspectBackupFile(e),n=new Set(et(t));this.pendingImport={backup:null,importToken:t.importToken,inspect:t,selectedSections:n,mode:`replace`},this.message=t.ignoredConversations?D(`backupInspectedWithIgnoredConversations`):D(`backupInspected`)}catch(e){this.error=z(e,D(`backupImportFailed`))}finally{this.busy=!1,this.requestUpdate()}}togglePendingSection(e,t){this.pendingImport&&(t?this.pendingImport.selectedSections.add(e):this.pendingImport.selectedSections.delete(e),this.message=``,this.error=``,this.requestUpdate())}setRestoreMode(e){this.pendingImport&&(this.pendingImport.mode=e,this.message=``,this.error=``,this.requestUpdate())}cancelPendingImport(){this.pendingImport=null,this.message=``,this.error=``,this.requestUpdate()}async confirmPendingImport(){if(this.pendingImport){if(this.pendingImport.selectedSections.size===0){this.error=D(`selectAtLeastOneRestoreSection`),this.requestUpdate();return}if(await C({description:this.pendingImport.mode===`replace`?D(`backupImportReplaceConfirm`):D(`backupImportMergeConfirm`),confirmLabel:D(`confirmImportSelected`),cancelLabel:D(`cancel`)})){this.busy=!0,this.clearStatus(),this.requestUpdate();try{let e=this.pendingImport.importToken?{importToken:this.pendingImport.importToken,sections:[...this.pendingImport.selectedSections],mode:this.pendingImport.mode}:{backup:this.pendingImport.backup,sections:[...this.pendingImport.selectedSections],mode:this.pendingImport.mode},t=await fetch(`/api/backup/import`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(e)}),n=await t.json().catch(()=>null);if(!t.ok)throw Error(n?.error||D(`backupImportFailed`));let r=Qe(n?.summary);this.safetyBackupPath=n?.safetyBackupPath||``,this.pendingImport=null,this.message=r?`${D(`backupImported`)} ${r}`:D(`backupImported`),window.setTimeout(()=>window.location.reload(),1500)}catch(e){this.error=z(e,D(`backupImportFailed`))}finally{this.busy=!1,this.requestUpdate()}}}}handleFileChange(e){let t=e.target,n=t.files?.[0];t.value=``,n&&this.importBackupFromFile(n)}renderSwitch(e,t,n=!1){return _`
729
+ `}},R=`quickforge-memory-settings-tab`;customElements.get(R)||customElements.define(R,et);function tt(){return document.createElement(R)}var nt=`quickforge-backup`,z=[{id:`settings`,countKey:`settings`,label:()=>D(`restoreSettings`),description:()=>D(`restoreSettingsDescription`)},{id:`mcp`,countKey:`mcp`,label:()=>D(`restoreMcp`),description:()=>D(`restoreMcpDescription`)},{id:`providerKeys`,countKey:`providerKeys`,label:()=>D(`restoreProviderKeys`),description:()=>D(`restoreProviderKeysDescription`)},{id:`customProviders`,countKey:`customProviders`,label:()=>D(`restoreCustomProviders`),description:()=>D(`restoreCustomProvidersDescription`)},{id:`projects`,countKey:`projects`,label:()=>D(`restoreProjects`),description:()=>D(`restoreProjectsDescription`)},{id:`scheduledTasks`,countKey:`scheduledTasks`,label:()=>D(`restoreScheduledTasks`),description:()=>D(`restoreScheduledTasksDescription`)}],rt=z;function it(e,t){let n=new Blob([`${JSON.stringify(t,null,2)}\n`],{type:`application/json`}),r=URL.createObjectURL(n),i=document.createElement(`a`);i.href=r,i.download=e,document.body.appendChild(i),i.click(),i.remove(),URL.revokeObjectURL(r)}function at(){return new Date().toISOString().replace(/[:.]/g,`-`)}function ot(e){return e?Object.entries(e).map(([e,t])=>`${e}: ${t}`).join(`, `):``}function st(e){return rt.filter(t=>(e.sections?.[t.countKey]??0)>0)}function ct(e){return st(e).map(e=>e.id)}function lt(e){return e instanceof RangeError||e instanceof Error&&e.message.includes(`Invalid string length`)}function B(e,t){return lt(e)?D(`backupStringTooLarge`):e instanceof Error?e.message:t}var ut=class extends _{exportSections=new Set(z.map(e=>e.id));busy=!1;message=``;error=``;safetyBackupPath=``;pendingImport=null;getTabName(){return D(`backupRestore`)}toggleExportSection(e,t){t?this.exportSections.add(e):this.exportSections.delete(e),this.clearStatus(),this.requestUpdate()}clearStatus(){this.message=``,this.error=``,this.safetyBackupPath=``}async exportBackup(){if(this.exportSections.size===0){this.error=D(`selectAtLeastOneExportSection`),this.requestUpdate();return}this.busy=!0,this.clearStatus(),this.requestUpdate();try{let e=new URLSearchParams({sections:[...this.exportSections].join(`,`)}),t=await fetch(`/api/backup/export?${e.toString()}`,{cache:`no-store`}),n=await t.json().catch(()=>null);if(!t.ok)throw Error(n?.error||D(`backupExportFailed`));it(`${nt}-settings-${at()}.json`,n),this.message=D(`backupExported`)}catch(e){this.error=B(e,D(`backupExportFailed`))}finally{this.busy=!1,this.requestUpdate()}}async inspectBackupFile(e){let t=await fetch(`/api/backup/inspect-file`,{method:`POST`,headers:{"content-type":`application/json`},body:e}),n=await t.json().catch(()=>null);if(!t.ok)throw Error(n?.error||D(`backupInspectFailed`));if(!n)throw Error(D(`backupInspectFailed`));return n}async importBackupFromFile(e){this.busy=!0,this.clearStatus(),this.pendingImport=null,this.requestUpdate();try{let t=await this.inspectBackupFile(e),n=new Set(ct(t));this.pendingImport={backup:null,importToken:t.importToken,inspect:t,selectedSections:n,mode:`replace`},this.message=t.ignoredConversations?D(`backupInspectedWithIgnoredConversations`):D(`backupInspected`)}catch(e){this.error=B(e,D(`backupImportFailed`))}finally{this.busy=!1,this.requestUpdate()}}togglePendingSection(e,t){this.pendingImport&&(t?this.pendingImport.selectedSections.add(e):this.pendingImport.selectedSections.delete(e),this.message=``,this.error=``,this.requestUpdate())}setRestoreMode(e){this.pendingImport&&(this.pendingImport.mode=e,this.message=``,this.error=``,this.requestUpdate())}cancelPendingImport(){this.pendingImport=null,this.message=``,this.error=``,this.requestUpdate()}async confirmPendingImport(){if(this.pendingImport){if(this.pendingImport.selectedSections.size===0){this.error=D(`selectAtLeastOneRestoreSection`),this.requestUpdate();return}if(await S({description:this.pendingImport.mode===`replace`?D(`backupImportReplaceConfirm`):D(`backupImportMergeConfirm`),confirmLabel:D(`confirmImportSelected`),cancelLabel:D(`cancel`)})){this.busy=!0,this.clearStatus(),this.requestUpdate();try{let e=this.pendingImport.importToken?{importToken:this.pendingImport.importToken,sections:[...this.pendingImport.selectedSections],mode:this.pendingImport.mode}:{backup:this.pendingImport.backup,sections:[...this.pendingImport.selectedSections],mode:this.pendingImport.mode},t=await fetch(`/api/backup/import`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(e)}),n=await t.json().catch(()=>null);if(!t.ok)throw Error(n?.error||D(`backupImportFailed`));let r=ot(n?.summary);this.safetyBackupPath=n?.safetyBackupPath||``,this.pendingImport=null,this.message=r?`${D(`backupImported`)} ${r}`:D(`backupImported`),window.setTimeout(()=>window.location.reload(),1500)}catch(e){this.error=B(e,D(`backupImportFailed`))}finally{this.busy=!1,this.requestUpdate()}}}}handleFileChange(e){let t=e.target,n=t.files?.[0];t.value=``,n&&this.importBackupFromFile(n)}renderSwitch(e,t,n=!1){return g`
660
730
  <label class="quickforge-settings-switch" aria-disabled=${n?`true`:`false`}>
661
731
  <input
662
732
  type="checkbox"
@@ -666,7 +736,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
666
736
  />
667
737
  <span aria-hidden="true"></span>
668
738
  </label>
669
- `}renderPendingImport(){if(!this.pendingImport)return null;let{inspect:e,selectedSections:t}=this.pendingImport,n=$e(e);return _`
739
+ `}renderPendingImport(){if(!this.pendingImport)return null;let{inspect:e,selectedSections:t}=this.pendingImport,n=st(e);return g`
670
740
  <section class="quickforge-settings-section" aria-label=${D(`backupInspectTitle`)}>
671
741
  <div class="quickforge-settings-row quickforge-settings-row-top">
672
742
  <div class="quickforge-settings-row-main">
@@ -702,16 +772,16 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
702
772
  </div>
703
773
  </div>
704
774
 
705
- ${e.warnings?.length?_`
775
+ ${e.warnings?.length?g`
706
776
  <div class="quickforge-settings-warning quickforge-settings-warning-attached">
707
- ${e.warnings.map(e=>_`<div>⚠ ${e}</div>`)}
777
+ ${e.warnings.map(e=>g`<div>⚠ ${e}</div>`)}
708
778
  </div>
709
779
  `:null}
710
780
 
711
- ${e.invalidSections&&Object.keys(e.invalidSections).length?_`
781
+ ${e.invalidSections&&Object.keys(e.invalidSections).length?g`
712
782
  <div class="quickforge-settings-warning quickforge-settings-warning-attached">
713
783
  <div>${D(`backupInvalidSections`)}</div>
714
- ${Object.entries(e.invalidSections).map(([e,t])=>_`<div>${e}: ${t}</div>`)}
784
+ ${Object.entries(e.invalidSections).map(([e,t])=>g`<div>${e}: ${t}</div>`)}
715
785
  </div>
716
786
  `:null}
717
787
 
@@ -751,7 +821,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
751
821
  </div>
752
822
  </div>
753
823
  <div class="quickforge-settings-nested-list">
754
- ${n.map(n=>_`
824
+ ${n.map(n=>g`
755
825
  <div class="quickforge-settings-subrow">
756
826
  <div class="quickforge-settings-row-main">
757
827
  <div class="quickforge-settings-row-title">${n.label()} (${e.sections?.[n.countKey]??0})</div>
@@ -789,7 +859,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
789
859
  </div>
790
860
  </div>
791
861
  </section>
792
- `}render(){return _`
862
+ `}render(){return g`
793
863
  <div class="quickforge-settings-stack">
794
864
  <section class="quickforge-settings-section" aria-label=${D(`exportData`)}>
795
865
  <div class="quickforge-settings-row quickforge-settings-row-top">
@@ -803,7 +873,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
803
873
  </div>
804
874
 
805
875
  <div class="quickforge-settings-nested-list">
806
- ${R.map(e=>_`
876
+ ${z.map(e=>g`
807
877
  <div class="quickforge-settings-subrow">
808
878
  <div class="quickforge-settings-row-main">
809
879
  <div class="quickforge-settings-row-title">${e.label()}</div>
@@ -861,17 +931,17 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
861
931
  </section>
862
932
 
863
933
  ${this.renderPendingImport()}
864
- ${this.message?_`<div class="quickforge-settings-message">${this.message}</div>`:null}
865
- ${this.safetyBackupPath?_`<div class="quickforge-settings-note">${D(`backupSafetyBackupPath`)}: <code>${this.safetyBackupPath}</code></div>`:null}
866
- ${this.error?_`<div class="quickforge-settings-alert">${this.error}</div>`:null}
934
+ ${this.message?g`<div class="quickforge-settings-message">${this.message}</div>`:null}
935
+ ${this.safetyBackupPath?g`<div class="quickforge-settings-note">${D(`backupSafetyBackupPath`)}: <code>${this.safetyBackupPath}</code></div>`:null}
936
+ ${this.error?g`<div class="quickforge-settings-alert">${this.error}</div>`:null}
867
937
  </div>
868
- `}},B=`quickforge-backup-settings-tab`;customElements.get(B)||customElements.define(B,nt);function rt(){return document.createElement(B)}function it(e){if(!e)return`-`;let t=new Date(e);return Number.isNaN(t.getTime())?e:t.toLocaleString(ye())}function at(e){let t={...e};return delete t.archivedAt,t}function V(){if(!(typeof BroadcastChannel>`u`))try{let e=new BroadcastChannel(`quickforge-sync`);e.postMessage({type:`sessions-changed`,sourceTabId:`archived-conversations-settings-tab`,timestamp:Date.now()}),e.close()}catch{}}var ot=class extends v{sessions=[];projects=[];loading=!0;busySessionId=``;query=``;projectFilter=`all`;message=``;error=``;getTabName(){return D(`archivedConversations`)}async connectedCallback(){super.connectedCallback(),await this.loadData()}get projectNameById(){return new Map(this.projects.map(e=>[e.id,e.name]))}async loadData(){this.loading=!0,this.error=``,this.requestUpdate();try{let[e,t]=await Promise.all([fetch(`/api/storage/sessions-metadata/index/lastModified?direction=desc&limit=1000&offset=0&archived=only`,{cache:`no-store`}),fetch(`/api/project`,{cache:`no-store`}).catch(()=>null)]),n=await e.json().catch(()=>null);if(!e.ok)throw Error(n?.error||D(`requestFailed`));if(this.sessions=Array.isArray(n?.values)?n.values:[],t?.ok){let e=await t.json().catch(()=>null);this.projects=Array.isArray(e?.projects)?e.projects:[]}}catch(e){this.error=e instanceof Error?e.message:D(`requestFailed`)}finally{this.loading=!1,this.requestUpdate()}}filteredSessions(){let e=this.query.trim().toLowerCase();return this.sessions.filter(t=>{if(this.projectFilter!==`all`&&(this.projectFilter===`global`&&t.scope===`project`||this.projectFilter!==`global`&&t.projectId!==this.projectFilter))return!1;if(!e)return!0;let n=t.projectId&&this.projectNameById.get(t.projectId)||``;return`${E(t.title)} ${n}`.toLowerCase().includes(e)})}groupedSessions(){let e=new Map;for(let t of this.filteredSessions()){let n=t.scope===`project`&&t.projectId?t.projectId:`global`;e.set(n,[...e.get(n)??[],t])}return[...e.entries()]}projectLabel(e){return e===`global`?D(`normalChat`):this.projectNameById.get(e)||D(`unknownProject`)}async restoreSession(e){if(!this.busySessionId){this.busySessionId=e,this.message=``,this.error=``,this.requestUpdate();try{let t=y(),n=await t.sessions.get(e),r=await t.sessions.getMetadata(e);if(!n||!r)throw Error(D(`sessionNotFound`));await t.sessions.save(at(n),at(r)),this.sessions=this.sessions.filter(t=>t.id!==e),this.message=D(`sessionRestored`),V()}catch(e){this.error=e instanceof Error?e.message:D(`restoreSessionFailed`)}finally{this.busySessionId=``,this.requestUpdate()}}}async deleteSession(e){if(!this.busySessionId&&await C({description:D(`deleteArchivedSessionConfirm`,{title:E(e.title)}),confirmLabel:D(`confirmDelete`),cancelLabel:D(`cancel`),variant:`destructive`})){this.busySessionId=e.id,this.message=``,this.error=``,this.requestUpdate();try{await y().sessions.delete(e.id),this.sessions=this.sessions.filter(t=>t.id!==e.id),this.message=D(`archivedSessionDeleted`),V()}catch(e){this.error=e instanceof Error?e.message:D(`deleteSessionFailed`)}finally{this.busySessionId=``,this.requestUpdate()}}}async deleteAllArchivedSessions(){if(!(this.busySessionId||this.sessions.length===0)&&await C({description:D(`deleteAllArchivedSessionsConfirm`),confirmLabel:D(`confirmDelete`),cancelLabel:D(`cancel`),variant:`destructive`})){this.busySessionId=`__all__`,this.message=``,this.error=``,this.requestUpdate();try{let e=y();await Promise.all(this.sessions.map(t=>e.sessions.delete(t.id))),this.sessions=[],this.message=D(`archivedSessionsDeleted`),V()}catch(e){this.error=e instanceof Error?e.message:D(`deleteSessionFailed`)}finally{this.busySessionId=``,this.requestUpdate()}}}renderSession(e){let t=this.busySessionId===e.id||this.busySessionId===`__all__`;return _`
938
+ `}},V=`quickforge-backup-settings-tab`;customElements.get(V)||customElements.define(V,ut);function dt(){return document.createElement(V)}function ft(e){if(!e)return`-`;let t=new Date(e);return Number.isNaN(t.getTime())?e:t.toLocaleString(be())}function pt(e){let t={...e};return delete t.archivedAt,t}function H(){if(!(typeof BroadcastChannel>`u`))try{let e=new BroadcastChannel(`quickforge-sync`);e.postMessage({type:`sessions-changed`,sourceTabId:`archived-conversations-settings-tab`,timestamp:Date.now()}),e.close()}catch{}}var mt=class extends _{sessions=[];projects=[];loading=!0;busySessionId=``;query=``;projectFilter=`all`;message=``;error=``;getTabName(){return D(`archivedConversations`)}async connectedCallback(){super.connectedCallback(),await this.loadData()}get projectNameById(){return new Map(this.projects.map(e=>[e.id,e.name]))}async loadData(){this.loading=!0,this.error=``,this.requestUpdate();try{let[e,t]=await Promise.all([fetch(`/api/storage/sessions-metadata/index/lastModified?direction=desc&limit=1000&offset=0&archived=only`,{cache:`no-store`}),fetch(`/api/project`,{cache:`no-store`}).catch(()=>null)]),n=await e.json().catch(()=>null);if(!e.ok)throw Error(n?.error||D(`requestFailed`));if(this.sessions=Array.isArray(n?.values)?n.values:[],t?.ok){let e=await t.json().catch(()=>null);this.projects=Array.isArray(e?.projects)?e.projects:[]}}catch(e){this.error=e instanceof Error?e.message:D(`requestFailed`)}finally{this.loading=!1,this.requestUpdate()}}filteredSessions(){let e=this.query.trim().toLowerCase();return this.sessions.filter(t=>{if(this.projectFilter!==`all`&&(this.projectFilter===`global`&&t.scope===`project`||this.projectFilter!==`global`&&t.projectId!==this.projectFilter))return!1;if(!e)return!0;let n=t.projectId&&this.projectNameById.get(t.projectId)||``;return`${T(t.title)} ${n}`.toLowerCase().includes(e)})}groupedSessions(){let e=new Map;for(let t of this.filteredSessions()){let n=t.scope===`project`&&t.projectId?t.projectId:`global`;e.set(n,[...e.get(n)??[],t])}return[...e.entries()]}projectLabel(e){return e===`global`?D(`normalChat`):this.projectNameById.get(e)||D(`unknownProject`)}async restoreSession(e){if(!this.busySessionId){this.busySessionId=e,this.message=``,this.error=``,this.requestUpdate();try{let t=v(),n=await t.sessions.get(e),r=await t.sessions.getMetadata(e);if(!n||!r)throw Error(D(`sessionNotFound`));await t.sessions.save(pt(n),pt(r)),this.sessions=this.sessions.filter(t=>t.id!==e),this.message=D(`sessionRestored`),H()}catch(e){this.error=e instanceof Error?e.message:D(`restoreSessionFailed`)}finally{this.busySessionId=``,this.requestUpdate()}}}async deleteSession(e){if(!this.busySessionId&&await S({description:D(`deleteArchivedSessionConfirm`,{title:T(e.title)}),confirmLabel:D(`confirmDelete`),cancelLabel:D(`cancel`),variant:`destructive`})){this.busySessionId=e.id,this.message=``,this.error=``,this.requestUpdate();try{await v().sessions.delete(e.id),this.sessions=this.sessions.filter(t=>t.id!==e.id),this.message=D(`archivedSessionDeleted`),H()}catch(e){this.error=e instanceof Error?e.message:D(`deleteSessionFailed`)}finally{this.busySessionId=``,this.requestUpdate()}}}async deleteAllArchivedSessions(){if(!(this.busySessionId||this.sessions.length===0)&&await S({description:D(`deleteAllArchivedSessionsConfirm`),confirmLabel:D(`confirmDelete`),cancelLabel:D(`cancel`),variant:`destructive`})){this.busySessionId=`__all__`,this.message=``,this.error=``,this.requestUpdate();try{let e=v();await Promise.all(this.sessions.map(t=>e.sessions.delete(t.id))),this.sessions=[],this.message=D(`archivedSessionsDeleted`),H()}catch(e){this.error=e instanceof Error?e.message:D(`deleteSessionFailed`)}finally{this.busySessionId=``,this.requestUpdate()}}}renderSession(e){let t=this.busySessionId===e.id||this.busySessionId===`__all__`;return g`
869
939
  <div class="border-t border-border px-4 py-3 first:border-t-0">
870
940
  <div class="flex items-start justify-between gap-3">
871
941
  <div class="min-w-0">
872
- <div class="truncate text-sm font-medium text-foreground">${E(e.title)}</div>
942
+ <div class="truncate text-sm font-medium text-foreground">${T(e.title)}</div>
873
943
  <div class="mt-1 text-xs text-muted-foreground">
874
- ${D(`lastModified`)}: ${it(e.lastModified)} · ${D(`archivedAt`)}: ${it(e.archivedAt)}
944
+ ${D(`lastModified`)}: ${ft(e.lastModified)} · ${D(`archivedAt`)}: ${ft(e.archivedAt)}
875
945
  </div>
876
946
  </div>
877
947
  <div class="flex shrink-0 items-center gap-2">
@@ -894,7 +964,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
894
964
  </div>
895
965
  </div>
896
966
  </div>
897
- `}render(){let e=this.groupedSessions();return _`
967
+ `}render(){let e=this.groupedSessions();return g`
898
968
  <div class="flex flex-col gap-4">
899
969
  <div class="flex justify-end">
900
970
  <button
@@ -923,17 +993,17 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
923
993
  >
924
994
  <option value="all">${D(`allProjects`)}</option>
925
995
  <option value="global">${D(`normalChat`)}</option>
926
- ${this.projects.map(e=>_`<option value=${e.id}>${e.name}</option>`)}
996
+ ${this.projects.map(e=>g`<option value=${e.id}>${e.name}</option>`)}
927
997
  </select>
928
998
  </div>
929
999
 
930
- ${this.loading?_`
1000
+ ${this.loading?g`
931
1001
  <div class="px-4 py-8 text-center text-sm text-muted-foreground">${D(`loading`)}</div>
932
- `:e.length===0?_`
1002
+ `:e.length===0?g`
933
1003
  <div class="px-4 py-8 text-center text-sm text-muted-foreground">${D(`noArchivedConversations`)}</div>
934
- `:_`
1004
+ `:g`
935
1005
  <div>
936
- ${e.map(([e,t])=>_`
1006
+ ${e.map(([e,t])=>g`
937
1007
  <div class="border-b border-border last:border-b-0">
938
1008
  <div class="flex items-center justify-between gap-3 bg-muted/20 px-4 py-2 text-sm text-muted-foreground">
939
1009
  <div class="truncate">${this.projectLabel(e)}</div>
@@ -946,10 +1016,10 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
946
1016
  `}
947
1017
  </section>
948
1018
 
949
- ${this.message?_`<div class="rounded-md border border-emerald-500/30 bg-emerald-500/10 px-3 py-2 text-sm text-emerald-700 dark:text-emerald-300">${this.message}</div>`:null}
950
- ${this.error?_`<div class="rounded-md border border-destructive/30 bg-destructive/10 px-3 py-2 text-sm text-destructive">${this.error}</div>`:null}
1019
+ ${this.message?g`<div class="rounded-md border border-emerald-500/30 bg-emerald-500/10 px-3 py-2 text-sm text-emerald-700 dark:text-emerald-300">${this.message}</div>`:null}
1020
+ ${this.error?g`<div class="rounded-md border border-destructive/30 bg-destructive/10 px-3 py-2 text-sm text-destructive">${this.error}</div>`:null}
951
1021
  </div>
952
- `}},H=`quickforge-archived-conversations-settings-tab`;customElements.get(H)||customElements.define(H,ot);function st(){return document.createElement(H)}function ct(){return Array.from({length:16},()=>`ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz23456789!@#$%^&*`[Math.floor(Math.random()*65)]).join(``)}var lt=class extends v{loading=!0;saving=!1;enabled=!1;hasPassword=!1;password=``;sessionTtlHours=12;activeTokenCount=0;lanUrls=[];error=``;message=``;getTabName(){return D(`lanAccess`)}async connectedCallback(){super.connectedCallback(),await this.loadStatus()}async request(e,t){let n=await fetch(e,{...t,cache:`no-store`,headers:{...t?.body?{"content-type":`application/json`}:void 0,...t?.headers}}),r=await n.json().catch(()=>null);if(!n.ok)throw Error(r?.error||D(`requestFailed`));return r}applyStatus(e){this.enabled=!!e.enabled,this.hasPassword=!!e.hasPassword,this.sessionTtlHours=Number(e.sessionTtlHours||12),this.activeTokenCount=Number(e.activeTokenCount||0),this.lanUrls=Array.isArray(e.lanUrls)?e.lanUrls:[]}async loadStatus(){this.loading=!0,this.error=``,this.requestUpdate();try{this.applyStatus(await this.request(`/api/lan-access/status`))}catch(e){this.error=e instanceof Error?e.message:D(`requestFailed`)}finally{this.loading=!1,this.requestUpdate()}}updatePassword(e){this.password=e,this.requestUpdate()}updateEnabled(e){this.enabled=e,this.requestUpdate()}updateTtl(e){this.sessionTtlHours=Number(e)||12,this.requestUpdate()}async saveSettings(){if(!this.saving){if(this.enabled&&!this.hasPassword&&!this.password.trim()){this.error=D(`lanAccessPasswordRequired`),this.requestUpdate();return}if(this.password.trim()&&this.password.trim().length<8){this.error=D(`lanAccessPasswordTooShort`),this.requestUpdate();return}if(!(this.enabled&&!await C({description:D(`lanAccessEnableConfirm`),confirmLabel:D(`enabled`),cancelLabel:D(`cancel`)}))){this.saving=!0,this.error=``,this.message=``,this.requestUpdate();try{let e=await this.request(`/api/lan-access/settings`,{method:`PUT`,body:JSON.stringify({enabled:this.enabled,password:this.password.trim()||void 0,sessionTtlHours:this.sessionTtlHours})});this.applyStatus(e),this.password=``,this.message=D(`lanAccessSaved`)}catch(e){this.error=e instanceof Error?e.message:D(`requestFailed`)}finally{this.saving=!1,this.requestUpdate()}}}}async revokeAll(){if(await C({description:D(`lanAccessRevokeAllConfirm`),confirmLabel:D(`lanAccessRevokeAll`),cancelLabel:D(`cancel`),variant:`destructive`})){this.saving=!0,this.error=``,this.message=``,this.requestUpdate();try{let e=await this.request(`/api/lan-access/revoke-all`,{method:`POST`});this.applyStatus(e),this.message=D(`lanAccessRevoked`)}catch(e){this.error=e instanceof Error?e.message:D(`requestFailed`)}finally{this.saving=!1,this.requestUpdate()}}}renderSwitch(e,t,n=!1){return _`
1022
+ `}},U=`quickforge-archived-conversations-settings-tab`;customElements.get(U)||customElements.define(U,mt);function ht(){return document.createElement(U)}function gt(){return Array.from({length:16},()=>`ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz23456789!@#$%^&*`[Math.floor(Math.random()*65)]).join(``)}var _t=class extends _{loading=!0;saving=!1;enabled=!1;hasPassword=!1;password=``;sessionTtlHours=12;activeTokenCount=0;lanUrls=[];error=``;message=``;getTabName(){return D(`lanAccess`)}async connectedCallback(){super.connectedCallback(),await this.loadStatus()}async request(e,t){let n=await fetch(e,{...t,cache:`no-store`,headers:{...t?.body?{"content-type":`application/json`}:void 0,...t?.headers}}),r=await n.json().catch(()=>null);if(!n.ok)throw Error(r?.error||D(`requestFailed`));return r}applyStatus(e){this.enabled=!!e.enabled,this.hasPassword=!!e.hasPassword,this.sessionTtlHours=Number(e.sessionTtlHours||12),this.activeTokenCount=Number(e.activeTokenCount||0),this.lanUrls=Array.isArray(e.lanUrls)?e.lanUrls:[]}async loadStatus(){this.loading=!0,this.error=``,this.requestUpdate();try{this.applyStatus(await this.request(`/api/lan-access/status`))}catch(e){this.error=e instanceof Error?e.message:D(`requestFailed`)}finally{this.loading=!1,this.requestUpdate()}}updatePassword(e){this.password=e,this.requestUpdate()}updateEnabled(e){this.enabled=e,this.requestUpdate()}updateTtl(e){this.sessionTtlHours=Number(e)||12,this.requestUpdate()}async saveSettings(){if(!this.saving){if(this.enabled&&!this.hasPassword&&!this.password.trim()){this.error=D(`lanAccessPasswordRequired`),this.requestUpdate();return}if(this.password.trim()&&this.password.trim().length<8){this.error=D(`lanAccessPasswordTooShort`),this.requestUpdate();return}if(!(this.enabled&&!await S({description:D(`lanAccessEnableConfirm`),confirmLabel:D(`enabled`),cancelLabel:D(`cancel`)}))){this.saving=!0,this.error=``,this.message=``,this.requestUpdate();try{let e=await this.request(`/api/lan-access/settings`,{method:`PUT`,body:JSON.stringify({enabled:this.enabled,password:this.password.trim()||void 0,sessionTtlHours:this.sessionTtlHours})});this.applyStatus(e),this.password=``,this.message=D(`lanAccessSaved`)}catch(e){this.error=e instanceof Error?e.message:D(`requestFailed`)}finally{this.saving=!1,this.requestUpdate()}}}}async revokeAll(){if(await S({description:D(`lanAccessRevokeAllConfirm`),confirmLabel:D(`lanAccessRevokeAll`),cancelLabel:D(`cancel`),variant:`destructive`})){this.saving=!0,this.error=``,this.message=``,this.requestUpdate();try{let e=await this.request(`/api/lan-access/revoke-all`,{method:`POST`});this.applyStatus(e),this.message=D(`lanAccessRevoked`)}catch(e){this.error=e instanceof Error?e.message:D(`requestFailed`)}finally{this.saving=!1,this.requestUpdate()}}}renderSwitch(e,t,n=!1){return g`
953
1023
  <label class="quickforge-settings-switch" aria-disabled=${n?`true`:`false`}>
954
1024
  <input
955
1025
  type="checkbox"
@@ -959,7 +1029,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
959
1029
  />
960
1030
  <span aria-hidden="true"></span>
961
1031
  </label>
962
- `}render(){return this.loading?_`<div class="text-sm text-muted-foreground">${D(`loading`)}</div>`:_`
1032
+ `}render(){return this.loading?g`<div class="text-sm text-muted-foreground">${D(`loading`)}</div>`:g`
963
1033
  <div class="quickforge-settings-stack">
964
1034
  <div class="quickforge-settings-warning">${D(`lanAccessRiskWarning`)}</div>
965
1035
 
@@ -991,7 +1061,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
991
1061
  <div class="quickforge-settings-row-description">${D(`lanAccessUrlsDescription`)}</div>
992
1062
  </div>
993
1063
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide quickforge-settings-readonly-value">
994
- ${this.lanUrls.length?this.lanUrls.map(e=>_`<div>${e}</div>`):`-`}
1064
+ ${this.lanUrls.length?this.lanUrls.map(e=>g`<div>${e}</div>`):`-`}
995
1065
  </div>
996
1066
  </div>
997
1067
  </section>
@@ -1023,7 +1093,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
1023
1093
  <button
1024
1094
  class="quickforge-settings-button quickforge-settings-button-secondary"
1025
1095
  type="button"
1026
- @click=${()=>this.updatePassword(ct())}
1096
+ @click=${()=>this.updatePassword(gt())}
1027
1097
  >
1028
1098
  ${D(`generatePassword`)}
1029
1099
  </button>
@@ -1061,10 +1131,10 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
1061
1131
  </div>
1062
1132
  </section>
1063
1133
 
1064
- ${this.message?_`<div class="quickforge-settings-message">${this.message}</div>`:null}
1065
- ${this.error?_`<div class="quickforge-settings-alert">${this.error}</div>`:null}
1134
+ ${this.message?g`<div class="quickforge-settings-message">${this.message}</div>`:null}
1135
+ ${this.error?g`<div class="quickforge-settings-alert">${this.error}</div>`:null}
1066
1136
  </div>
1067
- `}},U=`quickforge-lan-access-settings-tab`;customElements.get(U)||customElements.define(U,lt);function ut(){return document.createElement(U)}var dt=18e4,ft=3e4,pt=1e3,mt=`https://github.com/shawnstack/quickforge/releases/latest`;function W(){if(typeof document>`u`)return!1;let e=window;return document.body.classList.contains(`quickforge-desktop-app`)||e.__quickforgeDesktopApp===!0}function ht(e){return new Promise(t=>window.setTimeout(t,e))}var gt=[{value:`startup`,label:()=>D(`frequencyStartup`)},{value:`daily`,label:()=>D(`frequencyDaily`)},{value:`weekly`,label:()=>D(`frequencyWeekly`)},{value:`off`,label:()=>D(`frequencyOff`)}],_t=class extends v{about;updateInfo;loading=!0;checking=!1;updating=!1;restarting=!1;message=``;error=``;frequency=ae.frequency;lastCheckAt=null;serviceStatus;getTabName(){return D(`about`)}async connectedCallback(){super.connectedCallback(),await this.loadAbout()}async loadAbout(){this.loading=!0,this.error=``,this.requestUpdate();try{let e=await fetch(`/api/system/about`,{cache:`no-store`}),t=await e.json().catch(()=>null);if(!e.ok)throw Error(t?.error||D(`requestFailed`));this.about=t;try{let[e,t]=await Promise.all([Te(y()),this.loadServiceStatus()]);this.frequency=e.frequency,this.lastCheckAt=e.lastCheckAt,this.serviceStatus=t}catch{}}catch(e){this.error=e instanceof Error?e.message:D(`requestFailed`)}finally{this.loading=!1,this.requestUpdate()}}async loadServiceStatus(){let e=await fetch(`/api/health`,{cache:`no-store`}),t=await e.json().catch(()=>null);if(!e.ok)throw Error(t?.error||D(`requestFailed`));return t}async checkUpdate(){if(!(this.checking||this.updating)){if(W()){window.open(mt,`_blank`,`noopener,noreferrer`),this.message=D(`desktopUpdateHint`),this.error=``,this.requestUpdate();return}this.checking=!0,this.message=``,this.error=``,this.requestUpdate();try{let e=await fetch(`/api/system/update/check`,{cache:`no-store`}),t=await e.json().catch(()=>null);if(!e.ok)throw Error(t?.error||D(`updateCheckFailed`));this.updateInfo=t,this.about=t,this.updateInfo.updateAvailable?this.message=D(`updateAvailableMessage`,{current:this.updateInfo.currentVersion,latest:this.updateInfo.latestVersion}):this.updateInfo.localVersionIsNewer?this.message=D(`localVersionNewerMessage`,{current:this.updateInfo.currentVersion,latest:this.updateInfo.latestVersion}):this.message=D(`alreadyLatestVersion`,{version:this.updateInfo.currentVersion})}catch(e){this.error=e instanceof Error?e.message:D(`updateCheckFailed`)}finally{this.checking=!1,this.requestUpdate()}}}async pollUntilUpdated(e){let t=Date.now();for(;Date.now()-t<dt;){await ht(pt);try{let t=await fetch(`/api/health?updatePoll=${Date.now()}`,{cache:`no-store`}),n=await t.json().catch(()=>null);if(t.ok&&n?.ok&&n.bootId&&n.bootId!==e){this.message=D(`updateRestarted`),this.requestUpdate(),window.setTimeout(()=>window.location.reload(),300);return}}catch{}}throw Error(D(`updateRestartTimeout`))}async pollUntilRestarted(e){let t=Date.now();for(;Date.now()-t<ft;){await ht(pt);try{let t=await fetch(`/api/health?restartPoll=${Date.now()}`,{cache:`no-store`}),n=await t.json().catch(()=>null);if(t.ok&&n?.ok&&n.bootId&&n.bootId!==e){this.message=D(`backendRestarted`),this.requestUpdate(),window.setTimeout(()=>window.location.reload(),300);return}}catch{}}throw Error(D(`backendRestartTimeout`))}async restartService(){if(!this.serviceStatus||this.restarting||!await C({description:D(`restartBackendConfirm`),confirmLabel:D(`restartBackendService`),cancelLabel:D(`cancel`)}))return;this.restarting=!0,this.message=D(`backendRestarting`),this.error=``,this.requestUpdate();let e=this.serviceStatus.bootId;try{let t=await fetch(`/api/system/restart`,{method:`POST`,headers:{"x-quickforge-action":`restart`}}),n=await t.json().catch(()=>null);if(!t.ok)throw Error(n?.error||D(`backendRestartFailed`));await this.pollUntilRestarted(e)}catch(e){this.error=e instanceof Error?e.message:D(`backendRestartFailed`),this.message=``,this.restarting=!1,this.requestUpdate()}}async updateQuickForge(){if(W()){window.open(mt,`_blank`,`noopener,noreferrer`),this.message=D(`desktopUpdateHint`),this.error=``,this.requestUpdate();return}if(!(!this.updateInfo?.updateAvailable||this.updating)&&await C({description:D(`updateConfirm`,{command:this.updateInfo.installCommand}),confirmLabel:D(`updateRuntimeNow`),cancelLabel:D(`cancel`)})){this.updating=!0,this.message=D(`updatingQuickForge`),this.error=``,this.requestUpdate();try{let e=await fetch(`/api/system/update`,{method:`POST`,headers:{"x-quickforge-action":`update`}}),t=await e.json().catch(()=>null);if(!e.ok)throw Error(t?.error||D(`updateFailed`));if(this.updateInfo=t,t?.updateStarted){let e=t.logFile?` ${D(`updateLogFile`,{path:t.logFile})}`:``;this.message=`${D(`updateStarted`)}${e}`,this.requestUpdate(),await this.pollUntilUpdated(t.bootId)}else this.message=t?.updated?D(`updateCompleted`):D(`alreadyLatestVersion`,{version:t?.currentVersion||this.about?.version||`-`}),this.updating=!1}catch(e){this.error=e instanceof Error?e.message:D(`updateFailed`),this.message=``,this.updating=!1}finally{this.requestUpdate()}}}async selectFrequency(e){if(this.frequency!==e){this.frequency=e,this.requestUpdate();try{let t=y();await me(t,{...await Te(t),frequency:e}),this.error=``}catch(e){this.error=e instanceof Error?e.message:D(`requestFailed`)}finally{this.requestUpdate()}}}renderFrequencyOption(e){let t=this.frequency===e.value;return _`
1137
+ `}},W=`quickforge-lan-access-settings-tab`;customElements.get(W)||customElements.define(W,_t);function vt(){return document.createElement(W)}var yt=18e4,bt=3e4,xt=1e3,St=`https://github.com/shawnstack/quickforge/releases/latest`;function G(){if(typeof document>`u`)return!1;let e=window;return document.body.classList.contains(`quickforge-desktop-app`)||e.__quickforgeDesktopApp===!0}function Ct(e){return new Promise(t=>window.setTimeout(t,e))}var wt=[{value:`startup`,label:()=>D(`frequencyStartup`)},{value:`daily`,label:()=>D(`frequencyDaily`)},{value:`weekly`,label:()=>D(`frequencyWeekly`)},{value:`off`,label:()=>D(`frequencyOff`)}],Tt=class extends _{about;updateInfo;loading=!0;checking=!1;updating=!1;restarting=!1;message=``;error=``;frequency=se.frequency;lastCheckAt=null;serviceStatus;getTabName(){return D(`about`)}async connectedCallback(){super.connectedCallback(),await this.loadAbout()}async loadAbout(){this.loading=!0,this.error=``,this.requestUpdate();try{let e=await fetch(`/api/system/about`,{cache:`no-store`}),t=await e.json().catch(()=>null);if(!e.ok)throw Error(t?.error||D(`requestFailed`));this.about=t;try{let[e,t]=await Promise.all([Ee(v()),this.loadServiceStatus()]);this.frequency=e.frequency,this.lastCheckAt=e.lastCheckAt,this.serviceStatus=t}catch{}}catch(e){this.error=e instanceof Error?e.message:D(`requestFailed`)}finally{this.loading=!1,this.requestUpdate()}}async loadServiceStatus(){let e=await fetch(`/api/health`,{cache:`no-store`}),t=await e.json().catch(()=>null);if(!e.ok)throw Error(t?.error||D(`requestFailed`));return t}async checkUpdate(){if(!(this.checking||this.updating)){if(G()){window.open(St,`_blank`,`noopener,noreferrer`),this.message=D(`desktopUpdateHint`),this.error=``,this.requestUpdate();return}this.checking=!0,this.message=``,this.error=``,this.requestUpdate();try{let e=await fetch(`/api/system/update/check`,{cache:`no-store`}),t=await e.json().catch(()=>null);if(!e.ok)throw Error(t?.error||D(`updateCheckFailed`));this.updateInfo=t,this.about=t,this.updateInfo.updateAvailable?this.message=D(`updateAvailableMessage`,{current:this.updateInfo.currentVersion,latest:this.updateInfo.latestVersion}):this.updateInfo.localVersionIsNewer?this.message=D(`localVersionNewerMessage`,{current:this.updateInfo.currentVersion,latest:this.updateInfo.latestVersion}):this.message=D(`alreadyLatestVersion`,{version:this.updateInfo.currentVersion})}catch(e){this.error=e instanceof Error?e.message:D(`updateCheckFailed`)}finally{this.checking=!1,this.requestUpdate()}}}async pollUntilUpdated(e){let t=Date.now();for(;Date.now()-t<yt;){await Ct(xt);try{let t=await fetch(`/api/health?updatePoll=${Date.now()}`,{cache:`no-store`}),n=await t.json().catch(()=>null);if(t.ok&&n?.ok&&n.bootId&&n.bootId!==e){this.message=D(`updateRestarted`),this.requestUpdate(),window.setTimeout(()=>window.location.reload(),300);return}}catch{}}throw Error(D(`updateRestartTimeout`))}async pollUntilRestarted(e){let t=Date.now();for(;Date.now()-t<bt;){await Ct(xt);try{let t=await fetch(`/api/health?restartPoll=${Date.now()}`,{cache:`no-store`}),n=await t.json().catch(()=>null);if(t.ok&&n?.ok&&n.bootId&&n.bootId!==e){this.message=D(`backendRestarted`),this.requestUpdate(),window.setTimeout(()=>window.location.reload(),300);return}}catch{}}throw Error(D(`backendRestartTimeout`))}async restartService(){if(!this.serviceStatus||this.restarting||!await S({description:D(`restartBackendConfirm`),confirmLabel:D(`restartBackendService`),cancelLabel:D(`cancel`)}))return;this.restarting=!0,this.message=D(`backendRestarting`),this.error=``,this.requestUpdate();let e=this.serviceStatus.bootId;try{let t=await fetch(`/api/system/restart`,{method:`POST`,headers:{"x-quickforge-action":`restart`}}),n=await t.json().catch(()=>null);if(!t.ok)throw Error(n?.error||D(`backendRestartFailed`));await this.pollUntilRestarted(e)}catch(e){this.error=e instanceof Error?e.message:D(`backendRestartFailed`),this.message=``,this.restarting=!1,this.requestUpdate()}}async updateQuickForge(){if(G()){window.open(St,`_blank`,`noopener,noreferrer`),this.message=D(`desktopUpdateHint`),this.error=``,this.requestUpdate();return}if(!(!this.updateInfo?.updateAvailable||this.updating)&&await S({description:D(`updateConfirm`,{command:this.updateInfo.installCommand}),confirmLabel:D(`updateRuntimeNow`),cancelLabel:D(`cancel`)})){this.updating=!0,this.message=D(`updatingQuickForge`),this.error=``,this.requestUpdate();try{let e=await fetch(`/api/system/update`,{method:`POST`,headers:{"x-quickforge-action":`update`}}),t=await e.json().catch(()=>null);if(!e.ok)throw Error(t?.error||D(`updateFailed`));if(this.updateInfo=t,t?.updateStarted){let e=t.logFile?` ${D(`updateLogFile`,{path:t.logFile})}`:``;this.message=`${D(`updateStarted`)}${e}`,this.requestUpdate(),await this.pollUntilUpdated(t.bootId)}else this.message=t?.updated?D(`updateCompleted`):D(`alreadyLatestVersion`,{version:t?.currentVersion||this.about?.version||`-`}),this.updating=!1}catch(e){this.error=e instanceof Error?e.message:D(`updateFailed`),this.message=``,this.updating=!1}finally{this.requestUpdate()}}}async selectFrequency(e){if(this.frequency!==e){this.frequency=e,this.requestUpdate();try{let t=v();await ge(t,{...await Ee(t),frequency:e}),this.error=``}catch(e){this.error=e instanceof Error?e.message:D(`requestFailed`)}finally{this.requestUpdate()}}}renderFrequencyOption(e){let t=this.frequency===e.value;return g`
1068
1138
  <button
1069
1139
  type="button"
1070
1140
  class="quickforge-settings-segmented-option ${t?`quickforge-settings-segmented-option-active`:``}"
@@ -1073,7 +1143,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
1073
1143
  >
1074
1144
  ${e.label()}
1075
1145
  </button>
1076
- `}infoRows(){let e=this.about;return e?_`
1146
+ `}infoRows(){let e=this.about;return e?g`
1077
1147
  <div class="quickforge-settings-row">
1078
1148
  <div class="quickforge-settings-row-main">
1079
1149
  <div class="quickforge-settings-row-title">${D(`packageName`)}</div>
@@ -1099,7 +1169,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
1099
1169
  </a>
1100
1170
  </div>
1101
1171
  </div>
1102
- `:null}updateStatus(){return this.updateInfo?_`
1172
+ `:null}updateStatus(){return this.updateInfo?g`
1103
1173
  <div class="quickforge-settings-row">
1104
1174
  <div class="quickforge-settings-row-main">
1105
1175
  <div class="quickforge-settings-row-title">${D(`latestVersion`)}</div>
@@ -1107,7 +1177,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
1107
1177
  </div>
1108
1178
  <div class="quickforge-settings-row-control quickforge-settings-readonly-value">${this.updateInfo.latestVersion}</div>
1109
1179
  </div>
1110
- ${this.updateInfo.logFile?_`
1180
+ ${this.updateInfo.logFile?g`
1111
1181
  <div class="quickforge-settings-row">
1112
1182
  <div class="quickforge-settings-row-main">
1113
1183
  <div class="quickforge-settings-row-title">${D(`updateLog`)}</div>
@@ -1118,7 +1188,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
1118
1188
  </div>
1119
1189
  </div>
1120
1190
  `:null}
1121
- `:null}restartSection(){let e=this.serviceStatus?.restartUnsupportedReason||D(`backendRestartUnsupported`),t=this.restarting||!this.serviceStatus?.restartSupported;return _`
1191
+ `:null}restartSection(){let e=this.serviceStatus?.restartUnsupportedReason||D(`backendRestartUnsupported`),t=this.restarting||!this.serviceStatus?.restartSupported;return g`
1122
1192
  <section class="quickforge-settings-section" aria-label=${D(`restartBackendService`)}>
1123
1193
  <div class="quickforge-settings-row">
1124
1194
  <div class="quickforge-settings-row-main">
@@ -1142,14 +1212,14 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
1142
1212
  </div>
1143
1213
  </div>
1144
1214
  </section>
1145
- `}render(){if(this.loading)return _`<div class="text-sm text-muted-foreground">${D(`loading`)}</div>`;let e=this.checking||this.updating||!this.updateInfo?.updateAvailable,t=W();return _`
1215
+ `}render(){if(this.loading)return g`<div class="text-sm text-muted-foreground">${D(`loading`)}</div>`;let e=this.checking||this.updating||!this.updateInfo?.updateAvailable,t=G();return g`
1146
1216
  <div class="quickforge-settings-stack">
1147
1217
  <section class="quickforge-settings-section" aria-label=${D(`projectInfo`)}>
1148
1218
  ${this.infoRows()}
1149
1219
  </section>
1150
1220
 
1151
1221
  <section class="quickforge-settings-section" aria-label=${D(t?`desktopUpdates`:`runtimeUpdates`)}>
1152
- ${t?null:_`
1222
+ ${t?null:g`
1153
1223
  <div class="quickforge-settings-row">
1154
1224
  <div class="quickforge-settings-row-main">
1155
1225
  <div class="quickforge-settings-row-title">
@@ -1157,12 +1227,12 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
1157
1227
  <quickforge-info-tip .label=${D(`updateFrequencyDescription`)}></quickforge-info-tip>
1158
1228
  </div>
1159
1229
  <div class="quickforge-settings-row-description">
1160
- ${this.lastCheckAt?D(`lastCheckedAt`,{time:new Date(this.lastCheckAt).toLocaleString(ye())}):D(`lastCheckedNever`)}
1230
+ ${this.lastCheckAt?D(`lastCheckedAt`,{time:new Date(this.lastCheckAt).toLocaleString(be())}):D(`lastCheckedNever`)}
1161
1231
  </div>
1162
1232
  </div>
1163
1233
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide">
1164
1234
  <div class="quickforge-settings-segmented quickforge-settings-segmented-wrap" role="group" aria-label=${D(`updateFrequencySection`)}>
1165
- ${gt.map(e=>this.renderFrequencyOption(e))}
1235
+ ${wt.map(e=>this.renderFrequencyOption(e))}
1166
1236
  </div>
1167
1237
  </div>
1168
1238
  </div>
@@ -1189,7 +1259,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
1189
1259
  >
1190
1260
  ${this.checking?D(`checkingUpdate`):D(t?`openDesktopReleases`:`checkRuntimeUpdate`)}
1191
1261
  </button>
1192
- ${t?null:_`
1262
+ ${t?null:g`
1193
1263
  <button
1194
1264
  class="quickforge-settings-button quickforge-settings-button-primary"
1195
1265
  type="button"
@@ -1205,15 +1275,15 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
1205
1275
 
1206
1276
  ${this.restartSection()}
1207
1277
 
1208
- ${this.message?_`<div class="quickforge-settings-message">${this.message}</div>`:null}
1209
- ${this.error?_`<div class="quickforge-settings-alert">${this.error}</div>`:null}
1278
+ ${this.message?g`<div class="quickforge-settings-message">${this.message}</div>`:null}
1279
+ ${this.error?g`<div class="quickforge-settings-alert">${this.error}</div>`:null}
1210
1280
  </div>
1211
- `}},G=`quickforge-about-settings-tab`;customElements.get(G)||customElements.define(G,_t);function vt(){return document.createElement(G)}var yt=class extends v{loading=!0;saving=!1;saved=!1;error=``;message=``;projects=[];project;commandDir=``;commands=[];loadingCommands=!1;saveTimer=null;lastSavedCommandDir=``;pendingSaveAfterCurrent=!1;getTabName(){return D(`projectCommands`)}async connectedCallback(){super.connectedCallback(),await this.loadProjects()}async request(e,t){let n=await fetch(e,{...t,cache:`no-store`,headers:{...t?.body?{"content-type":`application/json`}:void 0,...t?.headers}}),r=await n.json().catch(()=>null);if(!n.ok)throw Error(r?.error||D(`requestFailed`));return r}async loadProjects(){this.loading=!0,this.error=``,this.requestUpdate();try{let e=await this.request(`/api/project`);this.projects=e?.projects??(e?.project?[e.project]:[]),this.project=e?.project??this.projects[0],this.commandDir=typeof this.project?.commandDir==`string`?this.project.commandDir:``,this.lastSavedCommandDir=this.commandDir,await this.loadCommands()}catch(e){this.error=e instanceof Error?e.message:D(`requestFailed`)}finally{this.loading=!1,this.requestUpdate()}}selectProject(e){this.clearSaveTimer();let t=e.target,n=this.projects.find(e=>e.id===t.value);n&&(this.project=n,this.commandDir=typeof n.commandDir==`string`?n.commandDir:``,this.lastSavedCommandDir=this.commandDir,this.saved=!1,this.message=``,this.error=``,this.commands=[],this.requestUpdate(),this.loadCommands())}async loadCommands(){if(this.project?.id){this.loadingCommands=!0,this.requestUpdate();try{let e=await this.request(`/api/project/commands?projectId=${encodeURIComponent(this.project.id)}`);this.commands=e?.commands??[]}catch{this.commands=[]}finally{this.loadingCommands=!1,this.requestUpdate()}}}updateCommandDir(e){this.commandDir=e,this.saved=!1,this.message=``,this.scheduleSave(),this.requestUpdate()}clearSaveTimer(){this.saveTimer!==null&&(window.clearTimeout(this.saveTimer),this.saveTimer=null)}scheduleSave(){this.clearSaveTimer(),this.saveTimer=window.setTimeout(()=>{this.saveTimer=null,this.save()},800)}disconnectedCallback(){this.clearSaveTimer(),super.disconnectedCallback()}async save(){if(!this.project)return;if(this.saving){this.pendingSaveAfterCurrent=!0;return}let e=this.project.id,t=this.commandDir;if(t!==this.lastSavedCommandDir){this.saving=!0,this.saved=!1,this.error=``,this.message=``,this.requestUpdate();try{let n=await this.request(`/api/project/${encodeURIComponent(e)}/command-dir`,{method:`PUT`,body:JSON.stringify({commandDir:t})});if(this.project?.id===e){if(this.project=n?.project??this.project,this.project){let e=this.projects.findIndex(e=>e.id===this.project.id);e>=0&&(this.projects[e]=this.project)}this.commandDir=typeof this.project?.commandDir==`string`?this.project.commandDir:t,this.lastSavedCommandDir=this.commandDir,this.saved=!0,await this.loadCommands()}}catch(e){this.error=e instanceof Error?e.message:D(`requestFailed`)}finally{this.saving=!1,this.pendingSaveAfterCurrent&&(this.pendingSaveAfterCurrent=!1,this.scheduleSave()),this.requestUpdate()}}}async openCommandDir(){if(this.project){this.error=``,this.message=``,this.requestUpdate();try{await this.request(`/api/project/open-path`,{method:`POST`,body:JSON.stringify({path:`.ai/commands`,projectId:this.project.id})})}catch(e){this.error=e instanceof Error?e.message:D(`requestFailed`),this.requestUpdate()}}}async createCommand(){if(!this.project)return;let e=window.prompt(D(`newCommandPrompt`));if(e?.trim()){this.error=``,this.message=``,this.requestUpdate();try{let t=await this.request(`/api/project/command`,{method:`POST`,body:JSON.stringify({name:e.trim(),projectId:this.project.id})});t.ok?(this.message=D(`commandCreated`,{name:t.name??e.trim()}),await this.loadCommands()):t.reason===`exists`?this.error=D(`commandAlreadyExists`,{name:t.name??e.trim()}):this.error=D(`invalidCommandName`)}catch(e){this.error=e instanceof Error?e.message:D(`requestFailed`)}finally{this.requestUpdate()}}}render(){return this.loading?_`<div class="quickforge-settings-note">${D(`loading`)}</div>`:this.projects.length===0?_`
1281
+ `}},K=`quickforge-about-settings-tab`;customElements.get(K)||customElements.define(K,Tt);function Et(){return document.createElement(K)}var Dt=class extends _{loading=!0;saving=!1;saved=!1;error=``;message=``;projects=[];project;commandDir=``;commands=[];loadingCommands=!1;saveTimer=null;lastSavedCommandDir=``;pendingSaveAfterCurrent=!1;getTabName(){return D(`projectCommands`)}async connectedCallback(){super.connectedCallback(),await this.loadProjects()}async request(e,t){let n=await fetch(e,{...t,cache:`no-store`,headers:{...t?.body?{"content-type":`application/json`}:void 0,...t?.headers}}),r=await n.json().catch(()=>null);if(!n.ok)throw Error(r?.error||D(`requestFailed`));return r}async loadProjects(){this.loading=!0,this.error=``,this.requestUpdate();try{let e=await this.request(`/api/project`);this.projects=e?.projects??(e?.project?[e.project]:[]),this.project=e?.project??this.projects[0],this.commandDir=typeof this.project?.commandDir==`string`?this.project.commandDir:``,this.lastSavedCommandDir=this.commandDir,await this.loadCommands()}catch(e){this.error=e instanceof Error?e.message:D(`requestFailed`)}finally{this.loading=!1,this.requestUpdate()}}selectProject(e){this.clearSaveTimer();let t=e.target,n=this.projects.find(e=>e.id===t.value);n&&(this.project=n,this.commandDir=typeof n.commandDir==`string`?n.commandDir:``,this.lastSavedCommandDir=this.commandDir,this.saved=!1,this.message=``,this.error=``,this.commands=[],this.requestUpdate(),this.loadCommands())}async loadCommands(){if(this.project?.id){this.loadingCommands=!0,this.requestUpdate();try{let e=await this.request(`/api/project/commands?projectId=${encodeURIComponent(this.project.id)}`);this.commands=e?.commands??[]}catch{this.commands=[]}finally{this.loadingCommands=!1,this.requestUpdate()}}}updateCommandDir(e){this.commandDir=e,this.saved=!1,this.message=``,this.scheduleSave(),this.requestUpdate()}clearSaveTimer(){this.saveTimer!==null&&(window.clearTimeout(this.saveTimer),this.saveTimer=null)}scheduleSave(){this.clearSaveTimer(),this.saveTimer=window.setTimeout(()=>{this.saveTimer=null,this.save()},800)}disconnectedCallback(){this.clearSaveTimer(),super.disconnectedCallback()}async save(){if(!this.project)return;if(this.saving){this.pendingSaveAfterCurrent=!0;return}let e=this.project.id,t=this.commandDir;if(t!==this.lastSavedCommandDir){this.saving=!0,this.saved=!1,this.error=``,this.message=``,this.requestUpdate();try{let n=await this.request(`/api/project/${encodeURIComponent(e)}/command-dir`,{method:`PUT`,body:JSON.stringify({commandDir:t})});if(this.project?.id===e){if(this.project=n?.project??this.project,this.project){let e=this.projects.findIndex(e=>e.id===this.project.id);e>=0&&(this.projects[e]=this.project)}this.commandDir=typeof this.project?.commandDir==`string`?this.project.commandDir:t,this.lastSavedCommandDir=this.commandDir,this.saved=!0,await this.loadCommands()}}catch(e){this.error=e instanceof Error?e.message:D(`requestFailed`)}finally{this.saving=!1,this.pendingSaveAfterCurrent&&(this.pendingSaveAfterCurrent=!1,this.scheduleSave()),this.requestUpdate()}}}async openCommandDir(){if(this.project){this.error=``,this.message=``,this.requestUpdate();try{await this.request(`/api/project/open-path`,{method:`POST`,body:JSON.stringify({path:`.ai/commands`,projectId:this.project.id})})}catch(e){this.error=e instanceof Error?e.message:D(`requestFailed`),this.requestUpdate()}}}async createCommand(){if(!this.project)return;let e=window.prompt(D(`newCommandPrompt`));if(e?.trim()){this.error=``,this.message=``,this.requestUpdate();try{let t=await this.request(`/api/project/command`,{method:`POST`,body:JSON.stringify({name:e.trim(),projectId:this.project.id})});t.ok?(this.message=D(`commandCreated`,{name:t.name??e.trim()}),await this.loadCommands()):t.reason===`exists`?this.error=D(`commandAlreadyExists`,{name:t.name??e.trim()}):this.error=D(`invalidCommandName`)}catch(e){this.error=e instanceof Error?e.message:D(`requestFailed`)}finally{this.requestUpdate()}}}render(){return this.loading?g`<div class="quickforge-settings-note">${D(`loading`)}</div>`:this.projects.length===0?g`
1212
1282
  <div class="quickforge-settings-stack">
1213
1283
  <div class="quickforge-settings-note">${D(`selectProjectForCommands`)}</div>
1214
- ${this.error?_`<div class="quickforge-settings-alert">${this.error}</div>`:null}
1284
+ ${this.error?g`<div class="quickforge-settings-alert">${this.error}</div>`:null}
1215
1285
  </div>
1216
- `:_`
1286
+ `:g`
1217
1287
  <div class="quickforge-settings-stack">
1218
1288
  <section class="quickforge-settings-section" aria-label=${D(`projectCommands`)}>
1219
1289
  <div class="quickforge-settings-row">
@@ -1229,7 +1299,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
1229
1299
  .value=${this.project?.id??``}
1230
1300
  @change=${e=>this.selectProject(e)}
1231
1301
  >
1232
- ${this.projects.map(e=>_`<option value=${e.id} ?selected=${e.id===this.project?.id}>${e.name}</option>`)}
1302
+ ${this.projects.map(e=>g`<option value=${e.id} ?selected=${e.id===this.project?.id}>${e.name}</option>`)}
1233
1303
  </select>
1234
1304
  </div>
1235
1305
  </div>
@@ -1293,7 +1363,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
1293
1363
  </div>
1294
1364
 
1295
1365
  <div class="quickforge-settings-nested-list">
1296
- ${this.loadingCommands?_`<div class="quickforge-settings-empty-row">${D(`loading`)}</div>`:this.commands.length===0?_`<div class="quickforge-settings-empty-row">${D(`noCommandsLoaded`)}</div>`:this.commands.map(e=>{let t=e.argumentHint?` ${e.argumentHint}`:``;return _`
1366
+ ${this.loadingCommands?g`<div class="quickforge-settings-empty-row">${D(`loading`)}</div>`:this.commands.length===0?g`<div class="quickforge-settings-empty-row">${D(`noCommandsLoaded`)}</div>`:this.commands.map(e=>{let t=e.argumentHint?` ${e.argumentHint}`:``;return g`
1297
1367
  <div class="quickforge-settings-subrow">
1298
1368
  <div class="quickforge-settings-row-main">
1299
1369
  <div class="quickforge-settings-row-title">
@@ -1303,25 +1373,25 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
1303
1373
  ${e.description||D(`noDescription`)}
1304
1374
  </div>
1305
1375
  </div>
1306
- ${e.relativePath?_`<div class="quickforge-settings-row-control quickforge-settings-row-control-wide quickforge-settings-readonly-value">${e.relativePath}</div>`:null}
1376
+ ${e.relativePath?g`<div class="quickforge-settings-row-control quickforge-settings-row-control-wide quickforge-settings-readonly-value">${e.relativePath}</div>`:null}
1307
1377
  </div>
1308
1378
  `})}
1309
1379
  </div>
1310
1380
  </section>
1311
1381
 
1312
- ${this.saving?_`<div class="quickforge-settings-note">${D(`saving`)}</div>`:null}
1313
- ${this.saved?_`<div class="quickforge-settings-message">${D(`projectCommandsSaved`)}</div>`:null}
1314
- ${this.message?_`<div class="quickforge-settings-message">${this.message}</div>`:null}
1315
- ${this.error?_`<div class="quickforge-settings-alert">${this.error}</div>`:null}
1382
+ ${this.saving?g`<div class="quickforge-settings-note">${D(`saving`)}</div>`:null}
1383
+ ${this.saved?g`<div class="quickforge-settings-message">${D(`projectCommandsSaved`)}</div>`:null}
1384
+ ${this.message?g`<div class="quickforge-settings-message">${this.message}</div>`:null}
1385
+ ${this.error?g`<div class="quickforge-settings-alert">${this.error}</div>`:null}
1316
1386
  </div>
1317
- `}},K=`quickforge-project-commands-settings-tab`;customElements.get(K)||customElements.define(K,yt);function bt(){return document.createElement(K)}var q={"x-quickforge-action":`channel-action`};function xt(e){switch(e){case`running`:return`quickforge-settings-badge-success`;case`waiting_scan`:case`starting`:case`stopping`:return`quickforge-settings-badge-warning`;case`error`:return`quickforge-settings-badge-danger`;default:return`quickforge-settings-badge-muted`}}function St(e){switch(e){case`starting`:return D(`channelStatusStarting`);case`waiting_scan`:return D(`channelStatusWaitingScan`);case`running`:return D(`channelStatusRunning`);case`stopping`:return D(`channelStatusStopping`);case`error`:return D(`channelStatusError`);default:return D(`channelStatusStopped`)}}function Ct(e){if(!e)return`-`;let t=new Date(e);return Number.isNaN(t.getTime())?e:t.toLocaleString()}var wt=class extends v{loading=!0;channels=[];workspaces=[];selectedWorkspaceIdByChannel={};error=``;message=``;eventSource;busyChannelId=``;getTabName(){return D(`channels`)}async connectedCallback(){super.connectedCallback(),await Promise.all([this.loadChannels(),this.loadWorkspaces()]),this.connectEvents()}disconnectedCallback(){this.eventSource?.close(),this.eventSource=void 0,super.disconnectedCallback()}async request(e,t){let n=await fetch(e,{...t,cache:`no-store`,headers:{...t?.headers||{}}}),r=await n.json().catch(()=>null);if(!n.ok)throw Error(r?.error||D(`requestFailed`));return r}async loadChannels(){this.loading=!0,this.error=``,this.requestUpdate();try{let e=await this.request(`/api/channels`);this.channels=Array.isArray(e.channels)?e.channels:[],this.ensureWorkspaceSelections()}catch(e){this.error=e instanceof Error?e.message:D(`requestFailed`)}finally{this.loading=!1,this.requestUpdate()}}async loadWorkspaces(){try{let e=await this.request(`/api/project`),t=e.defaultWorkspaceRoot||``,n=t?[{id:`default`,name:D(`channelDefaultWorkspace`),path:t,kind:`default`}]:[],r=(Array.isArray(e.projects)?e.projects:[]).map(e=>({id:e.id,name:e.name,path:e.path,kind:`project`}));this.workspaces=[...n,...r],this.ensureWorkspaceSelections()}catch(e){this.error=e instanceof Error?e.message:D(`requestFailed`)}finally{this.requestUpdate()}}ensureWorkspaceSelections(){let e=new Set(this.workspaces.map(e=>e.id)),t={...this.selectedWorkspaceIdByChannel};for(let n of this.channels){if(!n.supportsWorkspaceSelection)continue;let r=t[n.id],i=n.launchWorkspace?.id,a=n.status!==`stopped`&&n.status!==`error`;if(i&&e.has(i)&&a){t[n.id]=i;continue}r&&e.has(r)||(t[n.id]=i&&e.has(i)?i:`default`)}this.selectedWorkspaceIdByChannel=t}connectEvents(){this.eventSource?.close();let e=new EventSource(`/api/channels/events`);this.eventSource=e;let t=e=>{try{let t=JSON.parse(e.data);this.applyChannelEvent(t)}catch{}};e.addEventListener(`snapshot`,t),e.addEventListener(`status`,t),e.addEventListener(`log`,t),e.addEventListener(`qrcode`,t),e.addEventListener(`error`,()=>{})}applyChannelEvent(e){if(Array.isArray(e.channels)){this.channels=e.channels,this.ensureWorkspaceSelections(),this.requestUpdate();return}if(e.snapshot){this.upsertChannel(e.snapshot);return}if(e.channelId&&e.log){let t=this.channels.find(t=>t.id===e.channelId);t&&(t.logs=[...t.logs||[],e.log].slice(-300),this.requestUpdate())}}upsertChannel(e){let t=this.channels.findIndex(t=>t.id===e.id);t>=0?this.channels=[...this.channels.slice(0,t),e,...this.channels.slice(t+1)]:this.channels=[...this.channels,e],this.ensureWorkspaceSelections(),this.requestUpdate()}selectedWorkspaceId(e){return this.selectedWorkspaceIdByChannel[e.id]||e.launchWorkspace?.id||`default`}handleWorkspaceChange(e,t){let n=t.currentTarget;n&&(this.selectedWorkspaceIdByChannel={...this.selectedWorkspaceIdByChannel,[e.id]:n.value||`default`},this.requestUpdate())}startOptions(e){return e.supportsWorkspaceSelection?{projectId:this.selectedWorkspaceId(e)}:void 0}async invoke(e,t){if(!this.busyChannelId&&!(t===`restart`&&!await C({description:D(`channelRestartConfirm`,{name:e.name}),confirmLabel:D(`restart`),cancelLabel:D(`cancel`)}))){this.busyChannelId=e.id,this.error=``,this.message=``,this.requestUpdate();try{let n=t===`start`||t===`restart`?this.startOptions(e):void 0,r=await this.request(`/api/channels/${encodeURIComponent(e.id)}/${t}`,{method:`POST`,headers:n?{...q,"content-type":`application/json`}:q,body:n?JSON.stringify(n):void 0});this.upsertChannel(r)}catch(e){this.error=e instanceof Error?e.message:D(`requestFailed`)}finally{this.busyChannelId=``,this.requestUpdate()}}}async invokeAction(e,t){if(!this.busyChannelId&&!((t.destructive||t.id===`relogin`)&&!await C({description:t.id===`relogin`?D(`channelReloginConfirm`,{name:e.name}):D(`channelLogoutConfirm`,{name:e.name}),confirmLabel:t.label,cancelLabel:D(`cancel`),variant:t.destructive?`destructive`:void 0}))){this.busyChannelId=e.id,this.error=``,this.message=``,this.requestUpdate();try{let n=t.id===`relogin`?this.startOptions(e):void 0,r=await this.request(`/api/channels/${encodeURIComponent(e.id)}/actions/${encodeURIComponent(t.id)}`,{method:`POST`,headers:n?{...q,"content-type":`application/json`}:q,body:n?JSON.stringify(n):void 0});this.upsertChannel(r)}catch(e){this.error=e instanceof Error?e.message:D(`requestFailed`)}finally{this.busyChannelId=``,this.requestUpdate()}}}workspaceSection(e,t){if(!e.supportsWorkspaceSelection)return null;let n=this.selectedWorkspaceId(e),r=e.launchWorkspace;return _`
1387
+ `}},q=`quickforge-project-commands-settings-tab`;customElements.get(q)||customElements.define(q,Dt);function Ot(){return document.createElement(q)}var J={"x-quickforge-action":`channel-action`};function kt(e){switch(e){case`running`:return`quickforge-settings-badge-success`;case`waiting_scan`:case`starting`:case`stopping`:return`quickforge-settings-badge-warning`;case`error`:return`quickforge-settings-badge-danger`;default:return`quickforge-settings-badge-muted`}}function At(e){switch(e){case`starting`:return D(`channelStatusStarting`);case`waiting_scan`:return D(`channelStatusWaitingScan`);case`running`:return D(`channelStatusRunning`);case`stopping`:return D(`channelStatusStopping`);case`error`:return D(`channelStatusError`);default:return D(`channelStatusStopped`)}}function jt(e){if(!e)return`-`;let t=new Date(e);return Number.isNaN(t.getTime())?e:t.toLocaleString()}var Mt=class extends _{loading=!0;channels=[];workspaces=[];selectedWorkspaceIdByChannel={};error=``;message=``;eventSource;busyChannelId=``;getTabName(){return D(`channels`)}async connectedCallback(){super.connectedCallback(),await Promise.all([this.loadChannels(),this.loadWorkspaces()]),this.connectEvents()}disconnectedCallback(){this.eventSource?.close(),this.eventSource=void 0,super.disconnectedCallback()}async request(e,t){let n=await fetch(e,{...t,cache:`no-store`,headers:{...t?.headers||{}}}),r=await n.json().catch(()=>null);if(!n.ok)throw Error(r?.error||D(`requestFailed`));return r}async loadChannels(){this.loading=!0,this.error=``,this.requestUpdate();try{let e=await this.request(`/api/channels`);this.channels=Array.isArray(e.channels)?e.channels:[],this.ensureWorkspaceSelections()}catch(e){this.error=e instanceof Error?e.message:D(`requestFailed`)}finally{this.loading=!1,this.requestUpdate()}}async loadWorkspaces(){try{let e=await this.request(`/api/project`),t=e.defaultWorkspaceRoot||``,n=t?[{id:`default`,name:D(`channelDefaultWorkspace`),path:t,kind:`default`}]:[],r=(Array.isArray(e.projects)?e.projects:[]).map(e=>({id:e.id,name:e.name,path:e.path,kind:`project`}));this.workspaces=[...n,...r],this.ensureWorkspaceSelections()}catch(e){this.error=e instanceof Error?e.message:D(`requestFailed`)}finally{this.requestUpdate()}}ensureWorkspaceSelections(){let e=new Set(this.workspaces.map(e=>e.id)),t={...this.selectedWorkspaceIdByChannel};for(let n of this.channels){if(!n.supportsWorkspaceSelection)continue;let r=t[n.id],i=n.launchWorkspace?.id,a=n.status!==`stopped`&&n.status!==`error`;if(i&&e.has(i)&&a){t[n.id]=i;continue}r&&e.has(r)||(t[n.id]=i&&e.has(i)?i:`default`)}this.selectedWorkspaceIdByChannel=t}connectEvents(){this.eventSource?.close();let e=new EventSource(`/api/channels/events`);this.eventSource=e;let t=e=>{try{let t=JSON.parse(e.data);this.applyChannelEvent(t)}catch{}};e.addEventListener(`snapshot`,t),e.addEventListener(`status`,t),e.addEventListener(`log`,t),e.addEventListener(`qrcode`,t),e.addEventListener(`error`,()=>{})}applyChannelEvent(e){if(Array.isArray(e.channels)){this.channels=e.channels,this.ensureWorkspaceSelections(),this.requestUpdate();return}if(e.snapshot){this.upsertChannel(e.snapshot);return}if(e.channelId&&e.log){let t=this.channels.find(t=>t.id===e.channelId);t&&(t.logs=[...t.logs||[],e.log].slice(-300),this.requestUpdate())}}upsertChannel(e){let t=this.channels.findIndex(t=>t.id===e.id);t>=0?this.channels=[...this.channels.slice(0,t),e,...this.channels.slice(t+1)]:this.channels=[...this.channels,e],this.ensureWorkspaceSelections(),this.requestUpdate()}selectedWorkspaceId(e){return this.selectedWorkspaceIdByChannel[e.id]||e.launchWorkspace?.id||`default`}handleWorkspaceChange(e,t){let n=t.currentTarget;n&&(this.selectedWorkspaceIdByChannel={...this.selectedWorkspaceIdByChannel,[e.id]:n.value||`default`},this.requestUpdate())}startOptions(e){return e.supportsWorkspaceSelection?{projectId:this.selectedWorkspaceId(e)}:void 0}async invoke(e,t){if(!this.busyChannelId&&!(t===`restart`&&!await S({description:D(`channelRestartConfirm`,{name:e.name}),confirmLabel:D(`restart`),cancelLabel:D(`cancel`)}))){this.busyChannelId=e.id,this.error=``,this.message=``,this.requestUpdate();try{let n=t===`start`||t===`restart`?this.startOptions(e):void 0,r=await this.request(`/api/channels/${encodeURIComponent(e.id)}/${t}`,{method:`POST`,headers:n?{...J,"content-type":`application/json`}:J,body:n?JSON.stringify(n):void 0});this.upsertChannel(r)}catch(e){this.error=e instanceof Error?e.message:D(`requestFailed`)}finally{this.busyChannelId=``,this.requestUpdate()}}}async invokeAction(e,t){if(!this.busyChannelId&&!((t.destructive||t.id===`relogin`)&&!await S({description:t.id===`relogin`?D(`channelReloginConfirm`,{name:e.name}):D(`channelLogoutConfirm`,{name:e.name}),confirmLabel:t.label,cancelLabel:D(`cancel`),variant:t.destructive?`destructive`:void 0}))){this.busyChannelId=e.id,this.error=``,this.message=``,this.requestUpdate();try{let n=t.id===`relogin`?this.startOptions(e):void 0,r=await this.request(`/api/channels/${encodeURIComponent(e.id)}/actions/${encodeURIComponent(t.id)}`,{method:`POST`,headers:n?{...J,"content-type":`application/json`}:J,body:n?JSON.stringify(n):void 0});this.upsertChannel(r)}catch(e){this.error=e instanceof Error?e.message:D(`requestFailed`)}finally{this.busyChannelId=``,this.requestUpdate()}}}workspaceSection(e,t){if(!e.supportsWorkspaceSelection)return null;let n=this.selectedWorkspaceId(e),r=e.launchWorkspace;return g`
1318
1388
  <div class="quickforge-settings-row quickforge-settings-row-align-start">
1319
1389
  <div class="quickforge-settings-row-main">
1320
1390
  <div class="quickforge-settings-row-title">
1321
1391
  ${D(`channelWorkspace`)}
1322
1392
  <quickforge-info-tip .label=${D(`channelWorkspaceDescription`)}></quickforge-info-tip>
1323
1393
  </div>
1324
- ${r?_`<div class="quickforge-settings-row-description">${D(`channelCurrentWorkspace`)}: <span class="quickforge-settings-mono">${r.path}</span></div>`:_`<div class="quickforge-settings-row-description">${D(`channelWorkspaceDescription`)}</div>`}
1394
+ ${r?g`<div class="quickforge-settings-row-description">${D(`channelCurrentWorkspace`)}: <span class="quickforge-settings-mono">${r.path}</span></div>`:g`<div class="quickforge-settings-row-description">${D(`channelWorkspaceDescription`)}</div>`}
1325
1395
  </div>
1326
1396
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide">
1327
1397
  <select
@@ -1330,15 +1400,15 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
1330
1400
  .value=${n}
1331
1401
  @change=${t=>this.handleWorkspaceChange(e,t)}
1332
1402
  >
1333
- ${this.workspaces.map(e=>_`
1403
+ ${this.workspaces.map(e=>g`
1334
1404
  <option value=${e.id}>${e.kind===`default`?D(`channelDefaultWorkspace`):e.name} — ${e.path}</option>
1335
1405
  `)}
1336
1406
  </select>
1337
1407
  </div>
1338
1408
  </div>
1339
- `}channelMeta(e){return _`
1409
+ `}channelMeta(e){return g`
1340
1410
  <div class="quickforge-settings-nested-list">
1341
- ${[[D(`channelProvider`),e.provider||`-`],[D(`channelCommand`),e.commandLabel||`-`],[D(`channelPid`),e.pid?String(e.pid):`-`],[D(`channelStartedAt`),Ct(e.startedAt)]].map(([e,t])=>_`
1411
+ ${[[D(`channelProvider`),e.provider||`-`],[D(`channelCommand`),e.commandLabel||`-`],[D(`channelPid`),e.pid?String(e.pid):`-`],[D(`channelStartedAt`),jt(e.startedAt)]].map(([e,t])=>g`
1342
1412
  <div class="quickforge-settings-subrow">
1343
1413
  <div class="quickforge-settings-row-main">
1344
1414
  <div class="quickforge-settings-row-title">${e}</div>
@@ -1347,7 +1417,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
1347
1417
  </div>
1348
1418
  `)}
1349
1419
  </div>
1350
- `}qrSection(e){return!e.qrCodeText&&!e.qrCodeUrl&&e.status!==`waiting_scan`?null:_`
1420
+ `}qrSection(e){return!e.qrCodeText&&!e.qrCodeUrl&&e.status!==`waiting_scan`?null:g`
1351
1421
  <div class="quickforge-settings-row quickforge-settings-row-align-start">
1352
1422
  <div class="quickforge-settings-row-main">
1353
1423
  <div class="quickforge-settings-row-title">
@@ -1355,64 +1425,64 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
1355
1425
  <quickforge-info-tip .label=${D(`channelQrDescription`)}></quickforge-info-tip>
1356
1426
  </div>
1357
1427
  <div class="quickforge-settings-row-description">${D(`channelQrDescription`)}</div>
1358
- ${e.qrCodeUrl?_`
1428
+ ${e.qrCodeUrl?g`
1359
1429
  <div class="quickforge-settings-meta">
1360
1430
  <a class="quickforge-settings-link quickforge-settings-mono" href=${e.qrCodeUrl} target="_blank" rel="noreferrer">${e.qrCodeUrl}</a>
1361
1431
  </div>
1362
1432
  `:null}
1363
1433
  </div>
1364
- ${e.qrCodeText?_`<pre class="quickforge-channel-qr-text">${e.qrCodeText}</pre>`:null}
1434
+ ${e.qrCodeText?g`<pre class="quickforge-channel-qr-text">${e.qrCodeText}</pre>`:null}
1365
1435
  </div>
1366
- `}logsSection(e){let t=e.logs||[];return _`
1436
+ `}logsSection(e){let t=e.logs||[];return g`
1367
1437
  <details class="quickforge-channel-logs" open>
1368
1438
  <summary class="quickforge-channel-logs-summary">${D(`channelRecentLogs`)}</summary>
1369
1439
  <div class="quickforge-channel-logs-body">
1370
- ${t.length?t.slice(-80).map(e=>_`
1440
+ ${t.length?t.slice(-80).map(e=>g`
1371
1441
  <div class="quickforge-channel-log-row">
1372
1442
  <span class="text-muted-foreground/55">${new Date(e.time).toLocaleTimeString()}</span>
1373
1443
  <span class=${e.stream===`stderr`?`text-destructive/80`:`text-muted-foreground/70`}>${e.stream}</span>
1374
1444
  <span class="min-w-0 whitespace-pre-wrap break-words text-foreground/85">${e.text}</span>
1375
1445
  </div>
1376
- `):_`<div class="quickforge-settings-empty-row">${D(`channelNoLogs`)}</div>`}
1446
+ `):g`<div class="quickforge-settings-empty-row">${D(`channelNoLogs`)}</div>`}
1377
1447
  </div>
1378
1448
  </details>
1379
- `}channelCard(e){let t=this.busyChannelId===e.id||!!e.activeAction,n=e.status===`running`||e.status===`waiting_scan`||e.status===`starting`,r=e.status===`stopping`,i=!!(e.supportsWorkspaceSelection&&this.workspaces.length===0);return _`
1449
+ `}channelCard(e){let t=this.busyChannelId===e.id||!!e.activeAction,n=e.status===`running`||e.status===`waiting_scan`||e.status===`starting`,r=e.status===`stopping`,i=!!(e.supportsWorkspaceSelection&&this.workspaces.length===0);return g`
1380
1450
  <section class="quickforge-settings-section" aria-label=${e.name}>
1381
1451
  <div class="quickforge-settings-row quickforge-settings-row-top">
1382
1452
  <div class="quickforge-settings-row-main">
1383
1453
  <div class="quickforge-settings-row-title">
1384
1454
  ${e.name}
1385
- <span class="quickforge-settings-badge ${xt(e.status)}">${St(e.status)}</span>
1455
+ <span class="quickforge-settings-badge ${kt(e.status)}">${At(e.status)}</span>
1386
1456
  </div>
1387
1457
  <div class="quickforge-settings-row-description">${e.description}</div>
1388
- ${e.requirements?.length?_`<div class="quickforge-settings-row-description">${D(`channelRequirements`)}: ${e.requirements.join(` · `)}</div>`:null}
1458
+ ${e.requirements?.length?g`<div class="quickforge-settings-row-description">${D(`channelRequirements`)}: ${e.requirements.join(` · `)}</div>`:null}
1389
1459
  </div>
1390
1460
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide">
1391
1461
  <button class="quickforge-settings-button quickforge-settings-button-primary" type="button" ?disabled=${t||n||r||i} @click=${()=>this.invoke(e,`start`)}>${D(`start`)}</button>
1392
1462
  <button class="quickforge-settings-button quickforge-settings-button-secondary" type="button" ?disabled=${t||!n||r} @click=${()=>this.invoke(e,`stop`)}>${D(`stop`)}</button>
1393
1463
  <button class="quickforge-settings-button quickforge-settings-button-secondary" type="button" ?disabled=${t||r||i} @click=${()=>this.invoke(e,`restart`)}>${D(`restart`)}</button>
1394
- ${e.actions?.map(n=>_`
1464
+ ${e.actions?.map(n=>g`
1395
1465
  <button class="quickforge-settings-button ${n.destructive?`quickforge-settings-button-danger`:`quickforge-settings-button-secondary`}" type="button" ?disabled=${t} @click=${()=>this.invokeAction(e,n)}>${n.label}</button>
1396
1466
  `)}
1397
1467
  </div>
1398
1468
  </div>
1399
1469
 
1400
1470
  ${this.workspaceSection(e,t||n||r)}
1401
- ${i?_`<div class="quickforge-settings-alert quickforge-settings-warning-attached">${D(`channelNoWorkspaces`)}</div>`:null}
1471
+ ${i?g`<div class="quickforge-settings-alert quickforge-settings-warning-attached">${D(`channelNoWorkspaces`)}</div>`:null}
1402
1472
  ${this.channelMeta(e)}
1403
- ${e.error?_`<div class="quickforge-settings-alert quickforge-settings-warning-attached">${e.error}</div>`:null}
1473
+ ${e.error?g`<div class="quickforge-settings-alert quickforge-settings-warning-attached">${e.error}</div>`:null}
1404
1474
  ${this.qrSection(e)}
1405
1475
  ${this.logsSection(e)}
1406
1476
  </section>
1407
- `}render(){return this.loading?_`<div class="quickforge-settings-note">${D(`loading`)}</div>`:_`
1477
+ `}render(){return this.loading?g`<div class="quickforge-settings-note">${D(`loading`)}</div>`:g`
1408
1478
  <div class="quickforge-settings-stack">
1409
1479
  <section class="quickforge-settings-warning">
1410
1480
  ${D(`channelsSecurityWarning`)}
1411
1481
  </section>
1412
1482
 
1413
- ${this.channels.length?_`${this.channels.map(e=>this.channelCard(e))}`:_`<div class="quickforge-settings-note">${D(`channelsEmpty`)}</div>`}
1483
+ ${this.channels.length?g`${this.channels.map(e=>this.channelCard(e))}`:g`<div class="quickforge-settings-note">${D(`channelsEmpty`)}</div>`}
1414
1484
 
1415
- ${this.message?_`<div class="quickforge-settings-message">${this.message}</div>`:null}
1416
- ${this.error?_`<div class="quickforge-settings-alert">${this.error}</div>`:null}
1485
+ ${this.message?g`<div class="quickforge-settings-message">${this.message}</div>`:null}
1486
+ ${this.error?g`<div class="quickforge-settings-alert">${this.error}</div>`:null}
1417
1487
  </div>
1418
- `}},J=`quickforge-channels-settings-tab`;customElements.get(J)||customElements.define(J,wt);function Tt(){return document.createElement(J)}var Et=ne(),Y=te(),Dt=(0,k.lazy)(()=>b(()=>import(`./AgentProfilesPage-BtZpDV-3.js`).then(e=>({default:e.AgentProfilesPage})),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11]))),Ot=(0,k.lazy)(()=>b(()=>import(`./mcp-servers-dialog-jHlDR9jP.js`).then(e=>({default:e.McpServersPanel})),__vite__mapDeps([12,1,2,3,4,5,6,7,8,9,10,11]))),kt=(0,k.lazy)(()=>b(()=>import(`./skills-dialog-DvSnPPzu.js`).then(e=>e.n).then(e=>({default:e.SkillsManagerPanel})),__vite__mapDeps([9,1,2,3,4,5,6,7,8,10,11]))),At=(0,k.lazy)(()=>b(()=>import(`./PluginsPage-CCIj8-Mn.js`).then(e=>({default:e.PluginsPage})),__vite__mapDeps([13,1,2,3,4,5,6,7,8,9,10,11,14]))),jt=(0,k.lazy)(()=>b(()=>import(`./ScheduledTasksPage-DIMewQ3i.js`).then(e=>({default:e.ScheduledTasksPage})),__vite__mapDeps([15,1,2,3,4,5,6,7,8,9,10,11]))),Mt=class extends v{tabName=``;renderReact;root;getTabName(){return this.tabName}connectedCallback(){super.connectedCallback(),this.updateComplete.then(()=>this.mountReact())}disconnectedCallback(){this.root?.unmount(),this.root=void 0,super.disconnectedCallback()}render(){return _`<div class="quickforge-react-settings-tab h-full min-h-0"></div>`}mountReact(){let e=this.querySelector(`.quickforge-react-settings-tab`);!e||!this.renderReact||(this.root??=(0,Et.createRoot)(e),this.root.render(this.renderReact()))}},X=`quickforge-react-settings-tab`;customElements.get(X)||customElements.define(X,Mt);function Z(e,t){let n=document.createElement(X);return n.tabName=e,n.renderReact=t,n}function Q({children:e}){return(0,Y.jsx)(`div`,{className:`quickforge-settings-stack h-full min-h-[30rem]`,children:(0,Y.jsx)(k.Suspense,{fallback:(0,Y.jsx)(`div`,{className:`quickforge-settings-note`,children:D(`loading`)}),children:e})})}function Nt(e){window.dispatchEvent(new CustomEvent(`quickforge:open-session-from-settings`,{detail:{sessionId:e}}))}function Pt(){return Z(D(`agentsTab`),()=>(0,Y.jsx)(Q,{children:(0,Y.jsx)(Dt,{})}))}function Ft(){return Z(D(`skills`),()=>(0,Y.jsx)(Q,{children:(0,Y.jsx)(kt,{active:!0,scope:`global`,embedded:!0,onSaved:()=>void 0})}))}function It(){return Z(D(`mcpServers`),()=>(0,Y.jsx)(Q,{children:(0,Y.jsx)(Ot,{active:!0})}))}function Lt(){return Z(D(`plugins`),()=>(0,Y.jsx)(Q,{children:(0,Y.jsx)(At,{})}))}function Rt(){return Z(D(`scheduledTasks`),()=>(0,Y.jsx)(Q,{children:(0,Y.jsx)(jt,{onOpenSession:Nt})}))}function zt(e){let t=[{key:`appearance`,tab:Ne(),getDescription:()=>D(`appearanceDescription`)},{key:`defaults`,tab:qe(),getDescription:()=>D(`defaultOptionsDescription`)},{key:`customModels`,tab:Ae(e),getDescription:()=>D(`customModelsDescription`)},{key:`agents`,tab:Pt(),getDescription:()=>D(`agentsDescription`)},{key:`skills`,tab:Ft(),getDescription:()=>D(`globalSkillsDescription`)},{key:`mcp`,tab:It(),getDescription:void 0},{key:`plugins`,tab:Lt(),getDescription:()=>D(`pluginsDescription`)},{key:`scheduledTasks`,tab:Rt(),getDescription:()=>D(`scheduledTasksDescription`)},{key:`projectCommands`,tab:bt(),getDescription:()=>D(`projectCommandsDescription`)},{key:`backup`,tab:rt(),getDescription:()=>D(`backupRestoreDescription`)},{key:`archivedConversations`,tab:st(),getDescription:()=>D(`archivedConversationsDescription`)},{key:`channels`,tab:Tt(),getDescription:()=>D(`channelsDescription`)},{key:`lanAccess`,tab:ut(),getDescription:()=>D(`lanAccessDescription`)},{key:`about`,tab:vt(),getDescription:()=>D(`aboutQuickForgeDescription`)}];return{items:[...t],tabs:t.map(e=>e.tab),indexOf:e=>t.findIndex(t=>t.key===e)}}var $={appearance:d,defaults:h,customModels:f,agents:t,skills:r,mcp:u,plugins:o,scheduledTasks:i,projectCommands:l,backup:g,archivedConversations:ee,channels:p,lanAccess:m,about:n};function Bt({tab:e}){let t=(0,k.useRef)(null);return(0,k.useEffect)(()=>{let n=t.current;if(n)return n.replaceChildren(e),()=>{e.parentNode===n&&n.removeChild(e)}},[e]),(0,Y.jsx)(`div`,{ref:t,className:`quickforge-settings-tab-host min-h-0 flex-1`})}function Vt({initialTab:e,customProvider:t,onBack:n}){let r=(0,k.useMemo)(()=>zt(t),[t]),i=Math.max(0,r.indexOf(e)),[o,s]=(0,k.useState)(),l=o??i,u=r.items[l]??r.items[0],d=u?.getDescription?.(),f=u?$[u.key]:void 0,[p,m]=(0,k.useState)(``),h=p.trim().toLowerCase(),g=(0,k.useMemo)(()=>r.items.map((e,t)=>({item:e,index:t})).filter(({item:e})=>h?[e.key,e.tab.getTabName(),e.getDescription?.()??``].join(` `).toLowerCase().includes(h):!0),[r.items,h]);return(0,Y.jsxs)(`div`,{className:`flex h-screen min-h-0 bg-[var(--quickforge-sidebar-bg)] text-foreground`,children:[(0,Y.jsxs)(`aside`,{className:`relative z-10 hidden w-80 shrink-0 overflow-hidden bg-[var(--quickforge-sidebar-bg)] md:flex md:min-h-0 md:flex-col`,children:[(0,Y.jsxs)(`div`,{className:`shrink-0 px-3 pb-2 pt-3`,children:[(0,Y.jsxs)(`button`,{type:`button`,className:`group relative flex w-full items-center gap-2 overflow-hidden rounded-lg px-2 py-1.5 text-left text-muted-foreground/72 transition-[background-color,color,box-shadow] duration-160 ease-out hover:bg-[var(--quickforge-sidebar-hover-bg)] hover:text-foreground/86 hover:shadow-[0_8px_20px_-18px_rgb(15_23_42_/_0.35)]`,onClick:n,"aria-label":`返回工作区`,children:[(0,Y.jsx)(`span`,{className:`inline-flex size-6 shrink-0 items-center justify-center rounded-full text-muted-foreground/55 transition-colors group-hover:text-foreground/70`,children:(0,Y.jsx)(a,{className:`size-4`})}),(0,Y.jsx)(`span`,{className:`truncate text-sm leading-5`,children:`返回工作区`})]}),(0,Y.jsxs)(`div`,{className:`quickforge-settings-inline-field mt-3`,children:[(0,Y.jsx)(c,{className:`pointer-events-none absolute left-3 top-1/2 size-4 -translate-y-1/2 text-muted-foreground/60`,"aria-hidden":`true`}),(0,Y.jsx)(`input`,{value:p,onChange:e=>m(e.target.value),placeholder:D(`searchSettings`),"aria-label":D(`searchSettings`),className:`quickforge-settings-input`})]})]}),(0,Y.jsx)(`div`,{className:`min-h-0 flex-1 overflow-y-auto px-3 pb-4 pt-4`,children:(0,Y.jsxs)(`nav`,{className:`space-y-1`,"aria-label":D(`settings`),children:[g.map(({item:e,index:t})=>{let n=t===l,r=$[e.key];return(0,Y.jsxs)(`button`,{type:`button`,className:ge(`group relative flex w-full items-center gap-2.5 overflow-hidden rounded-lg px-2 py-1.5 text-left text-sm leading-5 transition-[background-color,color,box-shadow] duration-160 ease-out`,n?`bg-[var(--quickforge-sidebar-active-bg)] font-medium text-foreground/92 shadow-[0_8px_22px_-20px_rgb(15_23_42_/_0.32)]`:`text-muted-foreground/76 hover:bg-[var(--quickforge-sidebar-hover-bg)] hover:text-foreground/90 hover:shadow-[0_8px_20px_-18px_rgb(15_23_42_/_0.35)]`),onClick:()=>s(t),"aria-current":n?`page`:void 0,children:[(0,Y.jsx)(`span`,{className:ge(`inline-flex size-5 shrink-0 items-center justify-center transition-colors`,n?`text-foreground/72`:`text-muted-foreground/52 group-hover:text-foreground/68`),children:(0,Y.jsx)(r,{className:`size-4`,"aria-hidden":`true`})}),(0,Y.jsx)(`span`,{className:`truncate`,children:e.tab.getTabName()})]},e.key)}),g.length===0?(0,Y.jsx)(`div`,{className:`px-2 py-3 text-sm text-muted-foreground/70`,children:D(`noSettingsResults`)}):null]})})]}),(0,Y.jsxs)(`main`,{className:`flex min-w-0 flex-1 flex-col bg-[var(--quickforge-main-bg)] md:overflow-hidden md:rounded-l-2xl`,children:[(0,Y.jsxs)(`header`,{className:`flex h-14 shrink-0 items-center gap-2 border-b-[0.5px] border-[color-mix(in_oklab,var(--border)_34%,transparent)] px-3 pr-4 md:px-5`,children:[(0,Y.jsx)(we,{variant:`ghost`,size:`icon`,className:`md:hidden`,onClick:n,"aria-label":`返回工作区`,children:(0,Y.jsx)(a,{className:`size-4`})}),(0,Y.jsx)(`div`,{className:`min-w-0 flex-1`,children:(0,Y.jsxs)(`div`,{className:`flex min-w-0 items-center gap-2`,children:[f?(0,Y.jsx)(f,{className:`size-4 shrink-0 text-muted-foreground/65`,"aria-hidden":`true`}):null,(0,Y.jsx)(`div`,{className:`min-w-0 truncate text-sm font-medium text-foreground/90`,children:u?.tab.getTabName()}),d?(0,Y.jsx)(he,{label:d}):null]})})]}),(0,Y.jsx)(`div`,{className:`shrink-0 border-b-[0.5px] border-[color-mix(in_oklab,var(--border)_30%,transparent)] px-3 py-2 md:hidden`,children:(0,Y.jsxs)(`div`,{className:`quickforge-settings-inline-field`,children:[(0,Y.jsx)(c,{className:`pointer-events-none absolute left-3 top-1/2 size-4 -translate-y-1/2 text-muted-foreground/60`,"aria-hidden":`true`}),(0,Y.jsx)(`input`,{value:p,onChange:e=>m(e.target.value),placeholder:D(`searchSettings`),"aria-label":D(`searchSettings`),className:`quickforge-settings-input`})]})}),(0,Y.jsxs)(`div`,{className:`quickforge-settings-mobile-tabs flex shrink-0 gap-1 overflow-x-auto border-b-[0.5px] border-[color-mix(in_oklab,var(--border)_30%,transparent)] px-3 py-2 md:hidden`,children:[g.map(({item:e,index:t})=>{let n=t===l,r=$[e.key];return(0,Y.jsxs)(`button`,{type:`button`,className:ge(`inline-flex shrink-0 items-center gap-1.5 rounded-full px-3 py-1.5 text-sm transition-colors`,n?`bg-muted text-foreground`:`text-muted-foreground hover:bg-muted/55 hover:text-foreground`),onClick:()=>s(t),children:[(0,Y.jsx)(r,{className:`size-3.5 shrink-0`,"aria-hidden":`true`}),(0,Y.jsx)(`span`,{children:e.tab.getTabName()})]},e.key)}),g.length===0?(0,Y.jsx)(`div`,{className:`shrink-0 px-1 py-1.5 text-sm text-muted-foreground/70`,children:D(`noSettingsResults`)}):null]}),(0,Y.jsx)(`section`,{className:`min-h-0 flex-1 overflow-y-auto px-4 py-5 md:px-8 md:py-7`,children:(0,Y.jsx)(`div`,{className:`mx-auto flex min-h-full w-full max-w-5xl flex-col`,children:u?(0,Y.jsx)(Bt,{tab:u.tab}):null})})]})]})}export{Vt as SettingsWorkspacePage};
1488
+ `}},Y=`quickforge-channels-settings-tab`;customElements.get(Y)||customElements.define(Y,Mt);function Nt(){return document.createElement(Y)}var Pt=ie(),X=re(),Ft=(0,k.lazy)(()=>y(()=>import(`./AgentProfilesPage-CooGLweI.js`).then(e=>({default:e.AgentProfilesPage})),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11]))),It=(0,k.lazy)(()=>y(()=>import(`./mcp-servers-dialog-CsRQxx7A.js`).then(e=>({default:e.McpServersPanel})),__vite__mapDeps([12,1,2,3,4,5,6,7,8,9,10,11]))),Lt=(0,k.lazy)(()=>y(()=>import(`./skills-dialog-CmVLi_h6.js`).then(e=>e.n).then(e=>({default:e.SkillsManagerPanel})),__vite__mapDeps([9,1,2,3,4,5,6,7,8,10,11]))),Rt=(0,k.lazy)(()=>y(()=>import(`./PluginsPage-qXTjDrpd.js`).then(e=>({default:e.PluginsPage})),__vite__mapDeps([13,1,2,3,4,5,6,7,8,9,10,11,14]))),zt=(0,k.lazy)(()=>y(()=>import(`./ScheduledTasksPage-BBor8Yb2.js`).then(e=>({default:e.ScheduledTasksPage})),__vite__mapDeps([15,1,2,3,4,5,6,7,8,9,10,11]))),Bt=class extends _{tabName=``;renderReact;root;getTabName(){return this.tabName}connectedCallback(){super.connectedCallback(),this.updateComplete.then(()=>this.mountReact())}disconnectedCallback(){this.root?.unmount(),this.root=void 0,super.disconnectedCallback()}render(){return g`<div class="quickforge-react-settings-tab h-full min-h-0"></div>`}mountReact(){let e=this.querySelector(`.quickforge-react-settings-tab`);!e||!this.renderReact||(this.root??=(0,Pt.createRoot)(e),this.root.render(this.renderReact()))}},Z=`quickforge-react-settings-tab`;customElements.get(Z)||customElements.define(Z,Bt);function Q(e,t){let n=document.createElement(Z);return n.tabName=e,n.renderReact=t,n}function $({children:e}){return(0,X.jsx)(`div`,{className:`quickforge-settings-stack h-full min-h-[30rem]`,children:(0,X.jsx)(k.Suspense,{fallback:(0,X.jsx)(`div`,{className:`quickforge-settings-note`,children:D(`loading`)}),children:e})})}function Vt(e){window.dispatchEvent(new CustomEvent(`quickforge:open-session-from-settings`,{detail:{sessionId:e}}))}function Ht(){return Q(D(`agentsTab`),()=>(0,X.jsx)($,{children:(0,X.jsx)(Ft,{})}))}function Ut(){return Q(D(`skills`),()=>(0,X.jsx)($,{children:(0,X.jsx)(Lt,{active:!0,scope:`global`,embedded:!0,onSaved:()=>void 0})}))}function Wt(){return Q(D(`mcpServers`),()=>(0,X.jsx)($,{children:(0,X.jsx)(It,{active:!0})}))}function Gt(){return Q(D(`plugins`),()=>(0,X.jsx)($,{children:(0,X.jsx)(Rt,{})}))}function Kt(){return Q(D(`scheduledTasks`),()=>(0,X.jsx)($,{children:(0,X.jsx)(zt,{onOpenSession:Vt})}))}function qt(e){let t=[{key:`appearance`,tab:Pe(),getDescription:()=>D(`appearanceDescription`)},{key:`defaults`,tab:Je(),getDescription:()=>D(`defaultOptionsDescription`)},{key:`memory`,tab:tt(),getDescription:()=>D(`memoryDescription`)},{key:`customModels`,tab:je(e),getDescription:()=>D(`customModelsDescription`)},{key:`agents`,tab:Ht(),getDescription:()=>D(`agentsDescription`)},{key:`skills`,tab:Ut(),getDescription:()=>D(`globalSkillsDescription`)},{key:`mcp`,tab:Wt(),getDescription:void 0},{key:`plugins`,tab:Gt(),getDescription:()=>D(`pluginsDescription`)},{key:`scheduledTasks`,tab:Kt(),getDescription:()=>D(`scheduledTasksDescription`)},{key:`projectCommands`,tab:Ot(),getDescription:()=>D(`projectCommandsDescription`)},{key:`backup`,tab:dt(),getDescription:()=>D(`backupRestoreDescription`)},{key:`archivedConversations`,tab:ht(),getDescription:()=>D(`archivedConversationsDescription`)},{key:`channels`,tab:Nt(),getDescription:()=>D(`channelsDescription`)},{key:`lanAccess`,tab:vt(),getDescription:()=>D(`lanAccessDescription`)},{key:`about`,tab:Et(),getDescription:()=>D(`aboutQuickForgeDescription`)}];return{items:[...t],tabs:t.map(e=>e.tab),indexOf:e=>t.findIndex(t=>t.key===e)}}var Jt={appearance:d,defaults:h,memory:a,customModels:f,agents:t,skills:r,mcp:u,plugins:s,scheduledTasks:i,projectCommands:l,backup:te,archivedConversations:ne,channels:p,lanAccess:m,about:n};function Yt({tab:e}){let t=(0,k.useRef)(null);return(0,k.useEffect)(()=>{let n=t.current;if(n)return n.replaceChildren(e),()=>{e.parentNode===n&&n.removeChild(e)}},[e]),(0,X.jsx)(`div`,{ref:t,className:`quickforge-settings-tab-host min-h-0 flex-1`})}function Xt({initialTab:e,customProvider:t,onBack:n}){let r=(0,k.useMemo)(()=>qt(t),[t]),i=Math.max(0,r.indexOf(e)),[a,s]=(0,k.useState)(),c=a??i,l=r.items[c]??r.items[0],u=l?.getDescription?.(),d=l?Jt[l.key]:void 0,[f,p]=(0,k.useState)(``),m=f.trim().toLowerCase(),h=(0,k.useMemo)(()=>r.items.map((e,t)=>({item:e,index:t})).filter(({item:e})=>m?[e.key,e.tab.getTabName(),e.getDescription?.()??``].join(` `).toLowerCase().includes(m):!0),[r.items,m]);return(0,X.jsxs)(`div`,{className:`flex h-screen min-h-0 bg-[var(--quickforge-sidebar-bg)] text-foreground`,children:[(0,X.jsxs)(`aside`,{className:`relative z-10 hidden w-80 shrink-0 overflow-hidden bg-[var(--quickforge-sidebar-bg)] md:flex md:min-h-0 md:flex-col`,children:[(0,X.jsxs)(`div`,{className:`shrink-0 px-3 pb-2 pt-3`,children:[(0,X.jsxs)(`button`,{type:`button`,className:`group relative flex w-full items-center gap-2 overflow-hidden rounded-lg px-2 py-1.5 text-left text-muted-foreground/72 transition-[background-color,color,box-shadow] duration-160 ease-out hover:bg-[var(--quickforge-sidebar-hover-bg)] hover:text-foreground/86 hover:shadow-[0_8px_20px_-18px_rgb(15_23_42_/_0.35)]`,onClick:n,"aria-label":`返回工作区`,children:[(0,X.jsx)(`span`,{className:`inline-flex size-6 shrink-0 items-center justify-center rounded-full text-muted-foreground/55 transition-colors group-hover:text-foreground/70`,children:(0,X.jsx)(o,{className:`size-4`})}),(0,X.jsx)(`span`,{className:`truncate text-sm leading-5`,children:`返回工作区`})]}),(0,X.jsxs)(`div`,{className:`quickforge-settings-inline-field mt-3`,children:[(0,X.jsx)(ee,{className:`pointer-events-none absolute left-3 top-1/2 size-4 -translate-y-1/2 text-muted-foreground/60`,"aria-hidden":`true`}),(0,X.jsx)(`input`,{value:f,onChange:e=>p(e.target.value),placeholder:D(`searchSettings`),"aria-label":D(`searchSettings`),className:`quickforge-settings-input`})]})]}),(0,X.jsx)(`div`,{className:`min-h-0 flex-1 overflow-y-auto px-3 pb-4 pt-4`,children:(0,X.jsxs)(`nav`,{className:`space-y-1`,"aria-label":D(`settings`),children:[h.map(({item:e,index:t})=>{let n=t===c,r=Jt[e.key];return(0,X.jsxs)(`button`,{type:`button`,className:E(`group relative flex w-full items-center gap-2.5 overflow-hidden rounded-lg px-2 py-1.5 text-left text-sm leading-5 transition-[background-color,color,box-shadow] duration-160 ease-out`,n?`bg-[var(--quickforge-sidebar-active-bg)] font-medium text-foreground/92 shadow-[0_8px_22px_-20px_rgb(15_23_42_/_0.32)]`:`text-muted-foreground/76 hover:bg-[var(--quickforge-sidebar-hover-bg)] hover:text-foreground/90 hover:shadow-[0_8px_20px_-18px_rgb(15_23_42_/_0.35)]`),onClick:()=>s(t),"aria-current":n?`page`:void 0,children:[(0,X.jsx)(`span`,{className:E(`inline-flex size-5 shrink-0 items-center justify-center transition-colors`,n?`text-foreground/72`:`text-muted-foreground/52 group-hover:text-foreground/68`),children:(0,X.jsx)(r,{className:`size-4`,"aria-hidden":`true`})}),(0,X.jsx)(`span`,{className:`truncate`,children:e.tab.getTabName()})]},e.key)}),h.length===0?(0,X.jsx)(`div`,{className:`px-2 py-3 text-sm text-muted-foreground/70`,children:D(`noSettingsResults`)}):null]})})]}),(0,X.jsxs)(`main`,{className:`flex min-w-0 flex-1 flex-col bg-[var(--quickforge-main-bg)] md:overflow-hidden md:rounded-l-2xl`,children:[(0,X.jsxs)(`header`,{className:`flex h-14 shrink-0 items-center gap-2 border-b-[0.5px] border-[color-mix(in_oklab,var(--border)_34%,transparent)] px-3 pr-4 md:px-5`,children:[(0,X.jsx)(Te,{variant:`ghost`,size:`icon`,className:`md:hidden`,onClick:n,"aria-label":`返回工作区`,children:(0,X.jsx)(o,{className:`size-4`})}),(0,X.jsx)(`div`,{className:`min-w-0 flex-1`,children:(0,X.jsxs)(`div`,{className:`flex min-w-0 items-center gap-2`,children:[d?(0,X.jsx)(d,{className:`size-4 shrink-0 text-muted-foreground/65`,"aria-hidden":`true`}):null,(0,X.jsx)(`div`,{className:`min-w-0 truncate text-sm font-medium text-foreground/90`,children:l?.tab.getTabName()}),u?(0,X.jsx)(_e,{label:u}):null]})})]}),(0,X.jsx)(`div`,{className:`shrink-0 border-b-[0.5px] border-[color-mix(in_oklab,var(--border)_30%,transparent)] px-3 py-2 md:hidden`,children:(0,X.jsxs)(`div`,{className:`quickforge-settings-inline-field`,children:[(0,X.jsx)(ee,{className:`pointer-events-none absolute left-3 top-1/2 size-4 -translate-y-1/2 text-muted-foreground/60`,"aria-hidden":`true`}),(0,X.jsx)(`input`,{value:f,onChange:e=>p(e.target.value),placeholder:D(`searchSettings`),"aria-label":D(`searchSettings`),className:`quickforge-settings-input`})]})}),(0,X.jsxs)(`div`,{className:`quickforge-settings-mobile-tabs flex shrink-0 gap-1 overflow-x-auto border-b-[0.5px] border-[color-mix(in_oklab,var(--border)_30%,transparent)] px-3 py-2 md:hidden`,children:[h.map(({item:e,index:t})=>{let n=t===c,r=Jt[e.key];return(0,X.jsxs)(`button`,{type:`button`,className:E(`inline-flex shrink-0 items-center gap-1.5 rounded-full px-3 py-1.5 text-sm transition-colors`,n?`bg-muted text-foreground`:`text-muted-foreground hover:bg-muted/55 hover:text-foreground`),onClick:()=>s(t),children:[(0,X.jsx)(r,{className:`size-3.5 shrink-0`,"aria-hidden":`true`}),(0,X.jsx)(`span`,{children:e.tab.getTabName()})]},e.key)}),h.length===0?(0,X.jsx)(`div`,{className:`shrink-0 px-1 py-1.5 text-sm text-muted-foreground/70`,children:D(`noSettingsResults`)}):null]}),(0,X.jsx)(`section`,{className:`min-h-0 flex-1 overflow-y-auto px-4 py-5 md:px-8 md:py-7`,children:(0,X.jsx)(`div`,{className:`mx-auto flex min-h-full w-full max-w-5xl flex-col`,children:l?(0,X.jsx)(Yt,{tab:l.tab}):null})})]})]})}export{Xt as SettingsWorkspacePage};