@shawnstack/quickforge 1.6.13 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. package/dist/assets/{AgentProfilesPage-Be0oZDW5.js → AgentProfilesPage-DQ8URegq.js} +1 -1
  2. package/dist/assets/{ChatPanelHost-CxEotTsy.js → ChatPanelHost-vi1tDqlJ.js} +1 -1
  3. package/dist/assets/{PluginsPage-DZlqGFLn.js → PluginsPage-B8bHMwfv.js} +1 -1
  4. package/dist/assets/{ScheduledTasksPage-DTkj-0O4.js → ScheduledTasksPage-AaUz5el2.js} +2 -2
  5. package/dist/assets/{SettingsWorkspacePage-BJq11OPD.js → SettingsWorkspacePage-BOP9CtoI.js} +362 -349
  6. package/dist/assets/{SharedConversationPage-BCR8xzii.js → SharedConversationPage-9A4L9UcQ.js} +1 -1
  7. package/dist/assets/{TerminalDock-Bs5b-YNp.js → TerminalDock-DQOXpaDe.js} +2 -2
  8. package/dist/assets/WorkspaceInspector-DaM7TJHb.js +13 -0
  9. package/dist/assets/icons-ko_i0WpN.js +1 -0
  10. package/dist/assets/index-B2eauKpo.css +3 -0
  11. package/dist/assets/index-B8Awq5FV.js +63 -0
  12. package/dist/assets/{mcp-servers-dialog-BHljnwYv.js → mcp-servers-dialog-XE4K8PCO.js} +2 -2
  13. package/dist/assets/{monaco-DEQoYzYI.js → monaco-C13M09wD.js} +1 -1
  14. package/dist/assets/{react-vendor-CZsiwuxm.js → react-vendor-2RKYr-A4.js} +1 -1
  15. package/dist/assets/{skills-dialog-8rn1XU9U.js → skills-dialog-MpoxntiV.js} +1 -1
  16. package/dist/index.html +6 -6
  17. package/package.json +1 -1
  18. package/server/agent-manager.mjs +19 -14
  19. package/server/auto-archive.mjs +137 -0
  20. package/server/auto-compaction.mjs +15 -18
  21. package/server/conversation-compaction.mjs +69 -3
  22. package/server/index.mjs +6 -1
  23. package/server/routes/storage.mjs +4 -0
  24. package/server/session-persistence-lock.mjs +9 -0
  25. package/server/storage.mjs +11 -0
  26. package/dist/assets/WorkspaceInspector-BP0XyAlE.js +0 -13
  27. package/dist/assets/icons-DAxUA0e-.js +0 -1
  28. package/dist/assets/index-BZC61KZg.css +0 -3
  29. package/dist/assets/index-DGQbvw7v.js +0 -63
