@shawnstack/quickforge 1.7.11 → 1.7.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (99) hide show
  1. package/dist/assets/{AgentProfilesPage-Cvb1KTz5.js → AgentProfilesPage-CApCpsDd.js} +1 -1
  2. package/dist/assets/ChatPanelHost-COTO7swS.js +48 -0
  3. package/dist/assets/CloudAccountSettingsPage-Be5r3dtv.js +1 -0
  4. package/dist/assets/{PluginsPage-mLvwvTmL.js → PluginsPage-BIbIDfWY.js} +1 -1
  5. package/dist/assets/ScheduledTasksPage-BOqmBNCx.js +2 -0
  6. package/dist/assets/{SettingsWorkspacePage-0OINfEqK.js → SettingsWorkspacePage-BCRtycRN.js} +390 -390
  7. package/dist/assets/ShareLinksSettingsPage-BrxQacJn.js +1 -0
  8. package/dist/assets/{SharedConversationPage-C7CDEoX9.js → SharedConversationPage-DJa0M0El.js} +1 -1
  9. package/dist/assets/TerminalDock-Cqz_9mTC.js +2 -0
  10. package/dist/assets/WorkspaceInspector-C-GOK81D.js +36 -0
  11. package/dist/assets/{abnfDiagram-VRR7QNED-CMhVoYUh.js → abnfDiagram-VRR7QNED-DGklo3PO.js} +1 -1
  12. package/dist/assets/{architectureDiagram-ZJ3FMSHR-C52qL6Hg.js → architectureDiagram-ZJ3FMSHR-CioWLVTp.js} +1 -1
  13. package/dist/assets/{blockDiagram-677ZJIJ3-CM3XbLol.js → blockDiagram-677ZJIJ3-BJWBq5e9.js} +1 -1
  14. package/dist/assets/{c4Diagram-LMCZKHZV-D7Bh1ui1.js → c4Diagram-LMCZKHZV-BacRvqFK.js} +1 -1
  15. package/dist/assets/channel-CeXY-wZo.js +1 -0
  16. package/dist/assets/{chunk-32BRIVSS-xgrtbT8e.js → chunk-32BRIVSS-B53BNE2C.js} +1 -1
  17. package/dist/assets/{chunk-52WLFC77-CDbaHw80.js → chunk-52WLFC77-CYq4hT4f.js} +1 -1
  18. package/dist/assets/{chunk-C7G6YPKG-ZMLUvfLy.js → chunk-C7G6YPKG-KFaGpP_Z.js} +1 -1
  19. package/dist/assets/{chunk-EX3LRPZG-BcQhaqt7.js → chunk-EX3LRPZG-DqVd_ihG.js} +1 -1
  20. package/dist/assets/{chunk-FWX5IMBZ-DrnrdrSu.js → chunk-FWX5IMBZ-BxRjZkOP.js} +2 -2
  21. package/dist/assets/{chunk-HOUHSVGY-tdc-Z9eW.js → chunk-HOUHSVGY-C9QO8omv.js} +1 -1
  22. package/dist/assets/{chunk-ICXQ74PX-Cd7igVGt.js → chunk-ICXQ74PX-ClbGPgLV.js} +1 -1
  23. package/dist/assets/{chunk-MOJQB5TN-CLTjV5ov.js → chunk-MOJQB5TN-Ba4wlF1J.js} +1 -1
  24. package/dist/assets/{chunk-OGEWGWER-TgvkXkFX.js → chunk-OGEWGWER-DczhQmcx.js} +1 -1
  25. package/dist/assets/{chunk-PUDLZKDR-C5GMVYup.js → chunk-PUDLZKDR-CPWpcKUF.js} +1 -1
  26. package/dist/assets/{chunk-Q4XR5HBZ-fo5-HsqY.js → chunk-Q4XR5HBZ-CiF6T--X.js} +1 -1
  27. package/dist/assets/{chunk-V7JOEXUC-CEDazV6w.js → chunk-V7JOEXUC-Dxv0zwmw.js} +1 -1
  28. package/dist/assets/{chunk-VAUOI2AC-CWYjg8zE.js → chunk-VAUOI2AC-D3J5bw1P.js} +1 -1
  29. package/dist/assets/{chunk-VR4S4FIN-C_-eEj-9.js → chunk-VR4S4FIN-BXQSwwII.js} +1 -1
  30. package/dist/assets/{chunk-WYO6CB5R-NF-MsJJR.js → chunk-WYO6CB5R-C0azl-fk.js} +2 -2
  31. package/dist/assets/{chunk-ZGVPDNZ5-CRrAYi4g.js → chunk-ZGVPDNZ5-D_8F4Akx.js} +1 -1
  32. package/dist/assets/classDiagram-OUVF2IWQ-B8M6sf49.js +1 -0
  33. package/dist/assets/classDiagram-v2-EOCWNBFH-BY7fzBDH.js +1 -0
  34. package/dist/assets/{cynefinDiagram-TSTJHNR4-D4sZ7LYI.js → cynefinDiagram-TSTJHNR4-BFlsWz0B.js} +1 -1
  35. package/dist/assets/{dagre-VKFMJZFB-BlsnSh-Q.js → dagre-VKFMJZFB-DXhpjlEs.js} +1 -1
  36. package/dist/assets/{diagram-FQU43EPY-DW1yQiRO.js → diagram-FQU43EPY-DRVVOD9k.js} +1 -1
  37. package/dist/assets/{diagram-G47NLZAW-BTUAsFjb.js → diagram-G47NLZAW-BV9Gw1tL.js} +1 -1
  38. package/dist/assets/{diagram-NH7WQ7WH-BcaomqSd.js → diagram-NH7WQ7WH-CrUkXfRY.js} +1 -1
  39. package/dist/assets/{diagram-OA4YK3LP-DDLX7Xwr.js → diagram-OA4YK3LP-CuILjn7v.js} +1 -1
  40. package/dist/assets/{diagram-WEI45ONY-CIave0An.js → diagram-WEI45ONY-nlNN3tWB.js} +1 -1
  41. package/dist/assets/{ebnfDiagram-CCIWWBDH-Cr1Y6lPu.js → ebnfDiagram-CCIWWBDH-BuDgZt9n.js} +1 -1
  42. package/dist/assets/{erDiagram-Q63AITRT-D3EgiVVH.js → erDiagram-Q63AITRT-MEwxjmtP.js} +1 -1
  43. package/dist/assets/flowDiagram-23GEKE2U-BiUP-Scq.js +1 -0
  44. package/dist/assets/{ganttDiagram-NO4QXBWP-B0oyDIqK.js → ganttDiagram-NO4QXBWP-DNw5qghE.js} +1 -1
  45. package/dist/assets/{gitGraphDiagram-IHSO6WYX-uQtr6IqK.js → gitGraphDiagram-IHSO6WYX-CaTcakAt.js} +1 -1
  46. package/dist/assets/index-BWf6y3Kh.css +3 -0
  47. package/dist/assets/index-D3GWkXJR.js +66 -0
  48. package/dist/assets/{infoDiagram-FWYZ7A6U-B_GzlLIM.js → infoDiagram-FWYZ7A6U-DwfyP7dU.js} +1 -1
  49. package/dist/assets/{ishikawaDiagram-FXEZZL3T-CKQIsSdU.js → ishikawaDiagram-FXEZZL3T-CmrzbOCV.js} +1 -1
  50. package/dist/assets/{journeyDiagram-5HDEW3XC-DrrvzZL1.js → journeyDiagram-5HDEW3XC-CYqe3sgr.js} +1 -1
  51. package/dist/assets/{kanban-definition-HUTT4EX6-CJQRTdXz.js → kanban-definition-HUTT4EX6-BMDO_mv0.js} +1 -1
  52. package/dist/assets/{line-B4DxX7tC.js → line-SbxJR8ZT.js} +1 -1
  53. package/dist/assets/lit-vendor-CinchGmI.js +2 -0
  54. package/dist/assets/local-tools-DY0yEU3T.js +350 -0
  55. package/dist/assets/{mcp-servers-dialog-B2lALtTE.js → mcp-servers-dialog-7Xwu2RVW.js} +2 -2
  56. package/dist/assets/{mermaid.core-DWpShXCs.js → mermaid.core-CwXTzYjs.js} +3 -3
  57. package/dist/assets/{mindmap-definition-LN4V7U3C-CEVwZD78.js → mindmap-definition-LN4V7U3C-CLyJ78mO.js} +1 -1
  58. package/dist/assets/{pegDiagram-2B236MQR-CBLkBdnQ.js → pegDiagram-2B236MQR-4qFznrSw.js} +1 -1
  59. package/dist/assets/{pi-web-ui-DV5jKjSg.js → pi-web-ui-BNuvqKDT.js} +289 -289
  60. package/dist/assets/{pieDiagram-ENE6RG2P-8tCnwtWS.js → pieDiagram-ENE6RG2P-141sGxVe.js} +1 -1
  61. package/dist/assets/{quadrantDiagram-ABIIQ3AL-CWd28cHF.js → quadrantDiagram-ABIIQ3AL-SUI44pAX.js} +1 -1
  62. package/dist/assets/{railroadDiagram-RFXS5EU6-CI4ouOBs.js → railroadDiagram-RFXS5EU6-1oiZuYBB.js} +1 -1
  63. package/dist/assets/{requirementDiagram-TGXJPOKE-DtFz7sw4.js → requirementDiagram-TGXJPOKE-CfVishLi.js} +1 -1
  64. package/dist/assets/{sankeyDiagram-HTMAVEWB--VeOwwk9.js → sankeyDiagram-HTMAVEWB-DVu7J_Z9.js} +1 -1
  65. package/dist/assets/{sequenceDiagram-DBY2YBRQ-B8AHk5Oe.js → sequenceDiagram-DBY2YBRQ-D-Ip2yiS.js} +1 -1
  66. package/dist/assets/{skills-dialog-DYp35JM3.js → skills-dialog-C_JvWbAa.js} +3 -3
  67. package/dist/assets/{stateDiagram-2N3HPSRC-etXnJ8X8.js → stateDiagram-2N3HPSRC-Cg0hWwrp.js} +1 -1
  68. package/dist/assets/stateDiagram-v2-6OUMAXLB-DhmzNQd9.js +1 -0
  69. package/dist/assets/{swimlanes-5IMT3BWC-pabIKAmn.js → swimlanes-5IMT3BWC-Co5D-cGU.js} +1 -1
  70. package/dist/assets/swimlanesDiagram-G3AALYLV-BEvomQNa.js +8 -0
  71. package/dist/assets/{timeline-definition-FHXFAJF6-C55MKm3L.js → timeline-definition-FHXFAJF6-CBk4c_Ua.js} +1 -1
  72. package/dist/assets/{vennDiagram-L72KCM5P-CgNf1Q9W.js → vennDiagram-L72KCM5P-BII7wdRx.js} +1 -1
  73. package/dist/assets/{wardleyDiagram-EHGQE667-Drt5ytec.js → wardleyDiagram-EHGQE667-CkyJJIXP.js} +1 -1
  74. package/dist/assets/{xychartDiagram-FW5EYKEG-hhoEo_Ar.js → xychartDiagram-FW5EYKEG-B1A66Ks0.js} +1 -1
  75. package/dist/index.html +6 -6
  76. package/package.json +1 -1
  77. package/server/agent-manager.mjs +130 -2
  78. package/server/approval-store.mjs +1 -0
  79. package/server/ask-store.mjs +78 -0
  80. package/server/routes/agent.mjs +9 -0
  81. package/server/session-state-import.mjs +20 -3
  82. package/server/tools/definitions.mjs +18 -0
  83. package/server/tools/index.mjs +14 -2
  84. package/dist/assets/ChatPanelHost-C7zV-xE_.js +0 -48
  85. package/dist/assets/CloudAccountSettingsPage-mAs_nbvw.js +0 -1
  86. package/dist/assets/ScheduledTasksPage-CuUW_9lq.js +0 -2
  87. package/dist/assets/ShareLinksSettingsPage-DqeyJYoD.js +0 -1
  88. package/dist/assets/TerminalDock-CZXcuMpq.js +0 -2
  89. package/dist/assets/WorkspaceInspector-CNSBOEvP.js +0 -36
  90. package/dist/assets/channel-Duu1CuH9.js +0 -1
  91. package/dist/assets/classDiagram-OUVF2IWQ-Cc63fLWP.js +0 -1
  92. package/dist/assets/classDiagram-v2-EOCWNBFH-CoXU0qT6.js +0 -1
  93. package/dist/assets/flowDiagram-23GEKE2U-BS7KXcqn.js +0 -1
  94. package/dist/assets/index-BgMvQW1b.js +0 -66
  95. package/dist/assets/index-CB1g2D0f.css +0 -3
  96. package/dist/assets/lit-vendor-DvaQX_UQ.js +0 -2
  97. package/dist/assets/local-tools-Dopjg9xq.js +0 -270
  98. package/dist/assets/stateDiagram-v2-6OUMAXLB-Dms3pICj.js +0 -1
  99. package/dist/assets/swimlanesDiagram-G3AALYLV-B14aWjv6.js +0 -8
