@shawnstack/quickforge 1.7.4 → 1.7.5

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 (239) hide show
  1. package/dist/assets/AgentProfilesPage-XNjuqJs7.js +1 -0
  2. package/dist/assets/ChatPanelHost-CuF-PZpc.js +292 -0
  3. package/dist/assets/CloudAccountSettingsPage-GJSoi6sO.js +1 -0
  4. package/dist/assets/PluginsPage-BQgp0qN-.js +1 -0
  5. package/dist/assets/ScheduledTasksPage-DdekATzq.js +2 -0
  6. package/dist/assets/{SettingsWorkspacePage-B53_eDf2.js → SettingsWorkspacePage-Cb54Ic91.js} +389 -378
  7. package/dist/assets/ShareLinksSettingsPage-C75WJpaF.js +1 -0
  8. package/dist/assets/SharedConversationPage-CjMtSQTW.js +1 -0
  9. package/dist/assets/{TerminalDock-Dgg-_ZmU.js → TerminalDock-D4zJBJc4.js} +2 -2
  10. package/dist/assets/WorkspaceInspector-D9kdnLDd.js +36 -0
  11. package/dist/assets/{abnfDiagram-VRR7QNED-Dy7veffk.js → abnfDiagram-VRR7QNED-CMhVoYUh.js} +1 -1
  12. package/dist/assets/{arc-Bo3p2lGy.js → arc-w21O0TLn.js} +1 -1
  13. package/dist/assets/architecture-TIHT7OUA-DMwFMHxq.js +1 -0
  14. package/dist/assets/{architectureDiagram-ZJ3FMSHR-Cwx8qOvu.js → architectureDiagram-ZJ3FMSHR-C52qL6Hg.js} +1 -1
  15. package/dist/assets/{blockDiagram-677ZJIJ3-BiuaAOFa.js → blockDiagram-677ZJIJ3-CM3XbLol.js} +1 -1
  16. package/dist/assets/{c4Diagram-LMCZKHZV-BTcGfhK2.js → c4Diagram-LMCZKHZV-D7Bh1ui1.js} +1 -1
  17. package/dist/assets/channel-Duu1CuH9.js +1 -0
  18. package/dist/assets/chunk-2Q5K7J3B-B6rHWc4S.js +1 -0
  19. package/dist/assets/{chunk-32BRIVSS-B9PuF_RF.js → chunk-32BRIVSS-xgrtbT8e.js} +1 -1
  20. package/dist/assets/{chunk-52WLFC77-3zGItfIM.js → chunk-52WLFC77-CDbaHw80.js} +1 -1
  21. package/dist/assets/{chunk-5FCAYU7R-DQ66qlmt.js → chunk-5FCAYU7R-CcSvVbPc.js} +1 -1
  22. package/dist/assets/{chunk-5HE753X5-CLqTO-VF.js → chunk-5HE753X5-erFpzzgx.js} +1 -1
  23. package/dist/assets/{chunk-5JV3BV7I-Csxv1jr6.js → chunk-5JV3BV7I-rEhN9F6G.js} +1 -1
  24. package/dist/assets/{chunk-5TONJI2A-BCQttpBr.js → chunk-5TONJI2A-D8L-QTwD.js} +1 -1
  25. package/dist/assets/{chunk-5VM5RSS4-DEWJGSTb.js → chunk-5VM5RSS4-CjlfMBbM.js} +1 -1
  26. package/dist/assets/{chunk-7BUUIJ7U-DNorm9MM.js → chunk-7BUUIJ7U-CCcsI9XE.js} +1 -1
  27. package/dist/assets/{chunk-BIQX33UG-DgvY_BOT.js → chunk-BIQX33UG-FSqFbmb3.js} +1 -1
  28. package/dist/assets/{chunk-C7G6YPKG-DMvn9IPs.js → chunk-C7G6YPKG-ZMLUvfLy.js} +1 -1
  29. package/dist/assets/{chunk-CQNSW5MT-Dq2duUgr.js → chunk-CQNSW5MT-DZuBpk25.js} +1 -1
  30. package/dist/assets/{chunk-CYSBUYHQ-BovYyc4Y.js → chunk-CYSBUYHQ-CB26wsG0.js} +1 -1
  31. package/dist/assets/{chunk-EMLP6XTP-BMDOpuYN.js → chunk-EMLP6XTP-BbsM8oRw.js} +1 -1
  32. package/dist/assets/{chunk-EX3LRPZG-6eP2UPOf.js → chunk-EX3LRPZG-BcQhaqt7.js} +1 -1
  33. package/dist/assets/{chunk-FWX5IMBZ-D4q-wTSy.js → chunk-FWX5IMBZ-DrnrdrSu.js} +2 -2
  34. package/dist/assets/{chunk-HOUHSVGY-XjIcuzH7.js → chunk-HOUHSVGY-tdc-Z9eW.js} +1 -1
  35. package/dist/assets/{chunk-ICXQ74PX-YBXbanq9.js → chunk-ICXQ74PX-Cd7igVGt.js} +1 -1
  36. package/dist/assets/{chunk-JG7HCLWE-CcN3uNXF.js → chunk-JG7HCLWE-iXXGW8nf.js} +1 -1
  37. package/dist/assets/{chunk-JWPE2WC7-Cwg6AUAt.js → chunk-JWPE2WC7-BZ87mXEv.js} +1 -1
  38. package/dist/assets/{chunk-MOJQB5TN-NNspcGIU.js → chunk-MOJQB5TN-CLTjV5ov.js} +1 -1
  39. package/dist/assets/{chunk-MOZMSUNE-pMJ_jMos.js → chunk-MOZMSUNE-B3SCBrRH.js} +1 -1
  40. package/dist/assets/{chunk-OGEWGWER-CJy-3Ldv.js → chunk-OGEWGWER-TgvkXkFX.js} +1 -1
  41. package/dist/assets/{chunk-OSBZ3O6U-D7cLHHOA.js → chunk-OSBZ3O6U-B9E2E5v1.js} +1 -1
  42. package/dist/assets/{chunk-PUDLZKDR-D5YBi1Pi.js → chunk-PUDLZKDR-C5GMVYup.js} +1 -1
  43. package/dist/assets/{chunk-Q4XR5HBZ-DYmqQdIf.js → chunk-Q4XR5HBZ-fo5-HsqY.js} +1 -1
  44. package/dist/assets/{chunk-QBLGF6JB-Bfcx00X0.js → chunk-QBLGF6JB-Dwfg8sKc.js} +1 -1
  45. package/dist/assets/{chunk-R7FJI6CG-oXzadpZY.js → chunk-R7FJI6CG-DpBrv4ni.js} +1 -1
  46. package/dist/assets/{chunk-RYQCIY6F-Dt3-8yUh.js → chunk-RYQCIY6F-DzzmTl11.js} +1 -1
  47. package/dist/assets/{chunk-U6XO7XAA-B55eSvpx.js → chunk-U6XO7XAA-Dw6aviKa.js} +1 -1
  48. package/dist/assets/{chunk-V7JOEXUC-Btk4JwCt.js → chunk-V7JOEXUC-CEDazV6w.js} +1 -1
  49. package/dist/assets/chunk-VAUOI2AC-CWYjg8zE.js +1 -0
  50. package/dist/assets/{chunk-VR4S4FIN-DgaSiVOY.js → chunk-VR4S4FIN-C_-eEj-9.js} +1 -1
  51. package/dist/assets/{chunk-WYO6CB5R-rRDZ_Tta.js → chunk-WYO6CB5R-NF-MsJJR.js} +3 -3
  52. package/dist/assets/chunk-XXDRQBXY-DzTwx8ZH.js +1 -0
  53. package/dist/assets/{chunk-YOTPTUD7-BnFxj5o4.js → chunk-YOTPTUD7-DqzqtdII.js} +1 -1
  54. package/dist/assets/{chunk-ZGVPDNZ5-CrnlPlmJ.js → chunk-ZGVPDNZ5-CRrAYi4g.js} +1 -1
  55. package/dist/assets/{chunk-ZIRB5QZD-BYTiATIH.js → chunk-ZIRB5QZD-Dc1s5bLM.js} +1 -1
  56. package/dist/assets/classDiagram-OUVF2IWQ-Cc63fLWP.js +1 -0
  57. package/dist/assets/classDiagram-v2-EOCWNBFH-CoXU0qT6.js +1 -0
  58. package/dist/assets/{cose-bilkent-JH36ORCC-BORKJRwF.js → cose-bilkent-JH36ORCC-cL247pHg.js} +1 -1
  59. package/dist/assets/cynefin-VYW2F7L2-C8yCvH_o.js +1 -0
  60. package/dist/assets/{cynefinDiagram-TSTJHNR4-BXKeaSl8.js → cynefinDiagram-TSTJHNR4-D4sZ7LYI.js} +1 -1
  61. package/dist/assets/{dagre-CrA0XVwJ.js → dagre-DmHb3Ctt.js} +1 -1
  62. package/dist/assets/{dagre-VKFMJZFB-ouq_lA1a.js → dagre-VKFMJZFB-BlsnSh-Q.js} +1 -1
  63. package/dist/assets/{diagram-FQU43EPY-BxR5kUiQ.js → diagram-FQU43EPY-DW1yQiRO.js} +1 -1
  64. package/dist/assets/{diagram-G47NLZAW-DWonk1sL.js → diagram-G47NLZAW-BTUAsFjb.js} +1 -1
  65. package/dist/assets/{diagram-NH7WQ7WH-fmV_wV5e.js → diagram-NH7WQ7WH-BcaomqSd.js} +1 -1
  66. package/dist/assets/{diagram-OA4YK3LP-DvOSRRiV.js → diagram-OA4YK3LP-DDLX7Xwr.js} +1 -1
  67. package/dist/assets/{diagram-WEI45ONY-Bp-xb3uS.js → diagram-WEI45ONY-CIave0An.js} +1 -1
  68. package/dist/assets/{ebnfDiagram-CCIWWBDH-BTlnwneA.js → ebnfDiagram-CCIWWBDH-Cr1Y6lPu.js} +1 -1
  69. package/dist/assets/{erDiagram-Q63AITRT-C3fFWGCm.js → erDiagram-Q63AITRT-D3EgiVVH.js} +1 -1
  70. package/dist/assets/{esm-oa69b5u4.js → esm-Df4edDpj.js} +2 -2
  71. package/dist/assets/eventmodeling-45OFAUF4-DO1vRTM0.js +1 -0
  72. package/dist/assets/flowDiagram-23GEKE2U-BS7KXcqn.js +1 -0
  73. package/dist/assets/{ganttDiagram-NO4QXBWP-DzAiojNi.js → ganttDiagram-NO4QXBWP-B0oyDIqK.js} +1 -1
  74. package/dist/assets/gitGraph-TEB2WS4Q-m5F5ef09.js +1 -0
  75. package/dist/assets/{gitGraphDiagram-IHSO6WYX-Cv57oNEA.js → gitGraphDiagram-IHSO6WYX-uQtr6IqK.js} +1 -1
  76. package/dist/assets/icons-CXPP1fFT.js +1 -0
  77. package/dist/assets/index-_ZhK6bvp.js +65 -0
  78. package/dist/assets/index-iVV2bP_f.css +3 -0
  79. package/dist/assets/info-DKCQHKI2-CZxPlQJ0.js +1 -0
  80. package/dist/assets/{infoDiagram-FWYZ7A6U-B5Z_O3Ro.js → infoDiagram-FWYZ7A6U-B_GzlLIM.js} +1 -1
  81. package/dist/assets/{ishikawaDiagram-FXEZZL3T-CKTK_TKV.js → ishikawaDiagram-FXEZZL3T-CKQIsSdU.js} +1 -1
  82. package/dist/assets/{journeyDiagram-5HDEW3XC-Cm9k4ywW.js → journeyDiagram-5HDEW3XC-DrrvzZL1.js} +1 -1
  83. package/dist/assets/{kanban-definition-HUTT4EX6-DzNteLwx.js → kanban-definition-HUTT4EX6-CJQRTdXz.js} +1 -1
  84. package/dist/assets/{line-BG78c_WJ.js → line-B4DxX7tC.js} +1 -1
  85. package/dist/assets/{linear-1X20_EGu.js → linear-U-nKUhyW.js} +1 -1
  86. package/dist/assets/{map-CCI8WZkS.js → map-BneTM-ri.js} +1 -1
  87. package/dist/assets/{mcp-servers-dialog-GXXD9K0U.js → mcp-servers-dialog-BUSPvaqI.js} +2 -2
  88. package/dist/assets/{mermaid-parser.core-Bb8HI_OS.js → mermaid-parser.core-BlKWrEdZ.js} +2 -2
  89. package/dist/assets/{mermaid-renderer-PIaNiXAz.js → mermaid-renderer-jEbqFaTe.js} +2 -2
  90. package/dist/assets/{mermaid.core-DUHOIwL5.js → mermaid.core-DWpShXCs.js} +3 -3
  91. package/dist/assets/{mindmap-definition-LN4V7U3C-Tnbszo7b.js → mindmap-definition-LN4V7U3C-CEVwZD78.js} +1 -1
  92. package/dist/assets/model-identity-CgA6_Pbm.js +1 -0
  93. package/dist/assets/model-reference-o41fJ6jQ.js +1 -0
  94. package/dist/assets/{monaco-BVtCspYZ.js → monaco-D6OhXgjg.js} +1 -1
  95. package/dist/assets/{ordinal-v4prQcuq.js → ordinal-B2r5L1v4.js} +1 -1
  96. package/dist/assets/{otel-D1LswXpM.js → otel-BFnphzjt.js} +1 -1
  97. package/dist/assets/packet-7NZHBO7P-zIioIZVN.js +1 -0
  98. package/dist/assets/{pegDiagram-2B236MQR-CX824Kd0.js → pegDiagram-2B236MQR-CBLkBdnQ.js} +1 -1
  99. package/dist/assets/{pi-ai-DAJlO9ZB.js → pi-ai-Cr2ee4a0.js} +2 -2
  100. package/dist/assets/{pi-web-ui-B-RJSxjR.js → pi-web-ui-DV5jKjSg.js} +1 -1
  101. package/dist/assets/pie-RZYD4A2V-GGWijBvB.js +1 -0
  102. package/dist/assets/{pieDiagram-ENE6RG2P-BT04VWPQ.js → pieDiagram-ENE6RG2P-8tCnwtWS.js} +1 -1
  103. package/dist/assets/{quadrantDiagram-ABIIQ3AL-BvOZxkBr.js → quadrantDiagram-ABIIQ3AL-CWd28cHF.js} +1 -1
  104. package/dist/assets/radar-I7S5WNFK-yvwFH3RV.js +1 -0
  105. package/dist/assets/railroad-3IZDKUUU-BVadlswB.js +1 -0
  106. package/dist/assets/railroad-abnf-AHOZXSZD-B7R-p_2-.js +1 -0
  107. package/dist/assets/railroad-ebnf-EBAXGLYW-BnbJxPug.js +1 -0
  108. package/dist/assets/railroad-peg-LSFZ7HO6-Ci3DcEuQ.js +1 -0
  109. package/dist/assets/{railroadDiagram-RFXS5EU6-DnTU--BV.js → railroadDiagram-RFXS5EU6-CI4ouOBs.js} +1 -1
  110. package/dist/assets/{react-vendor-eWH0QhNU.js → react-vendor-1KC5PyRx.js} +1 -1
  111. package/dist/assets/{requirementDiagram-TGXJPOKE--MZX_yEv.js → requirementDiagram-TGXJPOKE-DtFz7sw4.js} +1 -1
  112. package/dist/assets/{sankeyDiagram-HTMAVEWB-SEZkHhYn.js → sankeyDiagram-HTMAVEWB--VeOwwk9.js} +1 -1
  113. package/dist/assets/{sequenceDiagram-DBY2YBRQ-BhC2OHiz.js → sequenceDiagram-DBY2YBRQ-B8AHk5Oe.js} +1 -1
  114. package/dist/assets/{sizeCapture-X5ZJPWSS-Ci5LeToV.js → sizeCapture-X5ZJPWSS-vV_ArM8D.js} +1 -1
  115. package/dist/assets/{skills-dialog-DDh1h8eH.js → skills-dialog-BThnIUBs.js} +3 -3
  116. package/dist/assets/{src-CovulcRC.js → src-PYsDme0X.js} +1 -1
  117. package/dist/assets/{stateDiagram-2N3HPSRC-DKK5tFT4.js → stateDiagram-2N3HPSRC-etXnJ8X8.js} +1 -1
  118. package/dist/assets/stateDiagram-v2-6OUMAXLB-Dms3pICj.js +1 -0
  119. package/dist/assets/{swimlanes-5IMT3BWC-DxxGCk67.js → swimlanes-5IMT3BWC-pabIKAmn.js} +2 -2
  120. package/dist/assets/swimlanesDiagram-G3AALYLV-B14aWjv6.js +8 -0
  121. package/dist/assets/{timeline-definition-FHXFAJF6-BPXB3Sue.js → timeline-definition-FHXFAJF6-C55MKm3L.js} +1 -1
  122. package/dist/assets/treeView-QDETBFTQ-Cru9B2zv.js +1 -0
  123. package/dist/assets/treemap-6X3UGDF4-DNOVHFaJ.js +1 -0
  124. package/dist/assets/{vennDiagram-L72KCM5P-CxcBCKye.js → vennDiagram-L72KCM5P-CgNf1Q9W.js} +1 -1
  125. package/dist/assets/wardley-OPB4EBWU-E3m1BOJQ.js +1 -0
  126. package/dist/assets/{wardleyDiagram-EHGQE667-DEL6Yes5.js → wardleyDiagram-EHGQE667-Drt5ytec.js} +1 -1
  127. package/dist/assets/{xychartDiagram-FW5EYKEG-N8cPbcjC.js → xychartDiagram-FW5EYKEG-hhoEo_Ar.js} +1 -1
  128. package/dist/index.html +9 -8
  129. package/package.json +3 -1
  130. package/plugins/{openai-documents → documents}/plugin.json +2 -2
  131. package/plugins/{openai-presentations → presentations}/plugin.json +2 -2
  132. package/plugins/{openai-spreadsheets → spreadsheets}/plugin.json +2 -2
  133. package/server/acp/server.mjs +36 -26
  134. package/server/agent-manager.mjs +130 -28
  135. package/server/agent-profile-files.mjs +8 -4
  136. package/server/agent-profile-schema.mjs +47 -23
  137. package/server/agent-profiles.mjs +1 -1
  138. package/server/ai-http-logger.mjs +98 -12
  139. package/server/cloud/chat-idempotency-store.mjs +96 -0
  140. package/server/cloud/client.mjs +102 -0
  141. package/server/cloud/config.mjs +53 -0
  142. package/server/cloud/credential-store.mjs +193 -0
  143. package/server/cloud/identity.mjs +355 -0
  144. package/server/cloud/index.mjs +7 -0
  145. package/server/cloud/models.mjs +80 -0
  146. package/server/cloud/runtime.mjs +129 -0
  147. package/server/cloud/service-config.mjs +77 -0
  148. package/server/index.mjs +28 -11
  149. package/server/model-catalog.mjs +262 -0
  150. package/server/plugins/registry.mjs +29 -5
  151. package/server/routes/agent-profiles.mjs +41 -7
  152. package/server/routes/agent.mjs +20 -11
  153. package/server/routes/backup.mjs +7 -1
  154. package/server/routes/cloud.mjs +227 -0
  155. package/server/routes/models.mjs +7 -1
  156. package/server/routes/scheduled-tasks.mjs +38 -8
  157. package/server/routes/shared-conversation.mjs +62 -58
  158. package/server/routes/shares.mjs +76 -1
  159. package/server/routes/storage.mjs +24 -1
  160. package/server/routes/workspace.mjs +6 -4
  161. package/server/share-store.mjs +168 -13
  162. package/server/skills.mjs +30 -3
  163. package/server/storage.mjs +7 -1
  164. package/server/subagents.mjs +3 -3
  165. package/server/tools/definitions.mjs +1 -1
  166. package/server/tools/index.mjs +2 -2
  167. package/server/utils/network.mjs +9 -0
  168. package/server/utils/response.mjs +8 -1
  169. package/skills/skill-creator/LICENSE.txt +202 -0
  170. package/skills/skill-creator/SKILL.md +485 -0
  171. package/skills/skill-creator/UPSTREAM.md +6 -0
  172. package/skills/skill-creator/agents/analyzer.md +274 -0
  173. package/skills/skill-creator/agents/comparator.md +202 -0
  174. package/skills/skill-creator/agents/grader.md +223 -0
  175. package/skills/skill-creator/assets/eval_review.html +146 -0
  176. package/skills/skill-creator/eval-viewer/generate_review.py +471 -0
  177. package/skills/skill-creator/eval-viewer/viewer.html +1325 -0
  178. package/skills/skill-creator/references/schemas.md +430 -0
  179. package/skills/skill-creator/scripts/__init__.py +0 -0
  180. package/skills/skill-creator/scripts/aggregate_benchmark.py +401 -0
  181. package/skills/skill-creator/scripts/generate_report.py +326 -0
  182. package/skills/skill-creator/scripts/improve_description.py +247 -0
  183. package/skills/skill-creator/scripts/package_skill.py +136 -0
  184. package/skills/skill-creator/scripts/quick_validate.py +103 -0
  185. package/skills/skill-creator/scripts/run_eval.py +310 -0
  186. package/skills/skill-creator/scripts/run_loop.py +328 -0
  187. package/skills/skill-creator/scripts/utils.py +47 -0
  188. package/dist/assets/AgentProfilesPage-B84w-r9S.js +0 -1
  189. package/dist/assets/ChatPanelHost-CyO8fEoj.js +0 -288
  190. package/dist/assets/PluginsPage-D2862wul.js +0 -1
  191. package/dist/assets/ScheduledTasksPage-GqbiJDPX.js +0 -2
  192. package/dist/assets/SharedConversationPage-Cw2QFnbC.js +0 -1
  193. package/dist/assets/WorkspaceInspector-3uLiu6Bv.js +0 -13
  194. package/dist/assets/architecture-TIHT7OUA-7FQo5GbP.js +0 -1
  195. package/dist/assets/channel-DToA8d-4.js +0 -1
  196. package/dist/assets/chunk-2Q5K7J3B-D_Wxpk-T.js +0 -1
  197. package/dist/assets/chunk-VAUOI2AC-CIZseNLi.js +0 -1
  198. package/dist/assets/chunk-XXDRQBXY-Do-XYxat.js +0 -1
  199. package/dist/assets/classDiagram-OUVF2IWQ-Bu24Sy-k.js +0 -1
  200. package/dist/assets/classDiagram-v2-EOCWNBFH-DKhh5HSW.js +0 -1
  201. package/dist/assets/cynefin-VYW2F7L2-oyiAgYC4.js +0 -1
  202. package/dist/assets/eventmodeling-45OFAUF4-YB_0MefX.js +0 -1
  203. package/dist/assets/flowDiagram-23GEKE2U-Bc73xdBd.js +0 -1
  204. package/dist/assets/gitGraph-TEB2WS4Q-Bvp27L0n.js +0 -1
  205. package/dist/assets/icons-cTkqD_Gi.js +0 -1
  206. package/dist/assets/index-B48prgLL.js +0 -65
  207. package/dist/assets/index-DQhwHHer.css +0 -3
  208. package/dist/assets/info-DKCQHKI2-BsLOivgq.js +0 -1
  209. package/dist/assets/packet-7NZHBO7P-BKQkXRtk.js +0 -1
  210. package/dist/assets/pie-RZYD4A2V-BTiTN5Ge.js +0 -1
  211. package/dist/assets/radar-I7S5WNFK-BU-oVjKM.js +0 -1
  212. package/dist/assets/railroad-3IZDKUUU-7H2hxNbL.js +0 -1
  213. package/dist/assets/railroad-abnf-AHOZXSZD-Mx6wf6XQ.js +0 -1
  214. package/dist/assets/railroad-ebnf-EBAXGLYW-BgXSKhYy.js +0 -1
  215. package/dist/assets/railroad-peg-LSFZ7HO6-DTEl2rAC.js +0 -1
  216. package/dist/assets/stateDiagram-v2-6OUMAXLB-D8x3mkni.js +0 -1
  217. package/dist/assets/swimlanesDiagram-G3AALYLV-C4nOBNp8.js +0 -8
  218. package/dist/assets/treeView-QDETBFTQ-DOE6NSdf.js +0 -1
  219. package/dist/assets/treemap-6X3UGDF4-Ca7QD_b4.js +0 -1
  220. package/dist/assets/wardley-OPB4EBWU-D9O4RKRm.js +0 -1
  221. /package/dist/assets/{array-DqLCdDFv.js → array-B9UHiPd-.js} +0 -0
  222. /package/dist/assets/{chunk-KEIR6QF5-s7Qq-R3i.js → chunk-KEIR6QF5-jrz1pRUS.js} +0 -0
  223. /package/dist/assets/{chunk-Y2CYZVJY-BgISNSiw.js → chunk-Y2CYZVJY-D6N-CrJv.js} +0 -0
  224. /package/dist/assets/{cytoscape.esm-iekjSZ2n.js → cytoscape.esm-DyfqweF2.js} +0 -0
  225. /package/dist/assets/{defaultLocale-CrJzLgRD.js → defaultLocale-5eAKkKJC.js} +0 -0
  226. /package/dist/assets/{dist-zzfqk5hx.js → dist-CLg13NtV.js} +0 -0
  227. /package/dist/assets/{graphlib-CIz_CfxW.js → graphlib-DJkmx0Cq.js} +0 -0
  228. /package/dist/assets/{init-C0r9Gk5G.js → init-DlZdxViB.js} +0 -0
  229. /package/dist/assets/{path-DIKpVbHL.js → path-6uRLdFF7.js} +0 -0
  230. /package/dist/assets/{plugin-api-C8hMT5W6.js → plugin-api-Uu2xAB4d.js} +0 -0
  231. /package/dist/assets/{rough.esm-BMOtDaaS.js → rough.esm-Bud4g4fh.js} +0 -0
  232. /package/dist/assets/{web-RgX7H-OH.js → web-DoV8MSMn.js} +0 -0
  233. /package/dist/assets/{xterm-BFzZ1FH4.js → xterm-Bm_IbozX.js} +0 -0
  234. /package/plugins/{openai-documents → documents}/commands/document.md +0 -0
  235. /package/plugins/{openai-documents → documents}/skills/documents/SKILL.md +0 -0
  236. /package/plugins/{openai-presentations → presentations}/commands/presentation.md +0 -0
  237. /package/plugins/{openai-presentations → presentations}/skills/presentations/SKILL.md +0 -0
  238. /package/plugins/{openai-spreadsheets → spreadsheets}/commands/spreadsheet.md +0 -0
  239. /package/plugins/{openai-spreadsheets → spreadsheets}/skills/spreadsheets/SKILL.md +0 -0
