@shawnstack/quickforge 1.7.12 → 1.8.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 (49) hide show
  1. package/README.md +1 -1
  2. package/dist/assets/AgentProfilesPage-lKGIE5Dj.js +1 -0
  3. package/dist/assets/ChatPanelHost-CWUYIkXG.js +11 -0
  4. package/dist/assets/CloudAccountSettingsPage-BhXH0ups.js +1 -0
  5. package/dist/assets/{PluginsPage-BIbIDfWY.js → PluginsPage-DHWF13mN.js} +1 -1
  6. package/dist/assets/{ScheduledTasksPage-BOqmBNCx.js → ScheduledTasksPage-DLAg-i8c.js} +2 -2
  7. package/dist/assets/{SettingsWorkspacePage-BCRtycRN.js → SettingsWorkspacePage-BhUzL5oi.js} +128 -128
  8. package/dist/assets/ShareLinksSettingsPage-DogGa3lH.js +1 -0
  9. package/dist/assets/SharedConversationPage-7QpeaG_P.js +1 -0
  10. package/dist/assets/{TerminalDock-Cqz_9mTC.js → TerminalDock-CWSKcuiU.js} +2 -2
  11. package/dist/assets/WorkspaceInspector-CEfyYqWy.js +36 -0
  12. package/dist/assets/{index-BWf6y3Kh.css → index-CX36XjVA.css} +1 -1
  13. package/dist/assets/index-CgVTwN15.js +66 -0
  14. package/dist/assets/local-tools-CJVNO1aW.js +388 -0
  15. package/dist/assets/{mcp-servers-dialog-7Xwu2RVW.js → mcp-servers-dialog-xf3UR49J.js} +2 -2
  16. package/dist/assets/{skills-dialog-C_JvWbAa.js → skills-dialog-Bbqtuy2h.js} +1 -1
  17. package/dist/index.html +4 -4
  18. package/dist/licenses/material-icon-theme.txt +8 -8
  19. package/package.json +1 -1
  20. package/server/agent-manager.mjs +175 -47
  21. package/server/context-references.mjs +139 -0
  22. package/server/custom-commands.mjs +43 -0
  23. package/server/index.mjs +1 -1
  24. package/server/project-config.mjs +17 -5
  25. package/server/routes/agent-profiles.mjs +16 -1
  26. package/server/routes/agent.mjs +1 -1
  27. package/server/routes/shared-conversation.mjs +13 -1
  28. package/server/routes/skills.mjs +22 -0
  29. package/server/routes/workspace.mjs +166 -2
  30. package/server/selected-capabilities.mjs +76 -0
  31. package/server/skills.mjs +1 -1
  32. package/server/system-prompt.mjs +1 -3
  33. package/server/tools/definitions.mjs +0 -10
  34. package/server/utils/workspace.mjs +13 -4
  35. package/skills/skill-creator/SKILL.md +485 -485
  36. package/skills/skill-creator/agents/analyzer.md +274 -274
  37. package/skills/skill-creator/agents/comparator.md +202 -202
  38. package/skills/skill-creator/agents/grader.md +223 -223
  39. package/skills/skill-creator/assets/eval_review.html +146 -146
  40. package/skills/skill-creator/eval-viewer/viewer.html +1325 -1325
  41. package/skills/skill-creator/references/schemas.md +430 -430
  42. package/dist/assets/AgentProfilesPage-CApCpsDd.js +0 -1
  43. package/dist/assets/ChatPanelHost-COTO7swS.js +0 -48
  44. package/dist/assets/CloudAccountSettingsPage-Be5r3dtv.js +0 -1
  45. package/dist/assets/ShareLinksSettingsPage-BrxQacJn.js +0 -1
  46. package/dist/assets/SharedConversationPage-DJa0M0El.js +0 -1
  47. package/dist/assets/WorkspaceInspector-C-GOK81D.js +0 -36
  48. package/dist/assets/index-D3GWkXJR.js +0 -66
  49. package/dist/assets/local-tools-DY0yEU3T.js +0 -350
