@shawnstack/quickforge 1.6.7 → 1.6.9

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 (168) hide show
  1. package/README.md +10 -10
  2. package/dist/assets/AgentProfilesPage-5eqU0Cjk.js +1 -0
  3. package/dist/assets/ChatPanelHost-BNFeNRy-.js +244 -0
  4. package/dist/assets/{PluginsPage-DDxjlhiK.js → PluginsPage-C5OClNdT.js} +1 -1
  5. package/dist/assets/ScheduledTasksPage-yT10oaaM.js +2 -0
  6. package/dist/assets/{SettingsWorkspacePage-B_7o3noo.js → SettingsWorkspacePage-DuXwIeLd.js} +346 -335
  7. package/dist/assets/SharedConversationPage-ClpUSa0F.js +1 -0
  8. package/dist/assets/TerminalDock-BmL-FeKv.js +2 -0
  9. package/dist/assets/WorkspaceInspector-yH23pXpj.js +13 -0
  10. package/dist/assets/abnfDiagram-VRR7QNED-Dl_Fvlqg.js +1 -0
  11. package/dist/assets/arc-Bhg4c0ht.js +1 -0
  12. package/dist/assets/architecture-TIHT7OUA-BgP-IMeo.js +1 -0
  13. package/dist/assets/architectureDiagram-ZJ3FMSHR-BuojN27B.js +36 -0
  14. package/dist/assets/array-CYkMkqnU.js +1 -0
  15. package/dist/assets/blockDiagram-677ZJIJ3-alDLbrR1.js +132 -0
  16. package/dist/assets/c4Diagram-LMCZKHZV-D1lKa4VT.js +10 -0
  17. package/dist/assets/channel-Rz20dKTK.js +1 -0
  18. package/dist/assets/chunk-2Q5K7J3B-Cb14ZF_k.js +1 -0
  19. package/dist/assets/chunk-32BRIVSS-CwWLNjMZ.js +1 -0
  20. package/dist/assets/chunk-52WLFC77-Be569m7d.js +10 -0
  21. package/dist/assets/chunk-5FCAYU7R-BSvoiWV1.js +1 -0
  22. package/dist/assets/chunk-5HE753X5-CRgsy8WS.js +1 -0
  23. package/dist/assets/chunk-5JV3BV7I-CdW477UR.js +1 -0
  24. package/dist/assets/chunk-5TONJI2A-CdtKzSmp.js +2 -0
  25. package/dist/assets/chunk-5VM5RSS4-BKjjssLZ.js +15 -0
  26. package/dist/assets/chunk-7BUUIJ7U-ByAXiXdn.js +1 -0
  27. package/dist/assets/chunk-BIQX33UG-DeG8SCT1.js +1 -0
  28. package/dist/assets/chunk-C7G6YPKG-D_zHT68Q.js +1 -0
  29. package/dist/assets/chunk-CQNSW5MT-CHpHoUSu.js +1 -0
  30. package/dist/assets/chunk-CYSBUYHQ-CRP50Vov.js +1 -0
  31. package/dist/assets/chunk-EMLP6XTP-DX6uQQ2v.js +1 -0
  32. package/dist/assets/chunk-EX3LRPZG-DAJRNkHR.js +231 -0
  33. package/dist/assets/chunk-FWX5IMBZ-XbM5yomC.js +2 -0
  34. package/dist/assets/chunk-HOUHSVGY-Ci0ljnb1.js +1 -0
  35. package/dist/assets/chunk-ICXQ74PX-Dy2WJ71z.js +2 -0
  36. package/dist/assets/chunk-JG7HCLWE-2PrkzHkt.js +2 -0
  37. package/dist/assets/chunk-JWPE2WC7-D32uacSM.js +1 -0
  38. package/dist/assets/chunk-KEIR6QF5-77hsebd7.js +161 -0
  39. package/dist/assets/chunk-MOJQB5TN-DIAFLtiS.js +88 -0
  40. package/dist/assets/chunk-MOZMSUNE-BbscOaEz.js +1 -0
  41. package/dist/assets/chunk-OGEWGWER-ivBVxzKe.js +1 -0
  42. package/dist/assets/chunk-OSBZ3O6U-frD0hkdx.js +1 -0
  43. package/dist/assets/chunk-PUDLZKDR-B-37Rxae.js +156 -0
  44. package/dist/assets/chunk-Q4XR5HBZ-Y90m2RTe.js +11 -0
  45. package/dist/assets/chunk-QBLGF6JB-DixBqslB.js +1 -0
  46. package/dist/assets/chunk-R7FJI6CG-DXS1UXn_.js +1 -0
  47. package/dist/assets/chunk-RYQCIY6F-n4JxhNd0.js +1 -0
  48. package/dist/assets/chunk-U6XO7XAA-yHlgxMmn.js +2 -0
  49. package/dist/assets/chunk-V7JOEXUC-Z6kuZfbl.js +206 -0
  50. package/dist/assets/chunk-VAUOI2AC-BOZvd2Sn.js +1 -0
  51. package/dist/assets/chunk-VR4S4FIN-Cs_SIQma.js +1 -0
  52. package/dist/assets/chunk-WYO6CB5R-CGExYbV-.js +128 -0
  53. package/dist/assets/chunk-XXDRQBXY-CD_EGCtT.js +1 -0
  54. package/dist/assets/chunk-Y2CYZVJY-CQltPwYk.js +1 -0
  55. package/dist/assets/chunk-YOTPTUD7-DopPXWSl.js +1 -0
  56. package/dist/assets/chunk-ZGVPDNZ5-CJHOeqMb.js +62 -0
  57. package/dist/assets/chunk-ZIRB5QZD-BBVc5mf6.js +32 -0
  58. package/dist/assets/classDiagram-OUVF2IWQ-C_ozTKCt.js +1 -0
  59. package/dist/assets/classDiagram-v2-EOCWNBFH-FOfFbbZF.js +1 -0
  60. package/dist/assets/cose-bilkent-JH36ORCC-DLjV-dTm.js +1 -0
  61. package/dist/assets/cynefin-VYW2F7L2-BzPhLtd5.js +1 -0
  62. package/dist/assets/cynefinDiagram-TSTJHNR4-BfH3zVS-.js +62 -0
  63. package/dist/assets/cytoscape.esm-DwdZnGOm.js +321 -0
  64. package/dist/assets/dagre-CY3D84Cl.js +1 -0
  65. package/dist/assets/dagre-VKFMJZFB-BIhwZCIZ.js +4 -0
  66. package/dist/assets/defaultLocale-Beh6XjaL.js +1 -0
  67. package/dist/assets/diagram-FQU43EPY-BHnzNM2w.js +3 -0
  68. package/dist/assets/diagram-G47NLZAW-C7-ZlmFT.js +24 -0
  69. package/dist/assets/diagram-NH7WQ7WH-C-P9Y7IR.js +24 -0
  70. package/dist/assets/diagram-OA4YK3LP-Ci5lZ_T5.js +30 -0
  71. package/dist/assets/diagram-WEI45ONY-C1xuK2bs.js +41 -0
  72. package/dist/assets/dist-DelZBZpK.js +1 -0
  73. package/dist/assets/ebnfDiagram-CCIWWBDH-DKQ5NWMD.js +1 -0
  74. package/dist/assets/erDiagram-Q63AITRT-HAWySadP.js +85 -0
  75. package/dist/assets/eventmodeling-45OFAUF4-BcgGbVJ-.js +1 -0
  76. package/dist/assets/flowDiagram-23GEKE2U-dtkzcC8E.js +1 -0
  77. package/dist/assets/ganttDiagram-NO4QXBWP-C1hwIcOA.js +292 -0
  78. package/dist/assets/gitGraph-TEB2WS4Q-VByWboBU.js +1 -0
  79. package/dist/assets/gitGraphDiagram-IHSO6WYX-DYUYxs1R.js +106 -0
  80. package/dist/assets/graphlib-CAISHZh4.js +1 -0
  81. package/dist/assets/icons-C7j5jdKo.js +1 -0
  82. package/dist/assets/index-Qof73j0o.css +3 -0
  83. package/dist/assets/index-_ut7awrd.js +63 -0
  84. package/dist/assets/info-DKCQHKI2-CZeDLZxx.js +1 -0
  85. package/dist/assets/infoDiagram-FWYZ7A6U-CnIL6tv4.js +2 -0
  86. package/dist/assets/init-Rr1s_RiX.js +1 -0
  87. package/dist/assets/ishikawaDiagram-FXEZZL3T-B7WXNycQ.js +70 -0
  88. package/dist/assets/journeyDiagram-5HDEW3XC-D4HvioyY.js +139 -0
  89. package/dist/assets/kanban-definition-HUTT4EX6-CDs763eS.js +89 -0
  90. package/dist/assets/line-ikKkQiFp.js +1 -0
  91. package/dist/assets/linear-GqPyxQkN.js +1 -0
  92. package/dist/assets/map-CJwjCvwr.js +1 -0
  93. package/dist/assets/{mcp-servers-dialog-CJ4HKWVZ.js → mcp-servers-dialog-DC2Zfojn.js} +2 -2
  94. package/dist/assets/mermaid-parser.core-CoE8cccr.js +4 -0
  95. package/dist/assets/mermaid-renderer-BmbSAmpG.js +2 -0
  96. package/dist/assets/mermaid.core-DlFSL90j.js +11 -0
  97. package/dist/assets/mindmap-definition-LN4V7U3C-DLdq0K9C.js +96 -0
  98. package/dist/assets/{monaco-FCb94ino.js → monaco-CdOyGlWD.js} +1 -1
  99. package/dist/assets/ordinal-CibZU3PM.js +1 -0
  100. package/dist/assets/otel-BNGM50C-.js +3 -0
  101. package/dist/assets/packet-7NZHBO7P-decrrxyX.js +1 -0
  102. package/dist/assets/path-BAQ3hXlG.js +1 -0
  103. package/dist/assets/pegDiagram-2B236MQR-Cm1kPRC2.js +1 -0
  104. package/dist/assets/pi-ai-Cr3rpCXT.js +131 -0
  105. package/dist/assets/pi-web-ui-DoRGtREc.js +2803 -0
  106. package/dist/assets/pie-RZYD4A2V-J1CasQZl.js +1 -0
  107. package/dist/assets/pieDiagram-ENE6RG2P-Df05wjjo.js +39 -0
  108. package/dist/assets/quadrantDiagram-ABIIQ3AL-BjCwGxJC.js +7 -0
  109. package/dist/assets/radar-I7S5WNFK-B-sZytUA.js +1 -0
  110. package/dist/assets/railroad-3IZDKUUU-BSaqNPm8.js +1 -0
  111. package/dist/assets/railroad-abnf-AHOZXSZD-lzZR7PxT.js +1 -0
  112. package/dist/assets/railroad-ebnf-EBAXGLYW-DQtz1Fh9.js +1 -0
  113. package/dist/assets/railroad-peg-LSFZ7HO6-CpMsuGY3.js +1 -0
  114. package/dist/assets/railroadDiagram-RFXS5EU6-CTUvpKkv.js +1 -0
  115. package/dist/assets/{react-vendor-BR9MG2D-.js → react-vendor-VqdnQHHS.js} +1 -1
  116. package/dist/assets/requirementDiagram-TGXJPOKE-BU1kvEku.js +84 -0
  117. package/dist/assets/rough.esm-Djo4Abte.js +1 -0
  118. package/dist/assets/sankeyDiagram-HTMAVEWB-BHmvxVqH.js +40 -0
  119. package/dist/assets/sequenceDiagram-DBY2YBRQ-CTpwICgg.js +162 -0
  120. package/dist/assets/sizeCapture-X5ZJPWSS-BbLhGaa4.js +1 -0
  121. package/dist/assets/{skills-dialog-CmCLl7K_.js → skills-dialog-Mnj8fZwq.js} +1 -1
  122. package/dist/assets/src-B4Tvg3gT.js +1 -0
  123. package/dist/assets/stateDiagram-2N3HPSRC-BxuDwIgT.js +1 -0
  124. package/dist/assets/stateDiagram-v2-6OUMAXLB-BGLshxcY.js +1 -0
  125. package/dist/assets/swimlanes-5IMT3BWC-EkZsiylV.js +2 -0
  126. package/dist/assets/swimlanesDiagram-G3AALYLV-CqdqxA-b.js +8 -0
  127. package/dist/assets/timeline-definition-FHXFAJF6-C9ewOCTa.js +120 -0
  128. package/dist/assets/treeView-QDETBFTQ-Byb71heW.js +1 -0
  129. package/dist/assets/treemap-6X3UGDF4-CMV1SJsq.js +1 -0
  130. package/dist/assets/vennDiagram-L72KCM5P-CR49Y4Lp.js +34 -0
  131. package/dist/assets/wardley-OPB4EBWU-DtCHtr2V.js +1 -0
  132. package/dist/assets/wardleyDiagram-EHGQE667-Cn0GgwWi.js +78 -0
  133. package/dist/assets/xychartDiagram-FW5EYKEG-DlmPNAvd.js +7 -0
  134. package/dist/index.html +8 -8
  135. package/package.json +4 -3
  136. package/server/agent-manager.mjs +174 -9
  137. package/server/agent-profile-files.mjs +86 -6
  138. package/server/agent-profile-schema.mjs +197 -0
  139. package/server/agent-profiles.mjs +172 -41
  140. package/server/ai-http-logger.mjs +1 -1
  141. package/server/auto-compaction.mjs +2 -2
  142. package/server/project-route-context.mjs +25 -0
  143. package/server/routes/agent-profiles.mjs +10 -4
  144. package/server/routes/models.mjs +1 -1
  145. package/server/routes/project.mjs +6 -10
  146. package/server/routes/scheduled-tasks.mjs +1 -1
  147. package/server/routes/workspace.mjs +185 -12
  148. package/server/session-utils.mjs +1 -1
  149. package/server/storage.mjs +34 -0
  150. package/server/subagents.mjs +64 -0
  151. package/server/tools/definitions.mjs +17 -1
  152. package/server/utils/platform.mjs +25 -2
  153. package/dist/assets/AgentProfilesPage-XJdWmkQb.js +0 -1
  154. package/dist/assets/ChatPanelHost-BrUHIzBw.js +0 -242
  155. package/dist/assets/ScheduledTasksPage-Bw-pSpbv.js +0 -2
  156. package/dist/assets/SharedConversationPage-B5DPQla3.js +0 -1
  157. package/dist/assets/TerminalDock-CVObjSM6.js +0 -2
  158. package/dist/assets/WorkspaceInspector-Dk5887WR.js +0 -3
  159. package/dist/assets/WorkspaceReaderDialog-D-_BBvud.js +0 -1
  160. package/dist/assets/diff-line-counts-DagL0jQr.js +0 -10
  161. package/dist/assets/icons-DHoaB5uq.js +0 -1
  162. package/dist/assets/index-C77QCHE9.css +0 -3
  163. package/dist/assets/index-DeUvsbzW.js +0 -63
  164. package/dist/assets/pi-ai-Cx633yhb.js +0 -134
  165. package/dist/assets/pi-web-ui-DFNE2m5b.js +0 -2770
  166. package/dist/assets/useAppTheme-BwZ5OEf3.js +0 -1
  167. /package/dist/assets/{plugin-api-UKg_cgSG.js → plugin-api-BbUkYm3Y.js} +0 -0
  168. /package/dist/assets/{xterm-BtSXYfUR.js → xterm-CGiQzDiR.js} +0 -0