@@ -1,5 +1,5 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/AgentProfilesPage-Be0oZDW5.js","assets/rolldown-runtime-DWdDZTNf.js","assets/index-DGQbvw7v.js","assets/pi-ai-Cr3rpCXT.js","assets/pi-web-ui-DoRGtREc.js","assets/lit-vendor-Dr3cpBGF.js","assets/css-utils-rkE68RDy.js","assets/icons-DAxUA0e-.js","assets/react-vendor-CZsiwuxm.js","assets/skills-dialog-8rn1XU9U.js","assets/logger-B65Akg8A.js","assets/index-BZC61KZg.css","assets/mcp-servers-dialog-BHljnwYv.js","assets/PluginsPage-DZlqGFLn.js","assets/plugin-api-BbUkYm3Y.js","assets/ScheduledTasksPage-DTkj-0O4.js"])))=>i.map(i=>d[i]);
2
- import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{B as t,Ct as n,Et as r,Ot as i,St as a,Tt as o,b as s,bt as c,f as l,g as ee,h as u,k as d,l as f,nt as te,ot as p,s as m,tt as ne,xt as re}from"./icons-DAxUA0e-.js";import{n as ie,r as ae}from"./react-vendor-CZsiwuxm.js";import{p as h}from"./lit-vendor-Dr3cpBGF.js";import{m as g,x as _}from"./pi-web-ui-DoRGtREc.js";import{J as v}from"./pi-ai-Cr3rpCXT.js";import{t as y}from"./logger-B65Akg8A.js";import{B as b,C as oe,D as se,E as ce,F as le,I as ue,O as x,P as de,Q as fe,R as pe,S as me,T as he,V as S,X as C,Z as ge,at as _e,dt as ve,et as ye,ft as be,it as w,j as xe,k as T,lt as Se,mt as E,nt as Ce,pt as we,rt as Te,st as Ee,ut as De,w as Oe,z as ke}from"./index-DGQbvw7v.js";var D=e(i(),1),Ae={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:C.name,baseUrl:C.baseUrl,protocol:`openai-completions`,modelId:C.modelId,supportsImages:C.supportsImages}},je=[{key:`openai`,label:E(`presetOpenai`)},{key:`deepseek`,label:E(`presetDeepseek`)},{key:`glm`,label:E(`presetGlm`)},{key:`ollama`,label:E(`presetOllama`)},{key:`litellm`,label:E(`presetLitellm`)},{key:`custom`,label:E(`presetCustom`)}],O=()=>({modelId:``,contextWindow:C.contextWindow,maxTokens:C.maxTokens,reasoning:!0,supportsImages:!1,open:!1}),k=()=>({name:C.name,baseUrl:C.baseUrl,apiKey:``,headerRows:[],protocol:`openai-completions`,models:[O()]}),Me=class extends g{providers=[];form=k();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 E(`customModels`)}async loadProviders(){this.loading=!0,this.requestUpdate();try{this.providers=await _().customProviders.getAll()}catch(e){y.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=k(),this.apiKeyVisible=!1,this.advancedOpen=!1,this.activePreset=``,this.resetTestState(),this.formOpen=!0,this.requestUpdate()}async openEditForm(e){let t=await _().providerKeys.get(e.name)??e.apiKey??``,n=e.models??[],r=n.length>0?n.map(e=>({modelId:e.id,contextWindow:e.contextWindow??C.contextWindow,maxTokens:e.maxTokens??C.maxTokens,reasoning:e.reasoning===!0,supportsImages:e.input?.includes(`image`)===!0,open:!1})):[O()],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=k(),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,O()]},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:[O()]};else{let t=Ae[e];this.form={...this.form,name:t.name,baseUrl:t.baseUrl,protocol:t.protocol,models:[{...O(),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)||C.contextWindow,maxTokens:Number(e.maxTokens)||C.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=E(`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||E(`connectionFailed`))}catch(e){this.testResult=`fail`,this.testError=e?.message||E(`connectionFailed`)}finally{this.testing=!1,this.requestUpdate()}}async saveModel(){let e=this.form.name.trim(),t=this.form.baseUrl.trim();if(!e||!t){b(E(`fillProviderBaseUrlModel`));return}let n=this.form.models.filter(e=>e.modelId.trim());if(n.length===0){b(E(`atLeastOneModel`));return}let r=n.map(e=>e.modelId.trim());if(new Set(r).size!==r.length){b(E(`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??_e(),name:e,type:this.form.protocol,baseUrl:a[0].baseUrl,apiKey:o||void 0,models:a};try{let e=_();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){y.error(`Failed to save custom model:`,e),b(E(`saveCustomModelFailed`))}}async deleteProvider(e){if(await S({description:E(`confirmDeleteProvider`,{name:e.name}),confirmLabel:E(`confirmDelete`),cancelLabel:E(`cancel`),variant:`destructive`}))try{let t=_();await t.customProviders.delete(e.id),await t.providerKeys.delete(e.name),await this.loadProviders()}catch(e){y.error(`Failed to delete custom provider:`,e),b(E(`deleteFailed`))}}renderProvider(e){let t=e.models??[],n=t.length,r=e.type===`anthropic-messages`?`Anthropic Messages`:`OpenAI Compatible`;return h`
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/AgentProfilesPage-DQ8URegq.js","assets/rolldown-runtime-DWdDZTNf.js","assets/index-B8Awq5FV.js","assets/pi-ai-Cr3rpCXT.js","assets/pi-web-ui-DoRGtREc.js","assets/lit-vendor-Dr3cpBGF.js","assets/css-utils-rkE68RDy.js","assets/icons-ko_i0WpN.js","assets/react-vendor-2RKYr-A4.js","assets/skills-dialog-MpoxntiV.js","assets/logger-B65Akg8A.js","assets/index-B2eauKpo.css","assets/mcp-servers-dialog-XE4K8PCO.js","assets/PluginsPage-B8bHMwfv.js","assets/plugin-api-BbUkYm3Y.js","assets/ScheduledTasksPage-AaUz5el2.js"])))=>i.map(i=>d[i]);
2
+ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ct as t,Et as n,Ot as r,St as i,Tt as a,b as o,bt as s,et as c,f as l,g as ee,h as u,k as d,l as f,ot as p,s as m,tt as h,xt as te,z as ne}from"./icons-ko_i0WpN.js";import{n as re,r as ie}from"./react-vendor-2RKYr-A4.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{B as x,C as ae,D as oe,E as se,F as ce,I as le,O as S,P as ue,Q as de,R as fe,S as pe,T as me,V as C,X as w,Z as he,at as ge,dt as _e,et as ve,ft as ye,it as T,j as be,k as E,lt as xe,mt as D,nt as Se,pt as Ce,rt as we,st as Te,ut as O,w as Ee,z as De}from"./index-B8Awq5FV.js";var k=e(r(),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 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)||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){x(D(`fillProviderBaseUrlModel`));return}let n=this.form.models.filter(e=>e.modelId.trim());if(n.length===0){x(D(`atLeastOneModel`));return}let r=n.map(e=>e.modelId.trim());if(new Set(r).size!==r.length){x(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??ge(),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),x(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=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),x(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">
@@ -8,16 +8,16 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{B as t,Ct as n,Et as r
8
8
  <div class="quickforge-settings-row-title">${e.name}</div>
9
9
  <div class="quickforge-settings-row-description break-all">${e.baseUrl}</div>
10
10
  <div class="quickforge-settings-meta">
11
- <span class="quickforge-settings-badge quickforge-settings-badge-muted">${E(`providerProtocol`)}: ${r}</span>
12
- <span class="quickforge-settings-badge quickforge-settings-badge-info">${E(`modelsCount`,{count:n})}</span>
13
- ${n===0?h`<span class="quickforge-settings-badge quickforge-settings-badge-warning">${E(`noModelAdded`)}</span>`:null}
11
+ <span class="quickforge-settings-badge quickforge-settings-badge-muted">${D(`providerProtocol`)}: ${r}</span>
12
+ <span class="quickforge-settings-badge quickforge-settings-badge-info">${D(`modelsCount`,{count:n})}</span>
13
+ ${n===0?g`<span class="quickforge-settings-badge quickforge-settings-badge-warning">${D(`noModelAdded`)}</span>`:null}
14
14
  </div>
15
- ${n>0?h`
15
+ ${n>0?g`
16
16
  <div class="quickforge-settings-meta">
17
- ${t.slice(0,6).map(e=>h`
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?h`<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>
@@ -29,22 +29,22 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{B as t,Ct as n,Et as r
29
29
  type="button"
30
30
  @click=${()=>this.openEditForm(e)}
31
31
  >
32
- ${E(`editModel`)}
32
+ ${D(`editModel`)}
33
33
  </button>
34
34
  <button
35
35
  class="quickforge-settings-button quickforge-settings-button-danger quickforge-settings-button-compact"
36
36
  type="button"
37
37
  @click=${()=>this.deleteProvider(e)}
38
38
  >
39
- ${E(`delete`)}
39
+ ${D(`delete`)}
40
40
  </button>
41
41
  </div>
42
42
  </div>
43
- `}renderPresetChips(){return h`
43
+ `}renderPresetChips(){return g`
44
44
  <div class="quickforge-settings-form-row">
45
- <span class="quickforge-settings-form-label">${E(`presets`)}</span>
45
+ <span class="quickforge-settings-form-label">${D(`presets`)}</span>
46
46
  <div class="quickforge-settings-segmented quickforge-settings-segmented-wrap">
47
- ${je.map(e=>h`
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,12 +55,12 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{B as t,Ct as n,Et as r
55
55
  `)}
56
56
  </div>
57
57
  </div>
58
- `}renderModelRow(e,t){let n=e.open===!0;return h`
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"
62
62
  type="button"
63
- title=${E(`expandModel`)}
63
+ title=${D(`expandModel`)}
64
64
  aria-expanded=${n?`true`:`false`}
65
65
  @click=${()=>this.toggleModelExpanded(t)}
66
66
  >
@@ -71,12 +71,12 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{B as t,Ct as n,Et as r
71
71
  class="quickforge-settings-input quickforge-settings-mono"
72
72
  .value=${e.modelId}
73
73
  @input=${e=>this.updateModelField(t,`modelId`,e.target.value)}
74
- placeholder=${E(`modelIdPlaceholder`)}
74
+ placeholder=${D(`modelIdPlaceholder`)}
75
75
  />
76
- ${n?h`
76
+ ${n?g`
77
77
  <div class="quickforge-settings-model-grid mt-3">
78
78
  <label class="quickforge-settings-form-row">
79
- <span class="quickforge-settings-form-label">${E(`contextWindow`)}</span>
79
+ <span class="quickforge-settings-form-label">${D(`contextWindow`)}</span>
80
80
  <input
81
81
  class="quickforge-settings-input"
82
82
  .value=${String(e.contextWindow)}
@@ -85,7 +85,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{B as t,Ct as n,Et as r
85
85
  />
86
86
  </label>
87
87
  <label class="quickforge-settings-form-row">
88
- <span class="quickforge-settings-form-label">${E(`maxTokens`)}</span>
88
+ <span class="quickforge-settings-form-label">${D(`maxTokens`)}</span>
89
89
  <input
90
90
  class="quickforge-settings-input"
91
91
  .value=${String(e.maxTokens)}
@@ -100,7 +100,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{B as t,Ct as n,Et as r
100
100
  .checked=${e.reasoning}
101
101
  @change=${e=>this.updateModelField(t,`reasoning`,e.target.checked)}
102
102
  />
103
- <span>${E(`reasoningModel`)}</span>
103
+ <span>${D(`reasoningModel`)}</span>
104
104
  </label>
105
105
  <label class="mt-2 flex items-center gap-2 text-sm text-muted-foreground">
106
106
  <input
@@ -109,49 +109,49 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{B as t,Ct as n,Et as r
109
109
  @change=${e=>this.updateModelField(t,`supportsImages`,e.target.checked)}
110
110
  />
111
111
  <span>
112
- ${E(`imageInputModel`)}
113
- <quickforge-info-tip .label=${E(`imageInputModelHelp`)}></quickforge-info-tip>
112
+ ${D(`imageInputModel`)}
113
+ <quickforge-info-tip .label=${D(`imageInputModelHelp`)}></quickforge-info-tip>
114
114
  </span>
115
115
  </label>
116
116
  `:null}
117
117
  </div>
118
- ${this.form.models.length>1?h`
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"
122
- title=${E(`delete`)}
122
+ title=${D(`delete`)}
123
123
  @click=${()=>this.removeModelRow(t)}
124
124
  >
125
125
 
126
126
  </button>
127
127
  `:null}
128
128
  </div>
129
- `}renderHeadersEditor(){return h`
129
+ `}renderHeadersEditor(){return g`
130
130
  <div class="quickforge-settings-form-row">
131
131
  <span class="quickforge-settings-form-label">
132
- ${E(`customHeaders`)}
133
- <quickforge-info-tip .label=${E(`customHeadersHelp`)}></quickforge-info-tip>
132
+ ${D(`customHeaders`)}
133
+ <quickforge-info-tip .label=${D(`customHeadersHelp`)}></quickforge-info-tip>
134
134
  </span>
135
- ${this.form.headerRows.length===0?h``:h`
135
+ ${this.form.headerRows.length===0?g``:g`
136
136
  <div class="quickforge-settings-nested-list">
137
- ${this.form.headerRows.map((e,t)=>h`
137
+ ${this.form.headerRows.map((e,t)=>g`
138
138
  <div class="quickforge-settings-subrow">
139
139
  <input
140
140
  class="quickforge-settings-input"
141
141
  .value=${e.key}
142
142
  @input=${e=>this.updateHeaderRow(t,`key`,e.target.value)}
143
- placeholder=${E(`headerName`)}
143
+ placeholder=${D(`headerName`)}
144
144
  />
145
145
  <input
146
146
  class="quickforge-settings-input"
147
147
  .value=${e.value}
148
148
  @input=${e=>this.updateHeaderRow(t,`value`,e.target.value)}
149
- placeholder=${E(`headerValue`)}
149
+ placeholder=${D(`headerValue`)}
150
150
  />
151
151
  <button
152
152
  class="quickforge-settings-icon-action quickforge-settings-icon-action-danger"
153
153
  type="button"
154
- title=${E(`removeHeader`)}
154
+ title=${D(`removeHeader`)}
155
155
  @click=${()=>this.removeHeaderRow(t)}
156
156
  >
157
157
 
@@ -165,11 +165,11 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{B as t,Ct as n,Et as r
165
165
  type="button"
166
166
  @click=${()=>this.addHeaderRow()}
167
167
  >
168
- + ${E(`addHeader`)}
168
+ + ${D(`addHeader`)}
169
169
  </button>
170
170
  </div>
171
- `}renderTestStatus(){return this.testResult===`idle`&&!this.testing?h``:this.testing?h`<span class="quickforge-settings-status">${E(`testingConnection`)}</span>`:this.testResult===`ok`?h`<span class="quickforge-settings-badge quickforge-settings-badge-success">✓ ${E(`connectionOk`)}</span>`:h`<span class="quickforge-settings-alert">✗ ${this.testError||E(`connectionFailed`)}</span>`}renderForm(){return h`
172
- <section class="quickforge-settings-section" aria-label=${this.editingProviderId?E(`editCustomModel`):E(`addCustomModel`)}>
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
+ <section class="quickforge-settings-section" aria-label=${this.editingProviderId?D(`editCustomModel`):D(`addCustomModel`)}>
173
173
  <div class="quickforge-settings-toolbar">
174
174
  <button
175
175
  class="quickforge-settings-button quickforge-settings-button-secondary"
@@ -177,11 +177,11 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{B as t,Ct as n,Et as r
177
177
  @click=${()=>this.closeForm()}
178
178
  >
179
179
  <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="m12 19-7-7 7-7"/><path d="M19 12H5"/></svg>
180
- ${E(`back`)}
180
+ ${D(`back`)}
181
181
  </button>
182
182
  <div class="quickforge-settings-row-main">
183
- <div class="quickforge-settings-row-title">${this.editingProviderId?E(`editCustomModel`):E(`addCustomModel`)}</div>
184
- <div class="quickforge-settings-row-description">${E(`customModelsDescription`)}</div>
183
+ <div class="quickforge-settings-row-title">${this.editingProviderId?D(`editCustomModel`):D(`addCustomModel`)}</div>
184
+ <div class="quickforge-settings-row-description">${D(`customModelsDescription`)}</div>
185
185
  </div>
186
186
  </div>
187
187
 
@@ -189,12 +189,12 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{B as t,Ct as n,Et as r
189
189
  ${this.renderPresetChips()}
190
190
 
191
191
  <label class="quickforge-settings-form-row">
192
- <span class="quickforge-settings-form-label">${E(`providerName`)}</span>
192
+ <span class="quickforge-settings-form-label">${D(`providerName`)}</span>
193
193
  <input
194
194
  class="quickforge-settings-input"
195
195
  .value=${this.form.name}
196
196
  @input=${e=>this.updateForm(`name`,e.target.value)}
197
- placeholder=${E(`providerNamePlaceholder`)}
197
+ placeholder=${D(`providerNamePlaceholder`)}
198
198
  />
199
199
  </label>
200
200
 
@@ -209,37 +209,37 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{B as t,Ct as n,Et as r
209
209
  </label>
210
210
 
211
211
  <label class="quickforge-settings-form-row">
212
- <span class="quickforge-settings-form-label">${E(`apiKey`)}</span>
212
+ <span class="quickforge-settings-form-label">${D(`apiKey`)}</span>
213
213
  <div class="quickforge-settings-inline-field">
214
214
  <input
215
215
  class="quickforge-settings-input pr-10"
216
216
  .value=${this.form.apiKey}
217
217
  type=${this.apiKeyVisible?`text`:`password`}
218
218
  @input=${e=>this.updateForm(`apiKey`,e.target.value)}
219
- placeholder=${E(`apiKeyPlaceholder`)}
219
+ placeholder=${D(`apiKeyPlaceholder`)}
220
220
  />
221
221
  <button
222
222
  class="quickforge-settings-inline-field-button"
223
223
  type="button"
224
- title=${this.apiKeyVisible?E(`hideApiKey`):E(`showApiKey`)}
225
- aria-label=${this.apiKeyVisible?E(`hideApiKey`):E(`showApiKey`)}
224
+ title=${this.apiKeyVisible?D(`hideApiKey`):D(`showApiKey`)}
225
+ aria-label=${this.apiKeyVisible?D(`hideApiKey`):D(`showApiKey`)}
226
226
  aria-pressed=${this.apiKeyVisible?`true`:`false`}
227
227
  @click=${()=>this.toggleApiKeyVisibility()}
228
228
  >
229
- ${this.apiKeyVisible?h`<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>`:h`<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>
233
233
 
234
234
  <div class="quickforge-settings-form-row">
235
235
  <div class="flex items-center justify-between gap-3">
236
- <span class="quickforge-settings-form-label">${E(`modelsList`)}</span>
236
+ <span class="quickforge-settings-form-label">${D(`modelsList`)}</span>
237
237
  <button
238
238
  class="quickforge-settings-button quickforge-settings-button-secondary quickforge-settings-button-compact"
239
239
  type="button"
240
240
  @click=${()=>this.addModelRow()}
241
241
  >
242
- + ${E(`addModel`)}
242
+ + ${D(`addModel`)}
243
243
  </button>
244
244
  </div>
245
245
  <div class="quickforge-settings-nested-list">
@@ -254,15 +254,15 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{B as t,Ct as n,Et as r
254
254
  @click=${()=>{this.advancedOpen=!this.advancedOpen,this.requestUpdate()}}
255
255
  >
256
256
  <span>${this.advancedOpen?`▾`:`▸`}</span>
257
- ${E(`providerAdvanced`)}
257
+ ${D(`providerAdvanced`)}
258
258
  </button>
259
259
 
260
- ${this.advancedOpen?h`
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">
264
- ${E(`protocolType`)}
265
- <quickforge-info-tip .label=${E(`protocolHelp`)}></quickforge-info-tip>
264
+ ${D(`protocolType`)}
265
+ <quickforge-info-tip .label=${D(`protocolHelp`)}></quickforge-info-tip>
266
266
  </span>
267
267
  <select
268
268
  class="quickforge-settings-select"
@@ -288,7 +288,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{B as t,Ct as n,Et as r
288
288
  type="button"
289
289
  @click=${()=>this.closeForm()}
290
290
  >
291
- ${E(`cancel`)}
291
+ ${D(`cancel`)}
292
292
  </button>
293
293
  <button
294
294
  class="quickforge-settings-button quickforge-settings-button-secondary"
@@ -296,49 +296,49 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{B as t,Ct as n,Et as r
296
296
  ?disabled=${this.testing}
297
297
  @click=${()=>this.testConnection()}
298
298
  >
299
- ${this.testing?E(`testingConnection`):E(`testConnection`)}
299
+ ${this.testing?D(`testingConnection`):D(`testConnection`)}
300
300
  </button>
301
301
  <button
302
302
  class="quickforge-settings-button quickforge-settings-button-primary"
303
303
  type="button"
304
304
  @click=${()=>this.saveModel()}
305
305
  >
306
- ${E(`save`)}
306
+ ${D(`save`)}
307
307
  </button>
308
308
  </div>
309
309
  </div>
310
310
  </section>
311
- `}render(){return this.formOpen?h`
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">
315
- ${this.editingProviderId?E(`editCustomModel`):E(`addCustomModel`)}
316
- <quickforge-info-tip .label=${E(`customModelsDescription`)}></quickforge-info-tip>
315
+ ${this.editingProviderId?D(`editCustomModel`):D(`addCustomModel`)}
316
+ <quickforge-info-tip .label=${D(`customModelsDescription`)}></quickforge-info-tip>
317
317
  </h3>
318
318
  </div>
319
319
  ${this.renderForm()}
320
320
  </div>
321
- `:h`
321
+ `:g`
322
322
  <div class="quickforge-settings-stack">
323
- <section class="quickforge-settings-section" aria-label=${E(`customModelsTitle`)}>
323
+ <section class="quickforge-settings-section" aria-label=${D(`customModelsTitle`)}>
324
324
  <div class="quickforge-settings-toolbar">
325
325
  <div>
326
- <div class="quickforge-settings-row-title">${E(`customModelsTitle`)}</div>
327
- <div class="quickforge-settings-row-description">${E(`customModelsDescription`)}</div>
326
+ <div class="quickforge-settings-row-title">${D(`customModelsTitle`)}</div>
327
+ <div class="quickforge-settings-row-description">${D(`customModelsDescription`)}</div>
328
328
  </div>
329
329
  <button
330
330
  class="quickforge-settings-button quickforge-settings-button-primary"
331
331
  type="button"
332
332
  @click=${()=>this.openAddForm()}
333
333
  >
334
- ${E(`addModel`)}
334
+ ${D(`addModel`)}
335
335
  </button>
336
336
  </div>
337
337
 
338
- ${this.loading?h`<div class="quickforge-settings-empty-row">${E(`loading`)}</div>`:this.providers.length===0?h`<div class="quickforge-settings-empty-row">${E(`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
- `}},A=`quickforge-custom-providers-only-tab`;customElements.get(A)||customElements.define(A,Me);function Ne(e){let t=document.createElement(A);return e&&(t.autoEditProviderName=e),t}var Pe=[{value:`light`,label:()=>E(`lightTheme`)},{value:`dark`,label:()=>E(`darkTheme`)}],Fe=class extends g{theme=he();interfaceFontSizePx=x.interfaceFontSizePx;messageFontSizePx=x.messageFontSizePx;loading=!0;error=``;getTabName(){return E(`appearance`)}async connectedCallback(){super.connectedCallback(),await this.loadSettings()}async loadSettings(){this.loading=!0,this.error=``,this.requestUpdate();try{let e=_(),[t,n]=await Promise.all([ce(e),de(e)]);this.theme=t.theme,this.interfaceFontSizePx=n.interfaceFontSizePx,this.messageFontSizePx=n.messageFontSizePx}catch(e){this.error=e instanceof Error?e.message:E(`requestFailed`)}finally{this.loading=!1,this.requestUpdate()}}async selectTheme(e){if(this.theme!==e){this.theme=e,this.requestUpdate();try{await se(_(),{theme:e}),this.error=``,this.requestUpdate()}catch(e){this.error=e instanceof Error?e.message:E(`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,xe(t),this.requestUpdate()}updateInterfaceFontSize(e){this.previewFontSize({...this.currentFontSizeSettings(),interfaceFontSizePx:Number(e)||x.interfaceFontSizePx})}updateMessageFontSize(e){this.previewFontSize({...this.currentFontSizeSettings(),messageFontSizePx:Number(e)||x.messageFontSizePx})}async saveFontSize(){try{await ue(_(),this.currentFontSizeSettings()),this.error=``,this.requestUpdate()}catch(e){this.error=e instanceof Error?e.message:E(`requestFailed`),this.requestUpdate()}}renderThemeOption(e){let t=this.theme===e.value;return h`
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=me();interfaceFontSizePx=S.interfaceFontSizePx;messageFontSizePx=S.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([se(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 oe(v(),{theme:e}),this.error=``,this.requestUpdate()}catch(e){this.error=e instanceof Error?e.message:D(`requestFailed`),this.requestUpdate()}}}currentFontSizeSettings(){return ce({interfaceFontSizePx:this.interfaceFontSizePx,messageFontSizePx:this.messageFontSizePx})}previewFontSize(e){let t=ce(e);this.interfaceFontSizePx=t.interfaceFontSizePx,this.messageFontSizePx=t.messageFontSizePx,be(t),this.requestUpdate()}updateInterfaceFontSize(e){this.previewFontSize({...this.currentFontSizeSettings(),interfaceFontSizePx:Number(e)||S.interfaceFontSizePx})}updateMessageFontSize(e){this.previewFontSize({...this.currentFontSizeSettings(),messageFontSizePx:Number(e)||S.messageFontSizePx})}async saveFontSize(){try{await le(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,14 +347,14 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{B as t,Ct as n,Et as r
347
347
  >
348
348
  ${e.label()}
349
349
  </button>
350
- `}getFontSizeRangeProgress(e){return(e-T.min)/(T.max-T.min)*100}renderFontSizeSlider(e,t,n,r){return h`
350
+ `}getFontSizeRangeProgress(e){return(e-E.min)/(E.max-E.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?h`<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
- <div class="quickforge-settings-row-description">${E(`fontSizeRangeDescription`)}</div>
357
+ <div class="quickforge-settings-row-description">${D(`fontSizeRangeDescription`)}</div>
358
358
  </div>
359
359
  <div class="quickforge-settings-row-control quickforge-settings-slider-control">
360
360
  <span class="quickforge-settings-value-badge">${n}px</span>
@@ -362,8 +362,8 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{B as t,Ct as n,Et 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(T.min)}
366
- max=${String(T.max)}
365
+ min=${String(E.min)}
366
+ max=${String(E.max)}
367
367
  step="1"
368
368
  .value=${String(n)}
369
369
  @input=${e=>r(e.target.value)}
@@ -371,100 +371,100 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{B as t,Ct as n,Et as r
371
371
  />
372
372
  </div>
373
373
  </div>
374
- `}render(){return this.loading?h`<div class="text-sm text-muted-foreground">${E(`loading`)}</div>`:h`
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
- <section class="quickforge-settings-section" aria-label=${E(`appearance`)}>
376
+ <section class="quickforge-settings-section" aria-label=${D(`appearance`)}>
377
377
  <div class="quickforge-settings-row">
378
378
  <div class="quickforge-settings-row-main">
379
379
  <div class="quickforge-settings-row-title">
380
- ${E(`theme`)}
381
- <quickforge-info-tip .label=${E(`themeDescription`)}></quickforge-info-tip>
380
+ ${D(`theme`)}
381
+ <quickforge-info-tip .label=${D(`themeDescription`)}></quickforge-info-tip>
382
382
  </div>
383
- <div class="quickforge-settings-row-description">${E(`themeDescription`)}</div>
383
+ <div class="quickforge-settings-row-description">${D(`themeDescription`)}</div>
384
384
  </div>
385
385
  <div class="quickforge-settings-row-control">
386
- <div class="quickforge-settings-segmented" role="group" aria-label=${E(`theme`)}>
387
- ${Pe.map(e=>this.renderThemeOption(e))}
386
+ <div class="quickforge-settings-segmented" role="group" aria-label=${D(`theme`)}>
387
+ ${Me.map(e=>this.renderThemeOption(e))}
388
388
  </div>
389
389
  </div>
390
390
  </div>
391
391
 
392
- ${this.renderFontSizeSlider(E(`interfaceFontSize`),null,this.interfaceFontSizePx,e=>this.updateInterfaceFontSize(e))}
392
+ ${this.renderFontSizeSlider(D(`interfaceFontSize`),null,this.interfaceFontSizePx,e=>this.updateInterfaceFontSize(e))}
393
393
 
394
- ${this.renderFontSizeSlider(E(`messageFontSize`),E(`messageFontSizeNote`),this.messageFontSizePx,e=>this.updateMessageFontSize(e))}
394
+ ${this.renderFontSizeSlider(D(`messageFontSize`),D(`messageFontSizeNote`),this.messageFontSizePx,e=>this.updateMessageFontSize(e))}
395
395
  </section>
396
396
 
397
- ${this.error?h`<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
- `}},j=`quickforge-appearance-settings-tab`;customElements.get(j)||customElements.define(j,Fe);function Ie(){return document.createElement(j)}var Le=`auto-compact-settings`,M={enabled:!0,thresholdPercent:80,keepRecentTurns:3,minSourceChars:1600,requireConfirmation:!0};function N(e,t,n,r){let i=Number(e);return Number.isFinite(i)?Math.min(r,Math.max(n,Math.round(i))):t}function Re(e){if(!e||typeof e!=`object`)return{...M};let t=e;return{enabled:t.enabled!==!1,thresholdPercent:N(t.thresholdPercent,M.thresholdPercent,50,95),keepRecentTurns:N(t.keepRecentTurns,M.keepRecentTurns,1,20),minSourceChars:N(t.minSourceChars,M.minSourceChars,0,2e5),requireConfirmation:t.requireConfirmation!==!1}}async function ze(e){return Re(await e.settings.get(Le))}async function Be(e,t){await e.settings.set(Le,Re(t))}var Ve=[{value:`off`,label:()=>E(`thinkingOff`)},{value:`low`,label:()=>E(`thinkingLow`)},{value:`medium`,label:()=>E(`thinkingMedium`)},{value:`high`,label:()=>E(`thinkingHigh`)},{value:`xhigh`,label:()=>E(`thinkingXHigh`)}],He=[{value:`compact`,label:()=>E(`toolDisplayCompact`)},{value:`detailed`,label:()=>E(`toolDisplayDetailed`)}],P=`__custom__`;function Ue(e){return(e??``).trim().replace(/\/$/,``)}function F(e){return JSON.stringify([e.provider,e.id,e.api,Ue(e.baseUrl)])}function We(e){return`${e.provider} / ${e.id}`}function Ge(){return`custom_${globalThis.crypto?.randomUUID?.().slice(0,8)||Date.now().toString(36)}`}function Ke(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 qe=h`
399
+ `}},Pe=`quickforge-appearance-settings-tab`;customElements.get(Pe)||customElements.define(Pe,Ne);function Fe(){return document.createElement(Pe)}var Ie=`auto-compact-settings`,N={enabled:!0,thresholdPercent:80,keepRecentTurns:3,minSourceChars:1600,requireConfirmation:!0};function P(e,t,n,r){let i=Number(e);return Number.isFinite(i)?Math.min(r,Math.max(n,Math.round(i))):t}function Le(e){if(!e||typeof e!=`object`)return{...N};let t=e;return{enabled:t.enabled!==!1,thresholdPercent:P(t.thresholdPercent,N.thresholdPercent,50,95),keepRecentTurns:P(t.keepRecentTurns,N.keepRecentTurns,1,20),minSourceChars:P(t.minSourceChars,N.minSourceChars,0,2e5),requireConfirmation:t.requireConfirmation!==!1}}async function Re(e){return Le(await e.settings.get(Ie))}async function ze(e,t){await e.settings.set(Ie,Le(t))}var Be=`auto-archive-settings`,Ve={enabled:!1};function He(e){return!e||typeof e!=`object`?{...Ve}:{enabled:e.enabled===!0}}async function Ue(e){return He(await e.settings.get(Be))}async function We(e,t){await e.settings.set(Be,He(t))}var Ge=[{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`)}],Ke=[{value:`compact`,label:()=>D(`toolDisplayCompact`)},{value:`detailed`,label:()=>D(`toolDisplayDetailed`)}],F=`__custom__`;function qe(e){return(e??``).trim().replace(/\/$/,``)}function I(e){return JSON.stringify([e.provider,e.id,e.api,qe(e.baseUrl)])}function Je(e){return`${e.provider} / ${e.id}`}function Ye(){return`custom_${globalThis.crypto?.randomUUID?.().slice(0,8)||Date.now().toString(36)}`}function Xe(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 Ze=g`
400
400
  <svg class="size-3.5" viewBox="0 0 16 16" fill="none" aria-hidden="true">
401
401
  <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" />
402
402
  </svg>
403
- `,Je=class extends g{models=[];selectedModel;thinkingLevel=`off`;toolDisplayMode=`compact`;showContextUsage=!1;autoCompactEnabled=!0;autoCompactRequireConfirmation=!0;autoCompactThresholdPercent=80;autoCompactThresholdPercentInput=`80`;autoCompactKeepRecentTurns=3;selectedLanguage=be();loading=!0;saved=!1;savedMessage=``;error=``;terminalShellConfig={terminalShell:`auto`,defaultProfileId:`auto`,profiles:[]};customShellCommand=``;customShellEditorOpen=!1;getTabName(){return E(`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=F(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);let r=this.querySelector(`[data-terminal-shell-select]`);r&&(r.value=this.customShellEditorOpen?P:this.selectedTerminalShellProfileId())}async loadSettings(){this.loading=!0,this.error=``,this.requestUpdate();try{let e=_(),[t,n,r,i]=await Promise.all([fe(e),ye(e),pe(e),ze(e)]);this.models=t,this.selectedModel=n.model?t.find(e=>F(e)===F(n.model))??n.model:t[0],this.thinkingLevel=n.thinkingLevel??ge(this.selectedModel),this.toolDisplayMode=r.toolDisplayMode,this.showContextUsage=r.showContextUsage,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:E(`requestFailed`)}finally{this.loading=!1,this.requestUpdate()}}updateModel(e){let t=this.models.find(t=>F(t)===e);this.selectedModel=t,this.thinkingLevel=ge(t),this.saved=!1,this.requestUpdate(),this.saveDefaultModelOptions()}updateThinkingLevel(e){this.thinkingLevel=Ve.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(_(),this.selectedLanguage)}updateToolDisplayMode(e){this.toolDisplayMode!==e&&(this.toolDisplayMode=e,this.saved=!1,this.requestUpdate(),this.saveToolDisplayOptions())}updateShowContextUsage(e){this.showContextUsage=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=E(`defaultOptionsSaved`)){this.saved=!0,this.savedMessage=e,this.error=``,this.requestUpdate()}customShellProfiles(){return this.terminalShellConfig.profiles.filter(e=>!e.builtin)}selectedTerminalShellProfileId(){let e=this.terminalShellConfig.profiles;return e.some(e=>e.id===this.terminalShellConfig.defaultProfileId)?this.terminalShellConfig.defaultProfileId:e[0]?.id||P}updateTerminalShellSelection(e){if(e===P){this.customShellEditorOpen=!0,this.requestUpdate();return}this.customShellEditorOpen=!1,this.requestUpdate(),this.saveTerminalShellConfig(e)}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||E(`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:E(`requestFailed`)}}async saveTerminalShellConfig(e,t=this.customShellProfiles(),n=E(`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||E(`requestFailed`));this.terminalShellConfig=i,this.markSaved(n)}catch(e){this.error=e instanceof Error?e.message:E(`requestFailed`),this.requestUpdate()}}async addCustomTerminalShell(){let e=this.customShellCommand.trim();if(!e){this.error=E(`terminalShellProfileRequired`),this.requestUpdate();return}let t={id:Ge(),name:Ke(e),command:e,builtin:!1},n=[...this.customShellProfiles(),t];this.customShellCommand=``,this.customShellEditorOpen=!1,await this.saveTerminalShellConfig(t.id,n,E(`terminalShellProfilesSaved`))}async deleteCustomTerminalShell(e){let t=this.terminalShellConfig.profiles.find(t=>t.id===e);if(!t||t.builtin||!await S({description:E(`terminalShellDeleteConfirm`,{name:t.name}),confirmLabel:E(`confirmDelete`),cancelLabel:E(`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,E(`terminalShellProfilesSaved`))}async saveDefaultModelOptions(){try{let e=this.selectedModel?.reasoning?this.thinkingLevel:`off`;await Te(_(),{model:this.selectedModel,thinkingLevel:e}),this.markSaved()}catch(e){this.error=e instanceof Error?e.message:E(`requestFailed`),this.requestUpdate()}}async saveToolDisplayOptions(){try{await ke(_(),{toolDisplayMode:this.toolDisplayMode,showContextUsage:this.showContextUsage}),this.markSaved()}catch(e){this.error=e instanceof Error?e.message:E(`requestFailed`),this.requestUpdate()}}async saveAutoCompactOptions(){try{await Be(_(),{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:E(`requestFailed`),this.requestUpdate()}}modelOptions(){if(!this.selectedModel)return this.models;let e=F(this.selectedModel);return this.models.some(t=>F(t)===e)?this.models:[this.selectedModel,...this.models]}terminalShellSettings(){let e=this.terminalShellConfig.profiles,t=this.selectedTerminalShellProfileId(),n=e.find(e=>e.id===t),r=this.customShellEditorOpen||e.length===0;return h`
404
- <section class="quickforge-settings-section" aria-label=${E(`terminalShell`)}>
403
+ `,Qe=class extends _{models=[];selectedModel;thinkingLevel=`off`;toolDisplayMode=`compact`;showContextUsage=!1;autoCompactEnabled=!0;autoCompactRequireConfirmation=!0;autoCompactThresholdPercent=80;autoCompactThresholdPercentInput=`80`;autoCompactKeepRecentTurns=3;autoArchiveEnabled=!1;selectedLanguage=ye();loading=!0;saved=!1;savedMessage=``;error=``;terminalShellConfig={terminalShell:`auto`,defaultProfileId:`auto`,profiles:[]};customShellCommand=``;customShellEditorOpen=!1;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);let r=this.querySelector(`[data-terminal-shell-select]`);r&&(r.value=this.customShellEditorOpen?F:this.selectedTerminalShellProfileId())}async loadSettings(){this.loading=!0,this.error=``,this.requestUpdate();try{let e=v(),[t,n,r,i,a]=await Promise.all([de(e),ve(e),fe(e),Re(e),Ue(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.toolDisplayMode=r.toolDisplayMode,this.showContextUsage=r.showContextUsage,this.autoCompactEnabled=i.enabled,this.autoCompactRequireConfirmation=i.requireConfirmation,this.autoCompactThresholdPercent=i.thresholdPercent,this.autoCompactThresholdPercentInput=String(i.thresholdPercent),this.autoCompactKeepRecentTurns=i.keepRecentTurns,this.autoArchiveEnabled=a.enabled,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=Ge.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(v(),this.selectedLanguage)}updateToolDisplayMode(e){this.toolDisplayMode!==e&&(this.toolDisplayMode=e,this.saved=!1,this.requestUpdate(),this.saveToolDisplayOptions())}updateShowContextUsage(e){this.showContextUsage=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()}updateAutoArchiveEnabled(e){this.autoArchiveEnabled=e,this.saved=!1,this.requestUpdate(),this.saveAutoArchiveOptions()}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)}selectedTerminalShellProfileId(){let e=this.terminalShellConfig.profiles;return e.some(e=>e.id===this.terminalShellConfig.defaultProfileId)?this.terminalShellConfig.defaultProfileId:e[0]?.id||F}updateTerminalShellSelection(e){if(e===F){this.customShellEditorOpen=!0,this.requestUpdate();return}this.customShellEditorOpen=!1,this.requestUpdate(),this.saveTerminalShellConfig(e)}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={id:Ye(),name:Xe(e),command:e,builtin:!1},n=[...this.customShellProfiles(),t];this.customShellCommand=``,this.customShellEditorOpen=!1,await this.saveTerminalShellConfig(t.id,n,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 we(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 De(v(),{toolDisplayMode:this.toolDisplayMode,showContextUsage:this.showContextUsage}),this.markSaved()}catch(e){this.error=e instanceof Error?e.message:D(`requestFailed`),this.requestUpdate()}}async saveAutoCompactOptions(){try{await ze(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()}}async saveAutoArchiveOptions(){try{if(await We(v(),{enabled:this.autoArchiveEnabled}),this.markSaved(D(`autoArchiveSaved`)),typeof BroadcastChannel<`u`)try{let e=new BroadcastChannel(`quickforge-sync`);e.postMessage({type:`settings-changed`,sourceTabId:`default-options-settings-tab`,timestamp:Date.now()}),e.close()}catch{}}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]}terminalShellSettings(){let e=this.terminalShellConfig.profiles,t=this.selectedTerminalShellProfileId(),n=e.find(e=>e.id===t),r=this.customShellEditorOpen||e.length===0;return g`
404
+ <section class="quickforge-settings-section" aria-label=${D(`terminalShell`)}>
405
405
  <div class="quickforge-settings-row">
406
406
  <div class="quickforge-settings-row-main">
407
407
  <div class="quickforge-settings-row-title">
408
- ${E(`terminalShellDefault`)}
409
- <quickforge-info-tip .label=${E(`terminalShellDescription`)}></quickforge-info-tip>
408
+ ${D(`terminalShellDefault`)}
409
+ <quickforge-info-tip .label=${D(`terminalShellDescription`)}></quickforge-info-tip>
410
410
  </div>
411
411
  <div class="quickforge-settings-row-description quickforge-settings-mono">
412
- ${n?.command||E(`terminalShellNoDetected`)}
412
+ ${n?.command||D(`terminalShellNoDetected`)}
413
413
  </div>
414
414
  </div>
415
415
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide">
416
416
  <select
417
417
  data-terminal-shell-select
418
418
  class="quickforge-settings-select"
419
- .value=${r?P:t}
420
- aria-label=${E(`terminalShellDefault`)}
419
+ .value=${r?F:t}
420
+ aria-label=${D(`terminalShellDefault`)}
421
421
  @change=${e=>this.updateTerminalShellSelection(e.target.value)}
422
422
  >
423
- ${e.map(e=>h`<option value=${e.id}>${e.name}</option>`)}
424
- <option value=${P}>${E(`terminalShellCustomOption`)}</option>
423
+ ${e.map(e=>g`<option value=${e.id}>${e.name}</option>`)}
424
+ <option value=${F}>${D(`terminalShellCustomOption`)}</option>
425
425
  </select>
426
- ${n&&!n.builtin&&!r?h`
426
+ ${n&&!n.builtin&&!r?g`
427
427
  <button
428
428
  class="quickforge-settings-icon-action quickforge-settings-icon-action-danger"
429
429
  type="button"
430
- title=${E(`delete`)}
431
- aria-label=${E(`delete`)}
430
+ title=${D(`delete`)}
431
+ aria-label=${D(`delete`)}
432
432
  @click=${()=>this.deleteCustomTerminalShell(n.id)}
433
433
  >
434
- ${qe}
434
+ ${Ze}
435
435
  </button>
436
436
  `:null}
437
437
  </div>
438
438
  </div>
439
439
 
440
- ${r?h`
440
+ ${r?g`
441
441
  <div class="quickforge-settings-row">
442
442
  <div class="quickforge-settings-row-main">
443
- <div class="quickforge-settings-row-title">${E(`terminalShellCommand`)}</div>
444
- <div class="quickforge-settings-row-description">${E(`terminalShellCustomDescription`)}</div>
443
+ <div class="quickforge-settings-row-title">${D(`terminalShellCommand`)}</div>
444
+ <div class="quickforge-settings-row-description">${D(`terminalShellCustomDescription`)}</div>
445
445
  </div>
446
446
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide quickforge-terminal-shell-command-control">
447
447
  <input
448
448
  class="quickforge-settings-input quickforge-settings-mono"
449
449
  type="text"
450
450
  .value=${this.customShellCommand}
451
- placeholder=${E(`terminalShellCommandPlaceholder`)}
451
+ placeholder=${D(`terminalShellCommandPlaceholder`)}
452
452
  @input=${e=>{this.customShellCommand=e.target.value}}
453
453
  />
454
454
  <button
455
455
  class="quickforge-settings-button quickforge-settings-button-primary"
456
456
  type="button"
457
- title=${E(`terminalShellAdd`)}
458
- aria-label=${E(`terminalShellAdd`)}
457
+ title=${D(`terminalShellAdd`)}
458
+ aria-label=${D(`terminalShellAdd`)}
459
459
  @click=${()=>this.addCustomTerminalShell()}
460
460
  >
461
- ${E(`terminalShellAdd`)}
461
+ ${D(`terminalShellAdd`)}
462
462
  </button>
463
463
  </div>
464
464
  </div>
465
465
  `:null}
466
466
  </section>
467
- `}renderToolDisplayModeOption(e){let t=this.toolDisplayMode===e.value;return h`
467
+ `}renderToolDisplayModeOption(e){let t=this.toolDisplayMode===e.value;return g`
468
468
  <button
469
469
  type="button"
470
470
  class="quickforge-settings-segmented-option ${t?`quickforge-settings-segmented-option-active`:``}"
@@ -473,7 +473,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{B as t,Ct as n,Et as r
473
473
  >
474
474
  ${e.label()}
475
475
  </button>
476
- `}renderSwitch(e,t,n=!1){return h`
476
+ `}renderSwitch(e,t,n=!1){return g`
477
477
  <label class="quickforge-settings-switch" aria-disabled=${n?`true`:`false`}>
478
478
  <input
479
479
  type="checkbox"
@@ -483,16 +483,16 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{B as t,Ct as n,Et as r
483
483
  />
484
484
  <span aria-hidden="true"></span>
485
485
  </label>
486
- `}render(){return this.loading?h`<div class="text-sm text-muted-foreground">${E(`loading`)}</div>`:h`
486
+ `}render(){return this.loading?g`<div class="text-sm text-muted-foreground">${D(`loading`)}</div>`:g`
487
487
  <div class="quickforge-settings-stack">
488
- <section class="quickforge-settings-section" aria-label=${E(`defaultOptions`)}>
488
+ <section class="quickforge-settings-section" aria-label=${D(`defaultOptions`)}>
489
489
  <div class="quickforge-settings-row">
490
490
  <div class="quickforge-settings-row-main">
491
491
  <div class="quickforge-settings-row-title">
492
- ${E(`language`)}
493
- <quickforge-info-tip .label=${E(`languageDescription`)}></quickforge-info-tip>
492
+ ${D(`language`)}
493
+ <quickforge-info-tip .label=${D(`languageDescription`)}></quickforge-info-tip>
494
494
  </div>
495
- <div class="quickforge-settings-row-description">${E(`displayLanguage`)}</div>
495
+ <div class="quickforge-settings-row-description">${D(`displayLanguage`)}</div>
496
496
  </div>
497
497
  <div class="quickforge-settings-row-control">
498
498
  <select
@@ -501,26 +501,26 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{B as t,Ct as n,Et as r
501
501
  .value=${this.selectedLanguage}
502
502
  @change=${e=>this.updateLanguage(e.target.value)}
503
503
  >
504
- <option value="zh">${E(`simplifiedChinese`)}</option>
505
- <option value="en">${E(`english`)}</option>
504
+ <option value="zh">${D(`simplifiedChinese`)}</option>
505
+ <option value="en">${D(`english`)}</option>
506
506
  </select>
507
507
  </div>
508
508
  </div>
509
509
 
510
510
  <div class="quickforge-settings-row">
511
511
  <div class="quickforge-settings-row-main">
512
- <div class="quickforge-settings-row-title">${E(`defaultModel`)}</div>
513
- <div class="quickforge-settings-row-description">${E(`defaultModelDescription`)}</div>
512
+ <div class="quickforge-settings-row-title">${D(`defaultModel`)}</div>
513
+ <div class="quickforge-settings-row-description">${D(`defaultModelDescription`)}</div>
514
514
  </div>
515
515
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide">
516
516
  <select
517
517
  data-default-model-select
518
518
  class="quickforge-settings-select"
519
- .value=${this.selectedModel?F(this.selectedModel):``}
519
+ .value=${this.selectedModel?I(this.selectedModel):``}
520
520
  @change=${e=>this.updateModel(e.target.value)}
521
521
  >
522
- ${this.modelOptions().length===0?h`<option value="">${E(`noModelAvailable`)}</option>`:this.modelOptions().map(e=>h`
523
- <option .value=${F(e)}>${We(e)}</option>
522
+ ${this.modelOptions().length===0?g`<option value="">${D(`noModelAvailable`)}</option>`:this.modelOptions().map(e=>g`
523
+ <option .value=${I(e)}>${Je(e)}</option>
524
524
  `)}
525
525
  </select>
526
526
  </div>
@@ -528,9 +528,9 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{B as t,Ct as n,Et as r
528
528
 
529
529
  <div class="quickforge-settings-row">
530
530
  <div class="quickforge-settings-row-main">
531
- <div class="quickforge-settings-row-title">${E(`defaultThinkingLevel`)}</div>
531
+ <div class="quickforge-settings-row-title">${D(`defaultThinkingLevel`)}</div>
532
532
  <div class="quickforge-settings-row-description">
533
- ${this.selectedModel?.reasoning?E(`defaultThinkingLevelDescription`):E(`thinkingRequiresReasoningModel`)}
533
+ ${this.selectedModel?.reasoning?D(`defaultThinkingLevelDescription`):D(`thinkingRequiresReasoningModel`)}
534
534
  </div>
535
535
  </div>
536
536
  <div class="quickforge-settings-row-control">
@@ -541,7 +541,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{B as t,Ct as n,Et as r
541
541
  ?disabled=${!this.selectedModel?.reasoning}
542
542
  @change=${e=>this.updateThinkingLevel(e.target.value)}
543
543
  >
544
- ${Ve.map(e=>h`
544
+ ${Ge.map(e=>g`
545
545
  <option .value=${e.value}>${e.label()}</option>
546
546
  `)}
547
547
  </select>
@@ -551,14 +551,14 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{B as t,Ct as n,Et as r
551
551
  <div class="quickforge-settings-row">
552
552
  <div class="quickforge-settings-row-main">
553
553
  <div class="quickforge-settings-row-title">
554
- ${E(`toolDisplay`)}
555
- <quickforge-info-tip .label=${E(`toolDisplayModeDescription`)}></quickforge-info-tip>
554
+ ${D(`toolDisplay`)}
555
+ <quickforge-info-tip .label=${D(`toolDisplayModeDescription`)}></quickforge-info-tip>
556
556
  </div>
557
- <div class="quickforge-settings-row-description">${E(`toolDisplayModeDescription`)}</div>
557
+ <div class="quickforge-settings-row-description">${D(`toolDisplayModeDescription`)}</div>
558
558
  </div>
559
559
  <div class="quickforge-settings-row-control">
560
- <div class="quickforge-settings-segmented" role="group" aria-label=${E(`toolDisplay`)}>
561
- ${He.map(e=>this.renderToolDisplayModeOption(e))}
560
+ <div class="quickforge-settings-segmented" role="group" aria-label=${D(`toolDisplay`)}>
561
+ ${Ke.map(e=>this.renderToolDisplayModeOption(e))}
562
562
  </div>
563
563
  </div>
564
564
  </div>
@@ -566,10 +566,10 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{B as t,Ct as n,Et as r
566
566
  <div class="quickforge-settings-row">
567
567
  <div class="quickforge-settings-row-main">
568
568
  <div class="quickforge-settings-row-title">
569
- ${E(`showContextUsage`)}
570
- <quickforge-info-tip .label=${E(`showContextUsageDescription`)}></quickforge-info-tip>
569
+ ${D(`showContextUsage`)}
570
+ <quickforge-info-tip .label=${D(`showContextUsageDescription`)}></quickforge-info-tip>
571
571
  </div>
572
- <div class="quickforge-settings-row-description">${E(`showContextUsageDescription`)}</div>
572
+ <div class="quickforge-settings-row-description">${D(`showContextUsageDescription`)}</div>
573
573
  </div>
574
574
  <div class="quickforge-settings-row-control">
575
575
  ${this.renderSwitch(this.showContextUsage,e=>this.updateShowContextUsage(e))}
@@ -579,10 +579,23 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{B as t,Ct as n,Et as r
579
579
  <div class="quickforge-settings-row">
580
580
  <div class="quickforge-settings-row-main">
581
581
  <div class="quickforge-settings-row-title">
582
- ${E(`autoCompactEnabled`)}
583
- <quickforge-info-tip .label=${E(`autoCompactDescription`)}></quickforge-info-tip>
582
+ ${D(`autoArchiveEnabled`)}
583
+ <quickforge-info-tip .label=${D(`autoArchiveDescription`)}></quickforge-info-tip>
584
584
  </div>
585
- <div class="quickforge-settings-row-description">${E(`autoCompactTriggerNote`)}</div>
585
+ <div class="quickforge-settings-row-description">${D(`autoArchiveTriggerNote`)}</div>
586
+ </div>
587
+ <div class="quickforge-settings-row-control">
588
+ ${this.renderSwitch(this.autoArchiveEnabled,e=>this.updateAutoArchiveEnabled(e))}
589
+ </div>
590
+ </div>
591
+
592
+ <div class="quickforge-settings-row">
593
+ <div class="quickforge-settings-row-main">
594
+ <div class="quickforge-settings-row-title">
595
+ ${D(`autoCompactEnabled`)}
596
+ <quickforge-info-tip .label=${D(`autoCompactDescription`)}></quickforge-info-tip>
597
+ </div>
598
+ <div class="quickforge-settings-row-description">${D(`autoCompactTriggerNote`)}</div>
586
599
  </div>
587
600
  <div class="quickforge-settings-row-control">
588
601
  ${this.renderSwitch(this.autoCompactEnabled,e=>this.updateAutoCompactEnabled(e))}
@@ -591,8 +604,8 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{B as t,Ct as n,Et as r
591
604
 
592
605
  <div class="quickforge-settings-row">
593
606
  <div class="quickforge-settings-row-main">
594
- <div class="quickforge-settings-row-title">${E(`autoCompactRequireConfirmation`)}</div>
595
- <div class="quickforge-settings-row-description">${E(`autoCompactRequireConfirmationDescription`)}</div>
607
+ <div class="quickforge-settings-row-title">${D(`autoCompactRequireConfirmation`)}</div>
608
+ <div class="quickforge-settings-row-description">${D(`autoCompactRequireConfirmationDescription`)}</div>
596
609
  </div>
597
610
  <div class="quickforge-settings-row-control">
598
611
  ${this.renderSwitch(this.autoCompactRequireConfirmation,e=>this.updateAutoCompactRequireConfirmation(e),!this.autoCompactEnabled)}
@@ -601,8 +614,8 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{B as t,Ct as n,Et as r
601
614
 
602
615
  <div class="quickforge-settings-row">
603
616
  <div class="quickforge-settings-row-main">
604
- <div class="quickforge-settings-row-title">${E(`autoCompactThresholdPercent`)}</div>
605
- <div class="quickforge-settings-row-description">${E(`autoCompactThresholdDescription`)}</div>
617
+ <div class="quickforge-settings-row-title">${D(`autoCompactThresholdPercent`)}</div>
618
+ <div class="quickforge-settings-row-description">${D(`autoCompactThresholdDescription`)}</div>
606
619
  </div>
607
620
  <div class="quickforge-settings-row-control">
608
621
  <input
@@ -623,10 +636,10 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{B as t,Ct as n,Et as r
623
636
  <div class="quickforge-settings-row">
624
637
  <div class="quickforge-settings-row-main">
625
638
  <div class="quickforge-settings-row-title">
626
- ${E(`autoCompactKeepRecentTurns`)}
627
- <quickforge-info-tip .label=${E(`autoCompactHistoryPreserved`)}></quickforge-info-tip>
639
+ ${D(`autoCompactKeepRecentTurns`)}
640
+ <quickforge-info-tip .label=${D(`autoCompactHistoryPreserved`)}></quickforge-info-tip>
628
641
  </div>
629
- <div class="quickforge-settings-row-description">${E(`autoCompactKeepRecentTurnsDescription`)}</div>
642
+ <div class="quickforge-settings-row-description">${D(`autoCompactKeepRecentTurnsDescription`)}</div>
630
643
  </div>
631
644
  <div class="quickforge-settings-row-control">
632
645
  <input
@@ -647,10 +660,10 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{B as t,Ct as n,Et as r
647
660
 
648
661
  ${this.terminalShellSettings()}
649
662
 
650
- ${this.saved?h`<div class="quickforge-settings-message">${this.savedMessage||E(`defaultOptionsSaved`)}</div>`:null}
651
- ${this.error?h`<div class="quickforge-settings-alert">${this.error}</div>`:null}
663
+ ${this.saved?g`<div class="quickforge-settings-message">${this.savedMessage||D(`defaultOptionsSaved`)}</div>`:null}
664
+ ${this.error?g`<div class="quickforge-settings-alert">${this.error}</div>`:null}
652
665
  </div>
653
- `}},I=`quickforge-default-options-settings-tab`;customElements.get(I)||customElements.define(I,Je);function Ye(){return document.createElement(I)}var Xe=`memory-settings`,Ze={enabled:!0};function Qe(e){return!e||typeof e!=`object`?{...Ze}:{enabled:e.enabled!==!1}}async function $e(e){return Qe(await e.settings.get(Xe))}async function et(e,t){await e.settings.set(Xe,Qe(t))}var tt=class extends g{enabled=!0;loading=!0;saving=!1;loadingDocument=!1;markdown=``;savedMarkdown=``;memoryPath=`~/.quickforge/MEMORY.md`;message=``;error=``;getTabName(){return E(`memory`)}async connectedCallback(){super.connectedCallback(),await this.loadSettings()}async loadSettings(){this.loading=!0,this.error=``,this.requestUpdate();try{let[e]=await Promise.all([$e(_()),this.loadDocument()]);this.enabled=e.enabled}catch(e){this.error=e instanceof Error?e.message:E(`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||E(`requestFailed`));this.markdown=n.markdown,this.savedMarkdown=n.markdown,this.memoryPath=n.path||this.memoryPath,e&&(this.message=E(`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 et(_(),{enabled:e}),this.message=E(e?`memoryEnabledSaved`:`memoryDisabledSaved`)}catch(e){this.enabled=t,this.error=e instanceof Error?e.message:E(`requestFailed`)}finally{this.saving=!1,this.requestUpdate()}}async reloadDocument(){try{await this.loadDocument(!0)}catch(e){this.error=e instanceof Error?e.message:E(`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||E(`requestFailed`));this.markdown=t.markdown,this.savedMarkdown=t.markdown,this.memoryPath=t.path||this.memoryPath,this.message=E(`memoryContentSaved`)}catch(e){this.error=e instanceof Error?e.message:E(`requestFailed`)}finally{this.saving=!1,this.requestUpdate()}}}renderSwitch(){return h`
666
+ `}},L=`quickforge-default-options-settings-tab`;customElements.get(L)||customElements.define(L,Qe);function $e(){return document.createElement(L)}var et=`memory-settings`,tt={enabled:!0};function nt(e){return!e||typeof e!=`object`?{...tt}:{enabled:e.enabled!==!1}}async function rt(e){return nt(await e.settings.get(et))}async function it(e,t){await e.settings.set(et,nt(t))}var at=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([rt(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 it(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`
654
667
  <label class="quickforge-settings-switch" aria-disabled=${this.saving?`true`:`false`}>
655
668
  <input
656
669
  type="checkbox"
@@ -660,24 +673,24 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{B as t,Ct as n,Et as r
660
673
  />
661
674
  <span aria-hidden="true"></span>
662
675
  </label>
663
- `}render(){if(this.loading)return h`<div class="text-sm text-muted-foreground">${E(`loading`)}</div>`;let e=this.markdown!==this.savedMarkdown,t=this.saving||this.loadingDocument;return h`
676
+ `}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`
664
677
  <div class="quickforge-settings-stack">
665
- <section class="quickforge-settings-section" aria-label=${E(`memory`)}>
678
+ <section class="quickforge-settings-section" aria-label=${D(`memory`)}>
666
679
  <div class="quickforge-settings-row">
667
680
  <div class="quickforge-settings-row-main">
668
681
  <div class="quickforge-settings-row-title">
669
- ${E(`globalMemory`)}
670
- <quickforge-info-tip .label=${E(`globalMemoryInfo`)}></quickforge-info-tip>
682
+ ${D(`globalMemory`)}
683
+ <quickforge-info-tip .label=${D(`globalMemoryInfo`)}></quickforge-info-tip>
671
684
  </div>
672
- <div class="quickforge-settings-row-description">${E(`globalMemoryDescription`)}</div>
685
+ <div class="quickforge-settings-row-description">${D(`globalMemoryDescription`)}</div>
673
686
  </div>
674
687
  <div class="quickforge-settings-row-control">${this.renderSwitch()}</div>
675
688
  </div>
676
689
 
677
690
  <div class="quickforge-settings-row">
678
691
  <div class="quickforge-settings-row-main">
679
- <div class="quickforge-settings-row-title">${E(`memoryFile`)}</div>
680
- <div class="quickforge-settings-row-description">${E(`memoryFileDescription`)}</div>
692
+ <div class="quickforge-settings-row-title">${D(`memoryFile`)}</div>
693
+ <div class="quickforge-settings-row-description">${D(`memoryFileDescription`)}</div>
681
694
  </div>
682
695
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide">
683
696
  <code class="text-xs text-muted-foreground">${this.memoryPath}</code>
@@ -686,8 +699,8 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{B as t,Ct as n,Et as r
686
699
 
687
700
  <div class="quickforge-settings-row quickforge-settings-row-align-start quickforge-memory-content-row">
688
701
  <div class="quickforge-settings-row-main">
689
- <div class="quickforge-settings-row-title">${E(`memoryContent`)}</div>
690
- <div class="quickforge-settings-row-description">${this.enabled?E(`memoryContentDescription`):E(`memoryContentDisabledDescription`)}</div>
702
+ <div class="quickforge-settings-row-title">${D(`memoryContent`)}</div>
703
+ <div class="quickforge-settings-row-description">${this.enabled?D(`memoryContentDescription`):D(`memoryContentDisabledDescription`)}</div>
691
704
  </div>
692
705
  <div class="quickforge-memory-editor-control">
693
706
  <textarea
@@ -703,24 +716,24 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{B as t,Ct as n,Et as r
703
716
  type="button"
704
717
  ?disabled=${t}
705
718
  @click=${()=>void this.reloadDocument()}
706
- >${this.loadingDocument?E(`loading`):E(`memoryReload`)}</button>
719
+ >${this.loadingDocument?D(`loading`):D(`memoryReload`)}</button>
707
720
  <button
708
721
  class="quickforge-settings-button quickforge-settings-button-primary"
709
722
  type="button"
710
723
  ?disabled=${!this.enabled||t||!e}
711
724
  @click=${()=>void this.saveDocument()}
712
- >${this.saving?E(`saving`):E(`memorySave`)}</button>
725
+ >${this.saving?D(`saving`):D(`memorySave`)}</button>
713
726
  </div>
714
727
  </div>
715
728
  </div>
716
729
 
717
- <div class="quickforge-settings-note">${E(`memoryCurrentSessionNote`)}</div>
730
+ <div class="quickforge-settings-note">${D(`memoryCurrentSessionNote`)}</div>
718
731
  </section>
719
732
 
720
- ${this.message?h`<div class="quickforge-settings-message">${this.message}</div>`:null}
721
- ${this.error?h`<div class="quickforge-settings-alert">${this.error}</div>`:null}
733
+ ${this.message?g`<div class="quickforge-settings-message">${this.message}</div>`:null}
734
+ ${this.error?g`<div class="quickforge-settings-alert">${this.error}</div>`:null}
722
735
  </div>
723
- `}},L=`quickforge-memory-settings-tab`;customElements.get(L)||customElements.define(L,tt);function nt(){return document.createElement(L)}var rt=`quickforge-backup`,R=[{id:`settings`,countKey:`settings`,label:()=>E(`restoreSettings`),description:()=>E(`restoreSettingsDescription`)},{id:`mcp`,countKey:`mcp`,label:()=>E(`restoreMcp`),description:()=>E(`restoreMcpDescription`)},{id:`providerKeys`,countKey:`providerKeys`,label:()=>E(`restoreProviderKeys`),description:()=>E(`restoreProviderKeysDescription`)},{id:`customProviders`,countKey:`customProviders`,label:()=>E(`restoreCustomProviders`),description:()=>E(`restoreCustomProvidersDescription`)},{id:`projects`,countKey:`projects`,label:()=>E(`restoreProjects`),description:()=>E(`restoreProjectsDescription`)},{id:`scheduledTasks`,countKey:`scheduledTasks`,label:()=>E(`restoreScheduledTasks`),description:()=>E(`restoreScheduledTasksDescription`)}],it=R;function at(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 ot(){return new Date().toISOString().replace(/[:.]/g,`-`)}function st(e){return e?Object.entries(e).map(([e,t])=>`${e}: ${t}`).join(`, `):``}function ct(e){return it.filter(t=>(e.sections?.[t.countKey]??0)>0)}function lt(e){return ct(e).map(e=>e.id)}function ut(e){return e instanceof RangeError||e instanceof Error&&e.message.includes(`Invalid string length`)}function z(e,t){return ut(e)?E(`backupStringTooLarge`):e instanceof Error?e.message:t}var dt=class extends g{exportSections=new Set(R.map(e=>e.id));busy=!1;message=``;error=``;safetyBackupPath=``;pendingImport=null;getTabName(){return E(`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=E(`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||E(`backupExportFailed`));at(`${rt}-settings-${ot()}.json`,n),this.message=E(`backupExported`)}catch(e){this.error=z(e,E(`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||E(`backupInspectFailed`));if(!n)throw Error(E(`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(lt(t));this.pendingImport={backup:null,importToken:t.importToken,inspect:t,selectedSections:n,mode:`replace`},this.message=t.ignoredConversations?E(`backupInspectedWithIgnoredConversations`):E(`backupInspected`)}catch(e){this.error=z(e,E(`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=E(`selectAtLeastOneRestoreSection`),this.requestUpdate();return}if(await S({description:this.pendingImport.mode===`replace`?E(`backupImportReplaceConfirm`):E(`backupImportMergeConfirm`),confirmLabel:E(`confirmImportSelected`),cancelLabel:E(`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||E(`backupImportFailed`));let r=st(n?.summary);this.safetyBackupPath=n?.safetyBackupPath||``,this.pendingImport=null,this.message=r?`${E(`backupImported`)} ${r}`:E(`backupImported`),window.setTimeout(()=>window.location.reload(),1500)}catch(e){this.error=z(e,E(`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 h`
736
+ `}},R=`quickforge-memory-settings-tab`;customElements.get(R)||customElements.define(R,at);function ot(){return document.createElement(R)}var st=`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`)}],ct=z;function lt(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 ut(){return new Date().toISOString().replace(/[:.]/g,`-`)}function dt(e){return e?Object.entries(e).map(([e,t])=>`${e}: ${t}`).join(`, `):``}function ft(e){return ct.filter(t=>(e.sections?.[t.countKey]??0)>0)}function pt(e){return ft(e).map(e=>e.id)}function mt(e){return e instanceof RangeError||e instanceof Error&&e.message.includes(`Invalid string length`)}function B(e,t){return mt(e)?D(`backupStringTooLarge`):e instanceof Error?e.message:t}var ht=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`));lt(`${st}-settings-${ut()}.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(pt(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 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=dt(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`
724
737
  <label class="quickforge-settings-switch" aria-disabled=${n?`true`:`false`}>
725
738
  <input
726
739
  type="checkbox"
@@ -730,69 +743,69 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{B as t,Ct as n,Et as r
730
743
  />
731
744
  <span aria-hidden="true"></span>
732
745
  </label>
733
- `}renderPendingImport(){if(!this.pendingImport)return null;let{inspect:e,selectedSections:t}=this.pendingImport,n=ct(e);return h`
734
- <section class="quickforge-settings-section" aria-label=${E(`backupInspectTitle`)}>
746
+ `}renderPendingImport(){if(!this.pendingImport)return null;let{inspect:e,selectedSections:t}=this.pendingImport,n=ft(e);return g`
747
+ <section class="quickforge-settings-section" aria-label=${D(`backupInspectTitle`)}>
735
748
  <div class="quickforge-settings-row quickforge-settings-row-top">
736
749
  <div class="quickforge-settings-row-main">
737
- <div class="quickforge-settings-row-title">${E(`backupInspectTitle`)}</div>
738
- <div class="quickforge-settings-row-description">${E(`backupInspectDescription`)}</div>
750
+ <div class="quickforge-settings-row-title">${D(`backupInspectTitle`)}</div>
751
+ <div class="quickforge-settings-row-description">${D(`backupInspectDescription`)}</div>
739
752
  </div>
740
753
  </div>
741
754
 
742
755
  <div class="quickforge-settings-nested-list">
743
756
  <div class="quickforge-settings-subrow">
744
757
  <div class="quickforge-settings-row-main">
745
- <div class="quickforge-settings-row-title">${E(`backupInspectExportedAt`)}</div>
758
+ <div class="quickforge-settings-row-title">${D(`backupInspectExportedAt`)}</div>
746
759
  </div>
747
760
  <div class="quickforge-settings-row-control quickforge-settings-readonly-value">${e.exportedAt||`-`}</div>
748
761
  </div>
749
762
  <div class="quickforge-settings-subrow">
750
763
  <div class="quickforge-settings-row-main">
751
- <div class="quickforge-settings-row-title">${E(`backupInspectVersion`)}</div>
764
+ <div class="quickforge-settings-row-title">${D(`backupInspectVersion`)}</div>
752
765
  </div>
753
766
  <div class="quickforge-settings-row-control quickforge-settings-readonly-value">${e.version??`-`}</div>
754
767
  </div>
755
768
  <div class="quickforge-settings-subrow">
756
769
  <div class="quickforge-settings-row-main">
757
- <div class="quickforge-settings-row-title">${E(`backupInspectScope`)}</div>
770
+ <div class="quickforge-settings-row-title">${D(`backupInspectScope`)}</div>
758
771
  </div>
759
772
  <div class="quickforge-settings-row-control quickforge-settings-readonly-value">${e.scope||`-`}</div>
760
773
  </div>
761
774
  <div class="quickforge-settings-subrow">
762
775
  <div class="quickforge-settings-row-main">
763
- <div class="quickforge-settings-row-title">${E(`backupInspectSecrets`)}</div>
776
+ <div class="quickforge-settings-row-title">${D(`backupInspectSecrets`)}</div>
764
777
  </div>
765
- <div class="quickforge-settings-row-control quickforge-settings-readonly-value">${e.includeSecrets?E(`yes`):E(`no`)}</div>
778
+ <div class="quickforge-settings-row-control quickforge-settings-readonly-value">${e.includeSecrets?D(`yes`):D(`no`)}</div>
766
779
  </div>
767
780
  </div>
768
781
 
769
- ${e.warnings?.length?h`
782
+ ${e.warnings?.length?g`
770
783
  <div class="quickforge-settings-warning quickforge-settings-warning-attached">
771
- ${e.warnings.map(e=>h`<div>⚠ ${e}</div>`)}
784
+ ${e.warnings.map(e=>g`<div>⚠ ${e}</div>`)}
772
785
  </div>
773
786
  `:null}
774
787
 
775
- ${e.invalidSections&&Object.keys(e.invalidSections).length?h`
788
+ ${e.invalidSections&&Object.keys(e.invalidSections).length?g`
776
789
  <div class="quickforge-settings-warning quickforge-settings-warning-attached">
777
- <div>${E(`backupInvalidSections`)}</div>
778
- ${Object.entries(e.invalidSections).map(([e,t])=>h`<div>${e}: ${t}</div>`)}
790
+ <div>${D(`backupInvalidSections`)}</div>
791
+ ${Object.entries(e.invalidSections).map(([e,t])=>g`<div>${e}: ${t}</div>`)}
779
792
  </div>
780
793
  `:null}
781
794
 
782
795
  <div class="quickforge-settings-row">
783
796
  <div class="quickforge-settings-row-main">
784
- <div class="quickforge-settings-row-title">${E(`restoreMode`)}</div>
785
- <div class="quickforge-settings-row-description">${E(`restoreModeDescription`)}</div>
797
+ <div class="quickforge-settings-row-title">${D(`restoreMode`)}</div>
798
+ <div class="quickforge-settings-row-description">${D(`restoreModeDescription`)}</div>
786
799
  </div>
787
800
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide">
788
- <div class="quickforge-settings-segmented" role="group" aria-label=${E(`restoreMode`)}>
801
+ <div class="quickforge-settings-segmented" role="group" aria-label=${D(`restoreMode`)}>
789
802
  <button
790
803
  type="button"
791
804
  class="quickforge-settings-segmented-option ${this.pendingImport.mode===`replace`?`quickforge-settings-segmented-option-active`:``}"
792
805
  ?disabled=${this.busy}
793
806
  @click=${()=>this.setRestoreMode(`replace`)}
794
807
  >
795
- ${E(`restoreModeReplace`)}
808
+ ${D(`restoreModeReplace`)}
796
809
  </button>
797
810
  <button
798
811
  type="button"
@@ -800,7 +813,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{B as t,Ct as n,Et as r
800
813
  ?disabled=${this.busy}
801
814
  @click=${()=>this.setRestoreMode(`merge`)}
802
815
  >
803
- ${E(`restoreModeMerge`)}
816
+ ${D(`restoreModeMerge`)}
804
817
  </button>
805
818
  </div>
806
819
  </div>
@@ -808,14 +821,14 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{B as t,Ct as n,Et as r
808
821
 
809
822
  <div class="quickforge-settings-row quickforge-settings-row-top">
810
823
  <div class="quickforge-settings-row-main">
811
- <div class="quickforge-settings-row-title">${E(`selectRestoreSections`)}</div>
824
+ <div class="quickforge-settings-row-title">${D(`selectRestoreSections`)}</div>
812
825
  <div class="quickforge-settings-row-description">
813
- ${this.pendingImport.mode===`replace`?E(`restoreModeReplaceDescription`):E(`restoreModeMergeDescription`)}
826
+ ${this.pendingImport.mode===`replace`?D(`restoreModeReplaceDescription`):D(`restoreModeMergeDescription`)}
814
827
  </div>
815
828
  </div>
816
829
  </div>
817
830
  <div class="quickforge-settings-nested-list">
818
- ${n.map(n=>h`
831
+ ${n.map(n=>g`
819
832
  <div class="quickforge-settings-subrow">
820
833
  <div class="quickforge-settings-row-main">
821
834
  <div class="quickforge-settings-row-title">${n.label()} (${e.sections?.[n.countKey]??0})</div>
@@ -830,8 +843,8 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{B as t,Ct as n,Et as r
830
843
 
831
844
  <div class="quickforge-settings-row">
832
845
  <div class="quickforge-settings-row-main">
833
- <div class="quickforge-settings-row-title">${E(`backupImportActions`)}</div>
834
- <div class="quickforge-settings-row-description">${E(`backupImportActionsDescription`)}</div>
846
+ <div class="quickforge-settings-row-title">${D(`backupImportActions`)}</div>
847
+ <div class="quickforge-settings-row-description">${D(`backupImportActionsDescription`)}</div>
835
848
  </div>
836
849
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide">
837
850
  <button
@@ -840,7 +853,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{B as t,Ct as n,Et as r
840
853
  ?disabled=${this.busy||t.size===0}
841
854
  @click=${()=>this.confirmPendingImport()}
842
855
  >
843
- ${this.busy?E(`loading`):E(`confirmImportSelected`)}
856
+ ${this.busy?D(`loading`):D(`confirmImportSelected`)}
844
857
  </button>
845
858
  <button
846
859
  class="quickforge-settings-button quickforge-settings-button-secondary"
@@ -848,26 +861,26 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{B as t,Ct as n,Et as r
848
861
  ?disabled=${this.busy}
849
862
  @click=${()=>this.cancelPendingImport()}
850
863
  >
851
- ${E(`cancel`)}
864
+ ${D(`cancel`)}
852
865
  </button>
853
866
  </div>
854
867
  </div>
855
868
  </section>
856
- `}render(){return h`
869
+ `}render(){return g`
857
870
  <div class="quickforge-settings-stack">
858
- <section class="quickforge-settings-section" aria-label=${E(`exportData`)}>
871
+ <section class="quickforge-settings-section" aria-label=${D(`exportData`)}>
859
872
  <div class="quickforge-settings-row quickforge-settings-row-top">
860
873
  <div class="quickforge-settings-row-main">
861
874
  <div class="quickforge-settings-row-title">
862
- ${E(`selectExportSections`)}
863
- <quickforge-info-tip .label=${E(`exportDataDescription`)}></quickforge-info-tip>
875
+ ${D(`selectExportSections`)}
876
+ <quickforge-info-tip .label=${D(`exportDataDescription`)}></quickforge-info-tip>
864
877
  </div>
865
- <div class="quickforge-settings-row-description">${E(`selectExportSectionsDescription`)}</div>
878
+ <div class="quickforge-settings-row-description">${D(`selectExportSectionsDescription`)}</div>
866
879
  </div>
867
880
  </div>
868
881
 
869
882
  <div class="quickforge-settings-nested-list">
870
- ${R.map(e=>h`
883
+ ${z.map(e=>g`
871
884
  <div class="quickforge-settings-subrow">
872
885
  <div class="quickforge-settings-row-main">
873
886
  <div class="quickforge-settings-row-title">${e.label()}</div>
@@ -880,12 +893,12 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{B as t,Ct as n,Et as r
880
893
  `)}
881
894
  </div>
882
895
 
883
- <div class="quickforge-settings-note">${E(`conversationBackupExcluded`)}</div>
896
+ <div class="quickforge-settings-note">${D(`conversationBackupExcluded`)}</div>
884
897
 
885
898
  <div class="quickforge-settings-row">
886
899
  <div class="quickforge-settings-row-main">
887
- <div class="quickforge-settings-row-title">${E(`exportBackup`)}</div>
888
- <div class="quickforge-settings-row-description">${E(`exportBackupDescription`)}</div>
900
+ <div class="quickforge-settings-row-title">${D(`exportBackup`)}</div>
901
+ <div class="quickforge-settings-row-description">${D(`exportBackupDescription`)}</div>
889
902
  </div>
890
903
  <div class="quickforge-settings-row-control">
891
904
  <button
@@ -894,20 +907,20 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{B as t,Ct as n,Et as r
894
907
  ?disabled=${this.busy||this.exportSections.size===0}
895
908
  @click=${()=>this.exportBackup()}
896
909
  >
897
- ${this.busy?E(`loading`):E(`exportBackup`)}
910
+ ${this.busy?D(`loading`):D(`exportBackup`)}
898
911
  </button>
899
912
  </div>
900
913
  </div>
901
914
  </section>
902
915
 
903
- <section class="quickforge-settings-section" aria-label=${E(`importData`)}>
916
+ <section class="quickforge-settings-section" aria-label=${D(`importData`)}>
904
917
  <div class="quickforge-settings-row">
905
918
  <div class="quickforge-settings-row-main">
906
919
  <div class="quickforge-settings-row-title">
907
- ${E(`importBackup`)}
908
- <quickforge-info-tip .label=${E(`importDataDescription`)}></quickforge-info-tip>
920
+ ${D(`importBackup`)}
921
+ <quickforge-info-tip .label=${D(`importDataDescription`)}></quickforge-info-tip>
909
922
  </div>
910
- <div class="quickforge-settings-row-description">${E(`importDataDescription`)}</div>
923
+ <div class="quickforge-settings-row-description">${D(`importDataDescription`)}</div>
911
924
  </div>
912
925
  <div class="quickforge-settings-row-control">
913
926
  <label class="quickforge-settings-button quickforge-settings-button-secondary ${this.busy?`pointer-events-none opacity-60`:``}">
@@ -918,24 +931,24 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{B as t,Ct as n,Et as r
918
931
  ?disabled=${this.busy}
919
932
  @change=${e=>this.handleFileChange(e)}
920
933
  />
921
- ${E(`importBackup`)}
934
+ ${D(`importBackup`)}
922
935
  </label>
923
936
  </div>
924
937
  </div>
925
938
  </section>
926
939
 
927
940
  ${this.renderPendingImport()}
928
- ${this.message?h`<div class="quickforge-settings-message">${this.message}</div>`:null}
929
- ${this.safetyBackupPath?h`<div class="quickforge-settings-note">${E(`backupSafetyBackupPath`)}: <code>${this.safetyBackupPath}</code></div>`:null}
930
- ${this.error?h`<div class="quickforge-settings-alert">${this.error}</div>`:null}
941
+ ${this.message?g`<div class="quickforge-settings-message">${this.message}</div>`:null}
942
+ ${this.safetyBackupPath?g`<div class="quickforge-settings-note">${D(`backupSafetyBackupPath`)}: <code>${this.safetyBackupPath}</code></div>`:null}
943
+ ${this.error?g`<div class="quickforge-settings-alert">${this.error}</div>`:null}
931
944
  </div>
932
- `}},B=`quickforge-backup-settings-tab`;customElements.get(B)||customElements.define(B,dt);function ft(){return document.createElement(B)}function pt(e){if(!e)return`-`;let t=new Date(e);return Number.isNaN(t.getTime())?e:t.toLocaleString(we())}function mt(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 ht=class extends g{sessions=[];projects=[];loading=!0;busySessionId=``;query=``;projectFilter=`all`;message=``;error=``;getTabName(){return E(`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||E(`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:E(`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`${w(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`?E(`normalChat`):this.projectNameById.get(e)||E(`unknownProject`)}async restoreSession(e){if(!this.busySessionId){this.busySessionId=e,this.message=``,this.error=``,this.requestUpdate();try{let t=_(),n=await t.sessions.get(e),r=await t.sessions.getMetadata(e);if(!n||!r)throw Error(E(`sessionNotFound`));await t.sessions.save(mt(n),mt(r)),this.sessions=this.sessions.filter(t=>t.id!==e),this.message=E(`sessionRestored`),V()}catch(e){this.error=e instanceof Error?e.message:E(`restoreSessionFailed`)}finally{this.busySessionId=``,this.requestUpdate()}}}async deleteSession(e){if(!this.busySessionId&&await S({description:E(`deleteArchivedSessionConfirm`,{title:w(e.title)}),confirmLabel:E(`confirmDelete`),cancelLabel:E(`cancel`),variant:`destructive`})){this.busySessionId=e.id,this.message=``,this.error=``,this.requestUpdate();try{await _().sessions.delete(e.id),this.sessions=this.sessions.filter(t=>t.id!==e.id),this.message=E(`archivedSessionDeleted`),V()}catch(e){this.error=e instanceof Error?e.message:E(`deleteSessionFailed`)}finally{this.busySessionId=``,this.requestUpdate()}}}async deleteAllArchivedSessions(){if(!(this.busySessionId||this.sessions.length===0)&&await S({description:E(`deleteAllArchivedSessionsConfirm`),confirmLabel:E(`confirmDelete`),cancelLabel:E(`cancel`),variant:`destructive`})){this.busySessionId=`__all__`,this.message=``,this.error=``,this.requestUpdate();try{let e=_();await Promise.all(this.sessions.map(t=>e.sessions.delete(t.id))),this.sessions=[],this.message=E(`archivedSessionsDeleted`),V()}catch(e){this.error=e instanceof Error?e.message:E(`deleteSessionFailed`)}finally{this.busySessionId=``,this.requestUpdate()}}}renderSession(e){let t=this.busySessionId===e.id||this.busySessionId===`__all__`;return h`
945
+ `}},V=`quickforge-backup-settings-tab`;customElements.get(V)||customElements.define(V,ht);function gt(){return document.createElement(V)}function _t(e){if(!e)return`-`;let t=new Date(e);return Number.isNaN(t.getTime())?e:t.toLocaleString(Ce())}function vt(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 yt=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(vt(n),vt(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 C({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 C({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`
933
946
  <div class="border-t border-border px-4 py-3 first:border-t-0">
934
947
  <div class="flex items-start justify-between gap-3">
935
948
  <div class="min-w-0">
936
- <div class="truncate text-sm font-medium text-foreground">${w(e.title)}</div>
949
+ <div class="truncate text-sm font-medium text-foreground">${T(e.title)}</div>
937
950
  <div class="mt-1 text-xs text-muted-foreground">
938
- ${E(`lastModified`)}: ${pt(e.lastModified)} · ${E(`archivedAt`)}: ${pt(e.archivedAt)}
951
+ ${D(`lastModified`)}: ${_t(e.lastModified)} · ${D(`archivedAt`)}: ${_t(e.archivedAt)}
939
952
  </div>
940
953
  </div>
941
954
  <div class="flex shrink-0 items-center gap-2">
@@ -945,7 +958,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{B as t,Ct as n,Et as r
945
958
  ?disabled=${t}
946
959
  @click=${()=>this.restoreSession(e.id)}
947
960
  >
948
- ${E(`restoreSession`)}
961
+ ${D(`restoreSession`)}
949
962
  </button>
950
963
  <button
951
964
  class="rounded-md px-2.5 py-1 text-xs text-destructive hover:bg-destructive/10 disabled:opacity-60"
@@ -953,12 +966,12 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{B as t,Ct as n,Et as r
953
966
  ?disabled=${t}
954
967
  @click=${()=>this.deleteSession(e)}
955
968
  >
956
- ${E(`deletePermanently`)}
969
+ ${D(`deletePermanently`)}
957
970
  </button>
958
971
  </div>
959
972
  </div>
960
973
  </div>
961
- `}render(){let e=this.groupedSessions();return h`
974
+ `}render(){let e=this.groupedSessions();return g`
962
975
  <div class="flex flex-col gap-4">
963
976
  <div class="flex justify-end">
964
977
  <button
@@ -967,7 +980,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{B as t,Ct as n,Et as r
967
980
  ?disabled=${!!this.busySessionId||this.sessions.length===0}
968
981
  @click=${()=>this.deleteAllArchivedSessions()}
969
982
  >
970
- ${E(`deleteAll`)}
983
+ ${D(`deleteAll`)}
971
984
  </button>
972
985
  </div>
973
986
 
@@ -977,7 +990,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{B as t,Ct as n,Et as r
977
990
  class="rounded-md border border-input bg-background px-3 py-2 text-sm outline-none focus:ring-2 focus:ring-ring/30"
978
991
  type="search"
979
992
  .value=${this.query}
980
- placeholder=${E(`searchArchivedConversations`)}
993
+ placeholder=${D(`searchArchivedConversations`)}
981
994
  @input=${e=>{this.query=e.target.value,this.requestUpdate()}}
982
995
  />
983
996
  <select
@@ -985,23 +998,23 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{B as t,Ct as n,Et as r
985
998
  .value=${this.projectFilter}
986
999
  @change=${e=>{this.projectFilter=e.target.value,this.requestUpdate()}}
987
1000
  >
988
- <option value="all">${E(`allProjects`)}</option>
989
- <option value="global">${E(`normalChat`)}</option>
990
- ${this.projects.map(e=>h`<option value=${e.id}>${e.name}</option>`)}
1001
+ <option value="all">${D(`allProjects`)}</option>
1002
+ <option value="global">${D(`normalChat`)}</option>
1003
+ ${this.projects.map(e=>g`<option value=${e.id}>${e.name}</option>`)}
991
1004
  </select>
992
1005
  </div>
993
1006
 
994
- ${this.loading?h`
995
- <div class="px-4 py-8 text-center text-sm text-muted-foreground">${E(`loading`)}</div>
996
- `:e.length===0?h`
997
- <div class="px-4 py-8 text-center text-sm text-muted-foreground">${E(`noArchivedConversations`)}</div>
998
- `:h`
1007
+ ${this.loading?g`
1008
+ <div class="px-4 py-8 text-center text-sm text-muted-foreground">${D(`loading`)}</div>
1009
+ `:e.length===0?g`
1010
+ <div class="px-4 py-8 text-center text-sm text-muted-foreground">${D(`noArchivedConversations`)}</div>
1011
+ `:g`
999
1012
  <div>
1000
- ${e.map(([e,t])=>h`
1013
+ ${e.map(([e,t])=>g`
1001
1014
  <div class="border-b border-border last:border-b-0">
1002
1015
  <div class="flex items-center justify-between gap-3 bg-muted/20 px-4 py-2 text-sm text-muted-foreground">
1003
1016
  <div class="truncate">${this.projectLabel(e)}</div>
1004
- <div class="shrink-0">${E(`conversationCount`,{count:t.length})}</div>
1017
+ <div class="shrink-0">${D(`conversationCount`,{count:t.length})}</div>
1005
1018
  </div>
1006
1019
  ${t.map(e=>this.renderSession(e))}
1007
1020
  </div>
@@ -1010,10 +1023,10 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{B as t,Ct as n,Et as r
1010
1023
  `}
1011
1024
  </section>
1012
1025
 
1013
- ${this.message?h`<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}
1014
- ${this.error?h`<div class="rounded-md border border-destructive/30 bg-destructive/10 px-3 py-2 text-sm text-destructive">${this.error}</div>`:null}
1026
+ ${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}
1027
+ ${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}
1015
1028
  </div>
1016
- `}},H=`quickforge-archived-conversations-settings-tab`;customElements.get(H)||customElements.define(H,ht);function gt(){return document.createElement(H)}function _t(){return Array.from({length:16},()=>`ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz23456789!@#$%^&*`[Math.floor(Math.random()*65)]).join(``)}var vt=class extends g{loading=!0;saving=!1;enabled=!1;hasPassword=!1;password=``;sessionTtlHours=12;activeTokenCount=0;lanUrls=[];error=``;message=``;getTabName(){return E(`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||E(`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:E(`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=E(`lanAccessPasswordRequired`),this.requestUpdate();return}if(this.password.trim()&&this.password.trim().length<8){this.error=E(`lanAccessPasswordTooShort`),this.requestUpdate();return}if(!(this.enabled&&!await S({description:E(`lanAccessEnableConfirm`),confirmLabel:E(`enabled`),cancelLabel:E(`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=E(`lanAccessSaved`)}catch(e){this.error=e instanceof Error?e.message:E(`requestFailed`)}finally{this.saving=!1,this.requestUpdate()}}}}async revokeAll(){if(await S({description:E(`lanAccessRevokeAllConfirm`),confirmLabel:E(`lanAccessRevokeAll`),cancelLabel:E(`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=E(`lanAccessRevoked`)}catch(e){this.error=e instanceof Error?e.message:E(`requestFailed`)}finally{this.saving=!1,this.requestUpdate()}}}renderSwitch(e,t,n=!1){return h`
1029
+ `}},U=`quickforge-archived-conversations-settings-tab`;customElements.get(U)||customElements.define(U,yt);function bt(){return document.createElement(U)}function xt(){return Array.from({length:16},()=>`ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz23456789!@#$%^&*`[Math.floor(Math.random()*65)]).join(``)}var St=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 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 g`
1017
1030
  <label class="quickforge-settings-switch" aria-disabled=${n?`true`:`false`}>
1018
1031
  <input
1019
1032
  type="checkbox"
@@ -1023,48 +1036,48 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{B as t,Ct as n,Et as r
1023
1036
  />
1024
1037
  <span aria-hidden="true"></span>
1025
1038
  </label>
1026
- `}render(){return this.loading?h`<div class="text-sm text-muted-foreground">${E(`loading`)}</div>`:h`
1039
+ `}render(){return this.loading?g`<div class="text-sm text-muted-foreground">${D(`loading`)}</div>`:g`
1027
1040
  <div class="quickforge-settings-stack">
1028
- <div class="quickforge-settings-warning">${E(`lanAccessRiskWarning`)}</div>
1041
+ <div class="quickforge-settings-warning">${D(`lanAccessRiskWarning`)}</div>
1029
1042
 
1030
- <section class="quickforge-settings-section" aria-label=${E(`lanAccessStatus`)}>
1043
+ <section class="quickforge-settings-section" aria-label=${D(`lanAccessStatus`)}>
1031
1044
  <div class="quickforge-settings-row">
1032
1045
  <div class="quickforge-settings-row-main">
1033
- <div class="quickforge-settings-row-title">${E(`lanAccessEnabled`)}</div>
1034
- <div class="quickforge-settings-row-description">${E(`lanAccessEnabledDescription`)}</div>
1046
+ <div class="quickforge-settings-row-title">${D(`lanAccessEnabled`)}</div>
1047
+ <div class="quickforge-settings-row-description">${D(`lanAccessEnabledDescription`)}</div>
1035
1048
  </div>
1036
- <div class="quickforge-settings-row-control quickforge-settings-readonly-value">${this.enabled?E(`enabled`):E(`disabled`)}</div>
1049
+ <div class="quickforge-settings-row-control quickforge-settings-readonly-value">${this.enabled?D(`enabled`):D(`disabled`)}</div>
1037
1050
  </div>
1038
1051
  <div class="quickforge-settings-row">
1039
1052
  <div class="quickforge-settings-row-main">
1040
- <div class="quickforge-settings-row-title">${E(`lanAccessPassword`)}</div>
1041
- <div class="quickforge-settings-row-description">${E(`lanAccessPasswordStatusDescription`)}</div>
1053
+ <div class="quickforge-settings-row-title">${D(`lanAccessPassword`)}</div>
1054
+ <div class="quickforge-settings-row-description">${D(`lanAccessPasswordStatusDescription`)}</div>
1042
1055
  </div>
1043
- <div class="quickforge-settings-row-control quickforge-settings-readonly-value">${this.hasPassword?E(`configured`):E(`notConfigured`)}</div>
1056
+ <div class="quickforge-settings-row-control quickforge-settings-readonly-value">${this.hasPassword?D(`configured`):D(`notConfigured`)}</div>
1044
1057
  </div>
1045
1058
  <div class="quickforge-settings-row">
1046
1059
  <div class="quickforge-settings-row-main">
1047
- <div class="quickforge-settings-row-title">${E(`lanAccessActiveDevices`)}</div>
1048
- <div class="quickforge-settings-row-description">${E(`lanAccessActiveDevicesDescription`)}</div>
1060
+ <div class="quickforge-settings-row-title">${D(`lanAccessActiveDevices`)}</div>
1061
+ <div class="quickforge-settings-row-description">${D(`lanAccessActiveDevicesDescription`)}</div>
1049
1062
  </div>
1050
1063
  <div class="quickforge-settings-row-control quickforge-settings-readonly-value">${this.activeTokenCount}</div>
1051
1064
  </div>
1052
1065
  <div class="quickforge-settings-row">
1053
1066
  <div class="quickforge-settings-row-main">
1054
- <div class="quickforge-settings-row-title">${E(`lanAccessUrls`)}</div>
1055
- <div class="quickforge-settings-row-description">${E(`lanAccessUrlsDescription`)}</div>
1067
+ <div class="quickforge-settings-row-title">${D(`lanAccessUrls`)}</div>
1068
+ <div class="quickforge-settings-row-description">${D(`lanAccessUrlsDescription`)}</div>
1056
1069
  </div>
1057
1070
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide quickforge-settings-readonly-value">
1058
- ${this.lanUrls.length?this.lanUrls.map(e=>h`<div>${e}</div>`):`-`}
1071
+ ${this.lanUrls.length?this.lanUrls.map(e=>g`<div>${e}</div>`):`-`}
1059
1072
  </div>
1060
1073
  </div>
1061
1074
  </section>
1062
1075
 
1063
- <section class="quickforge-settings-section" aria-label=${E(`lanAccess`)}>
1076
+ <section class="quickforge-settings-section" aria-label=${D(`lanAccess`)}>
1064
1077
  <div class="quickforge-settings-row">
1065
1078
  <div class="quickforge-settings-row-main">
1066
- <div class="quickforge-settings-row-title">${E(`lanAccessAllowFull`)}</div>
1067
- <div class="quickforge-settings-row-description">${E(`lanAccessAllowFullDescription`)}</div>
1079
+ <div class="quickforge-settings-row-title">${D(`lanAccessAllowFull`)}</div>
1080
+ <div class="quickforge-settings-row-description">${D(`lanAccessAllowFullDescription`)}</div>
1068
1081
  </div>
1069
1082
  <div class="quickforge-settings-row-control">
1070
1083
  ${this.renderSwitch(this.enabled,e=>this.updateEnabled(e),this.saving)}
@@ -1073,8 +1086,8 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{B as t,Ct as n,Et as r
1073
1086
 
1074
1087
  <div class="quickforge-settings-row">
1075
1088
  <div class="quickforge-settings-row-main">
1076
- <div class="quickforge-settings-row-title">${E(`lanAccessPassword`)}</div>
1077
- <div class="quickforge-settings-row-description">${this.hasPassword?E(`lanAccessPasswordPlaceholderConfigured`):E(`lanAccessPasswordPlaceholder`)}</div>
1089
+ <div class="quickforge-settings-row-title">${D(`lanAccessPassword`)}</div>
1090
+ <div class="quickforge-settings-row-description">${this.hasPassword?D(`lanAccessPasswordPlaceholderConfigured`):D(`lanAccessPasswordPlaceholder`)}</div>
1078
1091
  </div>
1079
1092
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide quickforge-lan-password-control">
1080
1093
  <input
@@ -1082,53 +1095,53 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{B as t,Ct as n,Et as r
1082
1095
  type="password"
1083
1096
  .value=${this.password}
1084
1097
  @input=${e=>this.updatePassword(e.target.value)}
1085
- placeholder=${this.hasPassword?E(`lanAccessPasswordPlaceholderConfigured`):E(`lanAccessPasswordPlaceholder`)}
1098
+ placeholder=${this.hasPassword?D(`lanAccessPasswordPlaceholderConfigured`):D(`lanAccessPasswordPlaceholder`)}
1086
1099
  />
1087
1100
  <button
1088
1101
  class="quickforge-settings-button quickforge-settings-button-secondary"
1089
1102
  type="button"
1090
- @click=${()=>this.updatePassword(_t())}
1103
+ @click=${()=>this.updatePassword(xt())}
1091
1104
  >
1092
- ${E(`generatePassword`)}
1105
+ ${D(`generatePassword`)}
1093
1106
  </button>
1094
1107
  </div>
1095
1108
  </div>
1096
1109
 
1097
1110
  <div class="quickforge-settings-row">
1098
1111
  <div class="quickforge-settings-row-main">
1099
- <div class="quickforge-settings-row-title">${E(`lanAccessSessionTtl`)}</div>
1100
- <div class="quickforge-settings-row-description">${E(`lanAccessSessionTtlDescription`)}</div>
1112
+ <div class="quickforge-settings-row-title">${D(`lanAccessSessionTtl`)}</div>
1113
+ <div class="quickforge-settings-row-description">${D(`lanAccessSessionTtlDescription`)}</div>
1101
1114
  </div>
1102
1115
  <div class="quickforge-settings-row-control">
1103
1116
  <select class="quickforge-settings-select" .value=${String(this.sessionTtlHours)} @change=${e=>this.updateTtl(e.target.value)}>
1104
- <option value="1">1 ${E(`hour`)}</option>
1105
- <option value="12">12 ${E(`hours`)}</option>
1106
- <option value="24">24 ${E(`hours`)}</option>
1107
- <option value="168">7 ${E(`days`)}</option>
1117
+ <option value="1">1 ${D(`hour`)}</option>
1118
+ <option value="12">12 ${D(`hours`)}</option>
1119
+ <option value="24">24 ${D(`hours`)}</option>
1120
+ <option value="168">7 ${D(`days`)}</option>
1108
1121
  </select>
1109
1122
  </div>
1110
1123
  </div>
1111
1124
 
1112
1125
  <div class="quickforge-settings-row">
1113
1126
  <div class="quickforge-settings-row-main">
1114
- <div class="quickforge-settings-row-title">${E(`lanAccessActions`)}</div>
1115
- <div class="quickforge-settings-row-description">${E(`lanAccessActionsDescription`)}</div>
1127
+ <div class="quickforge-settings-row-title">${D(`lanAccessActions`)}</div>
1128
+ <div class="quickforge-settings-row-description">${D(`lanAccessActionsDescription`)}</div>
1116
1129
  </div>
1117
1130
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide">
1118
1131
  <button class="quickforge-settings-button quickforge-settings-button-primary" type="button" ?disabled=${this.saving} @click=${()=>this.saveSettings()}>
1119
- ${this.saving?E(`saving`):E(`save`)}
1132
+ ${this.saving?D(`saving`):D(`save`)}
1120
1133
  </button>
1121
1134
  <button class="quickforge-settings-button quickforge-settings-button-danger" type="button" ?disabled=${this.saving} @click=${()=>this.revokeAll()}>
1122
- ${E(`lanAccessRevokeAll`)}
1135
+ ${D(`lanAccessRevokeAll`)}
1123
1136
  </button>
1124
1137
  </div>
1125
1138
  </div>
1126
1139
  </section>
1127
1140
 
1128
- ${this.message?h`<div class="quickforge-settings-message">${this.message}</div>`:null}
1129
- ${this.error?h`<div class="quickforge-settings-alert">${this.error}</div>`:null}
1141
+ ${this.message?g`<div class="quickforge-settings-message">${this.message}</div>`:null}
1142
+ ${this.error?g`<div class="quickforge-settings-alert">${this.error}</div>`:null}
1130
1143
  </div>
1131
- `}},U=`quickforge-lan-access-settings-tab`;customElements.get(U)||customElements.define(U,vt);function yt(){return document.createElement(U)}var bt=18e4,xt=3e4,St=1e3,Ct=`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 wt(e){return new Promise(t=>window.setTimeout(t,e))}var Tt=[{value:`startup`,label:()=>E(`frequencyStartup`)},{value:`daily`,label:()=>E(`frequencyDaily`)},{value:`weekly`,label:()=>E(`frequencyWeekly`)},{value:`off`,label:()=>E(`frequencyOff`)}],Et=class extends g{about;updateInfo;loading=!0;checking=!1;updating=!1;restarting=!1;message=``;error=``;frequency=me.frequency;lastCheckAt=null;serviceStatus;getTabName(){return E(`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||E(`requestFailed`));this.about=t;try{let[e,t]=await Promise.all([oe(_()),this.loadServiceStatus()]);this.frequency=e.frequency,this.lastCheckAt=e.lastCheckAt,this.serviceStatus=t}catch{}}catch(e){this.error=e instanceof Error?e.message:E(`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||E(`requestFailed`));return t}async checkUpdate(){if(!(this.checking||this.updating)){if(W()){window.open(Ct,`_blank`,`noopener,noreferrer`),this.message=E(`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||E(`updateCheckFailed`));this.updateInfo=t,this.about=t,this.updateInfo.updateAvailable?this.message=E(`updateAvailableMessage`,{current:this.updateInfo.currentVersion,latest:this.updateInfo.latestVersion}):this.updateInfo.localVersionIsNewer?this.message=E(`localVersionNewerMessage`,{current:this.updateInfo.currentVersion,latest:this.updateInfo.latestVersion}):this.message=E(`alreadyLatestVersion`,{version:this.updateInfo.currentVersion})}catch(e){this.error=e instanceof Error?e.message:E(`updateCheckFailed`)}finally{this.checking=!1,this.requestUpdate()}}}async pollUntilUpdated(e){let t=Date.now();for(;Date.now()-t<bt;){await wt(St);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=E(`updateRestarted`),this.requestUpdate(),window.setTimeout(()=>window.location.reload(),300);return}}catch{}}throw Error(E(`updateRestartTimeout`))}async pollUntilRestarted(e){let t=Date.now();for(;Date.now()-t<xt;){await wt(St);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=E(`backendRestarted`),this.requestUpdate(),window.setTimeout(()=>window.location.reload(),300);return}}catch{}}throw Error(E(`backendRestartTimeout`))}async restartService(){if(!this.serviceStatus||this.restarting||!await S({description:E(`restartBackendConfirm`),confirmLabel:E(`restartBackendService`),cancelLabel:E(`cancel`)}))return;this.restarting=!0,this.message=E(`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||E(`backendRestartFailed`));await this.pollUntilRestarted(e)}catch(e){this.error=e instanceof Error?e.message:E(`backendRestartFailed`),this.message=``,this.restarting=!1,this.requestUpdate()}}async updateQuickForge(){if(W()){window.open(Ct,`_blank`,`noopener,noreferrer`),this.message=E(`desktopUpdateHint`),this.error=``,this.requestUpdate();return}if(!(!this.updateInfo?.updateAvailable||this.updating)&&await S({description:E(`updateConfirm`,{command:this.updateInfo.installCommand}),confirmLabel:E(`updateRuntimeNow`),cancelLabel:E(`cancel`)})){this.updating=!0,this.message=E(`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||E(`updateFailed`));if(this.updateInfo=t,t?.updateStarted){let e=t.logFile?` ${E(`updateLogFile`,{path:t.logFile})}`:``;this.message=`${E(`updateStarted`)}${e}`,this.requestUpdate(),await this.pollUntilUpdated(t.bootId)}else this.message=t?.updated?E(`updateCompleted`):E(`alreadyLatestVersion`,{version:t?.currentVersion||this.about?.version||`-`}),this.updating=!1}catch(e){this.error=e instanceof Error?e.message:E(`updateFailed`),this.message=``,this.updating=!1}finally{this.requestUpdate()}}}async selectFrequency(e){if(this.frequency!==e){this.frequency=e,this.requestUpdate();try{let t=_();await Oe(t,{...await oe(t),frequency:e}),this.error=``}catch(e){this.error=e instanceof Error?e.message:E(`requestFailed`)}finally{this.requestUpdate()}}}renderFrequencyOption(e){let t=this.frequency===e.value;return h`
1144
+ `}},W=`quickforge-lan-access-settings-tab`;customElements.get(W)||customElements.define(W,St);function Ct(){return document.createElement(W)}var wt=18e4,Tt=3e4,Et=1e3,Dt=`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 Ot(e){return new Promise(t=>window.setTimeout(t,e))}var kt=[{value:`startup`,label:()=>D(`frequencyStartup`)},{value:`daily`,label:()=>D(`frequencyDaily`)},{value:`weekly`,label:()=>D(`frequencyWeekly`)},{value:`off`,label:()=>D(`frequencyOff`)}],At=class extends _{about;updateInfo;loading=!0;checking=!1;updating=!1;restarting=!1;message=``;error=``;frequency=pe.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([ae(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(Dt,`_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<wt;){await Ot(Et);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<Tt;){await Ot(Et);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(G()){window.open(Dt,`_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=v();await Ee(t,{...await ae(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`
1132
1145
  <button
1133
1146
  type="button"
1134
1147
  class="quickforge-settings-segmented-option ${t?`quickforge-settings-segmented-option-active`:``}"
@@ -1137,25 +1150,25 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{B as t,Ct as n,Et as r
1137
1150
  >
1138
1151
  ${e.label()}
1139
1152
  </button>
1140
- `}infoRows(){let e=this.about;return e?h`
1153
+ `}infoRows(){let e=this.about;return e?g`
1141
1154
  <div class="quickforge-settings-row">
1142
1155
  <div class="quickforge-settings-row-main">
1143
- <div class="quickforge-settings-row-title">${E(`packageName`)}</div>
1144
- <div class="quickforge-settings-row-description">${E(`packageNameDescription`)}</div>
1156
+ <div class="quickforge-settings-row-title">${D(`packageName`)}</div>
1157
+ <div class="quickforge-settings-row-description">${D(`packageNameDescription`)}</div>
1145
1158
  </div>
1146
1159
  <div class="quickforge-settings-row-control quickforge-settings-readonly-value">${e.name}</div>
1147
1160
  </div>
1148
1161
  <div class="quickforge-settings-row">
1149
1162
  <div class="quickforge-settings-row-main">
1150
- <div class="quickforge-settings-row-title">${E(`currentVersion`)}</div>
1151
- <div class="quickforge-settings-row-description">${E(`currentVersionDescription`)}</div>
1163
+ <div class="quickforge-settings-row-title">${D(`currentVersion`)}</div>
1164
+ <div class="quickforge-settings-row-description">${D(`currentVersionDescription`)}</div>
1152
1165
  </div>
1153
1166
  <div class="quickforge-settings-row-control quickforge-settings-readonly-value">${e.version}</div>
1154
1167
  </div>
1155
1168
  <div class="quickforge-settings-row">
1156
1169
  <div class="quickforge-settings-row-main">
1157
- <div class="quickforge-settings-row-title">${E(`github`)}</div>
1158
- <div class="quickforge-settings-row-description">${E(`githubDescription`)}</div>
1170
+ <div class="quickforge-settings-row-title">${D(`github`)}</div>
1171
+ <div class="quickforge-settings-row-description">${D(`githubDescription`)}</div>
1159
1172
  </div>
1160
1173
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide quickforge-settings-readonly-value">
1161
1174
  <a class="quickforge-settings-link" href=${e.repositoryUrl} target="_blank" rel="noreferrer">
@@ -1163,35 +1176,35 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{B as t,Ct as n,Et as r
1163
1176
  </a>
1164
1177
  </div>
1165
1178
  </div>
1166
- `:null}updateStatus(){return this.updateInfo?h`
1179
+ `:null}updateStatus(){return this.updateInfo?g`
1167
1180
  <div class="quickforge-settings-row">
1168
1181
  <div class="quickforge-settings-row-main">
1169
- <div class="quickforge-settings-row-title">${E(`latestVersion`)}</div>
1170
- <div class="quickforge-settings-row-description">${E(`latestVersionDescription`)}</div>
1182
+ <div class="quickforge-settings-row-title">${D(`latestVersion`)}</div>
1183
+ <div class="quickforge-settings-row-description">${D(`latestVersionDescription`)}</div>
1171
1184
  </div>
1172
1185
  <div class="quickforge-settings-row-control quickforge-settings-readonly-value">${this.updateInfo.latestVersion}</div>
1173
1186
  </div>
1174
- ${this.updateInfo.logFile?h`
1187
+ ${this.updateInfo.logFile?g`
1175
1188
  <div class="quickforge-settings-row">
1176
1189
  <div class="quickforge-settings-row-main">
1177
- <div class="quickforge-settings-row-title">${E(`updateLog`)}</div>
1178
- <div class="quickforge-settings-row-description">${E(`updateLogDescription`)}</div>
1190
+ <div class="quickforge-settings-row-title">${D(`updateLog`)}</div>
1191
+ <div class="quickforge-settings-row-description">${D(`updateLogDescription`)}</div>
1179
1192
  </div>
1180
1193
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide quickforge-settings-readonly-value">
1181
1194
  <code>${this.updateInfo.logFile}</code>
1182
1195
  </div>
1183
1196
  </div>
1184
1197
  `:null}
1185
- `:null}restartSection(){let e=this.serviceStatus?.restartUnsupportedReason||E(`backendRestartUnsupported`),t=this.restarting||!this.serviceStatus?.restartSupported;return h`
1186
- <section class="quickforge-settings-section" aria-label=${E(`restartBackendService`)}>
1198
+ `:null}restartSection(){let e=this.serviceStatus?.restartUnsupportedReason||D(`backendRestartUnsupported`),t=this.restarting||!this.serviceStatus?.restartSupported;return g`
1199
+ <section class="quickforge-settings-section" aria-label=${D(`restartBackendService`)}>
1187
1200
  <div class="quickforge-settings-row">
1188
1201
  <div class="quickforge-settings-row-main">
1189
1202
  <div class="quickforge-settings-row-title">
1190
- ${E(`restartBackendService`)}
1191
- <quickforge-info-tip .label=${E(`restartBackendServiceDescription`)}></quickforge-info-tip>
1203
+ ${D(`restartBackendService`)}
1204
+ <quickforge-info-tip .label=${D(`restartBackendServiceDescription`)}></quickforge-info-tip>
1192
1205
  </div>
1193
1206
  <div class="quickforge-settings-row-description">
1194
- ${this.serviceStatus?.restartSupported?E(`restartBackendServiceDescription`):e}
1207
+ ${this.serviceStatus?.restartSupported?D(`restartBackendServiceDescription`):e}
1195
1208
  </div>
1196
1209
  </div>
1197
1210
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide">
@@ -1201,32 +1214,32 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{B as t,Ct as n,Et as r
1201
1214
  ?disabled=${t}
1202
1215
  @click=${()=>this.restartService()}
1203
1216
  >
1204
- ${this.restarting?E(`backendRestarting`):E(`restartBackendService`)}
1217
+ ${this.restarting?D(`backendRestarting`):D(`restartBackendService`)}
1205
1218
  </button>
1206
1219
  </div>
1207
1220
  </div>
1208
1221
  </section>
1209
- `}render(){if(this.loading)return h`<div class="text-sm text-muted-foreground">${E(`loading`)}</div>`;let e=this.checking||this.updating||!this.updateInfo?.updateAvailable,t=W();return h`
1222
+ `}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`
1210
1223
  <div class="quickforge-settings-stack">
1211
- <section class="quickforge-settings-section" aria-label=${E(`projectInfo`)}>
1224
+ <section class="quickforge-settings-section" aria-label=${D(`projectInfo`)}>
1212
1225
  ${this.infoRows()}
1213
1226
  </section>
1214
1227
 
1215
- <section class="quickforge-settings-section" aria-label=${E(t?`desktopUpdates`:`runtimeUpdates`)}>
1216
- ${t?null:h`
1228
+ <section class="quickforge-settings-section" aria-label=${D(t?`desktopUpdates`:`runtimeUpdates`)}>
1229
+ ${t?null:g`
1217
1230
  <div class="quickforge-settings-row">
1218
1231
  <div class="quickforge-settings-row-main">
1219
1232
  <div class="quickforge-settings-row-title">
1220
- ${E(`updateFrequencySection`)}
1221
- <quickforge-info-tip .label=${E(`updateFrequencyDescription`)}></quickforge-info-tip>
1233
+ ${D(`updateFrequencySection`)}
1234
+ <quickforge-info-tip .label=${D(`updateFrequencyDescription`)}></quickforge-info-tip>
1222
1235
  </div>
1223
1236
  <div class="quickforge-settings-row-description">
1224
- ${this.lastCheckAt?E(`lastCheckedAt`,{time:new Date(this.lastCheckAt).toLocaleString(we())}):E(`lastCheckedNever`)}
1237
+ ${this.lastCheckAt?D(`lastCheckedAt`,{time:new Date(this.lastCheckAt).toLocaleString(Ce())}):D(`lastCheckedNever`)}
1225
1238
  </div>
1226
1239
  </div>
1227
1240
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide">
1228
- <div class="quickforge-settings-segmented quickforge-settings-segmented-wrap" role="group" aria-label=${E(`updateFrequencySection`)}>
1229
- ${Tt.map(e=>this.renderFrequencyOption(e))}
1241
+ <div class="quickforge-settings-segmented quickforge-settings-segmented-wrap" role="group" aria-label=${D(`updateFrequencySection`)}>
1242
+ ${kt.map(e=>this.renderFrequencyOption(e))}
1230
1243
  </div>
1231
1244
  </div>
1232
1245
  </div>
@@ -1237,11 +1250,11 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{B as t,Ct as n,Et as r
1237
1250
  <div class="quickforge-settings-row">
1238
1251
  <div class="quickforge-settings-row-main">
1239
1252
  <div class="quickforge-settings-row-title">
1240
- ${E(t?`desktopUpdates`:`runtimeUpdates`)}
1241
- <quickforge-info-tip .label=${E(t?`desktopUpdatesDescription`:`runtimeUpdatesDescription`)}></quickforge-info-tip>
1253
+ ${D(t?`desktopUpdates`:`runtimeUpdates`)}
1254
+ <quickforge-info-tip .label=${D(t?`desktopUpdatesDescription`:`runtimeUpdatesDescription`)}></quickforge-info-tip>
1242
1255
  </div>
1243
1256
  <div class="quickforge-settings-row-description">
1244
- ${E(t?`desktopUpdatesDescription`:`runtimeUpdatesDescription`)}
1257
+ ${D(t?`desktopUpdatesDescription`:`runtimeUpdatesDescription`)}
1245
1258
  </div>
1246
1259
  </div>
1247
1260
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide">
@@ -1251,16 +1264,16 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{B as t,Ct as n,Et as r
1251
1264
  ?disabled=${this.checking||this.updating}
1252
1265
  @click=${()=>this.checkUpdate()}
1253
1266
  >
1254
- ${this.checking?E(`checkingUpdate`):E(t?`openDesktopReleases`:`checkRuntimeUpdate`)}
1267
+ ${this.checking?D(`checkingUpdate`):D(t?`openDesktopReleases`:`checkRuntimeUpdate`)}
1255
1268
  </button>
1256
- ${t?null:h`
1269
+ ${t?null:g`
1257
1270
  <button
1258
1271
  class="quickforge-settings-button quickforge-settings-button-primary"
1259
1272
  type="button"
1260
1273
  ?disabled=${e}
1261
1274
  @click=${()=>this.updateQuickForge()}
1262
1275
  >
1263
- ${this.updating?E(`updatingQuickForge`):E(`updateRuntimeNow`)}
1276
+ ${this.updating?D(`updatingQuickForge`):D(`updateRuntimeNow`)}
1264
1277
  </button>
1265
1278
  `}
1266
1279
  </div>
@@ -1269,22 +1282,22 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{B as t,Ct as n,Et as r
1269
1282
 
1270
1283
  ${this.restartSection()}
1271
1284
 
1272
- ${this.message?h`<div class="quickforge-settings-message">${this.message}</div>`:null}
1273
- ${this.error?h`<div class="quickforge-settings-alert">${this.error}</div>`:null}
1285
+ ${this.message?g`<div class="quickforge-settings-message">${this.message}</div>`:null}
1286
+ ${this.error?g`<div class="quickforge-settings-alert">${this.error}</div>`:null}
1274
1287
  </div>
1275
- `}},G=`quickforge-about-settings-tab`;customElements.get(G)||customElements.define(G,Et);function Dt(){return document.createElement(G)}var Ot=class extends g{loading=!0;saving=!1;saved=!1;error=``;message=``;projects=[];project;commandDir=``;commands=[];loadingCommands=!1;saveTimer=null;lastSavedCommandDir=``;pendingSaveAfterCurrent=!1;getTabName(){return E(`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||E(`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:E(`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:E(`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:E(`requestFailed`),this.requestUpdate()}}}async createCommand(){if(!this.project)return;let e=window.prompt(E(`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=E(`commandCreated`,{name:t.name??e.trim()}),await this.loadCommands()):t.reason===`exists`?this.error=E(`commandAlreadyExists`,{name:t.name??e.trim()}):this.error=E(`invalidCommandName`)}catch(e){this.error=e instanceof Error?e.message:E(`requestFailed`)}finally{this.requestUpdate()}}}render(){return this.loading?h`<div class="quickforge-settings-note">${E(`loading`)}</div>`:this.projects.length===0?h`
1288
+ `}},K=`quickforge-about-settings-tab`;customElements.get(K)||customElements.define(K,At);function jt(){return document.createElement(K)}var Mt=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`
1276
1289
  <div class="quickforge-settings-stack">
1277
- <div class="quickforge-settings-note">${E(`selectProjectForCommands`)}</div>
1278
- ${this.error?h`<div class="quickforge-settings-alert">${this.error}</div>`:null}
1290
+ <div class="quickforge-settings-note">${D(`selectProjectForCommands`)}</div>
1291
+ ${this.error?g`<div class="quickforge-settings-alert">${this.error}</div>`:null}
1279
1292
  </div>
1280
- `:h`
1293
+ `:g`
1281
1294
  <div class="quickforge-settings-stack">
1282
- <section class="quickforge-settings-section" aria-label=${E(`projectCommands`)}>
1295
+ <section class="quickforge-settings-section" aria-label=${D(`projectCommands`)}>
1283
1296
  <div class="quickforge-settings-row">
1284
1297
  <div class="quickforge-settings-row-main">
1285
- <div class="quickforge-settings-row-title">${E(`project`)}</div>
1298
+ <div class="quickforge-settings-row-title">${D(`project`)}</div>
1286
1299
  <div class="quickforge-settings-row-description">
1287
- ${this.project?.path?this.project.path:E(`projectCommandsProjectDescription`)}
1300
+ ${this.project?.path?this.project.path:D(`projectCommandsProjectDescription`)}
1288
1301
  </div>
1289
1302
  </div>
1290
1303
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide">
@@ -1293,7 +1306,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{B as t,Ct as n,Et as r
1293
1306
  .value=${this.project?.id??``}
1294
1307
  @change=${e=>this.selectProject(e)}
1295
1308
  >
1296
- ${this.projects.map(e=>h`<option value=${e.id} ?selected=${e.id===this.project?.id}>${e.name}</option>`)}
1309
+ ${this.projects.map(e=>g`<option value=${e.id} ?selected=${e.id===this.project?.id}>${e.name}</option>`)}
1297
1310
  </select>
1298
1311
  </div>
1299
1312
  </div>
@@ -1301,16 +1314,16 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{B as t,Ct as n,Et as r
1301
1314
  <div class="quickforge-settings-row quickforge-settings-row-align-start">
1302
1315
  <div class="quickforge-settings-row-main">
1303
1316
  <div class="quickforge-settings-row-title">
1304
- ${E(`commandDirectories`)}
1305
- <quickforge-info-tip .label=${E(`commandDirectoryHelp`)}></quickforge-info-tip>
1317
+ ${D(`commandDirectories`)}
1318
+ <quickforge-info-tip .label=${D(`commandDirectoryHelp`)}></quickforge-info-tip>
1306
1319
  </div>
1307
- <div class="quickforge-settings-row-description">${E(`commandDirectoriesDescription`)}</div>
1320
+ <div class="quickforge-settings-row-description">${D(`commandDirectoriesDescription`)}</div>
1308
1321
  </div>
1309
1322
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide">
1310
1323
  <textarea
1311
1324
  class="quickforge-settings-textarea quickforge-settings-mono"
1312
1325
  .value=${this.commandDir}
1313
- placeholder=${E(`commandDirectoryPlaceholder`)}
1326
+ placeholder=${D(`commandDirectoryPlaceholder`)}
1314
1327
  @input=${e=>this.updateCommandDir(e.target.value)}
1315
1328
  ></textarea>
1316
1329
  </div>
@@ -1318,8 +1331,8 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{B as t,Ct as n,Et as r
1318
1331
 
1319
1332
  <div class="quickforge-settings-row quickforge-settings-row-align-start">
1320
1333
  <div class="quickforge-settings-row-main">
1321
- <div class="quickforge-settings-row-title">${E(`commandDirectoryExamples`)}</div>
1322
- <div class="quickforge-settings-row-description">${E(`commandDirectoryExamplesDescription`)}</div>
1334
+ <div class="quickforge-settings-row-title">${D(`commandDirectoryExamples`)}</div>
1335
+ <div class="quickforge-settings-row-description">${D(`commandDirectoryExamplesDescription`)}</div>
1323
1336
  </div>
1324
1337
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide quickforge-settings-code-list">
1325
1338
  <code>.ai/commands</code>
@@ -1330,11 +1343,11 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{B as t,Ct as n,Et as r
1330
1343
  </div>
1331
1344
  </section>
1332
1345
 
1333
- <section class="quickforge-settings-section" aria-label=${E(`loadedCommands`,{count:this.commands.length})}>
1346
+ <section class="quickforge-settings-section" aria-label=${D(`loadedCommands`,{count:this.commands.length})}>
1334
1347
  <div class="quickforge-settings-row">
1335
1348
  <div class="quickforge-settings-row-main">
1336
- <div class="quickforge-settings-row-title">${E(`loadedCommands`,{count:this.commands.length})}</div>
1337
- <div class="quickforge-settings-row-description">${E(`loadedCommandsDescription`)}</div>
1349
+ <div class="quickforge-settings-row-title">${D(`loadedCommands`,{count:this.commands.length})}</div>
1350
+ <div class="quickforge-settings-row-description">${D(`loadedCommandsDescription`)}</div>
1338
1351
  </div>
1339
1352
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide">
1340
1353
  <button
@@ -1343,7 +1356,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{B as t,Ct as n,Et as r
1343
1356
  ?disabled=${this.loadingCommands}
1344
1357
  @click=${()=>this.openCommandDir()}
1345
1358
  >
1346
- ${E(`openCommandDir`)}
1359
+ ${D(`openCommandDir`)}
1347
1360
  </button>
1348
1361
  <button
1349
1362
  class="quickforge-settings-button quickforge-settings-button-primary"
@@ -1351,41 +1364,41 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{B as t,Ct as n,Et as r
1351
1364
  ?disabled=${this.loadingCommands}
1352
1365
  @click=${()=>this.createCommand()}
1353
1366
  >
1354
- ${E(`createCommand`)}
1367
+ ${D(`createCommand`)}
1355
1368
  </button>
1356
1369
  </div>
1357
1370
  </div>
1358
1371
 
1359
1372
  <div class="quickforge-settings-nested-list">
1360
- ${this.loadingCommands?h`<div class="quickforge-settings-empty-row">${E(`loading`)}</div>`:this.commands.length===0?h`<div class="quickforge-settings-empty-row">${E(`noCommandsLoaded`)}</div>`:this.commands.map(e=>{let t=e.argumentHint?` ${e.argumentHint}`:``;return h`
1373
+ ${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`
1361
1374
  <div class="quickforge-settings-subrow">
1362
1375
  <div class="quickforge-settings-row-main">
1363
1376
  <div class="quickforge-settings-row-title">
1364
1377
  <code class="quickforge-settings-command-name">/${e.name}${t}</code>
1365
1378
  </div>
1366
1379
  <div class="quickforge-settings-row-description">
1367
- ${e.description||E(`noDescription`)}
1380
+ ${e.description||D(`noDescription`)}
1368
1381
  </div>
1369
1382
  </div>
1370
- ${e.relativePath?h`<div class="quickforge-settings-row-control quickforge-settings-row-control-wide quickforge-settings-readonly-value">${e.relativePath}</div>`:null}
1383
+ ${e.relativePath?g`<div class="quickforge-settings-row-control quickforge-settings-row-control-wide quickforge-settings-readonly-value">${e.relativePath}</div>`:null}
1371
1384
  </div>
1372
1385
  `})}
1373
1386
  </div>
1374
1387
  </section>
1375
1388
 
1376
- ${this.saving?h`<div class="quickforge-settings-note">${E(`saving`)}</div>`:null}
1377
- ${this.saved?h`<div class="quickforge-settings-message">${E(`projectCommandsSaved`)}</div>`:null}
1378
- ${this.message?h`<div class="quickforge-settings-message">${this.message}</div>`:null}
1379
- ${this.error?h`<div class="quickforge-settings-alert">${this.error}</div>`:null}
1389
+ ${this.saving?g`<div class="quickforge-settings-note">${D(`saving`)}</div>`:null}
1390
+ ${this.saved?g`<div class="quickforge-settings-message">${D(`projectCommandsSaved`)}</div>`:null}
1391
+ ${this.message?g`<div class="quickforge-settings-message">${this.message}</div>`:null}
1392
+ ${this.error?g`<div class="quickforge-settings-alert">${this.error}</div>`:null}
1380
1393
  </div>
1381
- `}},K=`quickforge-project-commands-settings-tab`;customElements.get(K)||customElements.define(K,Ot);function kt(){return document.createElement(K)}var q={"x-quickforge-action":`channel-action`};function At(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 jt(e){switch(e){case`starting`:return E(`channelStatusStarting`);case`waiting_scan`:return E(`channelStatusWaitingScan`);case`running`:return E(`channelStatusRunning`);case`stopping`:return E(`channelStatusStopping`);case`error`:return E(`channelStatusError`);default:return E(`channelStatusStopped`)}}function Mt(e){if(!e)return`-`;let t=new Date(e);return Number.isNaN(t.getTime())?e:t.toLocaleString()}var Nt=class extends g{loading=!0;channels=[];workspaces=[];selectedWorkspaceIdByChannel={};error=``;message=``;eventSource;busyChannelId=``;getTabName(){return E(`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||E(`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:E(`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:E(`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:E(`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:E(`channelRestartConfirm`,{name:e.name}),confirmLabel:E(`restart`),cancelLabel:E(`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:E(`requestFailed`)}finally{this.busyChannelId=``,this.requestUpdate()}}}async invokeAction(e,t){if(!this.busyChannelId&&!((t.destructive||t.id===`relogin`)&&!await S({description:t.id===`relogin`?E(`channelReloginConfirm`,{name:e.name}):E(`channelLogoutConfirm`,{name:e.name}),confirmLabel:t.label,cancelLabel:E(`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:E(`requestFailed`)}finally{this.busyChannelId=``,this.requestUpdate()}}}workspaceSection(e,t){if(!e.supportsWorkspaceSelection)return null;let n=this.selectedWorkspaceId(e),r=e.launchWorkspace;return h`
1394
+ `}},q=`quickforge-project-commands-settings-tab`;customElements.get(q)||customElements.define(q,Mt);function Nt(){return document.createElement(q)}var J={"x-quickforge-action":`channel-action`};function Pt(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 Ft(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 It(e){if(!e)return`-`;let t=new Date(e);return Number.isNaN(t.getTime())?e:t.toLocaleString()}var Lt=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 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?{...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 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?{...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`
1382
1395
  <div class="quickforge-settings-row quickforge-settings-row-align-start">
1383
1396
  <div class="quickforge-settings-row-main">
1384
1397
  <div class="quickforge-settings-row-title">
1385
- ${E(`channelWorkspace`)}
1386
- <quickforge-info-tip .label=${E(`channelWorkspaceDescription`)}></quickforge-info-tip>
1398
+ ${D(`channelWorkspace`)}
1399
+ <quickforge-info-tip .label=${D(`channelWorkspaceDescription`)}></quickforge-info-tip>
1387
1400
  </div>
1388
- ${r?h`<div class="quickforge-settings-row-description">${E(`channelCurrentWorkspace`)}: <span class="quickforge-settings-mono">${r.path}</span></div>`:h`<div class="quickforge-settings-row-description">${E(`channelWorkspaceDescription`)}</div>`}
1401
+ ${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>`}
1389
1402
  </div>
1390
1403
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide">
1391
1404
  <select
@@ -1394,89 +1407,89 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{B as t,Ct as n,Et as r
1394
1407
  .value=${n}
1395
1408
  @change=${t=>this.handleWorkspaceChange(e,t)}
1396
1409
  >
1397
- ${this.workspaces.map(e=>h`
1398
- <option value=${e.id}>${e.kind===`default`?E(`channelDefaultWorkspace`):e.name} — ${e.path}</option>
1410
+ ${this.workspaces.map(e=>g`
1411
+ <option value=${e.id}>${e.kind===`default`?D(`channelDefaultWorkspace`):e.name} — ${e.path}</option>
1399
1412
  `)}
1400
1413
  </select>
1401
1414
  </div>
1402
1415
  </div>
1403
- `}channelMeta(e){return h`
1416
+ `}channelMeta(e){return g`
1404
1417
  <div class="quickforge-settings-nested-list">
1405
- ${[[E(`channelProvider`),e.provider||`-`],[E(`channelCommand`),e.commandLabel||`-`],[E(`channelPid`),e.pid?String(e.pid):`-`],[E(`channelStartedAt`),Mt(e.startedAt)]].map(([e,t])=>h`
1418
+ ${[[D(`channelProvider`),e.provider||`-`],[D(`channelCommand`),e.commandLabel||`-`],[D(`channelPid`),e.pid?String(e.pid):`-`],[D(`channelStartedAt`),It(e.startedAt)]].map(([e,t])=>g`
1406
1419
  <div class="quickforge-settings-subrow">
1407
1420
  <div class="quickforge-settings-row-main">
1408
1421
  <div class="quickforge-settings-row-title">${e}</div>
1409
1422
  </div>
1410
- <div class="quickforge-settings-row-control quickforge-settings-row-control-wide quickforge-settings-readonly-value ${e===E(`channelCommand`)?`quickforge-settings-mono`:``}">${t}</div>
1423
+ <div class="quickforge-settings-row-control quickforge-settings-row-control-wide quickforge-settings-readonly-value ${e===D(`channelCommand`)?`quickforge-settings-mono`:``}">${t}</div>
1411
1424
  </div>
1412
1425
  `)}
1413
1426
  </div>
1414
- `}qrSection(e){return!e.qrCodeText&&!e.qrCodeUrl&&e.status!==`waiting_scan`?null:h`
1427
+ `}qrSection(e){return!e.qrCodeText&&!e.qrCodeUrl&&e.status!==`waiting_scan`?null:g`
1415
1428
  <div class="quickforge-settings-row quickforge-settings-row-align-start">
1416
1429
  <div class="quickforge-settings-row-main">
1417
1430
  <div class="quickforge-settings-row-title">
1418
- ${E(`channelQrTitle`)}
1419
- <quickforge-info-tip .label=${E(`channelQrDescription`)}></quickforge-info-tip>
1431
+ ${D(`channelQrTitle`)}
1432
+ <quickforge-info-tip .label=${D(`channelQrDescription`)}></quickforge-info-tip>
1420
1433
  </div>
1421
- <div class="quickforge-settings-row-description">${E(`channelQrDescription`)}</div>
1422
- ${e.qrCodeUrl?h`
1434
+ <div class="quickforge-settings-row-description">${D(`channelQrDescription`)}</div>
1435
+ ${e.qrCodeUrl?g`
1423
1436
  <div class="quickforge-settings-meta">
1424
1437
  <a class="quickforge-settings-link quickforge-settings-mono" href=${e.qrCodeUrl} target="_blank" rel="noreferrer">${e.qrCodeUrl}</a>
1425
1438
  </div>
1426
1439
  `:null}
1427
1440
  </div>
1428
- ${e.qrCodeText?h`<pre class="quickforge-channel-qr-text">${e.qrCodeText}</pre>`:null}
1441
+ ${e.qrCodeText?g`<pre class="quickforge-channel-qr-text">${e.qrCodeText}</pre>`:null}
1429
1442
  </div>
1430
- `}logsSection(e){let t=e.logs||[];return h`
1443
+ `}logsSection(e){let t=e.logs||[];return g`
1431
1444
  <details class="quickforge-channel-logs" open>
1432
- <summary class="quickforge-channel-logs-summary">${E(`channelRecentLogs`)}</summary>
1445
+ <summary class="quickforge-channel-logs-summary">${D(`channelRecentLogs`)}</summary>
1433
1446
  <div class="quickforge-channel-logs-body">
1434
- ${t.length?t.slice(-80).map(e=>h`
1447
+ ${t.length?t.slice(-80).map(e=>g`
1435
1448
  <div class="quickforge-channel-log-row">
1436
1449
  <span class="text-muted-foreground/55">${new Date(e.time).toLocaleTimeString()}</span>
1437
1450
  <span class=${e.stream===`stderr`?`text-destructive/80`:`text-muted-foreground/70`}>${e.stream}</span>
1438
1451
  <span class="min-w-0 whitespace-pre-wrap break-words text-foreground/85">${e.text}</span>
1439
1452
  </div>
1440
- `):h`<div class="quickforge-settings-empty-row">${E(`channelNoLogs`)}</div>`}
1453
+ `):g`<div class="quickforge-settings-empty-row">${D(`channelNoLogs`)}</div>`}
1441
1454
  </div>
1442
1455
  </details>
1443
- `}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 h`
1456
+ `}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`
1444
1457
  <section class="quickforge-settings-section" aria-label=${e.name}>
1445
1458
  <div class="quickforge-settings-row quickforge-settings-row-top">
1446
1459
  <div class="quickforge-settings-row-main">
1447
1460
  <div class="quickforge-settings-row-title">
1448
1461
  ${e.name}
1449
- <span class="quickforge-settings-badge ${At(e.status)}">${jt(e.status)}</span>
1462
+ <span class="quickforge-settings-badge ${Pt(e.status)}">${Ft(e.status)}</span>
1450
1463
  </div>
1451
1464
  <div class="quickforge-settings-row-description">${e.description}</div>
1452
- ${e.requirements?.length?h`<div class="quickforge-settings-row-description">${E(`channelRequirements`)}: ${e.requirements.join(` · `)}</div>`:null}
1465
+ ${e.requirements?.length?g`<div class="quickforge-settings-row-description">${D(`channelRequirements`)}: ${e.requirements.join(` · `)}</div>`:null}
1453
1466
  </div>
1454
1467
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide">
1455
- <button class="quickforge-settings-button quickforge-settings-button-primary" type="button" ?disabled=${t||n||r||i} @click=${()=>this.invoke(e,`start`)}>${E(`start`)}</button>
1456
- <button class="quickforge-settings-button quickforge-settings-button-secondary" type="button" ?disabled=${t||!n||r} @click=${()=>this.invoke(e,`stop`)}>${E(`stop`)}</button>
1457
- <button class="quickforge-settings-button quickforge-settings-button-secondary" type="button" ?disabled=${t||r||i} @click=${()=>this.invoke(e,`restart`)}>${E(`restart`)}</button>
1458
- ${e.actions?.map(n=>h`
1468
+ <button class="quickforge-settings-button quickforge-settings-button-primary" type="button" ?disabled=${t||n||r||i} @click=${()=>this.invoke(e,`start`)}>${D(`start`)}</button>
1469
+ <button class="quickforge-settings-button quickforge-settings-button-secondary" type="button" ?disabled=${t||!n||r} @click=${()=>this.invoke(e,`stop`)}>${D(`stop`)}</button>
1470
+ <button class="quickforge-settings-button quickforge-settings-button-secondary" type="button" ?disabled=${t||r||i} @click=${()=>this.invoke(e,`restart`)}>${D(`restart`)}</button>
1471
+ ${e.actions?.map(n=>g`
1459
1472
  <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>
1460
1473
  `)}
1461
1474
  </div>
1462
1475
  </div>
1463
1476
 
1464
1477
  ${this.workspaceSection(e,t||n||r)}
1465
- ${i?h`<div class="quickforge-settings-alert quickforge-settings-warning-attached">${E(`channelNoWorkspaces`)}</div>`:null}
1478
+ ${i?g`<div class="quickforge-settings-alert quickforge-settings-warning-attached">${D(`channelNoWorkspaces`)}</div>`:null}
1466
1479
  ${this.channelMeta(e)}
1467
- ${e.error?h`<div class="quickforge-settings-alert quickforge-settings-warning-attached">${e.error}</div>`:null}
1480
+ ${e.error?g`<div class="quickforge-settings-alert quickforge-settings-warning-attached">${e.error}</div>`:null}
1468
1481
  ${this.qrSection(e)}
1469
1482
  ${this.logsSection(e)}
1470
1483
  </section>
1471
- `}render(){return this.loading?h`<div class="quickforge-settings-note">${E(`loading`)}</div>`:h`
1484
+ `}render(){return this.loading?g`<div class="quickforge-settings-note">${D(`loading`)}</div>`:g`
1472
1485
  <div class="quickforge-settings-stack">
1473
1486
  <section class="quickforge-settings-warning">
1474
- ${E(`channelsSecurityWarning`)}
1487
+ ${D(`channelsSecurityWarning`)}
1475
1488
  </section>
1476
1489
 
1477
- ${this.channels.length?h`${this.channels.map(e=>this.channelCard(e))}`:h`<div class="quickforge-settings-note">${E(`channelsEmpty`)}</div>`}
1490
+ ${this.channels.length?g`${this.channels.map(e=>this.channelCard(e))}`:g`<div class="quickforge-settings-note">${D(`channelsEmpty`)}</div>`}
1478
1491
 
1479
- ${this.message?h`<div class="quickforge-settings-message">${this.message}</div>`:null}
1480
- ${this.error?h`<div class="quickforge-settings-alert">${this.error}</div>`:null}
1492
+ ${this.message?g`<div class="quickforge-settings-message">${this.message}</div>`:null}
1493
+ ${this.error?g`<div class="quickforge-settings-alert">${this.error}</div>`:null}
1481
1494
  </div>
1482
- `}},J=`quickforge-channels-settings-tab`;customElements.get(J)||customElements.define(J,Nt);function Pt(){return document.createElement(J)}var Ft=ae(),Y=ie(),It=(0,D.lazy)(()=>v(()=>import(`./AgentProfilesPage-Be0oZDW5.js`).then(e=>({default:e.AgentProfilesPage})),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11]))),Lt=(0,D.lazy)(()=>v(()=>import(`./mcp-servers-dialog-BHljnwYv.js`).then(e=>({default:e.McpServersPanel})),__vite__mapDeps([12,1,2,3,4,5,6,7,8,9,10,11]))),Rt=(0,D.lazy)(()=>v(()=>import(`./skills-dialog-8rn1XU9U.js`).then(e=>e.n).then(e=>({default:e.SkillsManagerPanel})),__vite__mapDeps([9,1,2,3,4,5,6,7,8,10,11]))),zt=(0,D.lazy)(()=>v(()=>import(`./PluginsPage-DZlqGFLn.js`).then(e=>({default:e.PluginsPage})),__vite__mapDeps([13,1,2,3,4,5,6,7,8,9,10,11,14]))),Bt=(0,D.lazy)(()=>v(()=>import(`./ScheduledTasksPage-DTkj-0O4.js`).then(e=>({default:e.ScheduledTasksPage})),__vite__mapDeps([15,1,2,3,4,5,6,7,8,9,10,11]))),Vt=class extends g{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 h`<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,Ft.createRoot)(e),this.root.render(this.renderReact()))}},X=`quickforge-react-settings-tab`;customElements.get(X)||customElements.define(X,Vt);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)(D.Suspense,{fallback:(0,Y.jsx)(`div`,{className:`quickforge-settings-note`,children:E(`loading`)}),children:e})})}function Ht(e){window.dispatchEvent(new CustomEvent(`quickforge:open-session-from-settings`,{detail:{sessionId:e}}))}function Ut(){return Z(E(`agentsTab`),()=>(0,Y.jsx)(Q,{children:(0,Y.jsx)(It,{})}))}function Wt(){return Z(E(`skills`),()=>(0,Y.jsx)(Q,{children:(0,Y.jsx)(Rt,{active:!0,scope:`global`,embedded:!0,onSaved:()=>void 0})}))}function Gt(){return Z(E(`mcpServers`),()=>(0,Y.jsx)(Q,{children:(0,Y.jsx)(Lt,{active:!0})}))}function Kt(){return Z(E(`plugins`),()=>(0,Y.jsx)(Q,{children:(0,Y.jsx)(zt,{})}))}function qt(){return Z(E(`scheduledTasks`),()=>(0,Y.jsx)(Q,{children:(0,Y.jsx)(Bt,{onOpenSession:Ht})}))}function Jt(e){let t=[{key:`appearance`,tab:Ie(),getDescription:()=>E(`appearanceDescription`)},{key:`defaults`,tab:Ye(),getDescription:()=>E(`defaultOptionsDescription`)},{key:`memory`,tab:nt(),getDescription:()=>E(`memoryDescription`)},{key:`customModels`,tab:Ne(e),getDescription:()=>E(`customModelsDescription`)},{key:`agents`,tab:Ut(),getDescription:()=>E(`agentsDescription`)},{key:`skills`,tab:Wt(),getDescription:()=>E(`globalSkillsDescription`)},{key:`mcp`,tab:Gt(),getDescription:void 0},{key:`plugins`,tab:Kt(),getDescription:()=>E(`pluginsDescription`)},{key:`scheduledTasks`,tab:qt(),getDescription:()=>E(`scheduledTasksDescription`)},{key:`projectCommands`,tab:kt(),getDescription:()=>E(`projectCommandsDescription`)},{key:`backup`,tab:ft(),getDescription:()=>E(`backupRestoreDescription`)},{key:`archivedConversations`,tab:gt(),getDescription:()=>E(`archivedConversationsDescription`)},{key:`channels`,tab:Pt(),getDescription:()=>E(`channelsDescription`)},{key:`lanAccess`,tab:yt(),getDescription:()=>E(`lanAccessDescription`)},{key:`about`,tab:Dt(),getDescription:()=>E(`aboutQuickForgeDescription`)}];return{items:[...t],tabs:t.map(e=>e.tab),indexOf:e=>t.findIndex(t=>t.key===e)}}var $={appearance:d,defaults:f,memory:re,customModels:te,agents:a,skills:n,mcp:u,plugins:s,scheduledTasks:c,projectCommands:m,backup:p,archivedConversations:r,channels:l,lanAccess:ne,about:t};function Yt({tab:e}){let t=(0,D.useRef)(null);return(0,D.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 Xt({initialTab:e,customProvider:t,onBack:n}){let r=(0,D.useMemo)(()=>Jt(t),[t]),i=Math.max(0,r.indexOf(e)),[a,s]=(0,D.useState)(),c=a??i,l=r.items[c]??r.items[0],u=l?.getDescription?.(),d=l?$[l.key]:void 0,[f,te]=(0,D.useState)(``),p=f.trim().toLowerCase(),m=(0,D.useMemo)(()=>r.items.map((e,t)=>({item:e,index:t})).filter(({item:e})=>p?[e.key,e.tab.getTabName(),e.getDescription?.()??``].join(` `).toLowerCase().includes(p):!0),[r.items,p]);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)(o,{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)(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,Y.jsx)(`input`,{value:f,onChange:e=>te(e.target.value),placeholder:E(`searchSettings`),"aria-label":E(`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":E(`settings`),children:[m.map(({item:e,index:t})=>{let n=t===c,r=$[e.key];return(0,Y.jsxs)(`button`,{type:`button`,className:De(`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:De(`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)}),m.length===0?(0,Y.jsx)(`div`,{className:`px-2 py-3 text-sm text-muted-foreground/70`,children:E(`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)(Se,{variant:`ghost`,size:`icon`,className:`md:hidden`,onClick:n,"aria-label":`返回工作区`,children:(0,Y.jsx)(o,{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:[d?(0,Y.jsx)(d,{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:l?.tab.getTabName()}),u?(0,Y.jsx)(Ee,{label:u}):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)(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,Y.jsx)(`input`,{value:f,onChange:e=>te(e.target.value),placeholder:E(`searchSettings`),"aria-label":E(`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:[m.map(({item:e,index:t})=>{let n=t===c,r=$[e.key];return(0,Y.jsxs)(`button`,{type:`button`,className:De(`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)}),m.length===0?(0,Y.jsx)(`div`,{className:`shrink-0 px-1 py-1.5 text-sm text-muted-foreground/70`,children:E(`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:l?(0,Y.jsx)(Yt,{tab:l.tab}):null})})]})]})}export{Xt as SettingsWorkspacePage};
1495
+ `}},Y=`quickforge-channels-settings-tab`;customElements.get(Y)||customElements.define(Y,Lt);function Rt(){return document.createElement(Y)}var zt=ie(),X=re(),Bt=(0,k.lazy)(()=>y(()=>import(`./AgentProfilesPage-DQ8URegq.js`).then(e=>({default:e.AgentProfilesPage})),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11]))),Vt=(0,k.lazy)(()=>y(()=>import(`./mcp-servers-dialog-XE4K8PCO.js`).then(e=>({default:e.McpServersPanel})),__vite__mapDeps([12,1,2,3,4,5,6,7,8,9,10,11]))),Ht=(0,k.lazy)(()=>y(()=>import(`./skills-dialog-MpoxntiV.js`).then(e=>e.n).then(e=>({default:e.SkillsManagerPanel})),__vite__mapDeps([9,1,2,3,4,5,6,7,8,10,11]))),Ut=(0,k.lazy)(()=>y(()=>import(`./PluginsPage-B8bHMwfv.js`).then(e=>({default:e.PluginsPage})),__vite__mapDeps([13,1,2,3,4,5,6,7,8,9,10,11,14]))),Wt=(0,k.lazy)(()=>y(()=>import(`./ScheduledTasksPage-AaUz5el2.js`).then(e=>({default:e.ScheduledTasksPage})),__vite__mapDeps([15,1,2,3,4,5,6,7,8,9,10,11]))),Gt=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,zt.createRoot)(e),this.root.render(this.renderReact()))}},Z=`quickforge-react-settings-tab`;customElements.get(Z)||customElements.define(Z,Gt);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 Kt(e){window.dispatchEvent(new CustomEvent(`quickforge:open-session-from-settings`,{detail:{sessionId:e}}))}function qt(){return Q(D(`agentsTab`),()=>(0,X.jsx)($,{children:(0,X.jsx)(Bt,{})}))}function Jt(){return Q(D(`skills`),()=>(0,X.jsx)($,{children:(0,X.jsx)(Ht,{active:!0,scope:`global`,embedded:!0,onSaved:()=>void 0})}))}function Yt(){return Q(D(`mcpServers`),()=>(0,X.jsx)($,{children:(0,X.jsx)(Vt,{active:!0})}))}function Xt(){return Q(D(`plugins`),()=>(0,X.jsx)($,{children:(0,X.jsx)(Ut,{})}))}function Zt(){return Q(D(`scheduledTasks`),()=>(0,X.jsx)($,{children:(0,X.jsx)(Wt,{onOpenSession:Kt})}))}function Qt(e){let t=[{key:`appearance`,tab:Fe(),getDescription:()=>D(`appearanceDescription`)},{key:`defaults`,tab:$e(),getDescription:()=>D(`defaultOptionsDescription`)},{key:`memory`,tab:ot(),getDescription:()=>D(`memoryDescription`)},{key:`customModels`,tab:je(e),getDescription:()=>D(`customModelsDescription`)},{key:`agents`,tab:qt(),getDescription:()=>D(`agentsDescription`)},{key:`skills`,tab:Jt(),getDescription:()=>D(`globalSkillsDescription`)},{key:`mcp`,tab:Yt(),getDescription:void 0},{key:`plugins`,tab:Xt(),getDescription:()=>D(`pluginsDescription`)},{key:`scheduledTasks`,tab:Zt(),getDescription:()=>D(`scheduledTasksDescription`)},{key:`projectCommands`,tab:Nt(),getDescription:()=>D(`projectCommandsDescription`)},{key:`backup`,tab:gt(),getDescription:()=>D(`backupRestoreDescription`)},{key:`archivedConversations`,tab:bt(),getDescription:()=>D(`archivedConversationsDescription`)},{key:`channels`,tab:Rt(),getDescription:()=>D(`channelsDescription`)},{key:`lanAccess`,tab:Ct(),getDescription:()=>D(`lanAccessDescription`)},{key:`about`,tab:jt(),getDescription:()=>D(`aboutQuickForgeDescription`)}];return{items:[...t],tabs:t.map(e=>e.tab),indexOf:e=>t.findIndex(t=>t.key===e)}}var $t={appearance:d,defaults:f,memory:te,customModels:h,agents:i,skills:t,mcp:u,plugins:o,scheduledTasks:s,projectCommands:m,backup:p,archivedConversations:n,channels:l,lanAccess:c,about:ne};function en({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 tn({initialTab:e,customProvider:t,onBack:n}){let r=(0,k.useMemo)(()=>Qt(t),[t]),i=Math.max(0,r.indexOf(e)),[o,s]=(0,k.useState)(),c=o??i,l=r.items[c]??r.items[0],u=l?.getDescription?.(),d=l?$t[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)(a,{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=$t[e.key];return(0,X.jsxs)(`button`,{type:`button`,className:O(`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:O(`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)(xe,{variant:`ghost`,size:`icon`,className:`md:hidden`,onClick:n,"aria-label":`返回工作区`,children:(0,X.jsx)(a,{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)(Te,{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=$t[e.key];return(0,X.jsxs)(`button`,{type:`button`,className:O(`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)(en,{tab:l.tab}):null})})]})]})}export{tn as SettingsWorkspacePage};