@@ -1,5 +1,5 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/AgentProfilesPage-CApCpsDd.js","assets/rolldown-runtime-DWdDZTNf.js","assets/index-D3GWkXJR.js","assets/pi-ai-Cr2ee4a0.js","assets/dist-yDHbi5ux.js","assets/pi-web-ui-BNuvqKDT.js","assets/lit-vendor-CinchGmI.js","assets/css-utils-31qzCXsk.js","assets/icons-DM_qJ7VJ.js","assets/react-vendor-BpWW_Nvp.js","assets/skills-dialog-C_JvWbAa.js","assets/logger-8REuLPGK.js","assets/model-display-label-CURwH0xM.js","assets/index-BWf6y3Kh.css","assets/model-identity-CgA6_Pbm.js","assets/mcp-servers-dialog-7Xwu2RVW.js","assets/PluginsPage-BIbIDfWY.js","assets/plugin-api-BrdQeM4B.js","assets/ScheduledTasksPage-BOqmBNCx.js","assets/ShareLinksSettingsPage-BrxQacJn.js","assets/CloudAccountSettingsPage-Be5r3dtv.js"])))=>i.map(i=>d[i]);
2
- import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,Gt as i,Ht as a,Jt as o,Kt as s,Lt as c,Mt as ee,Rt as l,St as u,T as d,X as f,_t as p,b as te,h as m,p as ne,u as h,v as g,vt as _,wt as v,zt as y}from"./icons-DM_qJ7VJ.js";import{n as b,r as re}from"./react-vendor-BpWW_Nvp.js";import{c as ie,d as ae,f as x,l as oe,s as se,u as ce}from"./lit-vendor-CinchGmI.js";import{m as S,x as C}from"./pi-web-ui-BNuvqKDT.js";import{J as w}from"./pi-ai-Cr2ee4a0.js";import{t as T}from"./logger-8REuLPGK.js";import{n as le,t as ue}from"./model-display-label-CURwH0xM.js";import{An as de,Ct as fe,Fn as pe,In as E,J as me,Ln as D,Mn as he,Mt as ge,Nn as O,Nt as _e,Pn as ve,St as ye,Tt as k,U as be,X as xe,_n as Se,a as Ce,bn as we,bt as Te,c as Ee,dn as A,dt as De,fn as Oe,ft as ke,gn as Ae,gt as j,ht as M,i as je,jt as Me,l as Ne,lt as Pe,mn as Fe,mt as Ie,pt as Le,s as Re,ut as ze,vn as Be,wn as Ve,wt as N,xn as He,xt as Ue,yn as We}from"./index-D3GWkXJR.js";var P=e(o(),1),Ge={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:A.name,baseUrl:A.baseUrl,protocol:`openai-completions`,modelId:A.modelId,supportsImages:A.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`)}],F=()=>({modelId:``,contextWindow:A.contextWindow,maxTokens:A.maxTokens,reasoning:!0,supportsImages:!1,visibleInSelectors:!0,open:!1}),I=()=>({name:A.name,baseUrl:A.baseUrl,apiKey:``,headerRows:[],protocol:`openai-completions`,models:[F()]}),qe=class extends S{providers=[];form=I();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 C().customProviders.getAll()}catch(e){T.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=I(),this.apiKeyVisible=!1,this.advancedOpen=!1,this.activePreset=``,this.resetTestState(),this.formOpen=!0,this.requestUpdate()}async openEditForm(e){let t=await C().providerKeys.get(e.name)??e.apiKey??``,n=e.models??[],r=n.length>0?n.map(e=>({modelId:e.id,contextWindow:e.contextWindow??A.contextWindow,maxTokens:e.maxTokens??A.maxTokens,reasoning:e.reasoning===!0,supportsImages:e.input?.includes(`image`)===!0,visibleInSelectors:e.quickforgeHidden!==!0,open:!1})):[F()],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=I(),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,F()]},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:[F()]};else{let t=Ge[e];this.form={...this.form,name:t.name,baseUrl:t.baseUrl,protocol:t.protocol,models:[{...F(),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 Be({id:e.modelId,name:`${e.modelId} (${n})`,api:this.form.protocol,provider:n,baseUrl:r.replace(/\/$/,``),reasoning:i,input:a,quickforgeHidden:e.visibleInSelectors?void 0:!0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0},contextWindow:Number(e.contextWindow)||A.contextWindow,maxTokens:Number(e.maxTokens)||A.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){N(D(`fillProviderBaseUrlModel`));return}let n=this.form.models.filter(e=>e.modelId.trim());if(n.length===0){N(D(`atLeastOneModel`));return}let r=n.map(e=>e.modelId.trim());if(new Set(r).size!==r.length){N(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??He(),name:e,type:this.form.protocol,baseUrl:a[0].baseUrl,apiKey:o||void 0,models:a};try{let e=C();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),Ve(),this.closeForm(),await this.loadProviders()}catch(e){T.error(`Failed to save custom model:`,e),N(D(`saveCustomModelFailed`))}}async deleteProvider(e){if(await k({description:D(`confirmDeleteProvider`,{name:e.name}),confirmLabel:D(`confirmDelete`),cancelLabel:D(`cancel`),variant:`destructive`}))try{let t=C();await t.customProviders.delete(e.id),await t.providerKeys.delete(e.name),Ve(),await this.loadProviders()}catch(e){T.error(`Failed to delete custom provider:`,e),N(D(`deleteFailed`))}}renderProvider(e){let t=e.models??[],n=t.length,r=e.type===`anthropic-messages`?`Anthropic Messages`:`OpenAI Compatible`;return x`
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/AgentProfilesPage-lKGIE5Dj.js","assets/rolldown-runtime-DWdDZTNf.js","assets/index-CgVTwN15.js","assets/pi-ai-Cr2ee4a0.js","assets/dist-yDHbi5ux.js","assets/pi-web-ui-BNuvqKDT.js","assets/lit-vendor-CinchGmI.js","assets/css-utils-31qzCXsk.js","assets/icons-DM_qJ7VJ.js","assets/react-vendor-BpWW_Nvp.js","assets/skills-dialog-Bbqtuy2h.js","assets/logger-8REuLPGK.js","assets/model-display-label-CURwH0xM.js","assets/index-CX36XjVA.css","assets/model-identity-CgA6_Pbm.js","assets/mcp-servers-dialog-xf3UR49J.js","assets/PluginsPage-DHWF13mN.js","assets/plugin-api-BrdQeM4B.js","assets/ScheduledTasksPage-DLAg-i8c.js","assets/ShareLinksSettingsPage-DogGa3lH.js","assets/CloudAccountSettingsPage-BhXH0ups.js"])))=>i.map(i=>d[i]);
2
+ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,Gt as i,Ht as a,Jt as o,Kt as s,Lt as c,Mt as ee,Rt as l,St as u,T as d,X as f,_t as te,b as ne,h as p,p as re,u as m,v as h,vt as g,wt as ie,zt as _}from"./icons-DM_qJ7VJ.js";import{n as v,r as ae}from"./react-vendor-BpWW_Nvp.js";import{c as oe,d as se,f as y,l as ce,s as le,u as ue}from"./lit-vendor-CinchGmI.js";import{m as b,x}from"./pi-web-ui-BNuvqKDT.js";import{J as S}from"./pi-ai-Cr2ee4a0.js";import{t as C}from"./logger-8REuLPGK.js";import{n as de,t as fe}from"./model-display-label-CURwH0xM.js";import{An as pe,Bn as me,Cn as he,Ct as ge,Dn as _e,En as ve,Et as w,Ft as ye,Hn as T,In as be,It as xe,Lt as Se,Rn as Ce,Sn as we,St as Te,Tn as Ee,Tt as E,Un as D,Vn as De,W as Oe,Y as ke,Z as Ae,_n as O,_t as k,a as je,bn as Me,c as Ne,dt as Pe,ft as Fe,gt as A,ht as Ie,i as Le,l as Re,mt as ze,pt as Be,s as Ve,ut as He,vn as Ue,wn as We,wt as Ge,xt as Ke,zn as j}from"./index-CgVTwN15.js";var M=e(o(),1),qe={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:O.name,baseUrl:O.baseUrl,protocol:`openai-completions`,modelId:O.modelId,supportsImages:O.supportsImages}},Je=[{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`)}],N=()=>({modelId:``,contextWindow:O.contextWindow,maxTokens:O.maxTokens,reasoning:!0,supportsImages:!1,visibleInSelectors:!0,open:!1}),P=()=>({name:O.name,baseUrl:O.baseUrl,apiKey:``,headerRows:[],protocol:`openai-completions`,models:[N()]}),Ye=class extends b{providers=[];form=P();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 x().customProviders.getAll()}catch(e){C.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=P(),this.apiKeyVisible=!1,this.advancedOpen=!1,this.activePreset=``,this.resetTestState(),this.formOpen=!0,this.requestUpdate()}async openEditForm(e){let t=await x().providerKeys.get(e.name)??e.apiKey??``,n=e.models??[],r=n.length>0?n.map(e=>({modelId:e.id,contextWindow:e.contextWindow??O.contextWindow,maxTokens:e.maxTokens??O.maxTokens,reasoning:e.reasoning===!0,supportsImages:e.input?.includes(`image`)===!0,visibleInSelectors:e.quickforgeHidden!==!0,open:!1})):[N()],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=P(),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,N()]},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:[N()]};else{let t=qe[e];this.form={...this.form,name:t.name,baseUrl:t.baseUrl,protocol:t.protocol,models:[{...N(),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 We({id:e.modelId,name:`${e.modelId} (${n})`,api:this.form.protocol,provider:n,baseUrl:r.replace(/\/$/,``),reasoning:i,input:a,quickforgeHidden:e.visibleInSelectors?void 0:!0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0},contextWindow:Number(e.contextWindow)||O.contextWindow,maxTokens:Number(e.maxTokens)||O.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){E(D(`fillProviderBaseUrlModel`));return}let n=this.form.models.filter(e=>e.modelId.trim());if(n.length===0){E(D(`atLeastOneModel`));return}let r=n.map(e=>e.modelId.trim());if(new Set(r).size!==r.length){E(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??_e(),name:e,type:this.form.protocol,baseUrl:a[0].baseUrl,apiKey:o||void 0,models:a};try{let e=x();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),pe(),this.closeForm(),await this.loadProviders()}catch(e){C.error(`Failed to save custom model:`,e),E(D(`saveCustomModelFailed`))}}async deleteProvider(e){if(await w({description:D(`confirmDeleteProvider`,{name:e.name}),confirmLabel:D(`confirmDelete`),cancelLabel:D(`cancel`),variant:`destructive`}))try{let t=x();await t.customProviders.delete(e.id),await t.providerKeys.delete(e.name),pe(),await this.loadProviders()}catch(e){C.error(`Failed to delete custom provider:`,e),E(D(`deleteFailed`))}}renderProvider(e){let t=e.models??[],n=t.length,r=e.type===`anthropic-messages`?`Anthropic Messages`:`OpenAI Compatible`;return y`
3
3
  <div class="quickforge-settings-list-item">
4
4
  <div class="quickforge-settings-list-item-main">
5
5
  <div class="flex min-w-0 items-start gap-3">
@@ -10,14 +10,14 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
10
10
  <div class="quickforge-settings-meta">
11
11
  <span class="quickforge-settings-badge quickforge-settings-badge-muted">${D(`providerProtocol`)}: ${r}</span>
12
12
  <span class="quickforge-settings-badge quickforge-settings-badge-info">${D(`modelsCount`,{count:n})}</span>
13
- ${n===0?x`<span class="quickforge-settings-badge quickforge-settings-badge-warning">${D(`noModelAdded`)}</span>`:null}
13
+ ${n===0?y`<span class="quickforge-settings-badge quickforge-settings-badge-warning">${D(`noModelAdded`)}</span>`:null}
14
14
  </div>
15
- ${n>0?x`
15
+ ${n>0?y`
16
16
  <div class="quickforge-settings-meta">
17
- ${t.slice(0,6).map(e=>x`
17
+ ${t.slice(0,6).map(e=>y`
18
18
  <code class="quickforge-settings-command-name">${e.id}</code>
19
19
  `)}
20
- ${t.length>6?x`<span class="quickforge-settings-badge quickforge-settings-badge-muted">+${t.length-6}</span>`:null}
20
+ ${t.length>6?y`<span class="quickforge-settings-badge quickforge-settings-badge-muted">+${t.length-6}</span>`:null}
21
21
  </div>
22
22
  `:null}
23
23
  </div>
@@ -40,11 +40,11 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
40
40
  </button>
41
41
  </div>
42
42
  </div>
43
- `}renderPresetChips(){return x`
43
+ `}renderPresetChips(){return y`
44
44
  <div class="quickforge-settings-form-row">
45
45
  <span class="quickforge-settings-form-label">${D(`presets`)}</span>
46
46
  <div class="quickforge-settings-segmented quickforge-settings-segmented-wrap">
47
- ${Ke.map(e=>x`
47
+ ${Je.map(e=>y`
48
48
  <button
49
49
  class="quickforge-settings-segmented-option ${this.activePreset===e.key?`quickforge-settings-segmented-option-active`:``}"
50
50
  type="button"
@@ -55,7 +55,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
55
55
  `)}
56
56
  </div>
57
57
  </div>
58
- `}renderModelRow(e,t){let n=e.open===!0;return x`
58
+ `}renderModelRow(e,t){let n=e.open===!0;return y`
59
59
  <div class="quickforge-settings-subrow quickforge-settings-row-align-start">
60
60
  <button
61
61
  class="quickforge-settings-icon-action"
@@ -73,7 +73,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
73
73
  @input=${e=>this.updateModelField(t,`modelId`,e.target.value)}
74
74
  placeholder=${D(`modelIdPlaceholder`)}
75
75
  />
76
- ${n?x`
76
+ ${n?y`
77
77
  <div class="quickforge-settings-model-grid mt-3">
78
78
  <label class="quickforge-settings-form-row">
79
79
  <span class="quickforge-settings-form-label">${D(`contextWindow`)}</span>
@@ -126,7 +126,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
126
126
  </div>
127
127
  `:null}
128
128
  </div>
129
- ${this.form.models.length>1?x`
129
+ ${this.form.models.length>1?y`
130
130
  <button
131
131
  class="quickforge-settings-icon-action quickforge-settings-icon-action-danger"
132
132
  type="button"
@@ -137,15 +137,15 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
137
137
  </button>
138
138
  `:null}
139
139
  </div>
140
- `}renderHeadersEditor(){return x`
140
+ `}renderHeadersEditor(){return y`
141
141
  <div class="quickforge-settings-form-row">
142
142
  <span class="quickforge-settings-form-label">
143
143
  ${D(`customHeaders`)}
144
144
  <quickforge-info-tip .label=${D(`customHeadersHelp`)}></quickforge-info-tip>
145
145
  </span>
146
- ${this.form.headerRows.length===0?x``:x`
146
+ ${this.form.headerRows.length===0?y``:y`
147
147
  <div class="quickforge-settings-nested-list">
148
- ${this.form.headerRows.map((e,t)=>x`
148
+ ${this.form.headerRows.map((e,t)=>y`
149
149
  <div class="quickforge-settings-subrow">
150
150
  <input
151
151
  class="quickforge-settings-input"
@@ -179,7 +179,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
179
179
  + ${D(`addHeader`)}
180
180
  </button>
181
181
  </div>
182
- `}renderTestStatus(){return this.testResult===`idle`&&!this.testing?x``:this.testing?x`<span class="quickforge-settings-status">${D(`testingConnection`)}</span>`:this.testResult===`ok`?x`<span class="quickforge-settings-badge quickforge-settings-badge-success">✓ ${D(`connectionOk`)}</span>`:x`<span class="quickforge-settings-alert">✗ ${this.testError||D(`connectionFailed`)}</span>`}renderForm(){return x`
182
+ `}renderTestStatus(){return this.testResult===`idle`&&!this.testing?y``:this.testing?y`<span class="quickforge-settings-status">${D(`testingConnection`)}</span>`:this.testResult===`ok`?y`<span class="quickforge-settings-badge quickforge-settings-badge-success">✓ ${D(`connectionOk`)}</span>`:y`<span class="quickforge-settings-alert">✗ ${this.testError||D(`connectionFailed`)}</span>`}renderForm(){return y`
183
183
  <section class="quickforge-settings-section" aria-label=${this.editingProviderId?D(`editCustomModel`):D(`addCustomModel`)}>
184
184
  <div class="quickforge-settings-toolbar">
185
185
  <button
@@ -237,7 +237,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
237
237
  aria-pressed=${this.apiKeyVisible?`true`:`false`}
238
238
  @click=${()=>this.toggleApiKeyVisibility()}
239
239
  >
240
- ${this.apiKeyVisible?x`<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>`:x`<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>`}
240
+ ${this.apiKeyVisible?y`<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>`:y`<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>`}
241
241
  </button>
242
242
  </div>
243
243
  </label>
@@ -268,7 +268,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
268
268
  ${D(`providerAdvanced`)}
269
269
  </button>
270
270
 
271
- ${this.advancedOpen?x`
271
+ ${this.advancedOpen?y`
272
272
  <div class="quickforge-settings-form-grid rounded-lg border border-border p-3">
273
273
  <label class="quickforge-settings-form-row">
274
274
  <span class="quickforge-settings-form-label">
@@ -319,7 +319,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
319
319
  </div>
320
320
  </div>
321
321
  </section>
322
- `}render(){return this.formOpen?x`
322
+ `}render(){return this.formOpen?y`
323
323
  <div class="quickforge-settings-stack">
324
324
  <div class="quickforge-settings-heading">
325
325
  <h3 class="quickforge-settings-title">
@@ -329,7 +329,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
329
329
  </div>
330
330
  ${this.renderForm()}
331
331
  </div>
332
- `:x`
332
+ `:y`
333
333
  <div class="quickforge-settings-stack">
334
334
  <section class="quickforge-settings-section" aria-label=${D(`customModelsTitle`)}>
335
335
  <div class="quickforge-settings-toolbar">
@@ -346,10 +346,10 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
346
346
  </button>
347
347
  </div>
348
348
 
349
- ${this.loading?x`<div class="quickforge-settings-empty-row">${D(`loading`)}</div>`:this.providers.length===0?x`<div class="quickforge-settings-empty-row">${D(`noCustomModels`)}</div>`:this.providers.map(e=>this.renderProvider(e))}
349
+ ${this.loading?y`<div class="quickforge-settings-empty-row">${D(`loading`)}</div>`:this.providers.length===0?y`<div class="quickforge-settings-empty-row">${D(`noCustomModels`)}</div>`:this.providers.map(e=>this.renderProvider(e))}
350
350
  </section>
351
351
  </div>
352
- `}},L=`quickforge-custom-providers-only-tab`;customElements.get(L)||customElements.define(L,qe);function Je(e){let t=document.createElement(L);return e&&(t.autoEditProviderName=e),t}var Ye=[{value:`light`,label:()=>D(`lightTheme`)},{value:`dark`,label:()=>D(`darkTheme`)}],Xe=class extends S{theme=ke();interfaceFontSizePx=M.interfaceFontSizePx;messageFontSizePx=M.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=C(),[t,n]=await Promise.all([Le(e),Te(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 Ie(C(),{theme:e}),this.error=``,this.requestUpdate()}catch(e){this.error=e instanceof Error?e.message:D(`requestFailed`),this.requestUpdate()}}}currentFontSizeSettings(){return Ue({interfaceFontSizePx:this.interfaceFontSizePx,messageFontSizePx:this.messageFontSizePx})}previewFontSize(e){let t=Ue(e);this.interfaceFontSizePx=t.interfaceFontSizePx,this.messageFontSizePx=t.messageFontSizePx,fe(t),this.requestUpdate()}updateInterfaceFontSize(e){this.previewFontSize({...this.currentFontSizeSettings(),interfaceFontSizePx:Number(e)||M.interfaceFontSizePx})}updateMessageFontSize(e){this.previewFontSize({...this.currentFontSizeSettings(),messageFontSizePx:Number(e)||M.messageFontSizePx})}async saveFontSize(){try{await ye(C(),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 x`
352
+ `}},F=`quickforge-custom-providers-only-tab`;customElements.get(F)||customElements.define(F,Ye);function Xe(e){let t=document.createElement(F);return e&&(t.autoEditProviderName=e),t}var Ze=[{value:`light`,label:()=>D(`lightTheme`)},{value:`dark`,label:()=>D(`darkTheme`)}],Qe=class extends b{theme=Be();interfaceFontSizePx=A.interfaceFontSizePx;messageFontSizePx=A.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=x(),[t,n]=await Promise.all([ze(e),Ke(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 Ie(x(),{theme:e}),this.error=``,this.requestUpdate()}catch(e){this.error=e instanceof Error?e.message:D(`requestFailed`),this.requestUpdate()}}}currentFontSizeSettings(){return Te({interfaceFontSizePx:this.interfaceFontSizePx,messageFontSizePx:this.messageFontSizePx})}previewFontSize(e){let t=Te(e);this.interfaceFontSizePx=t.interfaceFontSizePx,this.messageFontSizePx=t.messageFontSizePx,Ge(t),this.requestUpdate()}updateInterfaceFontSize(e){this.previewFontSize({...this.currentFontSizeSettings(),interfaceFontSizePx:Number(e)||A.interfaceFontSizePx})}updateMessageFontSize(e){this.previewFontSize({...this.currentFontSizeSettings(),messageFontSizePx:Number(e)||A.messageFontSizePx})}async saveFontSize(){try{await ge(x(),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 y`
353
353
  <button
354
354
  type="button"
355
355
  class="quickforge-settings-segmented-option ${t?`quickforge-settings-segmented-option-active`:``}"
@@ -358,12 +358,12 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
358
358
  >
359
359
  ${e.label()}
360
360
  </button>
361
- `}getFontSizeRangeProgress(e){return(e-j.min)/(j.max-j.min)*100}renderFontSizeSlider(e,t,n,r){return x`
361
+ `}getFontSizeRangeProgress(e){return(e-k.min)/(k.max-k.min)*100}renderFontSizeSlider(e,t,n,r){return y`
362
362
  <div class="quickforge-settings-row">
363
363
  <div class="quickforge-settings-row-main">
364
364
  <div class="quickforge-settings-row-title">
365
365
  ${e}
366
- ${t?x`<quickforge-info-tip .label=${t}></quickforge-info-tip>`:null}
366
+ ${t?y`<quickforge-info-tip .label=${t}></quickforge-info-tip>`:null}
367
367
  </div>
368
368
  <div class="quickforge-settings-row-description">${D(`fontSizeRangeDescription`)}</div>
369
369
  </div>
@@ -373,8 +373,8 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
373
373
  class="quickforge-font-size-slider"
374
374
  style=${`--quickforge-font-size-slider-progress: ${this.getFontSizeRangeProgress(n)}%`}
375
375
  type="range"
376
- min=${String(j.min)}
377
- max=${String(j.max)}
376
+ min=${String(k.min)}
377
+ max=${String(k.max)}
378
378
  step="1"
379
379
  .value=${String(n)}
380
380
  @input=${e=>r(e.target.value)}
@@ -382,7 +382,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
382
382
  />
383
383
  </div>
384
384
  </div>
385
- `}render(){return this.loading?x`<div class="text-sm text-muted-foreground">${D(`loading`)}</div>`:x`
385
+ `}render(){return this.loading?y`<div class="text-sm text-muted-foreground">${D(`loading`)}</div>`:y`
386
386
  <div class="quickforge-settings-stack">
387
387
  <section class="quickforge-settings-section" aria-label=${D(`appearance`)}>
388
388
  <div class="quickforge-settings-row">
@@ -395,7 +395,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
395
395
  </div>
396
396
  <div class="quickforge-settings-row-control">
397
397
  <div class="quickforge-settings-segmented" role="group" aria-label=${D(`theme`)}>
398
- ${Ye.map(e=>this.renderThemeOption(e))}
398
+ ${Ze.map(e=>this.renderThemeOption(e))}
399
399
  </div>
400
400
  </div>
401
401
  </div>
@@ -405,11 +405,11 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
405
405
  ${this.renderFontSizeSlider(D(`messageFontSize`),D(`messageFontSizeNote`),this.messageFontSizePx,e=>this.updateMessageFontSize(e))}
406
406
  </section>
407
407
 
408
- ${this.error?x`<span class="quickforge-settings-error">${this.error}</span>`:null}
408
+ ${this.error?y`<span class="quickforge-settings-error">${this.error}</span>`:null}
409
409
  </div>
410
- `}},R=`quickforge-appearance-settings-tab`;customElements.get(R)||customElements.define(R,Xe);function Ze(){return document.createElement(R)}var Qe=`auto-compact-settings`,z={enabled:!0,thresholdPercent:80,keepRecentTurns:3,minSourceChars:1600,requireConfirmation:!0};function B(e,t,n,r){let i=Number(e);return Number.isFinite(i)?Math.min(r,Math.max(n,Math.round(i))):t}function $e(e){if(!e||typeof e!=`object`)return{...z};let t=e;return{enabled:t.enabled!==!1,thresholdPercent:B(t.thresholdPercent,z.thresholdPercent,50,95),keepRecentTurns:B(t.keepRecentTurns,z.keepRecentTurns,1,20),minSourceChars:B(t.minSourceChars,z.minSourceChars,0,2e5),requireConfirmation:t.requireConfirmation!==!1}}async function et(e){return $e(await e.settings.get(Qe))}async function tt(e,t){await e.settings.set(Qe,$e(t))}var nt=`auto-archive-settings`,rt={enabled:!1};function it(e){return!e||typeof e!=`object`?{...rt}:{enabled:e.enabled===!0}}async function at(e){return it(await e.settings.get(nt))}async function ot(e,t){await e.settings.set(nt,it(t))}var st=0,ct=class extends oe{static properties={value:{type:String},placeholder:{type:String},options:{type:Array},disabled:{type:Boolean},label:{type:String},searchable:{type:Boolean},searchPlaceholder:{type:String},noResultsLabel:{type:String}};value=``;placeholder=``;options=[];disabled=!1;label=``;searchable=!1;searchPlaceholder=``;noResultsLabel=``;triggerRef=se();searchRef=se();_menu=null;_menuId=`quickforge-settings-select-menu-${++st}`;_listboxId=`quickforge-settings-select-listbox-${++st}`;_open=!1;_searchQuery=``;focusedIndex=-1;createRenderRoot(){return this}render(){let e=this.options.find(e=>e.value===this.value);return x`
410
+ `}},$e=`quickforge-appearance-settings-tab`;customElements.get($e)||customElements.define($e,Qe);function et(){return document.createElement($e)}var tt=`auto-compact-settings`,I={enabled:!0,thresholdPercent:80,keepRecentTurns:3,minSourceChars:1600,requireConfirmation:!0};function L(e,t,n,r){let i=Number(e);return Number.isFinite(i)?Math.min(r,Math.max(n,Math.round(i))):t}function nt(e){if(!e||typeof e!=`object`)return{...I};let t=e;return{enabled:t.enabled!==!1,thresholdPercent:L(t.thresholdPercent,I.thresholdPercent,50,95),keepRecentTurns:L(t.keepRecentTurns,I.keepRecentTurns,1,20),minSourceChars:L(t.minSourceChars,I.minSourceChars,0,2e5),requireConfirmation:t.requireConfirmation!==!1}}async function rt(e){return nt(await e.settings.get(tt))}async function it(e,t){await e.settings.set(tt,nt(t))}var at=`auto-archive-settings`,ot={enabled:!1};function st(e){return!e||typeof e!=`object`?{...ot}:{enabled:e.enabled===!0}}async function ct(e){return st(await e.settings.get(at))}async function lt(e,t){await e.settings.set(at,st(t))}var ut=0,dt=class extends ce{static properties={value:{type:String},placeholder:{type:String},options:{type:Array},disabled:{type:Boolean},label:{type:String},searchable:{type:Boolean},searchPlaceholder:{type:String},noResultsLabel:{type:String}};value=``;placeholder=``;options=[];disabled=!1;label=``;searchable=!1;searchPlaceholder=``;noResultsLabel=``;triggerRef=le();searchRef=le();_menu=null;_menuId=`quickforge-settings-select-menu-${++ut}`;_listboxId=`quickforge-settings-select-listbox-${++ut}`;_open=!1;_searchQuery=``;focusedIndex=-1;createRenderRoot(){return this}render(){let e=this.options.find(e=>e.value===this.value);return y`
411
411
  <button
412
- ${ie(this.triggerRef)}
412
+ ${oe(this.triggerRef)}
413
413
  type="button"
414
414
  class="quickforge-settings-select quickforge-settings-select-button quickforge-settings-select-trigger"
415
415
  role="combobox"
@@ -425,11 +425,11 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
425
425
  <span class="quickforge-settings-select-trigger-label">${e?e.label:this.placeholder}</span>
426
426
  <span class="quickforge-settings-select-chevron" aria-hidden="true">▾</span>
427
427
  </button>
428
- `}updated(){this._refreshMenu()}disconnectedCallback(){super.disconnectedCallback(),this._close()}_toggle=()=>{this.disabled||(this._open?this._close(!0):this._openMenu())};_handleTriggerKeyDown=e=>{if(this.disabled||this._open)return;let t;switch(e.key){case`ArrowDown`:case`Home`:t=this._selectableIndexes()[0]??-1;break;case`ArrowUp`:case`End`:{let e=this._selectableIndexes();t=e[e.length-1]??-1;break}default:return}e.preventDefault(),this._openMenu(t)};_openMenu(e){if(this.disabled||this._open||!this.triggerRef.value)return;let t=this._selectableIndexes(),n=this.options.findIndex(e=>e.value===this.value);this.focusedIndex=e===void 0?n>=0&&!this.options[n].disabled?n:t[0]??-1:e,this._open=!0,this._attachMenu(),document.addEventListener(`pointerdown`,this._handlePointerDown,!0),document.addEventListener(`keydown`,this._handleKeyDown),window.addEventListener(`scroll`,this._reposition,!0),window.addEventListener(`resize`,this._reposition),this.requestUpdate(),this.searchable&&this.searchRef.value?.focus(),this._scrollFocusedIntoView()}_close(e=!1){this._open&&(this._open=!1,this.focusedIndex=-1,this._searchQuery=``,this._removeMenu(),document.removeEventListener(`pointerdown`,this._handlePointerDown,!0),document.removeEventListener(`keydown`,this._handleKeyDown),window.removeEventListener(`scroll`,this._reposition,!0),window.removeEventListener(`resize`,this._reposition),e&&this.triggerRef.value?.focus(),this.requestUpdate())}_select(e){this._close(!0),this.dispatchEvent(new CustomEvent(`change`,{detail:e,bubbles:!0,composed:!0}))}_selectFocused(){let e=this.options[this.focusedIndex];e&&!e.disabled&&this._select(e.value)}_isVisible(e){if(!this.searchable)return!0;let t=this._searchQuery.trim().toLowerCase();return t?e.label.toLowerCase().includes(t):!0}_selectableIndexes(){return this.options.map((e,t)=>!e.disabled&&this._isVisible(e)?t:-1).filter(e=>e>=0)}_moveFocus(e){let t=this._selectableIndexes();if(t.length===0)return;let n=t.indexOf(this.focusedIndex),r=n>=0?n:e>0?-1:0,i=Math.max(0,Math.min(t.length-1,r+e));this.focusedIndex=t[i],this._scrollFocusedIntoView()}_attachMenu(){if(this._removeMenu(),!this.triggerRef.value)return;let e=document.createElement(`div`);e.className=`quickforge-settings-select-menu`,e.id=this._menuId,document.body.appendChild(e),this._menu=e,this._renderMenuItems(),this._reposition()}_removeMenu(){this._menu&&=(this._menu.remove(),null)}_renderMenuItems(){this._menu&&ae(this._menuTemplate(),this._menu)}_rerenderMenuItems(){this._open&&this._menu&&this._renderMenuItems()}_refreshMenu(){if(!this._open||!this._menu)return;let e=this._selectableIndexes();e.includes(this.focusedIndex)||(this.focusedIndex=e[0]??-1),this._renderMenuItems(),this._reposition()}_reposition=()=>{let e=this._menu,t=this.triggerRef.value;if(!e||!t)return;let n=t.getBoundingClientRect(),r=Math.min(300,e.offsetHeight||300),i=window.innerHeight-n.bottom,a=n.top,o=i-6<r&&a>i,s=Math.max(0,(o?a:i)-6-8);e.style.top=o?`auto`:`${Math.round(n.bottom+6)}px`,e.style.bottom=o?`${Math.round(window.innerHeight-n.top+6)}px`:`auto`,e.style.maxHeight=`${Math.max(120,Math.min(300,s))}px`,e.style.minWidth=`max(12rem, ${Math.round(n.width)}px)`;let c=e.offsetWidth,ee=Math.max(8,Math.min(n.left,window.innerWidth-c-8));e.style.left=`${Math.round(ee)}px`};_optionId(e){return`${this._listboxId}-option-${e}`}_focusedOptionId(){return this.focusedIndex>=0?this._optionId(this.focusedIndex):void 0}_isSearchFocused(){return this.searchable&&document.activeElement===this.searchRef.value}_scrollFocusedIntoView(){let e=this._menu;if(!e||this.focusedIndex<0)return;let t=e.querySelector(`.quickforge-settings-select-listbox`),n=e.querySelector(`[id="${this._optionId(this.focusedIndex)}"]`);if(!t||!n)return;let r=t.getBoundingClientRect(),i=n.getBoundingClientRect();i.top<r.top?t.scrollTop-=r.top-i.top:i.bottom>r.bottom&&(t.scrollTop+=i.bottom-r.bottom)}_menuTemplate(){let e=this._focusedOptionId(),t=this.options.filter(e=>this._isVisible(e)).length;return x`
429
- ${this.searchable?x`
428
+ `}updated(){this._refreshMenu()}disconnectedCallback(){super.disconnectedCallback(),this._close()}_toggle=()=>{this.disabled||(this._open?this._close(!0):this._openMenu())};_handleTriggerKeyDown=e=>{if(this.disabled||this._open)return;let t;switch(e.key){case`ArrowDown`:case`Home`:t=this._selectableIndexes()[0]??-1;break;case`ArrowUp`:case`End`:{let e=this._selectableIndexes();t=e[e.length-1]??-1;break}default:return}e.preventDefault(),this._openMenu(t)};_openMenu(e){if(this.disabled||this._open||!this.triggerRef.value)return;let t=this._selectableIndexes(),n=this.options.findIndex(e=>e.value===this.value);this.focusedIndex=e===void 0?n>=0&&!this.options[n].disabled?n:t[0]??-1:e,this._open=!0,this._attachMenu(),document.addEventListener(`pointerdown`,this._handlePointerDown,!0),document.addEventListener(`keydown`,this._handleKeyDown),window.addEventListener(`scroll`,this._reposition,!0),window.addEventListener(`resize`,this._reposition),this.requestUpdate(),this.searchable&&this.searchRef.value?.focus(),this._scrollFocusedIntoView()}_close(e=!1){this._open&&(this._open=!1,this.focusedIndex=-1,this._searchQuery=``,this._removeMenu(),document.removeEventListener(`pointerdown`,this._handlePointerDown,!0),document.removeEventListener(`keydown`,this._handleKeyDown),window.removeEventListener(`scroll`,this._reposition,!0),window.removeEventListener(`resize`,this._reposition),e&&this.triggerRef.value?.focus(),this.requestUpdate())}_select(e){this._close(!0),this.dispatchEvent(new CustomEvent(`change`,{detail:e,bubbles:!0,composed:!0}))}_selectFocused(){let e=this.options[this.focusedIndex];e&&!e.disabled&&this._select(e.value)}_isVisible(e){if(!this.searchable)return!0;let t=this._searchQuery.trim().toLowerCase();return t?e.label.toLowerCase().includes(t):!0}_selectableIndexes(){return this.options.map((e,t)=>!e.disabled&&this._isVisible(e)?t:-1).filter(e=>e>=0)}_moveFocus(e){let t=this._selectableIndexes();if(t.length===0)return;let n=t.indexOf(this.focusedIndex),r=n>=0?n:e>0?-1:0,i=Math.max(0,Math.min(t.length-1,r+e));this.focusedIndex=t[i],this._scrollFocusedIntoView()}_attachMenu(){if(this._removeMenu(),!this.triggerRef.value)return;let e=document.createElement(`div`);e.className=`quickforge-settings-select-menu`,e.id=this._menuId,document.body.appendChild(e),this._menu=e,this._renderMenuItems(),this._reposition()}_removeMenu(){this._menu&&=(this._menu.remove(),null)}_renderMenuItems(){this._menu&&se(this._menuTemplate(),this._menu)}_rerenderMenuItems(){this._open&&this._menu&&this._renderMenuItems()}_refreshMenu(){if(!this._open||!this._menu)return;let e=this._selectableIndexes();e.includes(this.focusedIndex)||(this.focusedIndex=e[0]??-1),this._renderMenuItems(),this._reposition()}_reposition=()=>{let e=this._menu,t=this.triggerRef.value;if(!e||!t)return;let n=t.getBoundingClientRect(),r=Math.min(300,e.offsetHeight||300),i=window.innerHeight-n.bottom,a=n.top,o=i-6<r&&a>i,s=Math.max(0,(o?a:i)-6-8);e.style.top=o?`auto`:`${Math.round(n.bottom+6)}px`,e.style.bottom=o?`${Math.round(window.innerHeight-n.top+6)}px`:`auto`,e.style.maxHeight=`${Math.max(120,Math.min(300,s))}px`,e.style.minWidth=`max(12rem, ${Math.round(n.width)}px)`;let c=e.offsetWidth,ee=Math.max(8,Math.min(n.left,window.innerWidth-c-8));e.style.left=`${Math.round(ee)}px`};_optionId(e){return`${this._listboxId}-option-${e}`}_focusedOptionId(){return this.focusedIndex>=0?this._optionId(this.focusedIndex):void 0}_isSearchFocused(){return this.searchable&&document.activeElement===this.searchRef.value}_scrollFocusedIntoView(){let e=this._menu;if(!e||this.focusedIndex<0)return;let t=e.querySelector(`.quickforge-settings-select-listbox`),n=e.querySelector(`[id="${this._optionId(this.focusedIndex)}"]`);if(!t||!n)return;let r=t.getBoundingClientRect(),i=n.getBoundingClientRect();i.top<r.top?t.scrollTop-=r.top-i.top:i.bottom>r.bottom&&(t.scrollTop+=i.bottom-r.bottom)}_menuTemplate(){let e=this._focusedOptionId(),t=this.options.filter(e=>this._isVisible(e)).length;return y`
429
+ ${this.searchable?y`
430
430
  <div class="quickforge-settings-select-search">
431
431
  <input
432
- ${ie(this.searchRef)}
432
+ ${oe(this.searchRef)}
433
433
  class="quickforge-settings-select-search-input"
434
434
  type="text"
435
435
  role="searchbox"
@@ -448,7 +448,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
448
448
  role="listbox"
449
449
  aria-label=${this.label}
450
450
  >
451
- ${this.options.map((e,t)=>{if(!this._isVisible(e))return ce;let n=e.value===this.value,r=this.focusedIndex===t;return x`
451
+ ${this.options.map((e,t)=>{if(!this._isVisible(e))return ue;let n=e.value===this.value,r=this.focusedIndex===t;return y`
452
452
  <div
453
453
  id=${this._optionId(t)}
454
454
  role="option"
@@ -459,20 +459,20 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
459
459
  @click=${()=>{e.disabled||this._select(e.value)}}
460
460
  >
461
461
  <span class="quickforge-settings-select-option-label">${e.label}</span>
462
- ${n?x`
462
+ ${n?y`
463
463
  <svg class="quickforge-settings-select-option-check" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"></polyline></svg>
464
464
  `:``}
465
465
  </div>
466
466
  `})}
467
467
  </div>
468
- ${this.searchable&&t===0?x`
468
+ ${this.searchable&&t===0?y`
469
469
  <div class="quickforge-settings-select-no-results" role="status">${this.noResultsLabel}</div>
470
470
  `:``}
471
- `}_handleSearchInput=e=>{let t=e.target;this._searchQuery=t.value,this._rerenderMenuItems();let n=this._selectableIndexes();n.includes(this.focusedIndex)||(this.focusedIndex=n[0]??-1),this._reposition(),this._scrollFocusedIntoView()};_handlePointerDown=e=>{let t=e.target;t&&(this.contains(t)||this._menu?.contains(t)||this._close(!0))};_handleKeyDown=e=>{if(!(!this._open||e.isComposing))switch(e.key){case`ArrowDown`:e.preventDefault(),this._moveFocus(1),this._rerenderMenuItems();break;case`ArrowUp`:e.preventDefault(),this._moveFocus(-1),this._rerenderMenuItems();break;case`Home`:{e.preventDefault();let t=this._selectableIndexes();this.focusedIndex=t[0]??-1,this._rerenderMenuItems(),this._scrollFocusedIntoView();break}case`End`:{e.preventDefault();let t=this._selectableIndexes();this.focusedIndex=t[t.length-1]??-1,this._rerenderMenuItems(),this._scrollFocusedIntoView();break}case`Enter`:e.preventDefault(),this._selectFocused();break;case` `:if(this._isSearchFocused())break;e.preventDefault(),this._selectFocused();break;case`Escape`:e.preventDefault(),this._close(!0);break;case`Tab`:this._close(),this.triggerRef.value?.focus();break}}},lt=`quickforge-settings-select`;customElements.get(lt)||customElements.define(lt,ct);var ut=[{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`)}],dt=[{value:`compact`,label:()=>D(`toolDisplayCompact`)},{value:`detailed`,label:()=>D(`toolDisplayDetailed`)}],V=`__custom__`;function ft(e){return(e??``).trim().replace(/\/$/,``)}function H(e){return JSON.stringify([e.provider,e.id,e.api,ft(e.baseUrl)])}function pt(){return`custom_${globalThis.crypto?.randomUUID?.().slice(0,8)||Date.now().toString(36)}`}function mt(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 ht=x`
471
+ `}_handleSearchInput=e=>{let t=e.target;this._searchQuery=t.value,this._rerenderMenuItems();let n=this._selectableIndexes();n.includes(this.focusedIndex)||(this.focusedIndex=n[0]??-1),this._reposition(),this._scrollFocusedIntoView()};_handlePointerDown=e=>{let t=e.target;t&&(this.contains(t)||this._menu?.contains(t)||this._close(!0))};_handleKeyDown=e=>{if(!(!this._open||e.isComposing))switch(e.key){case`ArrowDown`:e.preventDefault(),this._moveFocus(1),this._rerenderMenuItems();break;case`ArrowUp`:e.preventDefault(),this._moveFocus(-1),this._rerenderMenuItems();break;case`Home`:{e.preventDefault();let t=this._selectableIndexes();this.focusedIndex=t[0]??-1,this._rerenderMenuItems(),this._scrollFocusedIntoView();break}case`End`:{e.preventDefault();let t=this._selectableIndexes();this.focusedIndex=t[t.length-1]??-1,this._rerenderMenuItems(),this._scrollFocusedIntoView();break}case`Enter`:e.preventDefault(),this._selectFocused();break;case` `:if(this._isSearchFocused())break;e.preventDefault(),this._selectFocused();break;case`Escape`:e.preventDefault(),this._close(!0);break;case`Tab`:this._close(),this.triggerRef.value?.focus();break}}},ft=`quickforge-settings-select`;customElements.get(ft)||customElements.define(ft,dt);var pt=[{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`)}],mt=[{value:`compact`,label:()=>D(`toolDisplayCompact`)},{value:`detailed`,label:()=>D(`toolDisplayDetailed`)}],R=`__custom__`;function ht(e){return(e??``).trim().replace(/\/$/,``)}function z(e){return JSON.stringify([e.provider,e.id,e.api,ht(e.baseUrl)])}function gt(){return`custom_${globalThis.crypto?.randomUUID?.().slice(0,8)||Date.now().toString(36)}`}function _t(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 vt=y`
472
472
  <svg class="size-3.5" viewBox="0 0 16 16" fill="none" aria-hidden="true">
473
473
  <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" />
474
474
  </svg>
475
- `,gt=class extends S{models=[];selectedModel;harness=`quickforge`;savedHarness=`quickforge`;defaultOptionsSavePromise=Promise.resolve();thinkingLevel=`off`;toolDisplayMode=`compact`;showContextUsage=!1;autoCompactEnabled=!0;autoCompactRequireConfirmation=!0;autoCompactThresholdPercent=80;autoCompactThresholdPercentInput=`80`;autoCompactKeepRecentTurns=3;autoArchiveEnabled=!1;systemNotificationsEnabled=!1;systemNotificationPermission=`unsupported`;systemNotificationBusy=!1;selectedLanguage=pe();loading=!0;saved=!1;savedMessage=``;error=``;terminalShellConfig={terminalShell:`auto`,defaultProfileId:`auto`,profiles:[]};customShellCommand=``;customShellEditorOpen=!1;networkProxyMode=`direct`;networkProxyUrl=``;savedNetworkProxyConfig={mode:`direct`,proxyUrl:``};networkProxyStatus=null;networkProxySaving=!1;networkProxyLoaded=!1;getTabName(){return D(`defaultOptions`)}connectedCallback(){super.connectedCallback(),this.loadSettings(),window.addEventListener(be,this.handleCloudStateChanged)}disconnectedCallback(){window.removeEventListener(be,this.handleCloudStateChanged),super.disconnectedCallback?.()}handleCloudStateChanged=()=>{this.loadSettings()};async loadCloudModels(){try{let e=await xe();return!e.configured||e.enabled===!1||e.mode===`local`||!e.hasSession?[]:await me()}catch(e){return T.warn(`Failed to load QuickForge Cloud models for default options:`,e),[]}}async loadSettings(){this.loading=!0,this.error=``,this.requestUpdate();try{let e=C(),[t,n,r,i,a,o,s]=await Promise.all([Fe(e),le().catch(()=>[]),this.loadCloudModels(),Ae(e),Me(e),et(e),at(e)]),c=Se(n.length?n:t,r);this.models=c,this.selectedModel=i.model?c.find(e=>H(e)===H(i.model))??c[0]:c[0],this.thinkingLevel=i.thinkingLevel??Oe(this.selectedModel),this.harness=i.harness??`quickforge`,this.savedHarness=this.harness,this.toolDisplayMode=a.toolDisplayMode,this.showContextUsage=a.showContextUsage,this.autoCompactEnabled=o.enabled,this.autoCompactRequireConfirmation=o.requireConfirmation,this.autoCompactThresholdPercent=o.thresholdPercent,this.autoCompactThresholdPercentInput=String(o.thresholdPercent),this.autoCompactKeepRecentTurns=o.keepRecentTurns,this.autoArchiveEnabled=s.enabled,this.systemNotificationsEnabled=Ce(),this.systemNotificationPermission=await je(),this.systemNotificationsEnabled&&this.systemNotificationPermission!==`granted`&&(this.systemNotificationsEnabled=!1),await Promise.all([this.loadTerminalShell(),this.loadNetworkProxy()])}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=>H(t)===e);this.selectedModel=t,this.thinkingLevel=Oe(t),this.saved=!1,this.requestUpdate(),this.saveDefaultModelOptions()}updateHarness(e){this.harness=e===`opencode`?`opencode`:`quickforge`,this.saved=!1,this.requestUpdate(),this.saveDefaultModelOptions()}updateThinkingLevel(e){this.thinkingLevel=ut.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(C(),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()}async updateSystemNotifications(e){this.systemNotificationBusy=!0,this.saved=!1,this.error=``,this.requestUpdate();try{if(!e){Ee(!1),this.systemNotificationsEnabled=!1,this.markSaved(D(`systemNotificationsDisabled`));return}Ee(!0);let t=await Re();this.systemNotificationPermission=t,this.systemNotificationsEnabled=t===`granted`,t===`granted`?this.markSaved(D(`systemNotificationsEnabled`)):t===`denied`?this.error=D(`systemNotificationsDeniedHelp`):t===`unsupported`&&(this.error=D(`systemNotificationsUnsupported`))}catch(e){this.systemNotificationsEnabled=!1,this.error=e instanceof Error?e.message:D(`requestFailed`)}finally{this.systemNotificationBusy=!1,this.requestUpdate()}}async sendTestSystemNotification(){this.systemNotificationBusy=!0,this.error=``,this.requestUpdate();try{await Ne({key:`test:${Date.now()}`,title:D(`systemNotificationTestTitle`),status:`idle`,force:!0})||(this.error=D(`systemNotificationTestFailed`))}catch(e){this.error=e instanceof Error?e.message:D(`systemNotificationTestFailed`)}finally{this.systemNotificationBusy=!1,this.requestUpdate()}}systemNotificationStatusText(){return this.systemNotificationPermission===`unsupported`?D(`systemNotificationsUnsupported`):this.systemNotificationPermission===`denied`?D(`systemNotificationsPermissionDenied`):this.systemNotificationPermission===`granted`?D(`systemNotificationsPermissionGranted`):D(`systemNotificationsPermissionPrompt`)}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||V}updateTerminalShellSelection(e){if(e===V){this.customShellEditorOpen=!0,this.requestUpdate();return}this.customShellEditorOpen=!1,this.requestUpdate(),this.saveTerminalShellConfig(e)}async loadNetworkProxy(){try{let e=await fetch(`/api/system/network-proxy`,{cache:`no-store`}),t=await e.json().catch(()=>null);if(!e.ok)throw Error(t?.error||D(`requestFailed`));this.networkProxyMode=t?.config?.mode||`direct`,this.networkProxyUrl=t?.config?.proxyUrl||``,this.savedNetworkProxyConfig={mode:this.networkProxyMode,proxyUrl:this.networkProxyUrl},this.networkProxyStatus=t?.status||null,this.networkProxyLoaded=!0}catch(e){this.error=e instanceof Error?e.message:D(`requestFailed`)}}updateNetworkProxyMode(e){this.networkProxyMode===e||this.networkProxySaving||!this.networkProxyLoaded||e===`pac`&&this.networkProxyStatus?.features?.pacUrl!==!0||(this.networkProxyMode=e,this.saved=!1,this.error=``,this.requestUpdate(),!(e===`manual`||e===`pac`)&&this.saveNetworkProxy())}updateNetworkProxyUrl(e){this.networkProxyUrl=e,this.saved=!1,this.requestUpdate()}networkProxyValidationError(){let e=this.networkProxyUrl.trim(),t=this.networkProxyMode===`pac`;if(!e)return D(t?`networkProxyPacUrlRequired`:`networkProxyAddressRequired`);try{let n=new URL(e);return[`http:`,`https:`].includes(n.protocol)?n.hostname?!t&&!n.port?D(`networkProxyAddressPortError`):n.username||n.password?D(t?`networkProxyPacUrlCredentialsError`:`networkProxyAddressCredentialsError`):t&&n.hash?D(`networkProxyPacUrlFragmentError`):!t&&(n.pathname&&n.pathname!==`/`||n.search||n.hash)?D(`networkProxyAddressPathError`):``:D(t?`networkProxyPacUrlHostError`:`networkProxyAddressPortError`):D(t?`networkProxyPacUrlProtocolError`:`networkProxyAddressProtocolError`)}catch{return D(t?`networkProxyPacUrlInvalid`:`networkProxyAddressInvalid`)}}async saveNetworkProxy(){if(!(this.networkProxySaving||!this.networkProxyLoaded)){if(this.networkProxyMode===`pac`&&this.networkProxyStatus?.features?.pacUrl!==!0){this.saved=!1,this.error=D(`networkProxyPacUnsupported`),this.requestUpdate();return}if(this.networkProxyMode===`manual`||this.networkProxyMode===`pac`){let e=this.networkProxyValidationError();if(e){this.saved=!1,this.error=e,this.requestUpdate();return}}this.networkProxySaving=!0,this.saved=!1,this.error=``,this.requestUpdate();try{let e=await fetch(`/api/system/network-proxy`,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify({mode:this.networkProxyMode,proxyUrl:this.networkProxyUrl})}),t=await e.json().catch(()=>null);if(!e.ok)throw Error(t?.error||D(`requestFailed`));this.networkProxyMode=t?.config?.mode||this.networkProxyMode,this.networkProxyUrl=t?.config?.proxyUrl||``,this.savedNetworkProxyConfig={mode:this.networkProxyMode,proxyUrl:this.networkProxyUrl},this.networkProxyStatus=t?.status||null,this.markSaved(D(`networkProxySaved`))}catch(e){this.networkProxyMode=this.savedNetworkProxyConfig.mode,this.networkProxyUrl=this.savedNetworkProxyConfig.proxyUrl,this.saved=!1,this.error=e instanceof Error?e.message:D(`requestFailed`)}finally{this.networkProxySaving=!1,this.requestUpdate()}}}async refreshNetworkProxy(){if(!(this.networkProxySaving||!this.networkProxyLoaded)){this.networkProxySaving=!0,this.saved=!1,this.error=``,this.requestUpdate();try{let e=await fetch(`/api/system/network-proxy/refresh`,{method:`POST`}),t=await e.json().catch(()=>null);if(!e.ok)throw Error(t?.error||D(`requestFailed`));this.networkProxyStatus=t?.status||null,this.markSaved(D(`networkProxyRefreshed`))}catch(e){this.error=e instanceof Error?e.message:D(`requestFailed`)}finally{this.networkProxySaving=!1,this.requestUpdate()}}}renderNetworkProxyModeOption(e,t){let n=this.networkProxyMode===e,r=e===`pac`&&this.networkProxyStatus?.features?.pacUrl!==!0;return x`
475
+ `,yt=class extends b{models=[];selectedModel;harness=`quickforge`;savedHarness=`quickforge`;defaultOptionsSavePromise=Promise.resolve();thinkingLevel=`off`;toolDisplayMode=`compact`;showContextUsage=!1;autoCompactEnabled=!0;autoCompactRequireConfirmation=!0;autoCompactThresholdPercent=80;autoCompactThresholdPercentInput=`80`;autoCompactKeepRecentTurns=3;autoArchiveEnabled=!1;systemNotificationsEnabled=!1;systemNotificationPermission=`unsupported`;systemNotificationBusy=!1;selectedLanguage=De();loading=!0;saved=!1;savedMessage=``;error=``;terminalShellConfig={terminalShell:`auto`,defaultProfileId:`auto`,profiles:[]};customShellCommand=``;customShellEditorOpen=!1;networkProxyMode=`direct`;networkProxyUrl=``;savedNetworkProxyConfig={mode:`direct`,proxyUrl:``};networkProxyStatus=null;networkProxySaving=!1;networkProxyLoaded=!1;getTabName(){return D(`defaultOptions`)}connectedCallback(){super.connectedCallback(),this.loadSettings(),window.addEventListener(Oe,this.handleCloudStateChanged)}disconnectedCallback(){window.removeEventListener(Oe,this.handleCloudStateChanged),super.disconnectedCallback?.()}handleCloudStateChanged=()=>{this.loadSettings()};async loadCloudModels(){try{let e=await Ae();return!e.configured||e.enabled===!1||e.mode===`local`||!e.hasSession?[]:await ke()}catch(e){return C.warn(`Failed to load QuickForge Cloud models for default options:`,e),[]}}async loadSettings(){this.loading=!0,this.error=``,this.requestUpdate();try{let e=x(),[t,n,r,i,a,o,s]=await Promise.all([Me(e),de().catch(()=>[]),this.loadCloudModels(),we(e),ye(e),rt(e),ct(e)]),c=he(n.length?n:t,r);this.models=c,this.selectedModel=i.model?c.find(e=>z(e)===z(i.model))??c[0]:c[0],this.thinkingLevel=i.thinkingLevel??Ue(this.selectedModel),this.harness=i.harness??`quickforge`,this.savedHarness=this.harness,this.toolDisplayMode=a.toolDisplayMode,this.showContextUsage=a.showContextUsage,this.autoCompactEnabled=o.enabled,this.autoCompactRequireConfirmation=o.requireConfirmation,this.autoCompactThresholdPercent=o.thresholdPercent,this.autoCompactThresholdPercentInput=String(o.thresholdPercent),this.autoCompactKeepRecentTurns=o.keepRecentTurns,this.autoArchiveEnabled=s.enabled,this.systemNotificationsEnabled=je(),this.systemNotificationPermission=await Le(),this.systemNotificationsEnabled&&this.systemNotificationPermission!==`granted`&&(this.systemNotificationsEnabled=!1),await Promise.all([this.loadTerminalShell(),this.loadNetworkProxy()])}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=>z(t)===e);this.selectedModel=t,this.thinkingLevel=Ue(t),this.saved=!1,this.requestUpdate(),this.saveDefaultModelOptions()}updateHarness(e){this.harness=e===`opencode`?`opencode`:`quickforge`,this.saved=!1,this.requestUpdate(),this.saveDefaultModelOptions()}updateThinkingLevel(e){this.thinkingLevel=pt.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 me(x(),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()}async updateSystemNotifications(e){this.systemNotificationBusy=!0,this.saved=!1,this.error=``,this.requestUpdate();try{if(!e){Ne(!1),this.systemNotificationsEnabled=!1,this.markSaved(D(`systemNotificationsDisabled`));return}Ne(!0);let t=await Ve();this.systemNotificationPermission=t,this.systemNotificationsEnabled=t===`granted`,t===`granted`?this.markSaved(D(`systemNotificationsEnabled`)):t===`denied`?this.error=D(`systemNotificationsDeniedHelp`):t===`unsupported`&&(this.error=D(`systemNotificationsUnsupported`))}catch(e){this.systemNotificationsEnabled=!1,this.error=e instanceof Error?e.message:D(`requestFailed`)}finally{this.systemNotificationBusy=!1,this.requestUpdate()}}async sendTestSystemNotification(){this.systemNotificationBusy=!0,this.error=``,this.requestUpdate();try{await Re({key:`test:${Date.now()}`,title:D(`systemNotificationTestTitle`),status:`idle`,force:!0})||(this.error=D(`systemNotificationTestFailed`))}catch(e){this.error=e instanceof Error?e.message:D(`systemNotificationTestFailed`)}finally{this.systemNotificationBusy=!1,this.requestUpdate()}}systemNotificationStatusText(){return this.systemNotificationPermission===`unsupported`?D(`systemNotificationsUnsupported`):this.systemNotificationPermission===`denied`?D(`systemNotificationsPermissionDenied`):this.systemNotificationPermission===`granted`?D(`systemNotificationsPermissionGranted`):D(`systemNotificationsPermissionPrompt`)}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||R}updateTerminalShellSelection(e){if(e===R){this.customShellEditorOpen=!0,this.requestUpdate();return}this.customShellEditorOpen=!1,this.requestUpdate(),this.saveTerminalShellConfig(e)}async loadNetworkProxy(){try{let e=await fetch(`/api/system/network-proxy`,{cache:`no-store`}),t=await e.json().catch(()=>null);if(!e.ok)throw Error(t?.error||D(`requestFailed`));this.networkProxyMode=t?.config?.mode||`direct`,this.networkProxyUrl=t?.config?.proxyUrl||``,this.savedNetworkProxyConfig={mode:this.networkProxyMode,proxyUrl:this.networkProxyUrl},this.networkProxyStatus=t?.status||null,this.networkProxyLoaded=!0}catch(e){this.error=e instanceof Error?e.message:D(`requestFailed`)}}updateNetworkProxyMode(e){this.networkProxyMode===e||this.networkProxySaving||!this.networkProxyLoaded||e===`pac`&&this.networkProxyStatus?.features?.pacUrl!==!0||(this.networkProxyMode=e,this.saved=!1,this.error=``,this.requestUpdate(),!(e===`manual`||e===`pac`)&&this.saveNetworkProxy())}updateNetworkProxyUrl(e){this.networkProxyUrl=e,this.saved=!1,this.requestUpdate()}networkProxyValidationError(){let e=this.networkProxyUrl.trim(),t=this.networkProxyMode===`pac`;if(!e)return D(t?`networkProxyPacUrlRequired`:`networkProxyAddressRequired`);try{let n=new URL(e);return[`http:`,`https:`].includes(n.protocol)?n.hostname?!t&&!n.port?D(`networkProxyAddressPortError`):n.username||n.password?D(t?`networkProxyPacUrlCredentialsError`:`networkProxyAddressCredentialsError`):t&&n.hash?D(`networkProxyPacUrlFragmentError`):!t&&(n.pathname&&n.pathname!==`/`||n.search||n.hash)?D(`networkProxyAddressPathError`):``:D(t?`networkProxyPacUrlHostError`:`networkProxyAddressPortError`):D(t?`networkProxyPacUrlProtocolError`:`networkProxyAddressProtocolError`)}catch{return D(t?`networkProxyPacUrlInvalid`:`networkProxyAddressInvalid`)}}async saveNetworkProxy(){if(!(this.networkProxySaving||!this.networkProxyLoaded)){if(this.networkProxyMode===`pac`&&this.networkProxyStatus?.features?.pacUrl!==!0){this.saved=!1,this.error=D(`networkProxyPacUnsupported`),this.requestUpdate();return}if(this.networkProxyMode===`manual`||this.networkProxyMode===`pac`){let e=this.networkProxyValidationError();if(e){this.saved=!1,this.error=e,this.requestUpdate();return}}this.networkProxySaving=!0,this.saved=!1,this.error=``,this.requestUpdate();try{let e=await fetch(`/api/system/network-proxy`,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify({mode:this.networkProxyMode,proxyUrl:this.networkProxyUrl})}),t=await e.json().catch(()=>null);if(!e.ok)throw Error(t?.error||D(`requestFailed`));this.networkProxyMode=t?.config?.mode||this.networkProxyMode,this.networkProxyUrl=t?.config?.proxyUrl||``,this.savedNetworkProxyConfig={mode:this.networkProxyMode,proxyUrl:this.networkProxyUrl},this.networkProxyStatus=t?.status||null,this.markSaved(D(`networkProxySaved`))}catch(e){this.networkProxyMode=this.savedNetworkProxyConfig.mode,this.networkProxyUrl=this.savedNetworkProxyConfig.proxyUrl,this.saved=!1,this.error=e instanceof Error?e.message:D(`requestFailed`)}finally{this.networkProxySaving=!1,this.requestUpdate()}}}async refreshNetworkProxy(){if(!(this.networkProxySaving||!this.networkProxyLoaded)){this.networkProxySaving=!0,this.saved=!1,this.error=``,this.requestUpdate();try{let e=await fetch(`/api/system/network-proxy/refresh`,{method:`POST`}),t=await e.json().catch(()=>null);if(!e.ok)throw Error(t?.error||D(`requestFailed`));this.networkProxyStatus=t?.status||null,this.markSaved(D(`networkProxyRefreshed`))}catch(e){this.error=e instanceof Error?e.message:D(`requestFailed`)}finally{this.networkProxySaving=!1,this.requestUpdate()}}}renderNetworkProxyModeOption(e,t){let n=this.networkProxyMode===e,r=e===`pac`&&this.networkProxyStatus?.features?.pacUrl!==!0;return y`
476
476
  <button
477
477
  type="button"
478
478
  class="quickforge-settings-segmented-option ${n?`quickforge-settings-segmented-option-active`:``}"
@@ -483,7 +483,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
483
483
  >
484
484
  ${t}
485
485
  </button>
486
- `}networkProxySettings(){let e=this.networkProxyMode===`manual`||this.networkProxyMode===`pac`,t=this.networkProxyMode===`pac`&&this.networkProxyStatus?.features?.pacUrl!==!0,n=e?this.networkProxyValidationError():``,r=e&&(this.networkProxyUrl!==this.savedNetworkProxyConfig.proxyUrl||this.savedNetworkProxyConfig.mode!==this.networkProxyMode),i=this.networkProxyLoaded?t?D(`networkProxyPacUnsupported`):this.networkProxyStatus?.supported===!1?this.networkProxyStatus.error||D(`networkProxyUnsupported`):D(`networkProxyStatus`,{source:this.networkProxyStatus?.source||D(`unknown`),runtime:this.networkProxyStatus?.runtimeKind||D(`unknown`)}):D(`networkProxyLoadFailed`);return x`
486
+ `}networkProxySettings(){let e=this.networkProxyMode===`manual`||this.networkProxyMode===`pac`,t=this.networkProxyMode===`pac`&&this.networkProxyStatus?.features?.pacUrl!==!0,n=e?this.networkProxyValidationError():``,r=e&&(this.networkProxyUrl!==this.savedNetworkProxyConfig.proxyUrl||this.savedNetworkProxyConfig.mode!==this.networkProxyMode),i=this.networkProxyLoaded?t?D(`networkProxyPacUnsupported`):this.networkProxyStatus?.supported===!1?this.networkProxyStatus.error||D(`networkProxyUnsupported`):D(`networkProxyStatus`,{source:this.networkProxyStatus?.source||D(`unknown`),runtime:this.networkProxyStatus?.runtimeKind||D(`unknown`)}):D(`networkProxyLoadFailed`);return y`
487
487
  <section class="quickforge-settings-section" aria-label=${D(`networkConnection`)}>
488
488
  <div class="quickforge-settings-row">
489
489
  <div class="quickforge-settings-row-main">
@@ -503,7 +503,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
503
503
  </div>
504
504
  </div>
505
505
 
506
- ${e?x`
506
+ ${e?y`
507
507
  <div class="quickforge-settings-row">
508
508
  <div class="quickforge-settings-row-main">
509
509
  <div class="quickforge-settings-row-title">
@@ -538,7 +538,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
538
538
  </div>
539
539
  `:null}
540
540
 
541
- ${this.networkProxyMode===`system`?x`
541
+ ${this.networkProxyMode===`system`?y`
542
542
  <div class="quickforge-settings-row">
543
543
  <div class="quickforge-settings-row-main">
544
544
  <div class="quickforge-settings-row-title">${D(`networkProxyRefresh`)}</div>
@@ -557,7 +557,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
557
557
  </div>
558
558
  `:null}
559
559
  </section>
560
- `}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:pt(),name:mt(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 k({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(){let e=this.selectedModel,t=e?.reasoning?this.thinkingLevel:`off`,n=this.harness,r=async()=>{try{await We(C(),{model:e,thinkingLevel:t,harness:n}),this.savedHarness!==n&&(_e(n),this.savedHarness=n),this.markSaved()}catch(e){this.error=e instanceof Error?e.message:D(`requestFailed`),this.requestUpdate()}};this.defaultOptionsSavePromise=this.defaultOptionsSavePromise.then(r,r),await this.defaultOptionsSavePromise}async saveToolDisplayOptions(){try{await ge(C(),{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 tt(C(),{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 ot(C(),{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(){return this.models}languageOptions(){return[{value:`zh`,label:D(`simplifiedChinese`)},{value:`en`,label:D(`english`)}]}harnessOptions(){return[{value:`quickforge`,label:`QuickForge`},{value:`claude-code`,label:D(`claudeCodeHarnessUnavailable`),disabled:!0},{value:`opencode`,label:`OpenCode`}]}modelSelectOptions(){return this.modelOptions().map(e=>({value:H(e),label:ue(e)}))}thinkingOptions(){return ut.map(e=>({value:e.value,label:e.label()}))}terminalShellOptions(){return[...this.terminalShellConfig.profiles.map(e=>({value:e.id,label:e.name})),{value:V,label:D(`terminalShellCustomOption`)}]}terminalShellSettings(){let e=this.terminalShellConfig.profiles,t=this.selectedTerminalShellProfileId(),n=e.find(e=>e.id===t),r=this.customShellEditorOpen||e.length===0;return x`
560
+ `}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:gt(),name:_t(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 w({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(){let e=this.selectedModel,t=e?.reasoning?this.thinkingLevel:`off`,n=this.harness,r=async()=>{try{await Ee(x(),{model:e,thinkingLevel:t,harness:n}),this.savedHarness!==n&&(Se(n),this.savedHarness=n),this.markSaved()}catch(e){this.error=e instanceof Error?e.message:D(`requestFailed`),this.requestUpdate()}};this.defaultOptionsSavePromise=this.defaultOptionsSavePromise.then(r,r),await this.defaultOptionsSavePromise}async saveToolDisplayOptions(){try{await xe(x(),{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 it(x(),{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 lt(x(),{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(){return this.models}languageOptions(){return[{value:`zh`,label:D(`simplifiedChinese`)},{value:`en`,label:D(`english`)}]}harnessOptions(){return[{value:`quickforge`,label:`QuickForge`},{value:`claude-code`,label:D(`claudeCodeHarnessUnavailable`),disabled:!0},{value:`opencode`,label:`OpenCode`}]}modelSelectOptions(){return this.modelOptions().map(e=>({value:z(e),label:fe(e)}))}thinkingOptions(){return pt.map(e=>({value:e.value,label:e.label()}))}terminalShellOptions(){return[...this.terminalShellConfig.profiles.map(e=>({value:e.id,label:e.name})),{value:R,label:D(`terminalShellCustomOption`)}]}terminalShellSettings(){let e=this.terminalShellConfig.profiles,t=this.selectedTerminalShellProfileId(),n=e.find(e=>e.id===t),r=this.customShellEditorOpen||e.length===0;return y`
561
561
  <section class="quickforge-settings-section" aria-label=${D(`terminalShell`)}>
562
562
  <div class="quickforge-settings-row">
563
563
  <div class="quickforge-settings-row-main">
@@ -571,12 +571,12 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
571
571
  </div>
572
572
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide">
573
573
  <quickforge-settings-select
574
- .value=${r?V:t}
574
+ .value=${r?R:t}
575
575
  .options=${this.terminalShellOptions()}
576
576
  label=${D(`terminalShellDefault`)}
577
577
  @change=${e=>this.updateTerminalShellSelection(e.detail)}
578
578
  ></quickforge-settings-select>
579
- ${n&&!n.builtin&&!r?x`
579
+ ${n&&!n.builtin&&!r?y`
580
580
  <button
581
581
  class="quickforge-settings-icon-action quickforge-settings-icon-action-danger"
582
582
  type="button"
@@ -584,13 +584,13 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
584
584
  aria-label=${D(`delete`)}
585
585
  @click=${()=>this.deleteCustomTerminalShell(n.id)}
586
586
  >
587
- ${ht}
587
+ ${vt}
588
588
  </button>
589
589
  `:null}
590
590
  </div>
591
591
  </div>
592
592
 
593
- ${r?x`
593
+ ${r?y`
594
594
  <div class="quickforge-settings-row">
595
595
  <div class="quickforge-settings-row-main">
596
596
  <div class="quickforge-settings-row-title">${D(`terminalShellCommand`)}</div>
@@ -617,7 +617,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
617
617
  </div>
618
618
  `:null}
619
619
  </section>
620
- `}renderToolDisplayModeOption(e){let t=this.toolDisplayMode===e.value;return x`
620
+ `}renderToolDisplayModeOption(e){let t=this.toolDisplayMode===e.value;return y`
621
621
  <button
622
622
  type="button"
623
623
  class="quickforge-settings-segmented-option ${t?`quickforge-settings-segmented-option-active`:``}"
@@ -626,7 +626,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
626
626
  >
627
627
  ${e.label()}
628
628
  </button>
629
- `}renderSwitch(e,t,n=!1){return x`
629
+ `}renderSwitch(e,t,n=!1){return y`
630
630
  <label class="quickforge-settings-switch" aria-disabled=${n?`true`:`false`}>
631
631
  <input
632
632
  type="checkbox"
@@ -636,7 +636,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
636
636
  />
637
637
  <span aria-hidden="true"></span>
638
638
  </label>
639
- `}render(){return this.loading?x`<div class="text-sm text-muted-foreground">${D(`loading`)}</div>`:x`
639
+ `}render(){return this.loading?y`<div class="text-sm text-muted-foreground">${D(`loading`)}</div>`:y`
640
640
  <div class="quickforge-settings-stack">
641
641
  <section class="quickforge-settings-section" aria-label=${D(`defaultOptions`)}>
642
642
  <div class="quickforge-settings-row">
@@ -679,7 +679,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
679
679
  </div>
680
680
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide">
681
681
  <quickforge-settings-select
682
- .value=${this.selectedModel?H(this.selectedModel):``}
682
+ .value=${this.selectedModel?z(this.selectedModel):``}
683
683
  .options=${this.modelSelectOptions()}
684
684
  .disabled=${this.models.length===0}
685
685
  searchable
@@ -720,7 +720,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
720
720
  </div>
721
721
  <div class="quickforge-settings-row-control">
722
722
  <div class="quickforge-settings-segmented" role="group" aria-label=${D(`toolDisplay`)}>
723
- ${dt.map(e=>this.renderToolDisplayModeOption(e))}
723
+ ${mt.map(e=>this.renderToolDisplayModeOption(e))}
724
724
  </div>
725
725
  </div>
726
726
  </div>
@@ -734,7 +734,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
734
734
  <div class="quickforge-settings-row-description">${this.systemNotificationStatusText()}</div>
735
735
  </div>
736
736
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide">
737
- ${this.systemNotificationsEnabled?x`
737
+ ${this.systemNotificationsEnabled?y`
738
738
  <button
739
739
  class="quickforge-settings-button quickforge-settings-button-secondary"
740
740
  type="button"
@@ -845,10 +845,10 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
845
845
 
846
846
  ${this.terminalShellSettings()}
847
847
 
848
- ${this.saved?x`<div class="quickforge-settings-message" role="status">${this.savedMessage||D(`defaultOptionsSaved`)}</div>`:null}
849
- ${this.error?x`<div class="quickforge-settings-alert" role="alert">${this.error}</div>`:null}
848
+ ${this.saved?y`<div class="quickforge-settings-message" role="status">${this.savedMessage||D(`defaultOptionsSaved`)}</div>`:null}
849
+ ${this.error?y`<div class="quickforge-settings-alert" role="alert">${this.error}</div>`:null}
850
850
  </div>
851
- `}},U=`quickforge-default-options-settings-tab`;customElements.get(U)||customElements.define(U,gt);function _t(){return document.createElement(U)}var vt=`memory-settings`,yt={enabled:!0};function bt(e){return!e||typeof e!=`object`?{...yt}:{enabled:e.enabled!==!1}}async function xt(e){return bt(await e.settings.get(vt))}async function St(e,t){await e.settings.set(vt,bt(t))}var Ct=class extends S{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([xt(C()),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 St(C(),{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 x`
851
+ `}},B=`quickforge-default-options-settings-tab`;customElements.get(B)||customElements.define(B,yt);function bt(){return document.createElement(B)}var xt=`memory-settings`,St={enabled:!0};function Ct(e){return!e||typeof e!=`object`?{...St}:{enabled:e.enabled!==!1}}async function wt(e){return Ct(await e.settings.get(xt))}async function Tt(e,t){await e.settings.set(xt,Ct(t))}var Et=class extends b{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([wt(x()),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 Tt(x(),{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 y`
852
852
  <label class="quickforge-settings-switch" aria-disabled=${this.saving?`true`:`false`}>
853
853
  <input
854
854
  type="checkbox"
@@ -858,7 +858,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
858
858
  />
859
859
  <span aria-hidden="true"></span>
860
860
  </label>
861
- `}render(){if(this.loading)return x`<div class="text-sm text-muted-foreground">${D(`loading`)}</div>`;let e=this.markdown!==this.savedMarkdown,t=this.saving||this.loadingDocument;return x`
861
+ `}render(){if(this.loading)return y`<div class="text-sm text-muted-foreground">${D(`loading`)}</div>`;let e=this.markdown!==this.savedMarkdown,t=this.saving||this.loadingDocument;return y`
862
862
  <div class="quickforge-settings-stack">
863
863
  <section class="quickforge-settings-section" aria-label=${D(`memory`)}>
864
864
  <div class="quickforge-settings-row">
@@ -915,10 +915,10 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
915
915
  <div class="quickforge-settings-note">${D(`memoryCurrentSessionNote`)}</div>
916
916
  </section>
917
917
 
918
- ${this.message?x`<div class="quickforge-settings-message">${this.message}</div>`:null}
919
- ${this.error?x`<div class="quickforge-settings-alert">${this.error}</div>`:null}
918
+ ${this.message?y`<div class="quickforge-settings-message">${this.message}</div>`:null}
919
+ ${this.error?y`<div class="quickforge-settings-alert">${this.error}</div>`:null}
920
920
  </div>
921
- `}},W=`quickforge-memory-settings-tab`;customElements.get(W)||customElements.define(W,Ct);function wt(){return document.createElement(W)}var Tt=`quickforge-backup`,G=[{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:`scheduledTasks`,countKey:`scheduledTasks`,label:()=>D(`restoreScheduledTasks`),description:()=>D(`restoreScheduledTasksDescription`)}],Et=G;function Dt(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 kt(e){return e?Object.entries(e).map(([e,t])=>`${e}: ${t}`).join(`, `):``}function At(e){return Et.filter(t=>(e.sections?.[t.countKey]??0)>0)}function jt(e){return At(e).map(e=>e.id)}function Mt(e){return e instanceof RangeError||e instanceof Error&&e.message.includes(`Invalid string length`)}function K(e,t){return Mt(e)?D(`backupStringTooLarge`):e instanceof Error?e.message:t}var Nt=class extends S{exportSections=new Set(G.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`));Dt(`${Tt}-settings-${Ot()}.json`,n),this.message=D(`backupExported`)}catch(e){this.error=K(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(jt(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=K(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 k({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=kt(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=K(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 x`
921
+ `}},V=`quickforge-memory-settings-tab`;customElements.get(V)||customElements.define(V,Et);function Dt(){return document.createElement(V)}var Ot=`quickforge-backup`,H=[{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:`scheduledTasks`,countKey:`scheduledTasks`,label:()=>D(`restoreScheduledTasks`),description:()=>D(`restoreScheduledTasksDescription`)}],kt=H;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 jt(){return new Date().toISOString().replace(/[:.]/g,`-`)}function Mt(e){return e?Object.entries(e).map(([e,t])=>`${e}: ${t}`).join(`, `):``}function Nt(e){return kt.filter(t=>(e.sections?.[t.countKey]??0)>0)}function Pt(e){return Nt(e).map(e=>e.id)}function Ft(e){return e instanceof RangeError||e instanceof Error&&e.message.includes(`Invalid string length`)}function U(e,t){return Ft(e)?D(`backupStringTooLarge`):e instanceof Error?e.message:t}var It=class extends b{exportSections=new Set(H.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`));At(`${Ot}-settings-${jt()}.json`,n),this.message=D(`backupExported`)}catch(e){this.error=U(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=U(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 w({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=Mt(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=U(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 y`
922
922
  <label class="quickforge-settings-switch" aria-disabled=${n?`true`:`false`}>
923
923
  <input
924
924
  type="checkbox"
@@ -928,7 +928,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
928
928
  />
929
929
  <span aria-hidden="true"></span>
930
930
  </label>
931
- `}renderPendingImport(){if(!this.pendingImport)return null;let{inspect:e,selectedSections:t}=this.pendingImport,n=At(e);return x`
931
+ `}renderPendingImport(){if(!this.pendingImport)return null;let{inspect:e,selectedSections:t}=this.pendingImport,n=Nt(e);return y`
932
932
  <section class="quickforge-settings-section" aria-label=${D(`backupInspectTitle`)}>
933
933
  <div class="quickforge-settings-row quickforge-settings-row-top">
934
934
  <div class="quickforge-settings-row-main">
@@ -964,16 +964,16 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
964
964
  </div>
965
965
  </div>
966
966
 
967
- ${e.warnings?.length?x`
967
+ ${e.warnings?.length?y`
968
968
  <div class="quickforge-settings-warning quickforge-settings-warning-attached">
969
- ${e.warnings.map(e=>x`<div>⚠ ${e}</div>`)}
969
+ ${e.warnings.map(e=>y`<div>⚠ ${e}</div>`)}
970
970
  </div>
971
971
  `:null}
972
972
 
973
- ${e.invalidSections&&Object.keys(e.invalidSections).length?x`
973
+ ${e.invalidSections&&Object.keys(e.invalidSections).length?y`
974
974
  <div class="quickforge-settings-warning quickforge-settings-warning-attached">
975
975
  <div>${D(`backupInvalidSections`)}</div>
976
- ${Object.entries(e.invalidSections).map(([e,t])=>x`<div>${e}: ${t}</div>`)}
976
+ ${Object.entries(e.invalidSections).map(([e,t])=>y`<div>${e}: ${t}</div>`)}
977
977
  </div>
978
978
  `:null}
979
979
 
@@ -1013,7 +1013,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
1013
1013
  </div>
1014
1014
  </div>
1015
1015
  <div class="quickforge-settings-nested-list">
1016
- ${n.map(n=>x`
1016
+ ${n.map(n=>y`
1017
1017
  <div class="quickforge-settings-subrow">
1018
1018
  <div class="quickforge-settings-row-main">
1019
1019
  <div class="quickforge-settings-row-title">${n.label()} (${e.sections?.[n.countKey]??0})</div>
@@ -1051,7 +1051,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
1051
1051
  </div>
1052
1052
  </div>
1053
1053
  </section>
1054
- `}render(){return x`
1054
+ `}render(){return y`
1055
1055
  <div class="quickforge-settings-stack">
1056
1056
  <section class="quickforge-settings-section" aria-label=${D(`exportData`)}>
1057
1057
  <div class="quickforge-settings-row quickforge-settings-row-top">
@@ -1065,7 +1065,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
1065
1065
  </div>
1066
1066
 
1067
1067
  <div class="quickforge-settings-nested-list">
1068
- ${G.map(e=>x`
1068
+ ${H.map(e=>y`
1069
1069
  <div class="quickforge-settings-subrow">
1070
1070
  <div class="quickforge-settings-row-main">
1071
1071
  <div class="quickforge-settings-row-title">${e.label()}</div>
@@ -1123,17 +1123,17 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
1123
1123
  </section>
1124
1124
 
1125
1125
  ${this.renderPendingImport()}
1126
- ${this.message?x`<div class="quickforge-settings-message">${this.message}</div>`:null}
1127
- ${this.safetyBackupPath?x`<div class="quickforge-settings-note">${D(`backupSafetyBackupPath`)}: <code>${this.safetyBackupPath}</code></div>`:null}
1128
- ${this.error?x`<div class="quickforge-settings-alert">${this.error}</div>`:null}
1126
+ ${this.message?y`<div class="quickforge-settings-message">${this.message}</div>`:null}
1127
+ ${this.safetyBackupPath?y`<div class="quickforge-settings-note">${D(`backupSafetyBackupPath`)}: <code>${this.safetyBackupPath}</code></div>`:null}
1128
+ ${this.error?y`<div class="quickforge-settings-alert">${this.error}</div>`:null}
1129
1129
  </div>
1130
- `}},q=`quickforge-backup-settings-tab`;customElements.get(q)||customElements.define(q,Nt);function Pt(){return document.createElement(q)}function Ft(e){if(!e)return`-`;let t=new Date(e);return Number.isNaN(t.getTime())?e:t.toLocaleString(E())}function It(e){let t={...e};return delete t.archivedAt,t}function J(){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 Lt=class extends S{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`${we(t.title,t.channelName)} ${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=C(),n=await t.sessions.get(e),r=await t.sessions.getMetadata(e);if(!n||!r)throw Error(D(`sessionNotFound`));await t.sessions.save(It(n),It(r)),this.sessions=this.sessions.filter(t=>t.id!==e),this.message=D(`sessionRestored`),J()}catch(e){this.error=e instanceof Error?e.message:D(`restoreSessionFailed`)}finally{this.busySessionId=``,this.requestUpdate()}}}async deleteSession(e){if(!this.busySessionId&&await k({description:D(`deleteArchivedSessionConfirm`,{title:we(e.title)}),confirmLabel:D(`confirmDelete`),cancelLabel:D(`cancel`),variant:`destructive`})){this.busySessionId=e.id,this.message=``,this.error=``,this.requestUpdate();try{await C().sessions.delete(e.id),this.sessions=this.sessions.filter(t=>t.id!==e.id),this.message=D(`archivedSessionDeleted`),J()}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 k({description:D(`deleteAllArchivedSessionsConfirm`),confirmLabel:D(`confirmDelete`),cancelLabel:D(`cancel`),variant:`destructive`})){this.busySessionId=`__all__`,this.message=``,this.error=``,this.requestUpdate();try{let e=C();await Promise.all(this.sessions.map(t=>e.sessions.delete(t.id))),this.sessions=[],this.message=D(`archivedSessionsDeleted`),J()}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 x`
1130
+ `}},W=`quickforge-backup-settings-tab`;customElements.get(W)||customElements.define(W,It);function Lt(){return document.createElement(W)}function Rt(e){if(!e)return`-`;let t=new Date(e);return Number.isNaN(t.getTime())?e:t.toLocaleString(T())}function zt(e){return{...e,archivedAt:null}}function G(){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 Bt=class extends b{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`${ve(t.title,t.channelName)} ${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=x(),n=await t.sessions.get(e),r=await t.sessions.getMetadata(e);if(!n||!r)throw Error(D(`sessionNotFound`));await t.sessions.save(zt(n),zt(r)),this.sessions=this.sessions.filter(t=>t.id!==e),this.message=D(`sessionRestored`),G()}catch(e){this.error=e instanceof Error?e.message:D(`restoreSessionFailed`)}finally{this.busySessionId=``,this.requestUpdate()}}}async deleteSession(e){if(!this.busySessionId&&await w({description:D(`deleteArchivedSessionConfirm`,{title:ve(e.title)}),confirmLabel:D(`confirmDelete`),cancelLabel:D(`cancel`),variant:`destructive`})){this.busySessionId=e.id,this.message=``,this.error=``,this.requestUpdate();try{await x().sessions.delete(e.id),this.sessions=this.sessions.filter(t=>t.id!==e.id),this.message=D(`archivedSessionDeleted`),G()}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 w({description:D(`deleteAllArchivedSessionsConfirm`),confirmLabel:D(`confirmDelete`),cancelLabel:D(`cancel`),variant:`destructive`})){this.busySessionId=`__all__`,this.message=``,this.error=``,this.requestUpdate();try{let e=x();await Promise.all(this.sessions.map(t=>e.sessions.delete(t.id))),this.sessions=[],this.message=D(`archivedSessionsDeleted`),G()}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 y`
1131
1131
  <div class="border-t border-border px-4 py-3 first:border-t-0">
1132
1132
  <div class="flex flex-wrap items-start justify-between gap-x-3 gap-y-2">
1133
1133
  <div class="min-w-0 flex-1">
1134
- <div class="truncate text-sm font-medium text-foreground">${we(e.title,e.channelName)}</div>
1134
+ <div class="truncate text-sm font-medium text-foreground">${ve(e.title,e.channelName)}</div>
1135
1135
  <div class="mt-1 text-xs text-muted-foreground">
1136
- ${D(`lastModified`)}: ${Ft(e.lastModified)} · ${D(`archivedAt`)}: ${Ft(e.archivedAt)}
1136
+ ${D(`lastModified`)}: ${Rt(e.lastModified)} · ${D(`archivedAt`)}: ${Rt(e.archivedAt)}
1137
1137
  </div>
1138
1138
  </div>
1139
1139
  <div class="flex w-full shrink-0 items-center justify-end gap-2 sm:w-auto">
@@ -1156,7 +1156,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
1156
1156
  </div>
1157
1157
  </div>
1158
1158
  </div>
1159
- `}render(){let e=this.groupedSessions();return x`
1159
+ `}render(){let e=this.groupedSessions();return y`
1160
1160
  <div class="flex flex-col gap-4">
1161
1161
  <div class="flex justify-end">
1162
1162
  <button
@@ -1185,17 +1185,17 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
1185
1185
  >
1186
1186
  <option value="all">${D(`allProjects`)}</option>
1187
1187
  <option value="global">${D(`normalChat`)}</option>
1188
- ${this.projects.map(e=>x`<option value=${e.id}>${e.name}</option>`)}
1188
+ ${this.projects.map(e=>y`<option value=${e.id}>${e.name}</option>`)}
1189
1189
  </select>
1190
1190
  </div>
1191
1191
 
1192
- ${this.loading?x`
1192
+ ${this.loading?y`
1193
1193
  <div class="px-4 py-8 text-center text-sm text-muted-foreground">${D(`loading`)}</div>
1194
- `:e.length===0?x`
1194
+ `:e.length===0?y`
1195
1195
  <div class="px-4 py-8 text-center text-sm text-muted-foreground">${D(`noArchivedConversations`)}</div>
1196
- `:x`
1196
+ `:y`
1197
1197
  <div>
1198
- ${e.map(([e,t])=>x`
1198
+ ${e.map(([e,t])=>y`
1199
1199
  <div class="border-b border-border last:border-b-0">
1200
1200
  <div class="flex items-center justify-between gap-3 bg-muted/20 px-4 py-2 text-sm text-muted-foreground">
1201
1201
  <div class="truncate">${this.projectLabel(e)}</div>
@@ -1208,10 +1208,10 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
1208
1208
  `}
1209
1209
  </section>
1210
1210
 
1211
- ${this.message?x`<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}
1212
- ${this.error?x`<div class="rounded-md border border-destructive/30 bg-destructive/10 px-3 py-2 text-sm text-destructive">${this.error}</div>`:null}
1211
+ ${this.message?y`<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}
1212
+ ${this.error?y`<div class="rounded-md border border-destructive/30 bg-destructive/10 px-3 py-2 text-sm text-destructive">${this.error}</div>`:null}
1213
1213
  </div>
1214
- `}},Rt=`quickforge-archived-conversations-settings-tab`;customElements.get(Rt)||customElements.define(Rt,Lt);function zt(){return document.createElement(Rt)}function Bt(){return Array.from({length:16},()=>`ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz23456789!@#$%^&*`[Math.floor(Math.random()*65)]).join(``)}function Vt(e){if(!e)return D(`lanAccessUnknownDevice`);let t=e.includes(`Edg/`)?`Edge`:e.includes(`Firefox/`)?`Firefox`:e.includes(`Chrome/`)?`Chrome`:e.includes(`Safari/`)?`Safari`:D(`lanAccessBrowser`),n=/Android/i.test(e)?`Android`:/iPhone|iPad|iPod/i.test(e)?`iOS`:/Windows/i.test(e)?`Windows`:/Macintosh|Mac OS X/i.test(e)?`macOS`:/Linux/i.test(e)?`Linux`:``;return n?`${t} · ${n}`:t}function Ht(e){if(!e)return`-`;let t=new Date(e);return Number.isNaN(t.getTime())?`-`:new Intl.DateTimeFormat(E(),{dateStyle:`medium`,timeStyle:`short`}).format(t)}var Ut=class extends S{loading=!0;saving=!1;enabled=!1;hasPassword=!1;password=``;passwordVisible=!1;sessionTtlHours=12;activeTokenCount=0;activeDevices=[];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.activeDevices=Array.isArray(e.activeDevices)?e.activeDevices:[],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()}togglePasswordVisibility(){this.passwordVisible=!this.passwordVisible,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 k({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.passwordVisible=!1,this.message=D(`lanAccessSaved`)}catch(e){this.error=e instanceof Error?e.message:D(`requestFailed`)}finally{this.saving=!1,this.requestUpdate()}}}}async revokeDevice(e){if(await k({description:D(`lanAccessRevokeDeviceConfirm`,{device:Vt(e.userAgent)}),confirmLabel:D(`lanAccessRevokeDevice`),cancelLabel:D(`cancel`),variant:`destructive`})){this.saving=!0,this.error=``,this.message=``,this.requestUpdate();try{let t=await this.request(`/api/lan-access/revoke`,{method:`POST`,body:JSON.stringify({id:e.id})});this.applyStatus(t),this.message=D(`lanAccessDeviceRevoked`)}catch(e){this.error=e instanceof Error?e.message:D(`requestFailed`)}finally{this.saving=!1,this.requestUpdate()}}}async revokeAll(){if(await k({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 x`
1214
+ `}},K=`quickforge-archived-conversations-settings-tab`;customElements.get(K)||customElements.define(K,Bt);function Vt(){return document.createElement(K)}function Ht(){return Array.from({length:16},()=>`ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz23456789!@#$%^&*`[Math.floor(Math.random()*65)]).join(``)}function Ut(e){if(!e)return D(`lanAccessUnknownDevice`);let t=e.includes(`Edg/`)?`Edge`:e.includes(`Firefox/`)?`Firefox`:e.includes(`Chrome/`)?`Chrome`:e.includes(`Safari/`)?`Safari`:D(`lanAccessBrowser`),n=/Android/i.test(e)?`Android`:/iPhone|iPad|iPod/i.test(e)?`iOS`:/Windows/i.test(e)?`Windows`:/Macintosh|Mac OS X/i.test(e)?`macOS`:/Linux/i.test(e)?`Linux`:``;return n?`${t} · ${n}`:t}function Wt(e){if(!e)return`-`;let t=new Date(e);return Number.isNaN(t.getTime())?`-`:new Intl.DateTimeFormat(T(),{dateStyle:`medium`,timeStyle:`short`}).format(t)}var Gt=class extends b{loading=!0;saving=!1;enabled=!1;hasPassword=!1;password=``;passwordVisible=!1;sessionTtlHours=12;activeTokenCount=0;activeDevices=[];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.activeDevices=Array.isArray(e.activeDevices)?e.activeDevices:[],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()}togglePasswordVisibility(){this.passwordVisible=!this.passwordVisible,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 w({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.passwordVisible=!1,this.message=D(`lanAccessSaved`)}catch(e){this.error=e instanceof Error?e.message:D(`requestFailed`)}finally{this.saving=!1,this.requestUpdate()}}}}async revokeDevice(e){if(await w({description:D(`lanAccessRevokeDeviceConfirm`,{device:Ut(e.userAgent)}),confirmLabel:D(`lanAccessRevokeDevice`),cancelLabel:D(`cancel`),variant:`destructive`})){this.saving=!0,this.error=``,this.message=``,this.requestUpdate();try{let t=await this.request(`/api/lan-access/revoke`,{method:`POST`,body:JSON.stringify({id:e.id})});this.applyStatus(t),this.message=D(`lanAccessDeviceRevoked`)}catch(e){this.error=e instanceof Error?e.message:D(`requestFailed`)}finally{this.saving=!1,this.requestUpdate()}}}async revokeAll(){if(await w({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 y`
1215
1215
  <label class="quickforge-settings-switch" aria-disabled=${n?`true`:`false`}>
1216
1216
  <input
1217
1217
  type="checkbox"
@@ -1221,7 +1221,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
1221
1221
  />
1222
1222
  <span aria-hidden="true"></span>
1223
1223
  </label>
1224
- `}render(){return this.loading?x`<div class="text-sm text-muted-foreground">${D(`loading`)}</div>`:x`
1224
+ `}render(){return this.loading?y`<div class="text-sm text-muted-foreground">${D(`loading`)}</div>`:y`
1225
1225
  <div class="quickforge-settings-stack">
1226
1226
  <div class="quickforge-settings-warning">${D(`lanAccessRiskWarning`)}</div>
1227
1227
 
@@ -1247,14 +1247,14 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
1247
1247
  </div>
1248
1248
  </div>
1249
1249
  <div class="quickforge-settings-nested-list quickforge-lan-device-list">
1250
- ${this.activeDevices.length?this.activeDevices.map(e=>x`
1250
+ ${this.activeDevices.length?this.activeDevices.map(e=>y`
1251
1251
  <div class="quickforge-settings-subrow">
1252
1252
  <div class="quickforge-settings-list-item-main">
1253
- <div class="quickforge-settings-row-title">${Vt(e.userAgent)}</div>
1253
+ <div class="quickforge-settings-row-title">${Ut(e.userAgent)}</div>
1254
1254
  <div class="quickforge-settings-row-description quickforge-lan-device-meta">
1255
1255
  <span>${e.address||D(`lanAccessUnknownAddress`)}</span>
1256
- <span>${D(`lanAccessSignedInAt`,{time:Ht(e.issuedAt)})}</span>
1257
- <span>${D(`lanAccessExpiresAt`,{time:Ht(e.expiresAt)})}</span>
1256
+ <span>${D(`lanAccessSignedInAt`,{time:Wt(e.issuedAt)})}</span>
1257
+ <span>${D(`lanAccessExpiresAt`,{time:Wt(e.expiresAt)})}</span>
1258
1258
  </div>
1259
1259
  </div>
1260
1260
  <div class="quickforge-settings-list-item-actions">
@@ -1268,7 +1268,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
1268
1268
  </button>
1269
1269
  </div>
1270
1270
  </div>
1271
- `):x`<div class="quickforge-settings-empty-row">${D(`lanAccessNoActiveDevices`)}</div>`}
1271
+ `):y`<div class="quickforge-settings-empty-row">${D(`lanAccessNoActiveDevices`)}</div>`}
1272
1272
  </div>
1273
1273
  <div class="quickforge-settings-row">
1274
1274
  <div class="quickforge-settings-row-main">
@@ -1276,7 +1276,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
1276
1276
  <div class="quickforge-settings-row-description">${D(`lanAccessUrlsDescription`)}</div>
1277
1277
  </div>
1278
1278
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide quickforge-settings-readonly-value">
1279
- ${this.lanUrls.length?this.lanUrls.map(e=>x`<div>${e}</div>`):`-`}
1279
+ ${this.lanUrls.length?this.lanUrls.map(e=>y`<div>${e}</div>`):`-`}
1280
1280
  </div>
1281
1281
  </div>
1282
1282
  </section>
@@ -1314,14 +1314,14 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
1314
1314
  aria-pressed=${this.passwordVisible?`true`:`false`}
1315
1315
  @click=${()=>this.togglePasswordVisibility()}
1316
1316
  >
1317
- ${this.passwordVisible?x`
1317
+ ${this.passwordVisible?y`
1318
1318
  <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" aria-hidden="true">
1319
1319
  <path d="m3 3 18 18" stroke-linecap="round"></path>
1320
1320
  <path d="M10.6 10.7a2 2 0 0 0 2.7 2.7"></path>
1321
1321
  <path d="M9.9 4.3A10.9 10.9 0 0 1 12 4c5.5 0 9 5.3 9 8a7.3 7.3 0 0 1-1.5 3.2"></path>
1322
1322
  <path d="M6.6 6.6C4.3 8.1 3 10.4 3 12c0 2.7 3.5 8 9 8 1.5 0 2.8-.4 4-1"></path>
1323
1323
  </svg>
1324
- `:x`
1324
+ `:y`
1325
1325
  <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" aria-hidden="true">
1326
1326
  <path d="M3 12c0-2.7 3.5-8 9-8s9 5.3 9 8-3.5 8-9 8-9-5.3-9-8Z"></path>
1327
1327
  <circle cx="12" cy="12" r="2.5"></circle>
@@ -1332,7 +1332,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
1332
1332
  <button
1333
1333
  class="quickforge-settings-button quickforge-settings-button-secondary"
1334
1334
  type="button"
1335
- @click=${()=>this.updatePassword(Bt())}
1335
+ @click=${()=>this.updatePassword(Ht())}
1336
1336
  >
1337
1337
  ${D(`generatePassword`)}
1338
1338
  </button>
@@ -1370,10 +1370,10 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
1370
1370
  </div>
1371
1371
  </section>
1372
1372
 
1373
- ${this.message?x`<div class="quickforge-settings-message">${this.message}</div>`:null}
1374
- ${this.error?x`<div class="quickforge-settings-alert">${this.error}</div>`:null}
1373
+ ${this.message?y`<div class="quickforge-settings-message">${this.message}</div>`:null}
1374
+ ${this.error?y`<div class="quickforge-settings-alert">${this.error}</div>`:null}
1375
1375
  </div>
1376
- `}},Wt=`quickforge-lan-access-settings-tab`;customElements.get(Wt)||customElements.define(Wt,Ut);function Gt(){return document.createElement(Wt)}var Kt=18e4,qt=3e4,Jt=1e3,Yt=`https://github.com/shawnstack/quickforge/releases/latest`;function Xt(){if(typeof document>`u`)return!1;let e=window;return document.body.classList.contains(`quickforge-desktop-app`)||e.__quickforgeDesktopApp===!0}function Zt(e){return new Promise(t=>window.setTimeout(t,e))}function Qt(e,t){return e?.code===`system_restart_requires_auth`?D(`systemRestartRequiresAuth`):e?.code===`system_update_requires_auth`?D(`systemUpdateRequiresAuth`):e?.error||t}var $t=[{value:`startup`,label:()=>D(`frequencyStartup`)},{value:`daily`,label:()=>D(`frequencyDaily`)},{value:`weekly`,label:()=>D(`frequencyWeekly`)},{value:`off`,label:()=>D(`frequencyOff`)}],en=class extends S{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([ze(C()),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(Xt()){window.open(Yt,`_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<Kt;){await Zt(Jt);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<qt;){await Zt(Jt);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 k({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(Qt(n,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(Xt()){window.open(Yt,`_blank`,`noopener,noreferrer`),this.message=D(`desktopUpdateHint`),this.error=``,this.requestUpdate();return}if(!(!this.updateInfo?.updateAvailable||this.updating)&&await k({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(Qt(t,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=C();await De(t,{...await ze(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 x`
1376
+ `}},q=`quickforge-lan-access-settings-tab`;customElements.get(q)||customElements.define(q,Gt);function Kt(){return document.createElement(q)}var qt=18e4,Jt=3e4,Yt=1e3,Xt=`https://github.com/shawnstack/quickforge/releases/latest`;function J(){if(typeof document>`u`)return!1;let e=window;return document.body.classList.contains(`quickforge-desktop-app`)||e.__quickforgeDesktopApp===!0}function Zt(e){return new Promise(t=>window.setTimeout(t,e))}function Qt(e,t){return e?.code===`system_restart_requires_auth`?D(`systemRestartRequiresAuth`):e?.code===`system_update_requires_auth`?D(`systemUpdateRequiresAuth`):e?.error||t}var $t=[{value:`startup`,label:()=>D(`frequencyStartup`)},{value:`daily`,label:()=>D(`frequencyDaily`)},{value:`weekly`,label:()=>D(`frequencyWeekly`)},{value:`off`,label:()=>D(`frequencyOff`)}],en=class extends b{about;updateInfo;loading=!0;checking=!1;updating=!1;restarting=!1;message=``;error=``;frequency=He.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([Pe(x()),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(J()){window.open(Xt,`_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<qt;){await Zt(Yt);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<Jt;){await Zt(Yt);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 w({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(Qt(n,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(J()){window.open(Xt,`_blank`,`noopener,noreferrer`),this.message=D(`desktopUpdateHint`),this.error=``,this.requestUpdate();return}if(!(!this.updateInfo?.updateAvailable||this.updating)&&await w({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(Qt(t,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=x();await Fe(t,{...await Pe(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 y`
1377
1377
  <button
1378
1378
  type="button"
1379
1379
  class="quickforge-settings-segmented-option ${t?`quickforge-settings-segmented-option-active`:``}"
@@ -1382,7 +1382,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
1382
1382
  >
1383
1383
  ${e.label()}
1384
1384
  </button>
1385
- `}infoRows(){let e=this.about;return e?x`
1385
+ `}infoRows(){let e=this.about;return e?y`
1386
1386
  <div class="quickforge-settings-row">
1387
1387
  <div class="quickforge-settings-row-main">
1388
1388
  <div class="quickforge-settings-row-title">${D(`packageName`)}</div>
@@ -1408,7 +1408,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
1408
1408
  </a>
1409
1409
  </div>
1410
1410
  </div>
1411
- `:null}updateStatus(){return this.updateInfo?x`
1411
+ `:null}updateStatus(){return this.updateInfo?y`
1412
1412
  <div class="quickforge-settings-row">
1413
1413
  <div class="quickforge-settings-row-main">
1414
1414
  <div class="quickforge-settings-row-title">${D(`latestVersion`)}</div>
@@ -1416,7 +1416,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
1416
1416
  </div>
1417
1417
  <div class="quickforge-settings-row-control quickforge-settings-readonly-value">${this.updateInfo.latestVersion}</div>
1418
1418
  </div>
1419
- ${this.updateInfo.logFile?x`
1419
+ ${this.updateInfo.logFile?y`
1420
1420
  <div class="quickforge-settings-row">
1421
1421
  <div class="quickforge-settings-row-main">
1422
1422
  <div class="quickforge-settings-row-title">${D(`updateLog`)}</div>
@@ -1427,7 +1427,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
1427
1427
  </div>
1428
1428
  </div>
1429
1429
  `:null}
1430
- `:null}restartSection(){let e=this.serviceStatus?.restartUnsupportedReason||D(`backendRestartUnsupported`),t=this.restarting||!this.serviceStatus?.restartSupported;return x`
1430
+ `:null}restartSection(){let e=this.serviceStatus?.restartUnsupportedReason||D(`backendRestartUnsupported`),t=this.restarting||!this.serviceStatus?.restartSupported;return y`
1431
1431
  <section class="quickforge-settings-section" aria-label=${D(`restartBackendService`)}>
1432
1432
  <div class="quickforge-settings-row">
1433
1433
  <div class="quickforge-settings-row-main">
@@ -1451,14 +1451,14 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
1451
1451
  </div>
1452
1452
  </div>
1453
1453
  </section>
1454
- `}render(){if(this.loading)return x`<div class="text-sm text-muted-foreground">${D(`loading`)}</div>`;let e=this.checking||this.updating||!this.updateInfo?.updateAvailable,t=Xt();return x`
1454
+ `}render(){if(this.loading)return y`<div class="text-sm text-muted-foreground">${D(`loading`)}</div>`;let e=this.checking||this.updating||!this.updateInfo?.updateAvailable,t=J();return y`
1455
1455
  <div class="quickforge-settings-stack">
1456
1456
  <section class="quickforge-settings-section" aria-label=${D(`projectInfo`)}>
1457
1457
  ${this.infoRows()}
1458
1458
  </section>
1459
1459
 
1460
1460
  <section class="quickforge-settings-section" aria-label=${D(t?`desktopUpdates`:`runtimeUpdates`)}>
1461
- ${t?null:x`
1461
+ ${t?null:y`
1462
1462
  <div class="quickforge-settings-row">
1463
1463
  <div class="quickforge-settings-row-main">
1464
1464
  <div class="quickforge-settings-row-title">
@@ -1466,7 +1466,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
1466
1466
  <quickforge-info-tip .label=${D(`updateFrequencyDescription`)}></quickforge-info-tip>
1467
1467
  </div>
1468
1468
  <div class="quickforge-settings-row-description">
1469
- ${this.lastCheckAt?D(`lastCheckedAt`,{time:new Date(this.lastCheckAt).toLocaleString(E())}):D(`lastCheckedNever`)}
1469
+ ${this.lastCheckAt?D(`lastCheckedAt`,{time:new Date(this.lastCheckAt).toLocaleString(T())}):D(`lastCheckedNever`)}
1470
1470
  </div>
1471
1471
  </div>
1472
1472
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide">
@@ -1498,7 +1498,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
1498
1498
  >
1499
1499
  ${this.checking?D(`checkingUpdate`):D(t?`openDesktopReleases`:`checkRuntimeUpdate`)}
1500
1500
  </button>
1501
- ${t?null:x`
1501
+ ${t?null:y`
1502
1502
  <button
1503
1503
  class="quickforge-settings-button quickforge-settings-button-primary"
1504
1504
  type="button"
@@ -1514,15 +1514,15 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
1514
1514
 
1515
1515
  ${this.restartSection()}
1516
1516
 
1517
- ${this.message?x`<div class="quickforge-settings-message">${this.message}</div>`:null}
1518
- ${this.error?x`<div class="quickforge-settings-alert">${this.error}</div>`:null}
1517
+ ${this.message?y`<div class="quickforge-settings-message">${this.message}</div>`:null}
1518
+ ${this.error?y`<div class="quickforge-settings-alert">${this.error}</div>`:null}
1519
1519
  </div>
1520
- `}},tn=`quickforge-about-settings-tab`;customElements.get(tn)||customElements.define(tn,en);function nn(){return document.createElement(tn)}var rn=class extends S{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?x`<div class="quickforge-settings-note">${D(`loading`)}</div>`:this.projects.length===0?x`
1520
+ `}},Y=`quickforge-about-settings-tab`;customElements.get(Y)||customElements.define(Y,en);function tn(){return document.createElement(Y)}var nn=class extends b{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?y`<div class="quickforge-settings-note">${D(`loading`)}</div>`:this.projects.length===0?y`
1521
1521
  <div class="quickforge-settings-stack">
1522
1522
  <div class="quickforge-settings-note">${D(`selectProjectForCommands`)}</div>
1523
- ${this.error?x`<div class="quickforge-settings-alert">${this.error}</div>`:null}
1523
+ ${this.error?y`<div class="quickforge-settings-alert">${this.error}</div>`:null}
1524
1524
  </div>
1525
- `:x`
1525
+ `:y`
1526
1526
  <div class="quickforge-settings-stack">
1527
1527
  <section class="quickforge-settings-section" aria-label=${D(`projectCommands`)}>
1528
1528
  <div class="quickforge-settings-row">
@@ -1538,7 +1538,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
1538
1538
  .value=${this.project?.id??``}
1539
1539
  @change=${e=>this.selectProject(e)}
1540
1540
  >
1541
- ${this.projects.map(e=>x`<option value=${e.id} ?selected=${e.id===this.project?.id}>${e.name}</option>`)}
1541
+ ${this.projects.map(e=>y`<option value=${e.id} ?selected=${e.id===this.project?.id}>${e.name}</option>`)}
1542
1542
  </select>
1543
1543
  </div>
1544
1544
  </div>
@@ -1602,7 +1602,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
1602
1602
  </div>
1603
1603
 
1604
1604
  <div class="quickforge-settings-nested-list">
1605
- ${this.loadingCommands?x`<div class="quickforge-settings-empty-row">${D(`loading`)}</div>`:this.commands.length===0?x`<div class="quickforge-settings-empty-row">${D(`noCommandsLoaded`)}</div>`:this.commands.map(e=>{let t=e.argumentHint?` ${e.argumentHint}`:``;return x`
1605
+ ${this.loadingCommands?y`<div class="quickforge-settings-empty-row">${D(`loading`)}</div>`:this.commands.length===0?y`<div class="quickforge-settings-empty-row">${D(`noCommandsLoaded`)}</div>`:this.commands.map(e=>{let t=e.argumentHint?` ${e.argumentHint}`:``;return y`
1606
1606
  <div class="quickforge-settings-subrow">
1607
1607
  <div class="quickforge-settings-row-main">
1608
1608
  <div class="quickforge-settings-row-title">
@@ -1612,18 +1612,18 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
1612
1612
  ${e.description||D(`noDescription`)}
1613
1613
  </div>
1614
1614
  </div>
1615
- ${e.relativePath?x`<div class="quickforge-settings-row-control quickforge-settings-row-control-wide quickforge-settings-readonly-value">${e.relativePath}</div>`:null}
1615
+ ${e.relativePath?y`<div class="quickforge-settings-row-control quickforge-settings-row-control-wide quickforge-settings-readonly-value">${e.relativePath}</div>`:null}
1616
1616
  </div>
1617
1617
  `})}
1618
1618
  </div>
1619
1619
  </section>
1620
1620
 
1621
- ${this.saving?x`<div class="quickforge-settings-note">${D(`saving`)}</div>`:null}
1622
- ${this.saved?x`<div class="quickforge-settings-message">${D(`projectCommandsSaved`)}</div>`:null}
1623
- ${this.message?x`<div class="quickforge-settings-message">${this.message}</div>`:null}
1624
- ${this.error?x`<div class="quickforge-settings-alert">${this.error}</div>`:null}
1621
+ ${this.saving?y`<div class="quickforge-settings-note">${D(`saving`)}</div>`:null}
1622
+ ${this.saved?y`<div class="quickforge-settings-message">${D(`projectCommandsSaved`)}</div>`:null}
1623
+ ${this.message?y`<div class="quickforge-settings-message">${this.message}</div>`:null}
1624
+ ${this.error?y`<div class="quickforge-settings-alert">${this.error}</div>`:null}
1625
1625
  </div>
1626
- `}},an=`quickforge-project-commands-settings-tab`;customElements.get(an)||customElements.define(an,rn);function on(){return document.createElement(an)}var Y={"x-quickforge-action":`channel-action`};function sn(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 cn(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`)}}var ln=class extends S{loading=!0;channels=[];workspaces=[];selectedWorkspaceIdByChannel={};error=``;message=``;eventSource;busyChannelId=``;openingLogsChannelId=``;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}}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 k({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?{...Y,"content-type":`application/json`}:Y,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 k({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?{...Y,"content-type":`application/json`}:Y,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 openLogs(e){if(!this.openingLogsChannelId){this.openingLogsChannelId=e.id,this.error=``,this.message=``,this.requestUpdate();try{await this.request(`/api/channels/${encodeURIComponent(e.id)}/open-logs`,{method:`POST`,headers:Y})}catch(e){this.error=e instanceof Error?e.message:D(`channelOpenLogsFailed`)}finally{this.openingLogsChannelId=``,this.requestUpdate()}}}workspaceSection(e,t){if(!e.supportsWorkspaceSelection)return null;let n=this.selectedWorkspaceId(e);return x`
1626
+ `}},rn=`quickforge-project-commands-settings-tab`;customElements.get(rn)||customElements.define(rn,nn);function an(){return document.createElement(rn)}var X={"x-quickforge-action":`channel-action`};function on(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 sn(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`)}}var cn=class extends b{loading=!0;channels=[];workspaces=[];selectedWorkspaceIdByChannel={};error=``;message=``;eventSource;busyChannelId=``;openingLogsChannelId=``;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}}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 w({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?{...X,"content-type":`application/json`}:X,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 w({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?{...X,"content-type":`application/json`}:X,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 openLogs(e){if(!this.openingLogsChannelId){this.openingLogsChannelId=e.id,this.error=``,this.message=``,this.requestUpdate();try{await this.request(`/api/channels/${encodeURIComponent(e.id)}/open-logs`,{method:`POST`,headers:X})}catch(e){this.error=e instanceof Error?e.message:D(`channelOpenLogsFailed`)}finally{this.openingLogsChannelId=``,this.requestUpdate()}}}workspaceSection(e,t){if(!e.supportsWorkspaceSelection)return null;let n=this.selectedWorkspaceId(e);return y`
1627
1627
  <div class="quickforge-settings-row quickforge-settings-row-align-start">
1628
1628
  <div class="quickforge-settings-row-main">
1629
1629
  <div class="quickforge-settings-row-title">
@@ -1639,13 +1639,13 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
1639
1639
  .value=${n}
1640
1640
  @change=${t=>this.handleWorkspaceChange(e,t)}
1641
1641
  >
1642
- ${this.workspaces.map(e=>x`
1642
+ ${this.workspaces.map(e=>y`
1643
1643
  <option value=${e.id}>${e.kind===`default`?D(`channelDefaultWorkspace`):e.name}</option>
1644
1644
  `)}
1645
1645
  </select>
1646
1646
  </div>
1647
1647
  </div>
1648
- `}qrSection(e){return e.qrCodeText?x`
1648
+ `}qrSection(e){return e.qrCodeText?y`
1649
1649
  <div class="quickforge-settings-row quickforge-settings-row-align-start">
1650
1650
  <div class="quickforge-settings-row-main">
1651
1651
  <div class="quickforge-settings-row-title">
@@ -1656,13 +1656,13 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
1656
1656
  </div>
1657
1657
  <pre class="quickforge-channel-qr-text">${e.qrCodeText}</pre>
1658
1658
  </div>
1659
- `:null}channelCard(e){let t=this.busyChannelId===e.id||!!e.activeAction,n=this.openingLogsChannelId===e.id,r=e.status===`running`||e.status===`waiting_scan`||e.status===`starting`,i=e.status===`stopping`,a=!!(e.supportsWorkspaceSelection&&this.workspaces.length===0);return x`
1659
+ `:null}channelCard(e){let t=this.busyChannelId===e.id||!!e.activeAction,n=this.openingLogsChannelId===e.id,r=e.status===`running`||e.status===`waiting_scan`||e.status===`starting`,i=e.status===`stopping`,a=!!(e.supportsWorkspaceSelection&&this.workspaces.length===0);return y`
1660
1660
  <section class="quickforge-settings-section" aria-label=${e.name}>
1661
1661
  <div class="quickforge-settings-row quickforge-settings-row-top">
1662
1662
  <div class="quickforge-settings-row-main">
1663
1663
  <div class="quickforge-settings-row-title">
1664
1664
  ${e.name}
1665
- <span class="quickforge-settings-badge ${sn(e.status)}">${cn(e.status)}</span>
1665
+ <span class="quickforge-settings-badge ${on(e.status)}">${sn(e.status)}</span>
1666
1666
  </div>
1667
1667
  <div class="quickforge-settings-row-description">${e.description}</div>
1668
1668
  </div>
@@ -1670,7 +1670,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
1670
1670
  <button class="quickforge-settings-button quickforge-settings-button-primary" type="button" ?disabled=${t||r||i||a} @click=${()=>this.invoke(e,`start`)}>${D(`start`)}</button>
1671
1671
  <button class="quickforge-settings-button quickforge-settings-button-secondary" type="button" ?disabled=${t||!r||i} @click=${()=>this.invoke(e,`stop`)}>${D(`stop`)}</button>
1672
1672
  <button class="quickforge-settings-button quickforge-settings-button-secondary" type="button" ?disabled=${t||i||a} @click=${()=>this.invoke(e,`restart`)}>${D(`restart`)}</button>
1673
- ${e.actions?.map(n=>x`
1673
+ ${e.actions?.map(n=>y`
1674
1674
  <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>
1675
1675
  `)}
1676
1676
  <button class="quickforge-settings-button quickforge-settings-button-secondary" type="button" ?disabled=${!!this.openingLogsChannelId} @click=${()=>this.openLogs(e)}>${D(n?`channelOpeningLogs`:`channelOpenLogs`)}</button>
@@ -1678,19 +1678,19 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
1678
1678
  </div>
1679
1679
 
1680
1680
  ${this.workspaceSection(e,t||r||i)}
1681
- ${a?x`<div class="quickforge-settings-alert quickforge-settings-warning-attached">${D(`channelNoWorkspaces`)}</div>`:null}
1682
- ${e.error?x`<div class="quickforge-settings-alert quickforge-settings-warning-attached">${e.error}</div>`:null}
1681
+ ${a?y`<div class="quickforge-settings-alert quickforge-settings-warning-attached">${D(`channelNoWorkspaces`)}</div>`:null}
1682
+ ${e.error?y`<div class="quickforge-settings-alert quickforge-settings-warning-attached">${e.error}</div>`:null}
1683
1683
  ${this.qrSection(e)}
1684
1684
  </section>
1685
- `}render(){return this.loading?x`<div class="quickforge-settings-note">${D(`loading`)}</div>`:x`
1685
+ `}render(){return this.loading?y`<div class="quickforge-settings-note">${D(`loading`)}</div>`:y`
1686
1686
  <div class="quickforge-settings-stack">
1687
1687
  <div class="quickforge-settings-note">
1688
1688
  ${D(`channelsSecurityWarning`)}
1689
1689
  </div>
1690
1690
 
1691
- ${this.channels.length?x`${this.channels.map(e=>this.channelCard(e))}`:x`<div class="quickforge-settings-note">${D(`channelsEmpty`)}</div>`}
1691
+ ${this.channels.length?y`${this.channels.map(e=>this.channelCard(e))}`:y`<div class="quickforge-settings-note">${D(`channelsEmpty`)}</div>`}
1692
1692
 
1693
- ${this.message?x`<div class="quickforge-settings-message">${this.message}</div>`:null}
1694
- ${this.error?x`<div class="quickforge-settings-alert">${this.error}</div>`:null}
1693
+ ${this.message?y`<div class="quickforge-settings-message">${this.message}</div>`:null}
1694
+ ${this.error?y`<div class="quickforge-settings-alert">${this.error}</div>`:null}
1695
1695
  </div>
1696
- `}},un=`quickforge-channels-settings-tab`;customElements.get(un)||customElements.define(un,ln);function dn(){return document.createElement(un)}var fn=re(),X=b(),pn=(0,P.lazy)(()=>w(()=>import(`./AgentProfilesPage-CApCpsDd.js`).then(e=>({default:e.AgentProfilesPage})),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14]))),mn=(0,P.lazy)(()=>w(()=>import(`./mcp-servers-dialog-7Xwu2RVW.js`).then(e=>({default:e.McpServersPanel})),__vite__mapDeps([15,1,2,3,4,5,6,7,8,9,10,11,12,13]))),hn=(0,P.lazy)(()=>w(()=>import(`./skills-dialog-C_JvWbAa.js`).then(e=>e.n).then(e=>({default:e.SkillsManagerPanel})),__vite__mapDeps([10,1,2,3,4,5,6,7,8,9,11,12,13]))),gn=(0,P.lazy)(()=>w(()=>import(`./PluginsPage-BIbIDfWY.js`).then(e=>({default:e.PluginsPage})),__vite__mapDeps([16,1,2,3,4,5,6,7,8,9,10,11,12,13,17]))),_n=(0,P.lazy)(()=>w(()=>import(`./ScheduledTasksPage-BOqmBNCx.js`).then(e=>({default:e.ScheduledTasksPage})),__vite__mapDeps([18,1,2,3,4,5,6,7,8,9,10,11,12,13,14]))),vn=(0,P.lazy)(()=>w(()=>import(`./ShareLinksSettingsPage-BrxQacJn.js`).then(e=>({default:e.ShareLinksSettingsPage})),__vite__mapDeps([19,1,2,3,4,5,6,7,8,9,10,11,12,13]))),yn=(0,P.lazy)(()=>w(()=>import(`./CloudAccountSettingsPage-Be5r3dtv.js`).then(e=>({default:e.CloudAccountSettingsPage})),__vite__mapDeps([20,1,2,3,4,5,6,7,8,9,10,11,12,13]))),bn=class extends S{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 x`<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,fn.createRoot)(e),this.root.render(this.renderReact()))}},xn=`quickforge-react-settings-tab`;customElements.get(xn)||customElements.define(xn,bn);function Z(e,t){let n=document.createElement(xn);return n.tabName=e,n.renderReact=t,n}function Q({children:e}){return(0,X.jsx)(`div`,{className:`quickforge-settings-stack h-full min-h-[30rem]`,children:(0,X.jsx)(P.Suspense,{fallback:(0,X.jsx)(`div`,{className:`quickforge-settings-note`,children:D(`loading`)}),children:e})})}function Sn(e){window.dispatchEvent(new CustomEvent(`quickforge:open-session-from-settings`,{detail:{sessionId:e}}))}function Cn(){return Z(D(`agentsTab`),()=>(0,X.jsx)(Q,{children:(0,X.jsx)(pn,{})}))}function wn(){return Z(D(`skills`),()=>(0,X.jsx)(Q,{children:(0,X.jsx)(hn,{active:!0,scope:`global`,embedded:!0,onSaved:()=>void 0})}))}function Tn(){return Z(D(`mcpServers`),()=>(0,X.jsx)(Q,{children:(0,X.jsx)(mn,{active:!0})}))}function En(){return Z(D(`plugins`),()=>(0,X.jsx)(Q,{children:(0,X.jsx)(gn,{})}))}function Dn(){return Z(D(`scheduledTasks`),()=>(0,X.jsx)(Q,{children:(0,X.jsx)(_n,{onOpenSession:Sn})}))}function On(){return Z(D(`cloudAccount`),()=>(0,X.jsx)(Q,{children:(0,X.jsx)(yn,{})}))}function kn(){return Z(D(`shareLinks`),()=>(0,X.jsx)(Q,{children:(0,X.jsx)(vn,{})}))}function An(e){let t=[{key:`appearance`,tab:Ze(),getDescription:()=>D(`appearanceDescription`)},{key:`cloudAccount`,tab:On(),getDescription:()=>D(`cloudAccountDescription`)},{key:`defaults`,tab:_t(),getDescription:()=>D(`defaultOptionsDescription`)},{key:`memory`,tab:wt(),getDescription:()=>D(`memoryDescription`)},{key:`customModels`,tab:Je(e),getDescription:()=>D(`customModelsDescription`)},{key:`agents`,tab:Cn(),getDescription:()=>D(`agentsDescription`)},{key:`skills`,tab:wn(),getDescription:()=>D(`globalSkillsDescription`)},{key:`mcp`,tab:Tn(),getDescription:void 0},{key:`plugins`,tab:En(),getDescription:()=>D(`pluginsDescription`)},{key:`scheduledTasks`,tab:Dn(),getDescription:()=>D(`scheduledTasksDescription`)},{key:`projectCommands`,tab:on(),getDescription:()=>D(`projectCommandsDescription`)},{key:`backup`,tab:Pt(),getDescription:()=>D(`backupRestoreDescription`)},{key:`archivedConversations`,tab:zt(),getDescription:()=>D(`archivedConversationsDescription`)},{key:`shareLinks`,tab:kn(),getDescription:()=>D(`shareLinksDescription`)},{key:`channels`,tab:dn(),getDescription:()=>D(`channelsDescription`)},{key:`lanAccess`,tab:Gt(),getDescription:()=>D(`lanAccessDescription`)},{key:`about`,tab:nn(),getDescription:()=>D(`aboutQuickForgeDescription`)}];return{items:[...t],tabs:t.map(e=>e.tab),indexOf:e=>t.findIndex(t=>t.key===e)}}var $={appearance:r,cloudAccount:u,defaults:ne,memory:l,customModels:_,agents:y,skills:n,mcp:g,plugins:d,scheduledTasks:c,projectCommands:h,backup:v,archivedConversations:s,shareLinks:f,channels:m,lanAccess:p,about:t};function jn({tab:e}){let t=(0,P.useRef)(null);return(0,P.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 Mn({initialTab:e,customProvider:t,onBack:n}){let r=(0,P.useMemo)(()=>An(t),[t]),o=Math.max(0,r.indexOf(e)),[s,c]=(0,P.useState)(),[l,u]=(0,P.useState)(null),d=s??o,[f,p]=(0,P.useState)(``),m=f.trim().toLowerCase(),h=(0,P.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]),g=(0,P.useMemo)(()=>{if(!m)return d;let e=h[0];return e?h.some(({index:e})=>e===d)?d:e.index:d},[d,h,m]),_=r.items[g]??r.items[0],v=_?.getDescription?.(),y=_?$[_.key]:void 0,b=(0,P.useRef)(null),[re,ie]=(0,P.useState)(!1);return(0,P.useEffect)(()=>{b.current?.scrollTo({top:0})},[g,l]),(0,X.jsxs)(`div`,{className:`flex h-screen min-h-0 supports-[height:100dvh]:h-dvh 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)(i,{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)(te,{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===g,r=$[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:()=>c(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:`relative flex min-w-0 flex-1 flex-col bg-[var(--quickforge-main-bg)] md:overflow-hidden md:rounded-tl-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)(he,{variant:`ghost`,size:`icon`,className:`md:hidden`,onClick:l===null?n:()=>u(null),"aria-label":l===null?`返回工作区`:`返回设置`,children:(0,X.jsx)(i,{className:`size-4`})}),(0,X.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,X.jsxs)(`div`,{className:O(`flex min-w-0 items-center gap-2`,l===null?`md:hidden`:`hidden`),children:[(0,X.jsx)(ne,{className:`size-4 shrink-0 text-muted-foreground/65`,"aria-hidden":`true`}),(0,X.jsx)(`div`,{className:`min-w-0 truncate text-sm font-medium text-foreground/90`,children:D(`settings`)})]}),(0,X.jsxs)(`div`,{className:O(`flex min-w-0 items-center gap-2`,l===null&&`hidden md:flex`),children:[y?(0,X.jsx)(y,{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:_?.tab.getTabName()}),v?(0,X.jsx)(de,{label:v}):null]})]})]}),(0,X.jsxs)(`div`,{className:O(`flex min-h-0 flex-1 flex-col md:hidden`,l!==null&&`hidden`),children:[(0,X.jsx)(`div`,{className:`shrink-0 border-b-[0.5px] border-[color-mix(in_oklab,var(--border)_30%,transparent)] px-3 py-2`,children:(0,X.jsxs)(`div`,{className:`quickforge-settings-inline-field`,children:[(0,X.jsx)(te,{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)(`nav`,{className:`quickforge-settings-mobile-list`,"aria-label":D(`settings`),children:(0,X.jsxs)(`div`,{className:`quickforge-settings-mobile-list-card`,children:[h.map(({item:e,index:t})=>{let n=$[e.key];return(0,X.jsxs)(`button`,{type:`button`,className:`quickforge-settings-mobile-list-item`,onClick:()=>{c(t),u(t)},children:[(0,X.jsx)(`span`,{className:`quickforge-settings-mobile-list-icon`,children:(0,X.jsx)(n,{className:`size-4 shrink-0`,"aria-hidden":`true`})}),(0,X.jsx)(`span`,{className:`quickforge-settings-mobile-list-label`,children:e.tab.getTabName()}),(0,X.jsx)(ee,{className:`quickforge-settings-mobile-list-chevron size-4 shrink-0`,"aria-hidden":`true`})]},e.key)}),h.length===0?(0,X.jsx)(`div`,{className:`px-2 py-8 text-center text-sm text-muted-foreground/70`,children:D(`noSettingsResults`)}):null]})})]}),(0,X.jsx)(`section`,{ref:b,onScroll:()=>ie((b.current?.scrollTop??0)>160),className:O(`min-h-0 flex-1 overflow-y-auto px-4 py-5 md:px-8 md:py-7`,l===null&&`hidden md:block`),children:(0,X.jsx)(`div`,{className:`mx-auto flex min-h-full w-full max-w-5xl flex-col`,children:h.length===0?(0,X.jsx)(`div`,{className:`rounded-xl border border-dashed border-[color-mix(in_oklab,var(--border)_70%,transparent)] p-8 text-center text-sm text-muted-foreground/70`,children:D(`noSettingsResults`)}):_?(0,X.jsx)(jn,{tab:_.tab}):null})}),(0,X.jsx)(`button`,{type:`button`,onClick:()=>b.current?.scrollTo({top:0,behavior:`smooth`}),"aria-label":`返回顶部`,className:O(`absolute bottom-5 right-4 z-20 flex size-9 items-center justify-center rounded-[10px] border-[0.5px] border-[color-mix(in_oklab,var(--border)_65%,transparent)] bg-[var(--background)] text-muted-foreground/85 shadow-[0_10px_24px_-16px_rgb(15_23_42_/_0.55)] transition-opacity duration-160 md:hidden`,re?`opacity-100`:`pointer-events-none opacity-0`,l===null&&`hidden`),children:(0,X.jsx)(a,{className:`size-4`})})]})]})}export{Mn as SettingsWorkspacePage};
1696
+ `}},ln=`quickforge-channels-settings-tab`;customElements.get(ln)||customElements.define(ln,cn);function un(){return document.createElement(ln)}var dn=ae(),Z=v(),fn=(0,M.lazy)(()=>S(()=>import(`./AgentProfilesPage-lKGIE5Dj.js`).then(e=>({default:e.AgentProfilesPage})),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14]))),pn=(0,M.lazy)(()=>S(()=>import(`./mcp-servers-dialog-xf3UR49J.js`).then(e=>({default:e.McpServersPanel})),__vite__mapDeps([15,1,2,3,4,5,6,7,8,9,10,11,12,13]))),mn=(0,M.lazy)(()=>S(()=>import(`./skills-dialog-Bbqtuy2h.js`).then(e=>e.n).then(e=>({default:e.SkillsManagerPanel})),__vite__mapDeps([10,1,2,3,4,5,6,7,8,9,11,12,13]))),hn=(0,M.lazy)(()=>S(()=>import(`./PluginsPage-DHWF13mN.js`).then(e=>({default:e.PluginsPage})),__vite__mapDeps([16,1,2,3,4,5,6,7,8,9,10,11,12,13,17]))),gn=(0,M.lazy)(()=>S(()=>import(`./ScheduledTasksPage-DLAg-i8c.js`).then(e=>({default:e.ScheduledTasksPage})),__vite__mapDeps([18,1,2,3,4,5,6,7,8,9,10,11,12,13,14]))),_n=(0,M.lazy)(()=>S(()=>import(`./ShareLinksSettingsPage-DogGa3lH.js`).then(e=>({default:e.ShareLinksSettingsPage})),__vite__mapDeps([19,1,2,3,4,5,6,7,8,9,10,11,12,13]))),vn=(0,M.lazy)(()=>S(()=>import(`./CloudAccountSettingsPage-BhXH0ups.js`).then(e=>({default:e.CloudAccountSettingsPage})),__vite__mapDeps([20,1,2,3,4,5,6,7,8,9,10,11,12,13]))),yn=class extends b{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 y`<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,dn.createRoot)(e),this.root.render(this.renderReact()))}},bn=`quickforge-react-settings-tab`;customElements.get(bn)||customElements.define(bn,yn);function Q(e,t){let n=document.createElement(bn);return n.tabName=e,n.renderReact=t,n}function $({children:e}){return(0,Z.jsx)(`div`,{className:`quickforge-settings-stack h-full min-h-[30rem]`,children:(0,Z.jsx)(M.Suspense,{fallback:(0,Z.jsx)(`div`,{className:`quickforge-settings-note`,children:D(`loading`)}),children:e})})}function xn(e){window.dispatchEvent(new CustomEvent(`quickforge:open-session-from-settings`,{detail:{sessionId:e}}))}function Sn(){return Q(D(`agentsTab`),()=>(0,Z.jsx)($,{children:(0,Z.jsx)(fn,{})}))}function Cn(){return Q(D(`skills`),()=>(0,Z.jsx)($,{children:(0,Z.jsx)(mn,{active:!0,scope:`global`,embedded:!0,onSaved:()=>void 0})}))}function wn(){return Q(D(`mcpServers`),()=>(0,Z.jsx)($,{children:(0,Z.jsx)(pn,{active:!0})}))}function Tn(){return Q(D(`plugins`),()=>(0,Z.jsx)($,{children:(0,Z.jsx)(hn,{})}))}function En(){return Q(D(`scheduledTasks`),()=>(0,Z.jsx)($,{children:(0,Z.jsx)(gn,{onOpenSession:xn})}))}function Dn(){return Q(D(`cloudAccount`),()=>(0,Z.jsx)($,{children:(0,Z.jsx)(vn,{})}))}function On(){return Q(D(`shareLinks`),()=>(0,Z.jsx)($,{children:(0,Z.jsx)(_n,{})}))}function kn(e){let t=[{key:`appearance`,tab:et(),getDescription:()=>D(`appearanceDescription`)},{key:`cloudAccount`,tab:Dn(),getDescription:()=>D(`cloudAccountDescription`)},{key:`defaults`,tab:bt(),getDescription:()=>D(`defaultOptionsDescription`)},{key:`memory`,tab:Dt(),getDescription:()=>D(`memoryDescription`)},{key:`customModels`,tab:Xe(e),getDescription:()=>D(`customModelsDescription`)},{key:`agents`,tab:Sn(),getDescription:()=>D(`agentsDescription`)},{key:`skills`,tab:Cn(),getDescription:()=>D(`globalSkillsDescription`)},{key:`mcp`,tab:wn(),getDescription:void 0},{key:`plugins`,tab:Tn(),getDescription:()=>D(`pluginsDescription`)},{key:`scheduledTasks`,tab:En(),getDescription:()=>D(`scheduledTasksDescription`)},{key:`projectCommands`,tab:an(),getDescription:()=>D(`projectCommandsDescription`)},{key:`backup`,tab:Lt(),getDescription:()=>D(`backupRestoreDescription`)},{key:`archivedConversations`,tab:Vt(),getDescription:()=>D(`archivedConversationsDescription`)},{key:`shareLinks`,tab:On(),getDescription:()=>D(`shareLinksDescription`)},{key:`channels`,tab:un(),getDescription:()=>D(`channelsDescription`)},{key:`lanAccess`,tab:Kt(),getDescription:()=>D(`lanAccessDescription`)},{key:`about`,tab:tn(),getDescription:()=>D(`aboutQuickForgeDescription`)}];return{items:[...t],tabs:t.map(e=>e.tab),indexOf:e=>t.findIndex(t=>t.key===e)}}var An={appearance:r,cloudAccount:u,defaults:re,memory:l,customModels:g,agents:_,skills:n,mcp:h,plugins:d,scheduledTasks:c,projectCommands:m,backup:ie,archivedConversations:s,shareLinks:f,channels:p,lanAccess:te,about:t};function jn({tab:e}){let t=(0,M.useRef)(null);return(0,M.useEffect)(()=>{let n=t.current;if(n)return n.replaceChildren(e),()=>{e.parentNode===n&&n.removeChild(e)}},[e]),(0,Z.jsx)(`div`,{ref:t,className:`quickforge-settings-tab-host min-h-0 flex-1`})}function Mn({initialTab:e,customProvider:t,onBack:n}){let r=(0,M.useMemo)(()=>kn(t),[t]),o=Math.max(0,r.indexOf(e)),[s,c]=(0,M.useState)(),[l,u]=(0,M.useState)(null),d=s??o,[f,te]=(0,M.useState)(``),p=f.trim().toLowerCase(),m=(0,M.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]),h=(0,M.useMemo)(()=>{if(!p)return d;let e=m[0];return e?m.some(({index:e})=>e===d)?d:e.index:d},[d,m,p]),g=r.items[h]??r.items[0],ie=g?.getDescription?.(),_=g?An[g.key]:void 0,v=(0,M.useRef)(null),[ae,oe]=(0,M.useState)(!1);return(0,M.useEffect)(()=>{v.current?.scrollTo({top:0})},[h,l]),(0,Z.jsxs)(`div`,{className:`flex h-screen min-h-0 supports-[height:100dvh]:h-dvh bg-[var(--quickforge-sidebar-bg)] text-foreground`,children:[(0,Z.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,Z.jsxs)(`div`,{className:`shrink-0 px-3 pb-2 pt-3`,children:[(0,Z.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,Z.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,Z.jsx)(i,{className:`size-4`})}),(0,Z.jsx)(`span`,{className:`truncate text-sm leading-5`,children:`返回工作区`})]}),(0,Z.jsxs)(`div`,{className:`quickforge-settings-inline-field mt-3`,children:[(0,Z.jsx)(ne,{className:`pointer-events-none absolute left-3 top-1/2 size-4 -translate-y-1/2 text-muted-foreground/60`,"aria-hidden":`true`}),(0,Z.jsx)(`input`,{value:f,onChange:e=>te(e.target.value),placeholder:D(`searchSettings`),"aria-label":D(`searchSettings`),className:`quickforge-settings-input`})]})]}),(0,Z.jsx)(`div`,{className:`min-h-0 flex-1 overflow-y-auto px-3 pb-4 pt-4`,children:(0,Z.jsxs)(`nav`,{className:`space-y-1`,"aria-label":D(`settings`),children:[m.map(({item:e,index:t})=>{let n=t===h,r=An[e.key];return(0,Z.jsxs)(`button`,{type:`button`,className:j(`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:()=>c(t),"aria-current":n?`page`:void 0,children:[(0,Z.jsx)(`span`,{className:j(`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,Z.jsx)(r,{className:`size-4`,"aria-hidden":`true`})}),(0,Z.jsx)(`span`,{className:`truncate`,children:e.tab.getTabName()})]},e.key)}),m.length===0?(0,Z.jsx)(`div`,{className:`px-2 py-3 text-sm text-muted-foreground/70`,children:D(`noSettingsResults`)}):null]})})]}),(0,Z.jsxs)(`main`,{className:`relative flex min-w-0 flex-1 flex-col bg-[var(--quickforge-main-bg)] md:overflow-hidden md:rounded-tl-2xl`,children:[(0,Z.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,Z.jsx)(Ce,{variant:`ghost`,size:`icon`,className:`md:hidden`,onClick:l===null?n:()=>u(null),"aria-label":l===null?`返回工作区`:`返回设置`,children:(0,Z.jsx)(i,{className:`size-4`})}),(0,Z.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,Z.jsxs)(`div`,{className:j(`flex min-w-0 items-center gap-2`,l===null?`md:hidden`:`hidden`),children:[(0,Z.jsx)(re,{className:`size-4 shrink-0 text-muted-foreground/65`,"aria-hidden":`true`}),(0,Z.jsx)(`div`,{className:`min-w-0 truncate text-sm font-medium text-foreground/90`,children:D(`settings`)})]}),(0,Z.jsxs)(`div`,{className:j(`flex min-w-0 items-center gap-2`,l===null&&`hidden md:flex`),children:[_?(0,Z.jsx)(_,{className:`size-4 shrink-0 text-muted-foreground/65`,"aria-hidden":`true`}):null,(0,Z.jsx)(`div`,{className:`min-w-0 truncate text-sm font-medium text-foreground/90`,children:g?.tab.getTabName()}),ie?(0,Z.jsx)(be,{label:ie}):null]})]})]}),(0,Z.jsxs)(`div`,{className:j(`flex min-h-0 flex-1 flex-col md:hidden`,l!==null&&`hidden`),children:[(0,Z.jsx)(`div`,{className:`shrink-0 border-b-[0.5px] border-[color-mix(in_oklab,var(--border)_30%,transparent)] px-3 py-2`,children:(0,Z.jsxs)(`div`,{className:`quickforge-settings-inline-field`,children:[(0,Z.jsx)(ne,{className:`pointer-events-none absolute left-3 top-1/2 size-4 -translate-y-1/2 text-muted-foreground/60`,"aria-hidden":`true`}),(0,Z.jsx)(`input`,{value:f,onChange:e=>te(e.target.value),placeholder:D(`searchSettings`),"aria-label":D(`searchSettings`),className:`quickforge-settings-input`})]})}),(0,Z.jsx)(`nav`,{className:`quickforge-settings-mobile-list`,"aria-label":D(`settings`),children:(0,Z.jsxs)(`div`,{className:`quickforge-settings-mobile-list-card`,children:[m.map(({item:e,index:t})=>{let n=An[e.key];return(0,Z.jsxs)(`button`,{type:`button`,className:`quickforge-settings-mobile-list-item`,onClick:()=>{c(t),u(t)},children:[(0,Z.jsx)(`span`,{className:`quickforge-settings-mobile-list-icon`,children:(0,Z.jsx)(n,{className:`size-4 shrink-0`,"aria-hidden":`true`})}),(0,Z.jsx)(`span`,{className:`quickforge-settings-mobile-list-label`,children:e.tab.getTabName()}),(0,Z.jsx)(ee,{className:`quickforge-settings-mobile-list-chevron size-4 shrink-0`,"aria-hidden":`true`})]},e.key)}),m.length===0?(0,Z.jsx)(`div`,{className:`px-2 py-8 text-center text-sm text-muted-foreground/70`,children:D(`noSettingsResults`)}):null]})})]}),(0,Z.jsx)(`section`,{ref:v,onScroll:()=>oe((v.current?.scrollTop??0)>160),className:j(`min-h-0 flex-1 overflow-y-auto px-4 py-5 md:px-8 md:py-7`,l===null&&`hidden md:block`),children:(0,Z.jsx)(`div`,{className:`mx-auto flex min-h-full w-full max-w-5xl flex-col`,children:m.length===0?(0,Z.jsx)(`div`,{className:`rounded-xl border border-dashed border-[color-mix(in_oklab,var(--border)_70%,transparent)] p-8 text-center text-sm text-muted-foreground/70`,children:D(`noSettingsResults`)}):g?(0,Z.jsx)(jn,{tab:g.tab}):null})}),(0,Z.jsx)(`button`,{type:`button`,onClick:()=>v.current?.scrollTo({top:0,behavior:`smooth`}),"aria-label":`返回顶部`,className:j(`absolute bottom-5 right-4 z-20 flex size-9 items-center justify-center rounded-[10px] border-[0.5px] border-[color-mix(in_oklab,var(--border)_65%,transparent)] bg-[var(--background)] text-muted-foreground/85 shadow-[0_10px_24px_-16px_rgb(15_23_42_/_0.55)] transition-opacity duration-160 md:hidden`,ae?`opacity-100`:`pointer-events-none opacity-0`,l===null&&`hidden`),children:(0,Z.jsx)(a,{className:`size-4`})})]})]})}export{Mn as SettingsWorkspacePage};