@@ -1,5 +1,5 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/AgentProfilesPage-XJdWmkQb.js","assets/rolldown-runtime-DWdDZTNf.js","assets/index-DeUvsbzW.js","assets/pi-ai-Cx633yhb.js","assets/pi-web-ui-DFNE2m5b.js","assets/lit-vendor-Dr3cpBGF.js","assets/css-utils-rkE68RDy.js","assets/icons-DHoaB5uq.js","assets/react-vendor-BR9MG2D-.js","assets/skills-dialog-CmCLl7K_.js","assets/logger-B65Akg8A.js","assets/index-C77QCHE9.css","assets/mcp-servers-dialog-CJ4HKWVZ.js","assets/PluginsPage-DDxjlhiK.js","assets/plugin-api-UKg_cgSG.js","assets/ScheduledTasksPage-Bw-pSpbv.js"])))=>i.map(i=>d[i]);
2
- import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,Ft as n,It as r,Nt as i,Pt as a,Rt as o,V as s,_ as c,_t as l,c as u,dt as d,ft as f,g as p,jt as m,p as h,u as g,x as ee}from"./icons-DHoaB5uq.js";import{n as te,r as ne}from"./react-vendor-BR9MG2D-.js";import{p as _}from"./lit-vendor-Dr3cpBGF.js";import{a as v,u as y}from"./pi-web-ui-DFNE2m5b.js";import{y as b}from"./pi-ai-Cx633yhb.js";import{t as x}from"./logger-B65Akg8A.js";import{$ as re,A as ie,C as S,F as C,G as ae,J as oe,K as se,M as ce,N as le,O as ue,P as w,Q as T,S as E,T as de,W as D,X as fe,Z as pe,_ as me,at as he,b as ge,g as _e,it as ve,k as ye,nt as be,ot as xe,rt as O,st as k,tt as Se,v as Ce,x as we,y as Te}from"./index-DeUvsbzW.js";var A=e(o(),1),Ee={openai:{name:`OpenAI`,baseUrl:`https://api.openai.com/v1`,protocol:`openai-completions`,modelId:`gpt-4o`},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:D.name,baseUrl:D.baseUrl,protocol:`openai-completions`,modelId:D.modelId}},De=[{key:`openai`,label:k(`presetOpenai`)},{key:`deepseek`,label:k(`presetDeepseek`)},{key:`glm`,label:k(`presetGlm`)},{key:`ollama`,label:k(`presetOllama`)},{key:`litellm`,label:k(`presetLitellm`)},{key:`custom`,label:k(`presetCustom`)}],j=()=>({modelId:``,contextWindow:D.contextWindow,maxTokens:D.maxTokens,reasoning:!0,open:!1}),M=()=>({name:D.name,baseUrl:D.baseUrl,apiKey:``,headerRows:[],protocol:`openai-completions`,models:[j()]}),Oe=class extends v{providers=[];form=M();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 k(`customModels`)}async loadProviders(){this.loading=!0,this.requestUpdate();try{this.providers=await y().customProviders.getAll()}catch(e){x.error(`Failed to load custom providers:`,e),this.providers=[]}finally{this.loading=!1,this.requestUpdate()}}resetTestState(){this.testing=!1,this.testResult=`idle`,this.testError=``}openAddForm(){this.editingProviderId=void 0,this.form=M(),this.apiKeyVisible=!1,this.advancedOpen=!1,this.activePreset=``,this.resetTestState(),this.formOpen=!0,this.requestUpdate()}async openEditForm(e){let t=await y().providerKeys.get(e.name)??e.apiKey??``,n=e.models??[],r=n.length>0?n.map(e=>({modelId:e.id,contextWindow:e.contextWindow??D.contextWindow,maxTokens:e.maxTokens??D.maxTokens,reasoning:e.reasoning===!0,open:!1})):[j()],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=M(),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,j()]},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:[j()]};else{let t=Ee[e];this.form={...this.form,name:t.name,baseUrl:t.baseUrl,protocol:t.protocol,models:[{...j(),modelId:t.modelId,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=r.includes(`api.deepseek.com`);return fe({id:e.modelId,name:`${e.modelId} (${n})`,api:this.form.protocol,provider:n,baseUrl:r.replace(/\/$/,``),reasoning:i,input:[`text`,`image`],cost:{input:0,output:0,cacheRead:0,cacheWrite:0},contextWindow:Number(e.contextWindow)||D.contextWindow,maxTokens:Number(e.maxTokens)||D.maxTokens,headers:Object.keys(t).length>0?t:void 0,thinkingLevelMap:a&&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`,...a&&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=k(`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||k(`connectionFailed`))}catch(e){this.testResult=`fail`,this.testError=e?.message||k(`connectionFailed`)}finally{this.testing=!1,this.requestUpdate()}}async saveModel(){let e=this.form.name.trim(),t=this.form.baseUrl.trim();if(!e||!t){w(k(`fillProviderBaseUrlModel`));return}let n=this.form.models.filter(e=>e.modelId.trim());if(n.length===0){w(k(`atLeastOneModel`));return}let r=n.map(e=>e.modelId.trim());if(new Set(r).size!==r.length){w(k(`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??re(),name:e,type:this.form.protocol,baseUrl:a[0].baseUrl,apiKey:o||void 0,models:a};try{let e=y();await e.customProviders.set(c),s&&s.name!==c.name&&await e.providerKeys.delete(s.name),o?await e.providerKeys.set(c.name,o):await e.providerKeys.delete(c.name),this.closeForm(),await this.loadProviders()}catch(e){x.error(`Failed to save custom model:`,e),w(k(`saveCustomModelFailed`))}}async deleteProvider(e){if(await C({description:k(`confirmDeleteProvider`,{name:e.name}),confirmLabel:k(`confirmDelete`),cancelLabel:k(`cancel`),variant:`destructive`}))try{let t=y();await t.customProviders.delete(e.id),await t.providerKeys.delete(e.name),await this.loadProviders()}catch(e){x.error(`Failed to delete custom provider:`,e),w(k(`deleteFailed`))}}renderProvider(e){let t=e.models??[],n=t.length,r=e.type===`anthropic-messages`?`Anthropic Messages`:`OpenAI Compatible`;return _`
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/AgentProfilesPage-5eqU0Cjk.js","assets/rolldown-runtime-DWdDZTNf.js","assets/index-_ut7awrd.js","assets/pi-ai-Cr3rpCXT.js","assets/pi-web-ui-DoRGtREc.js","assets/lit-vendor-Dr3cpBGF.js","assets/css-utils-rkE68RDy.js","assets/icons-C7j5jdKo.js","assets/react-vendor-VqdnQHHS.js","assets/skills-dialog-Mnj8fZwq.js","assets/logger-B65Akg8A.js","assets/index-Qof73j0o.css","assets/mcp-servers-dialog-DC2Zfojn.js","assets/PluginsPage-C5OClNdT.js","assets/plugin-api-BbUkYm3Y.js","assets/ScheduledTasksPage-yT10oaaM.js"])))=>i.map(i=>d[i]);
2
+ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r,Nt as i,Rt as a,S as o,Vt as s,_ as c,c as l,g as u,j as d,mt as ee,p as f,pt as p,u as m,yt as h,zt as te}from"./icons-C7j5jdKo.js";import{n as ne,r as re}from"./react-vendor-VqdnQHHS.js";import{p as g}from"./lit-vendor-Dr3cpBGF.js";import{m as _,x as v}from"./pi-web-ui-DoRGtREc.js";import{J as y}from"./pi-ai-Cr3rpCXT.js";import{t as b}from"./logger-B65Akg8A.js";import{B as x,C as ie,D as ae,E as oe,F as se,I as ce,O as S,P as le,Q as ue,R as de,S as fe,T as pe,V as C,X as w,Z as me,at as he,ct as ge,dt as _e,et as ve,ft as ye,it as T,j as be,k as E,lt as D,nt as xe,pt as O,rt as Se,st as Ce,ut as we,w as Te,z as Ee}from"./index-_ut7awrd.js";var k=e(s(),1),De={openai:{name:`OpenAI`,baseUrl:`https://api.openai.com/v1`,protocol:`openai-completions`,modelId:`gpt-4o`,supportsImages:!0},deepseek:{name:`DeepSeek`,baseUrl:`https://api.deepseek.com/v1`,protocol:`openai-completions`,modelId:`deepseek-chat`},glm:{name:`Zhipu GLM`,baseUrl:`https://open.bigmodel.cn/api/paas/v4`,protocol:`openai-completions`,modelId:`glm-4-plus`},ollama:{name:`Ollama`,baseUrl:`http://localhost:11434/v1`,protocol:`openai-completions`,modelId:`llama3.1`},litellm:{name:w.name,baseUrl:w.baseUrl,protocol:`openai-completions`,modelId:w.modelId,supportsImages:w.supportsImages}},Oe=[{key:`openai`,label:O(`presetOpenai`)},{key:`deepseek`,label:O(`presetDeepseek`)},{key:`glm`,label:O(`presetGlm`)},{key:`ollama`,label:O(`presetOllama`)},{key:`litellm`,label:O(`presetLitellm`)},{key:`custom`,label:O(`presetCustom`)}],A=()=>({modelId:``,contextWindow:w.contextWindow,maxTokens:w.maxTokens,reasoning:!0,supportsImages:!1,open:!1}),j=()=>({name:w.name,baseUrl:w.baseUrl,apiKey:``,headerRows:[],protocol:`openai-completions`,models:[A()]}),ke=class extends _{providers=[];form=j();editingProviderId;formOpen=!1;loading=!0;apiKeyVisible=!1;advancedOpen=!1;activePreset=``;testing=!1;testResult=`idle`;testError=``;autoEditProviderName=null;async connectedCallback(){if(super.connectedCallback(),await this.loadProviders(),this.autoEditProviderName){let e=this.providers.find(e=>e.name===this.autoEditProviderName);e&&await this.openEditForm(e),this.autoEditProviderName=null}}getTabName(){return O(`customModels`)}async loadProviders(){this.loading=!0,this.requestUpdate();try{this.providers=await v().customProviders.getAll()}catch(e){b.error(`Failed to load custom providers:`,e),this.providers=[]}finally{this.loading=!1,this.requestUpdate()}}resetTestState(){this.testing=!1,this.testResult=`idle`,this.testError=``}openAddForm(){this.editingProviderId=void 0,this.form=j(),this.apiKeyVisible=!1,this.advancedOpen=!1,this.activePreset=``,this.resetTestState(),this.formOpen=!0,this.requestUpdate()}async openEditForm(e){let t=await v().providerKeys.get(e.name)??e.apiKey??``,n=e.models??[],r=n.length>0?n.map(e=>({modelId:e.id,contextWindow:e.contextWindow??w.contextWindow,maxTokens:e.maxTokens??w.maxTokens,reasoning:e.reasoning===!0,supportsImages:e.input?.includes(`image`)===!0,open:!1})):[A()],i=n[0]?.headers??{},a=Object.entries(i).map(([e,t])=>({key:e,value:String(t)}));this.editingProviderId=e.id,this.form={providerId:e.id,id:e.id,name:e.name,baseUrl:e.baseUrl,apiKey:t,headerRows:a,protocol:e.type===`anthropic-messages`?`anthropic-messages`:`openai-completions`,models:r},this.apiKeyVisible=!1,this.advancedOpen=a.length>0||e.type===`anthropic-messages`,this.activePreset=``,this.resetTestState(),this.formOpen=!0,this.requestUpdate()}closeForm(){this.formOpen=!1,this.editingProviderId=void 0,this.form=j(),this.apiKeyVisible=!1,this.advancedOpen=!1,this.activePreset=``,this.resetTestState(),this.requestUpdate()}toggleApiKeyVisibility(){this.apiKeyVisible=!this.apiKeyVisible,this.requestUpdate()}updateForm(e,t){this.form={...this.form,[e]:t},(e===`name`||e===`baseUrl`)&&(this.activePreset=``),this.resetTestState(),this.requestUpdate()}updateModelField(e,t,n){let r=this.form.models.map((r,i)=>i===e?{...r,[t]:n}:r);this.form={...this.form,models:r},t===`modelId`&&(this.activePreset=``,this.resetTestState()),this.requestUpdate()}addModelRow(){this.form={...this.form,models:[...this.form.models,A()]},this.requestUpdate()}removeModelRow(e){let t=this.form.models.filter((t,n)=>n!==e);this.form={...this.form,models:t},this.requestUpdate()}toggleModelExpanded(e){let t=this.form.models.map((t,n)=>n===e?{...t,open:!t.open}:t);this.form={...this.form,models:t},this.requestUpdate()}addHeaderRow(){this.form={...this.form,headerRows:[...this.form.headerRows,{key:``,value:``}]},this.requestUpdate()}updateHeaderRow(e,t,n){let r=this.form.headerRows.map((r,i)=>i===e?{...r,[t]:n}:r);this.form={...this.form,headerRows:r},this.requestUpdate()}removeHeaderRow(e){let t=this.form.headerRows.filter((t,n)=>n!==e);this.form={...this.form,headerRows:t},this.requestUpdate()}applyPreset(e){if(this.activePreset=e,e===`custom`)this.form={...this.form,name:``,baseUrl:``,protocol:`openai-completions`,models:[A()]};else{let t=De[e];this.form={...this.form,name:t.name,baseUrl:t.baseUrl,protocol:t.protocol,models:[{...A(),modelId:t.modelId,supportsImages:t.supportsImages===!0,open:!1}]}}this.resetTestState(),this.requestUpdate()}buildHeadersFromRows(){let e={};for(let t of this.form.headerRows){let n=t.key.trim(),r=t.value.trim();n&&r&&(e[n]=r)}return e}buildModel(e,t){let n=this.form.name.trim(),r=this.form.baseUrl.trim(),i=e.reasoning===!0,a=e.supportsImages===!0?[`text`,`image`]:[`text`],o=r.includes(`api.deepseek.com`);return xe({id:e.modelId,name:`${e.modelId} (${n})`,api:this.form.protocol,provider:n,baseUrl:r.replace(/\/$/,``),reasoning:i,input:a,cost:{input:0,output:0,cacheRead:0,cacheWrite:0},contextWindow:Number(e.contextWindow)||w.contextWindow,maxTokens:Number(e.maxTokens)||w.maxTokens,headers:Object.keys(t).length>0?t:void 0,thinkingLevelMap:o&&i?{low:`high`,medium:`high`,high:`high`,xhigh:`max`}:void 0,compat:this.form.protocol===`openai-completions`?{supportsStore:!1,supportsDeveloperRole:!1,supportsReasoningEffort:i,supportsUsageInStreaming:!1,supportsStrictMode:!1,maxTokensField:`max_tokens`,...o&&i?{requiresReasoningContentOnAssistantMessages:!0,thinkingFormat:`deepseek`}:{}}:void 0})}async testConnection(){let e=this.form.baseUrl.trim(),t=this.form.models.find(e=>e.modelId.trim());if(!e||!t){this.testing=!1,this.testResult=`fail`,this.testError=O(`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||O(`connectionFailed`))}catch(e){this.testResult=`fail`,this.testError=e?.message||O(`connectionFailed`)}finally{this.testing=!1,this.requestUpdate()}}async saveModel(){let e=this.form.name.trim(),t=this.form.baseUrl.trim();if(!e||!t){x(O(`fillProviderBaseUrlModel`));return}let n=this.form.models.filter(e=>e.modelId.trim());if(n.length===0){x(O(`atLeastOneModel`));return}let r=n.map(e=>e.modelId.trim());if(new Set(r).size!==r.length){x(O(`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=v();await e.customProviders.set(c),s&&s.name!==c.name&&await e.providerKeys.delete(s.name),o?await e.providerKeys.set(c.name,o):await e.providerKeys.delete(c.name),this.closeForm(),await this.loadProviders()}catch(e){b.error(`Failed to save custom model:`,e),x(O(`saveCustomModelFailed`))}}async deleteProvider(e){if(await C({description:O(`confirmDeleteProvider`,{name:e.name}),confirmLabel:O(`confirmDelete`),cancelLabel:O(`cancel`),variant:`destructive`}))try{let t=v();await t.customProviders.delete(e.id),await t.providerKeys.delete(e.name),await this.loadProviders()}catch(e){b.error(`Failed to delete custom provider:`,e),x(O(`deleteFailed`))}}renderProvider(e){let t=e.models??[],n=t.length,r=e.type===`anthropic-messages`?`Anthropic Messages`:`OpenAI Compatible`;return g`
3
3
  <div class="quickforge-settings-list-item">
4
4
  <div class="quickforge-settings-list-item-main">
5
5
  <div class="flex min-w-0 items-start gap-3">
@@ -8,16 +8,16 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,Ft as n,It 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">${k(`providerProtocol`)}: ${r}</span>
12
- <span class="quickforge-settings-badge quickforge-settings-badge-info">${k(`modelsCount`,{count:n})}</span>
13
- ${n===0?_`<span class="quickforge-settings-badge quickforge-settings-badge-warning">${k(`noModelAdded`)}</span>`:null}
11
+ <span class="quickforge-settings-badge quickforge-settings-badge-muted">${O(`providerProtocol`)}: ${r}</span>
12
+ <span class="quickforge-settings-badge quickforge-settings-badge-info">${O(`modelsCount`,{count:n})}</span>
13
+ ${n===0?g`<span class="quickforge-settings-badge quickforge-settings-badge-warning">${O(`noModelAdded`)}</span>`:null}
14
14
  </div>
15
- ${n>0?_`
15
+ ${n>0?g`
16
16
  <div class="quickforge-settings-meta">
17
- ${t.slice(0,6).map(e=>_`
17
+ ${t.slice(0,6).map(e=>g`
18
18
  <code class="quickforge-settings-command-name">${e.id}</code>
19
19
  `)}
20
- ${t.length>6?_`<span class="quickforge-settings-badge quickforge-settings-badge-muted">+${t.length-6}</span>`:null}
20
+ ${t.length>6?g`<span class="quickforge-settings-badge quickforge-settings-badge-muted">+${t.length-6}</span>`:null}
21
21
  </div>
22
22
  `:null}
23
23
  </div>
@@ -29,22 +29,22 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,Ft as n,It as r
29
29
  type="button"
30
30
  @click=${()=>this.openEditForm(e)}
31
31
  >
32
- ${k(`editModel`)}
32
+ ${O(`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
- ${k(`delete`)}
39
+ ${O(`delete`)}
40
40
  </button>
41
41
  </div>
42
42
  </div>
43
- `}renderPresetChips(){return _`
43
+ `}renderPresetChips(){return g`
44
44
  <div class="quickforge-settings-form-row">
45
- <span class="quickforge-settings-form-label">${k(`presets`)}</span>
45
+ <span class="quickforge-settings-form-label">${O(`presets`)}</span>
46
46
  <div class="quickforge-settings-segmented quickforge-settings-segmented-wrap">
47
- ${De.map(e=>_`
47
+ ${Oe.map(e=>g`
48
48
  <button
49
49
  class="quickforge-settings-segmented-option ${this.activePreset===e.key?`quickforge-settings-segmented-option-active`:``}"
50
50
  type="button"
@@ -55,12 +55,12 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,Ft as n,It as r
55
55
  `)}
56
56
  </div>
57
57
  </div>
58
- `}renderModelRow(e,t){let n=e.open===!0;return _`
58
+ `}renderModelRow(e,t){let n=e.open===!0;return g`
59
59
  <div class="quickforge-settings-subrow quickforge-settings-row-align-start">
60
60
  <button
61
61
  class="quickforge-settings-icon-action"
62
62
  type="button"
63
- title=${k(`expandModel`)}
63
+ title=${O(`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{A as t,Ft as n,It 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=${k(`modelIdPlaceholder`)}
74
+ placeholder=${O(`modelIdPlaceholder`)}
75
75
  />
76
- ${n?_`
76
+ ${n?g`
77
77
  <div class="quickforge-settings-model-grid mt-3">
78
78
  <label class="quickforge-settings-form-row">
79
- <span class="quickforge-settings-form-label">${k(`contextWindow`)}</span>
79
+ <span class="quickforge-settings-form-label">${O(`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{A as t,Ft as n,It as r
85
85
  />
86
86
  </label>
87
87
  <label class="quickforge-settings-form-row">
88
- <span class="quickforge-settings-form-label">${k(`maxTokens`)}</span>
88
+ <span class="quickforge-settings-form-label">${O(`maxTokens`)}</span>
89
89
  <input
90
90
  class="quickforge-settings-input"
91
91
  .value=${String(e.maxTokens)}
@@ -100,47 +100,58 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,Ft as n,It as r
100
100
  .checked=${e.reasoning}
101
101
  @change=${e=>this.updateModelField(t,`reasoning`,e.target.checked)}
102
102
  />
103
- <span>${k(`reasoningModel`)}</span>
103
+ <span>${O(`reasoningModel`)}</span>
104
+ </label>
105
+ <label class="mt-2 flex items-center gap-2 text-sm text-muted-foreground">
106
+ <input
107
+ type="checkbox"
108
+ .checked=${e.supportsImages}
109
+ @change=${e=>this.updateModelField(t,`supportsImages`,e.target.checked)}
110
+ />
111
+ <span>
112
+ ${O(`imageInputModel`)}
113
+ <quickforge-info-tip .label=${O(`imageInputModelHelp`)}></quickforge-info-tip>
114
+ </span>
104
115
  </label>
105
116
  `:null}
106
117
  </div>
107
- ${this.form.models.length>1?_`
118
+ ${this.form.models.length>1?g`
108
119
  <button
109
120
  class="quickforge-settings-icon-action quickforge-settings-icon-action-danger"
110
121
  type="button"
111
- title=${k(`delete`)}
122
+ title=${O(`delete`)}
112
123
  @click=${()=>this.removeModelRow(t)}
113
124
  >
114
125
 
115
126
  </button>
116
127
  `:null}
117
128
  </div>
118
- `}renderHeadersEditor(){return _`
129
+ `}renderHeadersEditor(){return g`
119
130
  <div class="quickforge-settings-form-row">
120
131
  <span class="quickforge-settings-form-label">
121
- ${k(`customHeaders`)}
122
- <quickforge-info-tip .label=${k(`customHeadersHelp`)}></quickforge-info-tip>
132
+ ${O(`customHeaders`)}
133
+ <quickforge-info-tip .label=${O(`customHeadersHelp`)}></quickforge-info-tip>
123
134
  </span>
124
- ${this.form.headerRows.length===0?_``:_`
135
+ ${this.form.headerRows.length===0?g``:g`
125
136
  <div class="quickforge-settings-nested-list">
126
- ${this.form.headerRows.map((e,t)=>_`
137
+ ${this.form.headerRows.map((e,t)=>g`
127
138
  <div class="quickforge-settings-subrow">
128
139
  <input
129
140
  class="quickforge-settings-input"
130
141
  .value=${e.key}
131
142
  @input=${e=>this.updateHeaderRow(t,`key`,e.target.value)}
132
- placeholder=${k(`headerName`)}
143
+ placeholder=${O(`headerName`)}
133
144
  />
134
145
  <input
135
146
  class="quickforge-settings-input"
136
147
  .value=${e.value}
137
148
  @input=${e=>this.updateHeaderRow(t,`value`,e.target.value)}
138
- placeholder=${k(`headerValue`)}
149
+ placeholder=${O(`headerValue`)}
139
150
  />
140
151
  <button
141
152
  class="quickforge-settings-icon-action quickforge-settings-icon-action-danger"
142
153
  type="button"
143
- title=${k(`removeHeader`)}
154
+ title=${O(`removeHeader`)}
144
155
  @click=${()=>this.removeHeaderRow(t)}
145
156
  >
146
157
 
@@ -154,11 +165,11 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,Ft as n,It as r
154
165
  type="button"
155
166
  @click=${()=>this.addHeaderRow()}
156
167
  >
157
- + ${k(`addHeader`)}
168
+ + ${O(`addHeader`)}
158
169
  </button>
159
170
  </div>
160
- `}renderTestStatus(){return this.testResult===`idle`&&!this.testing?_``:this.testing?_`<span class="quickforge-settings-status">${k(`testingConnection`)}</span>`:this.testResult===`ok`?_`<span class="quickforge-settings-badge quickforge-settings-badge-success">✓ ${k(`connectionOk`)}</span>`:_`<span class="quickforge-settings-alert">✗ ${this.testError||k(`connectionFailed`)}</span>`}renderForm(){return _`
161
- <section class="quickforge-settings-section" aria-label=${this.editingProviderId?k(`editCustomModel`):k(`addCustomModel`)}>
171
+ `}renderTestStatus(){return this.testResult===`idle`&&!this.testing?g``:this.testing?g`<span class="quickforge-settings-status">${O(`testingConnection`)}</span>`:this.testResult===`ok`?g`<span class="quickforge-settings-badge quickforge-settings-badge-success">✓ ${O(`connectionOk`)}</span>`:g`<span class="quickforge-settings-alert">✗ ${this.testError||O(`connectionFailed`)}</span>`}renderForm(){return g`
172
+ <section class="quickforge-settings-section" aria-label=${this.editingProviderId?O(`editCustomModel`):O(`addCustomModel`)}>
162
173
  <div class="quickforge-settings-toolbar">
163
174
  <button
164
175
  class="quickforge-settings-button quickforge-settings-button-secondary"
@@ -166,11 +177,11 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,Ft as n,It as r
166
177
  @click=${()=>this.closeForm()}
167
178
  >
168
179
  <svg class="size-4" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m12 19-7-7 7-7"/><path d="M19 12H5"/></svg>
169
- ${k(`back`)}
180
+ ${O(`back`)}
170
181
  </button>
171
182
  <div class="quickforge-settings-row-main">
172
- <div class="quickforge-settings-row-title">${this.editingProviderId?k(`editCustomModel`):k(`addCustomModel`)}</div>
173
- <div class="quickforge-settings-row-description">${k(`customModelsDescription`)}</div>
183
+ <div class="quickforge-settings-row-title">${this.editingProviderId?O(`editCustomModel`):O(`addCustomModel`)}</div>
184
+ <div class="quickforge-settings-row-description">${O(`customModelsDescription`)}</div>
174
185
  </div>
175
186
  </div>
176
187
 
@@ -178,12 +189,12 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,Ft as n,It as r
178
189
  ${this.renderPresetChips()}
179
190
 
180
191
  <label class="quickforge-settings-form-row">
181
- <span class="quickforge-settings-form-label">${k(`providerName`)}</span>
192
+ <span class="quickforge-settings-form-label">${O(`providerName`)}</span>
182
193
  <input
183
194
  class="quickforge-settings-input"
184
195
  .value=${this.form.name}
185
196
  @input=${e=>this.updateForm(`name`,e.target.value)}
186
- placeholder=${k(`providerNamePlaceholder`)}
197
+ placeholder=${O(`providerNamePlaceholder`)}
187
198
  />
188
199
  </label>
189
200
 
@@ -198,37 +209,37 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,Ft as n,It as r
198
209
  </label>
199
210
 
200
211
  <label class="quickforge-settings-form-row">
201
- <span class="quickforge-settings-form-label">${k(`apiKey`)}</span>
212
+ <span class="quickforge-settings-form-label">${O(`apiKey`)}</span>
202
213
  <div class="quickforge-settings-inline-field">
203
214
  <input
204
215
  class="quickforge-settings-input pr-10"
205
216
  .value=${this.form.apiKey}
206
217
  type=${this.apiKeyVisible?`text`:`password`}
207
218
  @input=${e=>this.updateForm(`apiKey`,e.target.value)}
208
- placeholder=${k(`apiKeyPlaceholder`)}
219
+ placeholder=${O(`apiKeyPlaceholder`)}
209
220
  />
210
221
  <button
211
222
  class="quickforge-settings-inline-field-button"
212
223
  type="button"
213
- title=${this.apiKeyVisible?k(`hideApiKey`):k(`showApiKey`)}
214
- aria-label=${this.apiKeyVisible?k(`hideApiKey`):k(`showApiKey`)}
224
+ title=${this.apiKeyVisible?O(`hideApiKey`):O(`showApiKey`)}
225
+ aria-label=${this.apiKeyVisible?O(`hideApiKey`):O(`showApiKey`)}
215
226
  aria-pressed=${this.apiKeyVisible?`true`:`false`}
216
227
  @click=${()=>this.toggleApiKeyVisibility()}
217
228
  >
218
- ${this.apiKeyVisible?_`<svg class="size-4" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10.73 5.08A10.43 10.43 0 0 1 12 5c7 0 10 7 10 7a13.16 13.16 0 0 1-1.67 2.68"/><path d="M6.61 6.61A13.53 13.53 0 0 0 2 12s3 7 10 7a9.74 9.74 0 0 0 5.39-1.61"/><line x1="2" y1="2" x2="22" y2="22"/><path d="M8.53 8.53A5 5 0 0 0 12 17a5 5 0 0 0 3.47-8.53"/></svg>`:_`<svg class="size-4" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M2 12s3-7 10-7 10 7 10 7-3 7-10 7-10-7-10-7Z"/><circle cx="12" cy="12" r="3"/></svg>`}
229
+ ${this.apiKeyVisible?g`<svg class="size-4" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10.73 5.08A10.43 10.43 0 0 1 12 5c7 0 10 7 10 7a13.16 13.16 0 0 1-1.67 2.68"/><path d="M6.61 6.61A13.53 13.53 0 0 0 2 12s3 7 10 7a9.74 9.74 0 0 0 5.39-1.61"/><line x1="2" y1="2" x2="22" y2="22"/><path d="M8.53 8.53A5 5 0 0 0 12 17a5 5 0 0 0 3.47-8.53"/></svg>`:g`<svg class="size-4" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M2 12s3-7 10-7 10 7 10 7-3 7-10 7-10-7-10-7Z"/><circle cx="12" cy="12" r="3"/></svg>`}
219
230
  </button>
220
231
  </div>
221
232
  </label>
222
233
 
223
234
  <div class="quickforge-settings-form-row">
224
235
  <div class="flex items-center justify-between gap-3">
225
- <span class="quickforge-settings-form-label">${k(`modelsList`)}</span>
236
+ <span class="quickforge-settings-form-label">${O(`modelsList`)}</span>
226
237
  <button
227
238
  class="quickforge-settings-button quickforge-settings-button-secondary quickforge-settings-button-compact"
228
239
  type="button"
229
240
  @click=${()=>this.addModelRow()}
230
241
  >
231
- + ${k(`addModel`)}
242
+ + ${O(`addModel`)}
232
243
  </button>
233
244
  </div>
234
245
  <div class="quickforge-settings-nested-list">
@@ -243,15 +254,15 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,Ft as n,It as r
243
254
  @click=${()=>{this.advancedOpen=!this.advancedOpen,this.requestUpdate()}}
244
255
  >
245
256
  <span>${this.advancedOpen?`▾`:`▸`}</span>
246
- ${k(`providerAdvanced`)}
257
+ ${O(`providerAdvanced`)}
247
258
  </button>
248
259
 
249
- ${this.advancedOpen?_`
260
+ ${this.advancedOpen?g`
250
261
  <div class="quickforge-settings-form-grid rounded-lg border border-border p-3">
251
262
  <label class="quickforge-settings-form-row">
252
263
  <span class="quickforge-settings-form-label">
253
- ${k(`protocolType`)}
254
- <quickforge-info-tip .label=${k(`protocolHelp`)}></quickforge-info-tip>
264
+ ${O(`protocolType`)}
265
+ <quickforge-info-tip .label=${O(`protocolHelp`)}></quickforge-info-tip>
255
266
  </span>
256
267
  <select
257
268
  class="quickforge-settings-select"
@@ -277,7 +288,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,Ft as n,It as r
277
288
  type="button"
278
289
  @click=${()=>this.closeForm()}
279
290
  >
280
- ${k(`cancel`)}
291
+ ${O(`cancel`)}
281
292
  </button>
282
293
  <button
283
294
  class="quickforge-settings-button quickforge-settings-button-secondary"
@@ -285,49 +296,49 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,Ft as n,It as r
285
296
  ?disabled=${this.testing}
286
297
  @click=${()=>this.testConnection()}
287
298
  >
288
- ${this.testing?k(`testingConnection`):k(`testConnection`)}
299
+ ${this.testing?O(`testingConnection`):O(`testConnection`)}
289
300
  </button>
290
301
  <button
291
302
  class="quickforge-settings-button quickforge-settings-button-primary"
292
303
  type="button"
293
304
  @click=${()=>this.saveModel()}
294
305
  >
295
- ${k(`save`)}
306
+ ${O(`save`)}
296
307
  </button>
297
308
  </div>
298
309
  </div>
299
310
  </section>
300
- `}render(){return this.formOpen?_`
311
+ `}render(){return this.formOpen?g`
301
312
  <div class="quickforge-settings-stack">
302
313
  <div class="quickforge-settings-heading">
303
314
  <h3 class="quickforge-settings-title">
304
- ${this.editingProviderId?k(`editCustomModel`):k(`addCustomModel`)}
305
- <quickforge-info-tip .label=${k(`customModelsDescription`)}></quickforge-info-tip>
315
+ ${this.editingProviderId?O(`editCustomModel`):O(`addCustomModel`)}
316
+ <quickforge-info-tip .label=${O(`customModelsDescription`)}></quickforge-info-tip>
306
317
  </h3>
307
318
  </div>
308
319
  ${this.renderForm()}
309
320
  </div>
310
- `:_`
321
+ `:g`
311
322
  <div class="quickforge-settings-stack">
312
- <section class="quickforge-settings-section" aria-label=${k(`customModelsTitle`)}>
323
+ <section class="quickforge-settings-section" aria-label=${O(`customModelsTitle`)}>
313
324
  <div class="quickforge-settings-toolbar">
314
325
  <div>
315
- <div class="quickforge-settings-row-title">${k(`customModelsTitle`)}</div>
316
- <div class="quickforge-settings-row-description">${k(`customModelsDescription`)}</div>
326
+ <div class="quickforge-settings-row-title">${O(`customModelsTitle`)}</div>
327
+ <div class="quickforge-settings-row-description">${O(`customModelsDescription`)}</div>
317
328
  </div>
318
329
  <button
319
330
  class="quickforge-settings-button quickforge-settings-button-primary"
320
331
  type="button"
321
332
  @click=${()=>this.openAddForm()}
322
333
  >
323
- ${k(`addModel`)}
334
+ ${O(`addModel`)}
324
335
  </button>
325
336
  </div>
326
337
 
327
- ${this.loading?_`<div class="quickforge-settings-empty-row">${k(`loading`)}</div>`:this.providers.length===0?_`<div class="quickforge-settings-empty-row">${k(`noCustomModels`)}</div>`:this.providers.map(e=>this.renderProvider(e))}
338
+ ${this.loading?g`<div class="quickforge-settings-empty-row">${O(`loading`)}</div>`:this.providers.length===0?g`<div class="quickforge-settings-empty-row">${O(`noCustomModels`)}</div>`:this.providers.map(e=>this.renderProvider(e))}
328
339
  </section>
329
340
  </div>
330
- `}},N=`quickforge-custom-providers-only-tab`;customElements.get(N)||customElements.define(N,Oe);function ke(e){let t=document.createElement(N);return e&&(t.autoEditProviderName=e),t}var Ae=[{value:`light`,label:()=>k(`lightTheme`)},{value:`dark`,label:()=>k(`darkTheme`)}],je=class extends v{theme=Te();interfaceFontSizePx=E.interfaceFontSizePx;messageFontSizePx=E.messageFontSizePx;loading=!0;error=``;getTabName(){return k(`appearance`)}async connectedCallback(){super.connectedCallback(),await this.loadSettings()}async loadSettings(){this.loading=!0,this.error=``,this.requestUpdate();try{let e=y(),[t,n]=await Promise.all([ge(e),ue(e)]);this.theme=t.theme,this.interfaceFontSizePx=n.interfaceFontSizePx,this.messageFontSizePx=n.messageFontSizePx}catch(e){this.error=e instanceof Error?e.message:k(`requestFailed`)}finally{this.loading=!1,this.requestUpdate()}}async selectTheme(e){if(this.theme!==e){this.theme=e,this.requestUpdate();try{await we(y(),{theme:e}),this.error=``,this.requestUpdate()}catch(e){this.error=e instanceof Error?e.message:k(`requestFailed`),this.requestUpdate()}}}currentFontSizeSettings(){return ye({interfaceFontSizePx:this.interfaceFontSizePx,messageFontSizePx:this.messageFontSizePx})}previewFontSize(e){let t=ye(e);this.interfaceFontSizePx=t.interfaceFontSizePx,this.messageFontSizePx=t.messageFontSizePx,de(t),this.requestUpdate()}updateInterfaceFontSize(e){this.previewFontSize({...this.currentFontSizeSettings(),interfaceFontSizePx:Number(e)||E.interfaceFontSizePx})}updateMessageFontSize(e){this.previewFontSize({...this.currentFontSizeSettings(),messageFontSizePx:Number(e)||E.messageFontSizePx})}async saveFontSize(){try{await ie(y(),this.currentFontSizeSettings()),this.error=``,this.requestUpdate()}catch(e){this.error=e instanceof Error?e.message:k(`requestFailed`),this.requestUpdate()}}renderThemeOption(e){let t=this.theme===e.value;return _`
341
+ `}},M=`quickforge-custom-providers-only-tab`;customElements.get(M)||customElements.define(M,ke);function Ae(e){let t=document.createElement(M);return e&&(t.autoEditProviderName=e),t}var je=[{value:`light`,label:()=>O(`lightTheme`)},{value:`dark`,label:()=>O(`darkTheme`)}],Me=class extends _{theme=pe();interfaceFontSizePx=S.interfaceFontSizePx;messageFontSizePx=S.messageFontSizePx;loading=!0;error=``;getTabName(){return O(`appearance`)}async connectedCallback(){super.connectedCallback(),await this.loadSettings()}async loadSettings(){this.loading=!0,this.error=``,this.requestUpdate();try{let e=v(),[t,n]=await Promise.all([oe(e),le(e)]);this.theme=t.theme,this.interfaceFontSizePx=n.interfaceFontSizePx,this.messageFontSizePx=n.messageFontSizePx}catch(e){this.error=e instanceof Error?e.message:O(`requestFailed`)}finally{this.loading=!1,this.requestUpdate()}}async selectTheme(e){if(this.theme!==e){this.theme=e,this.requestUpdate();try{await ae(v(),{theme:e}),this.error=``,this.requestUpdate()}catch(e){this.error=e instanceof Error?e.message:O(`requestFailed`),this.requestUpdate()}}}currentFontSizeSettings(){return se({interfaceFontSizePx:this.interfaceFontSizePx,messageFontSizePx:this.messageFontSizePx})}previewFontSize(e){let t=se(e);this.interfaceFontSizePx=t.interfaceFontSizePx,this.messageFontSizePx=t.messageFontSizePx,be(t),this.requestUpdate()}updateInterfaceFontSize(e){this.previewFontSize({...this.currentFontSizeSettings(),interfaceFontSizePx:Number(e)||S.interfaceFontSizePx})}updateMessageFontSize(e){this.previewFontSize({...this.currentFontSizeSettings(),messageFontSizePx:Number(e)||S.messageFontSizePx})}async saveFontSize(){try{await ce(v(),this.currentFontSizeSettings()),this.error=``,this.requestUpdate()}catch(e){this.error=e instanceof Error?e.message:O(`requestFailed`),this.requestUpdate()}}renderThemeOption(e){let t=this.theme===e.value;return g`
331
342
  <button
332
343
  type="button"
333
344
  class="quickforge-settings-segmented-option ${t?`quickforge-settings-segmented-option-active`:``}"
@@ -336,14 +347,14 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,Ft as n,It as r
336
347
  >
337
348
  ${e.label()}
338
349
  </button>
339
- `}getFontSizeRangeProgress(e){return(e-S.min)/(S.max-S.min)*100}renderFontSizeSlider(e,t,n,r){return _`
350
+ `}getFontSizeRangeProgress(e){return(e-E.min)/(E.max-E.min)*100}renderFontSizeSlider(e,t,n,r){return g`
340
351
  <div class="quickforge-settings-row">
341
352
  <div class="quickforge-settings-row-main">
342
353
  <div class="quickforge-settings-row-title">
343
354
  ${e}
344
- ${t?_`<quickforge-info-tip .label=${t}></quickforge-info-tip>`:null}
355
+ ${t?g`<quickforge-info-tip .label=${t}></quickforge-info-tip>`:null}
345
356
  </div>
346
- <div class="quickforge-settings-row-description">${k(`fontSizeRangeDescription`)}</div>
357
+ <div class="quickforge-settings-row-description">${O(`fontSizeRangeDescription`)}</div>
347
358
  </div>
348
359
  <div class="quickforge-settings-row-control quickforge-settings-slider-control">
349
360
  <span class="quickforge-settings-value-badge">${n}px</span>
@@ -351,8 +362,8 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,Ft as n,It as r
351
362
  class="quickforge-font-size-slider"
352
363
  style=${`--quickforge-font-size-slider-progress: ${this.getFontSizeRangeProgress(n)}%`}
353
364
  type="range"
354
- min=${String(S.min)}
355
- max=${String(S.max)}
365
+ min=${String(E.min)}
366
+ max=${String(E.max)}
356
367
  step="1"
357
368
  .value=${String(n)}
358
369
  @input=${e=>r(e.target.value)}
@@ -360,120 +371,120 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,Ft as n,It as r
360
371
  />
361
372
  </div>
362
373
  </div>
363
- `}render(){return this.loading?_`<div class="text-sm text-muted-foreground">${k(`loading`)}</div>`:_`
374
+ `}render(){return this.loading?g`<div class="text-sm text-muted-foreground">${O(`loading`)}</div>`:g`
364
375
  <div class="quickforge-settings-stack">
365
- <section class="quickforge-settings-section" aria-label=${k(`appearance`)}>
376
+ <section class="quickforge-settings-section" aria-label=${O(`appearance`)}>
366
377
  <div class="quickforge-settings-row">
367
378
  <div class="quickforge-settings-row-main">
368
379
  <div class="quickforge-settings-row-title">
369
- ${k(`theme`)}
370
- <quickforge-info-tip .label=${k(`themeDescription`)}></quickforge-info-tip>
380
+ ${O(`theme`)}
381
+ <quickforge-info-tip .label=${O(`themeDescription`)}></quickforge-info-tip>
371
382
  </div>
372
- <div class="quickforge-settings-row-description">${k(`themeDescription`)}</div>
383
+ <div class="quickforge-settings-row-description">${O(`themeDescription`)}</div>
373
384
  </div>
374
385
  <div class="quickforge-settings-row-control">
375
- <div class="quickforge-settings-segmented" role="group" aria-label=${k(`theme`)}>
376
- ${Ae.map(e=>this.renderThemeOption(e))}
386
+ <div class="quickforge-settings-segmented" role="group" aria-label=${O(`theme`)}>
387
+ ${je.map(e=>this.renderThemeOption(e))}
377
388
  </div>
378
389
  </div>
379
390
  </div>
380
391
 
381
- ${this.renderFontSizeSlider(k(`interfaceFontSize`),null,this.interfaceFontSizePx,e=>this.updateInterfaceFontSize(e))}
392
+ ${this.renderFontSizeSlider(O(`interfaceFontSize`),null,this.interfaceFontSizePx,e=>this.updateInterfaceFontSize(e))}
382
393
 
383
- ${this.renderFontSizeSlider(k(`messageFontSize`),k(`messageFontSizeNote`),this.messageFontSizePx,e=>this.updateMessageFontSize(e))}
394
+ ${this.renderFontSizeSlider(O(`messageFontSize`),O(`messageFontSizeNote`),this.messageFontSizePx,e=>this.updateMessageFontSize(e))}
384
395
  </section>
385
396
 
386
- ${this.error?_`<span class="quickforge-settings-error">${this.error}</span>`:null}
397
+ ${this.error?g`<span class="quickforge-settings-error">${this.error}</span>`:null}
387
398
  </div>
388
- `}},P=`quickforge-appearance-settings-tab`;customElements.get(P)||customElements.define(P,je);function Me(){return document.createElement(P)}var Ne=`auto-compact-settings`,F={enabled:!1,thresholdPercent:80,keepRecentTurns:3,minSourceChars:1600,requireConfirmation:!0};function I(e,t,n,r){let i=Number(e);return Number.isFinite(i)?Math.min(r,Math.max(n,Math.round(i))):t}function Pe(e){if(!e||typeof e!=`object`)return{...F};let t=e;return{enabled:t.enabled===!0,thresholdPercent:I(t.thresholdPercent,F.thresholdPercent,50,95),keepRecentTurns:I(t.keepRecentTurns,F.keepRecentTurns,1,20),minSourceChars:I(t.minSourceChars,F.minSourceChars,0,2e5),requireConfirmation:t.requireConfirmation!==!1}}async function Fe(e){return Pe(await e.settings.get(Ne))}async function Ie(e,t){await e.settings.set(Ne,Pe(t))}var Le=[{value:`off`,label:()=>k(`thinkingOff`)},{value:`low`,label:()=>k(`thinkingLow`)},{value:`medium`,label:()=>k(`thinkingMedium`)},{value:`high`,label:()=>k(`thinkingHigh`)},{value:`xhigh`,label:()=>k(`thinkingXHigh`)}];function Re(e){return(e??``).trim().replace(/\/$/,``)}function L(e){return JSON.stringify([e.provider,e.id,e.api,Re(e.baseUrl)])}function ze(e){return`${e.provider} / ${e.id}`}function Be(){return`custom_${globalThis.crypto?.randomUUID?.().slice(0,8)||Date.now().toString(36)}`}function Ve(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 He=_`
399
+ `}},N=`quickforge-appearance-settings-tab`;customElements.get(N)||customElements.define(N,Me);function Ne(){return document.createElement(N)}var Pe=`auto-compact-settings`,P={enabled:!0,thresholdPercent:80,keepRecentTurns:3,minSourceChars:1600,requireConfirmation:!0};function F(e,t,n,r){let i=Number(e);return Number.isFinite(i)?Math.min(r,Math.max(n,Math.round(i))):t}function Fe(e){if(!e||typeof e!=`object`)return{...P};let t=e;return{enabled:t.enabled!==!1,thresholdPercent:F(t.thresholdPercent,P.thresholdPercent,50,95),keepRecentTurns:F(t.keepRecentTurns,P.keepRecentTurns,1,20),minSourceChars:F(t.minSourceChars,P.minSourceChars,0,2e5),requireConfirmation:t.requireConfirmation!==!1}}async function Ie(e){return Fe(await e.settings.get(Pe))}async function Le(e,t){await e.settings.set(Pe,Fe(t))}var Re=[{value:`off`,label:()=>O(`thinkingOff`)},{value:`low`,label:()=>O(`thinkingLow`)},{value:`medium`,label:()=>O(`thinkingMedium`)},{value:`high`,label:()=>O(`thinkingHigh`)},{value:`xhigh`,label:()=>O(`thinkingXHigh`)}];function ze(e){return(e??``).trim().replace(/\/$/,``)}function I(e){return JSON.stringify([e.provider,e.id,e.api,ze(e.baseUrl)])}function Be(e){return`${e.provider} / ${e.id}`}function Ve(){return`custom_${globalThis.crypto?.randomUUID?.().slice(0,8)||Date.now().toString(36)}`}function He(e){let t=e.trim(),n=t.split(/[\\/]/).pop()?.replace(/^"|"$/g,``)||t;return/^bash(\.exe)?$/i.test(n)?`Bash`:/^zsh$/i.test(n)?`Zsh`:/^fish$/i.test(n)?`Fish`:/^cmd(\.exe)?$/i.test(n)?`Command Prompt`:/^powershell(\.exe)?$/i.test(n)?`Windows PowerShell`:/^pwsh(\.exe)?$/i.test(n)?`PowerShell 7+`:n||`Custom Shell`}var Ue=g`
389
400
  <svg class="size-3.5" viewBox="0 0 16 16" fill="none" aria-hidden="true">
390
401
  <path d="M3.5 8.2 6.6 11.3 12.7 4.7" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" />
391
402
  </svg>
392
- `,Ue=_`
403
+ `,We=g`
393
404
  <svg class="size-3.5" viewBox="0 0 16 16" fill="none" aria-hidden="true">
394
405
  <circle cx="8" cy="8" r="4.8" stroke="currentColor" stroke-width="1.5" />
395
406
  </svg>
396
- `,We=_`
407
+ `,Ge=g`
397
408
  <svg class="size-3.5" viewBox="0 0 16 16" fill="none" aria-hidden="true">
398
409
  <path d="M4.5 4.5 11.5 11.5M11.5 4.5 4.5 11.5" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" />
399
410
  </svg>
400
- `,Ge=class extends v{models=[];selectedModel;thinkingLevel=`off`;showToolDetails=!1;expandToolsByDefault=!1;autoCompactEnabled=!1;autoCompactRequireConfirmation=!0;autoCompactThresholdPercent=80;autoCompactThresholdPercentInput=`80`;autoCompactKeepRecentTurns=3;selectedLanguage=he();loading=!0;saved=!1;savedMessage=``;error=``;terminalShellConfig={terminalShell:`auto`,defaultProfileId:`auto`,profiles:[]};customShellCommand=``;getTabName(){return k(`defaultOptions`)}async connectedCallback(){super.connectedCallback(),await this.loadSettings()}updated(){this.syncSelectValues()}syncSelectValues(){let e=this.querySelector(`[data-default-model-select]`);e&&this.selectedModel&&(e.value=L(this.selectedModel));let t=this.querySelector(`[data-default-thinking-select]`);t&&(t.value=this.thinkingLevel);let n=this.querySelector(`[data-language-select]`);n&&(n.value=this.selectedLanguage)}async loadSettings(){this.loading=!0,this.error=``,this.requestUpdate();try{let e=y(),[t,n,r,i]=await Promise.all([se(e),oe(e),ce(e),Fe(e)]);this.models=t,this.selectedModel=n.model?t.find(e=>L(e)===L(n.model))??n.model:t[0],this.thinkingLevel=n.thinkingLevel??ae(this.selectedModel),this.showToolDetails=r.showToolDetails,this.expandToolsByDefault=r.expandToolsByDefault,this.autoCompactEnabled=i.enabled,this.autoCompactRequireConfirmation=i.requireConfirmation,this.autoCompactThresholdPercent=i.thresholdPercent,this.autoCompactThresholdPercentInput=String(i.thresholdPercent),this.autoCompactKeepRecentTurns=i.keepRecentTurns,await this.loadTerminalShell()}catch(e){this.error=e instanceof Error?e.message:k(`requestFailed`)}finally{this.loading=!1,this.requestUpdate()}}updateModel(e){let t=this.models.find(t=>L(t)===e);this.selectedModel=t,this.thinkingLevel=ae(t),this.saved=!1,this.requestUpdate(),this.saveDefaultModelOptions()}updateThinkingLevel(e){this.thinkingLevel=Le.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(y(),this.selectedLanguage)}updateShowToolDetails(e){this.showToolDetails=e,this.saved=!1,this.requestUpdate(),this.saveToolDisplayOptions()}updateExpandToolsByDefault(e){this.expandToolsByDefault=e,this.saved=!1,this.requestUpdate(),this.saveToolDisplayOptions()}updateAutoCompactEnabled(e){this.autoCompactEnabled=e,this.saved=!1,this.requestUpdate(),this.saveAutoCompactOptions()}updateAutoCompactRequireConfirmation(e){this.autoCompactRequireConfirmation=e,this.saved=!1,this.requestUpdate(),this.saveAutoCompactOptions()}updateAutoCompactThresholdPercent(e){this.autoCompactThresholdPercentInput=e;let t=Number(e);e!==``&&Number.isFinite(t)&&(this.autoCompactThresholdPercent=t),this.saved=!1,this.requestUpdate()}updateAutoCompactKeepRecentTurns(e){this.autoCompactKeepRecentTurns=Number(e)||3,this.saved=!1,this.requestUpdate()}commitAutoCompactThresholdPercent(){let e=Number(this.autoCompactThresholdPercentInput);if(!Number.isFinite(e)){this.autoCompactThresholdPercentInput=String(this.autoCompactThresholdPercent),this.requestUpdate();return}let t=Math.max(50,Math.min(95,Math.round(e)));this.autoCompactThresholdPercent=t,this.autoCompactThresholdPercentInput=String(t),this.requestUpdate(),this.saveAutoCompactOptions()}commitAutoCompactKeepRecentTurns(){let e=Math.max(1,Math.min(20,Math.round(this.autoCompactKeepRecentTurns||3)));this.autoCompactKeepRecentTurns=e,this.requestUpdate(),this.saveAutoCompactOptions()}markSaved(e=k(`defaultOptionsSaved`)){this.saved=!0,this.savedMessage=e,this.error=``,this.requestUpdate()}customShellProfiles(){return this.terminalShellConfig.profiles.filter(e=>!e.builtin)}async loadTerminalShell(){try{let e=await fetch(`/api/system/terminal-shell`,{cache:`no-store`}),t=await e.json().catch(()=>null);if(!e.ok)throw Error(t?.error||k(`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:k(`requestFailed`)}}async saveTerminalShellConfig(e,t=this.customShellProfiles(),n=k(`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||k(`requestFailed`));this.terminalShellConfig=i,this.markSaved(n)}catch(e){this.error=e instanceof Error?e.message:k(`requestFailed`),this.requestUpdate()}}async addCustomTerminalShell(){let e=this.customShellCommand.trim();if(!e){this.error=k(`terminalShellProfileRequired`),this.requestUpdate();return}let t=[...this.customShellProfiles(),{id:Be(),name:Ve(e),command:e,builtin:!1}];this.customShellCommand=``,await this.saveTerminalShellConfig(this.terminalShellConfig.defaultProfileId,t,k(`terminalShellProfilesSaved`))}async deleteCustomTerminalShell(e){let t=this.terminalShellConfig.profiles.find(t=>t.id===e);if(!t||t.builtin||!await C({description:k(`terminalShellDeleteConfirm`,{name:t.name}),confirmLabel:k(`confirmDelete`),cancelLabel:k(`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,k(`terminalShellProfilesSaved`))}async saveDefaultModelOptions(){try{let e=this.selectedModel?.reasoning?this.thinkingLevel:`off`;await pe(y(),{model:this.selectedModel,thinkingLevel:e}),this.markSaved()}catch(e){this.error=e instanceof Error?e.message:k(`requestFailed`),this.requestUpdate()}}async saveToolDisplayOptions(){try{await le(y(),{showToolDetails:this.showToolDetails,expandToolsByDefault:this.expandToolsByDefault}),this.markSaved()}catch(e){this.error=e instanceof Error?e.message:k(`requestFailed`),this.requestUpdate()}}async saveAutoCompactOptions(){try{await Ie(y(),{enabled:this.autoCompactEnabled,thresholdPercent:this.autoCompactThresholdPercent,keepRecentTurns:this.autoCompactKeepRecentTurns,minSourceChars:1600,requireConfirmation:this.autoCompactRequireConfirmation}),this.markSaved()}catch(e){this.error=e instanceof Error?e.message:k(`requestFailed`),this.requestUpdate()}}modelOptions(){if(!this.selectedModel)return this.models;let e=L(this.selectedModel);return this.models.some(t=>L(t)===e)?this.models:[this.selectedModel,...this.models]}shellProfileRow(e,t=!1){let n=e.id===this.terminalShellConfig.defaultProfileId||this.terminalShellConfig.defaultProfileId===`auto`&&t;return _`
411
+ `,Ke=class extends _{models=[];selectedModel;thinkingLevel=`off`;showToolDetails=!1;expandToolsByDefault=!1;autoCompactEnabled=!0;autoCompactRequireConfirmation=!0;autoCompactThresholdPercent=80;autoCompactThresholdPercentInput=`80`;autoCompactKeepRecentTurns=3;selectedLanguage=_e();loading=!0;saved=!1;savedMessage=``;error=``;terminalShellConfig={terminalShell:`auto`,defaultProfileId:`auto`,profiles:[]};customShellCommand=``;getTabName(){return O(`defaultOptions`)}async connectedCallback(){super.connectedCallback(),await this.loadSettings()}updated(){this.syncSelectValues()}syncSelectValues(){let e=this.querySelector(`[data-default-model-select]`);e&&this.selectedModel&&(e.value=I(this.selectedModel));let t=this.querySelector(`[data-default-thinking-select]`);t&&(t.value=this.thinkingLevel);let n=this.querySelector(`[data-language-select]`);n&&(n.value=this.selectedLanguage)}async loadSettings(){this.loading=!0,this.error=``,this.requestUpdate();try{let e=v(),[t,n,r,i]=await Promise.all([ue(e),ve(e),de(e),Ie(e)]);this.models=t,this.selectedModel=n.model?t.find(e=>I(e)===I(n.model))??n.model:t[0],this.thinkingLevel=n.thinkingLevel??me(this.selectedModel),this.showToolDetails=r.showToolDetails,this.expandToolsByDefault=r.expandToolsByDefault,this.autoCompactEnabled=i.enabled,this.autoCompactRequireConfirmation=i.requireConfirmation,this.autoCompactThresholdPercent=i.thresholdPercent,this.autoCompactThresholdPercentInput=String(i.thresholdPercent),this.autoCompactKeepRecentTurns=i.keepRecentTurns,await this.loadTerminalShell()}catch(e){this.error=e instanceof Error?e.message:O(`requestFailed`)}finally{this.loading=!1,this.requestUpdate()}}updateModel(e){let t=this.models.find(t=>I(t)===e);this.selectedModel=t,this.thinkingLevel=me(t),this.saved=!1,this.requestUpdate(),this.saveDefaultModelOptions()}updateThinkingLevel(e){this.thinkingLevel=Re.some(t=>t.value===e)?e:`off`,this.saved=!1,this.requestUpdate(),this.saveDefaultModelOptions()}updateLanguage(e){this.selectedLanguage=e===`zh`?`zh`:`en`,this.requestUpdate(),this.applyLanguage()}async applyLanguage(){await we(v(),this.selectedLanguage)}updateShowToolDetails(e){this.showToolDetails=e,this.saved=!1,this.requestUpdate(),this.saveToolDisplayOptions()}updateExpandToolsByDefault(e){this.expandToolsByDefault=e,this.saved=!1,this.requestUpdate(),this.saveToolDisplayOptions()}updateAutoCompactEnabled(e){this.autoCompactEnabled=e,this.saved=!1,this.requestUpdate(),this.saveAutoCompactOptions()}updateAutoCompactRequireConfirmation(e){this.autoCompactRequireConfirmation=e,this.saved=!1,this.requestUpdate(),this.saveAutoCompactOptions()}updateAutoCompactThresholdPercent(e){this.autoCompactThresholdPercentInput=e;let t=Number(e);e!==``&&Number.isFinite(t)&&(this.autoCompactThresholdPercent=t),this.saved=!1,this.requestUpdate()}updateAutoCompactKeepRecentTurns(e){this.autoCompactKeepRecentTurns=Number(e)||3,this.saved=!1,this.requestUpdate()}commitAutoCompactThresholdPercent(){let e=Number(this.autoCompactThresholdPercentInput);if(!Number.isFinite(e)){this.autoCompactThresholdPercentInput=String(this.autoCompactThresholdPercent),this.requestUpdate();return}let t=Math.max(50,Math.min(95,Math.round(e)));this.autoCompactThresholdPercent=t,this.autoCompactThresholdPercentInput=String(t),this.requestUpdate(),this.saveAutoCompactOptions()}commitAutoCompactKeepRecentTurns(){let e=Math.max(1,Math.min(20,Math.round(this.autoCompactKeepRecentTurns||3)));this.autoCompactKeepRecentTurns=e,this.requestUpdate(),this.saveAutoCompactOptions()}markSaved(e=O(`defaultOptionsSaved`)){this.saved=!0,this.savedMessage=e,this.error=``,this.requestUpdate()}customShellProfiles(){return this.terminalShellConfig.profiles.filter(e=>!e.builtin)}async loadTerminalShell(){try{let e=await fetch(`/api/system/terminal-shell`,{cache:`no-store`}),t=await e.json().catch(()=>null);if(!e.ok)throw Error(t?.error||O(`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:O(`requestFailed`)}}async saveTerminalShellConfig(e,t=this.customShellProfiles(),n=O(`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||O(`requestFailed`));this.terminalShellConfig=i,this.markSaved(n)}catch(e){this.error=e instanceof Error?e.message:O(`requestFailed`),this.requestUpdate()}}async addCustomTerminalShell(){let e=this.customShellCommand.trim();if(!e){this.error=O(`terminalShellProfileRequired`),this.requestUpdate();return}let t=[...this.customShellProfiles(),{id:Ve(),name:He(e),command:e,builtin:!1}];this.customShellCommand=``,await this.saveTerminalShellConfig(this.terminalShellConfig.defaultProfileId,t,O(`terminalShellProfilesSaved`))}async deleteCustomTerminalShell(e){let t=this.terminalShellConfig.profiles.find(t=>t.id===e);if(!t||t.builtin||!await C({description:O(`terminalShellDeleteConfirm`,{name:t.name}),confirmLabel:O(`confirmDelete`),cancelLabel:O(`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,O(`terminalShellProfilesSaved`))}async saveDefaultModelOptions(){try{let e=this.selectedModel?.reasoning?this.thinkingLevel:`off`;await Se(v(),{model:this.selectedModel,thinkingLevel:e}),this.markSaved()}catch(e){this.error=e instanceof Error?e.message:O(`requestFailed`),this.requestUpdate()}}async saveToolDisplayOptions(){try{await Ee(v(),{showToolDetails:this.showToolDetails,expandToolsByDefault:this.expandToolsByDefault}),this.markSaved()}catch(e){this.error=e instanceof Error?e.message:O(`requestFailed`),this.requestUpdate()}}async saveAutoCompactOptions(){try{await Le(v(),{enabled:this.autoCompactEnabled,thresholdPercent:this.autoCompactThresholdPercent,keepRecentTurns:this.autoCompactKeepRecentTurns,minSourceChars:1600,requireConfirmation:this.autoCompactRequireConfirmation}),this.markSaved()}catch(e){this.error=e instanceof Error?e.message:O(`requestFailed`),this.requestUpdate()}}modelOptions(){if(!this.selectedModel)return this.models;let e=I(this.selectedModel);return this.models.some(t=>I(t)===e)?this.models:[this.selectedModel,...this.models]}shellProfileRow(e,t=!1){let n=e.id===this.terminalShellConfig.defaultProfileId||this.terminalShellConfig.defaultProfileId===`auto`&&t;return g`
401
412
  <div class="quickforge-settings-subrow">
402
413
  <div class="quickforge-settings-row-main">
403
414
  <div class="quickforge-settings-row-title">${e.name}</div>
404
415
  <div class="quickforge-settings-row-description quickforge-settings-mono" title=${e.command}>${e.command}</div>
405
416
  </div>
406
417
  <div class="quickforge-settings-row-control quickforge-settings-icon-actions">
407
- ${n?_`
408
- <span class="quickforge-settings-icon-action quickforge-settings-icon-action-success" title=${k(`terminalShellDefaultBadge`)} aria-label=${k(`terminalShellDefaultBadge`)}>
409
- ${He}
418
+ ${n?g`
419
+ <span class="quickforge-settings-icon-action quickforge-settings-icon-action-success" title=${O(`terminalShellDefaultBadge`)} aria-label=${O(`terminalShellDefaultBadge`)}>
420
+ ${Ue}
410
421
  </span>
411
- `:_`
422
+ `:g`
412
423
  <button
413
424
  class="quickforge-settings-icon-action"
414
425
  type="button"
415
- title=${k(`terminalShellSetDefault`)}
416
- aria-label=${k(`terminalShellSetDefault`)}
426
+ title=${O(`terminalShellSetDefault`)}
427
+ aria-label=${O(`terminalShellSetDefault`)}
417
428
  @click=${()=>this.saveTerminalShellConfig(e.id)}
418
429
  >
419
- ${Ue}
430
+ ${We}
420
431
  </button>
421
432
  `}
422
- ${e.builtin?null:_`
433
+ ${e.builtin?null:g`
423
434
  <button
424
435
  class="quickforge-settings-icon-action quickforge-settings-icon-action-danger"
425
436
  type="button"
426
- title=${k(`delete`)}
427
- aria-label=${k(`delete`)}
437
+ title=${O(`delete`)}
438
+ aria-label=${O(`delete`)}
428
439
  @click=${()=>this.deleteCustomTerminalShell(e.id)}
429
440
  >
430
- ${We}
441
+ ${Ge}
431
442
  </button>
432
443
  `}
433
444
  </div>
434
445
  </div>
435
- `}terminalShellSettings(){let e=this.terminalShellConfig.profiles;return _`
436
- <section class="quickforge-settings-section" aria-label=${k(`terminalShell`)}>
446
+ `}terminalShellSettings(){let e=this.terminalShellConfig.profiles;return g`
447
+ <section class="quickforge-settings-section" aria-label=${O(`terminalShell`)}>
437
448
  <div class="quickforge-settings-row quickforge-settings-row-top">
438
449
  <div class="quickforge-settings-row-main">
439
450
  <div class="quickforge-settings-row-title">
440
- ${k(`terminalShell`)}
441
- <quickforge-info-tip .label=${k(`terminalShellDescription`)}></quickforge-info-tip>
451
+ ${O(`terminalShell`)}
452
+ <quickforge-info-tip .label=${O(`terminalShellDescription`)}></quickforge-info-tip>
442
453
  </div>
443
- <div class="quickforge-settings-row-description">${k(`terminalShellAutoDetectedHint`)}</div>
454
+ <div class="quickforge-settings-row-description">${O(`terminalShellAutoDetectedHint`)}</div>
444
455
  </div>
445
456
  </div>
446
457
 
447
458
  <div class="quickforge-settings-nested-list">
448
- ${e.length>0?e.map((e,t)=>this.shellProfileRow(e,t===0)):_`<div class="quickforge-settings-empty-row">${k(`terminalShellNoDetected`)}</div>`}
459
+ ${e.length>0?e.map((e,t)=>this.shellProfileRow(e,t===0)):g`<div class="quickforge-settings-empty-row">${O(`terminalShellNoDetected`)}</div>`}
449
460
  </div>
450
461
 
451
462
  <div class="quickforge-settings-row">
452
463
  <div class="quickforge-settings-row-main">
453
- <div class="quickforge-settings-row-title">${k(`terminalShellCommand`)}</div>
454
- <div class="quickforge-settings-row-description">${k(`terminalShellCustomDescription`)}</div>
464
+ <div class="quickforge-settings-row-title">${O(`terminalShellCommand`)}</div>
465
+ <div class="quickforge-settings-row-description">${O(`terminalShellCustomDescription`)}</div>
455
466
  </div>
456
467
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide quickforge-terminal-shell-command-control">
457
468
  <input
458
469
  class="quickforge-settings-input quickforge-settings-mono"
459
470
  type="text"
460
471
  .value=${this.customShellCommand}
461
- placeholder=${k(`terminalShellCommandPlaceholder`)}
472
+ placeholder=${O(`terminalShellCommandPlaceholder`)}
462
473
  @input=${e=>{this.customShellCommand=e.target.value}}
463
474
  />
464
475
  <button
465
476
  class="quickforge-settings-button quickforge-settings-button-primary"
466
477
  type="button"
467
- title=${k(`terminalShellAdd`)}
468
- aria-label=${k(`terminalShellAdd`)}
478
+ title=${O(`terminalShellAdd`)}
479
+ aria-label=${O(`terminalShellAdd`)}
469
480
  @click=${()=>this.addCustomTerminalShell()}
470
481
  >
471
- ${k(`terminalShellAdd`)}
482
+ ${O(`terminalShellAdd`)}
472
483
  </button>
473
484
  </div>
474
485
  </div>
475
486
  </section>
476
- `}renderSwitch(e,t,n=!1){return _`
487
+ `}renderSwitch(e,t,n=!1){return g`
477
488
  <label class="quickforge-settings-switch" aria-disabled=${n?`true`:`false`}>
478
489
  <input
479
490
  type="checkbox"
@@ -483,16 +494,16 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,Ft as n,It as r
483
494
  />
484
495
  <span aria-hidden="true"></span>
485
496
  </label>
486
- `}render(){return this.loading?_`<div class="text-sm text-muted-foreground">${k(`loading`)}</div>`:_`
497
+ `}render(){return this.loading?g`<div class="text-sm text-muted-foreground">${O(`loading`)}</div>`:g`
487
498
  <div class="quickforge-settings-stack">
488
- <section class="quickforge-settings-section" aria-label=${k(`defaultOptions`)}>
499
+ <section class="quickforge-settings-section" aria-label=${O(`defaultOptions`)}>
489
500
  <div class="quickforge-settings-row">
490
501
  <div class="quickforge-settings-row-main">
491
502
  <div class="quickforge-settings-row-title">
492
- ${k(`language`)}
493
- <quickforge-info-tip .label=${k(`languageDescription`)}></quickforge-info-tip>
503
+ ${O(`language`)}
504
+ <quickforge-info-tip .label=${O(`languageDescription`)}></quickforge-info-tip>
494
505
  </div>
495
- <div class="quickforge-settings-row-description">${k(`displayLanguage`)}</div>
506
+ <div class="quickforge-settings-row-description">${O(`displayLanguage`)}</div>
496
507
  </div>
497
508
  <div class="quickforge-settings-row-control">
498
509
  <select
@@ -501,26 +512,26 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,Ft as n,It as r
501
512
  .value=${this.selectedLanguage}
502
513
  @change=${e=>this.updateLanguage(e.target.value)}
503
514
  >
504
- <option value="zh">${k(`simplifiedChinese`)}</option>
505
- <option value="en">${k(`english`)}</option>
515
+ <option value="zh">${O(`simplifiedChinese`)}</option>
516
+ <option value="en">${O(`english`)}</option>
506
517
  </select>
507
518
  </div>
508
519
  </div>
509
520
 
510
521
  <div class="quickforge-settings-row">
511
522
  <div class="quickforge-settings-row-main">
512
- <div class="quickforge-settings-row-title">${k(`defaultModel`)}</div>
513
- <div class="quickforge-settings-row-description">${k(`defaultModelDescription`)}</div>
523
+ <div class="quickforge-settings-row-title">${O(`defaultModel`)}</div>
524
+ <div class="quickforge-settings-row-description">${O(`defaultModelDescription`)}</div>
514
525
  </div>
515
526
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide">
516
527
  <select
517
528
  data-default-model-select
518
529
  class="quickforge-settings-select"
519
- .value=${this.selectedModel?L(this.selectedModel):``}
530
+ .value=${this.selectedModel?I(this.selectedModel):``}
520
531
  @change=${e=>this.updateModel(e.target.value)}
521
532
  >
522
- ${this.modelOptions().length===0?_`<option value="">${k(`noModelAvailable`)}</option>`:this.modelOptions().map(e=>_`
523
- <option .value=${L(e)}>${ze(e)}</option>
533
+ ${this.modelOptions().length===0?g`<option value="">${O(`noModelAvailable`)}</option>`:this.modelOptions().map(e=>g`
534
+ <option .value=${I(e)}>${Be(e)}</option>
524
535
  `)}
525
536
  </select>
526
537
  </div>
@@ -528,9 +539,9 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,Ft as n,It as r
528
539
 
529
540
  <div class="quickforge-settings-row">
530
541
  <div class="quickforge-settings-row-main">
531
- <div class="quickforge-settings-row-title">${k(`defaultThinkingLevel`)}</div>
542
+ <div class="quickforge-settings-row-title">${O(`defaultThinkingLevel`)}</div>
532
543
  <div class="quickforge-settings-row-description">
533
- ${this.selectedModel?.reasoning?k(`defaultThinkingLevelDescription`):k(`thinkingRequiresReasoningModel`)}
544
+ ${this.selectedModel?.reasoning?O(`defaultThinkingLevelDescription`):O(`thinkingRequiresReasoningModel`)}
534
545
  </div>
535
546
  </div>
536
547
  <div class="quickforge-settings-row-control">
@@ -541,7 +552,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,Ft as n,It as r
541
552
  ?disabled=${!this.selectedModel?.reasoning}
542
553
  @change=${e=>this.updateThinkingLevel(e.target.value)}
543
554
  >
544
- ${Le.map(e=>_`
555
+ ${Re.map(e=>g`
545
556
  <option .value=${e.value}>${e.label()}</option>
546
557
  `)}
547
558
  </select>
@@ -551,10 +562,10 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,Ft as n,It as r
551
562
  <div class="quickforge-settings-row">
552
563
  <div class="quickforge-settings-row-main">
553
564
  <div class="quickforge-settings-row-title">
554
- ${k(`showToolDetails`)}
555
- <quickforge-info-tip .label=${k(`showToolDetailsDescription`)}></quickforge-info-tip>
565
+ ${O(`showToolDetails`)}
566
+ <quickforge-info-tip .label=${O(`showToolDetailsDescription`)}></quickforge-info-tip>
556
567
  </div>
557
- <div class="quickforge-settings-row-description">${k(`showToolDetailsDescriptionShort`)}</div>
568
+ <div class="quickforge-settings-row-description">${O(`showToolDetailsDescriptionShort`)}</div>
558
569
  </div>
559
570
  <div class="quickforge-settings-row-control">
560
571
  ${this.renderSwitch(this.showToolDetails,e=>this.updateShowToolDetails(e))}
@@ -563,8 +574,8 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,Ft as n,It as r
563
574
 
564
575
  <div class="quickforge-settings-row">
565
576
  <div class="quickforge-settings-row-main">
566
- <div class="quickforge-settings-row-title">${k(`expandToolsByDefault`)}</div>
567
- <div class="quickforge-settings-row-description">${k(`expandToolsByDefaultDescription`)}</div>
577
+ <div class="quickforge-settings-row-title">${O(`expandToolsByDefault`)}</div>
578
+ <div class="quickforge-settings-row-description">${O(`expandToolsByDefaultDescription`)}</div>
568
579
  </div>
569
580
  <div class="quickforge-settings-row-control">
570
581
  ${this.renderSwitch(this.expandToolsByDefault,e=>this.updateExpandToolsByDefault(e))}
@@ -574,10 +585,10 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,Ft as n,It as r
574
585
  <div class="quickforge-settings-row">
575
586
  <div class="quickforge-settings-row-main">
576
587
  <div class="quickforge-settings-row-title">
577
- ${k(`autoCompactEnabled`)}
578
- <quickforge-info-tip .label=${k(`autoCompactDescription`)}></quickforge-info-tip>
588
+ ${O(`autoCompactEnabled`)}
589
+ <quickforge-info-tip .label=${O(`autoCompactDescription`)}></quickforge-info-tip>
579
590
  </div>
580
- <div class="quickforge-settings-row-description">${k(`autoCompactTriggerNote`)}</div>
591
+ <div class="quickforge-settings-row-description">${O(`autoCompactTriggerNote`)}</div>
581
592
  </div>
582
593
  <div class="quickforge-settings-row-control">
583
594
  ${this.renderSwitch(this.autoCompactEnabled,e=>this.updateAutoCompactEnabled(e))}
@@ -586,8 +597,8 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,Ft as n,It as r
586
597
 
587
598
  <div class="quickforge-settings-row">
588
599
  <div class="quickforge-settings-row-main">
589
- <div class="quickforge-settings-row-title">${k(`autoCompactRequireConfirmation`)}</div>
590
- <div class="quickforge-settings-row-description">${k(`autoCompactRequireConfirmationDescription`)}</div>
600
+ <div class="quickforge-settings-row-title">${O(`autoCompactRequireConfirmation`)}</div>
601
+ <div class="quickforge-settings-row-description">${O(`autoCompactRequireConfirmationDescription`)}</div>
591
602
  </div>
592
603
  <div class="quickforge-settings-row-control">
593
604
  ${this.renderSwitch(this.autoCompactRequireConfirmation,e=>this.updateAutoCompactRequireConfirmation(e),!this.autoCompactEnabled)}
@@ -596,8 +607,8 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,Ft as n,It as r
596
607
 
597
608
  <div class="quickforge-settings-row">
598
609
  <div class="quickforge-settings-row-main">
599
- <div class="quickforge-settings-row-title">${k(`autoCompactThresholdPercent`)}</div>
600
- <div class="quickforge-settings-row-description">${k(`autoCompactThresholdDescription`)}</div>
610
+ <div class="quickforge-settings-row-title">${O(`autoCompactThresholdPercent`)}</div>
611
+ <div class="quickforge-settings-row-description">${O(`autoCompactThresholdDescription`)}</div>
601
612
  </div>
602
613
  <div class="quickforge-settings-row-control">
603
614
  <input
@@ -618,10 +629,10 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,Ft as n,It as r
618
629
  <div class="quickforge-settings-row">
619
630
  <div class="quickforge-settings-row-main">
620
631
  <div class="quickforge-settings-row-title">
621
- ${k(`autoCompactKeepRecentTurns`)}
622
- <quickforge-info-tip .label=${k(`autoCompactHistoryPreserved`)}></quickforge-info-tip>
632
+ ${O(`autoCompactKeepRecentTurns`)}
633
+ <quickforge-info-tip .label=${O(`autoCompactHistoryPreserved`)}></quickforge-info-tip>
623
634
  </div>
624
- <div class="quickforge-settings-row-description">${k(`autoCompactKeepRecentTurnsDescription`)}</div>
635
+ <div class="quickforge-settings-row-description">${O(`autoCompactKeepRecentTurnsDescription`)}</div>
625
636
  </div>
626
637
  <div class="quickforge-settings-row-control">
627
638
  <input
@@ -642,10 +653,10 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,Ft as n,It as r
642
653
 
643
654
  ${this.terminalShellSettings()}
644
655
 
645
- ${this.saved?_`<div class="quickforge-settings-message">${this.savedMessage||k(`defaultOptionsSaved`)}</div>`:null}
646
- ${this.error?_`<div class="quickforge-settings-alert">${this.error}</div>`:null}
656
+ ${this.saved?g`<div class="quickforge-settings-message">${this.savedMessage||O(`defaultOptionsSaved`)}</div>`:null}
657
+ ${this.error?g`<div class="quickforge-settings-alert">${this.error}</div>`:null}
647
658
  </div>
648
- `}},R=`quickforge-default-options-settings-tab`;customElements.get(R)||customElements.define(R,Ge);function Ke(){return document.createElement(R)}var qe=`quickforge-backup`,Je=[{id:`settings`,countKey:`settings`,label:()=>k(`restoreSettings`),description:()=>k(`restoreSettingsDescription`)},{id:`mcp`,countKey:`mcp`,label:()=>k(`restoreMcp`),description:()=>k(`restoreMcpDescription`)},{id:`providerKeys`,countKey:`providerKeys`,label:()=>k(`restoreProviderKeys`),description:()=>k(`restoreProviderKeysDescription`)},{id:`customProviders`,countKey:`customProviders`,label:()=>k(`restoreCustomProviders`),description:()=>k(`restoreCustomProvidersDescription`)},{id:`projects`,countKey:`projects`,label:()=>k(`restoreProjects`),description:()=>k(`restoreProjectsDescription`)},{id:`scheduledTasks`,countKey:`scheduledTasks`,label:()=>k(`restoreScheduledTasks`),description:()=>k(`restoreScheduledTasksDescription`)},{id:`conversations`,countKey:`sessions`,label:()=>k(`restoreConversations`),description:()=>k(`restoreConversationsDescription`)}];function Ye(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 Xe(){return new Date().toISOString().replace(/[:.]/g,`-`)}function Ze(e){return e?Object.entries(e).map(([e,t])=>`${e}: ${t}`).join(`, `):``}function Qe(e){return Je.filter(t=>(e.sections?.[t.countKey]??0)>0)}function $e(e){return Qe(e).filter(e=>e.id!==`conversations`).map(e=>e.id)}function et(e){return e instanceof RangeError||e instanceof Error&&e.message.includes(`Invalid string length`)}function z(e,t){return et(e)?k(`backupStringTooLarge`):e instanceof Error?e.message:t}function B(e){return!!(e&&typeof e==`object`&&!Array.isArray(e))}function tt(e){if(!B(e))return e;let t={...e};return delete t.sessions,delete t.sessionsMetadata,delete t[`sessions-metadata`],t}function nt(e){return B(e)?B(e.data)?{...e,scope:e.scope===`sessions`?`config`:e.scope,data:tt(e.data)}:tt(e):e}function rt(e,t){return t.has(`conversations`)?e:nt(e)}var it=class extends v{exportScope=`config`;includeSecrets=!1;busy=!1;message=``;error=``;safetyBackupPath=``;pendingImport=null;getTabName(){return k(`backupRestore`)}setScope(e){this.exportScope=e===`config`||e===`sessions`?e:`all`,this.exportScope===`sessions`&&(this.includeSecrets=!1),this.clearStatus(),this.requestUpdate()}clearStatus(){this.message=``,this.error=``,this.safetyBackupPath=``}setIncludeSecrets(e){this.includeSecrets=e&&this.exportScope!==`sessions`,this.message=``,this.error=``,this.requestUpdate()}async exportBackup(){if(!(this.includeSecrets&&!await C({description:k(`backupExportSecretsConfirm`),confirmLabel:k(`exportBackup`),cancelLabel:k(`cancel`)}))){this.busy=!0,this.clearStatus(),this.requestUpdate();try{let e=new URLSearchParams({scope:this.exportScope,includeSecrets:this.includeSecrets?`1`:`0`}),t=await fetch(`/api/backup/export?${e.toString()}`,{cache:`no-store`}),n=await t.json().catch(()=>null);if(!t.ok)throw Error(n?.error||k(`backupExportFailed`));let r=this.includeSecrets?`with-secrets`:`no-secrets`;Ye(`${qe}-${this.exportScope}-${r}-${Xe()}.json`,n),this.message=k(`backupExported`)}catch(e){this.error=z(e,k(`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||k(`backupInspectFailed`));if(!n)throw Error(k(`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($e(t));this.pendingImport={backup:null,importToken:t.importToken,inspect:t,selectedSections:n,mode:`replace`},this.message=t.sections?.sessions?k(`backupInspectedWithConversations`):k(`backupInspected`)}catch(e){this.error=z(e,k(`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=k(`selectAtLeastOneRestoreSection`),this.requestUpdate();return}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:rt(this.pendingImport.backup,this.pendingImport.selectedSections),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||k(`backupImportFailed`));let r=Ze(n?.summary);this.safetyBackupPath=n?.safetyBackupPath||``,this.pendingImport=null,this.message=r?`${k(`backupImported`)} ${r}`:k(`backupImported`),window.setTimeout(()=>window.location.reload(),1500)}catch(e){this.error=z(e,k(`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 _`
659
+ `}},L=`quickforge-default-options-settings-tab`;customElements.get(L)||customElements.define(L,Ke);function qe(){return document.createElement(L)}var Je=`quickforge-backup`,Ye=[{id:`settings`,countKey:`settings`,label:()=>O(`restoreSettings`),description:()=>O(`restoreSettingsDescription`)},{id:`mcp`,countKey:`mcp`,label:()=>O(`restoreMcp`),description:()=>O(`restoreMcpDescription`)},{id:`providerKeys`,countKey:`providerKeys`,label:()=>O(`restoreProviderKeys`),description:()=>O(`restoreProviderKeysDescription`)},{id:`customProviders`,countKey:`customProviders`,label:()=>O(`restoreCustomProviders`),description:()=>O(`restoreCustomProvidersDescription`)},{id:`projects`,countKey:`projects`,label:()=>O(`restoreProjects`),description:()=>O(`restoreProjectsDescription`)},{id:`scheduledTasks`,countKey:`scheduledTasks`,label:()=>O(`restoreScheduledTasks`),description:()=>O(`restoreScheduledTasksDescription`)},{id:`conversations`,countKey:`sessions`,label:()=>O(`restoreConversations`),description:()=>O(`restoreConversationsDescription`)}];function Xe(e,t){let n=new Blob([`${JSON.stringify(t,null,2)}\n`],{type:`application/json`}),r=URL.createObjectURL(n),i=document.createElement(`a`);i.href=r,i.download=e,document.body.appendChild(i),i.click(),i.remove(),URL.revokeObjectURL(r)}function Ze(){return new Date().toISOString().replace(/[:.]/g,`-`)}function Qe(e){return e?Object.entries(e).map(([e,t])=>`${e}: ${t}`).join(`, `):``}function $e(e){return Ye.filter(t=>(e.sections?.[t.countKey]??0)>0)}function et(e){return $e(e).filter(e=>e.id!==`conversations`).map(e=>e.id)}function tt(e){return e instanceof RangeError||e instanceof Error&&e.message.includes(`Invalid string length`)}function R(e,t){return tt(e)?O(`backupStringTooLarge`):e instanceof Error?e.message:t}function z(e){return!!(e&&typeof e==`object`&&!Array.isArray(e))}function nt(e){if(!z(e))return e;let t={...e};return delete t.sessions,delete t.sessionsMetadata,delete t[`sessions-metadata`],t}function rt(e){return z(e)?z(e.data)?{...e,scope:e.scope===`sessions`?`config`:e.scope,data:nt(e.data)}:nt(e):e}function it(e,t){return t.has(`conversations`)?e:rt(e)}var at=class extends _{exportScope=`config`;includeSecrets=!1;busy=!1;message=``;error=``;safetyBackupPath=``;pendingImport=null;getTabName(){return O(`backupRestore`)}setScope(e){this.exportScope=e===`config`||e===`sessions`?e:`all`,this.exportScope===`sessions`&&(this.includeSecrets=!1),this.clearStatus(),this.requestUpdate()}clearStatus(){this.message=``,this.error=``,this.safetyBackupPath=``}setIncludeSecrets(e){this.includeSecrets=e&&this.exportScope!==`sessions`,this.message=``,this.error=``,this.requestUpdate()}async exportBackup(){if(!(this.includeSecrets&&!await C({description:O(`backupExportSecretsConfirm`),confirmLabel:O(`exportBackup`),cancelLabel:O(`cancel`)}))){this.busy=!0,this.clearStatus(),this.requestUpdate();try{let e=new URLSearchParams({scope:this.exportScope,includeSecrets:this.includeSecrets?`1`:`0`}),t=await fetch(`/api/backup/export?${e.toString()}`,{cache:`no-store`}),n=await t.json().catch(()=>null);if(!t.ok)throw Error(n?.error||O(`backupExportFailed`));let r=this.includeSecrets?`with-secrets`:`no-secrets`;Xe(`${Je}-${this.exportScope}-${r}-${Ze()}.json`,n),this.message=O(`backupExported`)}catch(e){this.error=R(e,O(`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||O(`backupInspectFailed`));if(!n)throw Error(O(`backupInspectFailed`));return n}async importBackupFromFile(e){this.busy=!0,this.clearStatus(),this.pendingImport=null,this.requestUpdate();try{let t=await this.inspectBackupFile(e),n=new Set(et(t));this.pendingImport={backup:null,importToken:t.importToken,inspect:t,selectedSections:n,mode:`replace`},this.message=t.sections?.sessions?O(`backupInspectedWithConversations`):O(`backupInspected`)}catch(e){this.error=R(e,O(`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=O(`selectAtLeastOneRestoreSection`),this.requestUpdate();return}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:it(this.pendingImport.backup,this.pendingImport.selectedSections),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||O(`backupImportFailed`));let r=Qe(n?.summary);this.safetyBackupPath=n?.safetyBackupPath||``,this.pendingImport=null,this.message=r?`${O(`backupImported`)} ${r}`:O(`backupImported`),window.setTimeout(()=>window.location.reload(),1500)}catch(e){this.error=R(e,O(`backupImportFailed`))}finally{this.busy=!1,this.requestUpdate()}}}handleFileChange(e){let t=e.target,n=t.files?.[0];t.value=``,n&&this.importBackupFromFile(n)}renderSwitch(e,t,n=!1){return g`
649
660
  <label class="quickforge-settings-switch" aria-disabled=${n?`true`:`false`}>
650
661
  <input
651
662
  type="checkbox"
@@ -655,62 +666,62 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,Ft as n,It as r
655
666
  />
656
667
  <span aria-hidden="true"></span>
657
668
  </label>
658
- `}renderPendingImport(){if(!this.pendingImport)return null;let{inspect:e,selectedSections:t}=this.pendingImport,n=Qe(e);return _`
659
- <section class="quickforge-settings-section" aria-label=${k(`backupInspectTitle`)}>
669
+ `}renderPendingImport(){if(!this.pendingImport)return null;let{inspect:e,selectedSections:t}=this.pendingImport,n=$e(e);return g`
670
+ <section class="quickforge-settings-section" aria-label=${O(`backupInspectTitle`)}>
660
671
  <div class="quickforge-settings-row quickforge-settings-row-top">
661
672
  <div class="quickforge-settings-row-main">
662
- <div class="quickforge-settings-row-title">${k(`backupInspectTitle`)}</div>
663
- <div class="quickforge-settings-row-description">${k(`backupInspectDescription`)}</div>
673
+ <div class="quickforge-settings-row-title">${O(`backupInspectTitle`)}</div>
674
+ <div class="quickforge-settings-row-description">${O(`backupInspectDescription`)}</div>
664
675
  </div>
665
676
  </div>
666
677
 
667
678
  <div class="quickforge-settings-nested-list">
668
679
  <div class="quickforge-settings-subrow">
669
680
  <div class="quickforge-settings-row-main">
670
- <div class="quickforge-settings-row-title">${k(`backupInspectExportedAt`)}</div>
681
+ <div class="quickforge-settings-row-title">${O(`backupInspectExportedAt`)}</div>
671
682
  </div>
672
683
  <div class="quickforge-settings-row-control quickforge-settings-readonly-value">${e.exportedAt||`-`}</div>
673
684
  </div>
674
685
  <div class="quickforge-settings-subrow">
675
686
  <div class="quickforge-settings-row-main">
676
- <div class="quickforge-settings-row-title">${k(`backupInspectVersion`)}</div>
687
+ <div class="quickforge-settings-row-title">${O(`backupInspectVersion`)}</div>
677
688
  </div>
678
689
  <div class="quickforge-settings-row-control quickforge-settings-readonly-value">${e.version??`-`}</div>
679
690
  </div>
680
691
  <div class="quickforge-settings-subrow">
681
692
  <div class="quickforge-settings-row-main">
682
- <div class="quickforge-settings-row-title">${k(`backupInspectScope`)}</div>
693
+ <div class="quickforge-settings-row-title">${O(`backupInspectScope`)}</div>
683
694
  </div>
684
695
  <div class="quickforge-settings-row-control quickforge-settings-readonly-value">${e.scope||`-`}</div>
685
696
  </div>
686
697
  <div class="quickforge-settings-subrow">
687
698
  <div class="quickforge-settings-row-main">
688
- <div class="quickforge-settings-row-title">${k(`backupInspectSecrets`)}</div>
699
+ <div class="quickforge-settings-row-title">${O(`backupInspectSecrets`)}</div>
689
700
  </div>
690
- <div class="quickforge-settings-row-control quickforge-settings-readonly-value">${e.includeSecrets?k(`yes`):k(`no`)}</div>
701
+ <div class="quickforge-settings-row-control quickforge-settings-readonly-value">${e.includeSecrets?O(`yes`):O(`no`)}</div>
691
702
  </div>
692
703
  </div>
693
704
 
694
- ${e.warnings?.length?_`
705
+ ${e.warnings?.length?g`
695
706
  <div class="quickforge-settings-warning quickforge-settings-warning-attached">
696
- ${e.warnings.map(e=>_`<div>⚠ ${e}</div>`)}
707
+ ${e.warnings.map(e=>g`<div>⚠ ${e}</div>`)}
697
708
  </div>
698
709
  `:null}
699
710
 
700
711
  <div class="quickforge-settings-row">
701
712
  <div class="quickforge-settings-row-main">
702
- <div class="quickforge-settings-row-title">${k(`restoreMode`)}</div>
703
- <div class="quickforge-settings-row-description">${k(`restoreModeDescription`)}</div>
713
+ <div class="quickforge-settings-row-title">${O(`restoreMode`)}</div>
714
+ <div class="quickforge-settings-row-description">${O(`restoreModeDescription`)}</div>
704
715
  </div>
705
716
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide">
706
- <div class="quickforge-settings-segmented" role="group" aria-label=${k(`restoreMode`)}>
717
+ <div class="quickforge-settings-segmented" role="group" aria-label=${O(`restoreMode`)}>
707
718
  <button
708
719
  type="button"
709
720
  class="quickforge-settings-segmented-option ${this.pendingImport.mode===`replace`?`quickforge-settings-segmented-option-active`:``}"
710
721
  ?disabled=${this.busy}
711
722
  @click=${()=>this.setRestoreMode(`replace`)}
712
723
  >
713
- ${k(`restoreModeReplace`)}
724
+ ${O(`restoreModeReplace`)}
714
725
  </button>
715
726
  <button
716
727
  type="button"
@@ -718,7 +729,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,Ft as n,It as r
718
729
  ?disabled=${this.busy}
719
730
  @click=${()=>this.setRestoreMode(`merge`)}
720
731
  >
721
- ${k(`restoreModeMerge`)}
732
+ ${O(`restoreModeMerge`)}
722
733
  </button>
723
734
  </div>
724
735
  </div>
@@ -726,14 +737,14 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,Ft as n,It as r
726
737
 
727
738
  <div class="quickforge-settings-row quickforge-settings-row-top">
728
739
  <div class="quickforge-settings-row-main">
729
- <div class="quickforge-settings-row-title">${k(`selectRestoreSections`)}</div>
740
+ <div class="quickforge-settings-row-title">${O(`selectRestoreSections`)}</div>
730
741
  <div class="quickforge-settings-row-description">
731
- ${this.pendingImport.mode===`replace`?k(`restoreModeReplaceDescription`):k(`restoreModeMergeDescription`)}
742
+ ${this.pendingImport.mode===`replace`?O(`restoreModeReplaceDescription`):O(`restoreModeMergeDescription`)}
732
743
  </div>
733
744
  </div>
734
745
  </div>
735
746
  <div class="quickforge-settings-nested-list">
736
- ${n.map(n=>_`
747
+ ${n.map(n=>g`
737
748
  <div class="quickforge-settings-subrow">
738
749
  <div class="quickforge-settings-row-main">
739
750
  <div class="quickforge-settings-row-title">${n.label()} (${e.sections?.[n.countKey]??0})</div>
@@ -748,8 +759,8 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,Ft as n,It as r
748
759
 
749
760
  <div class="quickforge-settings-row">
750
761
  <div class="quickforge-settings-row-main">
751
- <div class="quickforge-settings-row-title">${k(`backupImportActions`)}</div>
752
- <div class="quickforge-settings-row-description">${k(`backupImportActionsDescription`)}</div>
762
+ <div class="quickforge-settings-row-title">${O(`backupImportActions`)}</div>
763
+ <div class="quickforge-settings-row-description">${O(`backupImportActionsDescription`)}</div>
753
764
  </div>
754
765
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide">
755
766
  <button
@@ -758,7 +769,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,Ft as n,It as r
758
769
  ?disabled=${this.busy||t.size===0}
759
770
  @click=${()=>this.confirmPendingImport()}
760
771
  >
761
- ${this.busy?k(`loading`):k(`confirmImportSelected`)}
772
+ ${this.busy?O(`loading`):O(`confirmImportSelected`)}
762
773
  </button>
763
774
  <button
764
775
  class="quickforge-settings-button quickforge-settings-button-secondary"
@@ -766,21 +777,21 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,Ft as n,It as r
766
777
  ?disabled=${this.busy}
767
778
  @click=${()=>this.cancelPendingImport()}
768
779
  >
769
- ${k(`cancel`)}
780
+ ${O(`cancel`)}
770
781
  </button>
771
782
  </div>
772
783
  </div>
773
784
  </section>
774
- `}render(){return _`
785
+ `}render(){return g`
775
786
  <div class="quickforge-settings-stack">
776
- <section class="quickforge-settings-section" aria-label=${k(`exportData`)}>
787
+ <section class="quickforge-settings-section" aria-label=${O(`exportData`)}>
777
788
  <div class="quickforge-settings-row">
778
789
  <div class="quickforge-settings-row-main">
779
790
  <div class="quickforge-settings-row-title">
780
- ${k(`exportScope`)}
781
- <quickforge-info-tip .label=${k(`exportDataDescription`)}></quickforge-info-tip>
791
+ ${O(`exportScope`)}
792
+ <quickforge-info-tip .label=${O(`exportDataDescription`)}></quickforge-info-tip>
782
793
  </div>
783
- <div class="quickforge-settings-row-description">${k(`exportScopeDescription`)}</div>
794
+ <div class="quickforge-settings-row-description">${O(`exportScopeDescription`)}</div>
784
795
  </div>
785
796
  <div class="quickforge-settings-row-control">
786
797
  <select
@@ -789,23 +800,23 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,Ft as n,It as r
789
800
  ?disabled=${this.busy}
790
801
  @change=${e=>this.setScope(e.target.value)}
791
802
  >
792
- <option value="all">${k(`exportScopeAll`)}</option>
793
- <option value="config">${k(`exportScopeConfig`)}</option>
794
- <option value="sessions">${k(`exportScopeSessions`)}</option>
803
+ <option value="all">${O(`exportScopeAll`)}</option>
804
+ <option value="config">${O(`exportScopeConfig`)}</option>
805
+ <option value="sessions">${O(`exportScopeSessions`)}</option>
795
806
  </select>
796
807
  </div>
797
808
  </div>
798
809
 
799
- ${this.exportScope===`config`?null:_`
810
+ ${this.exportScope===`config`?null:g`
800
811
  <div class="quickforge-settings-warning quickforge-settings-warning-attached">
801
- ⚠ ${k(`exportLargeDataWarning`)}
812
+ ⚠ ${O(`exportLargeDataWarning`)}
802
813
  </div>
803
814
  `}
804
815
 
805
816
  <div class="quickforge-settings-row">
806
817
  <div class="quickforge-settings-row-main ${this.exportScope===`sessions`?`opacity-60`:``}">
807
- <div class="quickforge-settings-row-title">${k(`includeApiKeys`)}</div>
808
- <div class="quickforge-settings-row-description">${k(`includeApiKeysDescription`)}</div>
818
+ <div class="quickforge-settings-row-title">${O(`includeApiKeys`)}</div>
819
+ <div class="quickforge-settings-row-description">${O(`includeApiKeysDescription`)}</div>
809
820
  </div>
810
821
  <div class="quickforge-settings-row-control">
811
822
  ${this.renderSwitch(this.includeSecrets,e=>this.setIncludeSecrets(e),this.busy||this.exportScope===`sessions`)}
@@ -814,8 +825,8 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,Ft as n,It as r
814
825
 
815
826
  <div class="quickforge-settings-row">
816
827
  <div class="quickforge-settings-row-main">
817
- <div class="quickforge-settings-row-title">${k(`exportBackup`)}</div>
818
- <div class="quickforge-settings-row-description">${k(`exportBackupDescription`)}</div>
828
+ <div class="quickforge-settings-row-title">${O(`exportBackup`)}</div>
829
+ <div class="quickforge-settings-row-description">${O(`exportBackupDescription`)}</div>
819
830
  </div>
820
831
  <div class="quickforge-settings-row-control">
821
832
  <button
@@ -824,20 +835,20 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,Ft as n,It as r
824
835
  ?disabled=${this.busy}
825
836
  @click=${()=>this.exportBackup()}
826
837
  >
827
- ${this.busy?k(`loading`):k(`exportBackup`)}
838
+ ${this.busy?O(`loading`):O(`exportBackup`)}
828
839
  </button>
829
840
  </div>
830
841
  </div>
831
842
  </section>
832
843
 
833
- <section class="quickforge-settings-section" aria-label=${k(`importData`)}>
844
+ <section class="quickforge-settings-section" aria-label=${O(`importData`)}>
834
845
  <div class="quickforge-settings-row">
835
846
  <div class="quickforge-settings-row-main">
836
847
  <div class="quickforge-settings-row-title">
837
- ${k(`importBackup`)}
838
- <quickforge-info-tip .label=${k(`importDataDescription`)}></quickforge-info-tip>
848
+ ${O(`importBackup`)}
849
+ <quickforge-info-tip .label=${O(`importDataDescription`)}></quickforge-info-tip>
839
850
  </div>
840
- <div class="quickforge-settings-row-description">${k(`importDataDescription`)}</div>
851
+ <div class="quickforge-settings-row-description">${O(`importDataDescription`)}</div>
841
852
  </div>
842
853
  <div class="quickforge-settings-row-control">
843
854
  <label class="quickforge-settings-button quickforge-settings-button-secondary ${this.busy?`pointer-events-none opacity-60`:``}">
@@ -848,24 +859,24 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,Ft as n,It as r
848
859
  ?disabled=${this.busy}
849
860
  @change=${e=>this.handleFileChange(e)}
850
861
  />
851
- ${k(`importBackup`)}
862
+ ${O(`importBackup`)}
852
863
  </label>
853
864
  </div>
854
865
  </div>
855
866
  </section>
856
867
 
857
868
  ${this.renderPendingImport()}
858
- ${this.message?_`<div class="quickforge-settings-message">${this.message}</div>`:null}
859
- ${this.safetyBackupPath?_`<div class="quickforge-settings-note">${k(`backupSafetyBackupPath`)}: <code>${this.safetyBackupPath}</code></div>`:null}
860
- ${this.error?_`<div class="quickforge-settings-alert">${this.error}</div>`:null}
869
+ ${this.message?g`<div class="quickforge-settings-message">${this.message}</div>`:null}
870
+ ${this.safetyBackupPath?g`<div class="quickforge-settings-note">${O(`backupSafetyBackupPath`)}: <code>${this.safetyBackupPath}</code></div>`:null}
871
+ ${this.error?g`<div class="quickforge-settings-alert">${this.error}</div>`:null}
861
872
  </div>
862
- `}},V=`quickforge-backup-settings-tab`;customElements.get(V)||customElements.define(V,it);function at(){return document.createElement(V)}function ot(e){if(!e)return`-`;let t=new Date(e);return Number.isNaN(t.getTime())?e:t.toLocaleString(xe())}function st(e){let t={...e};return delete t.archivedAt,t}function H(){if(!(typeof BroadcastChannel>`u`))try{let e=new BroadcastChannel(`quickforge-sync`);e.postMessage({type:`sessions-changed`,sourceTabId:`archived-conversations-settings-tab`,timestamp:Date.now()}),e.close()}catch{}}var ct=class extends v{sessions=[];projects=[];loading=!0;busySessionId=``;query=``;projectFilter=`all`;message=``;error=``;getTabName(){return k(`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||k(`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:k(`requestFailed`)}finally{this.loading=!1,this.requestUpdate()}}filteredSessions(){let e=this.query.trim().toLowerCase();return this.sessions.filter(t=>{if(this.projectFilter!==`all`&&(this.projectFilter===`global`&&t.scope===`project`||this.projectFilter!==`global`&&t.projectId!==this.projectFilter))return!1;if(!e)return!0;let n=t.projectId&&this.projectNameById.get(t.projectId)||``;return`${T(t.title)} ${n}`.toLowerCase().includes(e)})}groupedSessions(){let e=new Map;for(let t of this.filteredSessions()){let n=t.scope===`project`&&t.projectId?t.projectId:`global`;e.set(n,[...e.get(n)??[],t])}return[...e.entries()]}projectLabel(e){return e===`global`?k(`normalChat`):this.projectNameById.get(e)||k(`unknownProject`)}async restoreSession(e){if(!this.busySessionId){this.busySessionId=e,this.message=``,this.error=``,this.requestUpdate();try{let t=y(),n=await t.sessions.get(e),r=await t.sessions.getMetadata(e);if(!n||!r)throw Error(k(`sessionNotFound`));await t.sessions.save(st(n),st(r)),this.sessions=this.sessions.filter(t=>t.id!==e),this.message=k(`sessionRestored`),H()}catch(e){this.error=e instanceof Error?e.message:k(`restoreSessionFailed`)}finally{this.busySessionId=``,this.requestUpdate()}}}async deleteSession(e){if(!this.busySessionId&&await C({description:k(`deleteArchivedSessionConfirm`,{title:T(e.title)}),confirmLabel:k(`confirmDelete`),cancelLabel:k(`cancel`),variant:`destructive`})){this.busySessionId=e.id,this.message=``,this.error=``,this.requestUpdate();try{await y().sessions.delete(e.id),this.sessions=this.sessions.filter(t=>t.id!==e.id),this.message=k(`archivedSessionDeleted`),H()}catch(e){this.error=e instanceof Error?e.message:k(`deleteSessionFailed`)}finally{this.busySessionId=``,this.requestUpdate()}}}async deleteAllArchivedSessions(){if(!(this.busySessionId||this.sessions.length===0)&&await C({description:k(`deleteAllArchivedSessionsConfirm`),confirmLabel:k(`confirmDelete`),cancelLabel:k(`cancel`),variant:`destructive`})){this.busySessionId=`__all__`,this.message=``,this.error=``,this.requestUpdate();try{let e=y();await Promise.all(this.sessions.map(t=>e.sessions.delete(t.id))),this.sessions=[],this.message=k(`archivedSessionsDeleted`),H()}catch(e){this.error=e instanceof Error?e.message:k(`deleteSessionFailed`)}finally{this.busySessionId=``,this.requestUpdate()}}}renderSession(e){let t=this.busySessionId===e.id||this.busySessionId===`__all__`;return _`
873
+ `}},B=`quickforge-backup-settings-tab`;customElements.get(B)||customElements.define(B,at);function ot(){return document.createElement(B)}function st(e){if(!e)return`-`;let t=new Date(e);return Number.isNaN(t.getTime())?e:t.toLocaleString(ye())}function ct(e){let t={...e};return delete t.archivedAt,t}function V(){if(!(typeof BroadcastChannel>`u`))try{let e=new BroadcastChannel(`quickforge-sync`);e.postMessage({type:`sessions-changed`,sourceTabId:`archived-conversations-settings-tab`,timestamp:Date.now()}),e.close()}catch{}}var lt=class extends _{sessions=[];projects=[];loading=!0;busySessionId=``;query=``;projectFilter=`all`;message=``;error=``;getTabName(){return O(`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||O(`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:O(`requestFailed`)}finally{this.loading=!1,this.requestUpdate()}}filteredSessions(){let e=this.query.trim().toLowerCase();return this.sessions.filter(t=>{if(this.projectFilter!==`all`&&(this.projectFilter===`global`&&t.scope===`project`||this.projectFilter!==`global`&&t.projectId!==this.projectFilter))return!1;if(!e)return!0;let n=t.projectId&&this.projectNameById.get(t.projectId)||``;return`${T(t.title)} ${n}`.toLowerCase().includes(e)})}groupedSessions(){let e=new Map;for(let t of this.filteredSessions()){let n=t.scope===`project`&&t.projectId?t.projectId:`global`;e.set(n,[...e.get(n)??[],t])}return[...e.entries()]}projectLabel(e){return e===`global`?O(`normalChat`):this.projectNameById.get(e)||O(`unknownProject`)}async restoreSession(e){if(!this.busySessionId){this.busySessionId=e,this.message=``,this.error=``,this.requestUpdate();try{let t=v(),n=await t.sessions.get(e),r=await t.sessions.getMetadata(e);if(!n||!r)throw Error(O(`sessionNotFound`));await t.sessions.save(ct(n),ct(r)),this.sessions=this.sessions.filter(t=>t.id!==e),this.message=O(`sessionRestored`),V()}catch(e){this.error=e instanceof Error?e.message:O(`restoreSessionFailed`)}finally{this.busySessionId=``,this.requestUpdate()}}}async deleteSession(e){if(!this.busySessionId&&await C({description:O(`deleteArchivedSessionConfirm`,{title:T(e.title)}),confirmLabel:O(`confirmDelete`),cancelLabel:O(`cancel`),variant:`destructive`})){this.busySessionId=e.id,this.message=``,this.error=``,this.requestUpdate();try{await v().sessions.delete(e.id),this.sessions=this.sessions.filter(t=>t.id!==e.id),this.message=O(`archivedSessionDeleted`),V()}catch(e){this.error=e instanceof Error?e.message:O(`deleteSessionFailed`)}finally{this.busySessionId=``,this.requestUpdate()}}}async deleteAllArchivedSessions(){if(!(this.busySessionId||this.sessions.length===0)&&await C({description:O(`deleteAllArchivedSessionsConfirm`),confirmLabel:O(`confirmDelete`),cancelLabel:O(`cancel`),variant:`destructive`})){this.busySessionId=`__all__`,this.message=``,this.error=``,this.requestUpdate();try{let e=v();await Promise.all(this.sessions.map(t=>e.sessions.delete(t.id))),this.sessions=[],this.message=O(`archivedSessionsDeleted`),V()}catch(e){this.error=e instanceof Error?e.message:O(`deleteSessionFailed`)}finally{this.busySessionId=``,this.requestUpdate()}}}renderSession(e){let t=this.busySessionId===e.id||this.busySessionId===`__all__`;return g`
863
874
  <div class="border-t border-border px-4 py-3 first:border-t-0">
864
875
  <div class="flex items-start justify-between gap-3">
865
876
  <div class="min-w-0">
866
877
  <div class="truncate text-sm font-medium text-foreground">${T(e.title)}</div>
867
878
  <div class="mt-1 text-xs text-muted-foreground">
868
- ${k(`lastModified`)}: ${ot(e.lastModified)} · ${k(`archivedAt`)}: ${ot(e.archivedAt)}
879
+ ${O(`lastModified`)}: ${st(e.lastModified)} · ${O(`archivedAt`)}: ${st(e.archivedAt)}
869
880
  </div>
870
881
  </div>
871
882
  <div class="flex shrink-0 items-center gap-2">
@@ -875,7 +886,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,Ft as n,It as r
875
886
  ?disabled=${t}
876
887
  @click=${()=>this.restoreSession(e.id)}
877
888
  >
878
- ${k(`restoreSession`)}
889
+ ${O(`restoreSession`)}
879
890
  </button>
880
891
  <button
881
892
  class="rounded-md px-2.5 py-1 text-xs text-destructive hover:bg-destructive/10 disabled:opacity-60"
@@ -883,12 +894,12 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,Ft as n,It as r
883
894
  ?disabled=${t}
884
895
  @click=${()=>this.deleteSession(e)}
885
896
  >
886
- ${k(`deletePermanently`)}
897
+ ${O(`deletePermanently`)}
887
898
  </button>
888
899
  </div>
889
900
  </div>
890
901
  </div>
891
- `}render(){let e=this.groupedSessions();return _`
902
+ `}render(){let e=this.groupedSessions();return g`
892
903
  <div class="flex flex-col gap-4">
893
904
  <div class="flex justify-end">
894
905
  <button
@@ -897,7 +908,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,Ft as n,It as r
897
908
  ?disabled=${!!this.busySessionId||this.sessions.length===0}
898
909
  @click=${()=>this.deleteAllArchivedSessions()}
899
910
  >
900
- ${k(`deleteAll`)}
911
+ ${O(`deleteAll`)}
901
912
  </button>
902
913
  </div>
903
914
 
@@ -907,7 +918,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,Ft as n,It as r
907
918
  class="rounded-md border border-input bg-background px-3 py-2 text-sm outline-none focus:ring-2 focus:ring-ring/30"
908
919
  type="search"
909
920
  .value=${this.query}
910
- placeholder=${k(`searchArchivedConversations`)}
921
+ placeholder=${O(`searchArchivedConversations`)}
911
922
  @input=${e=>{this.query=e.target.value,this.requestUpdate()}}
912
923
  />
913
924
  <select
@@ -915,23 +926,23 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,Ft as n,It as r
915
926
  .value=${this.projectFilter}
916
927
  @change=${e=>{this.projectFilter=e.target.value,this.requestUpdate()}}
917
928
  >
918
- <option value="all">${k(`allProjects`)}</option>
919
- <option value="global">${k(`normalChat`)}</option>
920
- ${this.projects.map(e=>_`<option value=${e.id}>${e.name}</option>`)}
929
+ <option value="all">${O(`allProjects`)}</option>
930
+ <option value="global">${O(`normalChat`)}</option>
931
+ ${this.projects.map(e=>g`<option value=${e.id}>${e.name}</option>`)}
921
932
  </select>
922
933
  </div>
923
934
 
924
- ${this.loading?_`
925
- <div class="px-4 py-8 text-center text-sm text-muted-foreground">${k(`loading`)}</div>
926
- `:e.length===0?_`
927
- <div class="px-4 py-8 text-center text-sm text-muted-foreground">${k(`noArchivedConversations`)}</div>
928
- `:_`
935
+ ${this.loading?g`
936
+ <div class="px-4 py-8 text-center text-sm text-muted-foreground">${O(`loading`)}</div>
937
+ `:e.length===0?g`
938
+ <div class="px-4 py-8 text-center text-sm text-muted-foreground">${O(`noArchivedConversations`)}</div>
939
+ `:g`
929
940
  <div>
930
- ${e.map(([e,t])=>_`
941
+ ${e.map(([e,t])=>g`
931
942
  <div class="border-b border-border last:border-b-0">
932
943
  <div class="flex items-center justify-between gap-3 bg-muted/20 px-4 py-2 text-sm text-muted-foreground">
933
944
  <div class="truncate">${this.projectLabel(e)}</div>
934
- <div class="shrink-0">${k(`conversationCount`,{count:t.length})}</div>
945
+ <div class="shrink-0">${O(`conversationCount`,{count:t.length})}</div>
935
946
  </div>
936
947
  ${t.map(e=>this.renderSession(e))}
937
948
  </div>
@@ -940,10 +951,10 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,Ft as n,It as r
940
951
  `}
941
952
  </section>
942
953
 
943
- ${this.message?_`<div class="rounded-md border border-emerald-500/30 bg-emerald-500/10 px-3 py-2 text-sm text-emerald-700 dark:text-emerald-300">${this.message}</div>`:null}
944
- ${this.error?_`<div class="rounded-md border border-destructive/30 bg-destructive/10 px-3 py-2 text-sm text-destructive">${this.error}</div>`:null}
954
+ ${this.message?g`<div class="rounded-md border border-emerald-500/30 bg-emerald-500/10 px-3 py-2 text-sm text-emerald-700 dark:text-emerald-300">${this.message}</div>`:null}
955
+ ${this.error?g`<div class="rounded-md border border-destructive/30 bg-destructive/10 px-3 py-2 text-sm text-destructive">${this.error}</div>`:null}
945
956
  </div>
946
- `}},U=`quickforge-archived-conversations-settings-tab`;customElements.get(U)||customElements.define(U,ct);function lt(){return document.createElement(U)}function ut(){return Array.from({length:16},()=>`ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz23456789!@#$%^&*`[Math.floor(Math.random()*65)]).join(``)}var dt=class extends v{loading=!0;saving=!1;enabled=!1;hasPassword=!1;password=``;sessionTtlHours=12;activeTokenCount=0;lanUrls=[];error=``;message=``;getTabName(){return k(`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||k(`requestFailed`));return r}applyStatus(e){this.enabled=!!e.enabled,this.hasPassword=!!e.hasPassword,this.sessionTtlHours=Number(e.sessionTtlHours||12),this.activeTokenCount=Number(e.activeTokenCount||0),this.lanUrls=Array.isArray(e.lanUrls)?e.lanUrls:[]}async loadStatus(){this.loading=!0,this.error=``,this.requestUpdate();try{this.applyStatus(await this.request(`/api/lan-access/status`))}catch(e){this.error=e instanceof Error?e.message:k(`requestFailed`)}finally{this.loading=!1,this.requestUpdate()}}updatePassword(e){this.password=e,this.requestUpdate()}updateEnabled(e){this.enabled=e,this.requestUpdate()}updateTtl(e){this.sessionTtlHours=Number(e)||12,this.requestUpdate()}async saveSettings(){if(!this.saving){if(this.enabled&&!this.hasPassword&&!this.password.trim()){this.error=k(`lanAccessPasswordRequired`),this.requestUpdate();return}if(this.password.trim()&&this.password.trim().length<8){this.error=k(`lanAccessPasswordTooShort`),this.requestUpdate();return}if(!(this.enabled&&!await C({description:k(`lanAccessEnableConfirm`),confirmLabel:k(`enabled`),cancelLabel:k(`cancel`)}))){this.saving=!0,this.error=``,this.message=``,this.requestUpdate();try{let e=await this.request(`/api/lan-access/settings`,{method:`PUT`,body:JSON.stringify({enabled:this.enabled,password:this.password.trim()||void 0,sessionTtlHours:this.sessionTtlHours})});this.applyStatus(e),this.password=``,this.message=k(`lanAccessSaved`)}catch(e){this.error=e instanceof Error?e.message:k(`requestFailed`)}finally{this.saving=!1,this.requestUpdate()}}}}async revokeAll(){if(await C({description:k(`lanAccessRevokeAllConfirm`),confirmLabel:k(`lanAccessRevokeAll`),cancelLabel:k(`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=k(`lanAccessRevoked`)}catch(e){this.error=e instanceof Error?e.message:k(`requestFailed`)}finally{this.saving=!1,this.requestUpdate()}}}renderSwitch(e,t,n=!1){return _`
957
+ `}},H=`quickforge-archived-conversations-settings-tab`;customElements.get(H)||customElements.define(H,lt);function ut(){return document.createElement(H)}function dt(){return Array.from({length:16},()=>`ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz23456789!@#$%^&*`[Math.floor(Math.random()*65)]).join(``)}var ft=class extends _{loading=!0;saving=!1;enabled=!1;hasPassword=!1;password=``;sessionTtlHours=12;activeTokenCount=0;lanUrls=[];error=``;message=``;getTabName(){return O(`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||O(`requestFailed`));return r}applyStatus(e){this.enabled=!!e.enabled,this.hasPassword=!!e.hasPassword,this.sessionTtlHours=Number(e.sessionTtlHours||12),this.activeTokenCount=Number(e.activeTokenCount||0),this.lanUrls=Array.isArray(e.lanUrls)?e.lanUrls:[]}async loadStatus(){this.loading=!0,this.error=``,this.requestUpdate();try{this.applyStatus(await this.request(`/api/lan-access/status`))}catch(e){this.error=e instanceof Error?e.message:O(`requestFailed`)}finally{this.loading=!1,this.requestUpdate()}}updatePassword(e){this.password=e,this.requestUpdate()}updateEnabled(e){this.enabled=e,this.requestUpdate()}updateTtl(e){this.sessionTtlHours=Number(e)||12,this.requestUpdate()}async saveSettings(){if(!this.saving){if(this.enabled&&!this.hasPassword&&!this.password.trim()){this.error=O(`lanAccessPasswordRequired`),this.requestUpdate();return}if(this.password.trim()&&this.password.trim().length<8){this.error=O(`lanAccessPasswordTooShort`),this.requestUpdate();return}if(!(this.enabled&&!await C({description:O(`lanAccessEnableConfirm`),confirmLabel:O(`enabled`),cancelLabel:O(`cancel`)}))){this.saving=!0,this.error=``,this.message=``,this.requestUpdate();try{let e=await this.request(`/api/lan-access/settings`,{method:`PUT`,body:JSON.stringify({enabled:this.enabled,password:this.password.trim()||void 0,sessionTtlHours:this.sessionTtlHours})});this.applyStatus(e),this.password=``,this.message=O(`lanAccessSaved`)}catch(e){this.error=e instanceof Error?e.message:O(`requestFailed`)}finally{this.saving=!1,this.requestUpdate()}}}}async revokeAll(){if(await C({description:O(`lanAccessRevokeAllConfirm`),confirmLabel:O(`lanAccessRevokeAll`),cancelLabel:O(`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=O(`lanAccessRevoked`)}catch(e){this.error=e instanceof Error?e.message:O(`requestFailed`)}finally{this.saving=!1,this.requestUpdate()}}}renderSwitch(e,t,n=!1){return g`
947
958
  <label class="quickforge-settings-switch" aria-disabled=${n?`true`:`false`}>
948
959
  <input
949
960
  type="checkbox"
@@ -953,48 +964,48 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,Ft as n,It as r
953
964
  />
954
965
  <span aria-hidden="true"></span>
955
966
  </label>
956
- `}render(){return this.loading?_`<div class="text-sm text-muted-foreground">${k(`loading`)}</div>`:_`
967
+ `}render(){return this.loading?g`<div class="text-sm text-muted-foreground">${O(`loading`)}</div>`:g`
957
968
  <div class="quickforge-settings-stack">
958
- <div class="quickforge-settings-warning">${k(`lanAccessRiskWarning`)}</div>
969
+ <div class="quickforge-settings-warning">${O(`lanAccessRiskWarning`)}</div>
959
970
 
960
- <section class="quickforge-settings-section" aria-label=${k(`lanAccessStatus`)}>
971
+ <section class="quickforge-settings-section" aria-label=${O(`lanAccessStatus`)}>
961
972
  <div class="quickforge-settings-row">
962
973
  <div class="quickforge-settings-row-main">
963
- <div class="quickforge-settings-row-title">${k(`lanAccessEnabled`)}</div>
964
- <div class="quickforge-settings-row-description">${k(`lanAccessEnabledDescription`)}</div>
974
+ <div class="quickforge-settings-row-title">${O(`lanAccessEnabled`)}</div>
975
+ <div class="quickforge-settings-row-description">${O(`lanAccessEnabledDescription`)}</div>
965
976
  </div>
966
- <div class="quickforge-settings-row-control quickforge-settings-readonly-value">${this.enabled?k(`enabled`):k(`disabled`)}</div>
977
+ <div class="quickforge-settings-row-control quickforge-settings-readonly-value">${this.enabled?O(`enabled`):O(`disabled`)}</div>
967
978
  </div>
968
979
  <div class="quickforge-settings-row">
969
980
  <div class="quickforge-settings-row-main">
970
- <div class="quickforge-settings-row-title">${k(`lanAccessPassword`)}</div>
971
- <div class="quickforge-settings-row-description">${k(`lanAccessPasswordStatusDescription`)}</div>
981
+ <div class="quickforge-settings-row-title">${O(`lanAccessPassword`)}</div>
982
+ <div class="quickforge-settings-row-description">${O(`lanAccessPasswordStatusDescription`)}</div>
972
983
  </div>
973
- <div class="quickforge-settings-row-control quickforge-settings-readonly-value">${this.hasPassword?k(`configured`):k(`notConfigured`)}</div>
984
+ <div class="quickforge-settings-row-control quickforge-settings-readonly-value">${this.hasPassword?O(`configured`):O(`notConfigured`)}</div>
974
985
  </div>
975
986
  <div class="quickforge-settings-row">
976
987
  <div class="quickforge-settings-row-main">
977
- <div class="quickforge-settings-row-title">${k(`lanAccessActiveDevices`)}</div>
978
- <div class="quickforge-settings-row-description">${k(`lanAccessActiveDevicesDescription`)}</div>
988
+ <div class="quickforge-settings-row-title">${O(`lanAccessActiveDevices`)}</div>
989
+ <div class="quickforge-settings-row-description">${O(`lanAccessActiveDevicesDescription`)}</div>
979
990
  </div>
980
991
  <div class="quickforge-settings-row-control quickforge-settings-readonly-value">${this.activeTokenCount}</div>
981
992
  </div>
982
993
  <div class="quickforge-settings-row">
983
994
  <div class="quickforge-settings-row-main">
984
- <div class="quickforge-settings-row-title">${k(`lanAccessUrls`)}</div>
985
- <div class="quickforge-settings-row-description">${k(`lanAccessUrlsDescription`)}</div>
995
+ <div class="quickforge-settings-row-title">${O(`lanAccessUrls`)}</div>
996
+ <div class="quickforge-settings-row-description">${O(`lanAccessUrlsDescription`)}</div>
986
997
  </div>
987
998
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide quickforge-settings-readonly-value">
988
- ${this.lanUrls.length?this.lanUrls.map(e=>_`<div>${e}</div>`):`-`}
999
+ ${this.lanUrls.length?this.lanUrls.map(e=>g`<div>${e}</div>`):`-`}
989
1000
  </div>
990
1001
  </div>
991
1002
  </section>
992
1003
 
993
- <section class="quickforge-settings-section" aria-label=${k(`lanAccess`)}>
1004
+ <section class="quickforge-settings-section" aria-label=${O(`lanAccess`)}>
994
1005
  <div class="quickforge-settings-row">
995
1006
  <div class="quickforge-settings-row-main">
996
- <div class="quickforge-settings-row-title">${k(`lanAccessAllowFull`)}</div>
997
- <div class="quickforge-settings-row-description">${k(`lanAccessAllowFullDescription`)}</div>
1007
+ <div class="quickforge-settings-row-title">${O(`lanAccessAllowFull`)}</div>
1008
+ <div class="quickforge-settings-row-description">${O(`lanAccessAllowFullDescription`)}</div>
998
1009
  </div>
999
1010
  <div class="quickforge-settings-row-control">
1000
1011
  ${this.renderSwitch(this.enabled,e=>this.updateEnabled(e),this.saving)}
@@ -1003,8 +1014,8 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,Ft as n,It as r
1003
1014
 
1004
1015
  <div class="quickforge-settings-row">
1005
1016
  <div class="quickforge-settings-row-main">
1006
- <div class="quickforge-settings-row-title">${k(`lanAccessPassword`)}</div>
1007
- <div class="quickforge-settings-row-description">${this.hasPassword?k(`lanAccessPasswordPlaceholderConfigured`):k(`lanAccessPasswordPlaceholder`)}</div>
1017
+ <div class="quickforge-settings-row-title">${O(`lanAccessPassword`)}</div>
1018
+ <div class="quickforge-settings-row-description">${this.hasPassword?O(`lanAccessPasswordPlaceholderConfigured`):O(`lanAccessPasswordPlaceholder`)}</div>
1008
1019
  </div>
1009
1020
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide quickforge-lan-password-control">
1010
1021
  <input
@@ -1012,53 +1023,53 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,Ft as n,It as r
1012
1023
  type="password"
1013
1024
  .value=${this.password}
1014
1025
  @input=${e=>this.updatePassword(e.target.value)}
1015
- placeholder=${this.hasPassword?k(`lanAccessPasswordPlaceholderConfigured`):k(`lanAccessPasswordPlaceholder`)}
1026
+ placeholder=${this.hasPassword?O(`lanAccessPasswordPlaceholderConfigured`):O(`lanAccessPasswordPlaceholder`)}
1016
1027
  />
1017
1028
  <button
1018
1029
  class="quickforge-settings-button quickforge-settings-button-secondary"
1019
1030
  type="button"
1020
- @click=${()=>this.updatePassword(ut())}
1031
+ @click=${()=>this.updatePassword(dt())}
1021
1032
  >
1022
- ${k(`generatePassword`)}
1033
+ ${O(`generatePassword`)}
1023
1034
  </button>
1024
1035
  </div>
1025
1036
  </div>
1026
1037
 
1027
1038
  <div class="quickforge-settings-row">
1028
1039
  <div class="quickforge-settings-row-main">
1029
- <div class="quickforge-settings-row-title">${k(`lanAccessSessionTtl`)}</div>
1030
- <div class="quickforge-settings-row-description">${k(`lanAccessSessionTtlDescription`)}</div>
1040
+ <div class="quickforge-settings-row-title">${O(`lanAccessSessionTtl`)}</div>
1041
+ <div class="quickforge-settings-row-description">${O(`lanAccessSessionTtlDescription`)}</div>
1031
1042
  </div>
1032
1043
  <div class="quickforge-settings-row-control">
1033
1044
  <select class="quickforge-settings-select" .value=${String(this.sessionTtlHours)} @change=${e=>this.updateTtl(e.target.value)}>
1034
- <option value="1">1 ${k(`hour`)}</option>
1035
- <option value="12">12 ${k(`hours`)}</option>
1036
- <option value="24">24 ${k(`hours`)}</option>
1037
- <option value="168">7 ${k(`days`)}</option>
1045
+ <option value="1">1 ${O(`hour`)}</option>
1046
+ <option value="12">12 ${O(`hours`)}</option>
1047
+ <option value="24">24 ${O(`hours`)}</option>
1048
+ <option value="168">7 ${O(`days`)}</option>
1038
1049
  </select>
1039
1050
  </div>
1040
1051
  </div>
1041
1052
 
1042
1053
  <div class="quickforge-settings-row">
1043
1054
  <div class="quickforge-settings-row-main">
1044
- <div class="quickforge-settings-row-title">${k(`lanAccessActions`)}</div>
1045
- <div class="quickforge-settings-row-description">${k(`lanAccessActionsDescription`)}</div>
1055
+ <div class="quickforge-settings-row-title">${O(`lanAccessActions`)}</div>
1056
+ <div class="quickforge-settings-row-description">${O(`lanAccessActionsDescription`)}</div>
1046
1057
  </div>
1047
1058
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide">
1048
1059
  <button class="quickforge-settings-button quickforge-settings-button-primary" type="button" ?disabled=${this.saving} @click=${()=>this.saveSettings()}>
1049
- ${this.saving?k(`saving`):k(`save`)}
1060
+ ${this.saving?O(`saving`):O(`save`)}
1050
1061
  </button>
1051
1062
  <button class="quickforge-settings-button quickforge-settings-button-danger" type="button" ?disabled=${this.saving} @click=${()=>this.revokeAll()}>
1052
- ${k(`lanAccessRevokeAll`)}
1063
+ ${O(`lanAccessRevokeAll`)}
1053
1064
  </button>
1054
1065
  </div>
1055
1066
  </div>
1056
1067
  </section>
1057
1068
 
1058
- ${this.message?_`<div class="quickforge-settings-message">${this.message}</div>`:null}
1059
- ${this.error?_`<div class="quickforge-settings-alert">${this.error}</div>`:null}
1069
+ ${this.message?g`<div class="quickforge-settings-message">${this.message}</div>`:null}
1070
+ ${this.error?g`<div class="quickforge-settings-alert">${this.error}</div>`:null}
1060
1071
  </div>
1061
- `}},W=`quickforge-lan-access-settings-tab`;customElements.get(W)||customElements.define(W,dt);function ft(){return document.createElement(W)}var pt=18e4,mt=3e4,ht=1e3,gt=`https://github.com/shawnstack/quickforge/releases/latest`;function G(){if(typeof document>`u`)return!1;let e=window;return document.body.classList.contains(`quickforge-desktop-app`)||e.__quickforgeDesktopApp===!0}function _t(e){return new Promise(t=>window.setTimeout(t,e))}var vt=[{value:`startup`,label:()=>k(`frequencyStartup`)},{value:`daily`,label:()=>k(`frequencyDaily`)},{value:`weekly`,label:()=>k(`frequencyWeekly`)},{value:`off`,label:()=>k(`frequencyOff`)}],yt=class extends v{about;updateInfo;loading=!0;checking=!1;updating=!1;restarting=!1;message=``;error=``;frequency=_e.frequency;lastCheckAt=null;serviceStatus;getTabName(){return k(`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||k(`requestFailed`));this.about=t;try{let[e,t]=await Promise.all([me(y()),this.loadServiceStatus()]);this.frequency=e.frequency,this.lastCheckAt=e.lastCheckAt,this.serviceStatus=t}catch{}}catch(e){this.error=e instanceof Error?e.message:k(`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||k(`requestFailed`));return t}async checkUpdate(){if(!(this.checking||this.updating)){if(G()){window.open(gt,`_blank`,`noopener,noreferrer`),this.message=k(`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||k(`updateCheckFailed`));this.updateInfo=t,this.about=t,this.updateInfo.updateAvailable?this.message=k(`updateAvailableMessage`,{current:this.updateInfo.currentVersion,latest:this.updateInfo.latestVersion}):this.updateInfo.localVersionIsNewer?this.message=k(`localVersionNewerMessage`,{current:this.updateInfo.currentVersion,latest:this.updateInfo.latestVersion}):this.message=k(`alreadyLatestVersion`,{version:this.updateInfo.currentVersion})}catch(e){this.error=e instanceof Error?e.message:k(`updateCheckFailed`)}finally{this.checking=!1,this.requestUpdate()}}}async pollUntilUpdated(e){let t=Date.now();for(;Date.now()-t<pt;){await _t(ht);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=k(`updateRestarted`),this.requestUpdate(),window.setTimeout(()=>window.location.reload(),300);return}}catch{}}throw Error(k(`updateRestartTimeout`))}async pollUntilRestarted(e){let t=Date.now();for(;Date.now()-t<mt;){await _t(ht);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=k(`backendRestarted`),this.requestUpdate(),window.setTimeout(()=>window.location.reload(),300);return}}catch{}}throw Error(k(`backendRestartTimeout`))}async restartService(){if(!this.serviceStatus||this.restarting||!await C({description:k(`restartBackendConfirm`),confirmLabel:k(`restartBackendService`),cancelLabel:k(`cancel`)}))return;this.restarting=!0,this.message=k(`backendRestarting`),this.error=``,this.requestUpdate();let e=this.serviceStatus.bootId;try{let t=await fetch(`/api/system/restart`,{method:`POST`,headers:{"x-quickforge-action":`restart`}}),n=await t.json().catch(()=>null);if(!t.ok)throw Error(n?.error||k(`backendRestartFailed`));await this.pollUntilRestarted(e)}catch(e){this.error=e instanceof Error?e.message:k(`backendRestartFailed`),this.message=``,this.restarting=!1,this.requestUpdate()}}async updateQuickForge(){if(G()){window.open(gt,`_blank`,`noopener,noreferrer`),this.message=k(`desktopUpdateHint`),this.error=``,this.requestUpdate();return}if(!(!this.updateInfo?.updateAvailable||this.updating)&&await C({description:k(`updateConfirm`,{command:this.updateInfo.installCommand}),confirmLabel:k(`updateRuntimeNow`),cancelLabel:k(`cancel`)})){this.updating=!0,this.message=k(`updatingQuickForge`),this.error=``,this.requestUpdate();try{let e=await fetch(`/api/system/update`,{method:`POST`,headers:{"x-quickforge-action":`update`}}),t=await e.json().catch(()=>null);if(!e.ok)throw Error(t?.error||k(`updateFailed`));if(this.updateInfo=t,t?.updateStarted){let e=t.logFile?` ${k(`updateLogFile`,{path:t.logFile})}`:``;this.message=`${k(`updateStarted`)}${e}`,this.requestUpdate(),await this.pollUntilUpdated(t.bootId)}else this.message=t?.updated?k(`updateCompleted`):k(`alreadyLatestVersion`,{version:t?.currentVersion||this.about?.version||`-`}),this.updating=!1}catch(e){this.error=e instanceof Error?e.message:k(`updateFailed`),this.message=``,this.updating=!1}finally{this.requestUpdate()}}}async selectFrequency(e){if(this.frequency!==e){this.frequency=e,this.requestUpdate();try{let t=y();await Ce(t,{...await me(t),frequency:e}),this.error=``}catch(e){this.error=e instanceof Error?e.message:k(`requestFailed`)}finally{this.requestUpdate()}}}renderFrequencyOption(e){let t=this.frequency===e.value;return _`
1072
+ `}},U=`quickforge-lan-access-settings-tab`;customElements.get(U)||customElements.define(U,ft);function pt(){return document.createElement(U)}var mt=18e4,ht=3e4,gt=1e3,_t=`https://github.com/shawnstack/quickforge/releases/latest`;function W(){if(typeof document>`u`)return!1;let e=window;return document.body.classList.contains(`quickforge-desktop-app`)||e.__quickforgeDesktopApp===!0}function vt(e){return new Promise(t=>window.setTimeout(t,e))}var yt=[{value:`startup`,label:()=>O(`frequencyStartup`)},{value:`daily`,label:()=>O(`frequencyDaily`)},{value:`weekly`,label:()=>O(`frequencyWeekly`)},{value:`off`,label:()=>O(`frequencyOff`)}],bt=class extends _{about;updateInfo;loading=!0;checking=!1;updating=!1;restarting=!1;message=``;error=``;frequency=fe.frequency;lastCheckAt=null;serviceStatus;getTabName(){return O(`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||O(`requestFailed`));this.about=t;try{let[e,t]=await Promise.all([ie(v()),this.loadServiceStatus()]);this.frequency=e.frequency,this.lastCheckAt=e.lastCheckAt,this.serviceStatus=t}catch{}}catch(e){this.error=e instanceof Error?e.message:O(`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||O(`requestFailed`));return t}async checkUpdate(){if(!(this.checking||this.updating)){if(W()){window.open(_t,`_blank`,`noopener,noreferrer`),this.message=O(`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||O(`updateCheckFailed`));this.updateInfo=t,this.about=t,this.updateInfo.updateAvailable?this.message=O(`updateAvailableMessage`,{current:this.updateInfo.currentVersion,latest:this.updateInfo.latestVersion}):this.updateInfo.localVersionIsNewer?this.message=O(`localVersionNewerMessage`,{current:this.updateInfo.currentVersion,latest:this.updateInfo.latestVersion}):this.message=O(`alreadyLatestVersion`,{version:this.updateInfo.currentVersion})}catch(e){this.error=e instanceof Error?e.message:O(`updateCheckFailed`)}finally{this.checking=!1,this.requestUpdate()}}}async pollUntilUpdated(e){let t=Date.now();for(;Date.now()-t<mt;){await vt(gt);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=O(`updateRestarted`),this.requestUpdate(),window.setTimeout(()=>window.location.reload(),300);return}}catch{}}throw Error(O(`updateRestartTimeout`))}async pollUntilRestarted(e){let t=Date.now();for(;Date.now()-t<ht;){await vt(gt);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=O(`backendRestarted`),this.requestUpdate(),window.setTimeout(()=>window.location.reload(),300);return}}catch{}}throw Error(O(`backendRestartTimeout`))}async restartService(){if(!this.serviceStatus||this.restarting||!await C({description:O(`restartBackendConfirm`),confirmLabel:O(`restartBackendService`),cancelLabel:O(`cancel`)}))return;this.restarting=!0,this.message=O(`backendRestarting`),this.error=``,this.requestUpdate();let e=this.serviceStatus.bootId;try{let t=await fetch(`/api/system/restart`,{method:`POST`,headers:{"x-quickforge-action":`restart`}}),n=await t.json().catch(()=>null);if(!t.ok)throw Error(n?.error||O(`backendRestartFailed`));await this.pollUntilRestarted(e)}catch(e){this.error=e instanceof Error?e.message:O(`backendRestartFailed`),this.message=``,this.restarting=!1,this.requestUpdate()}}async updateQuickForge(){if(W()){window.open(_t,`_blank`,`noopener,noreferrer`),this.message=O(`desktopUpdateHint`),this.error=``,this.requestUpdate();return}if(!(!this.updateInfo?.updateAvailable||this.updating)&&await C({description:O(`updateConfirm`,{command:this.updateInfo.installCommand}),confirmLabel:O(`updateRuntimeNow`),cancelLabel:O(`cancel`)})){this.updating=!0,this.message=O(`updatingQuickForge`),this.error=``,this.requestUpdate();try{let e=await fetch(`/api/system/update`,{method:`POST`,headers:{"x-quickforge-action":`update`}}),t=await e.json().catch(()=>null);if(!e.ok)throw Error(t?.error||O(`updateFailed`));if(this.updateInfo=t,t?.updateStarted){let e=t.logFile?` ${O(`updateLogFile`,{path:t.logFile})}`:``;this.message=`${O(`updateStarted`)}${e}`,this.requestUpdate(),await this.pollUntilUpdated(t.bootId)}else this.message=t?.updated?O(`updateCompleted`):O(`alreadyLatestVersion`,{version:t?.currentVersion||this.about?.version||`-`}),this.updating=!1}catch(e){this.error=e instanceof Error?e.message:O(`updateFailed`),this.message=``,this.updating=!1}finally{this.requestUpdate()}}}async selectFrequency(e){if(this.frequency!==e){this.frequency=e,this.requestUpdate();try{let t=v();await Te(t,{...await ie(t),frequency:e}),this.error=``}catch(e){this.error=e instanceof Error?e.message:O(`requestFailed`)}finally{this.requestUpdate()}}}renderFrequencyOption(e){let t=this.frequency===e.value;return g`
1062
1073
  <button
1063
1074
  type="button"
1064
1075
  class="quickforge-settings-segmented-option ${t?`quickforge-settings-segmented-option-active`:``}"
@@ -1067,25 +1078,25 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,Ft as n,It as r
1067
1078
  >
1068
1079
  ${e.label()}
1069
1080
  </button>
1070
- `}infoRows(){let e=this.about;return e?_`
1081
+ `}infoRows(){let e=this.about;return e?g`
1071
1082
  <div class="quickforge-settings-row">
1072
1083
  <div class="quickforge-settings-row-main">
1073
- <div class="quickforge-settings-row-title">${k(`packageName`)}</div>
1074
- <div class="quickforge-settings-row-description">${k(`packageNameDescription`)}</div>
1084
+ <div class="quickforge-settings-row-title">${O(`packageName`)}</div>
1085
+ <div class="quickforge-settings-row-description">${O(`packageNameDescription`)}</div>
1075
1086
  </div>
1076
1087
  <div class="quickforge-settings-row-control quickforge-settings-readonly-value">${e.name}</div>
1077
1088
  </div>
1078
1089
  <div class="quickforge-settings-row">
1079
1090
  <div class="quickforge-settings-row-main">
1080
- <div class="quickforge-settings-row-title">${k(`currentVersion`)}</div>
1081
- <div class="quickforge-settings-row-description">${k(`currentVersionDescription`)}</div>
1091
+ <div class="quickforge-settings-row-title">${O(`currentVersion`)}</div>
1092
+ <div class="quickforge-settings-row-description">${O(`currentVersionDescription`)}</div>
1082
1093
  </div>
1083
1094
  <div class="quickforge-settings-row-control quickforge-settings-readonly-value">${e.version}</div>
1084
1095
  </div>
1085
1096
  <div class="quickforge-settings-row">
1086
1097
  <div class="quickforge-settings-row-main">
1087
- <div class="quickforge-settings-row-title">${k(`github`)}</div>
1088
- <div class="quickforge-settings-row-description">${k(`githubDescription`)}</div>
1098
+ <div class="quickforge-settings-row-title">${O(`github`)}</div>
1099
+ <div class="quickforge-settings-row-description">${O(`githubDescription`)}</div>
1089
1100
  </div>
1090
1101
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide quickforge-settings-readonly-value">
1091
1102
  <a class="quickforge-settings-link" href=${e.repositoryUrl} target="_blank" rel="noreferrer">
@@ -1093,35 +1104,35 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,Ft as n,It as r
1093
1104
  </a>
1094
1105
  </div>
1095
1106
  </div>
1096
- `:null}updateStatus(){return this.updateInfo?_`
1107
+ `:null}updateStatus(){return this.updateInfo?g`
1097
1108
  <div class="quickforge-settings-row">
1098
1109
  <div class="quickforge-settings-row-main">
1099
- <div class="quickforge-settings-row-title">${k(`latestVersion`)}</div>
1100
- <div class="quickforge-settings-row-description">${k(`latestVersionDescription`)}</div>
1110
+ <div class="quickforge-settings-row-title">${O(`latestVersion`)}</div>
1111
+ <div class="quickforge-settings-row-description">${O(`latestVersionDescription`)}</div>
1101
1112
  </div>
1102
1113
  <div class="quickforge-settings-row-control quickforge-settings-readonly-value">${this.updateInfo.latestVersion}</div>
1103
1114
  </div>
1104
- ${this.updateInfo.logFile?_`
1115
+ ${this.updateInfo.logFile?g`
1105
1116
  <div class="quickforge-settings-row">
1106
1117
  <div class="quickforge-settings-row-main">
1107
- <div class="quickforge-settings-row-title">${k(`updateLog`)}</div>
1108
- <div class="quickforge-settings-row-description">${k(`updateLogDescription`)}</div>
1118
+ <div class="quickforge-settings-row-title">${O(`updateLog`)}</div>
1119
+ <div class="quickforge-settings-row-description">${O(`updateLogDescription`)}</div>
1109
1120
  </div>
1110
1121
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide quickforge-settings-readonly-value">
1111
1122
  <code>${this.updateInfo.logFile}</code>
1112
1123
  </div>
1113
1124
  </div>
1114
1125
  `:null}
1115
- `:null}restartSection(){let e=this.serviceStatus?.restartUnsupportedReason||k(`backendRestartUnsupported`),t=this.restarting||!this.serviceStatus?.restartSupported;return _`
1116
- <section class="quickforge-settings-section" aria-label=${k(`restartBackendService`)}>
1126
+ `:null}restartSection(){let e=this.serviceStatus?.restartUnsupportedReason||O(`backendRestartUnsupported`),t=this.restarting||!this.serviceStatus?.restartSupported;return g`
1127
+ <section class="quickforge-settings-section" aria-label=${O(`restartBackendService`)}>
1117
1128
  <div class="quickforge-settings-row">
1118
1129
  <div class="quickforge-settings-row-main">
1119
1130
  <div class="quickforge-settings-row-title">
1120
- ${k(`restartBackendService`)}
1121
- <quickforge-info-tip .label=${k(`restartBackendServiceDescription`)}></quickforge-info-tip>
1131
+ ${O(`restartBackendService`)}
1132
+ <quickforge-info-tip .label=${O(`restartBackendServiceDescription`)}></quickforge-info-tip>
1122
1133
  </div>
1123
1134
  <div class="quickforge-settings-row-description">
1124
- ${this.serviceStatus?.restartSupported?k(`restartBackendServiceDescription`):e}
1135
+ ${this.serviceStatus?.restartSupported?O(`restartBackendServiceDescription`):e}
1125
1136
  </div>
1126
1137
  </div>
1127
1138
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide">
@@ -1131,32 +1142,32 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,Ft as n,It as r
1131
1142
  ?disabled=${t}
1132
1143
  @click=${()=>this.restartService()}
1133
1144
  >
1134
- ${this.restarting?k(`backendRestarting`):k(`restartBackendService`)}
1145
+ ${this.restarting?O(`backendRestarting`):O(`restartBackendService`)}
1135
1146
  </button>
1136
1147
  </div>
1137
1148
  </div>
1138
1149
  </section>
1139
- `}render(){if(this.loading)return _`<div class="text-sm text-muted-foreground">${k(`loading`)}</div>`;let e=this.checking||this.updating||!this.updateInfo?.updateAvailable,t=G();return _`
1150
+ `}render(){if(this.loading)return g`<div class="text-sm text-muted-foreground">${O(`loading`)}</div>`;let e=this.checking||this.updating||!this.updateInfo?.updateAvailable,t=W();return g`
1140
1151
  <div class="quickforge-settings-stack">
1141
- <section class="quickforge-settings-section" aria-label=${k(`projectInfo`)}>
1152
+ <section class="quickforge-settings-section" aria-label=${O(`projectInfo`)}>
1142
1153
  ${this.infoRows()}
1143
1154
  </section>
1144
1155
 
1145
- <section class="quickforge-settings-section" aria-label=${k(t?`desktopUpdates`:`runtimeUpdates`)}>
1146
- ${t?null:_`
1156
+ <section class="quickforge-settings-section" aria-label=${O(t?`desktopUpdates`:`runtimeUpdates`)}>
1157
+ ${t?null:g`
1147
1158
  <div class="quickforge-settings-row">
1148
1159
  <div class="quickforge-settings-row-main">
1149
1160
  <div class="quickforge-settings-row-title">
1150
- ${k(`updateFrequencySection`)}
1151
- <quickforge-info-tip .label=${k(`updateFrequencyDescription`)}></quickforge-info-tip>
1161
+ ${O(`updateFrequencySection`)}
1162
+ <quickforge-info-tip .label=${O(`updateFrequencyDescription`)}></quickforge-info-tip>
1152
1163
  </div>
1153
1164
  <div class="quickforge-settings-row-description">
1154
- ${this.lastCheckAt?k(`lastCheckedAt`,{time:new Date(this.lastCheckAt).toLocaleString(xe())}):k(`lastCheckedNever`)}
1165
+ ${this.lastCheckAt?O(`lastCheckedAt`,{time:new Date(this.lastCheckAt).toLocaleString(ye())}):O(`lastCheckedNever`)}
1155
1166
  </div>
1156
1167
  </div>
1157
1168
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide">
1158
- <div class="quickforge-settings-segmented quickforge-settings-segmented-wrap" role="group" aria-label=${k(`updateFrequencySection`)}>
1159
- ${vt.map(e=>this.renderFrequencyOption(e))}
1169
+ <div class="quickforge-settings-segmented quickforge-settings-segmented-wrap" role="group" aria-label=${O(`updateFrequencySection`)}>
1170
+ ${yt.map(e=>this.renderFrequencyOption(e))}
1160
1171
  </div>
1161
1172
  </div>
1162
1173
  </div>
@@ -1167,11 +1178,11 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,Ft as n,It as r
1167
1178
  <div class="quickforge-settings-row">
1168
1179
  <div class="quickforge-settings-row-main">
1169
1180
  <div class="quickforge-settings-row-title">
1170
- ${k(t?`desktopUpdates`:`runtimeUpdates`)}
1171
- <quickforge-info-tip .label=${k(t?`desktopUpdatesDescription`:`runtimeUpdatesDescription`)}></quickforge-info-tip>
1181
+ ${O(t?`desktopUpdates`:`runtimeUpdates`)}
1182
+ <quickforge-info-tip .label=${O(t?`desktopUpdatesDescription`:`runtimeUpdatesDescription`)}></quickforge-info-tip>
1172
1183
  </div>
1173
1184
  <div class="quickforge-settings-row-description">
1174
- ${k(t?`desktopUpdatesDescription`:`runtimeUpdatesDescription`)}
1185
+ ${O(t?`desktopUpdatesDescription`:`runtimeUpdatesDescription`)}
1175
1186
  </div>
1176
1187
  </div>
1177
1188
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide">
@@ -1181,16 +1192,16 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,Ft as n,It as r
1181
1192
  ?disabled=${this.checking||this.updating}
1182
1193
  @click=${()=>this.checkUpdate()}
1183
1194
  >
1184
- ${this.checking?k(`checkingUpdate`):k(t?`openDesktopReleases`:`checkRuntimeUpdate`)}
1195
+ ${this.checking?O(`checkingUpdate`):O(t?`openDesktopReleases`:`checkRuntimeUpdate`)}
1185
1196
  </button>
1186
- ${t?null:_`
1197
+ ${t?null:g`
1187
1198
  <button
1188
1199
  class="quickforge-settings-button quickforge-settings-button-primary"
1189
1200
  type="button"
1190
1201
  ?disabled=${e}
1191
1202
  @click=${()=>this.updateQuickForge()}
1192
1203
  >
1193
- ${this.updating?k(`updatingQuickForge`):k(`updateRuntimeNow`)}
1204
+ ${this.updating?O(`updatingQuickForge`):O(`updateRuntimeNow`)}
1194
1205
  </button>
1195
1206
  `}
1196
1207
  </div>
@@ -1199,22 +1210,22 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,Ft as n,It as r
1199
1210
 
1200
1211
  ${this.restartSection()}
1201
1212
 
1202
- ${this.message?_`<div class="quickforge-settings-message">${this.message}</div>`:null}
1203
- ${this.error?_`<div class="quickforge-settings-alert">${this.error}</div>`:null}
1213
+ ${this.message?g`<div class="quickforge-settings-message">${this.message}</div>`:null}
1214
+ ${this.error?g`<div class="quickforge-settings-alert">${this.error}</div>`:null}
1204
1215
  </div>
1205
- `}},K=`quickforge-about-settings-tab`;customElements.get(K)||customElements.define(K,yt);function bt(){return document.createElement(K)}var xt=class extends v{loading=!0;saving=!1;saved=!1;error=``;message=``;projects=[];project;commandDir=``;commands=[];loadingCommands=!1;saveTimer=null;lastSavedCommandDir=``;pendingSaveAfterCurrent=!1;getTabName(){return k(`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||k(`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:k(`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:k(`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:k(`requestFailed`),this.requestUpdate()}}}async createCommand(){if(!this.project)return;let e=window.prompt(k(`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=k(`commandCreated`,{name:t.name??e.trim()}),await this.loadCommands()):t.reason===`exists`?this.error=k(`commandAlreadyExists`,{name:t.name??e.trim()}):this.error=k(`invalidCommandName`)}catch(e){this.error=e instanceof Error?e.message:k(`requestFailed`)}finally{this.requestUpdate()}}}render(){return this.loading?_`<div class="quickforge-settings-note">${k(`loading`)}</div>`:this.projects.length===0?_`
1216
+ `}},G=`quickforge-about-settings-tab`;customElements.get(G)||customElements.define(G,bt);function xt(){return document.createElement(G)}var St=class extends _{loading=!0;saving=!1;saved=!1;error=``;message=``;projects=[];project;commandDir=``;commands=[];loadingCommands=!1;saveTimer=null;lastSavedCommandDir=``;pendingSaveAfterCurrent=!1;getTabName(){return O(`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||O(`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:O(`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:O(`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:O(`requestFailed`),this.requestUpdate()}}}async createCommand(){if(!this.project)return;let e=window.prompt(O(`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=O(`commandCreated`,{name:t.name??e.trim()}),await this.loadCommands()):t.reason===`exists`?this.error=O(`commandAlreadyExists`,{name:t.name??e.trim()}):this.error=O(`invalidCommandName`)}catch(e){this.error=e instanceof Error?e.message:O(`requestFailed`)}finally{this.requestUpdate()}}}render(){return this.loading?g`<div class="quickforge-settings-note">${O(`loading`)}</div>`:this.projects.length===0?g`
1206
1217
  <div class="quickforge-settings-stack">
1207
- <div class="quickforge-settings-note">${k(`selectProjectForCommands`)}</div>
1208
- ${this.error?_`<div class="quickforge-settings-alert">${this.error}</div>`:null}
1218
+ <div class="quickforge-settings-note">${O(`selectProjectForCommands`)}</div>
1219
+ ${this.error?g`<div class="quickforge-settings-alert">${this.error}</div>`:null}
1209
1220
  </div>
1210
- `:_`
1221
+ `:g`
1211
1222
  <div class="quickforge-settings-stack">
1212
- <section class="quickforge-settings-section" aria-label=${k(`projectCommands`)}>
1223
+ <section class="quickforge-settings-section" aria-label=${O(`projectCommands`)}>
1213
1224
  <div class="quickforge-settings-row">
1214
1225
  <div class="quickforge-settings-row-main">
1215
- <div class="quickforge-settings-row-title">${k(`project`)}</div>
1226
+ <div class="quickforge-settings-row-title">${O(`project`)}</div>
1216
1227
  <div class="quickforge-settings-row-description">
1217
- ${this.project?.path?this.project.path:k(`projectCommandsProjectDescription`)}
1228
+ ${this.project?.path?this.project.path:O(`projectCommandsProjectDescription`)}
1218
1229
  </div>
1219
1230
  </div>
1220
1231
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide">
@@ -1223,7 +1234,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,Ft as n,It as r
1223
1234
  .value=${this.project?.id??``}
1224
1235
  @change=${e=>this.selectProject(e)}
1225
1236
  >
1226
- ${this.projects.map(e=>_`<option value=${e.id} ?selected=${e.id===this.project?.id}>${e.name}</option>`)}
1237
+ ${this.projects.map(e=>g`<option value=${e.id} ?selected=${e.id===this.project?.id}>${e.name}</option>`)}
1227
1238
  </select>
1228
1239
  </div>
1229
1240
  </div>
@@ -1231,16 +1242,16 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,Ft as n,It as r
1231
1242
  <div class="quickforge-settings-row quickforge-settings-row-align-start">
1232
1243
  <div class="quickforge-settings-row-main">
1233
1244
  <div class="quickforge-settings-row-title">
1234
- ${k(`commandDirectories`)}
1235
- <quickforge-info-tip .label=${k(`commandDirectoryHelp`)}></quickforge-info-tip>
1245
+ ${O(`commandDirectories`)}
1246
+ <quickforge-info-tip .label=${O(`commandDirectoryHelp`)}></quickforge-info-tip>
1236
1247
  </div>
1237
- <div class="quickforge-settings-row-description">${k(`commandDirectoriesDescription`)}</div>
1248
+ <div class="quickforge-settings-row-description">${O(`commandDirectoriesDescription`)}</div>
1238
1249
  </div>
1239
1250
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide">
1240
1251
  <textarea
1241
1252
  class="quickforge-settings-textarea quickforge-settings-mono"
1242
1253
  .value=${this.commandDir}
1243
- placeholder=${k(`commandDirectoryPlaceholder`)}
1254
+ placeholder=${O(`commandDirectoryPlaceholder`)}
1244
1255
  @input=${e=>this.updateCommandDir(e.target.value)}
1245
1256
  ></textarea>
1246
1257
  </div>
@@ -1248,8 +1259,8 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,Ft as n,It as r
1248
1259
 
1249
1260
  <div class="quickforge-settings-row quickforge-settings-row-align-start">
1250
1261
  <div class="quickforge-settings-row-main">
1251
- <div class="quickforge-settings-row-title">${k(`commandDirectoryExamples`)}</div>
1252
- <div class="quickforge-settings-row-description">${k(`commandDirectoryExamplesDescription`)}</div>
1262
+ <div class="quickforge-settings-row-title">${O(`commandDirectoryExamples`)}</div>
1263
+ <div class="quickforge-settings-row-description">${O(`commandDirectoryExamplesDescription`)}</div>
1253
1264
  </div>
1254
1265
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide quickforge-settings-code-list">
1255
1266
  <code>.ai/commands</code>
@@ -1260,11 +1271,11 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,Ft as n,It as r
1260
1271
  </div>
1261
1272
  </section>
1262
1273
 
1263
- <section class="quickforge-settings-section" aria-label=${k(`loadedCommands`,{count:this.commands.length})}>
1274
+ <section class="quickforge-settings-section" aria-label=${O(`loadedCommands`,{count:this.commands.length})}>
1264
1275
  <div class="quickforge-settings-row">
1265
1276
  <div class="quickforge-settings-row-main">
1266
- <div class="quickforge-settings-row-title">${k(`loadedCommands`,{count:this.commands.length})}</div>
1267
- <div class="quickforge-settings-row-description">${k(`loadedCommandsDescription`)}</div>
1277
+ <div class="quickforge-settings-row-title">${O(`loadedCommands`,{count:this.commands.length})}</div>
1278
+ <div class="quickforge-settings-row-description">${O(`loadedCommandsDescription`)}</div>
1268
1279
  </div>
1269
1280
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide">
1270
1281
  <button
@@ -1273,7 +1284,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,Ft as n,It as r
1273
1284
  ?disabled=${this.loadingCommands}
1274
1285
  @click=${()=>this.openCommandDir()}
1275
1286
  >
1276
- ${k(`openCommandDir`)}
1287
+ ${O(`openCommandDir`)}
1277
1288
  </button>
1278
1289
  <button
1279
1290
  class="quickforge-settings-button quickforge-settings-button-primary"
@@ -1281,41 +1292,41 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,Ft as n,It as r
1281
1292
  ?disabled=${this.loadingCommands}
1282
1293
  @click=${()=>this.createCommand()}
1283
1294
  >
1284
- ${k(`createCommand`)}
1295
+ ${O(`createCommand`)}
1285
1296
  </button>
1286
1297
  </div>
1287
1298
  </div>
1288
1299
 
1289
1300
  <div class="quickforge-settings-nested-list">
1290
- ${this.loadingCommands?_`<div class="quickforge-settings-empty-row">${k(`loading`)}</div>`:this.commands.length===0?_`<div class="quickforge-settings-empty-row">${k(`noCommandsLoaded`)}</div>`:this.commands.map(e=>{let t=e.argumentHint?` ${e.argumentHint}`:``;return _`
1301
+ ${this.loadingCommands?g`<div class="quickforge-settings-empty-row">${O(`loading`)}</div>`:this.commands.length===0?g`<div class="quickforge-settings-empty-row">${O(`noCommandsLoaded`)}</div>`:this.commands.map(e=>{let t=e.argumentHint?` ${e.argumentHint}`:``;return g`
1291
1302
  <div class="quickforge-settings-subrow">
1292
1303
  <div class="quickforge-settings-row-main">
1293
1304
  <div class="quickforge-settings-row-title">
1294
1305
  <code class="quickforge-settings-command-name">/${e.name}${t}</code>
1295
1306
  </div>
1296
1307
  <div class="quickforge-settings-row-description">
1297
- ${e.description||k(`noDescription`)}
1308
+ ${e.description||O(`noDescription`)}
1298
1309
  </div>
1299
1310
  </div>
1300
- ${e.relativePath?_`<div class="quickforge-settings-row-control quickforge-settings-row-control-wide quickforge-settings-readonly-value">${e.relativePath}</div>`:null}
1311
+ ${e.relativePath?g`<div class="quickforge-settings-row-control quickforge-settings-row-control-wide quickforge-settings-readonly-value">${e.relativePath}</div>`:null}
1301
1312
  </div>
1302
1313
  `})}
1303
1314
  </div>
1304
1315
  </section>
1305
1316
 
1306
- ${this.saving?_`<div class="quickforge-settings-note">${k(`saving`)}</div>`:null}
1307
- ${this.saved?_`<div class="quickforge-settings-message">${k(`projectCommandsSaved`)}</div>`:null}
1308
- ${this.message?_`<div class="quickforge-settings-message">${this.message}</div>`:null}
1309
- ${this.error?_`<div class="quickforge-settings-alert">${this.error}</div>`:null}
1317
+ ${this.saving?g`<div class="quickforge-settings-note">${O(`saving`)}</div>`:null}
1318
+ ${this.saved?g`<div class="quickforge-settings-message">${O(`projectCommandsSaved`)}</div>`:null}
1319
+ ${this.message?g`<div class="quickforge-settings-message">${this.message}</div>`:null}
1320
+ ${this.error?g`<div class="quickforge-settings-alert">${this.error}</div>`:null}
1310
1321
  </div>
1311
- `}},q=`quickforge-project-commands-settings-tab`;customElements.get(q)||customElements.define(q,xt);function St(){return document.createElement(q)}var J={"x-quickforge-action":`channel-action`};function Ct(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 wt(e){switch(e){case`starting`:return k(`channelStatusStarting`);case`waiting_scan`:return k(`channelStatusWaitingScan`);case`running`:return k(`channelStatusRunning`);case`stopping`:return k(`channelStatusStopping`);case`error`:return k(`channelStatusError`);default:return k(`channelStatusStopped`)}}function Tt(e){if(!e)return`-`;let t=new Date(e);return Number.isNaN(t.getTime())?e:t.toLocaleString()}var Et=class extends v{loading=!0;channels=[];workspaces=[];selectedWorkspaceIdByChannel={};error=``;message=``;eventSource;busyChannelId=``;getTabName(){return k(`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||k(`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:k(`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:k(`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:k(`requestFailed`)}finally{this.requestUpdate()}}ensureWorkspaceSelections(){let e=new Set(this.workspaces.map(e=>e.id)),t={...this.selectedWorkspaceIdByChannel};for(let n of this.channels){if(!n.supportsWorkspaceSelection)continue;let r=t[n.id],i=n.launchWorkspace?.id,a=n.status!==`stopped`&&n.status!==`error`;if(i&&e.has(i)&&a){t[n.id]=i;continue}r&&e.has(r)||(t[n.id]=i&&e.has(i)?i:`default`)}this.selectedWorkspaceIdByChannel=t}connectEvents(){this.eventSource?.close();let e=new EventSource(`/api/channels/events`);this.eventSource=e;let t=e=>{try{let t=JSON.parse(e.data);this.applyChannelEvent(t)}catch{}};e.addEventListener(`snapshot`,t),e.addEventListener(`status`,t),e.addEventListener(`log`,t),e.addEventListener(`qrcode`,t),e.addEventListener(`error`,()=>{})}applyChannelEvent(e){if(Array.isArray(e.channels)){this.channels=e.channels,this.ensureWorkspaceSelections(),this.requestUpdate();return}if(e.snapshot){this.upsertChannel(e.snapshot);return}if(e.channelId&&e.log){let t=this.channels.find(t=>t.id===e.channelId);t&&(t.logs=[...t.logs||[],e.log].slice(-300),this.requestUpdate())}}upsertChannel(e){let t=this.channels.findIndex(t=>t.id===e.id);t>=0?this.channels=[...this.channels.slice(0,t),e,...this.channels.slice(t+1)]:this.channels=[...this.channels,e],this.ensureWorkspaceSelections(),this.requestUpdate()}selectedWorkspaceId(e){return this.selectedWorkspaceIdByChannel[e.id]||e.launchWorkspace?.id||`default`}handleWorkspaceChange(e,t){let n=t.currentTarget;n&&(this.selectedWorkspaceIdByChannel={...this.selectedWorkspaceIdByChannel,[e.id]:n.value||`default`},this.requestUpdate())}startOptions(e){return e.supportsWorkspaceSelection?{projectId:this.selectedWorkspaceId(e)}:void 0}async invoke(e,t){if(!this.busyChannelId&&!(t===`restart`&&!await C({description:k(`channelRestartConfirm`,{name:e.name}),confirmLabel:k(`restart`),cancelLabel:k(`cancel`)}))){this.busyChannelId=e.id,this.error=``,this.message=``,this.requestUpdate();try{let n=t===`start`||t===`restart`?this.startOptions(e):void 0,r=await this.request(`/api/channels/${encodeURIComponent(e.id)}/${t}`,{method:`POST`,headers:n?{...J,"content-type":`application/json`}:J,body:n?JSON.stringify(n):void 0});this.upsertChannel(r)}catch(e){this.error=e instanceof Error?e.message:k(`requestFailed`)}finally{this.busyChannelId=``,this.requestUpdate()}}}async invokeAction(e,t){if(!this.busyChannelId&&!((t.destructive||t.id===`relogin`)&&!await C({description:t.id===`relogin`?k(`channelReloginConfirm`,{name:e.name}):k(`channelLogoutConfirm`,{name:e.name}),confirmLabel:t.label,cancelLabel:k(`cancel`),variant:t.destructive?`destructive`:void 0}))){this.busyChannelId=e.id,this.error=``,this.message=``,this.requestUpdate();try{let n=t.id===`relogin`?this.startOptions(e):void 0,r=await this.request(`/api/channels/${encodeURIComponent(e.id)}/actions/${encodeURIComponent(t.id)}`,{method:`POST`,headers:n?{...J,"content-type":`application/json`}:J,body:n?JSON.stringify(n):void 0});this.upsertChannel(r)}catch(e){this.error=e instanceof Error?e.message:k(`requestFailed`)}finally{this.busyChannelId=``,this.requestUpdate()}}}workspaceSection(e,t){if(!e.supportsWorkspaceSelection)return null;let n=this.selectedWorkspaceId(e),r=e.launchWorkspace;return _`
1322
+ `}},K=`quickforge-project-commands-settings-tab`;customElements.get(K)||customElements.define(K,St);function Ct(){return document.createElement(K)}var q={"x-quickforge-action":`channel-action`};function wt(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 Tt(e){switch(e){case`starting`:return O(`channelStatusStarting`);case`waiting_scan`:return O(`channelStatusWaitingScan`);case`running`:return O(`channelStatusRunning`);case`stopping`:return O(`channelStatusStopping`);case`error`:return O(`channelStatusError`);default:return O(`channelStatusStopped`)}}function Et(e){if(!e)return`-`;let t=new Date(e);return Number.isNaN(t.getTime())?e:t.toLocaleString()}var Dt=class extends _{loading=!0;channels=[];workspaces=[];selectedWorkspaceIdByChannel={};error=``;message=``;eventSource;busyChannelId=``;getTabName(){return O(`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||O(`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:O(`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:O(`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:O(`requestFailed`)}finally{this.requestUpdate()}}ensureWorkspaceSelections(){let e=new Set(this.workspaces.map(e=>e.id)),t={...this.selectedWorkspaceIdByChannel};for(let n of this.channels){if(!n.supportsWorkspaceSelection)continue;let r=t[n.id],i=n.launchWorkspace?.id,a=n.status!==`stopped`&&n.status!==`error`;if(i&&e.has(i)&&a){t[n.id]=i;continue}r&&e.has(r)||(t[n.id]=i&&e.has(i)?i:`default`)}this.selectedWorkspaceIdByChannel=t}connectEvents(){this.eventSource?.close();let e=new EventSource(`/api/channels/events`);this.eventSource=e;let t=e=>{try{let t=JSON.parse(e.data);this.applyChannelEvent(t)}catch{}};e.addEventListener(`snapshot`,t),e.addEventListener(`status`,t),e.addEventListener(`log`,t),e.addEventListener(`qrcode`,t),e.addEventListener(`error`,()=>{})}applyChannelEvent(e){if(Array.isArray(e.channels)){this.channels=e.channels,this.ensureWorkspaceSelections(),this.requestUpdate();return}if(e.snapshot){this.upsertChannel(e.snapshot);return}if(e.channelId&&e.log){let t=this.channels.find(t=>t.id===e.channelId);t&&(t.logs=[...t.logs||[],e.log].slice(-300),this.requestUpdate())}}upsertChannel(e){let t=this.channels.findIndex(t=>t.id===e.id);t>=0?this.channels=[...this.channels.slice(0,t),e,...this.channels.slice(t+1)]:this.channels=[...this.channels,e],this.ensureWorkspaceSelections(),this.requestUpdate()}selectedWorkspaceId(e){return this.selectedWorkspaceIdByChannel[e.id]||e.launchWorkspace?.id||`default`}handleWorkspaceChange(e,t){let n=t.currentTarget;n&&(this.selectedWorkspaceIdByChannel={...this.selectedWorkspaceIdByChannel,[e.id]:n.value||`default`},this.requestUpdate())}startOptions(e){return e.supportsWorkspaceSelection?{projectId:this.selectedWorkspaceId(e)}:void 0}async invoke(e,t){if(!this.busyChannelId&&!(t===`restart`&&!await C({description:O(`channelRestartConfirm`,{name:e.name}),confirmLabel:O(`restart`),cancelLabel:O(`cancel`)}))){this.busyChannelId=e.id,this.error=``,this.message=``,this.requestUpdate();try{let n=t===`start`||t===`restart`?this.startOptions(e):void 0,r=await this.request(`/api/channels/${encodeURIComponent(e.id)}/${t}`,{method:`POST`,headers:n?{...q,"content-type":`application/json`}:q,body:n?JSON.stringify(n):void 0});this.upsertChannel(r)}catch(e){this.error=e instanceof Error?e.message:O(`requestFailed`)}finally{this.busyChannelId=``,this.requestUpdate()}}}async invokeAction(e,t){if(!this.busyChannelId&&!((t.destructive||t.id===`relogin`)&&!await C({description:t.id===`relogin`?O(`channelReloginConfirm`,{name:e.name}):O(`channelLogoutConfirm`,{name:e.name}),confirmLabel:t.label,cancelLabel:O(`cancel`),variant:t.destructive?`destructive`:void 0}))){this.busyChannelId=e.id,this.error=``,this.message=``,this.requestUpdate();try{let n=t.id===`relogin`?this.startOptions(e):void 0,r=await this.request(`/api/channels/${encodeURIComponent(e.id)}/actions/${encodeURIComponent(t.id)}`,{method:`POST`,headers:n?{...q,"content-type":`application/json`}:q,body:n?JSON.stringify(n):void 0});this.upsertChannel(r)}catch(e){this.error=e instanceof Error?e.message:O(`requestFailed`)}finally{this.busyChannelId=``,this.requestUpdate()}}}workspaceSection(e,t){if(!e.supportsWorkspaceSelection)return null;let n=this.selectedWorkspaceId(e),r=e.launchWorkspace;return g`
1312
1323
  <div class="quickforge-settings-row quickforge-settings-row-align-start">
1313
1324
  <div class="quickforge-settings-row-main">
1314
1325
  <div class="quickforge-settings-row-title">
1315
- ${k(`channelWorkspace`)}
1316
- <quickforge-info-tip .label=${k(`channelWorkspaceDescription`)}></quickforge-info-tip>
1326
+ ${O(`channelWorkspace`)}
1327
+ <quickforge-info-tip .label=${O(`channelWorkspaceDescription`)}></quickforge-info-tip>
1317
1328
  </div>
1318
- ${r?_`<div class="quickforge-settings-row-description">${k(`channelCurrentWorkspace`)}: <span class="quickforge-settings-mono">${r.path}</span></div>`:_`<div class="quickforge-settings-row-description">${k(`channelWorkspaceDescription`)}</div>`}
1329
+ ${r?g`<div class="quickforge-settings-row-description">${O(`channelCurrentWorkspace`)}: <span class="quickforge-settings-mono">${r.path}</span></div>`:g`<div class="quickforge-settings-row-description">${O(`channelWorkspaceDescription`)}</div>`}
1319
1330
  </div>
1320
1331
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide">
1321
1332
  <select
@@ -1324,89 +1335,89 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,Ft as n,It as r
1324
1335
  .value=${n}
1325
1336
  @change=${t=>this.handleWorkspaceChange(e,t)}
1326
1337
  >
1327
- ${this.workspaces.map(e=>_`
1328
- <option value=${e.id}>${e.kind===`default`?k(`channelDefaultWorkspace`):e.name} — ${e.path}</option>
1338
+ ${this.workspaces.map(e=>g`
1339
+ <option value=${e.id}>${e.kind===`default`?O(`channelDefaultWorkspace`):e.name} — ${e.path}</option>
1329
1340
  `)}
1330
1341
  </select>
1331
1342
  </div>
1332
1343
  </div>
1333
- `}channelMeta(e){return _`
1344
+ `}channelMeta(e){return g`
1334
1345
  <div class="quickforge-settings-nested-list">
1335
- ${[[k(`channelProvider`),e.provider||`-`],[k(`channelCommand`),e.commandLabel||`-`],[k(`channelPid`),e.pid?String(e.pid):`-`],[k(`channelStartedAt`),Tt(e.startedAt)]].map(([e,t])=>_`
1346
+ ${[[O(`channelProvider`),e.provider||`-`],[O(`channelCommand`),e.commandLabel||`-`],[O(`channelPid`),e.pid?String(e.pid):`-`],[O(`channelStartedAt`),Et(e.startedAt)]].map(([e,t])=>g`
1336
1347
  <div class="quickforge-settings-subrow">
1337
1348
  <div class="quickforge-settings-row-main">
1338
1349
  <div class="quickforge-settings-row-title">${e}</div>
1339
1350
  </div>
1340
- <div class="quickforge-settings-row-control quickforge-settings-row-control-wide quickforge-settings-readonly-value ${e===k(`channelCommand`)?`quickforge-settings-mono`:``}">${t}</div>
1351
+ <div class="quickforge-settings-row-control quickforge-settings-row-control-wide quickforge-settings-readonly-value ${e===O(`channelCommand`)?`quickforge-settings-mono`:``}">${t}</div>
1341
1352
  </div>
1342
1353
  `)}
1343
1354
  </div>
1344
- `}qrSection(e){return!e.qrCodeText&&!e.qrCodeUrl&&e.status!==`waiting_scan`?null:_`
1355
+ `}qrSection(e){return!e.qrCodeText&&!e.qrCodeUrl&&e.status!==`waiting_scan`?null:g`
1345
1356
  <div class="quickforge-settings-row quickforge-settings-row-align-start">
1346
1357
  <div class="quickforge-settings-row-main">
1347
1358
  <div class="quickforge-settings-row-title">
1348
- ${k(`channelQrTitle`)}
1349
- <quickforge-info-tip .label=${k(`channelQrDescription`)}></quickforge-info-tip>
1359
+ ${O(`channelQrTitle`)}
1360
+ <quickforge-info-tip .label=${O(`channelQrDescription`)}></quickforge-info-tip>
1350
1361
  </div>
1351
- <div class="quickforge-settings-row-description">${k(`channelQrDescription`)}</div>
1352
- ${e.qrCodeUrl?_`
1362
+ <div class="quickforge-settings-row-description">${O(`channelQrDescription`)}</div>
1363
+ ${e.qrCodeUrl?g`
1353
1364
  <div class="quickforge-settings-meta">
1354
1365
  <a class="quickforge-settings-link quickforge-settings-mono" href=${e.qrCodeUrl} target="_blank" rel="noreferrer">${e.qrCodeUrl}</a>
1355
1366
  </div>
1356
1367
  `:null}
1357
1368
  </div>
1358
- ${e.qrCodeText?_`<pre class="quickforge-channel-qr-text">${e.qrCodeText}</pre>`:null}
1369
+ ${e.qrCodeText?g`<pre class="quickforge-channel-qr-text">${e.qrCodeText}</pre>`:null}
1359
1370
  </div>
1360
- `}logsSection(e){let t=e.logs||[];return _`
1371
+ `}logsSection(e){let t=e.logs||[];return g`
1361
1372
  <details class="quickforge-channel-logs" open>
1362
- <summary class="quickforge-channel-logs-summary">${k(`channelRecentLogs`)}</summary>
1373
+ <summary class="quickforge-channel-logs-summary">${O(`channelRecentLogs`)}</summary>
1363
1374
  <div class="quickforge-channel-logs-body">
1364
- ${t.length?t.slice(-80).map(e=>_`
1375
+ ${t.length?t.slice(-80).map(e=>g`
1365
1376
  <div class="quickforge-channel-log-row">
1366
1377
  <span class="text-muted-foreground/55">${new Date(e.time).toLocaleTimeString()}</span>
1367
1378
  <span class=${e.stream===`stderr`?`text-destructive/80`:`text-muted-foreground/70`}>${e.stream}</span>
1368
1379
  <span class="min-w-0 whitespace-pre-wrap break-words text-foreground/85">${e.text}</span>
1369
1380
  </div>
1370
- `):_`<div class="quickforge-settings-empty-row">${k(`channelNoLogs`)}</div>`}
1381
+ `):g`<div class="quickforge-settings-empty-row">${O(`channelNoLogs`)}</div>`}
1371
1382
  </div>
1372
1383
  </details>
1373
- `}channelCard(e){let t=this.busyChannelId===e.id||!!e.activeAction,n=e.status===`running`||e.status===`waiting_scan`||e.status===`starting`,r=e.status===`stopping`,i=!!(e.supportsWorkspaceSelection&&this.workspaces.length===0);return _`
1384
+ `}channelCard(e){let t=this.busyChannelId===e.id||!!e.activeAction,n=e.status===`running`||e.status===`waiting_scan`||e.status===`starting`,r=e.status===`stopping`,i=!!(e.supportsWorkspaceSelection&&this.workspaces.length===0);return g`
1374
1385
  <section class="quickforge-settings-section" aria-label=${e.name}>
1375
1386
  <div class="quickforge-settings-row quickforge-settings-row-top">
1376
1387
  <div class="quickforge-settings-row-main">
1377
1388
  <div class="quickforge-settings-row-title">
1378
1389
  ${e.name}
1379
- <span class="quickforge-settings-badge ${Ct(e.status)}">${wt(e.status)}</span>
1390
+ <span class="quickforge-settings-badge ${wt(e.status)}">${Tt(e.status)}</span>
1380
1391
  </div>
1381
1392
  <div class="quickforge-settings-row-description">${e.description}</div>
1382
- ${e.requirements?.length?_`<div class="quickforge-settings-row-description">${k(`channelRequirements`)}: ${e.requirements.join(` · `)}</div>`:null}
1393
+ ${e.requirements?.length?g`<div class="quickforge-settings-row-description">${O(`channelRequirements`)}: ${e.requirements.join(` · `)}</div>`:null}
1383
1394
  </div>
1384
1395
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide">
1385
- <button class="quickforge-settings-button quickforge-settings-button-primary" type="button" ?disabled=${t||n||r||i} @click=${()=>this.invoke(e,`start`)}>${k(`start`)}</button>
1386
- <button class="quickforge-settings-button quickforge-settings-button-secondary" type="button" ?disabled=${t||!n||r} @click=${()=>this.invoke(e,`stop`)}>${k(`stop`)}</button>
1387
- <button class="quickforge-settings-button quickforge-settings-button-secondary" type="button" ?disabled=${t||r||i} @click=${()=>this.invoke(e,`restart`)}>${k(`restart`)}</button>
1388
- ${e.actions?.map(n=>_`
1396
+ <button class="quickforge-settings-button quickforge-settings-button-primary" type="button" ?disabled=${t||n||r||i} @click=${()=>this.invoke(e,`start`)}>${O(`start`)}</button>
1397
+ <button class="quickforge-settings-button quickforge-settings-button-secondary" type="button" ?disabled=${t||!n||r} @click=${()=>this.invoke(e,`stop`)}>${O(`stop`)}</button>
1398
+ <button class="quickforge-settings-button quickforge-settings-button-secondary" type="button" ?disabled=${t||r||i} @click=${()=>this.invoke(e,`restart`)}>${O(`restart`)}</button>
1399
+ ${e.actions?.map(n=>g`
1389
1400
  <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>
1390
1401
  `)}
1391
1402
  </div>
1392
1403
  </div>
1393
1404
 
1394
1405
  ${this.workspaceSection(e,t||n||r)}
1395
- ${i?_`<div class="quickforge-settings-alert quickforge-settings-warning-attached">${k(`channelNoWorkspaces`)}</div>`:null}
1406
+ ${i?g`<div class="quickforge-settings-alert quickforge-settings-warning-attached">${O(`channelNoWorkspaces`)}</div>`:null}
1396
1407
  ${this.channelMeta(e)}
1397
- ${e.error?_`<div class="quickforge-settings-alert quickforge-settings-warning-attached">${e.error}</div>`:null}
1408
+ ${e.error?g`<div class="quickforge-settings-alert quickforge-settings-warning-attached">${e.error}</div>`:null}
1398
1409
  ${this.qrSection(e)}
1399
1410
  ${this.logsSection(e)}
1400
1411
  </section>
1401
- `}render(){return this.loading?_`<div class="quickforge-settings-note">${k(`loading`)}</div>`:_`
1412
+ `}render(){return this.loading?g`<div class="quickforge-settings-note">${O(`loading`)}</div>`:g`
1402
1413
  <div class="quickforge-settings-stack">
1403
1414
  <section class="quickforge-settings-warning">
1404
- ${k(`channelsSecurityWarning`)}
1415
+ ${O(`channelsSecurityWarning`)}
1405
1416
  </section>
1406
1417
 
1407
- ${this.channels.length?_`${this.channels.map(e=>this.channelCard(e))}`:_`<div class="quickforge-settings-note">${k(`channelsEmpty`)}</div>`}
1418
+ ${this.channels.length?g`${this.channels.map(e=>this.channelCard(e))}`:g`<div class="quickforge-settings-note">${O(`channelsEmpty`)}</div>`}
1408
1419
 
1409
- ${this.message?_`<div class="quickforge-settings-message">${this.message}</div>`:null}
1410
- ${this.error?_`<div class="quickforge-settings-alert">${this.error}</div>`:null}
1420
+ ${this.message?g`<div class="quickforge-settings-message">${this.message}</div>`:null}
1421
+ ${this.error?g`<div class="quickforge-settings-alert">${this.error}</div>`:null}
1411
1422
  </div>
1412
- `}},Y=`quickforge-channels-settings-tab`;customElements.get(Y)||customElements.define(Y,Et);function Dt(){return document.createElement(Y)}var Ot=ne(),X=te(),kt=(0,A.lazy)(()=>b(()=>import(`./AgentProfilesPage-XJdWmkQb.js`).then(e=>({default:e.AgentProfilesPage})),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11]))),At=(0,A.lazy)(()=>b(()=>import(`./mcp-servers-dialog-CJ4HKWVZ.js`).then(e=>({default:e.McpServersPanel})),__vite__mapDeps([12,1,2,3,4,5,6,7,8,9,10,11]))),jt=(0,A.lazy)(()=>b(()=>import(`./skills-dialog-CmCLl7K_.js`).then(e=>e.n).then(e=>({default:e.SkillsManagerPanel})),__vite__mapDeps([9,1,2,3,4,5,6,7,8,10,11]))),Mt=(0,A.lazy)(()=>b(()=>import(`./PluginsPage-DDxjlhiK.js`).then(e=>({default:e.PluginsPage})),__vite__mapDeps([13,1,2,3,4,5,6,7,8,9,10,11,14]))),Nt=(0,A.lazy)(()=>b(()=>import(`./ScheduledTasksPage-Bw-pSpbv.js`).then(e=>({default:e.ScheduledTasksPage})),__vite__mapDeps([15,1,2,3,4,5,6,7,8,9,10,11]))),Pt=class extends v{tabName=``;renderReact;root;getTabName(){return this.tabName}connectedCallback(){super.connectedCallback(),this.updateComplete.then(()=>this.mountReact())}disconnectedCallback(){this.root?.unmount(),this.root=void 0,super.disconnectedCallback()}render(){return _`<div class="quickforge-react-settings-tab h-full min-h-0"></div>`}mountReact(){let e=this.querySelector(`.quickforge-react-settings-tab`);!e||!this.renderReact||(this.root??=(0,Ot.createRoot)(e),this.root.render(this.renderReact()))}},Z=`quickforge-react-settings-tab`;customElements.get(Z)||customElements.define(Z,Pt);function Q(e,t){let n=document.createElement(Z);return n.tabName=e,n.renderReact=t,n}function $({children:e}){return(0,X.jsx)(`div`,{className:`quickforge-settings-stack h-full min-h-[30rem]`,children:(0,X.jsx)(A.Suspense,{fallback:(0,X.jsx)(`div`,{className:`quickforge-settings-note`,children:k(`loading`)}),children:e})})}function Ft(e){window.dispatchEvent(new CustomEvent(`quickforge:open-session-from-settings`,{detail:{sessionId:e}}))}function It(){return Q(k(`agentsTab`),()=>(0,X.jsx)($,{children:(0,X.jsx)(kt,{})}))}function Lt(){return Q(k(`skills`),()=>(0,X.jsx)($,{children:(0,X.jsx)(jt,{active:!0,scope:`global`,embedded:!0,onSaved:()=>void 0})}))}function Rt(){return Q(k(`mcpServers`),()=>(0,X.jsx)($,{children:(0,X.jsx)(At,{active:!0})}))}function zt(){return Q(k(`plugins`),()=>(0,X.jsx)($,{children:(0,X.jsx)(Mt,{})}))}function Bt(){return Q(k(`scheduledTasks`),()=>(0,X.jsx)($,{children:(0,X.jsx)(Nt,{onOpenSession:Ft})}))}function Vt(e){let t=[{key:`appearance`,tab:Me(),getDescription:()=>k(`appearanceDescription`)},{key:`defaults`,tab:Ke(),getDescription:()=>k(`defaultOptionsDescription`)},{key:`customModels`,tab:ke(e),getDescription:()=>k(`customModelsDescription`)},{key:`agents`,tab:It(),getDescription:()=>k(`agentsDescription`)},{key:`skills`,tab:Lt(),getDescription:()=>k(`globalSkillsDescription`)},{key:`mcp`,tab:Rt(),getDescription:void 0},{key:`plugins`,tab:zt(),getDescription:()=>k(`pluginsDescription`)},{key:`scheduledTasks`,tab:Bt(),getDescription:()=>k(`scheduledTasksDescription`)},{key:`projectCommands`,tab:St(),getDescription:()=>k(`projectCommandsDescription`)},{key:`backup`,tab:at(),getDescription:()=>k(`backupRestoreDescription`)},{key:`archivedConversations`,tab:lt(),getDescription:()=>k(`archivedConversationsDescription`)},{key:`channels`,tab:Dt(),getDescription:()=>k(`channelsDescription`)},{key:`lanAccess`,tab:ft(),getDescription:()=>k(`lanAccessDescription`)},{key:`about`,tab:bt(),getDescription:()=>k(`aboutQuickForgeDescription`)}];return{items:[...t],tabs:t.map(e=>e.tab),indexOf:e=>t.findIndex(t=>t.key===e)}}var Ht={appearance:t,defaults:g,customModels:f,agents:i,skills:a,mcp:p,plugins:ee,scheduledTasks:m,projectCommands:u,backup:l,archivedConversations:r,channels:h,lanAccess:d,about:s};function Ut({tab:e}){let t=(0,A.useRef)(null);return(0,A.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 Wt({initialTab:e,customProvider:t,onBack:r}){let i=(0,A.useMemo)(()=>Vt(t),[t]),a=Math.max(0,i.indexOf(e)),[o,s]=(0,A.useState)(),l=o??a,u=i.items[l]??i.items[0],d=u?.getDescription?.(),f=u?Ht[u.key]:void 0,[p,m]=(0,A.useState)(``),h=p.trim().toLowerCase(),g=(0,A.useMemo)(()=>i.items.map((e,t)=>({item:e,index:t})).filter(({item:e})=>h?[e.key,e.tab.getTabName(),e.getDescription?.()??``].join(` `).toLowerCase().includes(h):!0),[i.items,h]);return(0,X.jsxs)(`div`,{className:`flex h-screen min-h-0 bg-[var(--quickforge-sidebar-bg)] text-foreground`,children:[(0,X.jsxs)(`aside`,{className:`relative z-10 hidden w-80 shrink-0 overflow-hidden bg-[var(--quickforge-sidebar-bg)] md:flex md:min-h-0 md:flex-col`,children:[(0,X.jsxs)(`div`,{className:`shrink-0 px-3 pb-2 pt-3`,children:[(0,X.jsxs)(`button`,{type:`button`,className:`group relative flex w-full items-center gap-2 overflow-hidden rounded-lg px-2 py-1.5 text-left text-muted-foreground/72 transition-[background-color,color,box-shadow] duration-160 ease-out hover:bg-[var(--quickforge-sidebar-hover-bg)] hover:text-foreground/86 hover:shadow-[0_8px_20px_-18px_rgb(15_23_42_/_0.35)]`,onClick:r,"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)(n,{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)(c,{className:`pointer-events-none absolute left-3 top-1/2 size-4 -translate-y-1/2 text-muted-foreground/60`,"aria-hidden":`true`}),(0,X.jsx)(`input`,{value:p,onChange:e=>m(e.target.value),placeholder:k(`searchSettings`),"aria-label":k(`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":k(`settings`),children:[g.map(({item:e,index:t})=>{let n=t===l,r=Ht[e.key];return(0,X.jsxs)(`button`,{type:`button`,className:O(`group relative flex w-full items-center gap-2.5 overflow-hidden rounded-lg px-2 py-1.5 text-left text-sm leading-5 transition-[background-color,color,box-shadow] duration-160 ease-out`,n?`bg-[var(--quickforge-sidebar-active-bg)] font-medium text-foreground/92 shadow-[0_8px_22px_-20px_rgb(15_23_42_/_0.32)]`:`text-muted-foreground/76 hover:bg-[var(--quickforge-sidebar-hover-bg)] hover:text-foreground/90 hover:shadow-[0_8px_20px_-18px_rgb(15_23_42_/_0.35)]`),onClick:()=>s(t),"aria-current":n?`page`:void 0,children:[(0,X.jsx)(`span`,{className:O(`inline-flex size-5 shrink-0 items-center justify-center transition-colors`,n?`text-foreground/72`:`text-muted-foreground/52 group-hover:text-foreground/68`),children:(0,X.jsx)(r,{className:`size-4`,"aria-hidden":`true`})}),(0,X.jsx)(`span`,{className:`truncate`,children:e.tab.getTabName()})]},e.key)}),g.length===0?(0,X.jsx)(`div`,{className:`px-2 py-3 text-sm text-muted-foreground/70`,children:k(`noSettingsResults`)}):null]})})]}),(0,X.jsxs)(`main`,{className:`flex min-w-0 flex-1 flex-col bg-[var(--quickforge-main-bg)] md:overflow-hidden md:rounded-l-2xl`,children:[(0,X.jsxs)(`header`,{className:`flex h-14 shrink-0 items-center gap-2 border-b-[0.5px] border-[color-mix(in_oklab,var(--border)_34%,transparent)] px-3 pr-4 md:px-5`,children:[(0,X.jsx)(be,{variant:`ghost`,size:`icon`,className:`md:hidden`,onClick:r,"aria-label":`返回工作区`,children:(0,X.jsx)(n,{className:`size-4`})}),(0,X.jsx)(`div`,{className:`min-w-0 flex-1`,children:(0,X.jsxs)(`div`,{className:`flex min-w-0 items-center gap-2`,children:[f?(0,X.jsx)(f,{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:u?.tab.getTabName()}),d?(0,X.jsx)(Se,{label:d}):null]})})]}),(0,X.jsx)(`div`,{className:`shrink-0 border-b-[0.5px] border-[color-mix(in_oklab,var(--border)_30%,transparent)] px-3 py-2 md:hidden`,children:(0,X.jsxs)(`div`,{className:`quickforge-settings-inline-field`,children:[(0,X.jsx)(c,{className:`pointer-events-none absolute left-3 top-1/2 size-4 -translate-y-1/2 text-muted-foreground/60`,"aria-hidden":`true`}),(0,X.jsx)(`input`,{value:p,onChange:e=>m(e.target.value),placeholder:k(`searchSettings`),"aria-label":k(`searchSettings`),className:`quickforge-settings-input`})]})}),(0,X.jsxs)(`div`,{className:`quickforge-settings-mobile-tabs flex shrink-0 gap-1 overflow-x-auto border-b-[0.5px] border-[color-mix(in_oklab,var(--border)_30%,transparent)] px-3 py-2 md:hidden`,children:[g.map(({item:e,index:t})=>{let n=t===l,r=Ht[e.key];return(0,X.jsxs)(`button`,{type:`button`,className:O(`inline-flex shrink-0 items-center gap-1.5 rounded-full px-3 py-1.5 text-sm transition-colors`,n?`bg-muted text-foreground`:`text-muted-foreground hover:bg-muted/55 hover:text-foreground`),onClick:()=>s(t),children:[(0,X.jsx)(r,{className:`size-3.5 shrink-0`,"aria-hidden":`true`}),(0,X.jsx)(`span`,{children:e.tab.getTabName()})]},e.key)}),g.length===0?(0,X.jsx)(`div`,{className:`shrink-0 px-1 py-1.5 text-sm text-muted-foreground/70`,children:k(`noSettingsResults`)}):null]}),(0,X.jsx)(`section`,{className:`min-h-0 flex-1 overflow-y-auto px-4 py-5 md:px-8 md:py-7`,children:(0,X.jsx)(`div`,{className:`mx-auto flex min-h-full w-full max-w-5xl flex-col`,children:u?(0,X.jsx)(Ut,{tab:u.tab}):null})})]})]})}export{Wt as SettingsWorkspacePage};
1423
+ `}},J=`quickforge-channels-settings-tab`;customElements.get(J)||customElements.define(J,Dt);function Ot(){return document.createElement(J)}var kt=re(),Y=ne(),At=(0,k.lazy)(()=>y(()=>import(`./AgentProfilesPage-5eqU0Cjk.js`).then(e=>({default:e.AgentProfilesPage})),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11]))),jt=(0,k.lazy)(()=>y(()=>import(`./mcp-servers-dialog-DC2Zfojn.js`).then(e=>({default:e.McpServersPanel})),__vite__mapDeps([12,1,2,3,4,5,6,7,8,9,10,11]))),Mt=(0,k.lazy)(()=>y(()=>import(`./skills-dialog-Mnj8fZwq.js`).then(e=>e.n).then(e=>({default:e.SkillsManagerPanel})),__vite__mapDeps([9,1,2,3,4,5,6,7,8,10,11]))),Nt=(0,k.lazy)(()=>y(()=>import(`./PluginsPage-C5OClNdT.js`).then(e=>({default:e.PluginsPage})),__vite__mapDeps([13,1,2,3,4,5,6,7,8,9,10,11,14]))),Pt=(0,k.lazy)(()=>y(()=>import(`./ScheduledTasksPage-yT10oaaM.js`).then(e=>({default:e.ScheduledTasksPage})),__vite__mapDeps([15,1,2,3,4,5,6,7,8,9,10,11]))),Ft=class extends _{tabName=``;renderReact;root;getTabName(){return this.tabName}connectedCallback(){super.connectedCallback(),this.updateComplete.then(()=>this.mountReact())}disconnectedCallback(){this.root?.unmount(),this.root=void 0,super.disconnectedCallback()}render(){return g`<div class="quickforge-react-settings-tab h-full min-h-0"></div>`}mountReact(){let e=this.querySelector(`.quickforge-react-settings-tab`);!e||!this.renderReact||(this.root??=(0,kt.createRoot)(e),this.root.render(this.renderReact()))}},X=`quickforge-react-settings-tab`;customElements.get(X)||customElements.define(X,Ft);function Z(e,t){let n=document.createElement(X);return n.tabName=e,n.renderReact=t,n}function Q({children:e}){return(0,Y.jsx)(`div`,{className:`quickforge-settings-stack h-full min-h-[30rem]`,children:(0,Y.jsx)(k.Suspense,{fallback:(0,Y.jsx)(`div`,{className:`quickforge-settings-note`,children:O(`loading`)}),children:e})})}function It(e){window.dispatchEvent(new CustomEvent(`quickforge:open-session-from-settings`,{detail:{sessionId:e}}))}function Lt(){return Z(O(`agentsTab`),()=>(0,Y.jsx)(Q,{children:(0,Y.jsx)(At,{})}))}function Rt(){return Z(O(`skills`),()=>(0,Y.jsx)(Q,{children:(0,Y.jsx)(Mt,{active:!0,scope:`global`,embedded:!0,onSaved:()=>void 0})}))}function zt(){return Z(O(`mcpServers`),()=>(0,Y.jsx)(Q,{children:(0,Y.jsx)(jt,{active:!0})}))}function Bt(){return Z(O(`plugins`),()=>(0,Y.jsx)(Q,{children:(0,Y.jsx)(Nt,{})}))}function Vt(){return Z(O(`scheduledTasks`),()=>(0,Y.jsx)(Q,{children:(0,Y.jsx)(Pt,{onOpenSession:It})}))}function Ht(e){let t=[{key:`appearance`,tab:Ne(),getDescription:()=>O(`appearanceDescription`)},{key:`defaults`,tab:qe(),getDescription:()=>O(`defaultOptionsDescription`)},{key:`customModels`,tab:Ae(e),getDescription:()=>O(`customModelsDescription`)},{key:`agents`,tab:Lt(),getDescription:()=>O(`agentsDescription`)},{key:`skills`,tab:Rt(),getDescription:()=>O(`globalSkillsDescription`)},{key:`mcp`,tab:zt(),getDescription:void 0},{key:`plugins`,tab:Bt(),getDescription:()=>O(`pluginsDescription`)},{key:`scheduledTasks`,tab:Vt(),getDescription:()=>O(`scheduledTasksDescription`)},{key:`projectCommands`,tab:Ct(),getDescription:()=>O(`projectCommandsDescription`)},{key:`backup`,tab:ot(),getDescription:()=>O(`backupRestoreDescription`)},{key:`archivedConversations`,tab:ut(),getDescription:()=>O(`archivedConversationsDescription`)},{key:`channels`,tab:Ot(),getDescription:()=>O(`channelsDescription`)},{key:`lanAccess`,tab:pt(),getDescription:()=>O(`lanAccessDescription`)},{key:`about`,tab:xt(),getDescription:()=>O(`aboutQuickForgeDescription`)}];return{items:[...t],tabs:t.map(e=>e.tab),indexOf:e=>t.findIndex(t=>t.key===e)}}var $={appearance:d,defaults:m,customModels:ee,agents:t,skills:r,mcp:u,plugins:o,scheduledTasks:i,projectCommands:l,backup:h,archivedConversations:te,channels:f,lanAccess:p,about:n};function Ut({tab:e}){let t=(0,k.useRef)(null);return(0,k.useEffect)(()=>{let n=t.current;if(n)return n.replaceChildren(e),()=>{e.parentNode===n&&n.removeChild(e)}},[e]),(0,Y.jsx)(`div`,{ref:t,className:`quickforge-settings-tab-host min-h-0 flex-1`})}function Wt({initialTab:e,customProvider:t,onBack:n}){let r=(0,k.useMemo)(()=>Ht(t),[t]),i=Math.max(0,r.indexOf(e)),[o,s]=(0,k.useState)(),l=o??i,u=r.items[l]??r.items[0],d=u?.getDescription?.(),ee=u?$[u.key]:void 0,[f,p]=(0,k.useState)(``),m=f.trim().toLowerCase(),h=(0,k.useMemo)(()=>r.items.map((e,t)=>({item:e,index:t})).filter(({item:e})=>m?[e.key,e.tab.getTabName(),e.getDescription?.()??``].join(` `).toLowerCase().includes(m):!0),[r.items,m]);return(0,Y.jsxs)(`div`,{className:`flex h-screen min-h-0 bg-[var(--quickforge-sidebar-bg)] text-foreground`,children:[(0,Y.jsxs)(`aside`,{className:`relative z-10 hidden w-80 shrink-0 overflow-hidden bg-[var(--quickforge-sidebar-bg)] md:flex md:min-h-0 md:flex-col`,children:[(0,Y.jsxs)(`div`,{className:`shrink-0 px-3 pb-2 pt-3`,children:[(0,Y.jsxs)(`button`,{type:`button`,className:`group relative flex w-full items-center gap-2 overflow-hidden rounded-lg px-2 py-1.5 text-left text-muted-foreground/72 transition-[background-color,color,box-shadow] duration-160 ease-out hover:bg-[var(--quickforge-sidebar-hover-bg)] hover:text-foreground/86 hover:shadow-[0_8px_20px_-18px_rgb(15_23_42_/_0.35)]`,onClick:n,"aria-label":`返回工作区`,children:[(0,Y.jsx)(`span`,{className:`inline-flex size-6 shrink-0 items-center justify-center rounded-full text-muted-foreground/55 transition-colors group-hover:text-foreground/70`,children:(0,Y.jsx)(a,{className:`size-4`})}),(0,Y.jsx)(`span`,{className:`truncate text-sm leading-5`,children:`返回工作区`})]}),(0,Y.jsxs)(`div`,{className:`quickforge-settings-inline-field mt-3`,children:[(0,Y.jsx)(c,{className:`pointer-events-none absolute left-3 top-1/2 size-4 -translate-y-1/2 text-muted-foreground/60`,"aria-hidden":`true`}),(0,Y.jsx)(`input`,{value:f,onChange:e=>p(e.target.value),placeholder:O(`searchSettings`),"aria-label":O(`searchSettings`),className:`quickforge-settings-input`})]})]}),(0,Y.jsx)(`div`,{className:`min-h-0 flex-1 overflow-y-auto px-3 pb-4 pt-4`,children:(0,Y.jsxs)(`nav`,{className:`space-y-1`,"aria-label":O(`settings`),children:[h.map(({item:e,index:t})=>{let n=t===l,r=$[e.key];return(0,Y.jsxs)(`button`,{type:`button`,className:D(`group relative flex w-full items-center gap-2.5 overflow-hidden rounded-lg px-2 py-1.5 text-left text-sm leading-5 transition-[background-color,color,box-shadow] duration-160 ease-out`,n?`bg-[var(--quickforge-sidebar-active-bg)] font-medium text-foreground/92 shadow-[0_8px_22px_-20px_rgb(15_23_42_/_0.32)]`:`text-muted-foreground/76 hover:bg-[var(--quickforge-sidebar-hover-bg)] hover:text-foreground/90 hover:shadow-[0_8px_20px_-18px_rgb(15_23_42_/_0.35)]`),onClick:()=>s(t),"aria-current":n?`page`:void 0,children:[(0,Y.jsx)(`span`,{className:D(`inline-flex size-5 shrink-0 items-center justify-center transition-colors`,n?`text-foreground/72`:`text-muted-foreground/52 group-hover:text-foreground/68`),children:(0,Y.jsx)(r,{className:`size-4`,"aria-hidden":`true`})}),(0,Y.jsx)(`span`,{className:`truncate`,children:e.tab.getTabName()})]},e.key)}),h.length===0?(0,Y.jsx)(`div`,{className:`px-2 py-3 text-sm text-muted-foreground/70`,children:O(`noSettingsResults`)}):null]})})]}),(0,Y.jsxs)(`main`,{className:`flex min-w-0 flex-1 flex-col bg-[var(--quickforge-main-bg)] md:overflow-hidden md:rounded-l-2xl`,children:[(0,Y.jsxs)(`header`,{className:`flex h-14 shrink-0 items-center gap-2 border-b-[0.5px] border-[color-mix(in_oklab,var(--border)_34%,transparent)] px-3 pr-4 md:px-5`,children:[(0,Y.jsx)(ge,{variant:`ghost`,size:`icon`,className:`md:hidden`,onClick:n,"aria-label":`返回工作区`,children:(0,Y.jsx)(a,{className:`size-4`})}),(0,Y.jsx)(`div`,{className:`min-w-0 flex-1`,children:(0,Y.jsxs)(`div`,{className:`flex min-w-0 items-center gap-2`,children:[ee?(0,Y.jsx)(ee,{className:`size-4 shrink-0 text-muted-foreground/65`,"aria-hidden":`true`}):null,(0,Y.jsx)(`div`,{className:`min-w-0 truncate text-sm font-medium text-foreground/90`,children:u?.tab.getTabName()}),d?(0,Y.jsx)(Ce,{label:d}):null]})})]}),(0,Y.jsx)(`div`,{className:`shrink-0 border-b-[0.5px] border-[color-mix(in_oklab,var(--border)_30%,transparent)] px-3 py-2 md:hidden`,children:(0,Y.jsxs)(`div`,{className:`quickforge-settings-inline-field`,children:[(0,Y.jsx)(c,{className:`pointer-events-none absolute left-3 top-1/2 size-4 -translate-y-1/2 text-muted-foreground/60`,"aria-hidden":`true`}),(0,Y.jsx)(`input`,{value:f,onChange:e=>p(e.target.value),placeholder:O(`searchSettings`),"aria-label":O(`searchSettings`),className:`quickforge-settings-input`})]})}),(0,Y.jsxs)(`div`,{className:`quickforge-settings-mobile-tabs flex shrink-0 gap-1 overflow-x-auto border-b-[0.5px] border-[color-mix(in_oklab,var(--border)_30%,transparent)] px-3 py-2 md:hidden`,children:[h.map(({item:e,index:t})=>{let n=t===l,r=$[e.key];return(0,Y.jsxs)(`button`,{type:`button`,className:D(`inline-flex shrink-0 items-center gap-1.5 rounded-full px-3 py-1.5 text-sm transition-colors`,n?`bg-muted text-foreground`:`text-muted-foreground hover:bg-muted/55 hover:text-foreground`),onClick:()=>s(t),children:[(0,Y.jsx)(r,{className:`size-3.5 shrink-0`,"aria-hidden":`true`}),(0,Y.jsx)(`span`,{children:e.tab.getTabName()})]},e.key)}),h.length===0?(0,Y.jsx)(`div`,{className:`shrink-0 px-1 py-1.5 text-sm text-muted-foreground/70`,children:O(`noSettingsResults`)}):null]}),(0,Y.jsx)(`section`,{className:`min-h-0 flex-1 overflow-y-auto px-4 py-5 md:px-8 md:py-7`,children:(0,Y.jsx)(`div`,{className:`mx-auto flex min-h-full w-full max-w-5xl flex-col`,children:u?(0,Y.jsx)(Ut,{tab:u.tab}):null})})]})]})}export{Wt as SettingsWorkspacePage};