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