@@ -1,5 +1,5 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/AgentProfilesPage-Cvb1KTz5.js","assets/rolldown-runtime-DWdDZTNf.js","assets/index-BgMvQW1b.js","assets/pi-ai-Cr2ee4a0.js","assets/dist-yDHbi5ux.js","assets/pi-web-ui-DV5jKjSg.js","assets/lit-vendor-DvaQX_UQ.js","assets/css-utils-31qzCXsk.js","assets/icons-DM_qJ7VJ.js","assets/react-vendor-BpWW_Nvp.js","assets/skills-dialog-DYp35JM3.js","assets/logger-8REuLPGK.js","assets/model-display-label-CURwH0xM.js","assets/index-CB1g2D0f.css","assets/model-identity-CgA6_Pbm.js","assets/mcp-servers-dialog-B2lALtTE.js","assets/PluginsPage-mLvwvTmL.js","assets/plugin-api-BrdQeM4B.js","assets/ScheduledTasksPage-CuUW_9lq.js","assets/ShareLinksSettingsPage-DqeyJYoD.js","assets/CloudAccountSettingsPage-mAs_nbvw.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 ae}from"./icons-DM_qJ7VJ.js";import{n as _,r as oe}from"./react-vendor-BpWW_Nvp.js";import{c as v,d as se,f as ce,l as le,p as y,u as ue}from"./lit-vendor-DvaQX_UQ.js";import{m as b,x}from"./pi-web-ui-DV5jKjSg.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 w,Ct as pe,Dn as me,J as he,Mn as ge,Mt as _e,Nn as ve,Nt as ye,Pn as T,St as be,Tt as E,U as xe,X as Se,_n as D,a as Ce,bt as we,c as Te,cn as O,dn as Ee,dt as De,ft as Oe,gn as ke,gt as k,hn as Ae,ht as A,i as je,jn as Me,jt as Ne,kn as Pe,l as Fe,ln as Ie,lt as Le,mn as Re,mt as ze,pn as Be,pt as Ve,s as He,ut as Ue,vn as We,wt as j,xn as Ge,xt as Ke}from"./index-BgMvQW1b.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:T(`presetOpenai`)},{key:`deepseek`,label:T(`presetDeepseek`)},{key:`glm`,label:T(`presetGlm`)},{key:`ollama`,label:T(`presetOllama`)},{key:`litellm`,label:T(`presetLitellm`)},{key:`custom`,label:T(`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 T(`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 Ae({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=T(`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||T(`connectionFailed`))}catch(e){this.testResult=`fail`,this.testError=e?.message||T(`connectionFailed`)}finally{this.testing=!1,this.requestUpdate()}}async saveModel(){let e=this.form.name.trim(),t=this.form.baseUrl.trim();if(!e||!t){j(T(`fillProviderBaseUrlModel`));return}let n=this.form.models.filter(e=>e.modelId.trim());if(n.length===0){j(T(`atLeastOneModel`));return}let r=n.map(e=>e.modelId.trim());if(new Set(r).size!==r.length){j(T(`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??We(),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),Ge(),this.closeForm(),await this.loadProviders()}catch(e){C.error(`Failed to save custom model:`,e),j(T(`saveCustomModelFailed`))}}async deleteProvider(e){if(await E({description:T(`confirmDeleteProvider`,{name:e.name}),confirmLabel:T(`confirmDelete`),cancelLabel:T(`cancel`),variant:`destructive`}))try{let t=x();await t.customProviders.delete(e.id),await t.providerKeys.delete(e.name),Ge(),await this.loadProviders()}catch(e){C.error(`Failed to delete custom provider:`,e),j(T(`deleteFailed`))}}renderProvider(e){let t=e.models??[],n=t.length,r=e.type===`anthropic-messages`?`Anthropic Messages`:`OpenAI Compatible`;return y`
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`
3
3
  <div class="quickforge-settings-list-item">
4
4
  <div class="quickforge-settings-list-item-main">
5
5
  <div class="flex min-w-0 items-start gap-3">
@@ -8,16 +8,16 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
8
8
  <div class="quickforge-settings-row-title">${e.name}</div>
9
9
  <div class="quickforge-settings-row-description break-all">${e.baseUrl}</div>
10
10
  <div class="quickforge-settings-meta">
11
- <span class="quickforge-settings-badge quickforge-settings-badge-muted">${T(`providerProtocol`)}: ${r}</span>
12
- <span class="quickforge-settings-badge quickforge-settings-badge-info">${T(`modelsCount`,{count:n})}</span>
13
- ${n===0?y`<span class="quickforge-settings-badge quickforge-settings-badge-warning">${T(`noModelAdded`)}</span>`:null}
11
+ <span class="quickforge-settings-badge quickforge-settings-badge-muted">${D(`providerProtocol`)}: ${r}</span>
12
+ <span class="quickforge-settings-badge quickforge-settings-badge-info">${D(`modelsCount`,{count:n})}</span>
13
+ ${n===0?x`<span class="quickforge-settings-badge quickforge-settings-badge-warning">${D(`noModelAdded`)}</span>`:null}
14
14
  </div>
15
- ${n>0?y`
15
+ ${n>0?x`
16
16
  <div class="quickforge-settings-meta">
17
- ${t.slice(0,6).map(e=>y`
17
+ ${t.slice(0,6).map(e=>x`
18
18
  <code class="quickforge-settings-command-name">${e.id}</code>
19
19
  `)}
20
- ${t.length>6?y`<span class="quickforge-settings-badge quickforge-settings-badge-muted">+${t.length-6}</span>`:null}
20
+ ${t.length>6?x`<span class="quickforge-settings-badge quickforge-settings-badge-muted">+${t.length-6}</span>`:null}
21
21
  </div>
22
22
  `:null}
23
23
  </div>
@@ -29,22 +29,22 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
29
29
  type="button"
30
30
  @click=${()=>this.openEditForm(e)}
31
31
  >
32
- ${T(`editModel`)}
32
+ ${D(`editModel`)}
33
33
  </button>
34
34
  <button
35
35
  class="quickforge-settings-button quickforge-settings-button-danger quickforge-settings-button-compact"
36
36
  type="button"
37
37
  @click=${()=>this.deleteProvider(e)}
38
38
  >
39
- ${T(`delete`)}
39
+ ${D(`delete`)}
40
40
  </button>
41
41
  </div>
42
42
  </div>
43
- `}renderPresetChips(){return y`
43
+ `}renderPresetChips(){return x`
44
44
  <div class="quickforge-settings-form-row">
45
- <span class="quickforge-settings-form-label">${T(`presets`)}</span>
45
+ <span class="quickforge-settings-form-label">${D(`presets`)}</span>
46
46
  <div class="quickforge-settings-segmented quickforge-settings-segmented-wrap">
47
- ${Je.map(e=>y`
47
+ ${Ke.map(e=>x`
48
48
  <button
49
49
  class="quickforge-settings-segmented-option ${this.activePreset===e.key?`quickforge-settings-segmented-option-active`:``}"
50
50
  type="button"
@@ -55,12 +55,12 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ 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 y`
58
+ `}renderModelRow(e,t){let n=e.open===!0;return x`
59
59
  <div class="quickforge-settings-subrow quickforge-settings-row-align-start">
60
60
  <button
61
61
  class="quickforge-settings-icon-action"
62
62
  type="button"
63
- title=${T(`expandModel`)}
63
+ title=${D(`expandModel`)}
64
64
  aria-expanded=${n?`true`:`false`}
65
65
  @click=${()=>this.toggleModelExpanded(t)}
66
66
  >
@@ -71,12 +71,12 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
71
71
  class="quickforge-settings-input quickforge-settings-mono"
72
72
  .value=${e.modelId}
73
73
  @input=${e=>this.updateModelField(t,`modelId`,e.target.value)}
74
- placeholder=${T(`modelIdPlaceholder`)}
74
+ placeholder=${D(`modelIdPlaceholder`)}
75
75
  />
76
- ${n?y`
76
+ ${n?x`
77
77
  <div class="quickforge-settings-model-grid mt-3">
78
78
  <label class="quickforge-settings-form-row">
79
- <span class="quickforge-settings-form-label">${T(`contextWindow`)}</span>
79
+ <span class="quickforge-settings-form-label">${D(`contextWindow`)}</span>
80
80
  <input
81
81
  class="quickforge-settings-input"
82
82
  .value=${String(e.contextWindow)}
@@ -85,7 +85,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
85
85
  />
86
86
  </label>
87
87
  <label class="quickforge-settings-form-row">
88
- <span class="quickforge-settings-form-label">${T(`maxTokens`)}</span>
88
+ <span class="quickforge-settings-form-label">${D(`maxTokens`)}</span>
89
89
  <input
90
90
  class="quickforge-settings-input"
91
91
  .value=${String(e.maxTokens)}
@@ -100,7 +100,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
100
100
  .checked=${e.reasoning}
101
101
  @change=${e=>this.updateModelField(t,`reasoning`,e.target.checked)}
102
102
  />
103
- <span>${T(`reasoningModel`)}</span>
103
+ <span>${D(`reasoningModel`)}</span>
104
104
  </label>
105
105
  <label class="mt-2 flex items-center gap-2 text-sm text-muted-foreground">
106
106
  <input
@@ -109,13 +109,13 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
109
109
  @change=${e=>this.updateModelField(t,`supportsImages`,e.target.checked)}
110
110
  />
111
111
  <span>
112
- ${T(`imageInputModel`)}
113
- <quickforge-info-tip .label=${T(`imageInputModelHelp`)}></quickforge-info-tip>
112
+ ${D(`imageInputModel`)}
113
+ <quickforge-info-tip .label=${D(`imageInputModelHelp`)}></quickforge-info-tip>
114
114
  </span>
115
115
  </label>
116
116
  <div class="mt-3 flex items-center justify-between gap-3 rounded-lg border border-border px-3 py-2">
117
- <span class="text-sm text-muted-foreground">${T(`showModelInSelectors`)}</span>
118
- <label class="quickforge-settings-switch" title=${T(`showModelInSelectorsHelp`)}>
117
+ <span class="text-sm text-muted-foreground">${D(`showModelInSelectors`)}</span>
118
+ <label class="quickforge-settings-switch" title=${D(`showModelInSelectorsHelp`)}>
119
119
  <input
120
120
  type="checkbox"
121
121
  .checked=${e.visibleInSelectors}
@@ -126,43 +126,43 @@ 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?y`
129
+ ${this.form.models.length>1?x`
130
130
  <button
131
131
  class="quickforge-settings-icon-action quickforge-settings-icon-action-danger"
132
132
  type="button"
133
- title=${T(`delete`)}
133
+ title=${D(`delete`)}
134
134
  @click=${()=>this.removeModelRow(t)}
135
135
  >
136
136
 
137
137
  </button>
138
138
  `:null}
139
139
  </div>
140
- `}renderHeadersEditor(){return y`
140
+ `}renderHeadersEditor(){return x`
141
141
  <div class="quickforge-settings-form-row">
142
142
  <span class="quickforge-settings-form-label">
143
- ${T(`customHeaders`)}
144
- <quickforge-info-tip .label=${T(`customHeadersHelp`)}></quickforge-info-tip>
143
+ ${D(`customHeaders`)}
144
+ <quickforge-info-tip .label=${D(`customHeadersHelp`)}></quickforge-info-tip>
145
145
  </span>
146
- ${this.form.headerRows.length===0?y``:y`
146
+ ${this.form.headerRows.length===0?x``:x`
147
147
  <div class="quickforge-settings-nested-list">
148
- ${this.form.headerRows.map((e,t)=>y`
148
+ ${this.form.headerRows.map((e,t)=>x`
149
149
  <div class="quickforge-settings-subrow">
150
150
  <input
151
151
  class="quickforge-settings-input"
152
152
  .value=${e.key}
153
153
  @input=${e=>this.updateHeaderRow(t,`key`,e.target.value)}
154
- placeholder=${T(`headerName`)}
154
+ placeholder=${D(`headerName`)}
155
155
  />
156
156
  <input
157
157
  class="quickforge-settings-input"
158
158
  .value=${e.value}
159
159
  @input=${e=>this.updateHeaderRow(t,`value`,e.target.value)}
160
- placeholder=${T(`headerValue`)}
160
+ placeholder=${D(`headerValue`)}
161
161
  />
162
162
  <button
163
163
  class="quickforge-settings-icon-action quickforge-settings-icon-action-danger"
164
164
  type="button"
165
- title=${T(`removeHeader`)}
165
+ title=${D(`removeHeader`)}
166
166
  @click=${()=>this.removeHeaderRow(t)}
167
167
  >
168
168
 
@@ -176,11 +176,11 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
176
176
  type="button"
177
177
  @click=${()=>this.addHeaderRow()}
178
178
  >
179
- + ${T(`addHeader`)}
179
+ + ${D(`addHeader`)}
180
180
  </button>
181
181
  </div>
182
- `}renderTestStatus(){return this.testResult===`idle`&&!this.testing?y``:this.testing?y`<span class="quickforge-settings-status">${T(`testingConnection`)}</span>`:this.testResult===`ok`?y`<span class="quickforge-settings-badge quickforge-settings-badge-success">✓ ${T(`connectionOk`)}</span>`:y`<span class="quickforge-settings-alert">✗ ${this.testError||T(`connectionFailed`)}</span>`}renderForm(){return y`
183
- <section class="quickforge-settings-section" aria-label=${this.editingProviderId?T(`editCustomModel`):T(`addCustomModel`)}>
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`
183
+ <section class="quickforge-settings-section" aria-label=${this.editingProviderId?D(`editCustomModel`):D(`addCustomModel`)}>
184
184
  <div class="quickforge-settings-toolbar">
185
185
  <button
186
186
  class="quickforge-settings-button quickforge-settings-button-secondary"
@@ -188,11 +188,11 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
188
188
  @click=${()=>this.closeForm()}
189
189
  >
190
190
  <svg class="size-4" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m12 19-7-7 7-7"/><path d="M19 12H5"/></svg>
191
- ${T(`back`)}
191
+ ${D(`back`)}
192
192
  </button>
193
193
  <div class="quickforge-settings-row-main">
194
- <div class="quickforge-settings-row-title">${this.editingProviderId?T(`editCustomModel`):T(`addCustomModel`)}</div>
195
- <div class="quickforge-settings-row-description">${T(`customModelsDescription`)}</div>
194
+ <div class="quickforge-settings-row-title">${this.editingProviderId?D(`editCustomModel`):D(`addCustomModel`)}</div>
195
+ <div class="quickforge-settings-row-description">${D(`customModelsDescription`)}</div>
196
196
  </div>
197
197
  </div>
198
198
 
@@ -200,12 +200,12 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
200
200
  ${this.renderPresetChips()}
201
201
 
202
202
  <label class="quickforge-settings-form-row">
203
- <span class="quickforge-settings-form-label">${T(`providerName`)}</span>
203
+ <span class="quickforge-settings-form-label">${D(`providerName`)}</span>
204
204
  <input
205
205
  class="quickforge-settings-input"
206
206
  .value=${this.form.name}
207
207
  @input=${e=>this.updateForm(`name`,e.target.value)}
208
- placeholder=${T(`providerNamePlaceholder`)}
208
+ placeholder=${D(`providerNamePlaceholder`)}
209
209
  />
210
210
  </label>
211
211
 
@@ -220,37 +220,37 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
220
220
  </label>
221
221
 
222
222
  <label class="quickforge-settings-form-row">
223
- <span class="quickforge-settings-form-label">${T(`apiKey`)}</span>
223
+ <span class="quickforge-settings-form-label">${D(`apiKey`)}</span>
224
224
  <div class="quickforge-settings-inline-field">
225
225
  <input
226
226
  class="quickforge-settings-input pr-10"
227
227
  .value=${this.form.apiKey}
228
228
  type=${this.apiKeyVisible?`text`:`password`}
229
229
  @input=${e=>this.updateForm(`apiKey`,e.target.value)}
230
- placeholder=${T(`apiKeyPlaceholder`)}
230
+ placeholder=${D(`apiKeyPlaceholder`)}
231
231
  />
232
232
  <button
233
233
  class="quickforge-settings-inline-field-button"
234
234
  type="button"
235
- title=${this.apiKeyVisible?T(`hideApiKey`):T(`showApiKey`)}
236
- aria-label=${this.apiKeyVisible?T(`hideApiKey`):T(`showApiKey`)}
235
+ title=${this.apiKeyVisible?D(`hideApiKey`):D(`showApiKey`)}
236
+ aria-label=${this.apiKeyVisible?D(`hideApiKey`):D(`showApiKey`)}
237
237
  aria-pressed=${this.apiKeyVisible?`true`:`false`}
238
238
  @click=${()=>this.toggleApiKeyVisibility()}
239
239
  >
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>`}
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>`}
241
241
  </button>
242
242
  </div>
243
243
  </label>
244
244
 
245
245
  <div class="quickforge-settings-form-row">
246
246
  <div class="flex items-center justify-between gap-3">
247
- <span class="quickforge-settings-form-label">${T(`modelsList`)}</span>
247
+ <span class="quickforge-settings-form-label">${D(`modelsList`)}</span>
248
248
  <button
249
249
  class="quickforge-settings-button quickforge-settings-button-secondary quickforge-settings-button-compact"
250
250
  type="button"
251
251
  @click=${()=>this.addModelRow()}
252
252
  >
253
- + ${T(`addModel`)}
253
+ + ${D(`addModel`)}
254
254
  </button>
255
255
  </div>
256
256
  <div class="quickforge-settings-nested-list">
@@ -265,15 +265,15 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
265
265
  @click=${()=>{this.advancedOpen=!this.advancedOpen,this.requestUpdate()}}
266
266
  >
267
267
  <span>${this.advancedOpen?`▾`:`▸`}</span>
268
- ${T(`providerAdvanced`)}
268
+ ${D(`providerAdvanced`)}
269
269
  </button>
270
270
 
271
- ${this.advancedOpen?y`
271
+ ${this.advancedOpen?x`
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">
275
- ${T(`protocolType`)}
276
- <quickforge-info-tip .label=${T(`protocolHelp`)}></quickforge-info-tip>
275
+ ${D(`protocolType`)}
276
+ <quickforge-info-tip .label=${D(`protocolHelp`)}></quickforge-info-tip>
277
277
  </span>
278
278
  <select
279
279
  class="quickforge-settings-select"
@@ -299,7 +299,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
299
299
  type="button"
300
300
  @click=${()=>this.closeForm()}
301
301
  >
302
- ${T(`cancel`)}
302
+ ${D(`cancel`)}
303
303
  </button>
304
304
  <button
305
305
  class="quickforge-settings-button quickforge-settings-button-secondary"
@@ -307,49 +307,49 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
307
307
  ?disabled=${this.testing}
308
308
  @click=${()=>this.testConnection()}
309
309
  >
310
- ${this.testing?T(`testingConnection`):T(`testConnection`)}
310
+ ${this.testing?D(`testingConnection`):D(`testConnection`)}
311
311
  </button>
312
312
  <button
313
313
  class="quickforge-settings-button quickforge-settings-button-primary"
314
314
  type="button"
315
315
  @click=${()=>this.saveModel()}
316
316
  >
317
- ${T(`save`)}
317
+ ${D(`save`)}
318
318
  </button>
319
319
  </div>
320
320
  </div>
321
321
  </section>
322
- `}render(){return this.formOpen?y`
322
+ `}render(){return this.formOpen?x`
323
323
  <div class="quickforge-settings-stack">
324
324
  <div class="quickforge-settings-heading">
325
325
  <h3 class="quickforge-settings-title">
326
- ${this.editingProviderId?T(`editCustomModel`):T(`addCustomModel`)}
327
- <quickforge-info-tip .label=${T(`customModelsDescription`)}></quickforge-info-tip>
326
+ ${this.editingProviderId?D(`editCustomModel`):D(`addCustomModel`)}
327
+ <quickforge-info-tip .label=${D(`customModelsDescription`)}></quickforge-info-tip>
328
328
  </h3>
329
329
  </div>
330
330
  ${this.renderForm()}
331
331
  </div>
332
- `:y`
332
+ `:x`
333
333
  <div class="quickforge-settings-stack">
334
- <section class="quickforge-settings-section" aria-label=${T(`customModelsTitle`)}>
334
+ <section class="quickforge-settings-section" aria-label=${D(`customModelsTitle`)}>
335
335
  <div class="quickforge-settings-toolbar">
336
336
  <div>
337
- <div class="quickforge-settings-row-title">${T(`customModelsTitle`)}</div>
338
- <div class="quickforge-settings-row-description">${T(`customModelsDescription`)}</div>
337
+ <div class="quickforge-settings-row-title">${D(`customModelsTitle`)}</div>
338
+ <div class="quickforge-settings-row-description">${D(`customModelsDescription`)}</div>
339
339
  </div>
340
340
  <button
341
341
  class="quickforge-settings-button quickforge-settings-button-primary"
342
342
  type="button"
343
343
  @click=${()=>this.openAddForm()}
344
344
  >
345
- ${T(`addModel`)}
345
+ ${D(`addModel`)}
346
346
  </button>
347
347
  </div>
348
348
 
349
- ${this.loading?y`<div class="quickforge-settings-empty-row">${T(`loading`)}</div>`:this.providers.length===0?y`<div class="quickforge-settings-empty-row">${T(`noCustomModels`)}</div>`:this.providers.map(e=>this.renderProvider(e))}
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))}
350
350
  </section>
351
351
  </div>
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:()=>T(`lightTheme`)},{value:`dark`,label:()=>T(`darkTheme`)}],Qe=class extends b{theme=Oe();interfaceFontSizePx=A.interfaceFontSizePx;messageFontSizePx=A.messageFontSizePx;loading=!0;error=``;getTabName(){return T(`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([Ve(e),we(e)]);this.theme=t.theme,this.interfaceFontSizePx=n.interfaceFontSizePx,this.messageFontSizePx=n.messageFontSizePx}catch(e){this.error=e instanceof Error?e.message:T(`requestFailed`)}finally{this.loading=!1,this.requestUpdate()}}async selectTheme(e){if(this.theme!==e){this.theme=e,this.requestUpdate();try{await ze(x(),{theme:e}),this.error=``,this.requestUpdate()}catch(e){this.error=e instanceof Error?e.message:T(`requestFailed`),this.requestUpdate()}}}currentFontSizeSettings(){return Ke({interfaceFontSizePx:this.interfaceFontSizePx,messageFontSizePx:this.messageFontSizePx})}previewFontSize(e){let t=Ke(e);this.interfaceFontSizePx=t.interfaceFontSizePx,this.messageFontSizePx=t.messageFontSizePx,pe(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 be(x(),this.currentFontSizeSettings()),this.error=``,this.requestUpdate()}catch(e){this.error=e instanceof Error?e.message:T(`requestFailed`),this.requestUpdate()}}renderThemeOption(e){let t=this.theme===e.value;return y`
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`
353
353
  <button
354
354
  type="button"
355
355
  class="quickforge-settings-segmented-option ${t?`quickforge-settings-segmented-option-active`:``}"
@@ -358,14 +358,14 @@ 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-k.min)/(k.max-k.min)*100}renderFontSizeSlider(e,t,n,r){return y`
361
+ `}getFontSizeRangeProgress(e){return(e-j.min)/(j.max-j.min)*100}renderFontSizeSlider(e,t,n,r){return x`
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?y`<quickforge-info-tip .label=${t}></quickforge-info-tip>`:null}
366
+ ${t?x`<quickforge-info-tip .label=${t}></quickforge-info-tip>`:null}
367
367
  </div>
368
- <div class="quickforge-settings-row-description">${T(`fontSizeRangeDescription`)}</div>
368
+ <div class="quickforge-settings-row-description">${D(`fontSizeRangeDescription`)}</div>
369
369
  </div>
370
370
  <div class="quickforge-settings-row-control quickforge-settings-slider-control">
371
371
  <span class="quickforge-settings-value-badge">${n}px</span>
@@ -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(k.min)}
377
- max=${String(k.max)}
376
+ min=${String(j.min)}
377
+ max=${String(j.max)}
378
378
  step="1"
379
379
  .value=${String(n)}
380
380
  @input=${e=>r(e.target.value)}
@@ -382,34 +382,34 @@ 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?y`<div class="text-sm text-muted-foreground">${T(`loading`)}</div>`:y`
385
+ `}render(){return this.loading?x`<div class="text-sm text-muted-foreground">${D(`loading`)}</div>`:x`
386
386
  <div class="quickforge-settings-stack">
387
- <section class="quickforge-settings-section" aria-label=${T(`appearance`)}>
387
+ <section class="quickforge-settings-section" aria-label=${D(`appearance`)}>
388
388
  <div class="quickforge-settings-row">
389
389
  <div class="quickforge-settings-row-main">
390
390
  <div class="quickforge-settings-row-title">
391
- ${T(`theme`)}
392
- <quickforge-info-tip .label=${T(`themeDescription`)}></quickforge-info-tip>
391
+ ${D(`theme`)}
392
+ <quickforge-info-tip .label=${D(`themeDescription`)}></quickforge-info-tip>
393
393
  </div>
394
- <div class="quickforge-settings-row-description">${T(`themeDescription`)}</div>
394
+ <div class="quickforge-settings-row-description">${D(`themeDescription`)}</div>
395
395
  </div>
396
396
  <div class="quickforge-settings-row-control">
397
- <div class="quickforge-settings-segmented" role="group" aria-label=${T(`theme`)}>
398
- ${Ze.map(e=>this.renderThemeOption(e))}
397
+ <div class="quickforge-settings-segmented" role="group" aria-label=${D(`theme`)}>
398
+ ${Ye.map(e=>this.renderThemeOption(e))}
399
399
  </div>
400
400
  </div>
401
401
  </div>
402
402
 
403
- ${this.renderFontSizeSlider(T(`interfaceFontSize`),null,this.interfaceFontSizePx,e=>this.updateInterfaceFontSize(e))}
403
+ ${this.renderFontSizeSlider(D(`interfaceFontSize`),null,this.interfaceFontSizePx,e=>this.updateInterfaceFontSize(e))}
404
404
 
405
- ${this.renderFontSizeSlider(T(`messageFontSize`),T(`messageFontSizeNote`),this.messageFontSizePx,e=>this.updateMessageFontSize(e))}
405
+ ${this.renderFontSizeSlider(D(`messageFontSize`),D(`messageFontSizeNote`),this.messageFontSizePx,e=>this.updateMessageFontSize(e))}
406
406
  </section>
407
407
 
408
- ${this.error?y`<span class="quickforge-settings-error">${this.error}</span>`:null}
408
+ ${this.error?x`<span class="quickforge-settings-error">${this.error}</span>`:null}
409
409
  </div>
410
- `}},I=`quickforge-appearance-settings-tab`;customElements.get(I)||customElements.define(I,Qe);function $e(){return document.createElement(I)}var et=`auto-compact-settings`,L={enabled:!0,thresholdPercent:80,keepRecentTurns:3,minSourceChars:1600,requireConfirmation:!0};function R(e,t,n,r){let i=Number(e);return Number.isFinite(i)?Math.min(r,Math.max(n,Math.round(i))):t}function tt(e){if(!e||typeof e!=`object`)return{...L};let t=e;return{enabled:t.enabled!==!1,thresholdPercent:R(t.thresholdPercent,L.thresholdPercent,50,95),keepRecentTurns:R(t.keepRecentTurns,L.keepRecentTurns,1,20),minSourceChars:R(t.minSourceChars,L.minSourceChars,0,2e5),requireConfirmation:t.requireConfirmation!==!1}}async function nt(e){return tt(await e.settings.get(et))}async function rt(e,t){await e.settings.set(et,tt(t))}var it=`auto-archive-settings`,at={enabled:!1};function ot(e){return!e||typeof e!=`object`?{...at}:{enabled:e.enabled===!0}}async function st(e){return ot(await e.settings.get(it))}async function ct(e,t){await e.settings.set(it,ot(t))}var lt=0,ut=class extends ue{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=v();searchRef=v();_menu=null;_menuId=`quickforge-settings-select-menu-${++lt}`;_listboxId=`quickforge-settings-select-listbox-${++lt}`;_open=!1;_searchQuery=``;focusedIndex=-1;createRenderRoot(){return this}render(){let e=this.options.find(e=>e.value===this.value);return y`
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`
411
411
  <button
412
- ${le(this.triggerRef)}
412
+ ${ie(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&&ce(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`
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`
430
430
  <div class="quickforge-settings-select-search">
431
431
  <input
432
- ${le(this.searchRef)}
432
+ ${ie(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 se;let n=e.value===this.value,r=this.focusedIndex===t;return y`
451
+ ${this.options.map((e,t)=>{if(!this._isVisible(e))return ce;let n=e.value===this.value,r=this.focusedIndex===t;return x`
452
452
  <div
453
453
  id=${this._optionId(t)}
454
454
  role="option"
@@ -459,58 +459,58 @@ 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?y`
462
+ ${n?x`
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?y`
468
+ ${this.searchable&&t===0?x`
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}}},dt=`quickforge-settings-select`;customElements.get(dt)||customElements.define(dt,ut);var ft=[{value:`off`,label:()=>T(`thinkingOff`)},{value:`low`,label:()=>T(`thinkingLow`)},{value:`medium`,label:()=>T(`thinkingMedium`)},{value:`high`,label:()=>T(`thinkingHigh`)},{value:`xhigh`,label:()=>T(`thinkingXHigh`)}],pt=[{value:`compact`,label:()=>T(`toolDisplayCompact`)},{value:`detailed`,label:()=>T(`toolDisplayDetailed`)}],z=`__custom__`;function mt(e){return(e??``).trim().replace(/\/$/,``)}function B(e){return JSON.stringify([e.provider,e.id,e.api,mt(e.baseUrl)])}function ht(){return`custom_${globalThis.crypto?.randomUUID?.().slice(0,8)||Date.now().toString(36)}`}function gt(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 _t=y`
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`
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
- `,vt=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=ge();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 T(`defaultOptions`)}connectedCallback(){super.connectedCallback(),this.loadSettings(),window.addEventListener(xe,this.handleCloudStateChanged)}disconnectedCallback(){window.removeEventListener(xe,this.handleCloudStateChanged),super.disconnectedCallback?.()}handleCloudStateChanged=()=>{this.loadSettings()};async loadCloudModels(){try{let e=await Se();return!e.configured||e.enabled===!1||e.mode===`local`||!e.hasSession?[]:await he()}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([Ee(e),de().catch(()=>[]),this.loadCloudModels(),Be(e),Ne(e),nt(e),st(e)]),c=Re(n.length?n:t,r);this.models=c,this.selectedModel=i.model?c.find(e=>B(e)===B(i.model))??c[0]:c[0],this.thinkingLevel=i.thinkingLevel??Ie(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:T(`requestFailed`)}finally{this.loading=!1,this.requestUpdate()}}updateModel(e){let t=this.models.find(t=>B(t)===e);this.selectedModel=t,this.thinkingLevel=Ie(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=ft.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){Te(!1),this.systemNotificationsEnabled=!1,this.markSaved(T(`systemNotificationsDisabled`));return}Te(!0);let t=await He();this.systemNotificationPermission=t,this.systemNotificationsEnabled=t===`granted`,t===`granted`?this.markSaved(T(`systemNotificationsEnabled`)):t===`denied`?this.error=T(`systemNotificationsDeniedHelp`):t===`unsupported`&&(this.error=T(`systemNotificationsUnsupported`))}catch(e){this.systemNotificationsEnabled=!1,this.error=e instanceof Error?e.message:T(`requestFailed`)}finally{this.systemNotificationBusy=!1,this.requestUpdate()}}async sendTestSystemNotification(){this.systemNotificationBusy=!0,this.error=``,this.requestUpdate();try{await Fe({key:`test:${Date.now()}`,title:T(`systemNotificationTestTitle`),status:`idle`,force:!0})||(this.error=T(`systemNotificationTestFailed`))}catch(e){this.error=e instanceof Error?e.message:T(`systemNotificationTestFailed`)}finally{this.systemNotificationBusy=!1,this.requestUpdate()}}systemNotificationStatusText(){return this.systemNotificationPermission===`unsupported`?T(`systemNotificationsUnsupported`):this.systemNotificationPermission===`denied`?T(`systemNotificationsPermissionDenied`):this.systemNotificationPermission===`granted`?T(`systemNotificationsPermissionGranted`):T(`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=T(`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||z}updateTerminalShellSelection(e){if(e===z){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||T(`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:T(`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 T(t?`networkProxyPacUrlRequired`:`networkProxyAddressRequired`);try{let n=new URL(e);return[`http:`,`https:`].includes(n.protocol)?n.hostname?!t&&!n.port?T(`networkProxyAddressPortError`):n.username||n.password?T(t?`networkProxyPacUrlCredentialsError`:`networkProxyAddressCredentialsError`):t&&n.hash?T(`networkProxyPacUrlFragmentError`):!t&&(n.pathname&&n.pathname!==`/`||n.search||n.hash)?T(`networkProxyAddressPathError`):``:T(t?`networkProxyPacUrlHostError`:`networkProxyAddressPortError`):T(t?`networkProxyPacUrlProtocolError`:`networkProxyAddressProtocolError`)}catch{return T(t?`networkProxyPacUrlInvalid`:`networkProxyAddressInvalid`)}}async saveNetworkProxy(){if(!(this.networkProxySaving||!this.networkProxyLoaded)){if(this.networkProxyMode===`pac`&&this.networkProxyStatus?.features?.pacUrl!==!0){this.saved=!1,this.error=T(`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||T(`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(T(`networkProxySaved`))}catch(e){this.networkProxyMode=this.savedNetworkProxyConfig.mode,this.networkProxyUrl=this.savedNetworkProxyConfig.proxyUrl,this.saved=!1,this.error=e instanceof Error?e.message:T(`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||T(`requestFailed`));this.networkProxyStatus=t?.status||null,this.markSaved(T(`networkProxyRefreshed`))}catch(e){this.error=e instanceof Error?e.message:T(`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`
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`
476
476
  <button
477
477
  type="button"
478
478
  class="quickforge-settings-segmented-option ${n?`quickforge-settings-segmented-option-active`:``}"
479
479
  aria-pressed=${n?`true`:`false`}
480
- title=${r?T(`networkProxyPacUnsupported`):``}
480
+ title=${r?D(`networkProxyPacUnsupported`):``}
481
481
  ?disabled=${this.networkProxySaving||!this.networkProxyLoaded||r}
482
482
  @click=${()=>this.updateNetworkProxyMode(e)}
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?T(`networkProxyPacUnsupported`):this.networkProxyStatus?.supported===!1?this.networkProxyStatus.error||T(`networkProxyUnsupported`):T(`networkProxyStatus`,{source:this.networkProxyStatus?.source||T(`unknown`),runtime:this.networkProxyStatus?.runtimeKind||T(`unknown`)}):T(`networkProxyLoadFailed`);return y`
487
- <section class="quickforge-settings-section" aria-label=${T(`networkConnection`)}>
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`
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">
490
490
  <div class="quickforge-settings-row-title">
491
- ${T(`networkProxyMode`)}
492
- <quickforge-info-tip .label=${T(`networkProxyDescription`)}></quickforge-info-tip>
491
+ ${D(`networkProxyMode`)}
492
+ <quickforge-info-tip .label=${D(`networkProxyDescription`)}></quickforge-info-tip>
493
493
  </div>
494
494
  <div class="quickforge-settings-row-description">${i}</div>
495
495
  </div>
496
496
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide">
497
- <div class="quickforge-settings-segmented quickforge-settings-segmented-wrap" role="group" aria-label=${T(`networkProxyMode`)}>
498
- ${this.renderNetworkProxyModeOption(`direct`,T(`networkProxyDirect`))}
499
- ${this.renderNetworkProxyModeOption(`system`,T(`networkProxySystem`))}
500
- ${this.renderNetworkProxyModeOption(`manual`,T(`networkProxyManual`))}
501
- ${this.renderNetworkProxyModeOption(`pac`,T(`networkProxyPac`))}
497
+ <div class="quickforge-settings-segmented quickforge-settings-segmented-wrap" role="group" aria-label=${D(`networkProxyMode`)}>
498
+ ${this.renderNetworkProxyModeOption(`direct`,D(`networkProxyDirect`))}
499
+ ${this.renderNetworkProxyModeOption(`system`,D(`networkProxySystem`))}
500
+ ${this.renderNetworkProxyModeOption(`manual`,D(`networkProxyManual`))}
501
+ ${this.renderNetworkProxyModeOption(`pac`,D(`networkProxyPac`))}
502
502
  </div>
503
503
  </div>
504
504
  </div>
505
505
 
506
- ${e?y`
506
+ ${e?x`
507
507
  <div class="quickforge-settings-row">
508
508
  <div class="quickforge-settings-row-main">
509
509
  <div class="quickforge-settings-row-title">
510
- ${T(this.networkProxyMode===`pac`?`networkProxyPacUrl`:`networkProxyAddress`)}
510
+ ${D(this.networkProxyMode===`pac`?`networkProxyPacUrl`:`networkProxyAddress`)}
511
511
  </div>
512
512
  <div class="quickforge-settings-row-description">
513
- ${T(this.networkProxyMode===`pac`?`networkProxyPacUrlDescription`:`networkProxyAddressDescription`)}
513
+ ${D(this.networkProxyMode===`pac`?`networkProxyPacUrlDescription`:`networkProxyAddressDescription`)}
514
514
  </div>
515
515
  </div>
516
516
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide quickforge-network-proxy-control">
@@ -518,7 +518,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
518
518
  id="quickforge-network-proxy-url"
519
519
  class="quickforge-settings-input quickforge-settings-mono"
520
520
  type="url"
521
- aria-label=${T(this.networkProxyMode===`pac`?`networkProxyPacUrl`:`networkProxyAddress`)}
521
+ aria-label=${D(this.networkProxyMode===`pac`?`networkProxyPacUrl`:`networkProxyAddress`)}
522
522
  aria-invalid=${r&&n?`true`:`false`}
523
523
  .value=${this.networkProxyUrl}
524
524
  placeholder=${this.networkProxyMode===`pac`?`https://example.com/proxy.pac`:`http://127.0.0.1:7890`}
@@ -532,17 +532,17 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
532
532
  ?disabled=${this.networkProxySaving||!this.networkProxyLoaded||t||!!n||!r}
533
533
  @click=${()=>this.saveNetworkProxy()}
534
534
  >
535
- ${this.networkProxySaving?T(`saving`):T(`networkProxySave`)}
535
+ ${this.networkProxySaving?D(`saving`):D(`networkProxySave`)}
536
536
  </button>
537
537
  </div>
538
538
  </div>
539
539
  `:null}
540
540
 
541
- ${this.networkProxyMode===`system`?y`
541
+ ${this.networkProxyMode===`system`?x`
542
542
  <div class="quickforge-settings-row">
543
543
  <div class="quickforge-settings-row-main">
544
- <div class="quickforge-settings-row-title">${T(`networkProxyRefresh`)}</div>
545
- <div class="quickforge-settings-row-description">${T(`networkProxyRefreshDescription`)}</div>
544
+ <div class="quickforge-settings-row-title">${D(`networkProxyRefresh`)}</div>
545
+ <div class="quickforge-settings-row-description">${D(`networkProxyRefreshDescription`)}</div>
546
546
  </div>
547
547
  <div class="quickforge-settings-row-control">
548
548
  <button
@@ -551,73 +551,73 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
551
551
  ?disabled=${this.networkProxySaving||!this.networkProxyLoaded}
552
552
  @click=${()=>this.refreshNetworkProxy()}
553
553
  >
554
- ${this.networkProxySaving?T(`saving`):T(`networkProxyRefresh`)}
554
+ ${this.networkProxySaving?D(`saving`):D(`networkProxyRefresh`)}
555
555
  </button>
556
556
  </div>
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||T(`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:T(`requestFailed`)}}async saveTerminalShellConfig(e,t=this.customShellProfiles(),n=T(`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||T(`requestFailed`));this.terminalShellConfig=i,this.markSaved(n)}catch(e){this.error=e instanceof Error?e.message:T(`requestFailed`),this.requestUpdate()}}async addCustomTerminalShell(){let e=this.customShellCommand.trim();if(!e){this.error=T(`terminalShellProfileRequired`),this.requestUpdate();return}let t={id:ht(),name:gt(e),command:e,builtin:!1},n=[...this.customShellProfiles(),t];this.customShellCommand=``,this.customShellEditorOpen=!1,await this.saveTerminalShellConfig(t.id,n,T(`terminalShellProfilesSaved`))}async deleteCustomTerminalShell(e){let t=this.terminalShellConfig.profiles.find(t=>t.id===e);if(!t||t.builtin||!await E({description:T(`terminalShellDeleteConfirm`,{name:t.name}),confirmLabel:T(`confirmDelete`),cancelLabel:T(`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,T(`terminalShellProfilesSaved`))}async saveDefaultModelOptions(){let e=this.selectedModel,t=e?.reasoning?this.thinkingLevel:`off`,n=this.harness,r=async()=>{try{await ke(x(),{model:e,thinkingLevel:t,harness:n}),this.savedHarness!==n&&(ye(n),this.savedHarness=n),this.markSaved()}catch(e){this.error=e instanceof Error?e.message:T(`requestFailed`),this.requestUpdate()}};this.defaultOptionsSavePromise=this.defaultOptionsSavePromise.then(r,r),await this.defaultOptionsSavePromise}async saveToolDisplayOptions(){try{await _e(x(),{toolDisplayMode:this.toolDisplayMode,showContextUsage:this.showContextUsage}),this.markSaved()}catch(e){this.error=e instanceof Error?e.message:T(`requestFailed`),this.requestUpdate()}}async saveAutoCompactOptions(){try{await rt(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:T(`requestFailed`),this.requestUpdate()}}async saveAutoArchiveOptions(){try{if(await ct(x(),{enabled:this.autoArchiveEnabled}),this.markSaved(T(`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:T(`requestFailed`),this.requestUpdate()}}modelOptions(){return this.models}languageOptions(){return[{value:`zh`,label:T(`simplifiedChinese`)},{value:`en`,label:T(`english`)}]}harnessOptions(){return[{value:`quickforge`,label:`QuickForge`},{value:`claude-code`,label:T(`claudeCodeHarnessUnavailable`),disabled:!0},{value:`opencode`,label:`OpenCode`}]}modelSelectOptions(){return this.modelOptions().map(e=>({value:B(e),label:fe(e)}))}thinkingOptions(){return ft.map(e=>({value:e.value,label:e.label()}))}terminalShellOptions(){return[...this.terminalShellConfig.profiles.map(e=>({value:e.id,label:e.name})),{value:z,label:T(`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
- <section class="quickforge-settings-section" aria-label=${T(`terminalShell`)}>
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`
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">
564
564
  <div class="quickforge-settings-row-title">
565
- ${T(`terminalShellDefault`)}
566
- <quickforge-info-tip .label=${T(`terminalShellDescription`)}></quickforge-info-tip>
565
+ ${D(`terminalShellDefault`)}
566
+ <quickforge-info-tip .label=${D(`terminalShellDescription`)}></quickforge-info-tip>
567
567
  </div>
568
568
  <div class="quickforge-settings-row-description quickforge-settings-mono">
569
- ${n?.command||T(`terminalShellNoDetected`)}
569
+ ${n?.command||D(`terminalShellNoDetected`)}
570
570
  </div>
571
571
  </div>
572
572
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide">
573
573
  <quickforge-settings-select
574
- .value=${r?z:t}
574
+ .value=${r?V:t}
575
575
  .options=${this.terminalShellOptions()}
576
- label=${T(`terminalShellDefault`)}
576
+ label=${D(`terminalShellDefault`)}
577
577
  @change=${e=>this.updateTerminalShellSelection(e.detail)}
578
578
  ></quickforge-settings-select>
579
- ${n&&!n.builtin&&!r?y`
579
+ ${n&&!n.builtin&&!r?x`
580
580
  <button
581
581
  class="quickforge-settings-icon-action quickforge-settings-icon-action-danger"
582
582
  type="button"
583
- title=${T(`delete`)}
584
- aria-label=${T(`delete`)}
583
+ title=${D(`delete`)}
584
+ aria-label=${D(`delete`)}
585
585
  @click=${()=>this.deleteCustomTerminalShell(n.id)}
586
586
  >
587
- ${_t}
587
+ ${ht}
588
588
  </button>
589
589
  `:null}
590
590
  </div>
591
591
  </div>
592
592
 
593
- ${r?y`
593
+ ${r?x`
594
594
  <div class="quickforge-settings-row">
595
595
  <div class="quickforge-settings-row-main">
596
- <div class="quickforge-settings-row-title">${T(`terminalShellCommand`)}</div>
597
- <div class="quickforge-settings-row-description">${T(`terminalShellCustomDescription`)}</div>
596
+ <div class="quickforge-settings-row-title">${D(`terminalShellCommand`)}</div>
597
+ <div class="quickforge-settings-row-description">${D(`terminalShellCustomDescription`)}</div>
598
598
  </div>
599
599
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide quickforge-terminal-shell-command-control">
600
600
  <input
601
601
  class="quickforge-settings-input quickforge-settings-mono"
602
602
  type="text"
603
603
  .value=${this.customShellCommand}
604
- placeholder=${T(`terminalShellCommandPlaceholder`)}
604
+ placeholder=${D(`terminalShellCommandPlaceholder`)}
605
605
  @input=${e=>{this.customShellCommand=e.target.value}}
606
606
  />
607
607
  <button
608
608
  class="quickforge-settings-button quickforge-settings-button-primary"
609
609
  type="button"
610
- title=${T(`terminalShellAdd`)}
611
- aria-label=${T(`terminalShellAdd`)}
610
+ title=${D(`terminalShellAdd`)}
611
+ aria-label=${D(`terminalShellAdd`)}
612
612
  @click=${()=>this.addCustomTerminalShell()}
613
613
  >
614
- ${T(`terminalShellAdd`)}
614
+ ${D(`terminalShellAdd`)}
615
615
  </button>
616
616
  </div>
617
617
  </div>
618
618
  `:null}
619
619
  </section>
620
- `}renderToolDisplayModeOption(e){let t=this.toolDisplayMode===e.value;return y`
620
+ `}renderToolDisplayModeOption(e){let t=this.toolDisplayMode===e.value;return x`
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 y`
629
+ `}renderSwitch(e,t,n=!1){return x`
630
630
  <label class="quickforge-settings-switch" aria-disabled=${n?`true`:`false`}>
631
631
  <input
632
632
  type="checkbox"
@@ -636,22 +636,22 @@ 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?y`<div class="text-sm text-muted-foreground">${T(`loading`)}</div>`:y`
639
+ `}render(){return this.loading?x`<div class="text-sm text-muted-foreground">${D(`loading`)}</div>`:x`
640
640
  <div class="quickforge-settings-stack">
641
- <section class="quickforge-settings-section" aria-label=${T(`defaultOptions`)}>
641
+ <section class="quickforge-settings-section" aria-label=${D(`defaultOptions`)}>
642
642
  <div class="quickforge-settings-row">
643
643
  <div class="quickforge-settings-row-main">
644
644
  <div class="quickforge-settings-row-title">
645
- ${T(`language`)}
646
- <quickforge-info-tip .label=${T(`languageDescription`)}></quickforge-info-tip>
645
+ ${D(`language`)}
646
+ <quickforge-info-tip .label=${D(`languageDescription`)}></quickforge-info-tip>
647
647
  </div>
648
- <div class="quickforge-settings-row-description">${T(`displayLanguage`)}</div>
648
+ <div class="quickforge-settings-row-description">${D(`displayLanguage`)}</div>
649
649
  </div>
650
650
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide">
651
651
  <quickforge-settings-select
652
652
  .value=${this.selectedLanguage}
653
653
  .options=${this.languageOptions()}
654
- label=${T(`language`)}
654
+ label=${D(`language`)}
655
655
  @change=${e=>this.updateLanguage(e.detail)}
656
656
  ></quickforge-settings-select>
657
657
  </div>
@@ -659,14 +659,14 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
659
659
 
660
660
  <div class="quickforge-settings-row">
661
661
  <div class="quickforge-settings-row-main">
662
- <div class="quickforge-settings-row-title">${T(`defaultHarness`)}</div>
663
- <div class="quickforge-settings-row-description">${T(`defaultHarnessDescription`)}</div>
662
+ <div class="quickforge-settings-row-title">${D(`defaultHarness`)}</div>
663
+ <div class="quickforge-settings-row-description">${D(`defaultHarnessDescription`)}</div>
664
664
  </div>
665
665
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide">
666
666
  <quickforge-settings-select
667
667
  .value=${this.harness}
668
668
  .options=${this.harnessOptions()}
669
- label=${T(`defaultHarness`)}
669
+ label=${D(`defaultHarness`)}
670
670
  @change=${e=>this.updateHarness(e.detail)}
671
671
  ></quickforge-settings-select>
672
672
  </div>
@@ -674,19 +674,19 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
674
674
 
675
675
  <div class="quickforge-settings-row">
676
676
  <div class="quickforge-settings-row-main">
677
- <div class="quickforge-settings-row-title">${T(`defaultModel`)}</div>
678
- <div class="quickforge-settings-row-description">${T(`defaultModelDescription`)}</div>
677
+ <div class="quickforge-settings-row-title">${D(`defaultModel`)}</div>
678
+ <div class="quickforge-settings-row-description">${D(`defaultModelDescription`)}</div>
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?B(this.selectedModel):``}
682
+ .value=${this.selectedModel?H(this.selectedModel):``}
683
683
  .options=${this.modelSelectOptions()}
684
684
  .disabled=${this.models.length===0}
685
685
  searchable
686
- searchPlaceholder=${T(`search`)}
687
- noResultsLabel=${T(`noMatchingOptions`)}
688
- placeholder=${T(`noModelAvailable`)}
689
- label=${T(`defaultModel`)}
686
+ searchPlaceholder=${D(`search`)}
687
+ noResultsLabel=${D(`noMatchingOptions`)}
688
+ placeholder=${D(`noModelAvailable`)}
689
+ label=${D(`defaultModel`)}
690
690
  @change=${e=>this.updateModel(e.detail)}
691
691
  ></quickforge-settings-select>
692
692
  </div>
@@ -694,9 +694,9 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
694
694
 
695
695
  <div class="quickforge-settings-row">
696
696
  <div class="quickforge-settings-row-main">
697
- <div class="quickforge-settings-row-title">${T(`defaultThinkingLevel`)}</div>
697
+ <div class="quickforge-settings-row-title">${D(`defaultThinkingLevel`)}</div>
698
698
  <div class="quickforge-settings-row-description">
699
- ${this.selectedModel?.reasoning?T(`defaultThinkingLevelDescription`):T(`thinkingRequiresReasoningModel`)}
699
+ ${this.selectedModel?.reasoning?D(`defaultThinkingLevelDescription`):D(`thinkingRequiresReasoningModel`)}
700
700
  </div>
701
701
  </div>
702
702
  <div class="quickforge-settings-row-control">
@@ -704,7 +704,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
704
704
  .value=${this.thinkingLevel}
705
705
  .options=${this.thinkingOptions()}
706
706
  .disabled=${!this.selectedModel?.reasoning}
707
- label=${T(`defaultThinkingLevel`)}
707
+ label=${D(`defaultThinkingLevel`)}
708
708
  @change=${e=>this.updateThinkingLevel(e.detail)}
709
709
  ></quickforge-settings-select>
710
710
  </div>
@@ -713,14 +713,14 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
713
713
  <div class="quickforge-settings-row">
714
714
  <div class="quickforge-settings-row-main">
715
715
  <div class="quickforge-settings-row-title">
716
- ${T(`toolDisplay`)}
717
- <quickforge-info-tip .label=${T(`toolDisplayModeDescription`)}></quickforge-info-tip>
716
+ ${D(`toolDisplay`)}
717
+ <quickforge-info-tip .label=${D(`toolDisplayModeDescription`)}></quickforge-info-tip>
718
718
  </div>
719
- <div class="quickforge-settings-row-description">${T(`toolDisplayModeDescription`)}</div>
719
+ <div class="quickforge-settings-row-description">${D(`toolDisplayModeDescription`)}</div>
720
720
  </div>
721
721
  <div class="quickforge-settings-row-control">
722
- <div class="quickforge-settings-segmented" role="group" aria-label=${T(`toolDisplay`)}>
723
- ${pt.map(e=>this.renderToolDisplayModeOption(e))}
722
+ <div class="quickforge-settings-segmented" role="group" aria-label=${D(`toolDisplay`)}>
723
+ ${dt.map(e=>this.renderToolDisplayModeOption(e))}
724
724
  </div>
725
725
  </div>
726
726
  </div>
@@ -728,19 +728,19 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
728
728
  <div class="quickforge-settings-row">
729
729
  <div class="quickforge-settings-row-main">
730
730
  <div class="quickforge-settings-row-title">
731
- ${T(`systemNotifications`)}
732
- <quickforge-info-tip .label=${T(`systemNotificationsDescription`)}></quickforge-info-tip>
731
+ ${D(`systemNotifications`)}
732
+ <quickforge-info-tip .label=${D(`systemNotificationsDescription`)}></quickforge-info-tip>
733
733
  </div>
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?y`
737
+ ${this.systemNotificationsEnabled?x`
738
738
  <button
739
739
  class="quickforge-settings-button quickforge-settings-button-secondary"
740
740
  type="button"
741
741
  ?disabled=${this.systemNotificationBusy}
742
742
  @click=${()=>this.sendTestSystemNotification()}
743
- >${T(`systemNotificationsTest`)}</button>
743
+ >${D(`systemNotificationsTest`)}</button>
744
744
  `:null}
745
745
  ${this.renderSwitch(this.systemNotificationsEnabled,e=>{this.updateSystemNotifications(e)},this.systemNotificationBusy||this.systemNotificationPermission===`unsupported`)}
746
746
  </div>
@@ -749,10 +749,10 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
749
749
  <div class="quickforge-settings-row">
750
750
  <div class="quickforge-settings-row-main">
751
751
  <div class="quickforge-settings-row-title">
752
- ${T(`showContextUsage`)}
753
- <quickforge-info-tip .label=${T(`showContextUsageDescription`)}></quickforge-info-tip>
752
+ ${D(`showContextUsage`)}
753
+ <quickforge-info-tip .label=${D(`showContextUsageDescription`)}></quickforge-info-tip>
754
754
  </div>
755
- <div class="quickforge-settings-row-description">${T(`showContextUsageDescription`)}</div>
755
+ <div class="quickforge-settings-row-description">${D(`showContextUsageDescription`)}</div>
756
756
  </div>
757
757
  <div class="quickforge-settings-row-control">
758
758
  ${this.renderSwitch(this.showContextUsage,e=>this.updateShowContextUsage(e))}
@@ -762,10 +762,10 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
762
762
  <div class="quickforge-settings-row">
763
763
  <div class="quickforge-settings-row-main">
764
764
  <div class="quickforge-settings-row-title">
765
- ${T(`autoArchiveEnabled`)}
766
- <quickforge-info-tip .label=${T(`autoArchiveDescription`)}></quickforge-info-tip>
765
+ ${D(`autoArchiveEnabled`)}
766
+ <quickforge-info-tip .label=${D(`autoArchiveDescription`)}></quickforge-info-tip>
767
767
  </div>
768
- <div class="quickforge-settings-row-description">${T(`autoArchiveTriggerNote`)}</div>
768
+ <div class="quickforge-settings-row-description">${D(`autoArchiveTriggerNote`)}</div>
769
769
  </div>
770
770
  <div class="quickforge-settings-row-control">
771
771
  ${this.renderSwitch(this.autoArchiveEnabled,e=>this.updateAutoArchiveEnabled(e))}
@@ -775,10 +775,10 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
775
775
  <div class="quickforge-settings-row">
776
776
  <div class="quickforge-settings-row-main">
777
777
  <div class="quickforge-settings-row-title">
778
- ${T(`autoCompactEnabled`)}
779
- <quickforge-info-tip .label=${T(`autoCompactDescription`)}></quickforge-info-tip>
778
+ ${D(`autoCompactEnabled`)}
779
+ <quickforge-info-tip .label=${D(`autoCompactDescription`)}></quickforge-info-tip>
780
780
  </div>
781
- <div class="quickforge-settings-row-description">${T(`autoCompactTriggerNote`)}</div>
781
+ <div class="quickforge-settings-row-description">${D(`autoCompactTriggerNote`)}</div>
782
782
  </div>
783
783
  <div class="quickforge-settings-row-control">
784
784
  ${this.renderSwitch(this.autoCompactEnabled,e=>this.updateAutoCompactEnabled(e))}
@@ -787,8 +787,8 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
787
787
 
788
788
  <div class="quickforge-settings-row">
789
789
  <div class="quickforge-settings-row-main">
790
- <div class="quickforge-settings-row-title">${T(`autoCompactRequireConfirmation`)}</div>
791
- <div class="quickforge-settings-row-description">${T(`autoCompactRequireConfirmationDescription`)}</div>
790
+ <div class="quickforge-settings-row-title">${D(`autoCompactRequireConfirmation`)}</div>
791
+ <div class="quickforge-settings-row-description">${D(`autoCompactRequireConfirmationDescription`)}</div>
792
792
  </div>
793
793
  <div class="quickforge-settings-row-control">
794
794
  ${this.renderSwitch(this.autoCompactRequireConfirmation,e=>this.updateAutoCompactRequireConfirmation(e),!this.autoCompactEnabled)}
@@ -797,8 +797,8 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
797
797
 
798
798
  <div class="quickforge-settings-row">
799
799
  <div class="quickforge-settings-row-main">
800
- <div class="quickforge-settings-row-title">${T(`autoCompactThresholdPercent`)}</div>
801
- <div class="quickforge-settings-row-description">${T(`autoCompactThresholdDescription`)}</div>
800
+ <div class="quickforge-settings-row-title">${D(`autoCompactThresholdPercent`)}</div>
801
+ <div class="quickforge-settings-row-description">${D(`autoCompactThresholdDescription`)}</div>
802
802
  </div>
803
803
  <div class="quickforge-settings-row-control">
804
804
  <input
@@ -819,10 +819,10 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
819
819
  <div class="quickforge-settings-row">
820
820
  <div class="quickforge-settings-row-main">
821
821
  <div class="quickforge-settings-row-title">
822
- ${T(`autoCompactKeepRecentTurns`)}
823
- <quickforge-info-tip .label=${T(`autoCompactHistoryPreserved`)}></quickforge-info-tip>
822
+ ${D(`autoCompactKeepRecentTurns`)}
823
+ <quickforge-info-tip .label=${D(`autoCompactHistoryPreserved`)}></quickforge-info-tip>
824
824
  </div>
825
- <div class="quickforge-settings-row-description">${T(`autoCompactKeepRecentTurnsDescription`)}</div>
825
+ <div class="quickforge-settings-row-description">${D(`autoCompactKeepRecentTurnsDescription`)}</div>
826
826
  </div>
827
827
  <div class="quickforge-settings-row-control">
828
828
  <input
@@ -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?y`<div class="quickforge-settings-message" role="status">${this.savedMessage||T(`defaultOptionsSaved`)}</div>`:null}
849
- ${this.error?y`<div class="quickforge-settings-alert" role="alert">${this.error}</div>`:null}
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}
850
850
  </div>
851
- `}},V=`quickforge-default-options-settings-tab`;customElements.get(V)||customElements.define(V,vt);function yt(){return document.createElement(V)}var bt=`memory-settings`,xt={enabled:!0};function St(e){return!e||typeof e!=`object`?{...xt}:{enabled:e.enabled!==!1}}async function Ct(e){return St(await e.settings.get(bt))}async function wt(e,t){await e.settings.set(bt,St(t))}var Tt=class extends b{enabled=!0;loading=!0;saving=!1;loadingDocument=!1;markdown=``;savedMarkdown=``;memoryPath=`~/.quickforge/MEMORY.md`;message=``;error=``;getTabName(){return T(`memory`)}async connectedCallback(){super.connectedCallback(),await this.loadSettings()}async loadSettings(){this.loading=!0,this.error=``,this.requestUpdate();try{let[e]=await Promise.all([Ct(x()),this.loadDocument()]);this.enabled=e.enabled}catch(e){this.error=e instanceof Error?e.message:T(`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||T(`requestFailed`));this.markdown=n.markdown,this.savedMarkdown=n.markdown,this.memoryPath=n.path||this.memoryPath,e&&(this.message=T(`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 wt(x(),{enabled:e}),this.message=T(e?`memoryEnabledSaved`:`memoryDisabledSaved`)}catch(e){this.enabled=t,this.error=e instanceof Error?e.message:T(`requestFailed`)}finally{this.saving=!1,this.requestUpdate()}}async reloadDocument(){try{await this.loadDocument(!0)}catch(e){this.error=e instanceof Error?e.message:T(`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||T(`requestFailed`));this.markdown=t.markdown,this.savedMarkdown=t.markdown,this.memoryPath=t.path||this.memoryPath,this.message=T(`memoryContentSaved`)}catch(e){this.error=e instanceof Error?e.message:T(`requestFailed`)}finally{this.saving=!1,this.requestUpdate()}}}renderSwitch(){return y`
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`
852
852
  <label class="quickforge-settings-switch" aria-disabled=${this.saving?`true`:`false`}>
853
853
  <input
854
854
  type="checkbox"
@@ -858,24 +858,24 @@ 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 y`<div class="text-sm text-muted-foreground">${T(`loading`)}</div>`;let e=this.markdown!==this.savedMarkdown,t=this.saving||this.loadingDocument;return y`
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`
862
862
  <div class="quickforge-settings-stack">
863
- <section class="quickforge-settings-section" aria-label=${T(`memory`)}>
863
+ <section class="quickforge-settings-section" aria-label=${D(`memory`)}>
864
864
  <div class="quickforge-settings-row">
865
865
  <div class="quickforge-settings-row-main">
866
866
  <div class="quickforge-settings-row-title">
867
- ${T(`globalMemory`)}
868
- <quickforge-info-tip .label=${T(`globalMemoryInfo`)}></quickforge-info-tip>
867
+ ${D(`globalMemory`)}
868
+ <quickforge-info-tip .label=${D(`globalMemoryInfo`)}></quickforge-info-tip>
869
869
  </div>
870
- <div class="quickforge-settings-row-description">${T(`globalMemoryDescription`)}</div>
870
+ <div class="quickforge-settings-row-description">${D(`globalMemoryDescription`)}</div>
871
871
  </div>
872
872
  <div class="quickforge-settings-row-control">${this.renderSwitch()}</div>
873
873
  </div>
874
874
 
875
875
  <div class="quickforge-settings-row">
876
876
  <div class="quickforge-settings-row-main">
877
- <div class="quickforge-settings-row-title">${T(`memoryFile`)}</div>
878
- <div class="quickforge-settings-row-description">${T(`memoryFileDescription`)}</div>
877
+ <div class="quickforge-settings-row-title">${D(`memoryFile`)}</div>
878
+ <div class="quickforge-settings-row-description">${D(`memoryFileDescription`)}</div>
879
879
  </div>
880
880
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide">
881
881
  <code class="text-xs text-muted-foreground">${this.memoryPath}</code>
@@ -884,8 +884,8 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
884
884
 
885
885
  <div class="quickforge-settings-row quickforge-settings-row-align-start quickforge-memory-content-row">
886
886
  <div class="quickforge-settings-row-main">
887
- <div class="quickforge-settings-row-title">${T(`memoryContent`)}</div>
888
- <div class="quickforge-settings-row-description">${this.enabled?T(`memoryContentDescription`):T(`memoryContentDisabledDescription`)}</div>
887
+ <div class="quickforge-settings-row-title">${D(`memoryContent`)}</div>
888
+ <div class="quickforge-settings-row-description">${this.enabled?D(`memoryContentDescription`):D(`memoryContentDisabledDescription`)}</div>
889
889
  </div>
890
890
  <div class="quickforge-memory-editor-control">
891
891
  <textarea
@@ -901,24 +901,24 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
901
901
  type="button"
902
902
  ?disabled=${t}
903
903
  @click=${()=>void this.reloadDocument()}
904
- >${this.loadingDocument?T(`loading`):T(`memoryReload`)}</button>
904
+ >${this.loadingDocument?D(`loading`):D(`memoryReload`)}</button>
905
905
  <button
906
906
  class="quickforge-settings-button quickforge-settings-button-primary"
907
907
  type="button"
908
908
  ?disabled=${!this.enabled||t||!e}
909
909
  @click=${()=>void this.saveDocument()}
910
- >${this.saving?T(`saving`):T(`memorySave`)}</button>
910
+ >${this.saving?D(`saving`):D(`memorySave`)}</button>
911
911
  </div>
912
912
  </div>
913
913
  </div>
914
914
 
915
- <div class="quickforge-settings-note">${T(`memoryCurrentSessionNote`)}</div>
915
+ <div class="quickforge-settings-note">${D(`memoryCurrentSessionNote`)}</div>
916
916
  </section>
917
917
 
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}
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}
920
920
  </div>
921
- `}},H=`quickforge-memory-settings-tab`;customElements.get(H)||customElements.define(H,Tt);function Et(){return document.createElement(H)}var Dt=`quickforge-backup`,U=[{id:`settings`,countKey:`settings`,label:()=>T(`restoreSettings`),description:()=>T(`restoreSettingsDescription`)},{id:`mcp`,countKey:`mcp`,label:()=>T(`restoreMcp`),description:()=>T(`restoreMcpDescription`)},{id:`providerKeys`,countKey:`providerKeys`,label:()=>T(`restoreProviderKeys`),description:()=>T(`restoreProviderKeysDescription`)},{id:`customProviders`,countKey:`customProviders`,label:()=>T(`restoreCustomProviders`),description:()=>T(`restoreCustomProvidersDescription`)},{id:`scheduledTasks`,countKey:`scheduledTasks`,label:()=>T(`restoreScheduledTasks`),description:()=>T(`restoreScheduledTasksDescription`)}],Ot=U;function kt(e,t){let n=new Blob([`${JSON.stringify(t,null,2)}\n`],{type:`application/json`}),r=URL.createObjectURL(n),i=document.createElement(`a`);i.href=r,i.download=e,document.body.appendChild(i),i.click(),i.remove(),URL.revokeObjectURL(r)}function At(){return new Date().toISOString().replace(/[:.]/g,`-`)}function jt(e){return e?Object.entries(e).map(([e,t])=>`${e}: ${t}`).join(`, `):``}function Mt(e){return Ot.filter(t=>(e.sections?.[t.countKey]??0)>0)}function Nt(e){return Mt(e).map(e=>e.id)}function Pt(e){return e instanceof RangeError||e instanceof Error&&e.message.includes(`Invalid string length`)}function W(e,t){return Pt(e)?T(`backupStringTooLarge`):e instanceof Error?e.message:t}var Ft=class extends b{exportSections=new Set(U.map(e=>e.id));busy=!1;message=``;error=``;safetyBackupPath=``;pendingImport=null;getTabName(){return T(`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=T(`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||T(`backupExportFailed`));kt(`${Dt}-settings-${At()}.json`,n),this.message=T(`backupExported`)}catch(e){this.error=W(e,T(`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||T(`backupInspectFailed`));if(!n)throw Error(T(`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(Nt(t));this.pendingImport={backup:null,importToken:t.importToken,inspect:t,selectedSections:n,mode:`replace`},this.message=t.ignoredConversations?T(`backupInspectedWithIgnoredConversations`):T(`backupInspected`)}catch(e){this.error=W(e,T(`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=T(`selectAtLeastOneRestoreSection`),this.requestUpdate();return}if(await E({description:this.pendingImport.mode===`replace`?T(`backupImportReplaceConfirm`):T(`backupImportMergeConfirm`),confirmLabel:T(`confirmImportSelected`),cancelLabel:T(`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||T(`backupImportFailed`));let r=jt(n?.summary);this.safetyBackupPath=n?.safetyBackupPath||``,this.pendingImport=null,this.message=r?`${T(`backupImported`)} ${r}`:T(`backupImported`),window.setTimeout(()=>window.location.reload(),1500)}catch(e){this.error=W(e,T(`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`
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`
922
922
  <label class="quickforge-settings-switch" aria-disabled=${n?`true`:`false`}>
923
923
  <input
924
924
  type="checkbox"
@@ -928,69 +928,69 @@ 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=Mt(e);return y`
932
- <section class="quickforge-settings-section" aria-label=${T(`backupInspectTitle`)}>
931
+ `}renderPendingImport(){if(!this.pendingImport)return null;let{inspect:e,selectedSections:t}=this.pendingImport,n=At(e);return x`
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">
935
- <div class="quickforge-settings-row-title">${T(`backupInspectTitle`)}</div>
936
- <div class="quickforge-settings-row-description">${T(`backupInspectDescription`)}</div>
935
+ <div class="quickforge-settings-row-title">${D(`backupInspectTitle`)}</div>
936
+ <div class="quickforge-settings-row-description">${D(`backupInspectDescription`)}</div>
937
937
  </div>
938
938
  </div>
939
939
 
940
940
  <div class="quickforge-settings-nested-list">
941
941
  <div class="quickforge-settings-subrow">
942
942
  <div class="quickforge-settings-row-main">
943
- <div class="quickforge-settings-row-title">${T(`backupInspectExportedAt`)}</div>
943
+ <div class="quickforge-settings-row-title">${D(`backupInspectExportedAt`)}</div>
944
944
  </div>
945
945
  <div class="quickforge-settings-row-control quickforge-settings-readonly-value">${e.exportedAt||`-`}</div>
946
946
  </div>
947
947
  <div class="quickforge-settings-subrow">
948
948
  <div class="quickforge-settings-row-main">
949
- <div class="quickforge-settings-row-title">${T(`backupInspectVersion`)}</div>
949
+ <div class="quickforge-settings-row-title">${D(`backupInspectVersion`)}</div>
950
950
  </div>
951
951
  <div class="quickforge-settings-row-control quickforge-settings-readonly-value">${e.version??`-`}</div>
952
952
  </div>
953
953
  <div class="quickforge-settings-subrow">
954
954
  <div class="quickforge-settings-row-main">
955
- <div class="quickforge-settings-row-title">${T(`backupInspectScope`)}</div>
955
+ <div class="quickforge-settings-row-title">${D(`backupInspectScope`)}</div>
956
956
  </div>
957
957
  <div class="quickforge-settings-row-control quickforge-settings-readonly-value">${e.scope||`-`}</div>
958
958
  </div>
959
959
  <div class="quickforge-settings-subrow">
960
960
  <div class="quickforge-settings-row-main">
961
- <div class="quickforge-settings-row-title">${T(`backupInspectSecrets`)}</div>
961
+ <div class="quickforge-settings-row-title">${D(`backupInspectSecrets`)}</div>
962
962
  </div>
963
- <div class="quickforge-settings-row-control quickforge-settings-readonly-value">${e.includeSecrets?T(`yes`):T(`no`)}</div>
963
+ <div class="quickforge-settings-row-control quickforge-settings-readonly-value">${e.includeSecrets?D(`yes`):D(`no`)}</div>
964
964
  </div>
965
965
  </div>
966
966
 
967
- ${e.warnings?.length?y`
967
+ ${e.warnings?.length?x`
968
968
  <div class="quickforge-settings-warning quickforge-settings-warning-attached">
969
- ${e.warnings.map(e=>y`<div>⚠ ${e}</div>`)}
969
+ ${e.warnings.map(e=>x`<div>⚠ ${e}</div>`)}
970
970
  </div>
971
971
  `:null}
972
972
 
973
- ${e.invalidSections&&Object.keys(e.invalidSections).length?y`
973
+ ${e.invalidSections&&Object.keys(e.invalidSections).length?x`
974
974
  <div class="quickforge-settings-warning quickforge-settings-warning-attached">
975
- <div>${T(`backupInvalidSections`)}</div>
976
- ${Object.entries(e.invalidSections).map(([e,t])=>y`<div>${e}: ${t}</div>`)}
975
+ <div>${D(`backupInvalidSections`)}</div>
976
+ ${Object.entries(e.invalidSections).map(([e,t])=>x`<div>${e}: ${t}</div>`)}
977
977
  </div>
978
978
  `:null}
979
979
 
980
980
  <div class="quickforge-settings-row">
981
981
  <div class="quickforge-settings-row-main">
982
- <div class="quickforge-settings-row-title">${T(`restoreMode`)}</div>
983
- <div class="quickforge-settings-row-description">${T(`restoreModeDescription`)}</div>
982
+ <div class="quickforge-settings-row-title">${D(`restoreMode`)}</div>
983
+ <div class="quickforge-settings-row-description">${D(`restoreModeDescription`)}</div>
984
984
  </div>
985
985
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide">
986
- <div class="quickforge-settings-segmented" role="group" aria-label=${T(`restoreMode`)}>
986
+ <div class="quickforge-settings-segmented" role="group" aria-label=${D(`restoreMode`)}>
987
987
  <button
988
988
  type="button"
989
989
  class="quickforge-settings-segmented-option ${this.pendingImport.mode===`replace`?`quickforge-settings-segmented-option-active`:``}"
990
990
  ?disabled=${this.busy}
991
991
  @click=${()=>this.setRestoreMode(`replace`)}
992
992
  >
993
- ${T(`restoreModeReplace`)}
993
+ ${D(`restoreModeReplace`)}
994
994
  </button>
995
995
  <button
996
996
  type="button"
@@ -998,7 +998,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
998
998
  ?disabled=${this.busy}
999
999
  @click=${()=>this.setRestoreMode(`merge`)}
1000
1000
  >
1001
- ${T(`restoreModeMerge`)}
1001
+ ${D(`restoreModeMerge`)}
1002
1002
  </button>
1003
1003
  </div>
1004
1004
  </div>
@@ -1006,14 +1006,14 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
1006
1006
 
1007
1007
  <div class="quickforge-settings-row quickforge-settings-row-top">
1008
1008
  <div class="quickforge-settings-row-main">
1009
- <div class="quickforge-settings-row-title">${T(`selectRestoreSections`)}</div>
1009
+ <div class="quickforge-settings-row-title">${D(`selectRestoreSections`)}</div>
1010
1010
  <div class="quickforge-settings-row-description">
1011
- ${this.pendingImport.mode===`replace`?T(`restoreModeReplaceDescription`):T(`restoreModeMergeDescription`)}
1011
+ ${this.pendingImport.mode===`replace`?D(`restoreModeReplaceDescription`):D(`restoreModeMergeDescription`)}
1012
1012
  </div>
1013
1013
  </div>
1014
1014
  </div>
1015
1015
  <div class="quickforge-settings-nested-list">
1016
- ${n.map(n=>y`
1016
+ ${n.map(n=>x`
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>
@@ -1028,8 +1028,8 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
1028
1028
 
1029
1029
  <div class="quickforge-settings-row">
1030
1030
  <div class="quickforge-settings-row-main">
1031
- <div class="quickforge-settings-row-title">${T(`backupImportActions`)}</div>
1032
- <div class="quickforge-settings-row-description">${T(`backupImportActionsDescription`)}</div>
1031
+ <div class="quickforge-settings-row-title">${D(`backupImportActions`)}</div>
1032
+ <div class="quickforge-settings-row-description">${D(`backupImportActionsDescription`)}</div>
1033
1033
  </div>
1034
1034
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide">
1035
1035
  <button
@@ -1038,7 +1038,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
1038
1038
  ?disabled=${this.busy||t.size===0}
1039
1039
  @click=${()=>this.confirmPendingImport()}
1040
1040
  >
1041
- ${this.busy?T(`loading`):T(`confirmImportSelected`)}
1041
+ ${this.busy?D(`loading`):D(`confirmImportSelected`)}
1042
1042
  </button>
1043
1043
  <button
1044
1044
  class="quickforge-settings-button quickforge-settings-button-secondary"
@@ -1046,26 +1046,26 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
1046
1046
  ?disabled=${this.busy}
1047
1047
  @click=${()=>this.cancelPendingImport()}
1048
1048
  >
1049
- ${T(`cancel`)}
1049
+ ${D(`cancel`)}
1050
1050
  </button>
1051
1051
  </div>
1052
1052
  </div>
1053
1053
  </section>
1054
- `}render(){return y`
1054
+ `}render(){return x`
1055
1055
  <div class="quickforge-settings-stack">
1056
- <section class="quickforge-settings-section" aria-label=${T(`exportData`)}>
1056
+ <section class="quickforge-settings-section" aria-label=${D(`exportData`)}>
1057
1057
  <div class="quickforge-settings-row quickforge-settings-row-top">
1058
1058
  <div class="quickforge-settings-row-main">
1059
1059
  <div class="quickforge-settings-row-title">
1060
- ${T(`selectExportSections`)}
1061
- <quickforge-info-tip .label=${T(`exportDataDescription`)}></quickforge-info-tip>
1060
+ ${D(`selectExportSections`)}
1061
+ <quickforge-info-tip .label=${D(`exportDataDescription`)}></quickforge-info-tip>
1062
1062
  </div>
1063
- <div class="quickforge-settings-row-description">${T(`selectExportSectionsDescription`)}</div>
1063
+ <div class="quickforge-settings-row-description">${D(`selectExportSectionsDescription`)}</div>
1064
1064
  </div>
1065
1065
  </div>
1066
1066
 
1067
1067
  <div class="quickforge-settings-nested-list">
1068
- ${U.map(e=>y`
1068
+ ${G.map(e=>x`
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>
@@ -1078,12 +1078,12 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
1078
1078
  `)}
1079
1079
  </div>
1080
1080
 
1081
- <div class="quickforge-settings-note">${T(`conversationBackupExcluded`)}</div>
1081
+ <div class="quickforge-settings-note">${D(`conversationBackupExcluded`)}</div>
1082
1082
 
1083
1083
  <div class="quickforge-settings-row">
1084
1084
  <div class="quickforge-settings-row-main">
1085
- <div class="quickforge-settings-row-title">${T(`exportBackup`)}</div>
1086
- <div class="quickforge-settings-row-description">${T(`exportBackupDescription`)}</div>
1085
+ <div class="quickforge-settings-row-title">${D(`exportBackup`)}</div>
1086
+ <div class="quickforge-settings-row-description">${D(`exportBackupDescription`)}</div>
1087
1087
  </div>
1088
1088
  <div class="quickforge-settings-row-control">
1089
1089
  <button
@@ -1092,20 +1092,20 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
1092
1092
  ?disabled=${this.busy||this.exportSections.size===0}
1093
1093
  @click=${()=>this.exportBackup()}
1094
1094
  >
1095
- ${this.busy?T(`loading`):T(`exportBackup`)}
1095
+ ${this.busy?D(`loading`):D(`exportBackup`)}
1096
1096
  </button>
1097
1097
  </div>
1098
1098
  </div>
1099
1099
  </section>
1100
1100
 
1101
- <section class="quickforge-settings-section" aria-label=${T(`importData`)}>
1101
+ <section class="quickforge-settings-section" aria-label=${D(`importData`)}>
1102
1102
  <div class="quickforge-settings-row">
1103
1103
  <div class="quickforge-settings-row-main">
1104
1104
  <div class="quickforge-settings-row-title">
1105
- ${T(`importBackup`)}
1106
- <quickforge-info-tip .label=${T(`importDataDescription`)}></quickforge-info-tip>
1105
+ ${D(`importBackup`)}
1106
+ <quickforge-info-tip .label=${D(`importDataDescription`)}></quickforge-info-tip>
1107
1107
  </div>
1108
- <div class="quickforge-settings-row-description">${T(`importDataDescription`)}</div>
1108
+ <div class="quickforge-settings-row-description">${D(`importDataDescription`)}</div>
1109
1109
  </div>
1110
1110
  <div class="quickforge-settings-row-control">
1111
1111
  <label class="quickforge-settings-button quickforge-settings-button-secondary ${this.busy?`pointer-events-none opacity-60`:``}">
@@ -1116,24 +1116,24 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
1116
1116
  ?disabled=${this.busy}
1117
1117
  @change=${e=>this.handleFileChange(e)}
1118
1118
  />
1119
- ${T(`importBackup`)}
1119
+ ${D(`importBackup`)}
1120
1120
  </label>
1121
1121
  </div>
1122
1122
  </div>
1123
1123
  </section>
1124
1124
 
1125
1125
  ${this.renderPendingImport()}
1126
- ${this.message?y`<div class="quickforge-settings-message">${this.message}</div>`:null}
1127
- ${this.safetyBackupPath?y`<div class="quickforge-settings-note">${T(`backupSafetyBackupPath`)}: <code>${this.safetyBackupPath}</code></div>`:null}
1128
- ${this.error?y`<div class="quickforge-settings-alert">${this.error}</div>`:null}
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}
1129
1129
  </div>
1130
- `}},G=`quickforge-backup-settings-tab`;customElements.get(G)||customElements.define(G,Ft);function It(){return document.createElement(G)}function Lt(e){if(!e)return`-`;let t=new Date(e);return Number.isNaN(t.getTime())?e:t.toLocaleString(ve())}function Rt(e){let t={...e};return delete t.archivedAt,t}function K(){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 zt=class extends b{sessions=[];projects=[];loading=!0;busySessionId=``;query=``;projectFilter=`all`;message=``;error=``;getTabName(){return T(`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||T(`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:T(`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`${D(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`?T(`normalChat`):this.projectNameById.get(e)||T(`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(T(`sessionNotFound`));await t.sessions.save(Rt(n),Rt(r)),this.sessions=this.sessions.filter(t=>t.id!==e),this.message=T(`sessionRestored`),K()}catch(e){this.error=e instanceof Error?e.message:T(`restoreSessionFailed`)}finally{this.busySessionId=``,this.requestUpdate()}}}async deleteSession(e){if(!this.busySessionId&&await E({description:T(`deleteArchivedSessionConfirm`,{title:D(e.title)}),confirmLabel:T(`confirmDelete`),cancelLabel:T(`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=T(`archivedSessionDeleted`),K()}catch(e){this.error=e instanceof Error?e.message:T(`deleteSessionFailed`)}finally{this.busySessionId=``,this.requestUpdate()}}}async deleteAllArchivedSessions(){if(!(this.busySessionId||this.sessions.length===0)&&await E({description:T(`deleteAllArchivedSessionsConfirm`),confirmLabel:T(`confirmDelete`),cancelLabel:T(`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=T(`archivedSessionsDeleted`),K()}catch(e){this.error=e instanceof Error?e.message:T(`deleteSessionFailed`)}finally{this.busySessionId=``,this.requestUpdate()}}}renderSession(e){let t=this.busySessionId===e.id||this.busySessionId===`__all__`;return y`
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`
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">${D(e.title,e.channelName)}</div>
1134
+ <div class="truncate text-sm font-medium text-foreground">${we(e.title,e.channelName)}</div>
1135
1135
  <div class="mt-1 text-xs text-muted-foreground">
1136
- ${T(`lastModified`)}: ${Lt(e.lastModified)} · ${T(`archivedAt`)}: ${Lt(e.archivedAt)}
1136
+ ${D(`lastModified`)}: ${Ft(e.lastModified)} · ${D(`archivedAt`)}: ${Ft(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">
@@ -1143,7 +1143,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
1143
1143
  ?disabled=${t}
1144
1144
  @click=${()=>this.restoreSession(e.id)}
1145
1145
  >
1146
- ${T(`restoreSession`)}
1146
+ ${D(`restoreSession`)}
1147
1147
  </button>
1148
1148
  <button
1149
1149
  class="rounded-md px-2.5 py-1 text-xs text-destructive hover:bg-destructive/10 disabled:opacity-60"
@@ -1151,12 +1151,12 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
1151
1151
  ?disabled=${t}
1152
1152
  @click=${()=>this.deleteSession(e)}
1153
1153
  >
1154
- ${T(`deletePermanently`)}
1154
+ ${D(`deletePermanently`)}
1155
1155
  </button>
1156
1156
  </div>
1157
1157
  </div>
1158
1158
  </div>
1159
- `}render(){let e=this.groupedSessions();return y`
1159
+ `}render(){let e=this.groupedSessions();return x`
1160
1160
  <div class="flex flex-col gap-4">
1161
1161
  <div class="flex justify-end">
1162
1162
  <button
@@ -1165,7 +1165,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
1165
1165
  ?disabled=${!!this.busySessionId||this.sessions.length===0}
1166
1166
  @click=${()=>this.deleteAllArchivedSessions()}
1167
1167
  >
1168
- ${T(`deleteAll`)}
1168
+ ${D(`deleteAll`)}
1169
1169
  </button>
1170
1170
  </div>
1171
1171
 
@@ -1175,7 +1175,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
1175
1175
  class="rounded-md border border-input bg-background px-3 py-2 text-sm outline-none focus:ring-2 focus:ring-ring/30"
1176
1176
  type="search"
1177
1177
  .value=${this.query}
1178
- placeholder=${T(`searchArchivedConversations`)}
1178
+ placeholder=${D(`searchArchivedConversations`)}
1179
1179
  @input=${e=>{this.query=e.target.value,this.requestUpdate()}}
1180
1180
  />
1181
1181
  <select
@@ -1183,23 +1183,23 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
1183
1183
  .value=${this.projectFilter}
1184
1184
  @change=${e=>{this.projectFilter=e.target.value,this.requestUpdate()}}
1185
1185
  >
1186
- <option value="all">${T(`allProjects`)}</option>
1187
- <option value="global">${T(`normalChat`)}</option>
1188
- ${this.projects.map(e=>y`<option value=${e.id}>${e.name}</option>`)}
1186
+ <option value="all">${D(`allProjects`)}</option>
1187
+ <option value="global">${D(`normalChat`)}</option>
1188
+ ${this.projects.map(e=>x`<option value=${e.id}>${e.name}</option>`)}
1189
1189
  </select>
1190
1190
  </div>
1191
1191
 
1192
- ${this.loading?y`
1193
- <div class="px-4 py-8 text-center text-sm text-muted-foreground">${T(`loading`)}</div>
1194
- `:e.length===0?y`
1195
- <div class="px-4 py-8 text-center text-sm text-muted-foreground">${T(`noArchivedConversations`)}</div>
1196
- `:y`
1192
+ ${this.loading?x`
1193
+ <div class="px-4 py-8 text-center text-sm text-muted-foreground">${D(`loading`)}</div>
1194
+ `:e.length===0?x`
1195
+ <div class="px-4 py-8 text-center text-sm text-muted-foreground">${D(`noArchivedConversations`)}</div>
1196
+ `:x`
1197
1197
  <div>
1198
- ${e.map(([e,t])=>y`
1198
+ ${e.map(([e,t])=>x`
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>
1202
- <div class="shrink-0">${T(`conversationCount`,{count:t.length})}</div>
1202
+ <div class="shrink-0">${D(`conversationCount`,{count:t.length})}</div>
1203
1203
  </div>
1204
1204
  ${t.map(e=>this.renderSession(e))}
1205
1205
  </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?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}
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}
1213
1213
  </div>
1214
- `}},q=`quickforge-archived-conversations-settings-tab`;customElements.get(q)||customElements.define(q,zt);function Bt(){return document.createElement(q)}function Vt(){return Array.from({length:16},()=>`ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz23456789!@#$%^&*`[Math.floor(Math.random()*65)]).join(``)}function Ht(e){if(!e)return T(`lanAccessUnknownDevice`);let t=e.includes(`Edg/`)?`Edge`:e.includes(`Firefox/`)?`Firefox`:e.includes(`Chrome/`)?`Chrome`:e.includes(`Safari/`)?`Safari`:T(`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 Ut(e){if(!e)return`-`;let t=new Date(e);return Number.isNaN(t.getTime())?`-`:new Intl.DateTimeFormat(ve(),{dateStyle:`medium`,timeStyle:`short`}).format(t)}var Wt=class extends b{loading=!0;saving=!1;enabled=!1;hasPassword=!1;password=``;passwordVisible=!1;sessionTtlHours=12;activeTokenCount=0;activeDevices=[];lanUrls=[];error=``;message=``;getTabName(){return T(`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||T(`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:T(`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=T(`lanAccessPasswordRequired`),this.requestUpdate();return}if(this.password.trim()&&this.password.trim().length<8){this.error=T(`lanAccessPasswordTooShort`),this.requestUpdate();return}if(!(this.enabled&&!await E({description:T(`lanAccessEnableConfirm`),confirmLabel:T(`enabled`),cancelLabel:T(`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=T(`lanAccessSaved`)}catch(e){this.error=e instanceof Error?e.message:T(`requestFailed`)}finally{this.saving=!1,this.requestUpdate()}}}}async revokeDevice(e){if(await E({description:T(`lanAccessRevokeDeviceConfirm`,{device:Ht(e.userAgent)}),confirmLabel:T(`lanAccessRevokeDevice`),cancelLabel:T(`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=T(`lanAccessDeviceRevoked`)}catch(e){this.error=e instanceof Error?e.message:T(`requestFailed`)}finally{this.saving=!1,this.requestUpdate()}}}async revokeAll(){if(await E({description:T(`lanAccessRevokeAllConfirm`),confirmLabel:T(`lanAccessRevokeAll`),cancelLabel:T(`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=T(`lanAccessRevoked`)}catch(e){this.error=e instanceof Error?e.message:T(`requestFailed`)}finally{this.saving=!1,this.requestUpdate()}}}renderSwitch(e,t,n=!1){return y`
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`
1215
1215
  <label class="quickforge-settings-switch" aria-disabled=${n?`true`:`false`}>
1216
1216
  <input
1217
1217
  type="checkbox"
@@ -1221,40 +1221,40 @@ 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?y`<div class="text-sm text-muted-foreground">${T(`loading`)}</div>`:y`
1224
+ `}render(){return this.loading?x`<div class="text-sm text-muted-foreground">${D(`loading`)}</div>`:x`
1225
1225
  <div class="quickforge-settings-stack">
1226
- <div class="quickforge-settings-warning">${T(`lanAccessRiskWarning`)}</div>
1226
+ <div class="quickforge-settings-warning">${D(`lanAccessRiskWarning`)}</div>
1227
1227
 
1228
- <section class="quickforge-settings-section" aria-label=${T(`lanAccessStatus`)}>
1228
+ <section class="quickforge-settings-section" aria-label=${D(`lanAccessStatus`)}>
1229
1229
  <div class="quickforge-settings-row">
1230
1230
  <div class="quickforge-settings-row-main">
1231
- <div class="quickforge-settings-row-title">${T(`lanAccessEnabled`)}</div>
1232
- <div class="quickforge-settings-row-description">${T(`lanAccessEnabledDescription`)}</div>
1231
+ <div class="quickforge-settings-row-title">${D(`lanAccessEnabled`)}</div>
1232
+ <div class="quickforge-settings-row-description">${D(`lanAccessEnabledDescription`)}</div>
1233
1233
  </div>
1234
- <div class="quickforge-settings-row-control quickforge-settings-readonly-value">${this.enabled?T(`enabled`):T(`disabled`)}</div>
1234
+ <div class="quickforge-settings-row-control quickforge-settings-readonly-value">${this.enabled?D(`enabled`):D(`disabled`)}</div>
1235
1235
  </div>
1236
1236
  <div class="quickforge-settings-row">
1237
1237
  <div class="quickforge-settings-row-main">
1238
- <div class="quickforge-settings-row-title">${T(`lanAccessPassword`)}</div>
1239
- <div class="quickforge-settings-row-description">${T(`lanAccessPasswordStatusDescription`)}</div>
1238
+ <div class="quickforge-settings-row-title">${D(`lanAccessPassword`)}</div>
1239
+ <div class="quickforge-settings-row-description">${D(`lanAccessPasswordStatusDescription`)}</div>
1240
1240
  </div>
1241
- <div class="quickforge-settings-row-control quickforge-settings-readonly-value">${this.hasPassword?T(`configured`):T(`notConfigured`)}</div>
1241
+ <div class="quickforge-settings-row-control quickforge-settings-readonly-value">${this.hasPassword?D(`configured`):D(`notConfigured`)}</div>
1242
1242
  </div>
1243
1243
  <div class="quickforge-settings-row quickforge-settings-row-top">
1244
1244
  <div class="quickforge-settings-row-main">
1245
- <div class="quickforge-settings-row-title">${T(`lanAccessActiveDevices`,{count:this.activeTokenCount})}</div>
1246
- <div class="quickforge-settings-row-description">${T(`lanAccessActiveDevicesDescription`)}</div>
1245
+ <div class="quickforge-settings-row-title">${D(`lanAccessActiveDevices`,{count:this.activeTokenCount})}</div>
1246
+ <div class="quickforge-settings-row-description">${D(`lanAccessActiveDevicesDescription`)}</div>
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=>y`
1250
+ ${this.activeDevices.length?this.activeDevices.map(e=>x`
1251
1251
  <div class="quickforge-settings-subrow">
1252
1252
  <div class="quickforge-settings-list-item-main">
1253
- <div class="quickforge-settings-row-title">${Ht(e.userAgent)}</div>
1253
+ <div class="quickforge-settings-row-title">${Vt(e.userAgent)}</div>
1254
1254
  <div class="quickforge-settings-row-description quickforge-lan-device-meta">
1255
- <span>${e.address||T(`lanAccessUnknownAddress`)}</span>
1256
- <span>${T(`lanAccessSignedInAt`,{time:Ut(e.issuedAt)})}</span>
1257
- <span>${T(`lanAccessExpiresAt`,{time:Ut(e.expiresAt)})}</span>
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>
1258
1258
  </div>
1259
1259
  </div>
1260
1260
  <div class="quickforge-settings-list-item-actions">
@@ -1264,28 +1264,28 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
1264
1264
  ?disabled=${this.saving}
1265
1265
  @click=${()=>this.revokeDevice(e)}
1266
1266
  >
1267
- ${T(`lanAccessRevokeDevice`)}
1267
+ ${D(`lanAccessRevokeDevice`)}
1268
1268
  </button>
1269
1269
  </div>
1270
1270
  </div>
1271
- `):y`<div class="quickforge-settings-empty-row">${T(`lanAccessNoActiveDevices`)}</div>`}
1271
+ `):x`<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">
1275
- <div class="quickforge-settings-row-title">${T(`lanAccessUrls`)}</div>
1276
- <div class="quickforge-settings-row-description">${T(`lanAccessUrlsDescription`)}</div>
1275
+ <div class="quickforge-settings-row-title">${D(`lanAccessUrls`)}</div>
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=>y`<div>${e}</div>`):`-`}
1279
+ ${this.lanUrls.length?this.lanUrls.map(e=>x`<div>${e}</div>`):`-`}
1280
1280
  </div>
1281
1281
  </div>
1282
1282
  </section>
1283
1283
 
1284
- <section class="quickforge-settings-section" aria-label=${T(`lanAccess`)}>
1284
+ <section class="quickforge-settings-section" aria-label=${D(`lanAccess`)}>
1285
1285
  <div class="quickforge-settings-row">
1286
1286
  <div class="quickforge-settings-row-main">
1287
- <div class="quickforge-settings-row-title">${T(`lanAccessAllowFull`)}</div>
1288
- <div class="quickforge-settings-row-description">${T(`lanAccessAllowFullDescription`)}</div>
1287
+ <div class="quickforge-settings-row-title">${D(`lanAccessAllowFull`)}</div>
1288
+ <div class="quickforge-settings-row-description">${D(`lanAccessAllowFullDescription`)}</div>
1289
1289
  </div>
1290
1290
  <div class="quickforge-settings-row-control">
1291
1291
  ${this.renderSwitch(this.enabled,e=>this.updateEnabled(e),this.saving)}
@@ -1294,8 +1294,8 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
1294
1294
 
1295
1295
  <div class="quickforge-settings-row">
1296
1296
  <div class="quickforge-settings-row-main">
1297
- <div class="quickforge-settings-row-title">${T(`lanAccessPassword`)}</div>
1298
- <div class="quickforge-settings-row-description">${this.hasPassword?T(`lanAccessPasswordPlaceholderConfigured`):T(`lanAccessPasswordPlaceholder`)}</div>
1297
+ <div class="quickforge-settings-row-title">${D(`lanAccessPassword`)}</div>
1298
+ <div class="quickforge-settings-row-description">${this.hasPassword?D(`lanAccessPasswordPlaceholderConfigured`):D(`lanAccessPasswordPlaceholder`)}</div>
1299
1299
  </div>
1300
1300
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide quickforge-lan-password-control">
1301
1301
  <div class="quickforge-lan-password-input-wrap">
@@ -1304,24 +1304,24 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
1304
1304
  type=${this.passwordVisible?`text`:`password`}
1305
1305
  .value=${this.password}
1306
1306
  @input=${e=>this.updatePassword(e.target.value)}
1307
- placeholder=${this.hasPassword?T(`lanAccessPasswordPlaceholderConfigured`):T(`lanAccessPasswordPlaceholder`)}
1307
+ placeholder=${this.hasPassword?D(`lanAccessPasswordPlaceholderConfigured`):D(`lanAccessPasswordPlaceholder`)}
1308
1308
  />
1309
1309
  <button
1310
1310
  class="quickforge-lan-password-toggle"
1311
1311
  type="button"
1312
- aria-label=${this.passwordVisible?T(`hidePassword`):T(`showPassword`)}
1313
- title=${this.passwordVisible?T(`hidePassword`):T(`showPassword`)}
1312
+ aria-label=${this.passwordVisible?D(`hidePassword`):D(`showPassword`)}
1313
+ title=${this.passwordVisible?D(`hidePassword`):D(`showPassword`)}
1314
1314
  aria-pressed=${this.passwordVisible?`true`:`false`}
1315
1315
  @click=${()=>this.togglePasswordVisibility()}
1316
1316
  >
1317
- ${this.passwordVisible?y`
1317
+ ${this.passwordVisible?x`
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
- `:y`
1324
+ `:x`
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,48 +1332,48 @@ 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(Vt())}
1335
+ @click=${()=>this.updatePassword(Bt())}
1336
1336
  >
1337
- ${T(`generatePassword`)}
1337
+ ${D(`generatePassword`)}
1338
1338
  </button>
1339
1339
  </div>
1340
1340
  </div>
1341
1341
 
1342
1342
  <div class="quickforge-settings-row">
1343
1343
  <div class="quickforge-settings-row-main">
1344
- <div class="quickforge-settings-row-title">${T(`lanAccessSessionTtl`)}</div>
1345
- <div class="quickforge-settings-row-description">${T(`lanAccessSessionTtlDescription`)}</div>
1344
+ <div class="quickforge-settings-row-title">${D(`lanAccessSessionTtl`)}</div>
1345
+ <div class="quickforge-settings-row-description">${D(`lanAccessSessionTtlDescription`)}</div>
1346
1346
  </div>
1347
1347
  <div class="quickforge-settings-row-control">
1348
1348
  <select class="quickforge-settings-select" .value=${String(this.sessionTtlHours)} @change=${e=>this.updateTtl(e.target.value)}>
1349
- <option value="1">1 ${T(`hour`)}</option>
1350
- <option value="12">12 ${T(`hours`)}</option>
1351
- <option value="24">24 ${T(`hours`)}</option>
1352
- <option value="168">7 ${T(`days`)}</option>
1349
+ <option value="1">1 ${D(`hour`)}</option>
1350
+ <option value="12">12 ${D(`hours`)}</option>
1351
+ <option value="24">24 ${D(`hours`)}</option>
1352
+ <option value="168">7 ${D(`days`)}</option>
1353
1353
  </select>
1354
1354
  </div>
1355
1355
  </div>
1356
1356
 
1357
1357
  <div class="quickforge-settings-row">
1358
1358
  <div class="quickforge-settings-row-main">
1359
- <div class="quickforge-settings-row-title">${T(`lanAccessActions`)}</div>
1360
- <div class="quickforge-settings-row-description">${T(`lanAccessActionsDescription`)}</div>
1359
+ <div class="quickforge-settings-row-title">${D(`lanAccessActions`)}</div>
1360
+ <div class="quickforge-settings-row-description">${D(`lanAccessActionsDescription`)}</div>
1361
1361
  </div>
1362
1362
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide">
1363
1363
  <button class="quickforge-settings-button quickforge-settings-button-primary" type="button" ?disabled=${this.saving} @click=${()=>this.saveSettings()}>
1364
- ${this.saving?T(`saving`):T(`save`)}
1364
+ ${this.saving?D(`saving`):D(`save`)}
1365
1365
  </button>
1366
1366
  <button class="quickforge-settings-button quickforge-settings-button-danger" type="button" ?disabled=${this.saving} @click=${()=>this.revokeAll()}>
1367
- ${T(`lanAccessRevokeAll`)}
1367
+ ${D(`lanAccessRevokeAll`)}
1368
1368
  </button>
1369
1369
  </div>
1370
1370
  </div>
1371
1371
  </section>
1372
1372
 
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}
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}
1375
1375
  </div>
1376
- `}},J=`quickforge-lan-access-settings-tab`;customElements.get(J)||customElements.define(J,Wt);function Gt(){return document.createElement(J)}var Kt=18e4,qt=3e4,Jt=1e3,Yt=`https://github.com/shawnstack/quickforge/releases/latest`;function Y(){if(typeof document>`u`)return!1;let e=window;return document.body.classList.contains(`quickforge-desktop-app`)||e.__quickforgeDesktopApp===!0}function Xt(e){return new Promise(t=>window.setTimeout(t,e))}function Zt(e,t){return e?.code===`system_restart_requires_auth`?T(`systemRestartRequiresAuth`):e?.code===`system_update_requires_auth`?T(`systemUpdateRequiresAuth`):e?.error||t}var Qt=[{value:`startup`,label:()=>T(`frequencyStartup`)},{value:`daily`,label:()=>T(`frequencyDaily`)},{value:`weekly`,label:()=>T(`frequencyWeekly`)},{value:`off`,label:()=>T(`frequencyOff`)}],$t=class extends b{about;updateInfo;loading=!0;checking=!1;updating=!1;restarting=!1;message=``;error=``;frequency=Le.frequency;lastCheckAt=null;serviceStatus;getTabName(){return T(`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||T(`requestFailed`));this.about=t;try{let[e,t]=await Promise.all([Ue(x()),this.loadServiceStatus()]);this.frequency=e.frequency,this.lastCheckAt=e.lastCheckAt,this.serviceStatus=t}catch{}}catch(e){this.error=e instanceof Error?e.message:T(`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||T(`requestFailed`));return t}async checkUpdate(){if(!(this.checking||this.updating)){if(Y()){window.open(Yt,`_blank`,`noopener,noreferrer`),this.message=T(`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||T(`updateCheckFailed`));this.updateInfo=t,this.about=t,this.updateInfo.updateAvailable?this.message=T(`updateAvailableMessage`,{current:this.updateInfo.currentVersion,latest:this.updateInfo.latestVersion}):this.updateInfo.localVersionIsNewer?this.message=T(`localVersionNewerMessage`,{current:this.updateInfo.currentVersion,latest:this.updateInfo.latestVersion}):this.message=T(`alreadyLatestVersion`,{version:this.updateInfo.currentVersion})}catch(e){this.error=e instanceof Error?e.message:T(`updateCheckFailed`)}finally{this.checking=!1,this.requestUpdate()}}}async pollUntilUpdated(e){let t=Date.now();for(;Date.now()-t<Kt;){await Xt(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=T(`updateRestarted`),this.requestUpdate(),window.setTimeout(()=>window.location.reload(),300);return}}catch{}}throw Error(T(`updateRestartTimeout`))}async pollUntilRestarted(e){let t=Date.now();for(;Date.now()-t<qt;){await Xt(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=T(`backendRestarted`),this.requestUpdate(),window.setTimeout(()=>window.location.reload(),300);return}}catch{}}throw Error(T(`backendRestartTimeout`))}async restartService(){if(!this.serviceStatus||this.restarting||!await E({description:T(`restartBackendConfirm`),confirmLabel:T(`restartBackendService`),cancelLabel:T(`cancel`)}))return;this.restarting=!0,this.message=T(`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(Zt(n,T(`backendRestartFailed`)));await this.pollUntilRestarted(e)}catch(e){this.error=e instanceof Error?e.message:T(`backendRestartFailed`),this.message=``,this.restarting=!1,this.requestUpdate()}}async updateQuickForge(){if(Y()){window.open(Yt,`_blank`,`noopener,noreferrer`),this.message=T(`desktopUpdateHint`),this.error=``,this.requestUpdate();return}if(!(!this.updateInfo?.updateAvailable||this.updating)&&await E({description:T(`updateConfirm`,{command:this.updateInfo.installCommand}),confirmLabel:T(`updateRuntimeNow`),cancelLabel:T(`cancel`)})){this.updating=!0,this.message=T(`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(Zt(t,T(`updateFailed`)));if(this.updateInfo=t,t?.updateStarted){let e=t.logFile?` ${T(`updateLogFile`,{path:t.logFile})}`:``;this.message=`${T(`updateStarted`)}${e}`,this.requestUpdate(),await this.pollUntilUpdated(t.bootId)}else this.message=t?.updated?T(`updateCompleted`):T(`alreadyLatestVersion`,{version:t?.currentVersion||this.about?.version||`-`}),this.updating=!1}catch(e){this.error=e instanceof Error?e.message:T(`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 De(t,{...await Ue(t),frequency:e}),this.error=``}catch(e){this.error=e instanceof Error?e.message:T(`requestFailed`)}finally{this.requestUpdate()}}}renderFrequencyOption(e){let t=this.frequency===e.value;return y`
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`
1377
1377
  <button
1378
1378
  type="button"
1379
1379
  class="quickforge-settings-segmented-option ${t?`quickforge-settings-segmented-option-active`:``}"
@@ -1382,25 +1382,25 @@ 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?y`
1385
+ `}infoRows(){let e=this.about;return e?x`
1386
1386
  <div class="quickforge-settings-row">
1387
1387
  <div class="quickforge-settings-row-main">
1388
- <div class="quickforge-settings-row-title">${T(`packageName`)}</div>
1389
- <div class="quickforge-settings-row-description">${T(`packageNameDescription`)}</div>
1388
+ <div class="quickforge-settings-row-title">${D(`packageName`)}</div>
1389
+ <div class="quickforge-settings-row-description">${D(`packageNameDescription`)}</div>
1390
1390
  </div>
1391
1391
  <div class="quickforge-settings-row-control quickforge-settings-readonly-value">${e.name}</div>
1392
1392
  </div>
1393
1393
  <div class="quickforge-settings-row">
1394
1394
  <div class="quickforge-settings-row-main">
1395
- <div class="quickforge-settings-row-title">${T(`currentVersion`)}</div>
1396
- <div class="quickforge-settings-row-description">${T(`currentVersionDescription`)}</div>
1395
+ <div class="quickforge-settings-row-title">${D(`currentVersion`)}</div>
1396
+ <div class="quickforge-settings-row-description">${D(`currentVersionDescription`)}</div>
1397
1397
  </div>
1398
1398
  <div class="quickforge-settings-row-control quickforge-settings-readonly-value">${e.version}</div>
1399
1399
  </div>
1400
1400
  <div class="quickforge-settings-row">
1401
1401
  <div class="quickforge-settings-row-main">
1402
- <div class="quickforge-settings-row-title">${T(`github`)}</div>
1403
- <div class="quickforge-settings-row-description">${T(`githubDescription`)}</div>
1402
+ <div class="quickforge-settings-row-title">${D(`github`)}</div>
1403
+ <div class="quickforge-settings-row-description">${D(`githubDescription`)}</div>
1404
1404
  </div>
1405
1405
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide quickforge-settings-readonly-value">
1406
1406
  <a class="quickforge-settings-link" href=${e.repositoryUrl} target="_blank" rel="noreferrer">
@@ -1408,35 +1408,35 @@ 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?y`
1411
+ `:null}updateStatus(){return this.updateInfo?x`
1412
1412
  <div class="quickforge-settings-row">
1413
1413
  <div class="quickforge-settings-row-main">
1414
- <div class="quickforge-settings-row-title">${T(`latestVersion`)}</div>
1415
- <div class="quickforge-settings-row-description">${T(`latestVersionDescription`)}</div>
1414
+ <div class="quickforge-settings-row-title">${D(`latestVersion`)}</div>
1415
+ <div class="quickforge-settings-row-description">${D(`latestVersionDescription`)}</div>
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?y`
1419
+ ${this.updateInfo.logFile?x`
1420
1420
  <div class="quickforge-settings-row">
1421
1421
  <div class="quickforge-settings-row-main">
1422
- <div class="quickforge-settings-row-title">${T(`updateLog`)}</div>
1423
- <div class="quickforge-settings-row-description">${T(`updateLogDescription`)}</div>
1422
+ <div class="quickforge-settings-row-title">${D(`updateLog`)}</div>
1423
+ <div class="quickforge-settings-row-description">${D(`updateLogDescription`)}</div>
1424
1424
  </div>
1425
1425
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide quickforge-settings-readonly-value">
1426
1426
  <code>${this.updateInfo.logFile}</code>
1427
1427
  </div>
1428
1428
  </div>
1429
1429
  `:null}
1430
- `:null}restartSection(){let e=this.serviceStatus?.restartUnsupportedReason||T(`backendRestartUnsupported`),t=this.restarting||!this.serviceStatus?.restartSupported;return y`
1431
- <section class="quickforge-settings-section" aria-label=${T(`restartBackendService`)}>
1430
+ `:null}restartSection(){let e=this.serviceStatus?.restartUnsupportedReason||D(`backendRestartUnsupported`),t=this.restarting||!this.serviceStatus?.restartSupported;return x`
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">
1434
1434
  <div class="quickforge-settings-row-title">
1435
- ${T(`restartBackendService`)}
1436
- <quickforge-info-tip .label=${T(`restartBackendServiceDescription`)}></quickforge-info-tip>
1435
+ ${D(`restartBackendService`)}
1436
+ <quickforge-info-tip .label=${D(`restartBackendServiceDescription`)}></quickforge-info-tip>
1437
1437
  </div>
1438
1438
  <div class="quickforge-settings-row-description">
1439
- ${this.serviceStatus?.restartSupported?T(`restartBackendServiceDescription`):e}
1439
+ ${this.serviceStatus?.restartSupported?D(`restartBackendServiceDescription`):e}
1440
1440
  </div>
1441
1441
  </div>
1442
1442
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide">
@@ -1446,32 +1446,32 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
1446
1446
  ?disabled=${t}
1447
1447
  @click=${()=>this.restartService()}
1448
1448
  >
1449
- ${this.restarting?T(`backendRestarting`):T(`restartBackendService`)}
1449
+ ${this.restarting?D(`backendRestarting`):D(`restartBackendService`)}
1450
1450
  </button>
1451
1451
  </div>
1452
1452
  </div>
1453
1453
  </section>
1454
- `}render(){if(this.loading)return y`<div class="text-sm text-muted-foreground">${T(`loading`)}</div>`;let e=this.checking||this.updating||!this.updateInfo?.updateAvailable,t=Y();return y`
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`
1455
1455
  <div class="quickforge-settings-stack">
1456
- <section class="quickforge-settings-section" aria-label=${T(`projectInfo`)}>
1456
+ <section class="quickforge-settings-section" aria-label=${D(`projectInfo`)}>
1457
1457
  ${this.infoRows()}
1458
1458
  </section>
1459
1459
 
1460
- <section class="quickforge-settings-section" aria-label=${T(t?`desktopUpdates`:`runtimeUpdates`)}>
1461
- ${t?null:y`
1460
+ <section class="quickforge-settings-section" aria-label=${D(t?`desktopUpdates`:`runtimeUpdates`)}>
1461
+ ${t?null:x`
1462
1462
  <div class="quickforge-settings-row">
1463
1463
  <div class="quickforge-settings-row-main">
1464
1464
  <div class="quickforge-settings-row-title">
1465
- ${T(`updateFrequencySection`)}
1466
- <quickforge-info-tip .label=${T(`updateFrequencyDescription`)}></quickforge-info-tip>
1465
+ ${D(`updateFrequencySection`)}
1466
+ <quickforge-info-tip .label=${D(`updateFrequencyDescription`)}></quickforge-info-tip>
1467
1467
  </div>
1468
1468
  <div class="quickforge-settings-row-description">
1469
- ${this.lastCheckAt?T(`lastCheckedAt`,{time:new Date(this.lastCheckAt).toLocaleString(ve())}):T(`lastCheckedNever`)}
1469
+ ${this.lastCheckAt?D(`lastCheckedAt`,{time:new Date(this.lastCheckAt).toLocaleString(E())}):D(`lastCheckedNever`)}
1470
1470
  </div>
1471
1471
  </div>
1472
1472
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide">
1473
- <div class="quickforge-settings-segmented quickforge-settings-segmented-wrap" role="group" aria-label=${T(`updateFrequencySection`)}>
1474
- ${Qt.map(e=>this.renderFrequencyOption(e))}
1473
+ <div class="quickforge-settings-segmented quickforge-settings-segmented-wrap" role="group" aria-label=${D(`updateFrequencySection`)}>
1474
+ ${$t.map(e=>this.renderFrequencyOption(e))}
1475
1475
  </div>
1476
1476
  </div>
1477
1477
  </div>
@@ -1482,11 +1482,11 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
1482
1482
  <div class="quickforge-settings-row">
1483
1483
  <div class="quickforge-settings-row-main">
1484
1484
  <div class="quickforge-settings-row-title">
1485
- ${T(t?`desktopUpdates`:`runtimeUpdates`)}
1486
- <quickforge-info-tip .label=${T(t?`desktopUpdatesDescription`:`runtimeUpdatesDescription`)}></quickforge-info-tip>
1485
+ ${D(t?`desktopUpdates`:`runtimeUpdates`)}
1486
+ <quickforge-info-tip .label=${D(t?`desktopUpdatesDescription`:`runtimeUpdatesDescription`)}></quickforge-info-tip>
1487
1487
  </div>
1488
1488
  <div class="quickforge-settings-row-description">
1489
- ${T(t?`desktopUpdatesDescription`:`runtimeUpdatesDescription`)}
1489
+ ${D(t?`desktopUpdatesDescription`:`runtimeUpdatesDescription`)}
1490
1490
  </div>
1491
1491
  </div>
1492
1492
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide">
@@ -1496,16 +1496,16 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
1496
1496
  ?disabled=${this.checking||this.updating}
1497
1497
  @click=${()=>this.checkUpdate()}
1498
1498
  >
1499
- ${this.checking?T(`checkingUpdate`):T(t?`openDesktopReleases`:`checkRuntimeUpdate`)}
1499
+ ${this.checking?D(`checkingUpdate`):D(t?`openDesktopReleases`:`checkRuntimeUpdate`)}
1500
1500
  </button>
1501
- ${t?null:y`
1501
+ ${t?null:x`
1502
1502
  <button
1503
1503
  class="quickforge-settings-button quickforge-settings-button-primary"
1504
1504
  type="button"
1505
1505
  ?disabled=${e}
1506
1506
  @click=${()=>this.updateQuickForge()}
1507
1507
  >
1508
- ${this.updating?T(`updatingQuickForge`):T(`updateRuntimeNow`)}
1508
+ ${this.updating?D(`updatingQuickForge`):D(`updateRuntimeNow`)}
1509
1509
  </button>
1510
1510
  `}
1511
1511
  </div>
@@ -1514,22 +1514,22 @@ 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?y`<div class="quickforge-settings-message">${this.message}</div>`:null}
1518
- ${this.error?y`<div class="quickforge-settings-alert">${this.error}</div>`:null}
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}
1519
1519
  </div>
1520
- `}},en=`quickforge-about-settings-tab`;customElements.get(en)||customElements.define(en,$t);function tn(){return document.createElement(en)}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 T(`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||T(`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:T(`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:T(`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:T(`requestFailed`),this.requestUpdate()}}}async createCommand(){if(!this.project)return;let e=window.prompt(T(`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=T(`commandCreated`,{name:t.name??e.trim()}),await this.loadCommands()):t.reason===`exists`?this.error=T(`commandAlreadyExists`,{name:t.name??e.trim()}):this.error=T(`invalidCommandName`)}catch(e){this.error=e instanceof Error?e.message:T(`requestFailed`)}finally{this.requestUpdate()}}}render(){return this.loading?y`<div class="quickforge-settings-note">${T(`loading`)}</div>`:this.projects.length===0?y`
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`
1521
1521
  <div class="quickforge-settings-stack">
1522
- <div class="quickforge-settings-note">${T(`selectProjectForCommands`)}</div>
1523
- ${this.error?y`<div class="quickforge-settings-alert">${this.error}</div>`:null}
1522
+ <div class="quickforge-settings-note">${D(`selectProjectForCommands`)}</div>
1523
+ ${this.error?x`<div class="quickforge-settings-alert">${this.error}</div>`:null}
1524
1524
  </div>
1525
- `:y`
1525
+ `:x`
1526
1526
  <div class="quickforge-settings-stack">
1527
- <section class="quickforge-settings-section" aria-label=${T(`projectCommands`)}>
1527
+ <section class="quickforge-settings-section" aria-label=${D(`projectCommands`)}>
1528
1528
  <div class="quickforge-settings-row">
1529
1529
  <div class="quickforge-settings-row-main">
1530
- <div class="quickforge-settings-row-title">${T(`project`)}</div>
1530
+ <div class="quickforge-settings-row-title">${D(`project`)}</div>
1531
1531
  <div class="quickforge-settings-row-description">
1532
- ${this.project?.path?this.project.path:T(`projectCommandsProjectDescription`)}
1532
+ ${this.project?.path?this.project.path:D(`projectCommandsProjectDescription`)}
1533
1533
  </div>
1534
1534
  </div>
1535
1535
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide">
@@ -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=>y`<option value=${e.id} ?selected=${e.id===this.project?.id}>${e.name}</option>`)}
1541
+ ${this.projects.map(e=>x`<option value=${e.id} ?selected=${e.id===this.project?.id}>${e.name}</option>`)}
1542
1542
  </select>
1543
1543
  </div>
1544
1544
  </div>
@@ -1546,16 +1546,16 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
1546
1546
  <div class="quickforge-settings-row quickforge-settings-row-align-start">
1547
1547
  <div class="quickforge-settings-row-main">
1548
1548
  <div class="quickforge-settings-row-title">
1549
- ${T(`commandDirectories`)}
1550
- <quickforge-info-tip .label=${T(`commandDirectoryHelp`)}></quickforge-info-tip>
1549
+ ${D(`commandDirectories`)}
1550
+ <quickforge-info-tip .label=${D(`commandDirectoryHelp`)}></quickforge-info-tip>
1551
1551
  </div>
1552
- <div class="quickforge-settings-row-description">${T(`commandDirectoriesDescription`)}</div>
1552
+ <div class="quickforge-settings-row-description">${D(`commandDirectoriesDescription`)}</div>
1553
1553
  </div>
1554
1554
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide">
1555
1555
  <textarea
1556
1556
  class="quickforge-settings-textarea quickforge-settings-mono"
1557
1557
  .value=${this.commandDir}
1558
- placeholder=${T(`commandDirectoryPlaceholder`)}
1558
+ placeholder=${D(`commandDirectoryPlaceholder`)}
1559
1559
  @input=${e=>this.updateCommandDir(e.target.value)}
1560
1560
  ></textarea>
1561
1561
  </div>
@@ -1563,8 +1563,8 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
1563
1563
 
1564
1564
  <div class="quickforge-settings-row quickforge-settings-row-align-start">
1565
1565
  <div class="quickforge-settings-row-main">
1566
- <div class="quickforge-settings-row-title">${T(`commandDirectoryExamples`)}</div>
1567
- <div class="quickforge-settings-row-description">${T(`commandDirectoryExamplesDescription`)}</div>
1566
+ <div class="quickforge-settings-row-title">${D(`commandDirectoryExamples`)}</div>
1567
+ <div class="quickforge-settings-row-description">${D(`commandDirectoryExamplesDescription`)}</div>
1568
1568
  </div>
1569
1569
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide quickforge-settings-code-list">
1570
1570
  <code>.ai/commands</code>
@@ -1575,11 +1575,11 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
1575
1575
  </div>
1576
1576
  </section>
1577
1577
 
1578
- <section class="quickforge-settings-section" aria-label=${T(`loadedCommands`,{count:this.commands.length})}>
1578
+ <section class="quickforge-settings-section" aria-label=${D(`loadedCommands`,{count:this.commands.length})}>
1579
1579
  <div class="quickforge-settings-row">
1580
1580
  <div class="quickforge-settings-row-main">
1581
- <div class="quickforge-settings-row-title">${T(`loadedCommands`,{count:this.commands.length})}</div>
1582
- <div class="quickforge-settings-row-description">${T(`loadedCommandsDescription`)}</div>
1581
+ <div class="quickforge-settings-row-title">${D(`loadedCommands`,{count:this.commands.length})}</div>
1582
+ <div class="quickforge-settings-row-description">${D(`loadedCommandsDescription`)}</div>
1583
1583
  </div>
1584
1584
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide">
1585
1585
  <button
@@ -1588,7 +1588,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
1588
1588
  ?disabled=${this.loadingCommands}
1589
1589
  @click=${()=>this.openCommandDir()}
1590
1590
  >
1591
- ${T(`openCommandDir`)}
1591
+ ${D(`openCommandDir`)}
1592
1592
  </button>
1593
1593
  <button
1594
1594
  class="quickforge-settings-button quickforge-settings-button-primary"
@@ -1596,41 +1596,41 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{$ as t,Bt as n,F as r,
1596
1596
  ?disabled=${this.loadingCommands}
1597
1597
  @click=${()=>this.createCommand()}
1598
1598
  >
1599
- ${T(`createCommand`)}
1599
+ ${D(`createCommand`)}
1600
1600
  </button>
1601
1601
  </div>
1602
1602
  </div>
1603
1603
 
1604
1604
  <div class="quickforge-settings-nested-list">
1605
- ${this.loadingCommands?y`<div class="quickforge-settings-empty-row">${T(`loading`)}</div>`:this.commands.length===0?y`<div class="quickforge-settings-empty-row">${T(`noCommandsLoaded`)}</div>`:this.commands.map(e=>{let t=e.argumentHint?` ${e.argumentHint}`:``;return y`
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`
1606
1606
  <div class="quickforge-settings-subrow">
1607
1607
  <div class="quickforge-settings-row-main">
1608
1608
  <div class="quickforge-settings-row-title">
1609
1609
  <code class="quickforge-settings-command-name">/${e.name}${t}</code>
1610
1610
  </div>
1611
1611
  <div class="quickforge-settings-row-description">
1612
- ${e.description||T(`noDescription`)}
1612
+ ${e.description||D(`noDescription`)}
1613
1613
  </div>
1614
1614
  </div>
1615
- ${e.relativePath?y`<div class="quickforge-settings-row-control quickforge-settings-row-control-wide quickforge-settings-readonly-value">${e.relativePath}</div>`:null}
1615
+ ${e.relativePath?x`<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?y`<div class="quickforge-settings-note">${T(`saving`)}</div>`:null}
1622
- ${this.saved?y`<div class="quickforge-settings-message">${T(`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}
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}
1625
1625
  </div>
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 T(`channelStatusStarting`);case`waiting_scan`:return T(`channelStatusWaitingScan`);case`running`:return T(`channelStatusRunning`);case`stopping`:return T(`channelStatusStopping`);case`error`:return T(`channelStatusError`);default:return T(`channelStatusStopped`)}}var cn=class extends b{loading=!0;channels=[];workspaces=[];selectedWorkspaceIdByChannel={};error=``;message=``;eventSource;busyChannelId=``;openingLogsChannelId=``;getTabName(){return T(`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||T(`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:T(`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:T(`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:T(`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 E({description:T(`channelRestartConfirm`,{name:e.name}),confirmLabel:T(`restart`),cancelLabel:T(`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:T(`requestFailed`)}finally{this.busyChannelId=``,this.requestUpdate()}}}async invokeAction(e,t){if(!this.busyChannelId&&!((t.destructive||t.id===`relogin`)&&!await E({description:t.id===`relogin`?T(`channelReloginConfirm`,{name:e.name}):T(`channelLogoutConfirm`,{name:e.name}),confirmLabel:t.label,cancelLabel:T(`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:T(`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:T(`channelOpenLogsFailed`)}finally{this.openingLogsChannelId=``,this.requestUpdate()}}}workspaceSection(e,t){if(!e.supportsWorkspaceSelection)return null;let n=this.selectedWorkspaceId(e);return y`
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`
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">
1630
- ${T(`channelWorkspace`)}
1631
- <quickforge-info-tip .label=${T(`channelWorkspaceDescription`)}></quickforge-info-tip>
1630
+ ${D(`channelWorkspace`)}
1631
+ <quickforge-info-tip .label=${D(`channelWorkspaceDescription`)}></quickforge-info-tip>
1632
1632
  </div>
1633
- <div class="quickforge-settings-row-description">${T(`channelWorkspaceDescription`)}</div>
1633
+ <div class="quickforge-settings-row-description">${D(`channelWorkspaceDescription`)}</div>
1634
1634
  </div>
1635
1635
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide">
1636
1636
  <select
@@ -1639,58 +1639,58 @@ 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=>y`
1643
- <option value=${e.id}>${e.kind===`default`?T(`channelDefaultWorkspace`):e.name}</option>
1642
+ ${this.workspaces.map(e=>x`
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?y`
1648
+ `}qrSection(e){return e.qrCodeText?x`
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">
1652
- ${T(`channelQrTitle`)}
1653
- <quickforge-info-tip .label=${T(`channelQrDescription`)}></quickforge-info-tip>
1652
+ ${D(`channelQrTitle`)}
1653
+ <quickforge-info-tip .label=${D(`channelQrDescription`)}></quickforge-info-tip>
1654
1654
  </div>
1655
- <div class="quickforge-settings-row-description">${T(`channelQrDescription`)}</div>
1655
+ <div class="quickforge-settings-row-description">${D(`channelQrDescription`)}</div>
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 y`
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`
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 ${on(e.status)}">${sn(e.status)}</span>
1665
+ <span class="quickforge-settings-badge ${sn(e.status)}">${cn(e.status)}</span>
1666
1666
  </div>
1667
1667
  <div class="quickforge-settings-row-description">${e.description}</div>
1668
1668
  </div>
1669
1669
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide">
1670
- <button class="quickforge-settings-button quickforge-settings-button-primary" type="button" ?disabled=${t||r||i||a} @click=${()=>this.invoke(e,`start`)}>${T(`start`)}</button>
1671
- <button class="quickforge-settings-button quickforge-settings-button-secondary" type="button" ?disabled=${t||!r||i} @click=${()=>this.invoke(e,`stop`)}>${T(`stop`)}</button>
1672
- <button class="quickforge-settings-button quickforge-settings-button-secondary" type="button" ?disabled=${t||i||a} @click=${()=>this.invoke(e,`restart`)}>${T(`restart`)}</button>
1673
- ${e.actions?.map(n=>y`
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
+ <button class="quickforge-settings-button quickforge-settings-button-secondary" type="button" ?disabled=${t||!r||i} @click=${()=>this.invoke(e,`stop`)}>${D(`stop`)}</button>
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`
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
- <button class="quickforge-settings-button quickforge-settings-button-secondary" type="button" ?disabled=${!!this.openingLogsChannelId} @click=${()=>this.openLogs(e)}>${T(n?`channelOpeningLogs`:`channelOpenLogs`)}</button>
1676
+ <button class="quickforge-settings-button quickforge-settings-button-secondary" type="button" ?disabled=${!!this.openingLogsChannelId} @click=${()=>this.openLogs(e)}>${D(n?`channelOpeningLogs`:`channelOpenLogs`)}</button>
1677
1677
  </div>
1678
1678
  </div>
1679
1679
 
1680
1680
  ${this.workspaceSection(e,t||r||i)}
1681
- ${a?y`<div class="quickforge-settings-alert quickforge-settings-warning-attached">${T(`channelNoWorkspaces`)}</div>`:null}
1682
- ${e.error?y`<div class="quickforge-settings-alert quickforge-settings-warning-attached">${e.error}</div>`:null}
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}
1683
1683
  ${this.qrSection(e)}
1684
1684
  </section>
1685
- `}render(){return this.loading?y`<div class="quickforge-settings-note">${T(`loading`)}</div>`:y`
1685
+ `}render(){return this.loading?x`<div class="quickforge-settings-note">${D(`loading`)}</div>`:x`
1686
1686
  <div class="quickforge-settings-stack">
1687
1687
  <div class="quickforge-settings-note">
1688
- ${T(`channelsSecurityWarning`)}
1688
+ ${D(`channelsSecurityWarning`)}
1689
1689
  </div>
1690
1690
 
1691
- ${this.channels.length?y`${this.channels.map(e=>this.channelCard(e))}`:y`<div class="quickforge-settings-note">${T(`channelsEmpty`)}</div>`}
1691
+ ${this.channels.length?x`${this.channels.map(e=>this.channelCard(e))}`:x`<div class="quickforge-settings-note">${D(`channelsEmpty`)}</div>`}
1692
1692
 
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}
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}
1695
1695
  </div>
1696
- `}},ln=`quickforge-channels-settings-tab`;customElements.get(ln)||customElements.define(ln,cn);function un(){return document.createElement(ln)}var dn=oe(),Z=_(),fn=(0,M.lazy)(()=>S(()=>import(`./AgentProfilesPage-Cvb1KTz5.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-B2lALtTE.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-DYp35JM3.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-mLvwvTmL.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-CuUW_9lq.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-DqeyJYoD.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-mAs_nbvw.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:T(`loading`)}),children:e})})}function xn(e){window.dispatchEvent(new CustomEvent(`quickforge:open-session-from-settings`,{detail:{sessionId:e}}))}function Sn(){return Q(T(`agentsTab`),()=>(0,Z.jsx)($,{children:(0,Z.jsx)(fn,{})}))}function Cn(){return Q(T(`skills`),()=>(0,Z.jsx)($,{children:(0,Z.jsx)(mn,{active:!0,scope:`global`,embedded:!0,onSaved:()=>void 0})}))}function wn(){return Q(T(`mcpServers`),()=>(0,Z.jsx)($,{children:(0,Z.jsx)(pn,{active:!0})}))}function Tn(){return Q(T(`plugins`),()=>(0,Z.jsx)($,{children:(0,Z.jsx)(hn,{})}))}function En(){return Q(T(`scheduledTasks`),()=>(0,Z.jsx)($,{children:(0,Z.jsx)(gn,{onOpenSession:xn})}))}function Dn(){return Q(T(`cloudAccount`),()=>(0,Z.jsx)($,{children:(0,Z.jsx)(vn,{})}))}function On(){return Q(T(`shareLinks`),()=>(0,Z.jsx)($,{children:(0,Z.jsx)(_n,{})}))}function kn(e){let t=[{key:`appearance`,tab:$e(),getDescription:()=>T(`appearanceDescription`)},{key:`cloudAccount`,tab:Dn(),getDescription:()=>T(`cloudAccountDescription`)},{key:`defaults`,tab:yt(),getDescription:()=>T(`defaultOptionsDescription`)},{key:`memory`,tab:Et(),getDescription:()=>T(`memoryDescription`)},{key:`customModels`,tab:Xe(e),getDescription:()=>T(`customModelsDescription`)},{key:`agents`,tab:Sn(),getDescription:()=>T(`agentsDescription`)},{key:`skills`,tab:Cn(),getDescription:()=>T(`globalSkillsDescription`)},{key:`mcp`,tab:wn(),getDescription:void 0},{key:`plugins`,tab:Tn(),getDescription:()=>T(`pluginsDescription`)},{key:`scheduledTasks`,tab:En(),getDescription:()=>T(`scheduledTasksDescription`)},{key:`projectCommands`,tab:an(),getDescription:()=>T(`projectCommandsDescription`)},{key:`backup`,tab:It(),getDescription:()=>T(`backupRestoreDescription`)},{key:`archivedConversations`,tab:Bt(),getDescription:()=>T(`archivedConversationsDescription`)},{key:`shareLinks`,tab:On(),getDescription:()=>T(`shareLinksDescription`)},{key:`channels`,tab:un(),getDescription:()=>T(`channelsDescription`)},{key:`lanAccess`,tab:Gt(),getDescription:()=>T(`lanAccessDescription`)},{key:`about`,tab:tn(),getDescription:()=>T(`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:ae,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?.(),ae=g?An[g.key]:void 0,_=(0,M.useRef)(null),[oe,v]=(0,M.useState)(!1);return(0,M.useEffect)(()=>{_.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:T(`searchSettings`),"aria-label":T(`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":T(`settings`),children:[m.map(({item:e,index:t})=>{let n=t===h,r=An[e.key];return(0,Z.jsxs)(`button`,{type:`button`,className:w(`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:w(`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:T(`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)(Pe,{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:w(`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:T(`settings`)})]}),(0,Z.jsxs)(`div`,{className:w(`flex min-w-0 items-center gap-2`,l===null&&`hidden md:flex`),children:[ae?(0,Z.jsx)(ae,{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)(me,{label:ie}):null]})]})]}),(0,Z.jsxs)(`div`,{className:w(`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:T(`searchSettings`),"aria-label":T(`searchSettings`),className:`quickforge-settings-input`})]})}),(0,Z.jsx)(`nav`,{className:`quickforge-settings-mobile-list`,"aria-label":T(`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:T(`noSettingsResults`)}):null]})})]}),(0,Z.jsx)(`section`,{ref:_,onScroll:()=>v((_.current?.scrollTop??0)>160),className:w(`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:T(`noSettingsResults`)}):g?(0,Z.jsx)(jn,{tab:g.tab}):null})}),(0,Z.jsx)(`button`,{type:`button`,onClick:()=>_.current?.scrollTo({top:0,behavior:`smooth`}),"aria-label":`返回顶部`,className:w(`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`,oe?`opacity-100`:`pointer-events-none opacity-0`,l===null&&`hidden`),children:(0,Z.jsx)(a,{className:`size-4`})})]})]})}export{Mn as SettingsWorkspacePage};
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};