@@ -1,5 +1,5 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/AgentProfilesPage-B84w-r9S.js","assets/rolldown-runtime-DWdDZTNf.js","assets/index-B48prgLL.js","assets/pi-ai-DAJlO9ZB.js","assets/dist-DLKC_odd.js","assets/pi-web-ui-B-RJSxjR.js","assets/lit-vendor-DvaQX_UQ.js","assets/css-utils-31qzCXsk.js","assets/icons-cTkqD_Gi.js","assets/react-vendor-eWH0QhNU.js","assets/skills-dialog-DDh1h8eH.js","assets/logger-8REuLPGK.js","assets/index-DQhwHHer.css","assets/mcp-servers-dialog-GXXD9K0U.js","assets/PluginsPage-D2862wul.js","assets/plugin-api-C8hMT5W6.js","assets/ScheduledTasksPage-GqbiJDPX.js"])))=>i.map(i=>d[i]);
2
- import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,At as n,Dt as r,Et as i,H as a,It as o,Nt as s,Ot as c,Pt as l,Tt as u,_ as ee,bt as te,f as d,ft as f,h as ne,l as re,ot as p,s as m,st as h,x as g}from"./icons-cTkqD_Gi.js";import{n as ie,r as ae}from"./react-vendor-eWH0QhNU.js";import{p as _}from"./lit-vendor-DvaQX_UQ.js";import{m as v,x as y}from"./pi-web-ui-B-RJSxjR.js";import{J as b}from"./pi-ai-DAJlO9ZB.js";import{t as x}from"./logger-8REuLPGK.js";import{A as oe,Ct as se,Dt as ce,Et as le,F as S,Ft as ue,G as de,H as fe,I as C,It as w,J as T,K as pe,M as me,Mt as E,N as he,Nt as ge,O as _e,P as ve,Pt as ye,R as be,Tt as D,U as xe,V as Se,_t as O,a as Ce,i as k,j as we,jt as Te,k as Ee,kt as De,n as Oe,q as A,r as ke,t as Ae,vt as je,wt as Me,xt as Ne,yt as Pe}from"./index-B48prgLL.js";var j=e(o(),1),Fe={openai:{name:`OpenAI`,baseUrl:`https://api.openai.com/v1`,protocol:`openai-completions`,modelId:`gpt-4o`,supportsImages:!0},deepseek:{name:`DeepSeek`,baseUrl:`https://api.deepseek.com/v1`,protocol:`openai-completions`,modelId:`deepseek-chat`},glm:{name:`Zhipu GLM`,baseUrl:`https://open.bigmodel.cn/api/paas/v4`,protocol:`openai-completions`,modelId:`glm-4-plus`},ollama:{name:`Ollama`,baseUrl:`http://localhost:11434/v1`,protocol:`openai-completions`,modelId:`llama3.1`},litellm:{name:O.name,baseUrl:O.baseUrl,protocol:`openai-completions`,modelId:O.modelId,supportsImages:O.supportsImages}},Ie=[{key:`openai`,label:w(`presetOpenai`)},{key:`deepseek`,label:w(`presetDeepseek`)},{key:`glm`,label:w(`presetGlm`)},{key:`ollama`,label:w(`presetOllama`)},{key:`litellm`,label:w(`presetLitellm`)},{key:`custom`,label:w(`presetCustom`)}],M=()=>({modelId:``,contextWindow:O.contextWindow,maxTokens:O.maxTokens,reasoning:!0,supportsImages:!1,open:!1}),N=()=>({name:O.name,baseUrl:O.baseUrl,apiKey:``,headerRows:[],protocol:`openai-completions`,models:[M()]}),Le=class extends v{providers=[];form=N();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 w(`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=N(),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??O.contextWindow,maxTokens:e.maxTokens??O.maxTokens,reasoning:e.reasoning===!0,supportsImages:e.input?.includes(`image`)===!0,open:!1})):[M()],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=N(),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,M()]},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:[M()]};else{let t=Fe[e];this.form={...this.form,name:t.name,baseUrl:t.baseUrl,protocol:t.protocol,models:[{...M(),modelId:t.modelId,supportsImages:t.supportsImages===!0,open:!1}]}}this.resetTestState(),this.requestUpdate()}buildHeadersFromRows(){let e={};for(let t of this.form.headerRows){let n=t.key.trim(),r=t.value.trim();n&&r&&(e[n]=r)}return e}buildModel(e,t){let n=this.form.name.trim(),r=this.form.baseUrl.trim(),i=e.reasoning===!0,a=e.supportsImages===!0?[`text`,`image`]:[`text`],o=r.includes(`api.deepseek.com`);return se({id:e.modelId,name:`${e.modelId} (${n})`,api:this.form.protocol,provider:n,baseUrl:r.replace(/\/$/,``),reasoning:i,input:a,cost:{input:0,output:0,cacheRead:0,cacheWrite:0},contextWindow:Number(e.contextWindow)||O.contextWindow,maxTokens:Number(e.maxTokens)||O.maxTokens,headers:Object.keys(t).length>0?t:void 0,thinkingLevelMap:o&&i?{low:`high`,medium:`high`,high:`high`,xhigh:`max`}:void 0,compat:this.form.protocol===`openai-completions`?{supportsStore:!1,supportsDeveloperRole:!1,supportsReasoningEffort:i,supportsUsageInStreaming:!1,supportsStrictMode:!1,maxTokensField:`max_tokens`,...o&&i?{requiresReasoningContentOnAssistantMessages:!0,thinkingFormat:`deepseek`}:{}}:void 0})}async testConnection(){let e=this.form.baseUrl.trim(),t=this.form.models.find(e=>e.modelId.trim());if(!e||!t){this.testing=!1,this.testResult=`fail`,this.testError=w(`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||w(`connectionFailed`))}catch(e){this.testResult=`fail`,this.testError=e?.message||w(`connectionFailed`)}finally{this.testing=!1,this.requestUpdate()}}async saveModel(){let e=this.form.name.trim(),t=this.form.baseUrl.trim();if(!e||!t){A(w(`fillProviderBaseUrlModel`));return}let n=this.form.models.filter(e=>e.modelId.trim());if(n.length===0){A(w(`atLeastOneModel`));return}let r=n.map(e=>e.modelId.trim());if(new Set(r).size!==r.length){A(w(`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??le(),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),ce(),this.closeForm(),await this.loadProviders()}catch(e){x.error(`Failed to save custom model:`,e),A(w(`saveCustomModelFailed`))}}async deleteProvider(e){if(await T({description:w(`confirmDeleteProvider`,{name:e.name}),confirmLabel:w(`confirmDelete`),cancelLabel:w(`cancel`),variant:`destructive`}))try{let t=y();await t.customProviders.delete(e.id),await t.providerKeys.delete(e.name),ce(),await this.loadProviders()}catch(e){x.error(`Failed to delete custom provider:`,e),A(w(`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-XNjuqJs7.js","assets/rolldown-runtime-DWdDZTNf.js","assets/index-_ZhK6bvp.js","assets/pi-ai-Cr2ee4a0.js","assets/dist-DLKC_odd.js","assets/pi-web-ui-DV5jKjSg.js","assets/lit-vendor-DvaQX_UQ.js","assets/css-utils-31qzCXsk.js","assets/icons-CXPP1fFT.js","assets/react-vendor-1KC5PyRx.js","assets/skills-dialog-BThnIUBs.js","assets/logger-8REuLPGK.js","assets/model-reference-o41fJ6jQ.js","assets/index-iVV2bP_f.css","assets/model-identity-CgA6_Pbm.js","assets/mcp-servers-dialog-BUSPvaqI.js","assets/PluginsPage-BQgp0qN-.js","assets/plugin-api-Uu2xAB4d.js","assets/ScheduledTasksPage-DdekATzq.js","assets/ShareLinksSettingsPage-C75WJpaF.js","assets/CloudAccountSettingsPage-GJSoi6sO.js"])))=>i.map(i=>d[i]);
2
+ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,Ht as n,It as r,Nt as i,Ot as a,P as o,Pt as s,Rt as c,Vt as ee,Wt as l,Y as u,_ as d,bt as f,d as te,l as p,m,mt as h,pt as g,q as _,vt as v,w as ne,y as re}from"./icons-CXPP1fFT.js";import{n as y,r as ie}from"./react-vendor-1KC5PyRx.js";import{p as b}from"./lit-vendor-DvaQX_UQ.js";import{m as x,x as S}from"./pi-web-ui-DV5jKjSg.js";import{J as C}from"./pi-ai-Cr2ee4a0.js";import{t as w}from"./logger-8REuLPGK.js";import{t as ae}from"./model-reference-o41fJ6jQ.js";import{$ as oe,$t as se,B as ce,G as le,Gt as ue,H as de,J as T,K as fe,Qt as pe,U as me,V as he,W as ge,Wt as E,X as _e,Xt as ve,Yt as ye,Zt as be,a as xe,at as D,cn as Se,dn as O,et as Ce,i as k,in as we,it as Te,ln as Ee,n as De,nn as Oe,on as ke,ot as A,q as j,qt as Ae,r as je,rt as Me,sn as M,t as Ne,tt as Pe,un as N,z as Fe}from"./index-_ZhK6bvp.js";var P=e(l(),1),Ie={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:E.name,baseUrl:E.baseUrl,protocol:`openai-completions`,modelId:E.modelId,supportsImages:E.supportsImages}},Le=[{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`)}],F=()=>({modelId:``,contextWindow:E.contextWindow,maxTokens:E.maxTokens,reasoning:!0,supportsImages:!1,visibleInSelectors:!0,open:!1}),I=()=>({name:E.name,baseUrl:E.baseUrl,apiKey:``,headerRows:[],protocol:`openai-completions`,models:[F()]}),Re=class extends x{providers=[];form=I();editingProviderId;formOpen=!1;loading=!0;apiKeyVisible=!1;advancedOpen=!1;activePreset=``;testing=!1;testResult=`idle`;testError=``;autoEditProviderName=null;async connectedCallback(){if(super.connectedCallback(),await this.loadProviders(),this.autoEditProviderName){let e=this.providers.find(e=>e.name===this.autoEditProviderName);e&&await this.openEditForm(e),this.autoEditProviderName=null}}getTabName(){return O(`customModels`)}async loadProviders(){this.loading=!0,this.requestUpdate();try{this.providers=await S().customProviders.getAll()}catch(e){w.error(`Failed to load custom providers:`,e),this.providers=[]}finally{this.loading=!1,this.requestUpdate()}}resetTestState(){this.testing=!1,this.testResult=`idle`,this.testError=``}openAddForm(){this.editingProviderId=void 0,this.form=I(),this.apiKeyVisible=!1,this.advancedOpen=!1,this.activePreset=``,this.resetTestState(),this.formOpen=!0,this.requestUpdate()}async openEditForm(e){let t=await S().providerKeys.get(e.name)??e.apiKey??``,n=e.models??[],r=n.length>0?n.map(e=>({modelId:e.id,contextWindow:e.contextWindow??E.contextWindow,maxTokens:e.maxTokens??E.maxTokens,reasoning:e.reasoning===!0,supportsImages:e.input?.includes(`image`)===!0,visibleInSelectors:e.quickforgeHidden!==!0,open:!1})):[F()],i=n[0]?.headers??{},a=Object.entries(i).map(([e,t])=>({key:e,value:String(t)}));this.editingProviderId=e.id,this.form={providerId:e.id,id:e.id,name:e.name,baseUrl:e.baseUrl,apiKey:t,headerRows:a,protocol:e.type===`anthropic-messages`?`anthropic-messages`:`openai-completions`,models:r},this.apiKeyVisible=!1,this.advancedOpen=a.length>0||e.type===`anthropic-messages`,this.activePreset=``,this.resetTestState(),this.formOpen=!0,this.requestUpdate()}closeForm(){this.formOpen=!1,this.editingProviderId=void 0,this.form=I(),this.apiKeyVisible=!1,this.advancedOpen=!1,this.activePreset=``,this.resetTestState(),this.requestUpdate()}toggleApiKeyVisibility(){this.apiKeyVisible=!this.apiKeyVisible,this.requestUpdate()}updateForm(e,t){this.form={...this.form,[e]:t},(e===`name`||e===`baseUrl`)&&(this.activePreset=``),this.resetTestState(),this.requestUpdate()}updateModelField(e,t,n){let r=this.form.models.map((r,i)=>i===e?{...r,[t]:n}:r);this.form={...this.form,models:r},t===`modelId`&&(this.activePreset=``,this.resetTestState()),this.requestUpdate()}addModelRow(){this.form={...this.form,models:[...this.form.models,F()]},this.requestUpdate()}removeModelRow(e){let t=this.form.models.filter((t,n)=>n!==e);this.form={...this.form,models:t},this.requestUpdate()}toggleModelExpanded(e){let t=this.form.models.map((t,n)=>n===e?{...t,open:!t.open}:t);this.form={...this.form,models:t},this.requestUpdate()}addHeaderRow(){this.form={...this.form,headerRows:[...this.form.headerRows,{key:``,value:``}]},this.requestUpdate()}updateHeaderRow(e,t,n){let r=this.form.headerRows.map((r,i)=>i===e?{...r,[t]:n}:r);this.form={...this.form,headerRows:r},this.requestUpdate()}removeHeaderRow(e){let t=this.form.headerRows.filter((t,n)=>n!==e);this.form={...this.form,headerRows:t},this.requestUpdate()}applyPreset(e){if(this.activePreset=e,e===`custom`)this.form={...this.form,name:``,baseUrl:``,protocol:`openai-completions`,models:[F()]};else{let t=Ie[e];this.form={...this.form,name:t.name,baseUrl:t.baseUrl,protocol:t.protocol,models:[{...F(),modelId:t.modelId,supportsImages:t.supportsImages===!0,open:!1}]}}this.resetTestState(),this.requestUpdate()}buildHeadersFromRows(){let e={};for(let t of this.form.headerRows){let n=t.key.trim(),r=t.value.trim();n&&r&&(e[n]=r)}return e}buildModel(e,t){let n=this.form.name.trim(),r=this.form.baseUrl.trim(),i=e.reasoning===!0,a=e.supportsImages===!0?[`text`,`image`]:[`text`],o=r.includes(`api.deepseek.com`);return ve({id:e.modelId,name:`${e.modelId} (${n})`,api:this.form.protocol,provider:n,baseUrl:r.replace(/\/$/,``),reasoning:i,input:a,quickforgeHidden:e.visibleInSelectors?void 0:!0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0},contextWindow:Number(e.contextWindow)||E.contextWindow,maxTokens:Number(e.maxTokens)||E.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){D(O(`fillProviderBaseUrlModel`));return}let n=this.form.models.filter(e=>e.modelId.trim());if(n.length===0){D(O(`atLeastOneModel`));return}let r=n.map(e=>e.modelId.trim());if(new Set(r).size!==r.length){D(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??se(),name:e,type:this.form.protocol,baseUrl:a[0].baseUrl,apiKey:o||void 0,models:a};try{let e=S();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),Oe(),this.closeForm(),await this.loadProviders()}catch(e){w.error(`Failed to save custom model:`,e),D(O(`saveCustomModelFailed`))}}async deleteProvider(e){if(await A({description:O(`confirmDeleteProvider`,{name:e.name}),confirmLabel:O(`confirmDelete`),cancelLabel:O(`cancel`),variant:`destructive`}))try{let t=S();await t.customProviders.delete(e.id),await t.providerKeys.delete(e.name),Oe(),await this.loadProviders()}catch(e){w.error(`Failed to delete custom provider:`,e),D(O(`deleteFailed`))}}renderProvider(e){let t=e.models??[],n=t.length,r=e.type===`anthropic-messages`?`Anthropic Messages`:`OpenAI Compatible`;return b`
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,At as n,Dt 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">${w(`providerProtocol`)}: ${r}</span>
12
- <span class="quickforge-settings-badge quickforge-settings-badge-info">${w(`modelsCount`,{count:n})}</span>
13
- ${n===0?_`<span class="quickforge-settings-badge quickforge-settings-badge-warning">${w(`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?b`<span class="quickforge-settings-badge quickforge-settings-badge-warning">${O(`noModelAdded`)}</span>`:null}
14
14
  </div>
15
- ${n>0?_`
15
+ ${n>0?b`
16
16
  <div class="quickforge-settings-meta">
17
- ${t.slice(0,6).map(e=>_`
17
+ ${t.slice(0,6).map(e=>b`
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?b`<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,At as n,Dt as r
29
29
  type="button"
30
30
  @click=${()=>this.openEditForm(e)}
31
31
  >
32
- ${w(`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
- ${w(`delete`)}
39
+ ${O(`delete`)}
40
40
  </button>
41
41
  </div>
42
42
  </div>
43
- `}renderPresetChips(){return _`
43
+ `}renderPresetChips(){return b`
44
44
  <div class="quickforge-settings-form-row">
45
- <span class="quickforge-settings-form-label">${w(`presets`)}</span>
45
+ <span class="quickforge-settings-form-label">${O(`presets`)}</span>
46
46
  <div class="quickforge-settings-segmented quickforge-settings-segmented-wrap">
47
- ${Ie.map(e=>_`
47
+ ${Le.map(e=>b`
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,At as n,Dt 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 b`
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=${w(`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,At as n,Dt 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=${w(`modelIdPlaceholder`)}
74
+ placeholder=${O(`modelIdPlaceholder`)}
75
75
  />
76
- ${n?_`
76
+ ${n?b`
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">${w(`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,At as n,Dt as r
85
85
  />
86
86
  </label>
87
87
  <label class="quickforge-settings-form-row">
88
- <span class="quickforge-settings-form-label">${w(`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,7 +100,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,At as n,Dt as r
100
100
  .checked=${e.reasoning}
101
101
  @change=${e=>this.updateModelField(t,`reasoning`,e.target.checked)}
102
102
  />
103
- <span>${w(`reasoningModel`)}</span>
103
+ <span>${O(`reasoningModel`)}</span>
104
104
  </label>
105
105
  <label class="mt-2 flex items-center gap-2 text-sm text-muted-foreground">
106
106
  <input
@@ -109,49 +109,60 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,At as n,Dt as r
109
109
  @change=${e=>this.updateModelField(t,`supportsImages`,e.target.checked)}
110
110
  />
111
111
  <span>
112
- ${w(`imageInputModel`)}
113
- <quickforge-info-tip .label=${w(`imageInputModelHelp`)}></quickforge-info-tip>
112
+ ${O(`imageInputModel`)}
113
+ <quickforge-info-tip .label=${O(`imageInputModelHelp`)}></quickforge-info-tip>
114
114
  </span>
115
115
  </label>
116
+ <div class="mt-3 flex items-center justify-between gap-3 rounded-lg border border-border px-3 py-2">
117
+ <span class="text-sm text-muted-foreground">${O(`showModelInSelectors`)}</span>
118
+ <label class="quickforge-settings-switch" title=${O(`showModelInSelectorsHelp`)}>
119
+ <input
120
+ type="checkbox"
121
+ .checked=${e.visibleInSelectors}
122
+ @change=${e=>this.updateModelField(t,`visibleInSelectors`,e.target.checked)}
123
+ />
124
+ <span aria-hidden="true"></span>
125
+ </label>
126
+ </div>
116
127
  `:null}
117
128
  </div>
118
- ${this.form.models.length>1?_`
129
+ ${this.form.models.length>1?b`
119
130
  <button
120
131
  class="quickforge-settings-icon-action quickforge-settings-icon-action-danger"
121
132
  type="button"
122
- title=${w(`delete`)}
133
+ title=${O(`delete`)}
123
134
  @click=${()=>this.removeModelRow(t)}
124
135
  >
125
136
 
126
137
  </button>
127
138
  `:null}
128
139
  </div>
129
- `}renderHeadersEditor(){return _`
140
+ `}renderHeadersEditor(){return b`
130
141
  <div class="quickforge-settings-form-row">
131
142
  <span class="quickforge-settings-form-label">
132
- ${w(`customHeaders`)}
133
- <quickforge-info-tip .label=${w(`customHeadersHelp`)}></quickforge-info-tip>
143
+ ${O(`customHeaders`)}
144
+ <quickforge-info-tip .label=${O(`customHeadersHelp`)}></quickforge-info-tip>
134
145
  </span>
135
- ${this.form.headerRows.length===0?_``:_`
146
+ ${this.form.headerRows.length===0?b``:b`
136
147
  <div class="quickforge-settings-nested-list">
137
- ${this.form.headerRows.map((e,t)=>_`
148
+ ${this.form.headerRows.map((e,t)=>b`
138
149
  <div class="quickforge-settings-subrow">
139
150
  <input
140
151
  class="quickforge-settings-input"
141
152
  .value=${e.key}
142
153
  @input=${e=>this.updateHeaderRow(t,`key`,e.target.value)}
143
- placeholder=${w(`headerName`)}
154
+ placeholder=${O(`headerName`)}
144
155
  />
145
156
  <input
146
157
  class="quickforge-settings-input"
147
158
  .value=${e.value}
148
159
  @input=${e=>this.updateHeaderRow(t,`value`,e.target.value)}
149
- placeholder=${w(`headerValue`)}
160
+ placeholder=${O(`headerValue`)}
150
161
  />
151
162
  <button
152
163
  class="quickforge-settings-icon-action quickforge-settings-icon-action-danger"
153
164
  type="button"
154
- title=${w(`removeHeader`)}
165
+ title=${O(`removeHeader`)}
155
166
  @click=${()=>this.removeHeaderRow(t)}
156
167
  >
157
168
 
@@ -165,11 +176,11 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,At as n,Dt as r
165
176
  type="button"
166
177
  @click=${()=>this.addHeaderRow()}
167
178
  >
168
- + ${w(`addHeader`)}
179
+ + ${O(`addHeader`)}
169
180
  </button>
170
181
  </div>
171
- `}renderTestStatus(){return this.testResult===`idle`&&!this.testing?_``:this.testing?_`<span class="quickforge-settings-status">${w(`testingConnection`)}</span>`:this.testResult===`ok`?_`<span class="quickforge-settings-badge quickforge-settings-badge-success">✓ ${w(`connectionOk`)}</span>`:_`<span class="quickforge-settings-alert">✗ ${this.testError||w(`connectionFailed`)}</span>`}renderForm(){return _`
172
- <section class="quickforge-settings-section" aria-label=${this.editingProviderId?w(`editCustomModel`):w(`addCustomModel`)}>
182
+ `}renderTestStatus(){return this.testResult===`idle`&&!this.testing?b``:this.testing?b`<span class="quickforge-settings-status">${O(`testingConnection`)}</span>`:this.testResult===`ok`?b`<span class="quickforge-settings-badge quickforge-settings-badge-success">✓ ${O(`connectionOk`)}</span>`:b`<span class="quickforge-settings-alert">✗ ${this.testError||O(`connectionFailed`)}</span>`}renderForm(){return b`
183
+ <section class="quickforge-settings-section" aria-label=${this.editingProviderId?O(`editCustomModel`):O(`addCustomModel`)}>
173
184
  <div class="quickforge-settings-toolbar">
174
185
  <button
175
186
  class="quickforge-settings-button quickforge-settings-button-secondary"
@@ -177,11 +188,11 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,At as n,Dt as r
177
188
  @click=${()=>this.closeForm()}
178
189
  >
179
190
  <svg class="size-4" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m12 19-7-7 7-7"/><path d="M19 12H5"/></svg>
180
- ${w(`back`)}
191
+ ${O(`back`)}
181
192
  </button>
182
193
  <div class="quickforge-settings-row-main">
183
- <div class="quickforge-settings-row-title">${this.editingProviderId?w(`editCustomModel`):w(`addCustomModel`)}</div>
184
- <div class="quickforge-settings-row-description">${w(`customModelsDescription`)}</div>
194
+ <div class="quickforge-settings-row-title">${this.editingProviderId?O(`editCustomModel`):O(`addCustomModel`)}</div>
195
+ <div class="quickforge-settings-row-description">${O(`customModelsDescription`)}</div>
185
196
  </div>
186
197
  </div>
187
198
 
@@ -189,12 +200,12 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,At as n,Dt as r
189
200
  ${this.renderPresetChips()}
190
201
 
191
202
  <label class="quickforge-settings-form-row">
192
- <span class="quickforge-settings-form-label">${w(`providerName`)}</span>
203
+ <span class="quickforge-settings-form-label">${O(`providerName`)}</span>
193
204
  <input
194
205
  class="quickforge-settings-input"
195
206
  .value=${this.form.name}
196
207
  @input=${e=>this.updateForm(`name`,e.target.value)}
197
- placeholder=${w(`providerNamePlaceholder`)}
208
+ placeholder=${O(`providerNamePlaceholder`)}
198
209
  />
199
210
  </label>
200
211
 
@@ -209,37 +220,37 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,At as n,Dt as r
209
220
  </label>
210
221
 
211
222
  <label class="quickforge-settings-form-row">
212
- <span class="quickforge-settings-form-label">${w(`apiKey`)}</span>
223
+ <span class="quickforge-settings-form-label">${O(`apiKey`)}</span>
213
224
  <div class="quickforge-settings-inline-field">
214
225
  <input
215
226
  class="quickforge-settings-input pr-10"
216
227
  .value=${this.form.apiKey}
217
228
  type=${this.apiKeyVisible?`text`:`password`}
218
229
  @input=${e=>this.updateForm(`apiKey`,e.target.value)}
219
- placeholder=${w(`apiKeyPlaceholder`)}
230
+ placeholder=${O(`apiKeyPlaceholder`)}
220
231
  />
221
232
  <button
222
233
  class="quickforge-settings-inline-field-button"
223
234
  type="button"
224
- title=${this.apiKeyVisible?w(`hideApiKey`):w(`showApiKey`)}
225
- aria-label=${this.apiKeyVisible?w(`hideApiKey`):w(`showApiKey`)}
235
+ title=${this.apiKeyVisible?O(`hideApiKey`):O(`showApiKey`)}
236
+ aria-label=${this.apiKeyVisible?O(`hideApiKey`):O(`showApiKey`)}
226
237
  aria-pressed=${this.apiKeyVisible?`true`:`false`}
227
238
  @click=${()=>this.toggleApiKeyVisibility()}
228
239
  >
229
- ${this.apiKeyVisible?_`<svg class="size-4" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10.73 5.08A10.43 10.43 0 0 1 12 5c7 0 10 7 10 7a13.16 13.16 0 0 1-1.67 2.68"/><path d="M6.61 6.61A13.53 13.53 0 0 0 2 12s3 7 10 7a9.74 9.74 0 0 0 5.39-1.61"/><line x1="2" y1="2" x2="22" y2="22"/><path d="M8.53 8.53A5 5 0 0 0 12 17a5 5 0 0 0 3.47-8.53"/></svg>`:_`<svg class="size-4" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M2 12s3-7 10-7 10 7 10 7-3 7-10 7-10-7-10-7Z"/><circle cx="12" cy="12" r="3"/></svg>`}
240
+ ${this.apiKeyVisible?b`<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>`:b`<svg class="size-4" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M2 12s3-7 10-7 10 7 10 7-3 7-10 7-10-7-10-7Z"/><circle cx="12" cy="12" r="3"/></svg>`}
230
241
  </button>
231
242
  </div>
232
243
  </label>
233
244
 
234
245
  <div class="quickforge-settings-form-row">
235
246
  <div class="flex items-center justify-between gap-3">
236
- <span class="quickforge-settings-form-label">${w(`modelsList`)}</span>
247
+ <span class="quickforge-settings-form-label">${O(`modelsList`)}</span>
237
248
  <button
238
249
  class="quickforge-settings-button quickforge-settings-button-secondary quickforge-settings-button-compact"
239
250
  type="button"
240
251
  @click=${()=>this.addModelRow()}
241
252
  >
242
- + ${w(`addModel`)}
253
+ + ${O(`addModel`)}
243
254
  </button>
244
255
  </div>
245
256
  <div class="quickforge-settings-nested-list">
@@ -254,15 +265,15 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,At as n,Dt as r
254
265
  @click=${()=>{this.advancedOpen=!this.advancedOpen,this.requestUpdate()}}
255
266
  >
256
267
  <span>${this.advancedOpen?`▾`:`▸`}</span>
257
- ${w(`providerAdvanced`)}
268
+ ${O(`providerAdvanced`)}
258
269
  </button>
259
270
 
260
- ${this.advancedOpen?_`
271
+ ${this.advancedOpen?b`
261
272
  <div class="quickforge-settings-form-grid rounded-lg border border-border p-3">
262
273
  <label class="quickforge-settings-form-row">
263
274
  <span class="quickforge-settings-form-label">
264
- ${w(`protocolType`)}
265
- <quickforge-info-tip .label=${w(`protocolHelp`)}></quickforge-info-tip>
275
+ ${O(`protocolType`)}
276
+ <quickforge-info-tip .label=${O(`protocolHelp`)}></quickforge-info-tip>
266
277
  </span>
267
278
  <select
268
279
  class="quickforge-settings-select"
@@ -288,7 +299,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,At as n,Dt as r
288
299
  type="button"
289
300
  @click=${()=>this.closeForm()}
290
301
  >
291
- ${w(`cancel`)}
302
+ ${O(`cancel`)}
292
303
  </button>
293
304
  <button
294
305
  class="quickforge-settings-button quickforge-settings-button-secondary"
@@ -296,49 +307,49 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,At as n,Dt as r
296
307
  ?disabled=${this.testing}
297
308
  @click=${()=>this.testConnection()}
298
309
  >
299
- ${this.testing?w(`testingConnection`):w(`testConnection`)}
310
+ ${this.testing?O(`testingConnection`):O(`testConnection`)}
300
311
  </button>
301
312
  <button
302
313
  class="quickforge-settings-button quickforge-settings-button-primary"
303
314
  type="button"
304
315
  @click=${()=>this.saveModel()}
305
316
  >
306
- ${w(`save`)}
317
+ ${O(`save`)}
307
318
  </button>
308
319
  </div>
309
320
  </div>
310
321
  </section>
311
- `}render(){return this.formOpen?_`
322
+ `}render(){return this.formOpen?b`
312
323
  <div class="quickforge-settings-stack">
313
324
  <div class="quickforge-settings-heading">
314
325
  <h3 class="quickforge-settings-title">
315
- ${this.editingProviderId?w(`editCustomModel`):w(`addCustomModel`)}
316
- <quickforge-info-tip .label=${w(`customModelsDescription`)}></quickforge-info-tip>
326
+ ${this.editingProviderId?O(`editCustomModel`):O(`addCustomModel`)}
327
+ <quickforge-info-tip .label=${O(`customModelsDescription`)}></quickforge-info-tip>
317
328
  </h3>
318
329
  </div>
319
330
  ${this.renderForm()}
320
331
  </div>
321
- `:_`
332
+ `:b`
322
333
  <div class="quickforge-settings-stack">
323
- <section class="quickforge-settings-section" aria-label=${w(`customModelsTitle`)}>
334
+ <section class="quickforge-settings-section" aria-label=${O(`customModelsTitle`)}>
324
335
  <div class="quickforge-settings-toolbar">
325
336
  <div>
326
- <div class="quickforge-settings-row-title">${w(`customModelsTitle`)}</div>
327
- <div class="quickforge-settings-row-description">${w(`customModelsDescription`)}</div>
337
+ <div class="quickforge-settings-row-title">${O(`customModelsTitle`)}</div>
338
+ <div class="quickforge-settings-row-description">${O(`customModelsDescription`)}</div>
328
339
  </div>
329
340
  <button
330
341
  class="quickforge-settings-button quickforge-settings-button-primary"
331
342
  type="button"
332
343
  @click=${()=>this.openAddForm()}
333
344
  >
334
- ${w(`addModel`)}
345
+ ${O(`addModel`)}
335
346
  </button>
336
347
  </div>
337
348
 
338
- ${this.loading?_`<div class="quickforge-settings-empty-row">${w(`loading`)}</div>`:this.providers.length===0?_`<div class="quickforge-settings-empty-row">${w(`noCustomModels`)}</div>`:this.providers.map(e=>this.renderProvider(e))}
349
+ ${this.loading?b`<div class="quickforge-settings-empty-row">${O(`loading`)}</div>`:this.providers.length===0?b`<div class="quickforge-settings-empty-row">${O(`noCustomModels`)}</div>`:this.providers.map(e=>this.renderProvider(e))}
339
350
  </section>
340
351
  </div>
341
- `}},P=`quickforge-custom-providers-only-tab`;customElements.get(P)||customElements.define(P,Le);function Re(e){let t=document.createElement(P);return e&&(t.autoEditProviderName=e),t}var ze=[{value:`light`,label:()=>w(`lightTheme`)},{value:`dark`,label:()=>w(`darkTheme`)}],Be=class extends v{theme=me();interfaceFontSizePx=S.interfaceFontSizePx;messageFontSizePx=S.messageFontSizePx;loading=!0;error=``;getTabName(){return w(`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([he(e),Se(e)]);this.theme=t.theme,this.interfaceFontSizePx=n.interfaceFontSizePx,this.messageFontSizePx=n.messageFontSizePx}catch(e){this.error=e instanceof Error?e.message:w(`requestFailed`)}finally{this.loading=!1,this.requestUpdate()}}async selectTheme(e){if(this.theme!==e){this.theme=e,this.requestUpdate();try{await ve(y(),{theme:e}),this.error=``,this.requestUpdate()}catch(e){this.error=e instanceof Error?e.message:w(`requestFailed`),this.requestUpdate()}}}currentFontSizeSettings(){return fe({interfaceFontSizePx:this.interfaceFontSizePx,messageFontSizePx:this.messageFontSizePx})}previewFontSize(e){let t=fe(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 xe(y(),this.currentFontSizeSettings()),this.error=``,this.requestUpdate()}catch(e){this.error=e instanceof Error?e.message:w(`requestFailed`),this.requestUpdate()}}renderThemeOption(e){let t=this.theme===e.value;return _`
352
+ `}},L=`quickforge-custom-providers-only-tab`;customElements.get(L)||customElements.define(L,Re);function ze(e){let t=document.createElement(L);return e&&(t.autoEditProviderName=e),t}var Be=[{value:`light`,label:()=>O(`lightTheme`)},{value:`dark`,label:()=>O(`darkTheme`)}],Ve=class extends x{theme=ge();interfaceFontSizePx=j.interfaceFontSizePx;messageFontSizePx=j.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=S(),[t,n]=await Promise.all([le(e),oe(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 fe(S(),{theme:e}),this.error=``,this.requestUpdate()}catch(e){this.error=e instanceof Error?e.message:O(`requestFailed`),this.requestUpdate()}}}currentFontSizeSettings(){return Ce({interfaceFontSizePx:this.interfaceFontSizePx,messageFontSizePx:this.messageFontSizePx})}previewFontSize(e){let t=Ce(e);this.interfaceFontSizePx=t.interfaceFontSizePx,this.messageFontSizePx=t.messageFontSizePx,_e(t),this.requestUpdate()}updateInterfaceFontSize(e){this.previewFontSize({...this.currentFontSizeSettings(),interfaceFontSizePx:Number(e)||j.interfaceFontSizePx})}updateMessageFontSize(e){this.previewFontSize({...this.currentFontSizeSettings(),messageFontSizePx:Number(e)||j.messageFontSizePx})}async saveFontSize(){try{await Pe(S(),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 b`
342
353
  <button
343
354
  type="button"
344
355
  class="quickforge-settings-segmented-option ${t?`quickforge-settings-segmented-option-active`:``}"
@@ -347,14 +358,14 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,At as n,Dt as r
347
358
  >
348
359
  ${e.label()}
349
360
  </button>
350
- `}getFontSizeRangeProgress(e){return(e-C.min)/(C.max-C.min)*100}renderFontSizeSlider(e,t,n,r){return _`
361
+ `}getFontSizeRangeProgress(e){return(e-T.min)/(T.max-T.min)*100}renderFontSizeSlider(e,t,n,r){return b`
351
362
  <div class="quickforge-settings-row">
352
363
  <div class="quickforge-settings-row-main">
353
364
  <div class="quickforge-settings-row-title">
354
365
  ${e}
355
- ${t?_`<quickforge-info-tip .label=${t}></quickforge-info-tip>`:null}
366
+ ${t?b`<quickforge-info-tip .label=${t}></quickforge-info-tip>`:null}
356
367
  </div>
357
- <div class="quickforge-settings-row-description">${w(`fontSizeRangeDescription`)}</div>
368
+ <div class="quickforge-settings-row-description">${O(`fontSizeRangeDescription`)}</div>
358
369
  </div>
359
370
  <div class="quickforge-settings-row-control quickforge-settings-slider-control">
360
371
  <span class="quickforge-settings-value-badge">${n}px</span>
@@ -362,8 +373,8 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,At as n,Dt as r
362
373
  class="quickforge-font-size-slider"
363
374
  style=${`--quickforge-font-size-slider-progress: ${this.getFontSizeRangeProgress(n)}%`}
364
375
  type="range"
365
- min=${String(C.min)}
366
- max=${String(C.max)}
376
+ min=${String(T.min)}
377
+ max=${String(T.max)}
367
378
  step="1"
368
379
  .value=${String(n)}
369
380
  @input=${e=>r(e.target.value)}
@@ -371,74 +382,74 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,At as n,Dt as r
371
382
  />
372
383
  </div>
373
384
  </div>
374
- `}render(){return this.loading?_`<div class="text-sm text-muted-foreground">${w(`loading`)}</div>`:_`
385
+ `}render(){return this.loading?b`<div class="text-sm text-muted-foreground">${O(`loading`)}</div>`:b`
375
386
  <div class="quickforge-settings-stack">
376
- <section class="quickforge-settings-section" aria-label=${w(`appearance`)}>
387
+ <section class="quickforge-settings-section" aria-label=${O(`appearance`)}>
377
388
  <div class="quickforge-settings-row">
378
389
  <div class="quickforge-settings-row-main">
379
390
  <div class="quickforge-settings-row-title">
380
- ${w(`theme`)}
381
- <quickforge-info-tip .label=${w(`themeDescription`)}></quickforge-info-tip>
391
+ ${O(`theme`)}
392
+ <quickforge-info-tip .label=${O(`themeDescription`)}></quickforge-info-tip>
382
393
  </div>
383
- <div class="quickforge-settings-row-description">${w(`themeDescription`)}</div>
394
+ <div class="quickforge-settings-row-description">${O(`themeDescription`)}</div>
384
395
  </div>
385
396
  <div class="quickforge-settings-row-control">
386
- <div class="quickforge-settings-segmented" role="group" aria-label=${w(`theme`)}>
387
- ${ze.map(e=>this.renderThemeOption(e))}
397
+ <div class="quickforge-settings-segmented" role="group" aria-label=${O(`theme`)}>
398
+ ${Be.map(e=>this.renderThemeOption(e))}
388
399
  </div>
389
400
  </div>
390
401
  </div>
391
402
 
392
- ${this.renderFontSizeSlider(w(`interfaceFontSize`),null,this.interfaceFontSizePx,e=>this.updateInterfaceFontSize(e))}
403
+ ${this.renderFontSizeSlider(O(`interfaceFontSize`),null,this.interfaceFontSizePx,e=>this.updateInterfaceFontSize(e))}
393
404
 
394
- ${this.renderFontSizeSlider(w(`messageFontSize`),w(`messageFontSizeNote`),this.messageFontSizePx,e=>this.updateMessageFontSize(e))}
405
+ ${this.renderFontSizeSlider(O(`messageFontSize`),O(`messageFontSizeNote`),this.messageFontSizePx,e=>this.updateMessageFontSize(e))}
395
406
  </section>
396
407
 
397
- ${this.error?_`<span class="quickforge-settings-error">${this.error}</span>`:null}
408
+ ${this.error?b`<span class="quickforge-settings-error">${this.error}</span>`:null}
398
409
  </div>
399
- `}},F=`quickforge-appearance-settings-tab`;customElements.get(F)||customElements.define(F,Be);function Ve(){return document.createElement(F)}var He=`auto-compact-settings`,I={enabled:!0,thresholdPercent:80,keepRecentTurns:3,minSourceChars:1600,requireConfirmation:!0};function L(e,t,n,r){let i=Number(e);return Number.isFinite(i)?Math.min(r,Math.max(n,Math.round(i))):t}function Ue(e){if(!e||typeof e!=`object`)return{...I};let t=e;return{enabled:t.enabled!==!1,thresholdPercent:L(t.thresholdPercent,I.thresholdPercent,50,95),keepRecentTurns:L(t.keepRecentTurns,I.keepRecentTurns,1,20),minSourceChars:L(t.minSourceChars,I.minSourceChars,0,2e5),requireConfirmation:t.requireConfirmation!==!1}}async function We(e){return Ue(await e.settings.get(He))}async function Ge(e,t){await e.settings.set(He,Ue(t))}var Ke=`auto-archive-settings`,qe={enabled:!1};function Je(e){return!e||typeof e!=`object`?{...qe}:{enabled:e.enabled===!0}}async function Ye(e){return Je(await e.settings.get(Ke))}async function Xe(e,t){await e.settings.set(Ke,Je(t))}var Ze=[{value:`off`,label:()=>w(`thinkingOff`)},{value:`low`,label:()=>w(`thinkingLow`)},{value:`medium`,label:()=>w(`thinkingMedium`)},{value:`high`,label:()=>w(`thinkingHigh`)},{value:`xhigh`,label:()=>w(`thinkingXHigh`)}],Qe=[{value:`compact`,label:()=>w(`toolDisplayCompact`)},{value:`detailed`,label:()=>w(`toolDisplayDetailed`)}],R=`__custom__`;function $e(e){return(e??``).trim().replace(/\/$/,``)}function z(e){return JSON.stringify([e.provider,e.id,e.api,$e(e.baseUrl)])}function et(e){return`${e.provider} / ${e.id}`}function tt(){return`custom_${globalThis.crypto?.randomUUID?.().slice(0,8)||Date.now().toString(36)}`}function nt(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 rt=_`
410
+ `}},R=`quickforge-appearance-settings-tab`;customElements.get(R)||customElements.define(R,Ve);function He(){return document.createElement(R)}var Ue=`auto-compact-settings`,z={enabled:!0,thresholdPercent:80,keepRecentTurns:3,minSourceChars:1600,requireConfirmation:!0};function B(e,t,n,r){let i=Number(e);return Number.isFinite(i)?Math.min(r,Math.max(n,Math.round(i))):t}function We(e){if(!e||typeof e!=`object`)return{...z};let t=e;return{enabled:t.enabled!==!1,thresholdPercent:B(t.thresholdPercent,z.thresholdPercent,50,95),keepRecentTurns:B(t.keepRecentTurns,z.keepRecentTurns,1,20),minSourceChars:B(t.minSourceChars,z.minSourceChars,0,2e5),requireConfirmation:t.requireConfirmation!==!1}}async function Ge(e){return We(await e.settings.get(Ue))}async function Ke(e,t){await e.settings.set(Ue,We(t))}var qe=`auto-archive-settings`,Je={enabled:!1};function Ye(e){return!e||typeof e!=`object`?{...Je}:{enabled:e.enabled===!0}}async function Xe(e){return Ye(await e.settings.get(qe))}async function Ze(e,t){await e.settings.set(qe,Ye(t))}var Qe=[{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`)}],$e=[{value:`compact`,label:()=>O(`toolDisplayCompact`)},{value:`detailed`,label:()=>O(`toolDisplayDetailed`)}],V=`__custom__`;function et(e){return(e??``).trim().replace(/\/$/,``)}function H(e){return JSON.stringify([e.provider,e.id,e.api,et(e.baseUrl)])}function tt(){return`custom_${globalThis.crypto?.randomUUID?.().slice(0,8)||Date.now().toString(36)}`}function nt(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 rt=b`
400
411
  <svg class="size-3.5" viewBox="0 0 16 16" fill="none" aria-hidden="true">
401
412
  <path d="M4.5 4.5 11.5 11.5M11.5 4.5 4.5 11.5" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" />
402
413
  </svg>
403
- `,it=class extends v{models=[];selectedModel;thinkingLevel=`off`;toolDisplayMode=`compact`;showContextUsage=!1;autoCompactEnabled=!0;autoCompactRequireConfirmation=!0;autoCompactThresholdPercent=80;autoCompactThresholdPercentInput=`80`;autoCompactKeepRecentTurns=3;autoArchiveEnabled=!1;systemNotificationsEnabled=!1;systemNotificationPermission=`unsupported`;systemNotificationBusy=!1;selectedLanguage=ye();loading=!0;saved=!1;savedMessage=``;error=``;terminalShellConfig={terminalShell:`auto`,defaultProfileId:`auto`,profiles:[]};customShellCommand=``;customShellEditorOpen=!1;networkProxyMode=`direct`;networkProxyUrl=``;savedNetworkProxyConfig={mode:`direct`,proxyUrl:``};networkProxyStatus=null;networkProxySaving=!1;networkProxyLoaded=!1;getTabName(){return w(`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=z(this.selectedModel));let t=this.querySelector(`[data-default-thinking-select]`);t&&(t.value=this.thinkingLevel);let n=this.querySelector(`[data-language-select]`);n&&(n.value=this.selectedLanguage);let r=this.querySelector(`[data-terminal-shell-select]`);r&&(r.value=this.customShellEditorOpen?R:this.selectedTerminalShellProfileId())}async loadSettings(){this.loading=!0,this.error=``,this.requestUpdate();try{let e=y(),[t,n,r,i,a]=await Promise.all([Pe(e),Ne(e),de(e),We(e),Ye(e)]);this.models=t,this.selectedModel=n.model?t.find(e=>z(e)===z(n.model))??n.model:t[0],this.thinkingLevel=n.thinkingLevel??je(this.selectedModel),this.toolDisplayMode=r.toolDisplayMode,this.showContextUsage=r.showContextUsage,this.autoCompactEnabled=i.enabled,this.autoCompactRequireConfirmation=i.requireConfirmation,this.autoCompactThresholdPercent=i.thresholdPercent,this.autoCompactThresholdPercentInput=String(i.thresholdPercent),this.autoCompactKeepRecentTurns=i.keepRecentTurns,this.autoArchiveEnabled=a.enabled,this.systemNotificationsEnabled=Oe(),this.systemNotificationPermission=await Ae(),this.systemNotificationsEnabled&&this.systemNotificationPermission!==`granted`&&(this.systemNotificationsEnabled=!1,k(!1)),await Promise.all([this.loadTerminalShell(),this.loadNetworkProxy()])}catch(e){this.error=e instanceof Error?e.message:w(`requestFailed`)}finally{this.loading=!1,this.requestUpdate()}}updateModel(e){let t=this.models.find(t=>z(t)===e);this.selectedModel=t,this.thinkingLevel=je(t),this.saved=!1,this.requestUpdate(),this.saveDefaultModelOptions()}openDefaultModelSheet(e){_e(this.selectedModel??null,this.models,e=>{e&&this.updateModel(z(e))},{anchor:e.currentTarget})}updateThinkingLevel(e){this.thinkingLevel=Ze.some(t=>t.value===e)?e:`off`,this.saved=!1,this.requestUpdate(),this.saveDefaultModelOptions()}updateLanguage(e){this.selectedLanguage=e===`zh`?`zh`:`en`,this.requestUpdate(),this.applyLanguage()}async applyLanguage(){await ge(y(),this.selectedLanguage)}updateToolDisplayMode(e){this.toolDisplayMode!==e&&(this.toolDisplayMode=e,this.saved=!1,this.requestUpdate(),this.saveToolDisplayOptions())}updateShowContextUsage(e){this.showContextUsage=e,this.saved=!1,this.requestUpdate(),this.saveToolDisplayOptions()}updateAutoCompactEnabled(e){this.autoCompactEnabled=e,this.saved=!1,this.requestUpdate(),this.saveAutoCompactOptions()}updateAutoCompactRequireConfirmation(e){this.autoCompactRequireConfirmation=e,this.saved=!1,this.requestUpdate(),this.saveAutoCompactOptions()}updateAutoArchiveEnabled(e){this.autoArchiveEnabled=e,this.saved=!1,this.requestUpdate(),this.saveAutoArchiveOptions()}async updateSystemNotifications(e){this.systemNotificationBusy=!0,this.saved=!1,this.error=``,this.requestUpdate();try{if(!e){k(!1),this.systemNotificationsEnabled=!1,this.markSaved(w(`systemNotificationsDisabled`));return}let t=await ke();this.systemNotificationPermission=t,this.systemNotificationsEnabled=t===`granted`,t===`granted`?this.markSaved(w(`systemNotificationsEnabled`)):t===`denied`?this.error=w(`systemNotificationsDeniedHelp`):t===`unsupported`&&(this.error=w(`systemNotificationsUnsupported`))}catch(e){this.systemNotificationsEnabled=!1,k(!1),this.error=e instanceof Error?e.message:w(`requestFailed`)}finally{this.systemNotificationBusy=!1,this.requestUpdate()}}async sendTestSystemNotification(){this.systemNotificationBusy=!0,this.error=``,this.requestUpdate();try{await Ce({key:`test:${Date.now()}`,title:w(`systemNotificationTestTitle`),status:`idle`,force:!0})||(this.error=w(`systemNotificationTestFailed`))}catch(e){this.error=e instanceof Error?e.message:w(`systemNotificationTestFailed`)}finally{this.systemNotificationBusy=!1,this.requestUpdate()}}systemNotificationStatusText(){return this.systemNotificationPermission===`unsupported`?w(`systemNotificationsUnsupported`):this.systemNotificationPermission===`denied`?w(`systemNotificationsPermissionDenied`):this.systemNotificationPermission===`granted`?w(`systemNotificationsPermissionGranted`):w(`systemNotificationsPermissionPrompt`)}updateAutoCompactThresholdPercent(e){this.autoCompactThresholdPercentInput=e;let t=Number(e);e!==``&&Number.isFinite(t)&&(this.autoCompactThresholdPercent=t),this.saved=!1,this.requestUpdate()}updateAutoCompactKeepRecentTurns(e){this.autoCompactKeepRecentTurns=Number(e)||3,this.saved=!1,this.requestUpdate()}commitAutoCompactThresholdPercent(){let e=Number(this.autoCompactThresholdPercentInput);if(!Number.isFinite(e)){this.autoCompactThresholdPercentInput=String(this.autoCompactThresholdPercent),this.requestUpdate();return}let t=Math.max(50,Math.min(95,Math.round(e)));this.autoCompactThresholdPercent=t,this.autoCompactThresholdPercentInput=String(t),this.requestUpdate(),this.saveAutoCompactOptions()}commitAutoCompactKeepRecentTurns(){let e=Math.max(1,Math.min(20,Math.round(this.autoCompactKeepRecentTurns||3)));this.autoCompactKeepRecentTurns=e,this.requestUpdate(),this.saveAutoCompactOptions()}markSaved(e=w(`defaultOptionsSaved`)){this.saved=!0,this.savedMessage=e,this.error=``,this.requestUpdate()}customShellProfiles(){return this.terminalShellConfig.profiles.filter(e=>!e.builtin)}selectedTerminalShellProfileId(){let e=this.terminalShellConfig.profiles;return e.some(e=>e.id===this.terminalShellConfig.defaultProfileId)?this.terminalShellConfig.defaultProfileId:e[0]?.id||R}updateTerminalShellSelection(e){if(e===R){this.customShellEditorOpen=!0,this.requestUpdate();return}this.customShellEditorOpen=!1,this.requestUpdate(),this.saveTerminalShellConfig(e)}async loadNetworkProxy(){try{let e=await fetch(`/api/system/network-proxy`,{cache:`no-store`}),t=await e.json().catch(()=>null);if(!e.ok)throw Error(t?.error||w(`requestFailed`));this.networkProxyMode=t?.config?.mode||`direct`,this.networkProxyUrl=t?.config?.proxyUrl||``,this.savedNetworkProxyConfig={mode:this.networkProxyMode,proxyUrl:this.networkProxyUrl},this.networkProxyStatus=t?.status||null,this.networkProxyLoaded=!0}catch(e){this.error=e instanceof Error?e.message:w(`requestFailed`)}}updateNetworkProxyMode(e){this.networkProxyMode===e||this.networkProxySaving||!this.networkProxyLoaded||e===`pac`&&this.networkProxyStatus?.features?.pacUrl!==!0||(this.networkProxyMode=e,this.saved=!1,this.error=``,this.requestUpdate(),!(e===`manual`||e===`pac`)&&this.saveNetworkProxy())}updateNetworkProxyUrl(e){this.networkProxyUrl=e,this.saved=!1,this.requestUpdate()}networkProxyValidationError(){let e=this.networkProxyUrl.trim(),t=this.networkProxyMode===`pac`;if(!e)return w(t?`networkProxyPacUrlRequired`:`networkProxyAddressRequired`);try{let n=new URL(e);return[`http:`,`https:`].includes(n.protocol)?n.hostname?!t&&!n.port?w(`networkProxyAddressPortError`):n.username||n.password?w(t?`networkProxyPacUrlCredentialsError`:`networkProxyAddressCredentialsError`):t&&n.hash?w(`networkProxyPacUrlFragmentError`):!t&&(n.pathname&&n.pathname!==`/`||n.search||n.hash)?w(`networkProxyAddressPathError`):``:w(t?`networkProxyPacUrlHostError`:`networkProxyAddressPortError`):w(t?`networkProxyPacUrlProtocolError`:`networkProxyAddressProtocolError`)}catch{return w(t?`networkProxyPacUrlInvalid`:`networkProxyAddressInvalid`)}}async saveNetworkProxy(){if(!(this.networkProxySaving||!this.networkProxyLoaded)){if(this.networkProxyMode===`pac`&&this.networkProxyStatus?.features?.pacUrl!==!0){this.saved=!1,this.error=w(`networkProxyPacUnsupported`),this.requestUpdate();return}if(this.networkProxyMode===`manual`||this.networkProxyMode===`pac`){let e=this.networkProxyValidationError();if(e){this.saved=!1,this.error=e,this.requestUpdate();return}}this.networkProxySaving=!0,this.saved=!1,this.error=``,this.requestUpdate();try{let e=await fetch(`/api/system/network-proxy`,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify({mode:this.networkProxyMode,proxyUrl:this.networkProxyUrl})}),t=await e.json().catch(()=>null);if(!e.ok)throw Error(t?.error||w(`requestFailed`));this.networkProxyMode=t?.config?.mode||this.networkProxyMode,this.networkProxyUrl=t?.config?.proxyUrl||``,this.savedNetworkProxyConfig={mode:this.networkProxyMode,proxyUrl:this.networkProxyUrl},this.networkProxyStatus=t?.status||null,this.markSaved(w(`networkProxySaved`))}catch(e){this.networkProxyMode=this.savedNetworkProxyConfig.mode,this.networkProxyUrl=this.savedNetworkProxyConfig.proxyUrl,this.saved=!1,this.error=e instanceof Error?e.message:w(`requestFailed`)}finally{this.networkProxySaving=!1,this.requestUpdate()}}}async refreshNetworkProxy(){if(!(this.networkProxySaving||!this.networkProxyLoaded)){this.networkProxySaving=!0,this.saved=!1,this.error=``,this.requestUpdate();try{let e=await fetch(`/api/system/network-proxy/refresh`,{method:`POST`}),t=await e.json().catch(()=>null);if(!e.ok)throw Error(t?.error||w(`requestFailed`));this.networkProxyStatus=t?.status||null,this.markSaved(w(`networkProxyRefreshed`))}catch(e){this.error=e instanceof Error?e.message:w(`requestFailed`)}finally{this.networkProxySaving=!1,this.requestUpdate()}}}renderNetworkProxyModeOption(e,t){let n=this.networkProxyMode===e,r=e===`pac`&&this.networkProxyStatus?.features?.pacUrl!==!0;return _`
414
+ `,it=class extends x{models=[];selectedModel;thinkingLevel=`off`;toolDisplayMode=`compact`;showContextUsage=!1;autoCompactEnabled=!0;autoCompactRequireConfirmation=!0;autoCompactThresholdPercent=80;autoCompactThresholdPercentInput=`80`;autoCompactKeepRecentTurns=3;autoArchiveEnabled=!1;systemNotificationsEnabled=!1;systemNotificationPermission=`unsupported`;systemNotificationBusy=!1;selectedLanguage=Ee();loading=!0;saved=!1;savedMessage=``;error=``;terminalShellConfig={terminalShell:`auto`,defaultProfileId:`auto`,profiles:[]};customShellCommand=``;customShellEditorOpen=!1;networkProxyMode=`direct`;networkProxyUrl=``;savedNetworkProxyConfig={mode:`direct`,proxyUrl:``};networkProxyStatus=null;networkProxySaving=!1;networkProxyLoaded=!1;getTabName(){return 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=H(this.selectedModel));let t=this.querySelector(`[data-default-thinking-select]`);t&&(t.value=this.thinkingLevel);let n=this.querySelector(`[data-language-select]`);n&&(n.value=this.selectedLanguage);let r=this.querySelector(`[data-terminal-shell-select]`);r&&(r.value=this.customShellEditorOpen?V:this.selectedTerminalShellProfileId())}async loadSettings(){this.loading=!0,this.error=``,this.requestUpdate();try{let e=S(),[t,n,r,i,a,o]=await Promise.all([Ae(e),ae().catch(()=>[]),ye(e),Me(e),Ge(e),Xe(e)]),s=n.length?n:t;this.models=s,this.selectedModel=r.model?s.find(e=>H(e)===H(r.model))??s[0]:s[0],this.thinkingLevel=r.thinkingLevel??ue(this.selectedModel),this.toolDisplayMode=i.toolDisplayMode,this.showContextUsage=i.showContextUsage,this.autoCompactEnabled=a.enabled,this.autoCompactRequireConfirmation=a.requireConfirmation,this.autoCompactThresholdPercent=a.thresholdPercent,this.autoCompactThresholdPercentInput=String(a.thresholdPercent),this.autoCompactKeepRecentTurns=a.keepRecentTurns,this.autoArchiveEnabled=o.enabled,this.systemNotificationsEnabled=De(),this.systemNotificationPermission=await Ne(),this.systemNotificationsEnabled&&this.systemNotificationPermission!==`granted`&&(this.systemNotificationsEnabled=!1,k(!1)),await Promise.all([this.loadTerminalShell(),this.loadNetworkProxy()])}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=>H(t)===e);this.selectedModel=t,this.thinkingLevel=ue(t),this.saved=!1,this.requestUpdate(),this.saveDefaultModelOptions()}openDefaultModelSheet(e){Fe(this.selectedModel??null,this.models,e=>{e&&this.updateModel(H(e))},{anchor:e.currentTarget})}updateThinkingLevel(e){this.thinkingLevel=Qe.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 Se(S(),this.selectedLanguage)}updateToolDisplayMode(e){this.toolDisplayMode!==e&&(this.toolDisplayMode=e,this.saved=!1,this.requestUpdate(),this.saveToolDisplayOptions())}updateShowContextUsage(e){this.showContextUsage=e,this.saved=!1,this.requestUpdate(),this.saveToolDisplayOptions()}updateAutoCompactEnabled(e){this.autoCompactEnabled=e,this.saved=!1,this.requestUpdate(),this.saveAutoCompactOptions()}updateAutoCompactRequireConfirmation(e){this.autoCompactRequireConfirmation=e,this.saved=!1,this.requestUpdate(),this.saveAutoCompactOptions()}updateAutoArchiveEnabled(e){this.autoArchiveEnabled=e,this.saved=!1,this.requestUpdate(),this.saveAutoArchiveOptions()}async updateSystemNotifications(e){this.systemNotificationBusy=!0,this.saved=!1,this.error=``,this.requestUpdate();try{if(!e){k(!1),this.systemNotificationsEnabled=!1,this.markSaved(O(`systemNotificationsDisabled`));return}let t=await je();this.systemNotificationPermission=t,this.systemNotificationsEnabled=t===`granted`,t===`granted`?this.markSaved(O(`systemNotificationsEnabled`)):t===`denied`?this.error=O(`systemNotificationsDeniedHelp`):t===`unsupported`&&(this.error=O(`systemNotificationsUnsupported`))}catch(e){this.systemNotificationsEnabled=!1,k(!1),this.error=e instanceof Error?e.message:O(`requestFailed`)}finally{this.systemNotificationBusy=!1,this.requestUpdate()}}async sendTestSystemNotification(){this.systemNotificationBusy=!0,this.error=``,this.requestUpdate();try{await xe({key:`test:${Date.now()}`,title:O(`systemNotificationTestTitle`),status:`idle`,force:!0})||(this.error=O(`systemNotificationTestFailed`))}catch(e){this.error=e instanceof Error?e.message:O(`systemNotificationTestFailed`)}finally{this.systemNotificationBusy=!1,this.requestUpdate()}}systemNotificationStatusText(){return this.systemNotificationPermission===`unsupported`?O(`systemNotificationsUnsupported`):this.systemNotificationPermission===`denied`?O(`systemNotificationsPermissionDenied`):this.systemNotificationPermission===`granted`?O(`systemNotificationsPermissionGranted`):O(`systemNotificationsPermissionPrompt`)}updateAutoCompactThresholdPercent(e){this.autoCompactThresholdPercentInput=e;let t=Number(e);e!==``&&Number.isFinite(t)&&(this.autoCompactThresholdPercent=t),this.saved=!1,this.requestUpdate()}updateAutoCompactKeepRecentTurns(e){this.autoCompactKeepRecentTurns=Number(e)||3,this.saved=!1,this.requestUpdate()}commitAutoCompactThresholdPercent(){let e=Number(this.autoCompactThresholdPercentInput);if(!Number.isFinite(e)){this.autoCompactThresholdPercentInput=String(this.autoCompactThresholdPercent),this.requestUpdate();return}let t=Math.max(50,Math.min(95,Math.round(e)));this.autoCompactThresholdPercent=t,this.autoCompactThresholdPercentInput=String(t),this.requestUpdate(),this.saveAutoCompactOptions()}commitAutoCompactKeepRecentTurns(){let e=Math.max(1,Math.min(20,Math.round(this.autoCompactKeepRecentTurns||3)));this.autoCompactKeepRecentTurns=e,this.requestUpdate(),this.saveAutoCompactOptions()}markSaved(e=O(`defaultOptionsSaved`)){this.saved=!0,this.savedMessage=e,this.error=``,this.requestUpdate()}customShellProfiles(){return this.terminalShellConfig.profiles.filter(e=>!e.builtin)}selectedTerminalShellProfileId(){let e=this.terminalShellConfig.profiles;return e.some(e=>e.id===this.terminalShellConfig.defaultProfileId)?this.terminalShellConfig.defaultProfileId:e[0]?.id||V}updateTerminalShellSelection(e){if(e===V){this.customShellEditorOpen=!0,this.requestUpdate();return}this.customShellEditorOpen=!1,this.requestUpdate(),this.saveTerminalShellConfig(e)}async loadNetworkProxy(){try{let e=await fetch(`/api/system/network-proxy`,{cache:`no-store`}),t=await e.json().catch(()=>null);if(!e.ok)throw Error(t?.error||O(`requestFailed`));this.networkProxyMode=t?.config?.mode||`direct`,this.networkProxyUrl=t?.config?.proxyUrl||``,this.savedNetworkProxyConfig={mode:this.networkProxyMode,proxyUrl:this.networkProxyUrl},this.networkProxyStatus=t?.status||null,this.networkProxyLoaded=!0}catch(e){this.error=e instanceof Error?e.message:O(`requestFailed`)}}updateNetworkProxyMode(e){this.networkProxyMode===e||this.networkProxySaving||!this.networkProxyLoaded||e===`pac`&&this.networkProxyStatus?.features?.pacUrl!==!0||(this.networkProxyMode=e,this.saved=!1,this.error=``,this.requestUpdate(),!(e===`manual`||e===`pac`)&&this.saveNetworkProxy())}updateNetworkProxyUrl(e){this.networkProxyUrl=e,this.saved=!1,this.requestUpdate()}networkProxyValidationError(){let e=this.networkProxyUrl.trim(),t=this.networkProxyMode===`pac`;if(!e)return O(t?`networkProxyPacUrlRequired`:`networkProxyAddressRequired`);try{let n=new URL(e);return[`http:`,`https:`].includes(n.protocol)?n.hostname?!t&&!n.port?O(`networkProxyAddressPortError`):n.username||n.password?O(t?`networkProxyPacUrlCredentialsError`:`networkProxyAddressCredentialsError`):t&&n.hash?O(`networkProxyPacUrlFragmentError`):!t&&(n.pathname&&n.pathname!==`/`||n.search||n.hash)?O(`networkProxyAddressPathError`):``:O(t?`networkProxyPacUrlHostError`:`networkProxyAddressPortError`):O(t?`networkProxyPacUrlProtocolError`:`networkProxyAddressProtocolError`)}catch{return O(t?`networkProxyPacUrlInvalid`:`networkProxyAddressInvalid`)}}async saveNetworkProxy(){if(!(this.networkProxySaving||!this.networkProxyLoaded)){if(this.networkProxyMode===`pac`&&this.networkProxyStatus?.features?.pacUrl!==!0){this.saved=!1,this.error=O(`networkProxyPacUnsupported`),this.requestUpdate();return}if(this.networkProxyMode===`manual`||this.networkProxyMode===`pac`){let e=this.networkProxyValidationError();if(e){this.saved=!1,this.error=e,this.requestUpdate();return}}this.networkProxySaving=!0,this.saved=!1,this.error=``,this.requestUpdate();try{let e=await fetch(`/api/system/network-proxy`,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify({mode:this.networkProxyMode,proxyUrl:this.networkProxyUrl})}),t=await e.json().catch(()=>null);if(!e.ok)throw Error(t?.error||O(`requestFailed`));this.networkProxyMode=t?.config?.mode||this.networkProxyMode,this.networkProxyUrl=t?.config?.proxyUrl||``,this.savedNetworkProxyConfig={mode:this.networkProxyMode,proxyUrl:this.networkProxyUrl},this.networkProxyStatus=t?.status||null,this.markSaved(O(`networkProxySaved`))}catch(e){this.networkProxyMode=this.savedNetworkProxyConfig.mode,this.networkProxyUrl=this.savedNetworkProxyConfig.proxyUrl,this.saved=!1,this.error=e instanceof Error?e.message:O(`requestFailed`)}finally{this.networkProxySaving=!1,this.requestUpdate()}}}async refreshNetworkProxy(){if(!(this.networkProxySaving||!this.networkProxyLoaded)){this.networkProxySaving=!0,this.saved=!1,this.error=``,this.requestUpdate();try{let e=await fetch(`/api/system/network-proxy/refresh`,{method:`POST`}),t=await e.json().catch(()=>null);if(!e.ok)throw Error(t?.error||O(`requestFailed`));this.networkProxyStatus=t?.status||null,this.markSaved(O(`networkProxyRefreshed`))}catch(e){this.error=e instanceof Error?e.message:O(`requestFailed`)}finally{this.networkProxySaving=!1,this.requestUpdate()}}}renderNetworkProxyModeOption(e,t){let n=this.networkProxyMode===e,r=e===`pac`&&this.networkProxyStatus?.features?.pacUrl!==!0;return b`
404
415
  <button
405
416
  type="button"
406
417
  class="quickforge-settings-segmented-option ${n?`quickforge-settings-segmented-option-active`:``}"
407
418
  aria-pressed=${n?`true`:`false`}
408
- title=${r?w(`networkProxyPacUnsupported`):``}
419
+ title=${r?O(`networkProxyPacUnsupported`):``}
409
420
  ?disabled=${this.networkProxySaving||!this.networkProxyLoaded||r}
410
421
  @click=${()=>this.updateNetworkProxyMode(e)}
411
422
  >
412
423
  ${t}
413
424
  </button>
414
- `}networkProxySettings(){let e=this.networkProxyMode===`manual`||this.networkProxyMode===`pac`,t=this.networkProxyMode===`pac`&&this.networkProxyStatus?.features?.pacUrl!==!0,n=e?this.networkProxyValidationError():``,r=e&&(this.networkProxyUrl!==this.savedNetworkProxyConfig.proxyUrl||this.savedNetworkProxyConfig.mode!==this.networkProxyMode),i=this.networkProxyLoaded?t?w(`networkProxyPacUnsupported`):this.networkProxyStatus?.supported===!1?this.networkProxyStatus.error||w(`networkProxyUnsupported`):w(`networkProxyStatus`,{source:this.networkProxyStatus?.source||w(`unknown`),runtime:this.networkProxyStatus?.runtimeKind||w(`unknown`)}):w(`networkProxyLoadFailed`);return _`
415
- <section class="quickforge-settings-section" aria-label=${w(`networkConnection`)}>
425
+ `}networkProxySettings(){let e=this.networkProxyMode===`manual`||this.networkProxyMode===`pac`,t=this.networkProxyMode===`pac`&&this.networkProxyStatus?.features?.pacUrl!==!0,n=e?this.networkProxyValidationError():``,r=e&&(this.networkProxyUrl!==this.savedNetworkProxyConfig.proxyUrl||this.savedNetworkProxyConfig.mode!==this.networkProxyMode),i=this.networkProxyLoaded?t?O(`networkProxyPacUnsupported`):this.networkProxyStatus?.supported===!1?this.networkProxyStatus.error||O(`networkProxyUnsupported`):O(`networkProxyStatus`,{source:this.networkProxyStatus?.source||O(`unknown`),runtime:this.networkProxyStatus?.runtimeKind||O(`unknown`)}):O(`networkProxyLoadFailed`);return b`
426
+ <section class="quickforge-settings-section" aria-label=${O(`networkConnection`)}>
416
427
  <div class="quickforge-settings-row">
417
428
  <div class="quickforge-settings-row-main">
418
429
  <div class="quickforge-settings-row-title">
419
- ${w(`networkProxyMode`)}
420
- <quickforge-info-tip .label=${w(`networkProxyDescription`)}></quickforge-info-tip>
430
+ ${O(`networkProxyMode`)}
431
+ <quickforge-info-tip .label=${O(`networkProxyDescription`)}></quickforge-info-tip>
421
432
  </div>
422
433
  <div class="quickforge-settings-row-description">${i}</div>
423
434
  </div>
424
435
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide">
425
- <div class="quickforge-settings-segmented quickforge-settings-segmented-wrap" role="group" aria-label=${w(`networkProxyMode`)}>
426
- ${this.renderNetworkProxyModeOption(`direct`,w(`networkProxyDirect`))}
427
- ${this.renderNetworkProxyModeOption(`system`,w(`networkProxySystem`))}
428
- ${this.renderNetworkProxyModeOption(`manual`,w(`networkProxyManual`))}
429
- ${this.renderNetworkProxyModeOption(`pac`,w(`networkProxyPac`))}
436
+ <div class="quickforge-settings-segmented quickforge-settings-segmented-wrap" role="group" aria-label=${O(`networkProxyMode`)}>
437
+ ${this.renderNetworkProxyModeOption(`direct`,O(`networkProxyDirect`))}
438
+ ${this.renderNetworkProxyModeOption(`system`,O(`networkProxySystem`))}
439
+ ${this.renderNetworkProxyModeOption(`manual`,O(`networkProxyManual`))}
440
+ ${this.renderNetworkProxyModeOption(`pac`,O(`networkProxyPac`))}
430
441
  </div>
431
442
  </div>
432
443
  </div>
433
444
 
434
- ${e?_`
445
+ ${e?b`
435
446
  <div class="quickforge-settings-row">
436
447
  <div class="quickforge-settings-row-main">
437
448
  <div class="quickforge-settings-row-title">
438
- ${w(this.networkProxyMode===`pac`?`networkProxyPacUrl`:`networkProxyAddress`)}
449
+ ${O(this.networkProxyMode===`pac`?`networkProxyPacUrl`:`networkProxyAddress`)}
439
450
  </div>
440
451
  <div class="quickforge-settings-row-description">
441
- ${w(this.networkProxyMode===`pac`?`networkProxyPacUrlDescription`:`networkProxyAddressDescription`)}
452
+ ${O(this.networkProxyMode===`pac`?`networkProxyPacUrlDescription`:`networkProxyAddressDescription`)}
442
453
  </div>
443
454
  </div>
444
455
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide quickforge-network-proxy-control">
@@ -446,7 +457,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,At as n,Dt as r
446
457
  id="quickforge-network-proxy-url"
447
458
  class="quickforge-settings-input quickforge-settings-mono"
448
459
  type="url"
449
- aria-label=${w(this.networkProxyMode===`pac`?`networkProxyPacUrl`:`networkProxyAddress`)}
460
+ aria-label=${O(this.networkProxyMode===`pac`?`networkProxyPacUrl`:`networkProxyAddress`)}
450
461
  aria-invalid=${r&&n?`true`:`false`}
451
462
  .value=${this.networkProxyUrl}
452
463
  placeholder=${this.networkProxyMode===`pac`?`https://example.com/proxy.pac`:`http://127.0.0.1:7890`}
@@ -460,17 +471,17 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,At as n,Dt as r
460
471
  ?disabled=${this.networkProxySaving||!this.networkProxyLoaded||t||!!n||!r}
461
472
  @click=${()=>this.saveNetworkProxy()}
462
473
  >
463
- ${this.networkProxySaving?w(`saving`):w(`networkProxySave`)}
474
+ ${this.networkProxySaving?O(`saving`):O(`networkProxySave`)}
464
475
  </button>
465
476
  </div>
466
477
  </div>
467
478
  `:null}
468
479
 
469
- ${this.networkProxyMode===`system`?_`
480
+ ${this.networkProxyMode===`system`?b`
470
481
  <div class="quickforge-settings-row">
471
482
  <div class="quickforge-settings-row-main">
472
- <div class="quickforge-settings-row-title">${w(`networkProxyRefresh`)}</div>
473
- <div class="quickforge-settings-row-description">${w(`networkProxyRefreshDescription`)}</div>
483
+ <div class="quickforge-settings-row-title">${O(`networkProxyRefresh`)}</div>
484
+ <div class="quickforge-settings-row-description">${O(`networkProxyRefreshDescription`)}</div>
474
485
  </div>
475
486
  <div class="quickforge-settings-row-control">
476
487
  <button
@@ -479,41 +490,41 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,At as n,Dt as r
479
490
  ?disabled=${this.networkProxySaving||!this.networkProxyLoaded}
480
491
  @click=${()=>this.refreshNetworkProxy()}
481
492
  >
482
- ${this.networkProxySaving?w(`saving`):w(`networkProxyRefresh`)}
493
+ ${this.networkProxySaving?O(`saving`):O(`networkProxyRefresh`)}
483
494
  </button>
484
495
  </div>
485
496
  </div>
486
497
  `:null}
487
498
  </section>
488
- `}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||w(`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:w(`requestFailed`)}}async saveTerminalShellConfig(e,t=this.customShellProfiles(),n=w(`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||w(`requestFailed`));this.terminalShellConfig=i,this.markSaved(n)}catch(e){this.error=e instanceof Error?e.message:w(`requestFailed`),this.requestUpdate()}}async addCustomTerminalShell(){let e=this.customShellCommand.trim();if(!e){this.error=w(`terminalShellProfileRequired`),this.requestUpdate();return}let t={id:tt(),name:nt(e),command:e,builtin:!1},n=[...this.customShellProfiles(),t];this.customShellCommand=``,this.customShellEditorOpen=!1,await this.saveTerminalShellConfig(t.id,n,w(`terminalShellProfilesSaved`))}async deleteCustomTerminalShell(e){let t=this.terminalShellConfig.profiles.find(t=>t.id===e);if(!t||t.builtin||!await T({description:w(`terminalShellDeleteConfirm`,{name:t.name}),confirmLabel:w(`confirmDelete`),cancelLabel:w(`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,w(`terminalShellProfilesSaved`))}async saveDefaultModelOptions(){try{let e=this.selectedModel?.reasoning?this.thinkingLevel:`off`;await Me(y(),{model:this.selectedModel,thinkingLevel:e}),this.markSaved()}catch(e){this.error=e instanceof Error?e.message:w(`requestFailed`),this.requestUpdate()}}async saveToolDisplayOptions(){try{await pe(y(),{toolDisplayMode:this.toolDisplayMode,showContextUsage:this.showContextUsage}),this.markSaved()}catch(e){this.error=e instanceof Error?e.message:w(`requestFailed`),this.requestUpdate()}}async saveAutoCompactOptions(){try{await Ge(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:w(`requestFailed`),this.requestUpdate()}}async saveAutoArchiveOptions(){try{if(await Xe(y(),{enabled:this.autoArchiveEnabled}),this.markSaved(w(`autoArchiveSaved`)),typeof BroadcastChannel<`u`)try{let e=new BroadcastChannel(`quickforge-sync`);e.postMessage({type:`settings-changed`,sourceTabId:`default-options-settings-tab`,timestamp:Date.now()}),e.close()}catch{}}catch(e){this.error=e instanceof Error?e.message:w(`requestFailed`),this.requestUpdate()}}modelOptions(){if(!this.selectedModel)return this.models;let e=z(this.selectedModel);return this.models.some(t=>z(t)===e)?this.models:[this.selectedModel,...this.models]}terminalShellSettings(){let e=this.terminalShellConfig.profiles,t=this.selectedTerminalShellProfileId(),n=e.find(e=>e.id===t),r=this.customShellEditorOpen||e.length===0;return _`
489
- <section class="quickforge-settings-section" aria-label=${w(`terminalShell`)}>
499
+ `}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={id:tt(),name:nt(e),command:e,builtin:!1},n=[...this.customShellProfiles(),t];this.customShellCommand=``,this.customShellEditorOpen=!1,await this.saveTerminalShellConfig(t.id,n,O(`terminalShellProfilesSaved`))}async deleteCustomTerminalShell(e){let t=this.terminalShellConfig.profiles.find(t=>t.id===e);if(!t||t.builtin||!await A({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 be(S(),{model:this.selectedModel,thinkingLevel:e}),this.markSaved()}catch(e){this.error=e instanceof Error?e.message:O(`requestFailed`),this.requestUpdate()}}async saveToolDisplayOptions(){try{await Te(S(),{toolDisplayMode:this.toolDisplayMode,showContextUsage:this.showContextUsage}),this.markSaved()}catch(e){this.error=e instanceof Error?e.message:O(`requestFailed`),this.requestUpdate()}}async saveAutoCompactOptions(){try{await Ke(S(),{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()}}async saveAutoArchiveOptions(){try{if(await Ze(S(),{enabled:this.autoArchiveEnabled}),this.markSaved(O(`autoArchiveSaved`)),typeof BroadcastChannel<`u`)try{let e=new BroadcastChannel(`quickforge-sync`);e.postMessage({type:`settings-changed`,sourceTabId:`default-options-settings-tab`,timestamp:Date.now()}),e.close()}catch{}}catch(e){this.error=e instanceof Error?e.message:O(`requestFailed`),this.requestUpdate()}}modelOptions(){return this.models}terminalShellSettings(){let e=this.terminalShellConfig.profiles,t=this.selectedTerminalShellProfileId(),n=e.find(e=>e.id===t),r=this.customShellEditorOpen||e.length===0;return b`
500
+ <section class="quickforge-settings-section" aria-label=${O(`terminalShell`)}>
490
501
  <div class="quickforge-settings-row">
491
502
  <div class="quickforge-settings-row-main">
492
503
  <div class="quickforge-settings-row-title">
493
- ${w(`terminalShellDefault`)}
494
- <quickforge-info-tip .label=${w(`terminalShellDescription`)}></quickforge-info-tip>
504
+ ${O(`terminalShellDefault`)}
505
+ <quickforge-info-tip .label=${O(`terminalShellDescription`)}></quickforge-info-tip>
495
506
  </div>
496
507
  <div class="quickforge-settings-row-description quickforge-settings-mono">
497
- ${n?.command||w(`terminalShellNoDetected`)}
508
+ ${n?.command||O(`terminalShellNoDetected`)}
498
509
  </div>
499
510
  </div>
500
511
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide">
501
512
  <select
502
513
  data-terminal-shell-select
503
514
  class="quickforge-settings-select"
504
- .value=${r?R:t}
505
- aria-label=${w(`terminalShellDefault`)}
515
+ .value=${r?V:t}
516
+ aria-label=${O(`terminalShellDefault`)}
506
517
  @change=${e=>this.updateTerminalShellSelection(e.target.value)}
507
518
  >
508
- ${e.map(e=>_`<option value=${e.id}>${e.name}</option>`)}
509
- <option value=${R}>${w(`terminalShellCustomOption`)}</option>
519
+ ${e.map(e=>b`<option value=${e.id}>${e.name}</option>`)}
520
+ <option value=${V}>${O(`terminalShellCustomOption`)}</option>
510
521
  </select>
511
- ${n&&!n.builtin&&!r?_`
522
+ ${n&&!n.builtin&&!r?b`
512
523
  <button
513
524
  class="quickforge-settings-icon-action quickforge-settings-icon-action-danger"
514
525
  type="button"
515
- title=${w(`delete`)}
516
- aria-label=${w(`delete`)}
526
+ title=${O(`delete`)}
527
+ aria-label=${O(`delete`)}
517
528
  @click=${()=>this.deleteCustomTerminalShell(n.id)}
518
529
  >
519
530
  ${rt}
@@ -522,34 +533,34 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,At as n,Dt as r
522
533
  </div>
523
534
  </div>
524
535
 
525
- ${r?_`
536
+ ${r?b`
526
537
  <div class="quickforge-settings-row">
527
538
  <div class="quickforge-settings-row-main">
528
- <div class="quickforge-settings-row-title">${w(`terminalShellCommand`)}</div>
529
- <div class="quickforge-settings-row-description">${w(`terminalShellCustomDescription`)}</div>
539
+ <div class="quickforge-settings-row-title">${O(`terminalShellCommand`)}</div>
540
+ <div class="quickforge-settings-row-description">${O(`terminalShellCustomDescription`)}</div>
530
541
  </div>
531
542
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide quickforge-terminal-shell-command-control">
532
543
  <input
533
544
  class="quickforge-settings-input quickforge-settings-mono"
534
545
  type="text"
535
546
  .value=${this.customShellCommand}
536
- placeholder=${w(`terminalShellCommandPlaceholder`)}
547
+ placeholder=${O(`terminalShellCommandPlaceholder`)}
537
548
  @input=${e=>{this.customShellCommand=e.target.value}}
538
549
  />
539
550
  <button
540
551
  class="quickforge-settings-button quickforge-settings-button-primary"
541
552
  type="button"
542
- title=${w(`terminalShellAdd`)}
543
- aria-label=${w(`terminalShellAdd`)}
553
+ title=${O(`terminalShellAdd`)}
554
+ aria-label=${O(`terminalShellAdd`)}
544
555
  @click=${()=>this.addCustomTerminalShell()}
545
556
  >
546
- ${w(`terminalShellAdd`)}
557
+ ${O(`terminalShellAdd`)}
547
558
  </button>
548
559
  </div>
549
560
  </div>
550
561
  `:null}
551
562
  </section>
552
- `}renderToolDisplayModeOption(e){let t=this.toolDisplayMode===e.value;return _`
563
+ `}renderToolDisplayModeOption(e){let t=this.toolDisplayMode===e.value;return b`
553
564
  <button
554
565
  type="button"
555
566
  class="quickforge-settings-segmented-option ${t?`quickforge-settings-segmented-option-active`:``}"
@@ -558,7 +569,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,At as n,Dt as r
558
569
  >
559
570
  ${e.label()}
560
571
  </button>
561
- `}renderSwitch(e,t,n=!1){return _`
572
+ `}renderSwitch(e,t,n=!1){return b`
562
573
  <label class="quickforge-settings-switch" aria-disabled=${n?`true`:`false`}>
563
574
  <input
564
575
  type="checkbox"
@@ -568,16 +579,16 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,At as n,Dt as r
568
579
  />
569
580
  <span aria-hidden="true"></span>
570
581
  </label>
571
- `}render(){return this.loading?_`<div class="text-sm text-muted-foreground">${w(`loading`)}</div>`:_`
582
+ `}render(){return this.loading?b`<div class="text-sm text-muted-foreground">${O(`loading`)}</div>`:b`
572
583
  <div class="quickforge-settings-stack">
573
- <section class="quickforge-settings-section" aria-label=${w(`defaultOptions`)}>
584
+ <section class="quickforge-settings-section" aria-label=${O(`defaultOptions`)}>
574
585
  <div class="quickforge-settings-row">
575
586
  <div class="quickforge-settings-row-main">
576
587
  <div class="quickforge-settings-row-title">
577
- ${w(`language`)}
578
- <quickforge-info-tip .label=${w(`languageDescription`)}></quickforge-info-tip>
588
+ ${O(`language`)}
589
+ <quickforge-info-tip .label=${O(`languageDescription`)}></quickforge-info-tip>
579
590
  </div>
580
- <div class="quickforge-settings-row-description">${w(`displayLanguage`)}</div>
591
+ <div class="quickforge-settings-row-description">${O(`displayLanguage`)}</div>
581
592
  </div>
582
593
  <div class="quickforge-settings-row-control">
583
594
  <select
@@ -586,26 +597,26 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,At as n,Dt as r
586
597
  .value=${this.selectedLanguage}
587
598
  @change=${e=>this.updateLanguage(e.target.value)}
588
599
  >
589
- <option value="zh">${w(`simplifiedChinese`)}</option>
590
- <option value="en">${w(`english`)}</option>
600
+ <option value="zh">${O(`simplifiedChinese`)}</option>
601
+ <option value="en">${O(`english`)}</option>
591
602
  </select>
592
603
  </div>
593
604
  </div>
594
605
 
595
606
  <div class="quickforge-settings-row">
596
607
  <div class="quickforge-settings-row-main">
597
- <div class="quickforge-settings-row-title">${w(`defaultModel`)}</div>
598
- <div class="quickforge-settings-row-description">${w(`defaultModelDescription`)}</div>
608
+ <div class="quickforge-settings-row-title">${O(`defaultModel`)}</div>
609
+ <div class="quickforge-settings-row-description">${O(`defaultModelDescription`)}</div>
599
610
  </div>
600
611
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide">
601
612
  <select
602
613
  data-default-model-select
603
614
  class="quickforge-settings-select quickforge-model-select-desktop"
604
- .value=${this.selectedModel?z(this.selectedModel):``}
615
+ .value=${this.selectedModel?H(this.selectedModel):``}
605
616
  @change=${e=>this.updateModel(e.target.value)}
606
617
  >
607
- ${this.modelOptions().length===0?_`<option value="">${w(`noModelAvailable`)}</option>`:this.modelOptions().map(e=>_`
608
- <option .value=${z(e)}>${et(e)}</option>
618
+ ${this.modelOptions().length===0?b`<option value="">${O(`noModelAvailable`)}</option>`:this.modelOptions().map(e=>b`
619
+ <option .value=${H(e)}>${ce(e)}</option>
609
620
  `)}
610
621
  </select>
611
622
  <button
@@ -614,7 +625,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,At as n,Dt as r
614
625
  ?disabled=${this.models.length===0}
615
626
  @click=${e=>this.openDefaultModelSheet(e)}
616
627
  >
617
- <span>${this.selectedModel?et(this.selectedModel):w(`noModelAvailable`)}</span>
628
+ <span>${this.selectedModel?ce(this.selectedModel):O(`noModelAvailable`)}</span>
618
629
  <span class="quickforge-settings-select-chevron" aria-hidden="true">▾</span>
619
630
  </button>
620
631
  </div>
@@ -622,9 +633,9 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,At as n,Dt as r
622
633
 
623
634
  <div class="quickforge-settings-row">
624
635
  <div class="quickforge-settings-row-main">
625
- <div class="quickforge-settings-row-title">${w(`defaultThinkingLevel`)}</div>
636
+ <div class="quickforge-settings-row-title">${O(`defaultThinkingLevel`)}</div>
626
637
  <div class="quickforge-settings-row-description">
627
- ${this.selectedModel?.reasoning?w(`defaultThinkingLevelDescription`):w(`thinkingRequiresReasoningModel`)}
638
+ ${this.selectedModel?.reasoning?O(`defaultThinkingLevelDescription`):O(`thinkingRequiresReasoningModel`)}
628
639
  </div>
629
640
  </div>
630
641
  <div class="quickforge-settings-row-control">
@@ -635,7 +646,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,At as n,Dt as r
635
646
  ?disabled=${!this.selectedModel?.reasoning}
636
647
  @change=${e=>this.updateThinkingLevel(e.target.value)}
637
648
  >
638
- ${Ze.map(e=>_`
649
+ ${Qe.map(e=>b`
639
650
  <option .value=${e.value}>${e.label()}</option>
640
651
  `)}
641
652
  </select>
@@ -645,14 +656,14 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,At as n,Dt as r
645
656
  <div class="quickforge-settings-row">
646
657
  <div class="quickforge-settings-row-main">
647
658
  <div class="quickforge-settings-row-title">
648
- ${w(`toolDisplay`)}
649
- <quickforge-info-tip .label=${w(`toolDisplayModeDescription`)}></quickforge-info-tip>
659
+ ${O(`toolDisplay`)}
660
+ <quickforge-info-tip .label=${O(`toolDisplayModeDescription`)}></quickforge-info-tip>
650
661
  </div>
651
- <div class="quickforge-settings-row-description">${w(`toolDisplayModeDescription`)}</div>
662
+ <div class="quickforge-settings-row-description">${O(`toolDisplayModeDescription`)}</div>
652
663
  </div>
653
664
  <div class="quickforge-settings-row-control">
654
- <div class="quickforge-settings-segmented" role="group" aria-label=${w(`toolDisplay`)}>
655
- ${Qe.map(e=>this.renderToolDisplayModeOption(e))}
665
+ <div class="quickforge-settings-segmented" role="group" aria-label=${O(`toolDisplay`)}>
666
+ ${$e.map(e=>this.renderToolDisplayModeOption(e))}
656
667
  </div>
657
668
  </div>
658
669
  </div>
@@ -660,19 +671,19 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,At as n,Dt as r
660
671
  <div class="quickforge-settings-row">
661
672
  <div class="quickforge-settings-row-main">
662
673
  <div class="quickforge-settings-row-title">
663
- ${w(`systemNotifications`)}
664
- <quickforge-info-tip .label=${w(`systemNotificationsDescription`)}></quickforge-info-tip>
674
+ ${O(`systemNotifications`)}
675
+ <quickforge-info-tip .label=${O(`systemNotificationsDescription`)}></quickforge-info-tip>
665
676
  </div>
666
677
  <div class="quickforge-settings-row-description">${this.systemNotificationStatusText()}</div>
667
678
  </div>
668
679
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide">
669
- ${this.systemNotificationsEnabled?_`
680
+ ${this.systemNotificationsEnabled?b`
670
681
  <button
671
682
  class="quickforge-settings-button quickforge-settings-button-secondary"
672
683
  type="button"
673
684
  ?disabled=${this.systemNotificationBusy}
674
685
  @click=${()=>this.sendTestSystemNotification()}
675
- >${w(`systemNotificationsTest`)}</button>
686
+ >${O(`systemNotificationsTest`)}</button>
676
687
  `:null}
677
688
  ${this.renderSwitch(this.systemNotificationsEnabled,e=>{this.updateSystemNotifications(e)},this.systemNotificationBusy||this.systemNotificationPermission===`unsupported`)}
678
689
  </div>
@@ -681,10 +692,10 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,At as n,Dt as r
681
692
  <div class="quickforge-settings-row">
682
693
  <div class="quickforge-settings-row-main">
683
694
  <div class="quickforge-settings-row-title">
684
- ${w(`showContextUsage`)}
685
- <quickforge-info-tip .label=${w(`showContextUsageDescription`)}></quickforge-info-tip>
695
+ ${O(`showContextUsage`)}
696
+ <quickforge-info-tip .label=${O(`showContextUsageDescription`)}></quickforge-info-tip>
686
697
  </div>
687
- <div class="quickforge-settings-row-description">${w(`showContextUsageDescription`)}</div>
698
+ <div class="quickforge-settings-row-description">${O(`showContextUsageDescription`)}</div>
688
699
  </div>
689
700
  <div class="quickforge-settings-row-control">
690
701
  ${this.renderSwitch(this.showContextUsage,e=>this.updateShowContextUsage(e))}
@@ -694,10 +705,10 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,At as n,Dt as r
694
705
  <div class="quickforge-settings-row">
695
706
  <div class="quickforge-settings-row-main">
696
707
  <div class="quickforge-settings-row-title">
697
- ${w(`autoArchiveEnabled`)}
698
- <quickforge-info-tip .label=${w(`autoArchiveDescription`)}></quickforge-info-tip>
708
+ ${O(`autoArchiveEnabled`)}
709
+ <quickforge-info-tip .label=${O(`autoArchiveDescription`)}></quickforge-info-tip>
699
710
  </div>
700
- <div class="quickforge-settings-row-description">${w(`autoArchiveTriggerNote`)}</div>
711
+ <div class="quickforge-settings-row-description">${O(`autoArchiveTriggerNote`)}</div>
701
712
  </div>
702
713
  <div class="quickforge-settings-row-control">
703
714
  ${this.renderSwitch(this.autoArchiveEnabled,e=>this.updateAutoArchiveEnabled(e))}
@@ -707,10 +718,10 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,At as n,Dt as r
707
718
  <div class="quickforge-settings-row">
708
719
  <div class="quickforge-settings-row-main">
709
720
  <div class="quickforge-settings-row-title">
710
- ${w(`autoCompactEnabled`)}
711
- <quickforge-info-tip .label=${w(`autoCompactDescription`)}></quickforge-info-tip>
721
+ ${O(`autoCompactEnabled`)}
722
+ <quickforge-info-tip .label=${O(`autoCompactDescription`)}></quickforge-info-tip>
712
723
  </div>
713
- <div class="quickforge-settings-row-description">${w(`autoCompactTriggerNote`)}</div>
724
+ <div class="quickforge-settings-row-description">${O(`autoCompactTriggerNote`)}</div>
714
725
  </div>
715
726
  <div class="quickforge-settings-row-control">
716
727
  ${this.renderSwitch(this.autoCompactEnabled,e=>this.updateAutoCompactEnabled(e))}
@@ -719,8 +730,8 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,At as n,Dt as r
719
730
 
720
731
  <div class="quickforge-settings-row">
721
732
  <div class="quickforge-settings-row-main">
722
- <div class="quickforge-settings-row-title">${w(`autoCompactRequireConfirmation`)}</div>
723
- <div class="quickforge-settings-row-description">${w(`autoCompactRequireConfirmationDescription`)}</div>
733
+ <div class="quickforge-settings-row-title">${O(`autoCompactRequireConfirmation`)}</div>
734
+ <div class="quickforge-settings-row-description">${O(`autoCompactRequireConfirmationDescription`)}</div>
724
735
  </div>
725
736
  <div class="quickforge-settings-row-control">
726
737
  ${this.renderSwitch(this.autoCompactRequireConfirmation,e=>this.updateAutoCompactRequireConfirmation(e),!this.autoCompactEnabled)}
@@ -729,8 +740,8 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,At as n,Dt as r
729
740
 
730
741
  <div class="quickforge-settings-row">
731
742
  <div class="quickforge-settings-row-main">
732
- <div class="quickforge-settings-row-title">${w(`autoCompactThresholdPercent`)}</div>
733
- <div class="quickforge-settings-row-description">${w(`autoCompactThresholdDescription`)}</div>
743
+ <div class="quickforge-settings-row-title">${O(`autoCompactThresholdPercent`)}</div>
744
+ <div class="quickforge-settings-row-description">${O(`autoCompactThresholdDescription`)}</div>
734
745
  </div>
735
746
  <div class="quickforge-settings-row-control">
736
747
  <input
@@ -751,10 +762,10 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,At as n,Dt as r
751
762
  <div class="quickforge-settings-row">
752
763
  <div class="quickforge-settings-row-main">
753
764
  <div class="quickforge-settings-row-title">
754
- ${w(`autoCompactKeepRecentTurns`)}
755
- <quickforge-info-tip .label=${w(`autoCompactHistoryPreserved`)}></quickforge-info-tip>
765
+ ${O(`autoCompactKeepRecentTurns`)}
766
+ <quickforge-info-tip .label=${O(`autoCompactHistoryPreserved`)}></quickforge-info-tip>
756
767
  </div>
757
- <div class="quickforge-settings-row-description">${w(`autoCompactKeepRecentTurnsDescription`)}</div>
768
+ <div class="quickforge-settings-row-description">${O(`autoCompactKeepRecentTurnsDescription`)}</div>
758
769
  </div>
759
770
  <div class="quickforge-settings-row-control">
760
771
  <input
@@ -777,10 +788,10 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,At as n,Dt as r
777
788
 
778
789
  ${this.terminalShellSettings()}
779
790
 
780
- ${this.saved?_`<div class="quickforge-settings-message" role="status">${this.savedMessage||w(`defaultOptionsSaved`)}</div>`:null}
781
- ${this.error?_`<div class="quickforge-settings-alert" role="alert">${this.error}</div>`:null}
791
+ ${this.saved?b`<div class="quickforge-settings-message" role="status">${this.savedMessage||O(`defaultOptionsSaved`)}</div>`:null}
792
+ ${this.error?b`<div class="quickforge-settings-alert" role="alert">${this.error}</div>`:null}
782
793
  </div>
783
- `}},B=`quickforge-default-options-settings-tab`;customElements.get(B)||customElements.define(B,it);function at(){return document.createElement(B)}var ot=`memory-settings`,st={enabled:!0};function ct(e){return!e||typeof e!=`object`?{...st}:{enabled:e.enabled!==!1}}async function lt(e){return ct(await e.settings.get(ot))}async function ut(e,t){await e.settings.set(ot,ct(t))}var dt=class extends v{enabled=!0;loading=!0;saving=!1;loadingDocument=!1;markdown=``;savedMarkdown=``;memoryPath=`~/.quickforge/MEMORY.md`;message=``;error=``;getTabName(){return w(`memory`)}async connectedCallback(){super.connectedCallback(),await this.loadSettings()}async loadSettings(){this.loading=!0,this.error=``,this.requestUpdate();try{let[e]=await Promise.all([lt(y()),this.loadDocument()]);this.enabled=e.enabled}catch(e){this.error=e instanceof Error?e.message:w(`requestFailed`)}finally{this.loading=!1,this.requestUpdate()}}async loadDocument(e=!1){this.loadingDocument=!0,this.error=``,e&&(this.message=``),this.requestUpdate();try{let t=await fetch(`/api/memory`,{cache:`no-store`}),n=await t.json().catch(()=>null);if(!t.ok||!n)throw Error(n?.error||w(`requestFailed`));this.markdown=n.markdown,this.savedMarkdown=n.markdown,this.memoryPath=n.path||this.memoryPath,e&&(this.message=w(`memoryReloaded`))}finally{this.loadingDocument=!1,this.requestUpdate()}}async updateEnabled(e){let t=this.enabled;this.enabled=e,this.saving=!0,this.message=``,this.error=``,this.requestUpdate();try{await ut(y(),{enabled:e}),this.message=w(e?`memoryEnabledSaved`:`memoryDisabledSaved`)}catch(e){this.enabled=t,this.error=e instanceof Error?e.message:w(`requestFailed`)}finally{this.saving=!1,this.requestUpdate()}}async reloadDocument(){try{await this.loadDocument(!0)}catch(e){this.error=e instanceof Error?e.message:w(`requestFailed`),this.requestUpdate()}}async saveDocument(){if(!(!this.enabled||this.saving)){this.saving=!0,this.message=``,this.error=``,this.requestUpdate();try{let e=await fetch(`/api/memory`,{method:`PUT`,headers:{"content-type":`application/json`},body:JSON.stringify({markdown:this.markdown})}),t=await e.json().catch(()=>null);if(!e.ok||!t)throw Error(t?.error||w(`requestFailed`));this.markdown=t.markdown,this.savedMarkdown=t.markdown,this.memoryPath=t.path||this.memoryPath,this.message=w(`memoryContentSaved`)}catch(e){this.error=e instanceof Error?e.message:w(`requestFailed`)}finally{this.saving=!1,this.requestUpdate()}}}renderSwitch(){return _`
794
+ `}},U=`quickforge-default-options-settings-tab`;customElements.get(U)||customElements.define(U,it);function at(){return document.createElement(U)}var ot=`memory-settings`,st={enabled:!0};function ct(e){return!e||typeof e!=`object`?{...st}:{enabled:e.enabled!==!1}}async function lt(e){return ct(await e.settings.get(ot))}async function ut(e,t){await e.settings.set(ot,ct(t))}var dt=class extends x{enabled=!0;loading=!0;saving=!1;loadingDocument=!1;markdown=``;savedMarkdown=``;memoryPath=`~/.quickforge/MEMORY.md`;message=``;error=``;getTabName(){return O(`memory`)}async connectedCallback(){super.connectedCallback(),await this.loadSettings()}async loadSettings(){this.loading=!0,this.error=``,this.requestUpdate();try{let[e]=await Promise.all([lt(S()),this.loadDocument()]);this.enabled=e.enabled}catch(e){this.error=e instanceof Error?e.message:O(`requestFailed`)}finally{this.loading=!1,this.requestUpdate()}}async loadDocument(e=!1){this.loadingDocument=!0,this.error=``,e&&(this.message=``),this.requestUpdate();try{let t=await fetch(`/api/memory`,{cache:`no-store`}),n=await t.json().catch(()=>null);if(!t.ok||!n)throw Error(n?.error||O(`requestFailed`));this.markdown=n.markdown,this.savedMarkdown=n.markdown,this.memoryPath=n.path||this.memoryPath,e&&(this.message=O(`memoryReloaded`))}finally{this.loadingDocument=!1,this.requestUpdate()}}async updateEnabled(e){let t=this.enabled;this.enabled=e,this.saving=!0,this.message=``,this.error=``,this.requestUpdate();try{await ut(S(),{enabled:e}),this.message=O(e?`memoryEnabledSaved`:`memoryDisabledSaved`)}catch(e){this.enabled=t,this.error=e instanceof Error?e.message:O(`requestFailed`)}finally{this.saving=!1,this.requestUpdate()}}async reloadDocument(){try{await this.loadDocument(!0)}catch(e){this.error=e instanceof Error?e.message:O(`requestFailed`),this.requestUpdate()}}async saveDocument(){if(!(!this.enabled||this.saving)){this.saving=!0,this.message=``,this.error=``,this.requestUpdate();try{let e=await fetch(`/api/memory`,{method:`PUT`,headers:{"content-type":`application/json`},body:JSON.stringify({markdown:this.markdown})}),t=await e.json().catch(()=>null);if(!e.ok||!t)throw Error(t?.error||O(`requestFailed`));this.markdown=t.markdown,this.savedMarkdown=t.markdown,this.memoryPath=t.path||this.memoryPath,this.message=O(`memoryContentSaved`)}catch(e){this.error=e instanceof Error?e.message:O(`requestFailed`)}finally{this.saving=!1,this.requestUpdate()}}}renderSwitch(){return b`
784
795
  <label class="quickforge-settings-switch" aria-disabled=${this.saving?`true`:`false`}>
785
796
  <input
786
797
  type="checkbox"
@@ -790,24 +801,24 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,At as n,Dt as r
790
801
  />
791
802
  <span aria-hidden="true"></span>
792
803
  </label>
793
- `}render(){if(this.loading)return _`<div class="text-sm text-muted-foreground">${w(`loading`)}</div>`;let e=this.markdown!==this.savedMarkdown,t=this.saving||this.loadingDocument;return _`
804
+ `}render(){if(this.loading)return b`<div class="text-sm text-muted-foreground">${O(`loading`)}</div>`;let e=this.markdown!==this.savedMarkdown,t=this.saving||this.loadingDocument;return b`
794
805
  <div class="quickforge-settings-stack">
795
- <section class="quickforge-settings-section" aria-label=${w(`memory`)}>
806
+ <section class="quickforge-settings-section" aria-label=${O(`memory`)}>
796
807
  <div class="quickforge-settings-row">
797
808
  <div class="quickforge-settings-row-main">
798
809
  <div class="quickforge-settings-row-title">
799
- ${w(`globalMemory`)}
800
- <quickforge-info-tip .label=${w(`globalMemoryInfo`)}></quickforge-info-tip>
810
+ ${O(`globalMemory`)}
811
+ <quickforge-info-tip .label=${O(`globalMemoryInfo`)}></quickforge-info-tip>
801
812
  </div>
802
- <div class="quickforge-settings-row-description">${w(`globalMemoryDescription`)}</div>
813
+ <div class="quickforge-settings-row-description">${O(`globalMemoryDescription`)}</div>
803
814
  </div>
804
815
  <div class="quickforge-settings-row-control">${this.renderSwitch()}</div>
805
816
  </div>
806
817
 
807
818
  <div class="quickforge-settings-row">
808
819
  <div class="quickforge-settings-row-main">
809
- <div class="quickforge-settings-row-title">${w(`memoryFile`)}</div>
810
- <div class="quickforge-settings-row-description">${w(`memoryFileDescription`)}</div>
820
+ <div class="quickforge-settings-row-title">${O(`memoryFile`)}</div>
821
+ <div class="quickforge-settings-row-description">${O(`memoryFileDescription`)}</div>
811
822
  </div>
812
823
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide">
813
824
  <code class="text-xs text-muted-foreground">${this.memoryPath}</code>
@@ -816,8 +827,8 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,At as n,Dt as r
816
827
 
817
828
  <div class="quickforge-settings-row quickforge-settings-row-align-start quickforge-memory-content-row">
818
829
  <div class="quickforge-settings-row-main">
819
- <div class="quickforge-settings-row-title">${w(`memoryContent`)}</div>
820
- <div class="quickforge-settings-row-description">${this.enabled?w(`memoryContentDescription`):w(`memoryContentDisabledDescription`)}</div>
830
+ <div class="quickforge-settings-row-title">${O(`memoryContent`)}</div>
831
+ <div class="quickforge-settings-row-description">${this.enabled?O(`memoryContentDescription`):O(`memoryContentDisabledDescription`)}</div>
821
832
  </div>
822
833
  <div class="quickforge-memory-editor-control">
823
834
  <textarea
@@ -833,24 +844,24 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,At as n,Dt as r
833
844
  type="button"
834
845
  ?disabled=${t}
835
846
  @click=${()=>void this.reloadDocument()}
836
- >${this.loadingDocument?w(`loading`):w(`memoryReload`)}</button>
847
+ >${this.loadingDocument?O(`loading`):O(`memoryReload`)}</button>
837
848
  <button
838
849
  class="quickforge-settings-button quickforge-settings-button-primary"
839
850
  type="button"
840
851
  ?disabled=${!this.enabled||t||!e}
841
852
  @click=${()=>void this.saveDocument()}
842
- >${this.saving?w(`saving`):w(`memorySave`)}</button>
853
+ >${this.saving?O(`saving`):O(`memorySave`)}</button>
843
854
  </div>
844
855
  </div>
845
856
  </div>
846
857
 
847
- <div class="quickforge-settings-note">${w(`memoryCurrentSessionNote`)}</div>
858
+ <div class="quickforge-settings-note">${O(`memoryCurrentSessionNote`)}</div>
848
859
  </section>
849
860
 
850
- ${this.message?_`<div class="quickforge-settings-message">${this.message}</div>`:null}
851
- ${this.error?_`<div class="quickforge-settings-alert">${this.error}</div>`:null}
861
+ ${this.message?b`<div class="quickforge-settings-message">${this.message}</div>`:null}
862
+ ${this.error?b`<div class="quickforge-settings-alert">${this.error}</div>`:null}
852
863
  </div>
853
- `}},V=`quickforge-memory-settings-tab`;customElements.get(V)||customElements.define(V,dt);function ft(){return document.createElement(V)}var pt=`quickforge-backup`,H=[{id:`settings`,countKey:`settings`,label:()=>w(`restoreSettings`),description:()=>w(`restoreSettingsDescription`)},{id:`mcp`,countKey:`mcp`,label:()=>w(`restoreMcp`),description:()=>w(`restoreMcpDescription`)},{id:`providerKeys`,countKey:`providerKeys`,label:()=>w(`restoreProviderKeys`),description:()=>w(`restoreProviderKeysDescription`)},{id:`customProviders`,countKey:`customProviders`,label:()=>w(`restoreCustomProviders`),description:()=>w(`restoreCustomProvidersDescription`)},{id:`scheduledTasks`,countKey:`scheduledTasks`,label:()=>w(`restoreScheduledTasks`),description:()=>w(`restoreScheduledTasksDescription`)}],mt=H;function ht(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 gt(){return new Date().toISOString().replace(/[:.]/g,`-`)}function _t(e){return e?Object.entries(e).map(([e,t])=>`${e}: ${t}`).join(`, `):``}function vt(e){return mt.filter(t=>(e.sections?.[t.countKey]??0)>0)}function yt(e){return vt(e).map(e=>e.id)}function bt(e){return e instanceof RangeError||e instanceof Error&&e.message.includes(`Invalid string length`)}function U(e,t){return bt(e)?w(`backupStringTooLarge`):e instanceof Error?e.message:t}var xt=class extends v{exportSections=new Set(H.map(e=>e.id));busy=!1;message=``;error=``;safetyBackupPath=``;pendingImport=null;getTabName(){return w(`backupRestore`)}toggleExportSection(e,t){t?this.exportSections.add(e):this.exportSections.delete(e),this.clearStatus(),this.requestUpdate()}clearStatus(){this.message=``,this.error=``,this.safetyBackupPath=``}async exportBackup(){if(this.exportSections.size===0){this.error=w(`selectAtLeastOneExportSection`),this.requestUpdate();return}this.busy=!0,this.clearStatus(),this.requestUpdate();try{let e=new URLSearchParams({sections:[...this.exportSections].join(`,`)}),t=await fetch(`/api/backup/export?${e.toString()}`,{cache:`no-store`}),n=await t.json().catch(()=>null);if(!t.ok)throw Error(n?.error||w(`backupExportFailed`));ht(`${pt}-settings-${gt()}.json`,n),this.message=w(`backupExported`)}catch(e){this.error=U(e,w(`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||w(`backupInspectFailed`));if(!n)throw Error(w(`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(yt(t));this.pendingImport={backup:null,importToken:t.importToken,inspect:t,selectedSections:n,mode:`replace`},this.message=t.ignoredConversations?w(`backupInspectedWithIgnoredConversations`):w(`backupInspected`)}catch(e){this.error=U(e,w(`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=w(`selectAtLeastOneRestoreSection`),this.requestUpdate();return}if(await T({description:this.pendingImport.mode===`replace`?w(`backupImportReplaceConfirm`):w(`backupImportMergeConfirm`),confirmLabel:w(`confirmImportSelected`),cancelLabel:w(`cancel`)})){this.busy=!0,this.clearStatus(),this.requestUpdate();try{let e=this.pendingImport.importToken?{importToken:this.pendingImport.importToken,sections:[...this.pendingImport.selectedSections],mode:this.pendingImport.mode}:{backup:this.pendingImport.backup,sections:[...this.pendingImport.selectedSections],mode:this.pendingImport.mode},t=await fetch(`/api/backup/import`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(e)}),n=await t.json().catch(()=>null);if(!t.ok)throw Error(n?.error||w(`backupImportFailed`));let r=_t(n?.summary);this.safetyBackupPath=n?.safetyBackupPath||``,this.pendingImport=null,this.message=r?`${w(`backupImported`)} ${r}`:w(`backupImported`),window.setTimeout(()=>window.location.reload(),1500)}catch(e){this.error=U(e,w(`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 _`
864
+ `}},W=`quickforge-memory-settings-tab`;customElements.get(W)||customElements.define(W,dt);function ft(){return document.createElement(W)}var pt=`quickforge-backup`,G=[{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:`scheduledTasks`,countKey:`scheduledTasks`,label:()=>O(`restoreScheduledTasks`),description:()=>O(`restoreScheduledTasksDescription`)}],mt=G;function ht(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 gt(){return new Date().toISOString().replace(/[:.]/g,`-`)}function _t(e){return e?Object.entries(e).map(([e,t])=>`${e}: ${t}`).join(`, `):``}function vt(e){return mt.filter(t=>(e.sections?.[t.countKey]??0)>0)}function yt(e){return vt(e).map(e=>e.id)}function bt(e){return e instanceof RangeError||e instanceof Error&&e.message.includes(`Invalid string length`)}function K(e,t){return bt(e)?O(`backupStringTooLarge`):e instanceof Error?e.message:t}var xt=class extends x{exportSections=new Set(G.map(e=>e.id));busy=!1;message=``;error=``;safetyBackupPath=``;pendingImport=null;getTabName(){return O(`backupRestore`)}toggleExportSection(e,t){t?this.exportSections.add(e):this.exportSections.delete(e),this.clearStatus(),this.requestUpdate()}clearStatus(){this.message=``,this.error=``,this.safetyBackupPath=``}async exportBackup(){if(this.exportSections.size===0){this.error=O(`selectAtLeastOneExportSection`),this.requestUpdate();return}this.busy=!0,this.clearStatus(),this.requestUpdate();try{let e=new URLSearchParams({sections:[...this.exportSections].join(`,`)}),t=await fetch(`/api/backup/export?${e.toString()}`,{cache:`no-store`}),n=await t.json().catch(()=>null);if(!t.ok)throw Error(n?.error||O(`backupExportFailed`));ht(`${pt}-settings-${gt()}.json`,n),this.message=O(`backupExported`)}catch(e){this.error=K(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(yt(t));this.pendingImport={backup:null,importToken:t.importToken,inspect:t,selectedSections:n,mode:`replace`},this.message=t.ignoredConversations?O(`backupInspectedWithIgnoredConversations`):O(`backupInspected`)}catch(e){this.error=K(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}if(await A({description:this.pendingImport.mode===`replace`?O(`backupImportReplaceConfirm`):O(`backupImportMergeConfirm`),confirmLabel:O(`confirmImportSelected`),cancelLabel:O(`cancel`)})){this.busy=!0,this.clearStatus(),this.requestUpdate();try{let e=this.pendingImport.importToken?{importToken:this.pendingImport.importToken,sections:[...this.pendingImport.selectedSections],mode:this.pendingImport.mode}:{backup:this.pendingImport.backup,sections:[...this.pendingImport.selectedSections],mode:this.pendingImport.mode},t=await fetch(`/api/backup/import`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(e)}),n=await t.json().catch(()=>null);if(!t.ok)throw Error(n?.error||O(`backupImportFailed`));let r=_t(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=K(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 b`
854
865
  <label class="quickforge-settings-switch" aria-disabled=${n?`true`:`false`}>
855
866
  <input
856
867
  type="checkbox"
@@ -860,69 +871,69 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,At as n,Dt as r
860
871
  />
861
872
  <span aria-hidden="true"></span>
862
873
  </label>
863
- `}renderPendingImport(){if(!this.pendingImport)return null;let{inspect:e,selectedSections:t}=this.pendingImport,n=vt(e);return _`
864
- <section class="quickforge-settings-section" aria-label=${w(`backupInspectTitle`)}>
874
+ `}renderPendingImport(){if(!this.pendingImport)return null;let{inspect:e,selectedSections:t}=this.pendingImport,n=vt(e);return b`
875
+ <section class="quickforge-settings-section" aria-label=${O(`backupInspectTitle`)}>
865
876
  <div class="quickforge-settings-row quickforge-settings-row-top">
866
877
  <div class="quickforge-settings-row-main">
867
- <div class="quickforge-settings-row-title">${w(`backupInspectTitle`)}</div>
868
- <div class="quickforge-settings-row-description">${w(`backupInspectDescription`)}</div>
878
+ <div class="quickforge-settings-row-title">${O(`backupInspectTitle`)}</div>
879
+ <div class="quickforge-settings-row-description">${O(`backupInspectDescription`)}</div>
869
880
  </div>
870
881
  </div>
871
882
 
872
883
  <div class="quickforge-settings-nested-list">
873
884
  <div class="quickforge-settings-subrow">
874
885
  <div class="quickforge-settings-row-main">
875
- <div class="quickforge-settings-row-title">${w(`backupInspectExportedAt`)}</div>
886
+ <div class="quickforge-settings-row-title">${O(`backupInspectExportedAt`)}</div>
876
887
  </div>
877
888
  <div class="quickforge-settings-row-control quickforge-settings-readonly-value">${e.exportedAt||`-`}</div>
878
889
  </div>
879
890
  <div class="quickforge-settings-subrow">
880
891
  <div class="quickforge-settings-row-main">
881
- <div class="quickforge-settings-row-title">${w(`backupInspectVersion`)}</div>
892
+ <div class="quickforge-settings-row-title">${O(`backupInspectVersion`)}</div>
882
893
  </div>
883
894
  <div class="quickforge-settings-row-control quickforge-settings-readonly-value">${e.version??`-`}</div>
884
895
  </div>
885
896
  <div class="quickforge-settings-subrow">
886
897
  <div class="quickforge-settings-row-main">
887
- <div class="quickforge-settings-row-title">${w(`backupInspectScope`)}</div>
898
+ <div class="quickforge-settings-row-title">${O(`backupInspectScope`)}</div>
888
899
  </div>
889
900
  <div class="quickforge-settings-row-control quickforge-settings-readonly-value">${e.scope||`-`}</div>
890
901
  </div>
891
902
  <div class="quickforge-settings-subrow">
892
903
  <div class="quickforge-settings-row-main">
893
- <div class="quickforge-settings-row-title">${w(`backupInspectSecrets`)}</div>
904
+ <div class="quickforge-settings-row-title">${O(`backupInspectSecrets`)}</div>
894
905
  </div>
895
- <div class="quickforge-settings-row-control quickforge-settings-readonly-value">${e.includeSecrets?w(`yes`):w(`no`)}</div>
906
+ <div class="quickforge-settings-row-control quickforge-settings-readonly-value">${e.includeSecrets?O(`yes`):O(`no`)}</div>
896
907
  </div>
897
908
  </div>
898
909
 
899
- ${e.warnings?.length?_`
910
+ ${e.warnings?.length?b`
900
911
  <div class="quickforge-settings-warning quickforge-settings-warning-attached">
901
- ${e.warnings.map(e=>_`<div>⚠ ${e}</div>`)}
912
+ ${e.warnings.map(e=>b`<div>⚠ ${e}</div>`)}
902
913
  </div>
903
914
  `:null}
904
915
 
905
- ${e.invalidSections&&Object.keys(e.invalidSections).length?_`
916
+ ${e.invalidSections&&Object.keys(e.invalidSections).length?b`
906
917
  <div class="quickforge-settings-warning quickforge-settings-warning-attached">
907
- <div>${w(`backupInvalidSections`)}</div>
908
- ${Object.entries(e.invalidSections).map(([e,t])=>_`<div>${e}: ${t}</div>`)}
918
+ <div>${O(`backupInvalidSections`)}</div>
919
+ ${Object.entries(e.invalidSections).map(([e,t])=>b`<div>${e}: ${t}</div>`)}
909
920
  </div>
910
921
  `:null}
911
922
 
912
923
  <div class="quickforge-settings-row">
913
924
  <div class="quickforge-settings-row-main">
914
- <div class="quickforge-settings-row-title">${w(`restoreMode`)}</div>
915
- <div class="quickforge-settings-row-description">${w(`restoreModeDescription`)}</div>
925
+ <div class="quickforge-settings-row-title">${O(`restoreMode`)}</div>
926
+ <div class="quickforge-settings-row-description">${O(`restoreModeDescription`)}</div>
916
927
  </div>
917
928
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide">
918
- <div class="quickforge-settings-segmented" role="group" aria-label=${w(`restoreMode`)}>
929
+ <div class="quickforge-settings-segmented" role="group" aria-label=${O(`restoreMode`)}>
919
930
  <button
920
931
  type="button"
921
932
  class="quickforge-settings-segmented-option ${this.pendingImport.mode===`replace`?`quickforge-settings-segmented-option-active`:``}"
922
933
  ?disabled=${this.busy}
923
934
  @click=${()=>this.setRestoreMode(`replace`)}
924
935
  >
925
- ${w(`restoreModeReplace`)}
936
+ ${O(`restoreModeReplace`)}
926
937
  </button>
927
938
  <button
928
939
  type="button"
@@ -930,7 +941,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,At as n,Dt as r
930
941
  ?disabled=${this.busy}
931
942
  @click=${()=>this.setRestoreMode(`merge`)}
932
943
  >
933
- ${w(`restoreModeMerge`)}
944
+ ${O(`restoreModeMerge`)}
934
945
  </button>
935
946
  </div>
936
947
  </div>
@@ -938,14 +949,14 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,At as n,Dt as r
938
949
 
939
950
  <div class="quickforge-settings-row quickforge-settings-row-top">
940
951
  <div class="quickforge-settings-row-main">
941
- <div class="quickforge-settings-row-title">${w(`selectRestoreSections`)}</div>
952
+ <div class="quickforge-settings-row-title">${O(`selectRestoreSections`)}</div>
942
953
  <div class="quickforge-settings-row-description">
943
- ${this.pendingImport.mode===`replace`?w(`restoreModeReplaceDescription`):w(`restoreModeMergeDescription`)}
954
+ ${this.pendingImport.mode===`replace`?O(`restoreModeReplaceDescription`):O(`restoreModeMergeDescription`)}
944
955
  </div>
945
956
  </div>
946
957
  </div>
947
958
  <div class="quickforge-settings-nested-list">
948
- ${n.map(n=>_`
959
+ ${n.map(n=>b`
949
960
  <div class="quickforge-settings-subrow">
950
961
  <div class="quickforge-settings-row-main">
951
962
  <div class="quickforge-settings-row-title">${n.label()} (${e.sections?.[n.countKey]??0})</div>
@@ -960,8 +971,8 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,At as n,Dt as r
960
971
 
961
972
  <div class="quickforge-settings-row">
962
973
  <div class="quickforge-settings-row-main">
963
- <div class="quickforge-settings-row-title">${w(`backupImportActions`)}</div>
964
- <div class="quickforge-settings-row-description">${w(`backupImportActionsDescription`)}</div>
974
+ <div class="quickforge-settings-row-title">${O(`backupImportActions`)}</div>
975
+ <div class="quickforge-settings-row-description">${O(`backupImportActionsDescription`)}</div>
965
976
  </div>
966
977
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide">
967
978
  <button
@@ -970,7 +981,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,At as n,Dt as r
970
981
  ?disabled=${this.busy||t.size===0}
971
982
  @click=${()=>this.confirmPendingImport()}
972
983
  >
973
- ${this.busy?w(`loading`):w(`confirmImportSelected`)}
984
+ ${this.busy?O(`loading`):O(`confirmImportSelected`)}
974
985
  </button>
975
986
  <button
976
987
  class="quickforge-settings-button quickforge-settings-button-secondary"
@@ -978,26 +989,26 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,At as n,Dt as r
978
989
  ?disabled=${this.busy}
979
990
  @click=${()=>this.cancelPendingImport()}
980
991
  >
981
- ${w(`cancel`)}
992
+ ${O(`cancel`)}
982
993
  </button>
983
994
  </div>
984
995
  </div>
985
996
  </section>
986
- `}render(){return _`
997
+ `}render(){return b`
987
998
  <div class="quickforge-settings-stack">
988
- <section class="quickforge-settings-section" aria-label=${w(`exportData`)}>
999
+ <section class="quickforge-settings-section" aria-label=${O(`exportData`)}>
989
1000
  <div class="quickforge-settings-row quickforge-settings-row-top">
990
1001
  <div class="quickforge-settings-row-main">
991
1002
  <div class="quickforge-settings-row-title">
992
- ${w(`selectExportSections`)}
993
- <quickforge-info-tip .label=${w(`exportDataDescription`)}></quickforge-info-tip>
1003
+ ${O(`selectExportSections`)}
1004
+ <quickforge-info-tip .label=${O(`exportDataDescription`)}></quickforge-info-tip>
994
1005
  </div>
995
- <div class="quickforge-settings-row-description">${w(`selectExportSectionsDescription`)}</div>
1006
+ <div class="quickforge-settings-row-description">${O(`selectExportSectionsDescription`)}</div>
996
1007
  </div>
997
1008
  </div>
998
1009
 
999
1010
  <div class="quickforge-settings-nested-list">
1000
- ${H.map(e=>_`
1011
+ ${G.map(e=>b`
1001
1012
  <div class="quickforge-settings-subrow">
1002
1013
  <div class="quickforge-settings-row-main">
1003
1014
  <div class="quickforge-settings-row-title">${e.label()}</div>
@@ -1010,12 +1021,12 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,At as n,Dt as r
1010
1021
  `)}
1011
1022
  </div>
1012
1023
 
1013
- <div class="quickforge-settings-note">${w(`conversationBackupExcluded`)}</div>
1024
+ <div class="quickforge-settings-note">${O(`conversationBackupExcluded`)}</div>
1014
1025
 
1015
1026
  <div class="quickforge-settings-row">
1016
1027
  <div class="quickforge-settings-row-main">
1017
- <div class="quickforge-settings-row-title">${w(`exportBackup`)}</div>
1018
- <div class="quickforge-settings-row-description">${w(`exportBackupDescription`)}</div>
1028
+ <div class="quickforge-settings-row-title">${O(`exportBackup`)}</div>
1029
+ <div class="quickforge-settings-row-description">${O(`exportBackupDescription`)}</div>
1019
1030
  </div>
1020
1031
  <div class="quickforge-settings-row-control">
1021
1032
  <button
@@ -1024,20 +1035,20 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,At as n,Dt as r
1024
1035
  ?disabled=${this.busy||this.exportSections.size===0}
1025
1036
  @click=${()=>this.exportBackup()}
1026
1037
  >
1027
- ${this.busy?w(`loading`):w(`exportBackup`)}
1038
+ ${this.busy?O(`loading`):O(`exportBackup`)}
1028
1039
  </button>
1029
1040
  </div>
1030
1041
  </div>
1031
1042
  </section>
1032
1043
 
1033
- <section class="quickforge-settings-section" aria-label=${w(`importData`)}>
1044
+ <section class="quickforge-settings-section" aria-label=${O(`importData`)}>
1034
1045
  <div class="quickforge-settings-row">
1035
1046
  <div class="quickforge-settings-row-main">
1036
1047
  <div class="quickforge-settings-row-title">
1037
- ${w(`importBackup`)}
1038
- <quickforge-info-tip .label=${w(`importDataDescription`)}></quickforge-info-tip>
1048
+ ${O(`importBackup`)}
1049
+ <quickforge-info-tip .label=${O(`importDataDescription`)}></quickforge-info-tip>
1039
1050
  </div>
1040
- <div class="quickforge-settings-row-description">${w(`importDataDescription`)}</div>
1051
+ <div class="quickforge-settings-row-description">${O(`importDataDescription`)}</div>
1041
1052
  </div>
1042
1053
  <div class="quickforge-settings-row-control">
1043
1054
  <label class="quickforge-settings-button quickforge-settings-button-secondary ${this.busy?`pointer-events-none opacity-60`:``}">
@@ -1048,24 +1059,24 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,At as n,Dt as r
1048
1059
  ?disabled=${this.busy}
1049
1060
  @change=${e=>this.handleFileChange(e)}
1050
1061
  />
1051
- ${w(`importBackup`)}
1062
+ ${O(`importBackup`)}
1052
1063
  </label>
1053
1064
  </div>
1054
1065
  </div>
1055
1066
  </section>
1056
1067
 
1057
1068
  ${this.renderPendingImport()}
1058
- ${this.message?_`<div class="quickforge-settings-message">${this.message}</div>`:null}
1059
- ${this.safetyBackupPath?_`<div class="quickforge-settings-note">${w(`backupSafetyBackupPath`)}: <code>${this.safetyBackupPath}</code></div>`:null}
1060
- ${this.error?_`<div class="quickforge-settings-alert">${this.error}</div>`:null}
1069
+ ${this.message?b`<div class="quickforge-settings-message">${this.message}</div>`:null}
1070
+ ${this.safetyBackupPath?b`<div class="quickforge-settings-note">${O(`backupSafetyBackupPath`)}: <code>${this.safetyBackupPath}</code></div>`:null}
1071
+ ${this.error?b`<div class="quickforge-settings-alert">${this.error}</div>`:null}
1061
1072
  </div>
1062
- `}},W=`quickforge-backup-settings-tab`;customElements.get(W)||customElements.define(W,xt);function St(){return document.createElement(W)}function Ct(e){if(!e)return`-`;let t=new Date(e);return Number.isNaN(t.getTime())?e:t.toLocaleString(ue())}function wt(e){let t={...e};return delete t.archivedAt,t}function G(){if(!(typeof BroadcastChannel>`u`))try{let e=new BroadcastChannel(`quickforge-sync`);e.postMessage({type:`sessions-changed`,sourceTabId:`archived-conversations-settings-tab`,timestamp:Date.now()}),e.close()}catch{}}var Tt=class extends v{sessions=[];projects=[];loading=!0;busySessionId=``;query=``;projectFilter=`all`;message=``;error=``;getTabName(){return w(`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||w(`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:w(`requestFailed`)}finally{this.loading=!1,this.requestUpdate()}}filteredSessions(){let e=this.query.trim().toLowerCase();return this.sessions.filter(t=>{if(this.projectFilter!==`all`&&(this.projectFilter===`global`&&t.scope===`project`||this.projectFilter!==`global`&&t.projectId!==this.projectFilter))return!1;if(!e)return!0;let n=t.projectId&&this.projectNameById.get(t.projectId)||``;return`${D(t.title,t.channelName)} ${n}`.toLowerCase().includes(e)})}groupedSessions(){let e=new Map;for(let t of this.filteredSessions()){let n=t.scope===`project`&&t.projectId?t.projectId:`global`;e.set(n,[...e.get(n)??[],t])}return[...e.entries()]}projectLabel(e){return e===`global`?w(`normalChat`):this.projectNameById.get(e)||w(`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(w(`sessionNotFound`));await t.sessions.save(wt(n),wt(r)),this.sessions=this.sessions.filter(t=>t.id!==e),this.message=w(`sessionRestored`),G()}catch(e){this.error=e instanceof Error?e.message:w(`restoreSessionFailed`)}finally{this.busySessionId=``,this.requestUpdate()}}}async deleteSession(e){if(!this.busySessionId&&await T({description:w(`deleteArchivedSessionConfirm`,{title:D(e.title)}),confirmLabel:w(`confirmDelete`),cancelLabel:w(`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=w(`archivedSessionDeleted`),G()}catch(e){this.error=e instanceof Error?e.message:w(`deleteSessionFailed`)}finally{this.busySessionId=``,this.requestUpdate()}}}async deleteAllArchivedSessions(){if(!(this.busySessionId||this.sessions.length===0)&&await T({description:w(`deleteAllArchivedSessionsConfirm`),confirmLabel:w(`confirmDelete`),cancelLabel:w(`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=w(`archivedSessionsDeleted`),G()}catch(e){this.error=e instanceof Error?e.message:w(`deleteSessionFailed`)}finally{this.busySessionId=``,this.requestUpdate()}}}renderSession(e){let t=this.busySessionId===e.id||this.busySessionId===`__all__`;return _`
1073
+ `}},q=`quickforge-backup-settings-tab`;customElements.get(q)||customElements.define(q,xt);function St(){return document.createElement(q)}function Ct(e){if(!e)return`-`;let t=new Date(e);return Number.isNaN(t.getTime())?e:t.toLocaleString(N())}function wt(e){let t={...e};return delete t.archivedAt,t}function Tt(){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 Et=class extends x{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`${pe(t.title,t.channelName)} ${n}`.toLowerCase().includes(e)})}groupedSessions(){let e=new Map;for(let t of this.filteredSessions()){let n=t.scope===`project`&&t.projectId?t.projectId:`global`;e.set(n,[...e.get(n)??[],t])}return[...e.entries()]}projectLabel(e){return e===`global`?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=S(),n=await t.sessions.get(e),r=await t.sessions.getMetadata(e);if(!n||!r)throw Error(O(`sessionNotFound`));await t.sessions.save(wt(n),wt(r)),this.sessions=this.sessions.filter(t=>t.id!==e),this.message=O(`sessionRestored`),Tt()}catch(e){this.error=e instanceof Error?e.message:O(`restoreSessionFailed`)}finally{this.busySessionId=``,this.requestUpdate()}}}async deleteSession(e){if(!this.busySessionId&&await A({description:O(`deleteArchivedSessionConfirm`,{title:pe(e.title)}),confirmLabel:O(`confirmDelete`),cancelLabel:O(`cancel`),variant:`destructive`})){this.busySessionId=e.id,this.message=``,this.error=``,this.requestUpdate();try{await S().sessions.delete(e.id),this.sessions=this.sessions.filter(t=>t.id!==e.id),this.message=O(`archivedSessionDeleted`),Tt()}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 A({description:O(`deleteAllArchivedSessionsConfirm`),confirmLabel:O(`confirmDelete`),cancelLabel:O(`cancel`),variant:`destructive`})){this.busySessionId=`__all__`,this.message=``,this.error=``,this.requestUpdate();try{let e=S();await Promise.all(this.sessions.map(t=>e.sessions.delete(t.id))),this.sessions=[],this.message=O(`archivedSessionsDeleted`),Tt()}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 b`
1063
1074
  <div class="border-t border-border px-4 py-3 first:border-t-0">
1064
1075
  <div class="flex flex-wrap items-start justify-between gap-x-3 gap-y-2">
1065
1076
  <div class="min-w-0 flex-1">
1066
- <div class="truncate text-sm font-medium text-foreground">${D(e.title,e.channelName)}</div>
1077
+ <div class="truncate text-sm font-medium text-foreground">${pe(e.title,e.channelName)}</div>
1067
1078
  <div class="mt-1 text-xs text-muted-foreground">
1068
- ${w(`lastModified`)}: ${Ct(e.lastModified)} · ${w(`archivedAt`)}: ${Ct(e.archivedAt)}
1079
+ ${O(`lastModified`)}: ${Ct(e.lastModified)} · ${O(`archivedAt`)}: ${Ct(e.archivedAt)}
1069
1080
  </div>
1070
1081
  </div>
1071
1082
  <div class="flex w-full shrink-0 items-center justify-end gap-2 sm:w-auto">
@@ -1075,7 +1086,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,At as n,Dt as r
1075
1086
  ?disabled=${t}
1076
1087
  @click=${()=>this.restoreSession(e.id)}
1077
1088
  >
1078
- ${w(`restoreSession`)}
1089
+ ${O(`restoreSession`)}
1079
1090
  </button>
1080
1091
  <button
1081
1092
  class="rounded-md px-2.5 py-1 text-xs text-destructive hover:bg-destructive/10 disabled:opacity-60"
@@ -1083,12 +1094,12 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,At as n,Dt as r
1083
1094
  ?disabled=${t}
1084
1095
  @click=${()=>this.deleteSession(e)}
1085
1096
  >
1086
- ${w(`deletePermanently`)}
1097
+ ${O(`deletePermanently`)}
1087
1098
  </button>
1088
1099
  </div>
1089
1100
  </div>
1090
1101
  </div>
1091
- `}render(){let e=this.groupedSessions();return _`
1102
+ `}render(){let e=this.groupedSessions();return b`
1092
1103
  <div class="flex flex-col gap-4">
1093
1104
  <div class="flex justify-end">
1094
1105
  <button
@@ -1097,7 +1108,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,At as n,Dt as r
1097
1108
  ?disabled=${!!this.busySessionId||this.sessions.length===0}
1098
1109
  @click=${()=>this.deleteAllArchivedSessions()}
1099
1110
  >
1100
- ${w(`deleteAll`)}
1111
+ ${O(`deleteAll`)}
1101
1112
  </button>
1102
1113
  </div>
1103
1114
 
@@ -1107,7 +1118,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,At as n,Dt as r
1107
1118
  class="rounded-md border border-input bg-background px-3 py-2 text-sm outline-none focus:ring-2 focus:ring-ring/30"
1108
1119
  type="search"
1109
1120
  .value=${this.query}
1110
- placeholder=${w(`searchArchivedConversations`)}
1121
+ placeholder=${O(`searchArchivedConversations`)}
1111
1122
  @input=${e=>{this.query=e.target.value,this.requestUpdate()}}
1112
1123
  />
1113
1124
  <select
@@ -1115,23 +1126,23 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,At as n,Dt as r
1115
1126
  .value=${this.projectFilter}
1116
1127
  @change=${e=>{this.projectFilter=e.target.value,this.requestUpdate()}}
1117
1128
  >
1118
- <option value="all">${w(`allProjects`)}</option>
1119
- <option value="global">${w(`normalChat`)}</option>
1120
- ${this.projects.map(e=>_`<option value=${e.id}>${e.name}</option>`)}
1129
+ <option value="all">${O(`allProjects`)}</option>
1130
+ <option value="global">${O(`normalChat`)}</option>
1131
+ ${this.projects.map(e=>b`<option value=${e.id}>${e.name}</option>`)}
1121
1132
  </select>
1122
1133
  </div>
1123
1134
 
1124
- ${this.loading?_`
1125
- <div class="px-4 py-8 text-center text-sm text-muted-foreground">${w(`loading`)}</div>
1126
- `:e.length===0?_`
1127
- <div class="px-4 py-8 text-center text-sm text-muted-foreground">${w(`noArchivedConversations`)}</div>
1128
- `:_`
1135
+ ${this.loading?b`
1136
+ <div class="px-4 py-8 text-center text-sm text-muted-foreground">${O(`loading`)}</div>
1137
+ `:e.length===0?b`
1138
+ <div class="px-4 py-8 text-center text-sm text-muted-foreground">${O(`noArchivedConversations`)}</div>
1139
+ `:b`
1129
1140
  <div>
1130
- ${e.map(([e,t])=>_`
1141
+ ${e.map(([e,t])=>b`
1131
1142
  <div class="border-b border-border last:border-b-0">
1132
1143
  <div class="flex items-center justify-between gap-3 bg-muted/20 px-4 py-2 text-sm text-muted-foreground">
1133
1144
  <div class="truncate">${this.projectLabel(e)}</div>
1134
- <div class="shrink-0">${w(`conversationCount`,{count:t.length})}</div>
1145
+ <div class="shrink-0">${O(`conversationCount`,{count:t.length})}</div>
1135
1146
  </div>
1136
1147
  ${t.map(e=>this.renderSession(e))}
1137
1148
  </div>
@@ -1140,10 +1151,10 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,At as n,Dt as r
1140
1151
  `}
1141
1152
  </section>
1142
1153
 
1143
- ${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}
1144
- ${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}
1154
+ ${this.message?b`<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}
1155
+ ${this.error?b`<div class="rounded-md border border-destructive/30 bg-destructive/10 px-3 py-2 text-sm text-destructive">${this.error}</div>`:null}
1145
1156
  </div>
1146
- `}},K=`quickforge-archived-conversations-settings-tab`;customElements.get(K)||customElements.define(K,Tt);function Et(){return document.createElement(K)}function Dt(){return Array.from({length:16},()=>`ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz23456789!@#$%^&*`[Math.floor(Math.random()*65)]).join(``)}function Ot(e){if(!e)return w(`lanAccessUnknownDevice`);let t=e.includes(`Edg/`)?`Edge`:e.includes(`Firefox/`)?`Firefox`:e.includes(`Chrome/`)?`Chrome`:e.includes(`Safari/`)?`Safari`:w(`lanAccessBrowser`),n=/Android/i.test(e)?`Android`:/iPhone|iPad|iPod/i.test(e)?`iOS`:/Windows/i.test(e)?`Windows`:/Macintosh|Mac OS X/i.test(e)?`macOS`:/Linux/i.test(e)?`Linux`:``;return n?`${t} · ${n}`:t}function kt(e){if(!e)return`-`;let t=new Date(e);return Number.isNaN(t.getTime())?`-`:new Intl.DateTimeFormat(ue(),{dateStyle:`medium`,timeStyle:`short`}).format(t)}var At=class extends v{loading=!0;saving=!1;enabled=!1;hasPassword=!1;password=``;passwordVisible=!1;sessionTtlHours=12;activeTokenCount=0;activeDevices=[];lanUrls=[];error=``;message=``;getTabName(){return w(`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||w(`requestFailed`));return r}applyStatus(e){this.enabled=!!e.enabled,this.hasPassword=!!e.hasPassword,this.sessionTtlHours=Number(e.sessionTtlHours||12),this.activeTokenCount=Number(e.activeTokenCount||0),this.activeDevices=Array.isArray(e.activeDevices)?e.activeDevices:[],this.lanUrls=Array.isArray(e.lanUrls)?e.lanUrls:[]}async loadStatus(){this.loading=!0,this.error=``,this.requestUpdate();try{this.applyStatus(await this.request(`/api/lan-access/status`))}catch(e){this.error=e instanceof Error?e.message:w(`requestFailed`)}finally{this.loading=!1,this.requestUpdate()}}updatePassword(e){this.password=e,this.requestUpdate()}togglePasswordVisibility(){this.passwordVisible=!this.passwordVisible,this.requestUpdate()}updateEnabled(e){this.enabled=e,this.requestUpdate()}updateTtl(e){this.sessionTtlHours=Number(e)||12,this.requestUpdate()}async saveSettings(){if(!this.saving){if(this.enabled&&!this.hasPassword&&!this.password.trim()){this.error=w(`lanAccessPasswordRequired`),this.requestUpdate();return}if(this.password.trim()&&this.password.trim().length<8){this.error=w(`lanAccessPasswordTooShort`),this.requestUpdate();return}if(!(this.enabled&&!await T({description:w(`lanAccessEnableConfirm`),confirmLabel:w(`enabled`),cancelLabel:w(`cancel`)}))){this.saving=!0,this.error=``,this.message=``,this.requestUpdate();try{let e=await this.request(`/api/lan-access/settings`,{method:`PUT`,body:JSON.stringify({enabled:this.enabled,password:this.password.trim()||void 0,sessionTtlHours:this.sessionTtlHours})});this.applyStatus(e),this.password=``,this.passwordVisible=!1,this.message=w(`lanAccessSaved`)}catch(e){this.error=e instanceof Error?e.message:w(`requestFailed`)}finally{this.saving=!1,this.requestUpdate()}}}}async revokeDevice(e){if(await T({description:w(`lanAccessRevokeDeviceConfirm`,{device:Ot(e.userAgent)}),confirmLabel:w(`lanAccessRevokeDevice`),cancelLabel:w(`cancel`),variant:`destructive`})){this.saving=!0,this.error=``,this.message=``,this.requestUpdate();try{let t=await this.request(`/api/lan-access/revoke`,{method:`POST`,body:JSON.stringify({id:e.id})});this.applyStatus(t),this.message=w(`lanAccessDeviceRevoked`)}catch(e){this.error=e instanceof Error?e.message:w(`requestFailed`)}finally{this.saving=!1,this.requestUpdate()}}}async revokeAll(){if(await T({description:w(`lanAccessRevokeAllConfirm`),confirmLabel:w(`lanAccessRevokeAll`),cancelLabel:w(`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=w(`lanAccessRevoked`)}catch(e){this.error=e instanceof Error?e.message:w(`requestFailed`)}finally{this.saving=!1,this.requestUpdate()}}}renderSwitch(e,t,n=!1){return _`
1157
+ `}},Dt=`quickforge-archived-conversations-settings-tab`;customElements.get(Dt)||customElements.define(Dt,Et);function Ot(){return document.createElement(Dt)}function kt(){return Array.from({length:16},()=>`ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz23456789!@#$%^&*`[Math.floor(Math.random()*65)]).join(``)}function At(e){if(!e)return O(`lanAccessUnknownDevice`);let t=e.includes(`Edg/`)?`Edge`:e.includes(`Firefox/`)?`Firefox`:e.includes(`Chrome/`)?`Chrome`:e.includes(`Safari/`)?`Safari`:O(`lanAccessBrowser`),n=/Android/i.test(e)?`Android`:/iPhone|iPad|iPod/i.test(e)?`iOS`:/Windows/i.test(e)?`Windows`:/Macintosh|Mac OS X/i.test(e)?`macOS`:/Linux/i.test(e)?`Linux`:``;return n?`${t} · ${n}`:t}function jt(e){if(!e)return`-`;let t=new Date(e);return Number.isNaN(t.getTime())?`-`:new Intl.DateTimeFormat(N(),{dateStyle:`medium`,timeStyle:`short`}).format(t)}var Mt=class extends x{loading=!0;saving=!1;enabled=!1;hasPassword=!1;password=``;passwordVisible=!1;sessionTtlHours=12;activeTokenCount=0;activeDevices=[];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.activeDevices=Array.isArray(e.activeDevices)?e.activeDevices:[],this.lanUrls=Array.isArray(e.lanUrls)?e.lanUrls:[]}async loadStatus(){this.loading=!0,this.error=``,this.requestUpdate();try{this.applyStatus(await this.request(`/api/lan-access/status`))}catch(e){this.error=e instanceof Error?e.message:O(`requestFailed`)}finally{this.loading=!1,this.requestUpdate()}}updatePassword(e){this.password=e,this.requestUpdate()}togglePasswordVisibility(){this.passwordVisible=!this.passwordVisible,this.requestUpdate()}updateEnabled(e){this.enabled=e,this.requestUpdate()}updateTtl(e){this.sessionTtlHours=Number(e)||12,this.requestUpdate()}async saveSettings(){if(!this.saving){if(this.enabled&&!this.hasPassword&&!this.password.trim()){this.error=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 A({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.passwordVisible=!1,this.message=O(`lanAccessSaved`)}catch(e){this.error=e instanceof Error?e.message:O(`requestFailed`)}finally{this.saving=!1,this.requestUpdate()}}}}async revokeDevice(e){if(await A({description:O(`lanAccessRevokeDeviceConfirm`,{device:At(e.userAgent)}),confirmLabel:O(`lanAccessRevokeDevice`),cancelLabel:O(`cancel`),variant:`destructive`})){this.saving=!0,this.error=``,this.message=``,this.requestUpdate();try{let t=await this.request(`/api/lan-access/revoke`,{method:`POST`,body:JSON.stringify({id:e.id})});this.applyStatus(t),this.message=O(`lanAccessDeviceRevoked`)}catch(e){this.error=e instanceof Error?e.message:O(`requestFailed`)}finally{this.saving=!1,this.requestUpdate()}}}async revokeAll(){if(await A({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 b`
1147
1158
  <label class="quickforge-settings-switch" aria-disabled=${n?`true`:`false`}>
1148
1159
  <input
1149
1160
  type="checkbox"
@@ -1153,40 +1164,40 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,At as n,Dt as r
1153
1164
  />
1154
1165
  <span aria-hidden="true"></span>
1155
1166
  </label>
1156
- `}render(){return this.loading?_`<div class="text-sm text-muted-foreground">${w(`loading`)}</div>`:_`
1167
+ `}render(){return this.loading?b`<div class="text-sm text-muted-foreground">${O(`loading`)}</div>`:b`
1157
1168
  <div class="quickforge-settings-stack">
1158
- <div class="quickforge-settings-warning">${w(`lanAccessRiskWarning`)}</div>
1169
+ <div class="quickforge-settings-warning">${O(`lanAccessRiskWarning`)}</div>
1159
1170
 
1160
- <section class="quickforge-settings-section" aria-label=${w(`lanAccessStatus`)}>
1171
+ <section class="quickforge-settings-section" aria-label=${O(`lanAccessStatus`)}>
1161
1172
  <div class="quickforge-settings-row">
1162
1173
  <div class="quickforge-settings-row-main">
1163
- <div class="quickforge-settings-row-title">${w(`lanAccessEnabled`)}</div>
1164
- <div class="quickforge-settings-row-description">${w(`lanAccessEnabledDescription`)}</div>
1174
+ <div class="quickforge-settings-row-title">${O(`lanAccessEnabled`)}</div>
1175
+ <div class="quickforge-settings-row-description">${O(`lanAccessEnabledDescription`)}</div>
1165
1176
  </div>
1166
- <div class="quickforge-settings-row-control quickforge-settings-readonly-value">${this.enabled?w(`enabled`):w(`disabled`)}</div>
1177
+ <div class="quickforge-settings-row-control quickforge-settings-readonly-value">${this.enabled?O(`enabled`):O(`disabled`)}</div>
1167
1178
  </div>
1168
1179
  <div class="quickforge-settings-row">
1169
1180
  <div class="quickforge-settings-row-main">
1170
- <div class="quickforge-settings-row-title">${w(`lanAccessPassword`)}</div>
1171
- <div class="quickforge-settings-row-description">${w(`lanAccessPasswordStatusDescription`)}</div>
1181
+ <div class="quickforge-settings-row-title">${O(`lanAccessPassword`)}</div>
1182
+ <div class="quickforge-settings-row-description">${O(`lanAccessPasswordStatusDescription`)}</div>
1172
1183
  </div>
1173
- <div class="quickforge-settings-row-control quickforge-settings-readonly-value">${this.hasPassword?w(`configured`):w(`notConfigured`)}</div>
1184
+ <div class="quickforge-settings-row-control quickforge-settings-readonly-value">${this.hasPassword?O(`configured`):O(`notConfigured`)}</div>
1174
1185
  </div>
1175
1186
  <div class="quickforge-settings-row quickforge-settings-row-top">
1176
1187
  <div class="quickforge-settings-row-main">
1177
- <div class="quickforge-settings-row-title">${w(`lanAccessActiveDevices`,{count:this.activeTokenCount})}</div>
1178
- <div class="quickforge-settings-row-description">${w(`lanAccessActiveDevicesDescription`)}</div>
1188
+ <div class="quickforge-settings-row-title">${O(`lanAccessActiveDevices`,{count:this.activeTokenCount})}</div>
1189
+ <div class="quickforge-settings-row-description">${O(`lanAccessActiveDevicesDescription`)}</div>
1179
1190
  </div>
1180
1191
  </div>
1181
1192
  <div class="quickforge-settings-nested-list quickforge-lan-device-list">
1182
- ${this.activeDevices.length?this.activeDevices.map(e=>_`
1193
+ ${this.activeDevices.length?this.activeDevices.map(e=>b`
1183
1194
  <div class="quickforge-settings-subrow">
1184
1195
  <div class="quickforge-settings-list-item-main">
1185
- <div class="quickforge-settings-row-title">${Ot(e.userAgent)}</div>
1196
+ <div class="quickforge-settings-row-title">${At(e.userAgent)}</div>
1186
1197
  <div class="quickforge-settings-row-description quickforge-lan-device-meta">
1187
- <span>${e.address||w(`lanAccessUnknownAddress`)}</span>
1188
- <span>${w(`lanAccessSignedInAt`,{time:kt(e.issuedAt)})}</span>
1189
- <span>${w(`lanAccessExpiresAt`,{time:kt(e.expiresAt)})}</span>
1198
+ <span>${e.address||O(`lanAccessUnknownAddress`)}</span>
1199
+ <span>${O(`lanAccessSignedInAt`,{time:jt(e.issuedAt)})}</span>
1200
+ <span>${O(`lanAccessExpiresAt`,{time:jt(e.expiresAt)})}</span>
1190
1201
  </div>
1191
1202
  </div>
1192
1203
  <div class="quickforge-settings-list-item-actions">
@@ -1196,28 +1207,28 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,At as n,Dt as r
1196
1207
  ?disabled=${this.saving}
1197
1208
  @click=${()=>this.revokeDevice(e)}
1198
1209
  >
1199
- ${w(`lanAccessRevokeDevice`)}
1210
+ ${O(`lanAccessRevokeDevice`)}
1200
1211
  </button>
1201
1212
  </div>
1202
1213
  </div>
1203
- `):_`<div class="quickforge-settings-empty-row">${w(`lanAccessNoActiveDevices`)}</div>`}
1214
+ `):b`<div class="quickforge-settings-empty-row">${O(`lanAccessNoActiveDevices`)}</div>`}
1204
1215
  </div>
1205
1216
  <div class="quickforge-settings-row">
1206
1217
  <div class="quickforge-settings-row-main">
1207
- <div class="quickforge-settings-row-title">${w(`lanAccessUrls`)}</div>
1208
- <div class="quickforge-settings-row-description">${w(`lanAccessUrlsDescription`)}</div>
1218
+ <div class="quickforge-settings-row-title">${O(`lanAccessUrls`)}</div>
1219
+ <div class="quickforge-settings-row-description">${O(`lanAccessUrlsDescription`)}</div>
1209
1220
  </div>
1210
1221
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide quickforge-settings-readonly-value">
1211
- ${this.lanUrls.length?this.lanUrls.map(e=>_`<div>${e}</div>`):`-`}
1222
+ ${this.lanUrls.length?this.lanUrls.map(e=>b`<div>${e}</div>`):`-`}
1212
1223
  </div>
1213
1224
  </div>
1214
1225
  </section>
1215
1226
 
1216
- <section class="quickforge-settings-section" aria-label=${w(`lanAccess`)}>
1227
+ <section class="quickforge-settings-section" aria-label=${O(`lanAccess`)}>
1217
1228
  <div class="quickforge-settings-row">
1218
1229
  <div class="quickforge-settings-row-main">
1219
- <div class="quickforge-settings-row-title">${w(`lanAccessAllowFull`)}</div>
1220
- <div class="quickforge-settings-row-description">${w(`lanAccessAllowFullDescription`)}</div>
1230
+ <div class="quickforge-settings-row-title">${O(`lanAccessAllowFull`)}</div>
1231
+ <div class="quickforge-settings-row-description">${O(`lanAccessAllowFullDescription`)}</div>
1221
1232
  </div>
1222
1233
  <div class="quickforge-settings-row-control">
1223
1234
  ${this.renderSwitch(this.enabled,e=>this.updateEnabled(e),this.saving)}
@@ -1226,8 +1237,8 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,At as n,Dt as r
1226
1237
 
1227
1238
  <div class="quickforge-settings-row">
1228
1239
  <div class="quickforge-settings-row-main">
1229
- <div class="quickforge-settings-row-title">${w(`lanAccessPassword`)}</div>
1230
- <div class="quickforge-settings-row-description">${this.hasPassword?w(`lanAccessPasswordPlaceholderConfigured`):w(`lanAccessPasswordPlaceholder`)}</div>
1240
+ <div class="quickforge-settings-row-title">${O(`lanAccessPassword`)}</div>
1241
+ <div class="quickforge-settings-row-description">${this.hasPassword?O(`lanAccessPasswordPlaceholderConfigured`):O(`lanAccessPasswordPlaceholder`)}</div>
1231
1242
  </div>
1232
1243
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide quickforge-lan-password-control">
1233
1244
  <div class="quickforge-lan-password-input-wrap">
@@ -1236,24 +1247,24 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,At as n,Dt as r
1236
1247
  type=${this.passwordVisible?`text`:`password`}
1237
1248
  .value=${this.password}
1238
1249
  @input=${e=>this.updatePassword(e.target.value)}
1239
- placeholder=${this.hasPassword?w(`lanAccessPasswordPlaceholderConfigured`):w(`lanAccessPasswordPlaceholder`)}
1250
+ placeholder=${this.hasPassword?O(`lanAccessPasswordPlaceholderConfigured`):O(`lanAccessPasswordPlaceholder`)}
1240
1251
  />
1241
1252
  <button
1242
1253
  class="quickforge-lan-password-toggle"
1243
1254
  type="button"
1244
- aria-label=${this.passwordVisible?w(`hidePassword`):w(`showPassword`)}
1245
- title=${this.passwordVisible?w(`hidePassword`):w(`showPassword`)}
1255
+ aria-label=${this.passwordVisible?O(`hidePassword`):O(`showPassword`)}
1256
+ title=${this.passwordVisible?O(`hidePassword`):O(`showPassword`)}
1246
1257
  aria-pressed=${this.passwordVisible?`true`:`false`}
1247
1258
  @click=${()=>this.togglePasswordVisibility()}
1248
1259
  >
1249
- ${this.passwordVisible?_`
1260
+ ${this.passwordVisible?b`
1250
1261
  <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" aria-hidden="true">
1251
1262
  <path d="m3 3 18 18" stroke-linecap="round"></path>
1252
1263
  <path d="M10.6 10.7a2 2 0 0 0 2.7 2.7"></path>
1253
1264
  <path d="M9.9 4.3A10.9 10.9 0 0 1 12 4c5.5 0 9 5.3 9 8a7.3 7.3 0 0 1-1.5 3.2"></path>
1254
1265
  <path d="M6.6 6.6C4.3 8.1 3 10.4 3 12c0 2.7 3.5 8 9 8 1.5 0 2.8-.4 4-1"></path>
1255
1266
  </svg>
1256
- `:_`
1267
+ `:b`
1257
1268
  <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" aria-hidden="true">
1258
1269
  <path d="M3 12c0-2.7 3.5-8 9-8s9 5.3 9 8-3.5 8-9 8-9-5.3-9-8Z"></path>
1259
1270
  <circle cx="12" cy="12" r="2.5"></circle>
@@ -1264,48 +1275,48 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,At as n,Dt as r
1264
1275
  <button
1265
1276
  class="quickforge-settings-button quickforge-settings-button-secondary"
1266
1277
  type="button"
1267
- @click=${()=>this.updatePassword(Dt())}
1278
+ @click=${()=>this.updatePassword(kt())}
1268
1279
  >
1269
- ${w(`generatePassword`)}
1280
+ ${O(`generatePassword`)}
1270
1281
  </button>
1271
1282
  </div>
1272
1283
  </div>
1273
1284
 
1274
1285
  <div class="quickforge-settings-row">
1275
1286
  <div class="quickforge-settings-row-main">
1276
- <div class="quickforge-settings-row-title">${w(`lanAccessSessionTtl`)}</div>
1277
- <div class="quickforge-settings-row-description">${w(`lanAccessSessionTtlDescription`)}</div>
1287
+ <div class="quickforge-settings-row-title">${O(`lanAccessSessionTtl`)}</div>
1288
+ <div class="quickforge-settings-row-description">${O(`lanAccessSessionTtlDescription`)}</div>
1278
1289
  </div>
1279
1290
  <div class="quickforge-settings-row-control">
1280
1291
  <select class="quickforge-settings-select" .value=${String(this.sessionTtlHours)} @change=${e=>this.updateTtl(e.target.value)}>
1281
- <option value="1">1 ${w(`hour`)}</option>
1282
- <option value="12">12 ${w(`hours`)}</option>
1283
- <option value="24">24 ${w(`hours`)}</option>
1284
- <option value="168">7 ${w(`days`)}</option>
1292
+ <option value="1">1 ${O(`hour`)}</option>
1293
+ <option value="12">12 ${O(`hours`)}</option>
1294
+ <option value="24">24 ${O(`hours`)}</option>
1295
+ <option value="168">7 ${O(`days`)}</option>
1285
1296
  </select>
1286
1297
  </div>
1287
1298
  </div>
1288
1299
 
1289
1300
  <div class="quickforge-settings-row">
1290
1301
  <div class="quickforge-settings-row-main">
1291
- <div class="quickforge-settings-row-title">${w(`lanAccessActions`)}</div>
1292
- <div class="quickforge-settings-row-description">${w(`lanAccessActionsDescription`)}</div>
1302
+ <div class="quickforge-settings-row-title">${O(`lanAccessActions`)}</div>
1303
+ <div class="quickforge-settings-row-description">${O(`lanAccessActionsDescription`)}</div>
1293
1304
  </div>
1294
1305
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide">
1295
1306
  <button class="quickforge-settings-button quickforge-settings-button-primary" type="button" ?disabled=${this.saving} @click=${()=>this.saveSettings()}>
1296
- ${this.saving?w(`saving`):w(`save`)}
1307
+ ${this.saving?O(`saving`):O(`save`)}
1297
1308
  </button>
1298
1309
  <button class="quickforge-settings-button quickforge-settings-button-danger" type="button" ?disabled=${this.saving} @click=${()=>this.revokeAll()}>
1299
- ${w(`lanAccessRevokeAll`)}
1310
+ ${O(`lanAccessRevokeAll`)}
1300
1311
  </button>
1301
1312
  </div>
1302
1313
  </div>
1303
1314
  </section>
1304
1315
 
1305
- ${this.message?_`<div class="quickforge-settings-message">${this.message}</div>`:null}
1306
- ${this.error?_`<div class="quickforge-settings-alert">${this.error}</div>`:null}
1316
+ ${this.message?b`<div class="quickforge-settings-message">${this.message}</div>`:null}
1317
+ ${this.error?b`<div class="quickforge-settings-alert">${this.error}</div>`:null}
1307
1318
  </div>
1308
- `}},q=`quickforge-lan-access-settings-tab`;customElements.get(q)||customElements.define(q,At);function jt(){return document.createElement(q)}var Mt=18e4,Nt=3e4,Pt=1e3,Ft=`https://github.com/shawnstack/quickforge/releases/latest`;function J(){if(typeof document>`u`)return!1;let e=window;return document.body.classList.contains(`quickforge-desktop-app`)||e.__quickforgeDesktopApp===!0}function It(e){return new Promise(t=>window.setTimeout(t,e))}var Lt=[{value:`startup`,label:()=>w(`frequencyStartup`)},{value:`daily`,label:()=>w(`frequencyDaily`)},{value:`weekly`,label:()=>w(`frequencyWeekly`)},{value:`off`,label:()=>w(`frequencyOff`)}],Rt=class extends v{about;updateInfo;loading=!0;checking=!1;updating=!1;restarting=!1;message=``;error=``;frequency=Ee.frequency;lastCheckAt=null;serviceStatus;getTabName(){return w(`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||w(`requestFailed`));this.about=t;try{let[e,t]=await Promise.all([oe(y()),this.loadServiceStatus()]);this.frequency=e.frequency,this.lastCheckAt=e.lastCheckAt,this.serviceStatus=t}catch{}}catch(e){this.error=e instanceof Error?e.message:w(`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||w(`requestFailed`));return t}async checkUpdate(){if(!(this.checking||this.updating)){if(J()){window.open(Ft,`_blank`,`noopener,noreferrer`),this.message=w(`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||w(`updateCheckFailed`));this.updateInfo=t,this.about=t,this.updateInfo.updateAvailable?this.message=w(`updateAvailableMessage`,{current:this.updateInfo.currentVersion,latest:this.updateInfo.latestVersion}):this.updateInfo.localVersionIsNewer?this.message=w(`localVersionNewerMessage`,{current:this.updateInfo.currentVersion,latest:this.updateInfo.latestVersion}):this.message=w(`alreadyLatestVersion`,{version:this.updateInfo.currentVersion})}catch(e){this.error=e instanceof Error?e.message:w(`updateCheckFailed`)}finally{this.checking=!1,this.requestUpdate()}}}async pollUntilUpdated(e){let t=Date.now();for(;Date.now()-t<Mt;){await It(Pt);try{let t=await fetch(`/api/health?updatePoll=${Date.now()}`,{cache:`no-store`}),n=await t.json().catch(()=>null);if(t.ok&&n?.ok&&n.bootId&&n.bootId!==e){this.message=w(`updateRestarted`),this.requestUpdate(),window.setTimeout(()=>window.location.reload(),300);return}}catch{}}throw Error(w(`updateRestartTimeout`))}async pollUntilRestarted(e){let t=Date.now();for(;Date.now()-t<Nt;){await It(Pt);try{let t=await fetch(`/api/health?restartPoll=${Date.now()}`,{cache:`no-store`}),n=await t.json().catch(()=>null);if(t.ok&&n?.ok&&n.bootId&&n.bootId!==e){this.message=w(`backendRestarted`),this.requestUpdate(),window.setTimeout(()=>window.location.reload(),300);return}}catch{}}throw Error(w(`backendRestartTimeout`))}async restartService(){if(!this.serviceStatus||this.restarting||!await T({description:w(`restartBackendConfirm`),confirmLabel:w(`restartBackendService`),cancelLabel:w(`cancel`)}))return;this.restarting=!0,this.message=w(`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||w(`backendRestartFailed`));await this.pollUntilRestarted(e)}catch(e){this.error=e instanceof Error?e.message:w(`backendRestartFailed`),this.message=``,this.restarting=!1,this.requestUpdate()}}async updateQuickForge(){if(J()){window.open(Ft,`_blank`,`noopener,noreferrer`),this.message=w(`desktopUpdateHint`),this.error=``,this.requestUpdate();return}if(!(!this.updateInfo?.updateAvailable||this.updating)&&await T({description:w(`updateConfirm`,{command:this.updateInfo.installCommand}),confirmLabel:w(`updateRuntimeNow`),cancelLabel:w(`cancel`)})){this.updating=!0,this.message=w(`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||w(`updateFailed`));if(this.updateInfo=t,t?.updateStarted){let e=t.logFile?` ${w(`updateLogFile`,{path:t.logFile})}`:``;this.message=`${w(`updateStarted`)}${e}`,this.requestUpdate(),await this.pollUntilUpdated(t.bootId)}else this.message=t?.updated?w(`updateCompleted`):w(`alreadyLatestVersion`,{version:t?.currentVersion||this.about?.version||`-`}),this.updating=!1}catch(e){this.error=e instanceof Error?e.message:w(`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 we(t,{...await oe(t),frequency:e}),this.error=``}catch(e){this.error=e instanceof Error?e.message:w(`requestFailed`)}finally{this.requestUpdate()}}}renderFrequencyOption(e){let t=this.frequency===e.value;return _`
1319
+ `}},Nt=`quickforge-lan-access-settings-tab`;customElements.get(Nt)||customElements.define(Nt,Mt);function Pt(){return document.createElement(Nt)}var Ft=18e4,It=3e4,Lt=1e3,Rt=`https://github.com/shawnstack/quickforge/releases/latest`;function zt(){if(typeof document>`u`)return!1;let e=window;return document.body.classList.contains(`quickforge-desktop-app`)||e.__quickforgeDesktopApp===!0}function Bt(e){return new Promise(t=>window.setTimeout(t,e))}var Vt=[{value:`startup`,label:()=>O(`frequencyStartup`)},{value:`daily`,label:()=>O(`frequencyDaily`)},{value:`weekly`,label:()=>O(`frequencyWeekly`)},{value:`off`,label:()=>O(`frequencyOff`)}],Ht=class extends x{about;updateInfo;loading=!0;checking=!1;updating=!1;restarting=!1;message=``;error=``;frequency=he.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([de(S()),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(zt()){window.open(Rt,`_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<Ft;){await Bt(Lt);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<It;){await Bt(Lt);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 A({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(zt()){window.open(Rt,`_blank`,`noopener,noreferrer`),this.message=O(`desktopUpdateHint`),this.error=``,this.requestUpdate();return}if(!(!this.updateInfo?.updateAvailable||this.updating)&&await A({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=S();await me(t,{...await de(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 b`
1309
1320
  <button
1310
1321
  type="button"
1311
1322
  class="quickforge-settings-segmented-option ${t?`quickforge-settings-segmented-option-active`:``}"
@@ -1314,25 +1325,25 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,At as n,Dt as r
1314
1325
  >
1315
1326
  ${e.label()}
1316
1327
  </button>
1317
- `}infoRows(){let e=this.about;return e?_`
1328
+ `}infoRows(){let e=this.about;return e?b`
1318
1329
  <div class="quickforge-settings-row">
1319
1330
  <div class="quickforge-settings-row-main">
1320
- <div class="quickforge-settings-row-title">${w(`packageName`)}</div>
1321
- <div class="quickforge-settings-row-description">${w(`packageNameDescription`)}</div>
1331
+ <div class="quickforge-settings-row-title">${O(`packageName`)}</div>
1332
+ <div class="quickforge-settings-row-description">${O(`packageNameDescription`)}</div>
1322
1333
  </div>
1323
1334
  <div class="quickforge-settings-row-control quickforge-settings-readonly-value">${e.name}</div>
1324
1335
  </div>
1325
1336
  <div class="quickforge-settings-row">
1326
1337
  <div class="quickforge-settings-row-main">
1327
- <div class="quickforge-settings-row-title">${w(`currentVersion`)}</div>
1328
- <div class="quickforge-settings-row-description">${w(`currentVersionDescription`)}</div>
1338
+ <div class="quickforge-settings-row-title">${O(`currentVersion`)}</div>
1339
+ <div class="quickforge-settings-row-description">${O(`currentVersionDescription`)}</div>
1329
1340
  </div>
1330
1341
  <div class="quickforge-settings-row-control quickforge-settings-readonly-value">${e.version}</div>
1331
1342
  </div>
1332
1343
  <div class="quickforge-settings-row">
1333
1344
  <div class="quickforge-settings-row-main">
1334
- <div class="quickforge-settings-row-title">${w(`github`)}</div>
1335
- <div class="quickforge-settings-row-description">${w(`githubDescription`)}</div>
1345
+ <div class="quickforge-settings-row-title">${O(`github`)}</div>
1346
+ <div class="quickforge-settings-row-description">${O(`githubDescription`)}</div>
1336
1347
  </div>
1337
1348
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide quickforge-settings-readonly-value">
1338
1349
  <a class="quickforge-settings-link" href=${e.repositoryUrl} target="_blank" rel="noreferrer">
@@ -1340,35 +1351,35 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,At as n,Dt as r
1340
1351
  </a>
1341
1352
  </div>
1342
1353
  </div>
1343
- `:null}updateStatus(){return this.updateInfo?_`
1354
+ `:null}updateStatus(){return this.updateInfo?b`
1344
1355
  <div class="quickforge-settings-row">
1345
1356
  <div class="quickforge-settings-row-main">
1346
- <div class="quickforge-settings-row-title">${w(`latestVersion`)}</div>
1347
- <div class="quickforge-settings-row-description">${w(`latestVersionDescription`)}</div>
1357
+ <div class="quickforge-settings-row-title">${O(`latestVersion`)}</div>
1358
+ <div class="quickforge-settings-row-description">${O(`latestVersionDescription`)}</div>
1348
1359
  </div>
1349
1360
  <div class="quickforge-settings-row-control quickforge-settings-readonly-value">${this.updateInfo.latestVersion}</div>
1350
1361
  </div>
1351
- ${this.updateInfo.logFile?_`
1362
+ ${this.updateInfo.logFile?b`
1352
1363
  <div class="quickforge-settings-row">
1353
1364
  <div class="quickforge-settings-row-main">
1354
- <div class="quickforge-settings-row-title">${w(`updateLog`)}</div>
1355
- <div class="quickforge-settings-row-description">${w(`updateLogDescription`)}</div>
1365
+ <div class="quickforge-settings-row-title">${O(`updateLog`)}</div>
1366
+ <div class="quickforge-settings-row-description">${O(`updateLogDescription`)}</div>
1356
1367
  </div>
1357
1368
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide quickforge-settings-readonly-value">
1358
1369
  <code>${this.updateInfo.logFile}</code>
1359
1370
  </div>
1360
1371
  </div>
1361
1372
  `:null}
1362
- `:null}restartSection(){let e=this.serviceStatus?.restartUnsupportedReason||w(`backendRestartUnsupported`),t=this.restarting||!this.serviceStatus?.restartSupported;return _`
1363
- <section class="quickforge-settings-section" aria-label=${w(`restartBackendService`)}>
1373
+ `:null}restartSection(){let e=this.serviceStatus?.restartUnsupportedReason||O(`backendRestartUnsupported`),t=this.restarting||!this.serviceStatus?.restartSupported;return b`
1374
+ <section class="quickforge-settings-section" aria-label=${O(`restartBackendService`)}>
1364
1375
  <div class="quickforge-settings-row">
1365
1376
  <div class="quickforge-settings-row-main">
1366
1377
  <div class="quickforge-settings-row-title">
1367
- ${w(`restartBackendService`)}
1368
- <quickforge-info-tip .label=${w(`restartBackendServiceDescription`)}></quickforge-info-tip>
1378
+ ${O(`restartBackendService`)}
1379
+ <quickforge-info-tip .label=${O(`restartBackendServiceDescription`)}></quickforge-info-tip>
1369
1380
  </div>
1370
1381
  <div class="quickforge-settings-row-description">
1371
- ${this.serviceStatus?.restartSupported?w(`restartBackendServiceDescription`):e}
1382
+ ${this.serviceStatus?.restartSupported?O(`restartBackendServiceDescription`):e}
1372
1383
  </div>
1373
1384
  </div>
1374
1385
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide">
@@ -1378,32 +1389,32 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,At as n,Dt as r
1378
1389
  ?disabled=${t}
1379
1390
  @click=${()=>this.restartService()}
1380
1391
  >
1381
- ${this.restarting?w(`backendRestarting`):w(`restartBackendService`)}
1392
+ ${this.restarting?O(`backendRestarting`):O(`restartBackendService`)}
1382
1393
  </button>
1383
1394
  </div>
1384
1395
  </div>
1385
1396
  </section>
1386
- `}render(){if(this.loading)return _`<div class="text-sm text-muted-foreground">${w(`loading`)}</div>`;let e=this.checking||this.updating||!this.updateInfo?.updateAvailable,t=J();return _`
1397
+ `}render(){if(this.loading)return b`<div class="text-sm text-muted-foreground">${O(`loading`)}</div>`;let e=this.checking||this.updating||!this.updateInfo?.updateAvailable,t=zt();return b`
1387
1398
  <div class="quickforge-settings-stack">
1388
- <section class="quickforge-settings-section" aria-label=${w(`projectInfo`)}>
1399
+ <section class="quickforge-settings-section" aria-label=${O(`projectInfo`)}>
1389
1400
  ${this.infoRows()}
1390
1401
  </section>
1391
1402
 
1392
- <section class="quickforge-settings-section" aria-label=${w(t?`desktopUpdates`:`runtimeUpdates`)}>
1393
- ${t?null:_`
1403
+ <section class="quickforge-settings-section" aria-label=${O(t?`desktopUpdates`:`runtimeUpdates`)}>
1404
+ ${t?null:b`
1394
1405
  <div class="quickforge-settings-row">
1395
1406
  <div class="quickforge-settings-row-main">
1396
1407
  <div class="quickforge-settings-row-title">
1397
- ${w(`updateFrequencySection`)}
1398
- <quickforge-info-tip .label=${w(`updateFrequencyDescription`)}></quickforge-info-tip>
1408
+ ${O(`updateFrequencySection`)}
1409
+ <quickforge-info-tip .label=${O(`updateFrequencyDescription`)}></quickforge-info-tip>
1399
1410
  </div>
1400
1411
  <div class="quickforge-settings-row-description">
1401
- ${this.lastCheckAt?w(`lastCheckedAt`,{time:new Date(this.lastCheckAt).toLocaleString(ue())}):w(`lastCheckedNever`)}
1412
+ ${this.lastCheckAt?O(`lastCheckedAt`,{time:new Date(this.lastCheckAt).toLocaleString(N())}):O(`lastCheckedNever`)}
1402
1413
  </div>
1403
1414
  </div>
1404
1415
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide">
1405
- <div class="quickforge-settings-segmented quickforge-settings-segmented-wrap" role="group" aria-label=${w(`updateFrequencySection`)}>
1406
- ${Lt.map(e=>this.renderFrequencyOption(e))}
1416
+ <div class="quickforge-settings-segmented quickforge-settings-segmented-wrap" role="group" aria-label=${O(`updateFrequencySection`)}>
1417
+ ${Vt.map(e=>this.renderFrequencyOption(e))}
1407
1418
  </div>
1408
1419
  </div>
1409
1420
  </div>
@@ -1414,11 +1425,11 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,At as n,Dt as r
1414
1425
  <div class="quickforge-settings-row">
1415
1426
  <div class="quickforge-settings-row-main">
1416
1427
  <div class="quickforge-settings-row-title">
1417
- ${w(t?`desktopUpdates`:`runtimeUpdates`)}
1418
- <quickforge-info-tip .label=${w(t?`desktopUpdatesDescription`:`runtimeUpdatesDescription`)}></quickforge-info-tip>
1428
+ ${O(t?`desktopUpdates`:`runtimeUpdates`)}
1429
+ <quickforge-info-tip .label=${O(t?`desktopUpdatesDescription`:`runtimeUpdatesDescription`)}></quickforge-info-tip>
1419
1430
  </div>
1420
1431
  <div class="quickforge-settings-row-description">
1421
- ${w(t?`desktopUpdatesDescription`:`runtimeUpdatesDescription`)}
1432
+ ${O(t?`desktopUpdatesDescription`:`runtimeUpdatesDescription`)}
1422
1433
  </div>
1423
1434
  </div>
1424
1435
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide">
@@ -1428,16 +1439,16 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,At as n,Dt as r
1428
1439
  ?disabled=${this.checking||this.updating}
1429
1440
  @click=${()=>this.checkUpdate()}
1430
1441
  >
1431
- ${this.checking?w(`checkingUpdate`):w(t?`openDesktopReleases`:`checkRuntimeUpdate`)}
1442
+ ${this.checking?O(`checkingUpdate`):O(t?`openDesktopReleases`:`checkRuntimeUpdate`)}
1432
1443
  </button>
1433
- ${t?null:_`
1444
+ ${t?null:b`
1434
1445
  <button
1435
1446
  class="quickforge-settings-button quickforge-settings-button-primary"
1436
1447
  type="button"
1437
1448
  ?disabled=${e}
1438
1449
  @click=${()=>this.updateQuickForge()}
1439
1450
  >
1440
- ${this.updating?w(`updatingQuickForge`):w(`updateRuntimeNow`)}
1451
+ ${this.updating?O(`updatingQuickForge`):O(`updateRuntimeNow`)}
1441
1452
  </button>
1442
1453
  `}
1443
1454
  </div>
@@ -1446,22 +1457,22 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,At as n,Dt as r
1446
1457
 
1447
1458
  ${this.serviceStatus?.isLocalRequest===!1?null:this.restartSection()}
1448
1459
 
1449
- ${this.message?_`<div class="quickforge-settings-message">${this.message}</div>`:null}
1450
- ${this.error?_`<div class="quickforge-settings-alert">${this.error}</div>`:null}
1460
+ ${this.message?b`<div class="quickforge-settings-message">${this.message}</div>`:null}
1461
+ ${this.error?b`<div class="quickforge-settings-alert">${this.error}</div>`:null}
1451
1462
  </div>
1452
- `}},zt=`quickforge-about-settings-tab`;customElements.get(zt)||customElements.define(zt,Rt);function Bt(){return document.createElement(zt)}var Vt=class extends v{loading=!0;saving=!1;saved=!1;error=``;message=``;projects=[];project;commandDir=``;commands=[];loadingCommands=!1;saveTimer=null;lastSavedCommandDir=``;pendingSaveAfterCurrent=!1;getTabName(){return w(`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||w(`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:w(`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:w(`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:w(`requestFailed`),this.requestUpdate()}}}async createCommand(){if(!this.project)return;let e=window.prompt(w(`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=w(`commandCreated`,{name:t.name??e.trim()}),await this.loadCommands()):t.reason===`exists`?this.error=w(`commandAlreadyExists`,{name:t.name??e.trim()}):this.error=w(`invalidCommandName`)}catch(e){this.error=e instanceof Error?e.message:w(`requestFailed`)}finally{this.requestUpdate()}}}render(){return this.loading?_`<div class="quickforge-settings-note">${w(`loading`)}</div>`:this.projects.length===0?_`
1463
+ `}},Ut=`quickforge-about-settings-tab`;customElements.get(Ut)||customElements.define(Ut,Ht);function Wt(){return document.createElement(Ut)}var Gt=class extends x{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?b`<div class="quickforge-settings-note">${O(`loading`)}</div>`:this.projects.length===0?b`
1453
1464
  <div class="quickforge-settings-stack">
1454
- <div class="quickforge-settings-note">${w(`selectProjectForCommands`)}</div>
1455
- ${this.error?_`<div class="quickforge-settings-alert">${this.error}</div>`:null}
1465
+ <div class="quickforge-settings-note">${O(`selectProjectForCommands`)}</div>
1466
+ ${this.error?b`<div class="quickforge-settings-alert">${this.error}</div>`:null}
1456
1467
  </div>
1457
- `:_`
1468
+ `:b`
1458
1469
  <div class="quickforge-settings-stack">
1459
- <section class="quickforge-settings-section" aria-label=${w(`projectCommands`)}>
1470
+ <section class="quickforge-settings-section" aria-label=${O(`projectCommands`)}>
1460
1471
  <div class="quickforge-settings-row">
1461
1472
  <div class="quickforge-settings-row-main">
1462
- <div class="quickforge-settings-row-title">${w(`project`)}</div>
1473
+ <div class="quickforge-settings-row-title">${O(`project`)}</div>
1463
1474
  <div class="quickforge-settings-row-description">
1464
- ${this.project?.path?this.project.path:w(`projectCommandsProjectDescription`)}
1475
+ ${this.project?.path?this.project.path:O(`projectCommandsProjectDescription`)}
1465
1476
  </div>
1466
1477
  </div>
1467
1478
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide">
@@ -1470,7 +1481,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,At as n,Dt as r
1470
1481
  .value=${this.project?.id??``}
1471
1482
  @change=${e=>this.selectProject(e)}
1472
1483
  >
1473
- ${this.projects.map(e=>_`<option value=${e.id} ?selected=${e.id===this.project?.id}>${e.name}</option>`)}
1484
+ ${this.projects.map(e=>b`<option value=${e.id} ?selected=${e.id===this.project?.id}>${e.name}</option>`)}
1474
1485
  </select>
1475
1486
  </div>
1476
1487
  </div>
@@ -1478,16 +1489,16 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,At as n,Dt as r
1478
1489
  <div class="quickforge-settings-row quickforge-settings-row-align-start">
1479
1490
  <div class="quickforge-settings-row-main">
1480
1491
  <div class="quickforge-settings-row-title">
1481
- ${w(`commandDirectories`)}
1482
- <quickforge-info-tip .label=${w(`commandDirectoryHelp`)}></quickforge-info-tip>
1492
+ ${O(`commandDirectories`)}
1493
+ <quickforge-info-tip .label=${O(`commandDirectoryHelp`)}></quickforge-info-tip>
1483
1494
  </div>
1484
- <div class="quickforge-settings-row-description">${w(`commandDirectoriesDescription`)}</div>
1495
+ <div class="quickforge-settings-row-description">${O(`commandDirectoriesDescription`)}</div>
1485
1496
  </div>
1486
1497
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide">
1487
1498
  <textarea
1488
1499
  class="quickforge-settings-textarea quickforge-settings-mono"
1489
1500
  .value=${this.commandDir}
1490
- placeholder=${w(`commandDirectoryPlaceholder`)}
1501
+ placeholder=${O(`commandDirectoryPlaceholder`)}
1491
1502
  @input=${e=>this.updateCommandDir(e.target.value)}
1492
1503
  ></textarea>
1493
1504
  </div>
@@ -1495,8 +1506,8 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,At as n,Dt as r
1495
1506
 
1496
1507
  <div class="quickforge-settings-row quickforge-settings-row-align-start">
1497
1508
  <div class="quickforge-settings-row-main">
1498
- <div class="quickforge-settings-row-title">${w(`commandDirectoryExamples`)}</div>
1499
- <div class="quickforge-settings-row-description">${w(`commandDirectoryExamplesDescription`)}</div>
1509
+ <div class="quickforge-settings-row-title">${O(`commandDirectoryExamples`)}</div>
1510
+ <div class="quickforge-settings-row-description">${O(`commandDirectoryExamplesDescription`)}</div>
1500
1511
  </div>
1501
1512
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide quickforge-settings-code-list">
1502
1513
  <code>.ai/commands</code>
@@ -1507,11 +1518,11 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,At as n,Dt as r
1507
1518
  </div>
1508
1519
  </section>
1509
1520
 
1510
- <section class="quickforge-settings-section" aria-label=${w(`loadedCommands`,{count:this.commands.length})}>
1521
+ <section class="quickforge-settings-section" aria-label=${O(`loadedCommands`,{count:this.commands.length})}>
1511
1522
  <div class="quickforge-settings-row">
1512
1523
  <div class="quickforge-settings-row-main">
1513
- <div class="quickforge-settings-row-title">${w(`loadedCommands`,{count:this.commands.length})}</div>
1514
- <div class="quickforge-settings-row-description">${w(`loadedCommandsDescription`)}</div>
1524
+ <div class="quickforge-settings-row-title">${O(`loadedCommands`,{count:this.commands.length})}</div>
1525
+ <div class="quickforge-settings-row-description">${O(`loadedCommandsDescription`)}</div>
1515
1526
  </div>
1516
1527
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide">
1517
1528
  <button
@@ -1520,7 +1531,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,At as n,Dt as r
1520
1531
  ?disabled=${this.loadingCommands}
1521
1532
  @click=${()=>this.openCommandDir()}
1522
1533
  >
1523
- ${w(`openCommandDir`)}
1534
+ ${O(`openCommandDir`)}
1524
1535
  </button>
1525
1536
  <button
1526
1537
  class="quickforge-settings-button quickforge-settings-button-primary"
@@ -1528,41 +1539,41 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,At as n,Dt as r
1528
1539
  ?disabled=${this.loadingCommands}
1529
1540
  @click=${()=>this.createCommand()}
1530
1541
  >
1531
- ${w(`createCommand`)}
1542
+ ${O(`createCommand`)}
1532
1543
  </button>
1533
1544
  </div>
1534
1545
  </div>
1535
1546
 
1536
1547
  <div class="quickforge-settings-nested-list">
1537
- ${this.loadingCommands?_`<div class="quickforge-settings-empty-row">${w(`loading`)}</div>`:this.commands.length===0?_`<div class="quickforge-settings-empty-row">${w(`noCommandsLoaded`)}</div>`:this.commands.map(e=>{let t=e.argumentHint?` ${e.argumentHint}`:``;return _`
1548
+ ${this.loadingCommands?b`<div class="quickforge-settings-empty-row">${O(`loading`)}</div>`:this.commands.length===0?b`<div class="quickforge-settings-empty-row">${O(`noCommandsLoaded`)}</div>`:this.commands.map(e=>{let t=e.argumentHint?` ${e.argumentHint}`:``;return b`
1538
1549
  <div class="quickforge-settings-subrow">
1539
1550
  <div class="quickforge-settings-row-main">
1540
1551
  <div class="quickforge-settings-row-title">
1541
1552
  <code class="quickforge-settings-command-name">/${e.name}${t}</code>
1542
1553
  </div>
1543
1554
  <div class="quickforge-settings-row-description">
1544
- ${e.description||w(`noDescription`)}
1555
+ ${e.description||O(`noDescription`)}
1545
1556
  </div>
1546
1557
  </div>
1547
- ${e.relativePath?_`<div class="quickforge-settings-row-control quickforge-settings-row-control-wide quickforge-settings-readonly-value">${e.relativePath}</div>`:null}
1558
+ ${e.relativePath?b`<div class="quickforge-settings-row-control quickforge-settings-row-control-wide quickforge-settings-readonly-value">${e.relativePath}</div>`:null}
1548
1559
  </div>
1549
1560
  `})}
1550
1561
  </div>
1551
1562
  </section>
1552
1563
 
1553
- ${this.saving?_`<div class="quickforge-settings-note">${w(`saving`)}</div>`:null}
1554
- ${this.saved?_`<div class="quickforge-settings-message">${w(`projectCommandsSaved`)}</div>`:null}
1555
- ${this.message?_`<div class="quickforge-settings-message">${this.message}</div>`:null}
1556
- ${this.error?_`<div class="quickforge-settings-alert">${this.error}</div>`:null}
1564
+ ${this.saving?b`<div class="quickforge-settings-note">${O(`saving`)}</div>`:null}
1565
+ ${this.saved?b`<div class="quickforge-settings-message">${O(`projectCommandsSaved`)}</div>`:null}
1566
+ ${this.message?b`<div class="quickforge-settings-message">${this.message}</div>`:null}
1567
+ ${this.error?b`<div class="quickforge-settings-alert">${this.error}</div>`:null}
1557
1568
  </div>
1558
- `}},Ht=`quickforge-project-commands-settings-tab`;customElements.get(Ht)||customElements.define(Ht,Vt);function Ut(){return document.createElement(Ht)}var Y={"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 Gt(e){switch(e){case`starting`:return w(`channelStatusStarting`);case`waiting_scan`:return w(`channelStatusWaitingScan`);case`running`:return w(`channelStatusRunning`);case`stopping`:return w(`channelStatusStopping`);case`error`:return w(`channelStatusError`);default:return w(`channelStatusStopped`)}}var Kt=class extends v{loading=!0;channels=[];workspaces=[];selectedWorkspaceIdByChannel={};error=``;message=``;eventSource;busyChannelId=``;openingLogsChannelId=``;getTabName(){return w(`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||w(`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:w(`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:w(`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:w(`requestFailed`)}finally{this.requestUpdate()}}ensureWorkspaceSelections(){let e=new Set(this.workspaces.map(e=>e.id)),t={...this.selectedWorkspaceIdByChannel};for(let n of this.channels){if(!n.supportsWorkspaceSelection)continue;let r=t[n.id],i=n.launchWorkspace?.id,a=n.status!==`stopped`&&n.status!==`error`;if(i&&e.has(i)&&a){t[n.id]=i;continue}r&&e.has(r)||(t[n.id]=i&&e.has(i)?i:`default`)}this.selectedWorkspaceIdByChannel=t}connectEvents(){this.eventSource?.close();let e=new EventSource(`/api/channels/events`);this.eventSource=e;let t=e=>{try{let t=JSON.parse(e.data);this.applyChannelEvent(t)}catch{}};e.addEventListener(`snapshot`,t),e.addEventListener(`status`,t),e.addEventListener(`log`,t),e.addEventListener(`qrcode`,t),e.addEventListener(`error`,()=>{})}applyChannelEvent(e){if(Array.isArray(e.channels)){this.channels=e.channels,this.ensureWorkspaceSelections(),this.requestUpdate();return}if(e.snapshot){this.upsertChannel(e.snapshot);return}}upsertChannel(e){let t=this.channels.findIndex(t=>t.id===e.id);t>=0?this.channels=[...this.channels.slice(0,t),e,...this.channels.slice(t+1)]:this.channels=[...this.channels,e],this.ensureWorkspaceSelections(),this.requestUpdate()}selectedWorkspaceId(e){return this.selectedWorkspaceIdByChannel[e.id]||e.launchWorkspace?.id||`default`}handleWorkspaceChange(e,t){let n=t.currentTarget;n&&(this.selectedWorkspaceIdByChannel={...this.selectedWorkspaceIdByChannel,[e.id]:n.value||`default`},this.requestUpdate())}startOptions(e){return e.supportsWorkspaceSelection?{projectId:this.selectedWorkspaceId(e)}:void 0}async invoke(e,t){if(!this.busyChannelId&&!(t===`restart`&&!await T({description:w(`channelRestartConfirm`,{name:e.name}),confirmLabel:w(`restart`),cancelLabel:w(`cancel`)}))){this.busyChannelId=e.id,this.error=``,this.message=``,this.requestUpdate();try{let n=t===`start`||t===`restart`?this.startOptions(e):void 0,r=await this.request(`/api/channels/${encodeURIComponent(e.id)}/${t}`,{method:`POST`,headers:n?{...Y,"content-type":`application/json`}:Y,body:n?JSON.stringify(n):void 0});this.upsertChannel(r)}catch(e){this.error=e instanceof Error?e.message:w(`requestFailed`)}finally{this.busyChannelId=``,this.requestUpdate()}}}async invokeAction(e,t){if(!this.busyChannelId&&!((t.destructive||t.id===`relogin`)&&!await T({description:t.id===`relogin`?w(`channelReloginConfirm`,{name:e.name}):w(`channelLogoutConfirm`,{name:e.name}),confirmLabel:t.label,cancelLabel:w(`cancel`),variant:t.destructive?`destructive`:void 0}))){this.busyChannelId=e.id,this.error=``,this.message=``,this.requestUpdate();try{let n=t.id===`relogin`?this.startOptions(e):void 0,r=await this.request(`/api/channels/${encodeURIComponent(e.id)}/actions/${encodeURIComponent(t.id)}`,{method:`POST`,headers:n?{...Y,"content-type":`application/json`}:Y,body:n?JSON.stringify(n):void 0});this.upsertChannel(r)}catch(e){this.error=e instanceof Error?e.message:w(`requestFailed`)}finally{this.busyChannelId=``,this.requestUpdate()}}}async openLogs(e){if(!this.openingLogsChannelId){this.openingLogsChannelId=e.id,this.error=``,this.message=``,this.requestUpdate();try{await this.request(`/api/channels/${encodeURIComponent(e.id)}/open-logs`,{method:`POST`,headers:Y})}catch(e){this.error=e instanceof Error?e.message:w(`channelOpenLogsFailed`)}finally{this.openingLogsChannelId=``,this.requestUpdate()}}}workspaceSection(e,t){if(!e.supportsWorkspaceSelection)return null;let n=this.selectedWorkspaceId(e);return _`
1569
+ `}},Kt=`quickforge-project-commands-settings-tab`;customElements.get(Kt)||customElements.define(Kt,Gt);function qt(){return document.createElement(Kt)}var J={"x-quickforge-action":`channel-action`};function Jt(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 Yt(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`)}}var Xt=class extends x{loading=!0;channels=[];workspaces=[];selectedWorkspaceIdByChannel={};error=``;message=``;eventSource;busyChannelId=``;openingLogsChannelId=``;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}}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 A({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?{...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:O(`requestFailed`)}finally{this.busyChannelId=``,this.requestUpdate()}}}async invokeAction(e,t){if(!this.busyChannelId&&!((t.destructive||t.id===`relogin`)&&!await A({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?{...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:O(`requestFailed`)}finally{this.busyChannelId=``,this.requestUpdate()}}}async openLogs(e){if(!this.openingLogsChannelId){this.openingLogsChannelId=e.id,this.error=``,this.message=``,this.requestUpdate();try{await this.request(`/api/channels/${encodeURIComponent(e.id)}/open-logs`,{method:`POST`,headers:J})}catch(e){this.error=e instanceof Error?e.message:O(`channelOpenLogsFailed`)}finally{this.openingLogsChannelId=``,this.requestUpdate()}}}workspaceSection(e,t){if(!e.supportsWorkspaceSelection)return null;let n=this.selectedWorkspaceId(e);return b`
1559
1570
  <div class="quickforge-settings-row quickforge-settings-row-align-start">
1560
1571
  <div class="quickforge-settings-row-main">
1561
1572
  <div class="quickforge-settings-row-title">
1562
- ${w(`channelWorkspace`)}
1563
- <quickforge-info-tip .label=${w(`channelWorkspaceDescription`)}></quickforge-info-tip>
1573
+ ${O(`channelWorkspace`)}
1574
+ <quickforge-info-tip .label=${O(`channelWorkspaceDescription`)}></quickforge-info-tip>
1564
1575
  </div>
1565
- <div class="quickforge-settings-row-description">${w(`channelWorkspaceDescription`)}</div>
1576
+ <div class="quickforge-settings-row-description">${O(`channelWorkspaceDescription`)}</div>
1566
1577
  </div>
1567
1578
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide">
1568
1579
  <select
@@ -1571,58 +1582,58 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,At as n,Dt as r
1571
1582
  .value=${n}
1572
1583
  @change=${t=>this.handleWorkspaceChange(e,t)}
1573
1584
  >
1574
- ${this.workspaces.map(e=>_`
1575
- <option value=${e.id}>${e.kind===`default`?w(`channelDefaultWorkspace`):e.name}</option>
1585
+ ${this.workspaces.map(e=>b`
1586
+ <option value=${e.id}>${e.kind===`default`?O(`channelDefaultWorkspace`):e.name}</option>
1576
1587
  `)}
1577
1588
  </select>
1578
1589
  </div>
1579
1590
  </div>
1580
- `}qrSection(e){return e.qrCodeText?_`
1591
+ `}qrSection(e){return e.qrCodeText?b`
1581
1592
  <div class="quickforge-settings-row quickforge-settings-row-align-start">
1582
1593
  <div class="quickforge-settings-row-main">
1583
1594
  <div class="quickforge-settings-row-title">
1584
- ${w(`channelQrTitle`)}
1585
- <quickforge-info-tip .label=${w(`channelQrDescription`)}></quickforge-info-tip>
1595
+ ${O(`channelQrTitle`)}
1596
+ <quickforge-info-tip .label=${O(`channelQrDescription`)}></quickforge-info-tip>
1586
1597
  </div>
1587
- <div class="quickforge-settings-row-description">${w(`channelQrDescription`)}</div>
1598
+ <div class="quickforge-settings-row-description">${O(`channelQrDescription`)}</div>
1588
1599
  </div>
1589
1600
  <pre class="quickforge-channel-qr-text">${e.qrCodeText}</pre>
1590
1601
  </div>
1591
- `:null}channelCard(e){let t=this.busyChannelId===e.id||!!e.activeAction,n=this.openingLogsChannelId===e.id,r=e.status===`running`||e.status===`waiting_scan`||e.status===`starting`,i=e.status===`stopping`,a=!!(e.supportsWorkspaceSelection&&this.workspaces.length===0);return _`
1602
+ `:null}channelCard(e){let t=this.busyChannelId===e.id||!!e.activeAction,n=this.openingLogsChannelId===e.id,r=e.status===`running`||e.status===`waiting_scan`||e.status===`starting`,i=e.status===`stopping`,a=!!(e.supportsWorkspaceSelection&&this.workspaces.length===0);return b`
1592
1603
  <section class="quickforge-settings-section" aria-label=${e.name}>
1593
1604
  <div class="quickforge-settings-row quickforge-settings-row-top">
1594
1605
  <div class="quickforge-settings-row-main">
1595
1606
  <div class="quickforge-settings-row-title">
1596
1607
  ${e.name}
1597
- <span class="quickforge-settings-badge ${Wt(e.status)}">${Gt(e.status)}</span>
1608
+ <span class="quickforge-settings-badge ${Jt(e.status)}">${Yt(e.status)}</span>
1598
1609
  </div>
1599
1610
  <div class="quickforge-settings-row-description">${e.description}</div>
1600
1611
  </div>
1601
1612
  <div class="quickforge-settings-row-control quickforge-settings-row-control-wide">
1602
- <button class="quickforge-settings-button quickforge-settings-button-primary" type="button" ?disabled=${t||r||i||a} @click=${()=>this.invoke(e,`start`)}>${w(`start`)}</button>
1603
- <button class="quickforge-settings-button quickforge-settings-button-secondary" type="button" ?disabled=${t||!r||i} @click=${()=>this.invoke(e,`stop`)}>${w(`stop`)}</button>
1604
- <button class="quickforge-settings-button quickforge-settings-button-secondary" type="button" ?disabled=${t||i||a} @click=${()=>this.invoke(e,`restart`)}>${w(`restart`)}</button>
1605
- ${e.actions?.map(n=>_`
1613
+ <button class="quickforge-settings-button quickforge-settings-button-primary" type="button" ?disabled=${t||r||i||a} @click=${()=>this.invoke(e,`start`)}>${O(`start`)}</button>
1614
+ <button class="quickforge-settings-button quickforge-settings-button-secondary" type="button" ?disabled=${t||!r||i} @click=${()=>this.invoke(e,`stop`)}>${O(`stop`)}</button>
1615
+ <button class="quickforge-settings-button quickforge-settings-button-secondary" type="button" ?disabled=${t||i||a} @click=${()=>this.invoke(e,`restart`)}>${O(`restart`)}</button>
1616
+ ${e.actions?.map(n=>b`
1606
1617
  <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>
1607
1618
  `)}
1608
- <button class="quickforge-settings-button quickforge-settings-button-secondary" type="button" ?disabled=${!!this.openingLogsChannelId} @click=${()=>this.openLogs(e)}>${w(n?`channelOpeningLogs`:`channelOpenLogs`)}</button>
1619
+ <button class="quickforge-settings-button quickforge-settings-button-secondary" type="button" ?disabled=${!!this.openingLogsChannelId} @click=${()=>this.openLogs(e)}>${O(n?`channelOpeningLogs`:`channelOpenLogs`)}</button>
1609
1620
  </div>
1610
1621
  </div>
1611
1622
 
1612
1623
  ${this.workspaceSection(e,t||r||i)}
1613
- ${a?_`<div class="quickforge-settings-alert quickforge-settings-warning-attached">${w(`channelNoWorkspaces`)}</div>`:null}
1614
- ${e.error?_`<div class="quickforge-settings-alert quickforge-settings-warning-attached">${e.error}</div>`:null}
1624
+ ${a?b`<div class="quickforge-settings-alert quickforge-settings-warning-attached">${O(`channelNoWorkspaces`)}</div>`:null}
1625
+ ${e.error?b`<div class="quickforge-settings-alert quickforge-settings-warning-attached">${e.error}</div>`:null}
1615
1626
  ${this.qrSection(e)}
1616
1627
  </section>
1617
- `}render(){return this.loading?_`<div class="quickforge-settings-note">${w(`loading`)}</div>`:_`
1628
+ `}render(){return this.loading?b`<div class="quickforge-settings-note">${O(`loading`)}</div>`:b`
1618
1629
  <div class="quickforge-settings-stack">
1619
1630
  <div class="quickforge-settings-note">
1620
- ${w(`channelsSecurityWarning`)}
1631
+ ${O(`channelsSecurityWarning`)}
1621
1632
  </div>
1622
1633
 
1623
- ${this.channels.length?_`${this.channels.map(e=>this.channelCard(e))}`:_`<div class="quickforge-settings-note">${w(`channelsEmpty`)}</div>`}
1634
+ ${this.channels.length?b`${this.channels.map(e=>this.channelCard(e))}`:b`<div class="quickforge-settings-note">${O(`channelsEmpty`)}</div>`}
1624
1635
 
1625
- ${this.message?_`<div class="quickforge-settings-message">${this.message}</div>`:null}
1626
- ${this.error?_`<div class="quickforge-settings-alert">${this.error}</div>`:null}
1636
+ ${this.message?b`<div class="quickforge-settings-message">${this.message}</div>`:null}
1637
+ ${this.error?b`<div class="quickforge-settings-alert">${this.error}</div>`:null}
1627
1638
  </div>
1628
- `}},qt=`quickforge-channels-settings-tab`;customElements.get(qt)||customElements.define(qt,Kt);function Jt(){return document.createElement(qt)}var Yt=ae(),X=ie(),Xt=(0,j.lazy)(()=>b(()=>import(`./AgentProfilesPage-B84w-r9S.js`).then(e=>({default:e.AgentProfilesPage})),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12]))),Zt=(0,j.lazy)(()=>b(()=>import(`./mcp-servers-dialog-GXXD9K0U.js`).then(e=>({default:e.McpServersPanel})),__vite__mapDeps([13,1,2,3,4,5,6,7,8,9,10,11,12]))),Qt=(0,j.lazy)(()=>b(()=>import(`./skills-dialog-DDh1h8eH.js`).then(e=>e.n).then(e=>({default:e.SkillsManagerPanel})),__vite__mapDeps([10,1,2,3,4,5,6,7,8,9,11,12]))),$t=(0,j.lazy)(()=>b(()=>import(`./PluginsPage-D2862wul.js`).then(e=>({default:e.PluginsPage})),__vite__mapDeps([14,1,2,3,4,5,6,7,8,9,10,11,12,15]))),en=(0,j.lazy)(()=>b(()=>import(`./ScheduledTasksPage-GqbiJDPX.js`).then(e=>({default:e.ScheduledTasksPage})),__vite__mapDeps([16,1,2,3,4,5,6,7,8,9,10,11,12]))),tn=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,Yt.createRoot)(e),this.root.render(this.renderReact()))}},Z=`quickforge-react-settings-tab`;customElements.get(Z)||customElements.define(Z,tn);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)(j.Suspense,{fallback:(0,X.jsx)(`div`,{className:`quickforge-settings-note`,children:w(`loading`)}),children:e})})}function nn(e){window.dispatchEvent(new CustomEvent(`quickforge:open-session-from-settings`,{detail:{sessionId:e}}))}function rn(){return Q(w(`agentsTab`),()=>(0,X.jsx)($,{children:(0,X.jsx)(Xt,{})}))}function an(){return Q(w(`skills`),()=>(0,X.jsx)($,{children:(0,X.jsx)(Qt,{active:!0,scope:`global`,embedded:!0,onSaved:()=>void 0})}))}function on(){return Q(w(`mcpServers`),()=>(0,X.jsx)($,{children:(0,X.jsx)(Zt,{active:!0})}))}function sn(){return Q(w(`plugins`),()=>(0,X.jsx)($,{children:(0,X.jsx)($t,{})}))}function cn(){return Q(w(`scheduledTasks`),()=>(0,X.jsx)($,{children:(0,X.jsx)(en,{onOpenSession:nn})}))}function ln(e){let t=[{key:`appearance`,tab:Ve(),getDescription:()=>w(`appearanceDescription`)},{key:`defaults`,tab:at(),getDescription:()=>w(`defaultOptionsDescription`)},{key:`memory`,tab:ft(),getDescription:()=>w(`memoryDescription`)},{key:`customModels`,tab:Re(e),getDescription:()=>w(`customModelsDescription`)},{key:`agents`,tab:rn(),getDescription:()=>w(`agentsDescription`)},{key:`skills`,tab:an(),getDescription:()=>w(`globalSkillsDescription`)},{key:`mcp`,tab:on(),getDescription:void 0},{key:`plugins`,tab:sn(),getDescription:()=>w(`pluginsDescription`)},{key:`scheduledTasks`,tab:cn(),getDescription:()=>w(`scheduledTasksDescription`)},{key:`projectCommands`,tab:Ut(),getDescription:()=>w(`projectCommandsDescription`)},{key:`backup`,tab:St(),getDescription:()=>w(`backupRestoreDescription`)},{key:`archivedConversations`,tab:Et(),getDescription:()=>w(`archivedConversationsDescription`)},{key:`channels`,tab:Jt(),getDescription:()=>w(`channelsDescription`)},{key:`lanAccess`,tab:jt(),getDescription:()=>w(`lanAccessDescription`)},{key:`about`,tab:Bt(),getDescription:()=>w(`aboutQuickForgeDescription`)}];return{items:[...t],tabs:t.map(e=>e.tab),indexOf:e=>t.findIndex(t=>t.key===e)}}var un={appearance:t,defaults:re,memory:i,customModels:h,agents:r,skills:c,mcp:ne,plugins:g,scheduledTasks:u,projectCommands:m,backup:f,archivedConversations:l,channels:d,lanAccess:p,about:a};function dn({tab:e}){let t=(0,j.useRef)(null);return(0,j.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 fn({initialTab:e,customProvider:t,onBack:r}){let i=(0,j.useMemo)(()=>ln(t),[t]),a=Math.max(0,i.indexOf(e)),[o,c]=(0,j.useState)(),[l,u]=(0,j.useState)(null),d=o??a,[f,ne]=(0,j.useState)(``),p=f.trim().toLowerCase(),m=(0,j.useMemo)(()=>i.items.map((e,t)=>({item:e,index:t})).filter(({item:e})=>p?[e.key,e.tab.getTabName(),e.getDescription?.()??``].join(` `).toLowerCase().includes(p):!0),[i.items,p]),h=(0,j.useMemo)(()=>{if(!p)return d;let e=m[0];return e?m.some(({index:e})=>e===d)?d:e.index:d},[d,m,p]),g=i.items[h]??i.items[0],ie=g?.getDescription?.(),ae=g?un[g.key]:void 0,_=(0,j.useRef)(null),[v,y]=(0,j.useState)(!1);return(0,j.useEffect)(()=>{_.current?.scrollTo({top:0})},[h,l]),(0,X.jsxs)(`div`,{className:`flex h-screen min-h-0 supports-[height:100dvh]:h-dvh bg-[var(--quickforge-sidebar-bg)] text-foreground`,children:[(0,X.jsxs)(`aside`,{className:`relative z-10 hidden w-80 shrink-0 overflow-hidden bg-[var(--quickforge-sidebar-bg)] md:flex md:min-h-0 md:flex-col`,children:[(0,X.jsxs)(`div`,{className:`shrink-0 px-3 pb-2 pt-3`,children:[(0,X.jsxs)(`button`,{type:`button`,className:`group relative flex w-full items-center gap-2 overflow-hidden rounded-lg px-2 py-1.5 text-left text-muted-foreground/72 transition-[background-color,color,box-shadow] duration-160 ease-out hover:bg-[var(--quickforge-sidebar-hover-bg)] hover:text-foreground/86 hover:shadow-[0_8px_20px_-18px_rgb(15_23_42_/_0.35)]`,onClick: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)(s,{className:`size-4`})}),(0,X.jsx)(`span`,{className:`truncate text-sm leading-5`,children:`返回工作区`})]}),(0,X.jsxs)(`div`,{className:`quickforge-settings-inline-field mt-3`,children:[(0,X.jsx)(ee,{className:`pointer-events-none absolute left-3 top-1/2 size-4 -translate-y-1/2 text-muted-foreground/60`,"aria-hidden":`true`}),(0,X.jsx)(`input`,{value:f,onChange:e=>ne(e.target.value),placeholder:w(`searchSettings`),"aria-label":w(`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":w(`settings`),children:[m.map(({item:e,index:t})=>{let n=t===h,r=un[e.key];return(0,X.jsxs)(`button`,{type:`button`,className:E(`group relative flex w-full items-center gap-2.5 overflow-hidden rounded-lg px-2 py-1.5 text-left text-sm leading-5 transition-[background-color,color,box-shadow] duration-160 ease-out`,n?`bg-[var(--quickforge-sidebar-active-bg)] font-medium text-foreground/92 shadow-[0_8px_22px_-20px_rgb(15_23_42_/_0.32)]`:`text-muted-foreground/76 hover:bg-[var(--quickforge-sidebar-hover-bg)] hover:text-foreground/90 hover:shadow-[0_8px_20px_-18px_rgb(15_23_42_/_0.35)]`),onClick:()=>c(t),"aria-current":n?`page`:void 0,children:[(0,X.jsx)(`span`,{className:E(`inline-flex size-5 shrink-0 items-center justify-center transition-colors`,n?`text-foreground/72`:`text-muted-foreground/52 group-hover:text-foreground/68`),children:(0,X.jsx)(r,{className:`size-4`,"aria-hidden":`true`})}),(0,X.jsx)(`span`,{className:`truncate`,children:e.tab.getTabName()})]},e.key)}),m.length===0?(0,X.jsx)(`div`,{className:`px-2 py-3 text-sm text-muted-foreground/70`,children:w(`noSettingsResults`)}):null]})})]}),(0,X.jsxs)(`main`,{className:`relative flex min-w-0 flex-1 flex-col bg-[var(--quickforge-main-bg)] md:overflow-hidden md:rounded-tl-2xl`,children:[(0,X.jsxs)(`header`,{className:`flex h-14 shrink-0 items-center gap-2 border-b-[0.5px] border-[color-mix(in_oklab,var(--border)_34%,transparent)] px-3 pr-4 md:px-5`,children:[(0,X.jsx)(Te,{variant:`ghost`,size:`icon`,className:`md:hidden`,onClick:l===null?r:()=>u(null),"aria-label":l===null?`返回工作区`:`返回设置`,children:(0,X.jsx)(s,{className:`size-4`})}),(0,X.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,X.jsxs)(`div`,{className:E(`flex min-w-0 items-center gap-2`,l===null?`md:hidden`:`hidden`),children:[(0,X.jsx)(re,{className:`size-4 shrink-0 text-muted-foreground/65`,"aria-hidden":`true`}),(0,X.jsx)(`div`,{className:`min-w-0 truncate text-sm font-medium text-foreground/90`,children:w(`settings`)})]}),(0,X.jsxs)(`div`,{className:E(`flex min-w-0 items-center gap-2`,l===null&&`hidden md:flex`),children:[ae?(0,X.jsx)(ae,{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:g?.tab.getTabName()}),ie?(0,X.jsx)(De,{label:ie}):null]})]})]}),(0,X.jsxs)(`div`,{className:E(`flex min-h-0 flex-1 flex-col md:hidden`,l!==null&&`hidden`),children:[(0,X.jsx)(`div`,{className:`shrink-0 border-b-[0.5px] border-[color-mix(in_oklab,var(--border)_30%,transparent)] px-3 py-2`,children:(0,X.jsxs)(`div`,{className:`quickforge-settings-inline-field`,children:[(0,X.jsx)(ee,{className:`pointer-events-none absolute left-3 top-1/2 size-4 -translate-y-1/2 text-muted-foreground/60`,"aria-hidden":`true`}),(0,X.jsx)(`input`,{value:f,onChange:e=>ne(e.target.value),placeholder:w(`searchSettings`),"aria-label":w(`searchSettings`),className:`quickforge-settings-input`})]})}),(0,X.jsx)(`nav`,{className:`quickforge-settings-mobile-list`,"aria-label":w(`settings`),children:(0,X.jsxs)(`div`,{className:`quickforge-settings-mobile-list-card`,children:[m.map(({item:e,index:t})=>{let n=un[e.key];return(0,X.jsxs)(`button`,{type:`button`,className:`quickforge-settings-mobile-list-item`,onClick:()=>{c(t),u(t)},children:[(0,X.jsx)(`span`,{className:`quickforge-settings-mobile-list-icon`,children:(0,X.jsx)(n,{className:`size-4 shrink-0`,"aria-hidden":`true`})}),(0,X.jsx)(`span`,{className:`quickforge-settings-mobile-list-label`,children:e.tab.getTabName()}),(0,X.jsx)(te,{className:`quickforge-settings-mobile-list-chevron size-4 shrink-0`,"aria-hidden":`true`})]},e.key)}),m.length===0?(0,X.jsx)(`div`,{className:`px-2 py-8 text-center text-sm text-muted-foreground/70`,children:w(`noSettingsResults`)}):null]})})]}),(0,X.jsx)(`section`,{ref:_,onScroll:()=>y((_.current?.scrollTop??0)>160),className:E(`min-h-0 flex-1 overflow-y-auto px-4 py-5 md:px-8 md:py-7`,l===null&&`hidden md:block`),children:(0,X.jsx)(`div`,{className:`mx-auto flex min-h-full w-full max-w-5xl flex-col`,children:m.length===0?(0,X.jsx)(`div`,{className:`rounded-xl border border-dashed border-[color-mix(in_oklab,var(--border)_70%,transparent)] p-8 text-center text-sm text-muted-foreground/70`,children:w(`noSettingsResults`)}):g?(0,X.jsx)(dn,{tab:g.tab}):null})}),(0,X.jsx)(`button`,{type:`button`,onClick:()=>_.current?.scrollTo({top:0,behavior:`smooth`}),"aria-label":`返回顶部`,className:E(`absolute bottom-5 right-4 z-20 flex size-9 items-center justify-center rounded-[10px] border-[0.5px] border-[color-mix(in_oklab,var(--border)_65%,transparent)] bg-[var(--background)] text-muted-foreground/85 shadow-[0_10px_24px_-16px_rgb(15_23_42_/_0.55)] transition-opacity duration-160 md:hidden`,v?`opacity-100`:`pointer-events-none opacity-0`,l===null&&`hidden`),children:(0,X.jsx)(n,{className:`size-4`})})]})]})}export{fn as SettingsWorkspacePage};
1639
+ `}},Y=`quickforge-channels-settings-tab`;customElements.get(Y)||customElements.define(Y,Xt);function Zt(){return document.createElement(Y)}var Qt=ie(),X=y(),$t=(0,P.lazy)(()=>C(()=>import(`./AgentProfilesPage-XNjuqJs7.js`).then(e=>({default:e.AgentProfilesPage})),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14]))),en=(0,P.lazy)(()=>C(()=>import(`./mcp-servers-dialog-BUSPvaqI.js`).then(e=>({default:e.McpServersPanel})),__vite__mapDeps([15,1,2,3,4,5,6,7,8,9,10,11,12,13]))),tn=(0,P.lazy)(()=>C(()=>import(`./skills-dialog-BThnIUBs.js`).then(e=>e.n).then(e=>({default:e.SkillsManagerPanel})),__vite__mapDeps([10,1,2,3,4,5,6,7,8,9,11,12,13]))),nn=(0,P.lazy)(()=>C(()=>import(`./PluginsPage-BQgp0qN-.js`).then(e=>({default:e.PluginsPage})),__vite__mapDeps([16,1,2,3,4,5,6,7,8,9,10,11,12,13,17]))),rn=(0,P.lazy)(()=>C(()=>import(`./ScheduledTasksPage-DdekATzq.js`).then(e=>({default:e.ScheduledTasksPage})),__vite__mapDeps([18,1,2,3,4,5,6,7,8,9,10,11,12,13,14]))),an=(0,P.lazy)(()=>C(()=>import(`./ShareLinksSettingsPage-C75WJpaF.js`).then(e=>({default:e.ShareLinksSettingsPage})),__vite__mapDeps([19,1,2,3,4,5,6,7,8,9,10,11,12,13]))),on=(0,P.lazy)(()=>C(()=>import(`./CloudAccountSettingsPage-GJSoi6sO.js`).then(e=>({default:e.CloudAccountSettingsPage})),__vite__mapDeps([20,1,2,3,4,5,6,7,8,9,10,11,12,13]))),sn=class extends x{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 b`<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,Qt.createRoot)(e),this.root.render(this.renderReact()))}},cn=`quickforge-react-settings-tab`;customElements.get(cn)||customElements.define(cn,sn);function Z(e,t){let n=document.createElement(cn);return n.tabName=e,n.renderReact=t,n}function Q({children:e}){return(0,X.jsx)(`div`,{className:`quickforge-settings-stack h-full min-h-[30rem]`,children:(0,X.jsx)(P.Suspense,{fallback:(0,X.jsx)(`div`,{className:`quickforge-settings-note`,children:O(`loading`)}),children:e})})}function ln(e){window.dispatchEvent(new CustomEvent(`quickforge:open-session-from-settings`,{detail:{sessionId:e}}))}function un(){return Z(O(`agentsTab`),()=>(0,X.jsx)(Q,{children:(0,X.jsx)($t,{})}))}function dn(){return Z(O(`skills`),()=>(0,X.jsx)(Q,{children:(0,X.jsx)(tn,{active:!0,scope:`global`,embedded:!0,onSaved:()=>void 0})}))}function fn(){return Z(O(`mcpServers`),()=>(0,X.jsx)(Q,{children:(0,X.jsx)(en,{active:!0})}))}function pn(){return Z(O(`plugins`),()=>(0,X.jsx)(Q,{children:(0,X.jsx)(nn,{})}))}function mn(){return Z(O(`scheduledTasks`),()=>(0,X.jsx)(Q,{children:(0,X.jsx)(rn,{onOpenSession:ln})}))}function hn(){return Z(O(`cloudAccount`),()=>(0,X.jsx)(Q,{children:(0,X.jsx)(on,{})}))}function gn(){return Z(O(`shareLinks`),()=>(0,X.jsx)(Q,{children:(0,X.jsx)(an,{})}))}function _n(e){let t=[{key:`appearance`,tab:He(),getDescription:()=>O(`appearanceDescription`)},{key:`cloudAccount`,tab:hn(),getDescription:()=>O(`cloudAccountDescription`)},{key:`defaults`,tab:at(),getDescription:()=>O(`defaultOptionsDescription`)},{key:`memory`,tab:ft(),getDescription:()=>O(`memoryDescription`)},{key:`customModels`,tab:ze(e),getDescription:()=>O(`customModelsDescription`)},{key:`agents`,tab:un(),getDescription:()=>O(`agentsDescription`)},{key:`skills`,tab:dn(),getDescription:()=>O(`globalSkillsDescription`)},{key:`mcp`,tab:fn(),getDescription:void 0},{key:`plugins`,tab:pn(),getDescription:()=>O(`pluginsDescription`)},{key:`scheduledTasks`,tab:mn(),getDescription:()=>O(`scheduledTasksDescription`)},{key:`projectCommands`,tab:qt(),getDescription:()=>O(`projectCommandsDescription`)},{key:`backup`,tab:St(),getDescription:()=>O(`backupRestoreDescription`)},{key:`archivedConversations`,tab:Ot(),getDescription:()=>O(`archivedConversationsDescription`)},{key:`shareLinks`,tab:gn(),getDescription:()=>O(`shareLinksDescription`)},{key:`channels`,tab:Zt(),getDescription:()=>O(`channelsDescription`)},{key:`lanAccess`,tab:Pt(),getDescription:()=>O(`lanAccessDescription`)},{key:`about`,tab:Wt(),getDescription:()=>O(`aboutQuickForgeDescription`)}];return{items:[...t],tabs:t.map(e=>e.tab),indexOf:e=>t.findIndex(t=>t.key===e)}}var $={appearance:o,cloudAccount:v,defaults:te,memory:s,customModels:h,agents:t,skills:r,mcp:d,plugins:ne,scheduledTasks:i,projectCommands:p,backup:f,archivedConversations:n,shareLinks:_,channels:m,lanAccess:g,about:u};function vn({tab:e}){let t=(0,P.useRef)(null);return(0,P.useEffect)(()=>{let n=t.current;if(n)return n.replaceChildren(e),()=>{e.parentNode===n&&n.removeChild(e)}},[e]),(0,X.jsx)(`div`,{ref:t,className:`quickforge-settings-tab-host min-h-0 flex-1`})}function yn({initialTab:e,customProvider:t,onBack:n}){let r=(0,P.useMemo)(()=>_n(t),[t]),i=Math.max(0,r.indexOf(e)),[o,s]=(0,P.useState)(),[l,u]=(0,P.useState)(null),d=o??i,[f,p]=(0,P.useState)(``),m=f.trim().toLowerCase(),h=(0,P.useMemo)(()=>r.items.map((e,t)=>({item:e,index:t})).filter(({item:e})=>m?[e.key,e.tab.getTabName(),e.getDescription?.()??``].join(` `).toLowerCase().includes(m):!0),[r.items,m]),g=(0,P.useMemo)(()=>{if(!m)return d;let e=h[0];return e?h.some(({index:e})=>e===d)?d:e.index:d},[d,h,m]),_=r.items[g]??r.items[0],v=_?.getDescription?.(),ne=_?$[_.key]:void 0,y=(0,P.useRef)(null),[ie,b]=(0,P.useState)(!1);return(0,P.useEffect)(()=>{y.current?.scrollTo({top:0})},[g,l]),(0,X.jsxs)(`div`,{className:`flex h-screen min-h-0 supports-[height:100dvh]:h-dvh bg-[var(--quickforge-sidebar-bg)] text-foreground`,children:[(0,X.jsxs)(`aside`,{className:`relative z-10 hidden w-80 shrink-0 overflow-hidden bg-[var(--quickforge-sidebar-bg)] md:flex md:min-h-0 md:flex-col`,children:[(0,X.jsxs)(`div`,{className:`shrink-0 px-3 pb-2 pt-3`,children:[(0,X.jsxs)(`button`,{type:`button`,className:`group relative flex w-full items-center gap-2 overflow-hidden rounded-lg px-2 py-1.5 text-left text-muted-foreground/72 transition-[background-color,color,box-shadow] duration-160 ease-out hover:bg-[var(--quickforge-sidebar-hover-bg)] hover:text-foreground/86 hover:shadow-[0_8px_20px_-18px_rgb(15_23_42_/_0.35)]`,onClick:n,"aria-label":`返回工作区`,children:[(0,X.jsx)(`span`,{className:`inline-flex size-6 shrink-0 items-center justify-center rounded-full text-muted-foreground/55 transition-colors group-hover:text-foreground/70`,children:(0,X.jsx)(ee,{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)(re,{className:`pointer-events-none absolute left-3 top-1/2 size-4 -translate-y-1/2 text-muted-foreground/60`,"aria-hidden":`true`}),(0,X.jsx)(`input`,{value:f,onChange:e=>p(e.target.value),placeholder:O(`searchSettings`),"aria-label":O(`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":O(`settings`),children:[h.map(({item:e,index:t})=>{let n=t===g,r=$[e.key];return(0,X.jsxs)(`button`,{type:`button`,className:M(`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:M(`inline-flex size-5 shrink-0 items-center justify-center transition-colors`,n?`text-foreground/72`:`text-muted-foreground/52 group-hover:text-foreground/68`),children:(0,X.jsx)(r,{className:`size-4`,"aria-hidden":`true`})}),(0,X.jsx)(`span`,{className:`truncate`,children:e.tab.getTabName()})]},e.key)}),h.length===0?(0,X.jsx)(`div`,{className:`px-2 py-3 text-sm text-muted-foreground/70`,children:O(`noSettingsResults`)}):null]})})]}),(0,X.jsxs)(`main`,{className:`relative flex min-w-0 flex-1 flex-col bg-[var(--quickforge-main-bg)] md:overflow-hidden md:rounded-tl-2xl`,children:[(0,X.jsxs)(`header`,{className:`flex h-14 shrink-0 items-center gap-2 border-b-[0.5px] border-[color-mix(in_oklab,var(--border)_34%,transparent)] px-3 pr-4 md:px-5`,children:[(0,X.jsx)(ke,{variant:`ghost`,size:`icon`,className:`md:hidden`,onClick:l===null?n:()=>u(null),"aria-label":l===null?`返回工作区`:`返回设置`,children:(0,X.jsx)(ee,{className:`size-4`})}),(0,X.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,X.jsxs)(`div`,{className:M(`flex min-w-0 items-center gap-2`,l===null?`md:hidden`:`hidden`),children:[(0,X.jsx)(te,{className:`size-4 shrink-0 text-muted-foreground/65`,"aria-hidden":`true`}),(0,X.jsx)(`div`,{className:`min-w-0 truncate text-sm font-medium text-foreground/90`,children:O(`settings`)})]}),(0,X.jsxs)(`div`,{className:M(`flex min-w-0 items-center gap-2`,l===null&&`hidden md:flex`),children:[ne?(0,X.jsx)(ne,{className:`size-4 shrink-0 text-muted-foreground/65`,"aria-hidden":`true`}):null,(0,X.jsx)(`div`,{className:`min-w-0 truncate text-sm font-medium text-foreground/90`,children:_?.tab.getTabName()}),v?(0,X.jsx)(we,{label:v}):null]})]})]}),(0,X.jsxs)(`div`,{className:M(`flex min-h-0 flex-1 flex-col md:hidden`,l!==null&&`hidden`),children:[(0,X.jsx)(`div`,{className:`shrink-0 border-b-[0.5px] border-[color-mix(in_oklab,var(--border)_30%,transparent)] px-3 py-2`,children:(0,X.jsxs)(`div`,{className:`quickforge-settings-inline-field`,children:[(0,X.jsx)(re,{className:`pointer-events-none absolute left-3 top-1/2 size-4 -translate-y-1/2 text-muted-foreground/60`,"aria-hidden":`true`}),(0,X.jsx)(`input`,{value:f,onChange:e=>p(e.target.value),placeholder:O(`searchSettings`),"aria-label":O(`searchSettings`),className:`quickforge-settings-input`})]})}),(0,X.jsx)(`nav`,{className:`quickforge-settings-mobile-list`,"aria-label":O(`settings`),children:(0,X.jsxs)(`div`,{className:`quickforge-settings-mobile-list-card`,children:[h.map(({item:e,index:t})=>{let n=$[e.key];return(0,X.jsxs)(`button`,{type:`button`,className:`quickforge-settings-mobile-list-item`,onClick:()=>{s(t),u(t)},children:[(0,X.jsx)(`span`,{className:`quickforge-settings-mobile-list-icon`,children:(0,X.jsx)(n,{className:`size-4 shrink-0`,"aria-hidden":`true`})}),(0,X.jsx)(`span`,{className:`quickforge-settings-mobile-list-label`,children:e.tab.getTabName()}),(0,X.jsx)(a,{className:`quickforge-settings-mobile-list-chevron size-4 shrink-0`,"aria-hidden":`true`})]},e.key)}),h.length===0?(0,X.jsx)(`div`,{className:`px-2 py-8 text-center text-sm text-muted-foreground/70`,children:O(`noSettingsResults`)}):null]})})]}),(0,X.jsx)(`section`,{ref:y,onScroll:()=>b((y.current?.scrollTop??0)>160),className:M(`min-h-0 flex-1 overflow-y-auto px-4 py-5 md:px-8 md:py-7`,l===null&&`hidden md:block`),children:(0,X.jsx)(`div`,{className:`mx-auto flex min-h-full w-full max-w-5xl flex-col`,children:h.length===0?(0,X.jsx)(`div`,{className:`rounded-xl border border-dashed border-[color-mix(in_oklab,var(--border)_70%,transparent)] p-8 text-center text-sm text-muted-foreground/70`,children:O(`noSettingsResults`)}):_?(0,X.jsx)(vn,{tab:_.tab}):null})}),(0,X.jsx)(`button`,{type:`button`,onClick:()=>y.current?.scrollTo({top:0,behavior:`smooth`}),"aria-label":`返回顶部`,className:M(`absolute bottom-5 right-4 z-20 flex size-9 items-center justify-center rounded-[10px] border-[0.5px] border-[color-mix(in_oklab,var(--border)_65%,transparent)] bg-[var(--background)] text-muted-foreground/85 shadow-[0_10px_24px_-16px_rgb(15_23_42_/_0.55)] transition-opacity duration-160 md:hidden`,ie?`opacity-100`:`pointer-events-none opacity-0`,l===null&&`hidden`),children:(0,X.jsx)(c,{className:`size-4`})})]})]})}export{yn as SettingsWorkspacePage};