@shawnstack/quickforge 1.6.10 → 1.6.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +292 -452
- package/dist/assets/{AgentProfilesPage-BtZpDV-3.js → AgentProfilesPage-CooGLweI.js} +1 -1
- package/dist/assets/ChatPanelHost-TEbv0lnL.js +260 -0
- package/dist/assets/{PluginsPage-CCIj8-Mn.js → PluginsPage-qXTjDrpd.js} +1 -1
- package/dist/assets/{ScheduledTasksPage-DIMewQ3i.js → ScheduledTasksPage-BBor8Yb2.js} +1 -1
- package/dist/assets/{SettingsWorkspacePage-BPD495WT.js → SettingsWorkspacePage-CnFDmGvW.js} +190 -120
- package/dist/assets/{SharedConversationPage-B_oMTp7B.js → SharedConversationPage-CkQ-XwYS.js} +1 -1
- package/dist/assets/{TerminalDock-wgW7kSC4.js → TerminalDock-CvqBBMPg.js} +1 -1
- package/dist/assets/{WorkspaceInspector-CdX45r3u.js → WorkspaceInspector-6JGc6VGb.js} +1 -1
- package/dist/assets/index-DxNzlPmc.js +63 -0
- package/dist/assets/index-HVxfqXfB.css +3 -0
- package/dist/assets/{mcp-servers-dialog-jHlDR9jP.js → mcp-servers-dialog-CsRQxx7A.js} +1 -1
- package/dist/assets/{skills-dialog-DvSnPPzu.js → skills-dialog-CmVLi_h6.js} +1 -1
- package/dist/index.html +4 -4
- package/package.json +1 -1
- package/server/agent-manager.mjs +45 -3
- package/server/approval-store.mjs +4 -0
- package/server/global-memory.mjs +168 -0
- package/server/index.mjs +7 -0
- package/server/project-config.mjs +3 -0
- package/server/routes/memory.mjs +26 -0
- package/server/routes/project.mjs +3 -18
- package/server/routes/tools.mjs +5 -3
- package/server/system-prompt.mjs +22 -0
- package/server/tools/definitions.mjs +14 -0
- package/server/tools/index.mjs +6 -0
- package/server/utils/platform.mjs +20 -3
- package/dist/assets/ChatPanelHost-BF1V-xOV.js +0 -244
- package/dist/assets/index-Bxg5fT2p.css +0 -3
- package/dist/assets/index-DKmdePUP.js +0 -63
|
@@ -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{Ft as t,H as n,It as r,Nt as i,
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/AgentProfilesPage-CooGLweI.js","assets/rolldown-runtime-DWdDZTNf.js","assets/index-DxNzlPmc.js","assets/pi-ai-Cr3rpCXT.js","assets/pi-web-ui-DoRGtREc.js","assets/lit-vendor-Dr3cpBGF.js","assets/css-utils-rkE68RDy.js","assets/icons-C7j5jdKo.js","assets/react-vendor-VqdnQHHS.js","assets/skills-dialog-CmVLi_h6.js","assets/logger-B65Akg8A.js","assets/index-HVxfqXfB.css","assets/mcp-servers-dialog-CsRQxx7A.js","assets/PluginsPage-qXTjDrpd.js","assets/plugin-api-BbUkYm3Y.js","assets/ScheduledTasksPage-BBor8Yb2.js"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r,Nt as i,Pt as a,Rt as o,S as s,Vt as c,_ as ee,c as l,g as u,j as d,mt as f,p,pt as m,u as h,yt as te,zt as ne}from"./icons-C7j5jdKo.js";import{n as re,r as ie}from"./react-vendor-VqdnQHHS.js";import{p as g}from"./lit-vendor-Dr3cpBGF.js";import{m as _,x as v}from"./pi-web-ui-DoRGtREc.js";import{J as y}from"./pi-ai-Cr3rpCXT.js";import{t as b}from"./logger-B65Akg8A.js";import{$ as ae,A as x,B as oe,C as se,D as ce,E as le,F as ue,H as S,I as de,L as fe,M as pe,O as me,Q as he,T as ge,V as C,Z as w,at as T,ct as _e,dt as E,ft as ve,ht as D,it as ye,k as O,mt as be,ot as xe,pt as Se,rt as Ce,tt as we,ut as Te,w as Ee,z as De}from"./index-DxNzlPmc.js";var k=e(c(),1),Oe={openai:{name:`OpenAI`,baseUrl:`https://api.openai.com/v1`,protocol:`openai-completions`,modelId:`gpt-4o`,supportsImages:!0},deepseek:{name:`DeepSeek`,baseUrl:`https://api.deepseek.com/v1`,protocol:`openai-completions`,modelId:`deepseek-chat`},glm:{name:`Zhipu GLM`,baseUrl:`https://open.bigmodel.cn/api/paas/v4`,protocol:`openai-completions`,modelId:`glm-4-plus`},ollama:{name:`Ollama`,baseUrl:`http://localhost:11434/v1`,protocol:`openai-completions`,modelId:`llama3.1`},litellm:{name:w.name,baseUrl:w.baseUrl,protocol:`openai-completions`,modelId:w.modelId,supportsImages:w.supportsImages}},ke=[{key:`openai`,label:D(`presetOpenai`)},{key:`deepseek`,label:D(`presetDeepseek`)},{key:`glm`,label:D(`presetGlm`)},{key:`ollama`,label:D(`presetOllama`)},{key:`litellm`,label:D(`presetLitellm`)},{key:`custom`,label:D(`presetCustom`)}],A=()=>({modelId:``,contextWindow:w.contextWindow,maxTokens:w.maxTokens,reasoning:!0,supportsImages:!1,open:!1}),j=()=>({name:w.name,baseUrl:w.baseUrl,apiKey:``,headerRows:[],protocol:`openai-completions`,models:[A()]}),Ae=class extends _{providers=[];form=j();editingProviderId;formOpen=!1;loading=!0;apiKeyVisible=!1;advancedOpen=!1;activePreset=``;testing=!1;testResult=`idle`;testError=``;autoEditProviderName=null;async connectedCallback(){if(super.connectedCallback(),await this.loadProviders(),this.autoEditProviderName){let e=this.providers.find(e=>e.name===this.autoEditProviderName);e&&await this.openEditForm(e),this.autoEditProviderName=null}}getTabName(){return D(`customModels`)}async loadProviders(){this.loading=!0,this.requestUpdate();try{this.providers=await v().customProviders.getAll()}catch(e){b.error(`Failed to load custom providers:`,e),this.providers=[]}finally{this.loading=!1,this.requestUpdate()}}resetTestState(){this.testing=!1,this.testResult=`idle`,this.testError=``}openAddForm(){this.editingProviderId=void 0,this.form=j(),this.apiKeyVisible=!1,this.advancedOpen=!1,this.activePreset=``,this.resetTestState(),this.formOpen=!0,this.requestUpdate()}async openEditForm(e){let t=await v().providerKeys.get(e.name)??e.apiKey??``,n=e.models??[],r=n.length>0?n.map(e=>({modelId:e.id,contextWindow:e.contextWindow??w.contextWindow,maxTokens:e.maxTokens??w.maxTokens,reasoning:e.reasoning===!0,supportsImages:e.input?.includes(`image`)===!0,open:!1})):[A()],i=n[0]?.headers??{},a=Object.entries(i).map(([e,t])=>({key:e,value:String(t)}));this.editingProviderId=e.id,this.form={providerId:e.id,id:e.id,name:e.name,baseUrl:e.baseUrl,apiKey:t,headerRows:a,protocol:e.type===`anthropic-messages`?`anthropic-messages`:`openai-completions`,models:r},this.apiKeyVisible=!1,this.advancedOpen=a.length>0||e.type===`anthropic-messages`,this.activePreset=``,this.resetTestState(),this.formOpen=!0,this.requestUpdate()}closeForm(){this.formOpen=!1,this.editingProviderId=void 0,this.form=j(),this.apiKeyVisible=!1,this.advancedOpen=!1,this.activePreset=``,this.resetTestState(),this.requestUpdate()}toggleApiKeyVisibility(){this.apiKeyVisible=!this.apiKeyVisible,this.requestUpdate()}updateForm(e,t){this.form={...this.form,[e]:t},(e===`name`||e===`baseUrl`)&&(this.activePreset=``),this.resetTestState(),this.requestUpdate()}updateModelField(e,t,n){let r=this.form.models.map((r,i)=>i===e?{...r,[t]:n}:r);this.form={...this.form,models:r},t===`modelId`&&(this.activePreset=``,this.resetTestState()),this.requestUpdate()}addModelRow(){this.form={...this.form,models:[...this.form.models,A()]},this.requestUpdate()}removeModelRow(e){let t=this.form.models.filter((t,n)=>n!==e);this.form={...this.form,models:t},this.requestUpdate()}toggleModelExpanded(e){let t=this.form.models.map((t,n)=>n===e?{...t,open:!t.open}:t);this.form={...this.form,models:t},this.requestUpdate()}addHeaderRow(){this.form={...this.form,headerRows:[...this.form.headerRows,{key:``,value:``}]},this.requestUpdate()}updateHeaderRow(e,t,n){let r=this.form.headerRows.map((r,i)=>i===e?{...r,[t]:n}:r);this.form={...this.form,headerRows:r},this.requestUpdate()}removeHeaderRow(e){let t=this.form.headerRows.filter((t,n)=>n!==e);this.form={...this.form,headerRows:t},this.requestUpdate()}applyPreset(e){if(this.activePreset=e,e===`custom`)this.form={...this.form,name:``,baseUrl:``,protocol:`openai-completions`,models:[A()]};else{let t=Oe[e];this.form={...this.form,name:t.name,baseUrl:t.baseUrl,protocol:t.protocol,models:[{...A(),modelId:t.modelId,supportsImages:t.supportsImages===!0,open:!1}]}}this.resetTestState(),this.requestUpdate()}buildHeadersFromRows(){let e={};for(let t of this.form.headerRows){let n=t.key.trim(),r=t.value.trim();n&&r&&(e[n]=r)}return e}buildModel(e,t){let n=this.form.name.trim(),r=this.form.baseUrl.trim(),i=e.reasoning===!0,a=e.supportsImages===!0?[`text`,`image`]:[`text`],o=r.includes(`api.deepseek.com`);return Ce({id:e.modelId,name:`${e.modelId} (${n})`,api:this.form.protocol,provider:n,baseUrl:r.replace(/\/$/,``),reasoning:i,input:a,cost:{input:0,output:0,cacheRead:0,cacheWrite:0},contextWindow:Number(e.contextWindow)||w.contextWindow,maxTokens:Number(e.maxTokens)||w.maxTokens,headers:Object.keys(t).length>0?t:void 0,thinkingLevelMap:o&&i?{low:`high`,medium:`high`,high:`high`,xhigh:`max`}:void 0,compat:this.form.protocol===`openai-completions`?{supportsStore:!1,supportsDeveloperRole:!1,supportsReasoningEffort:i,supportsUsageInStreaming:!1,supportsStrictMode:!1,maxTokensField:`max_tokens`,...o&&i?{requiresReasoningContentOnAssistantMessages:!0,thinkingFormat:`deepseek`}:{}}:void 0})}async testConnection(){let e=this.form.baseUrl.trim(),t=this.form.models.find(e=>e.modelId.trim());if(!e||!t){this.testing=!1,this.testResult=`fail`,this.testError=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){C(D(`fillProviderBaseUrlModel`));return}let n=this.form.models.filter(e=>e.modelId.trim());if(n.length===0){C(D(`atLeastOneModel`));return}let r=n.map(e=>e.modelId.trim());if(new Set(r).size!==r.length){C(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??xe(),name:e,type:this.form.protocol,baseUrl:a[0].baseUrl,apiKey:o||void 0,models:a};try{let e=v();await e.customProviders.set(c),s&&s.name!==c.name&&await e.providerKeys.delete(s.name),o?await e.providerKeys.set(c.name,o):await e.providerKeys.delete(c.name),this.closeForm(),await this.loadProviders()}catch(e){b.error(`Failed to save custom model:`,e),C(D(`saveCustomModelFailed`))}}async deleteProvider(e){if(await S({description:D(`confirmDeleteProvider`,{name:e.name}),confirmLabel:D(`confirmDelete`),cancelLabel:D(`cancel`),variant:`destructive`}))try{let t=v();await t.customProviders.delete(e.id),await t.providerKeys.delete(e.name),await this.loadProviders()}catch(e){b.error(`Failed to delete custom provider:`,e),C(D(`deleteFailed`))}}renderProvider(e){let t=e.models??[],n=t.length,r=e.type===`anthropic-messages`?`Anthropic Messages`:`OpenAI Compatible`;return g`
|
|
3
3
|
<div class="quickforge-settings-list-item">
|
|
4
4
|
<div class="quickforge-settings-list-item-main">
|
|
5
5
|
<div class="flex min-w-0 items-start gap-3">
|
|
@@ -10,14 +10,14 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It 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?g`<span class="quickforge-settings-badge quickforge-settings-badge-warning">${D(`noModelAdded`)}</span>`:null}
|
|
14
14
|
</div>
|
|
15
|
-
${n>0?
|
|
15
|
+
${n>0?g`
|
|
16
16
|
<div class="quickforge-settings-meta">
|
|
17
|
-
${t.slice(0,6).map(e=>
|
|
17
|
+
${t.slice(0,6).map(e=>g`
|
|
18
18
|
<code class="quickforge-settings-command-name">${e.id}</code>
|
|
19
19
|
`)}
|
|
20
|
-
${t.length>6?
|
|
20
|
+
${t.length>6?g`<span class="quickforge-settings-badge quickforge-settings-badge-muted">+${t.length-6}</span>`:null}
|
|
21
21
|
</div>
|
|
22
22
|
`:null}
|
|
23
23
|
</div>
|
|
@@ -40,11 +40,11 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
|
|
|
40
40
|
</button>
|
|
41
41
|
</div>
|
|
42
42
|
</div>
|
|
43
|
-
`}renderPresetChips(){return
|
|
43
|
+
`}renderPresetChips(){return g`
|
|
44
44
|
<div class="quickforge-settings-form-row">
|
|
45
45
|
<span class="quickforge-settings-form-label">${D(`presets`)}</span>
|
|
46
46
|
<div class="quickforge-settings-segmented quickforge-settings-segmented-wrap">
|
|
47
|
-
${
|
|
47
|
+
${ke.map(e=>g`
|
|
48
48
|
<button
|
|
49
49
|
class="quickforge-settings-segmented-option ${this.activePreset===e.key?`quickforge-settings-segmented-option-active`:``}"
|
|
50
50
|
type="button"
|
|
@@ -55,7 +55,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
|
|
|
55
55
|
`)}
|
|
56
56
|
</div>
|
|
57
57
|
</div>
|
|
58
|
-
`}renderModelRow(e,t){let n=e.open===!0;return
|
|
58
|
+
`}renderModelRow(e,t){let n=e.open===!0;return g`
|
|
59
59
|
<div class="quickforge-settings-subrow quickforge-settings-row-align-start">
|
|
60
60
|
<button
|
|
61
61
|
class="quickforge-settings-icon-action"
|
|
@@ -73,7 +73,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
|
|
|
73
73
|
@input=${e=>this.updateModelField(t,`modelId`,e.target.value)}
|
|
74
74
|
placeholder=${D(`modelIdPlaceholder`)}
|
|
75
75
|
/>
|
|
76
|
-
${n?
|
|
76
|
+
${n?g`
|
|
77
77
|
<div class="quickforge-settings-model-grid mt-3">
|
|
78
78
|
<label class="quickforge-settings-form-row">
|
|
79
79
|
<span class="quickforge-settings-form-label">${D(`contextWindow`)}</span>
|
|
@@ -115,7 +115,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
|
|
|
115
115
|
</label>
|
|
116
116
|
`:null}
|
|
117
117
|
</div>
|
|
118
|
-
${this.form.models.length>1?
|
|
118
|
+
${this.form.models.length>1?g`
|
|
119
119
|
<button
|
|
120
120
|
class="quickforge-settings-icon-action quickforge-settings-icon-action-danger"
|
|
121
121
|
type="button"
|
|
@@ -126,15 +126,15 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
|
|
|
126
126
|
</button>
|
|
127
127
|
`:null}
|
|
128
128
|
</div>
|
|
129
|
-
`}renderHeadersEditor(){return
|
|
129
|
+
`}renderHeadersEditor(){return g`
|
|
130
130
|
<div class="quickforge-settings-form-row">
|
|
131
131
|
<span class="quickforge-settings-form-label">
|
|
132
132
|
${D(`customHeaders`)}
|
|
133
133
|
<quickforge-info-tip .label=${D(`customHeadersHelp`)}></quickforge-info-tip>
|
|
134
134
|
</span>
|
|
135
|
-
${this.form.headerRows.length===0?
|
|
135
|
+
${this.form.headerRows.length===0?g``:g`
|
|
136
136
|
<div class="quickforge-settings-nested-list">
|
|
137
|
-
${this.form.headerRows.map((e,t)=>
|
|
137
|
+
${this.form.headerRows.map((e,t)=>g`
|
|
138
138
|
<div class="quickforge-settings-subrow">
|
|
139
139
|
<input
|
|
140
140
|
class="quickforge-settings-input"
|
|
@@ -168,7 +168,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
|
|
|
168
168
|
+ ${D(`addHeader`)}
|
|
169
169
|
</button>
|
|
170
170
|
</div>
|
|
171
|
-
`}renderTestStatus(){return this.testResult===`idle`&&!this.testing?
|
|
171
|
+
`}renderTestStatus(){return this.testResult===`idle`&&!this.testing?g``:this.testing?g`<span class="quickforge-settings-status">${D(`testingConnection`)}</span>`:this.testResult===`ok`?g`<span class="quickforge-settings-badge quickforge-settings-badge-success">✓ ${D(`connectionOk`)}</span>`:g`<span class="quickforge-settings-alert">✗ ${this.testError||D(`connectionFailed`)}</span>`}renderForm(){return g`
|
|
172
172
|
<section class="quickforge-settings-section" aria-label=${this.editingProviderId?D(`editCustomModel`):D(`addCustomModel`)}>
|
|
173
173
|
<div class="quickforge-settings-toolbar">
|
|
174
174
|
<button
|
|
@@ -226,7 +226,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
|
|
|
226
226
|
aria-pressed=${this.apiKeyVisible?`true`:`false`}
|
|
227
227
|
@click=${()=>this.toggleApiKeyVisibility()}
|
|
228
228
|
>
|
|
229
|
-
${this.apiKeyVisible?
|
|
229
|
+
${this.apiKeyVisible?g`<svg class="size-4" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10.73 5.08A10.43 10.43 0 0 1 12 5c7 0 10 7 10 7a13.16 13.16 0 0 1-1.67 2.68"/><path d="M6.61 6.61A13.53 13.53 0 0 0 2 12s3 7 10 7a9.74 9.74 0 0 0 5.39-1.61"/><line x1="2" y1="2" x2="22" y2="22"/><path d="M8.53 8.53A5 5 0 0 0 12 17a5 5 0 0 0 3.47-8.53"/></svg>`:g`<svg class="size-4" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M2 12s3-7 10-7 10 7 10 7-3 7-10 7-10-7-10-7Z"/><circle cx="12" cy="12" r="3"/></svg>`}
|
|
230
230
|
</button>
|
|
231
231
|
</div>
|
|
232
232
|
</label>
|
|
@@ -257,7 +257,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
|
|
|
257
257
|
${D(`providerAdvanced`)}
|
|
258
258
|
</button>
|
|
259
259
|
|
|
260
|
-
${this.advancedOpen?
|
|
260
|
+
${this.advancedOpen?g`
|
|
261
261
|
<div class="quickforge-settings-form-grid rounded-lg border border-border p-3">
|
|
262
262
|
<label class="quickforge-settings-form-row">
|
|
263
263
|
<span class="quickforge-settings-form-label">
|
|
@@ -308,7 +308,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
|
|
|
308
308
|
</div>
|
|
309
309
|
</div>
|
|
310
310
|
</section>
|
|
311
|
-
`}render(){return this.formOpen?
|
|
311
|
+
`}render(){return this.formOpen?g`
|
|
312
312
|
<div class="quickforge-settings-stack">
|
|
313
313
|
<div class="quickforge-settings-heading">
|
|
314
314
|
<h3 class="quickforge-settings-title">
|
|
@@ -318,7 +318,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
|
|
|
318
318
|
</div>
|
|
319
319
|
${this.renderForm()}
|
|
320
320
|
</div>
|
|
321
|
-
`:
|
|
321
|
+
`:g`
|
|
322
322
|
<div class="quickforge-settings-stack">
|
|
323
323
|
<section class="quickforge-settings-section" aria-label=${D(`customModelsTitle`)}>
|
|
324
324
|
<div class="quickforge-settings-toolbar">
|
|
@@ -335,10 +335,10 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
|
|
|
335
335
|
</button>
|
|
336
336
|
</div>
|
|
337
337
|
|
|
338
|
-
${this.loading?
|
|
338
|
+
${this.loading?g`<div class="quickforge-settings-empty-row">${D(`loading`)}</div>`:this.providers.length===0?g`<div class="quickforge-settings-empty-row">${D(`noCustomModels`)}</div>`:this.providers.map(e=>this.renderProvider(e))}
|
|
339
339
|
</section>
|
|
340
340
|
</div>
|
|
341
|
-
`}},M=`quickforge-custom-providers-only-tab`;customElements.get(M)||customElements.define(M,
|
|
341
|
+
`}},M=`quickforge-custom-providers-only-tab`;customElements.get(M)||customElements.define(M,Ae);function je(e){let t=document.createElement(M);return e&&(t.autoEditProviderName=e),t}var Me=[{value:`light`,label:()=>D(`lightTheme`)},{value:`dark`,label:()=>D(`darkTheme`)}],Ne=class extends _{theme=le();interfaceFontSizePx=O.interfaceFontSizePx;messageFontSizePx=O.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=v(),[t,n]=await Promise.all([ce(e),ue(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 me(v(),{theme:e}),this.error=``,this.requestUpdate()}catch(e){this.error=e instanceof Error?e.message:D(`requestFailed`),this.requestUpdate()}}}currentFontSizeSettings(){return de({interfaceFontSizePx:this.interfaceFontSizePx,messageFontSizePx:this.messageFontSizePx})}previewFontSize(e){let t=de(e);this.interfaceFontSizePx=t.interfaceFontSizePx,this.messageFontSizePx=t.messageFontSizePx,pe(t),this.requestUpdate()}updateInterfaceFontSize(e){this.previewFontSize({...this.currentFontSizeSettings(),interfaceFontSizePx:Number(e)||O.interfaceFontSizePx})}updateMessageFontSize(e){this.previewFontSize({...this.currentFontSizeSettings(),messageFontSizePx:Number(e)||O.messageFontSizePx})}async saveFontSize(){try{await fe(v(),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 g`
|
|
342
342
|
<button
|
|
343
343
|
type="button"
|
|
344
344
|
class="quickforge-settings-segmented-option ${t?`quickforge-settings-segmented-option-active`:``}"
|
|
@@ -347,12 +347,12 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
|
|
|
347
347
|
>
|
|
348
348
|
${e.label()}
|
|
349
349
|
</button>
|
|
350
|
-
`}getFontSizeRangeProgress(e){return(e-
|
|
350
|
+
`}getFontSizeRangeProgress(e){return(e-x.min)/(x.max-x.min)*100}renderFontSizeSlider(e,t,n,r){return g`
|
|
351
351
|
<div class="quickforge-settings-row">
|
|
352
352
|
<div class="quickforge-settings-row-main">
|
|
353
353
|
<div class="quickforge-settings-row-title">
|
|
354
354
|
${e}
|
|
355
|
-
${t?
|
|
355
|
+
${t?g`<quickforge-info-tip .label=${t}></quickforge-info-tip>`:null}
|
|
356
356
|
</div>
|
|
357
357
|
<div class="quickforge-settings-row-description">${D(`fontSizeRangeDescription`)}</div>
|
|
358
358
|
</div>
|
|
@@ -362,8 +362,8 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
|
|
|
362
362
|
class="quickforge-font-size-slider"
|
|
363
363
|
style=${`--quickforge-font-size-slider-progress: ${this.getFontSizeRangeProgress(n)}%`}
|
|
364
364
|
type="range"
|
|
365
|
-
min=${String(
|
|
366
|
-
max=${String(
|
|
365
|
+
min=${String(x.min)}
|
|
366
|
+
max=${String(x.max)}
|
|
367
367
|
step="1"
|
|
368
368
|
.value=${String(n)}
|
|
369
369
|
@input=${e=>r(e.target.value)}
|
|
@@ -371,7 +371,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
|
|
|
371
371
|
/>
|
|
372
372
|
</div>
|
|
373
373
|
</div>
|
|
374
|
-
`}render(){return this.loading?
|
|
374
|
+
`}render(){return this.loading?g`<div class="text-sm text-muted-foreground">${D(`loading`)}</div>`:g`
|
|
375
375
|
<div class="quickforge-settings-stack">
|
|
376
376
|
<section class="quickforge-settings-section" aria-label=${D(`appearance`)}>
|
|
377
377
|
<div class="quickforge-settings-row">
|
|
@@ -384,7 +384,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
|
|
|
384
384
|
</div>
|
|
385
385
|
<div class="quickforge-settings-row-control">
|
|
386
386
|
<div class="quickforge-settings-segmented" role="group" aria-label=${D(`theme`)}>
|
|
387
|
-
${
|
|
387
|
+
${Me.map(e=>this.renderThemeOption(e))}
|
|
388
388
|
</div>
|
|
389
389
|
</div>
|
|
390
390
|
</div>
|
|
@@ -394,32 +394,32 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
|
|
|
394
394
|
${this.renderFontSizeSlider(D(`messageFontSize`),D(`messageFontSizeNote`),this.messageFontSizePx,e=>this.updateMessageFontSize(e))}
|
|
395
395
|
</section>
|
|
396
396
|
|
|
397
|
-
${this.error?
|
|
397
|
+
${this.error?g`<span class="quickforge-settings-error">${this.error}</span>`:null}
|
|
398
398
|
</div>
|
|
399
|
-
`}},N=`quickforge-appearance-settings-tab`;customElements.get(N)||customElements.define(N,
|
|
399
|
+
`}},N=`quickforge-appearance-settings-tab`;customElements.get(N)||customElements.define(N,Ne);function Pe(){return document.createElement(N)}var Fe=`auto-compact-settings`,P={enabled:!0,thresholdPercent:80,keepRecentTurns:3,minSourceChars:1600,requireConfirmation:!0};function F(e,t,n,r){let i=Number(e);return Number.isFinite(i)?Math.min(r,Math.max(n,Math.round(i))):t}function Ie(e){if(!e||typeof e!=`object`)return{...P};let t=e;return{enabled:t.enabled!==!1,thresholdPercent:F(t.thresholdPercent,P.thresholdPercent,50,95),keepRecentTurns:F(t.keepRecentTurns,P.keepRecentTurns,1,20),minSourceChars:F(t.minSourceChars,P.minSourceChars,0,2e5),requireConfirmation:t.requireConfirmation!==!1}}async function Le(e){return Ie(await e.settings.get(Fe))}async function Re(e,t){await e.settings.set(Fe,Ie(t))}var ze=[{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`)}];function Be(e){return(e??``).trim().replace(/\/$/,``)}function I(e){return JSON.stringify([e.provider,e.id,e.api,Be(e.baseUrl)])}function Ve(e){return`${e.provider} / ${e.id}`}function He(){return`custom_${globalThis.crypto?.randomUUID?.().slice(0,8)||Date.now().toString(36)}`}function Ue(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 We=g`
|
|
400
400
|
<svg class="size-3.5" viewBox="0 0 16 16" fill="none" aria-hidden="true">
|
|
401
401
|
<path d="M3.5 8.2 6.6 11.3 12.7 4.7" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" />
|
|
402
402
|
</svg>
|
|
403
|
-
`,
|
|
403
|
+
`,Ge=g`
|
|
404
404
|
<svg class="size-3.5" viewBox="0 0 16 16" fill="none" aria-hidden="true">
|
|
405
405
|
<circle cx="8" cy="8" r="4.8" stroke="currentColor" stroke-width="1.5" />
|
|
406
406
|
</svg>
|
|
407
|
-
`,
|
|
407
|
+
`,Ke=g`
|
|
408
408
|
<svg class="size-3.5" viewBox="0 0 16 16" fill="none" aria-hidden="true">
|
|
409
409
|
<path d="M4.5 4.5 11.5 11.5M11.5 4.5 4.5 11.5" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" />
|
|
410
410
|
</svg>
|
|
411
|
-
`,
|
|
411
|
+
`,qe=class extends _{models=[];selectedModel;thinkingLevel=`off`;showToolDetails=!1;expandToolsByDefault=!1;autoCompactEnabled=!0;autoCompactRequireConfirmation=!0;autoCompactThresholdPercent=80;autoCompactThresholdPercentInput=`80`;autoCompactKeepRecentTurns=3;selectedLanguage=Se();loading=!0;saved=!1;savedMessage=``;error=``;terminalShellConfig={terminalShell:`auto`,defaultProfileId:`auto`,profiles:[]};customShellCommand=``;getTabName(){return D(`defaultOptions`)}async connectedCallback(){super.connectedCallback(),await this.loadSettings()}updated(){this.syncSelectValues()}syncSelectValues(){let e=this.querySelector(`[data-default-model-select]`);e&&this.selectedModel&&(e.value=I(this.selectedModel));let t=this.querySelector(`[data-default-thinking-select]`);t&&(t.value=this.thinkingLevel);let n=this.querySelector(`[data-language-select]`);n&&(n.value=this.selectedLanguage)}async loadSettings(){this.loading=!0,this.error=``,this.requestUpdate();try{let e=v(),[t,n,r,i]=await Promise.all([ae(e),we(e),De(e),Le(e)]);this.models=t,this.selectedModel=n.model?t.find(e=>I(e)===I(n.model))??n.model:t[0],this.thinkingLevel=n.thinkingLevel??he(this.selectedModel),this.showToolDetails=r.showToolDetails,this.expandToolsByDefault=r.expandToolsByDefault,this.autoCompactEnabled=i.enabled,this.autoCompactRequireConfirmation=i.requireConfirmation,this.autoCompactThresholdPercent=i.thresholdPercent,this.autoCompactThresholdPercentInput=String(i.thresholdPercent),this.autoCompactKeepRecentTurns=i.keepRecentTurns,await this.loadTerminalShell()}catch(e){this.error=e instanceof Error?e.message:D(`requestFailed`)}finally{this.loading=!1,this.requestUpdate()}}updateModel(e){let t=this.models.find(t=>I(t)===e);this.selectedModel=t,this.thinkingLevel=he(t),this.saved=!1,this.requestUpdate(),this.saveDefaultModelOptions()}updateThinkingLevel(e){this.thinkingLevel=ze.some(t=>t.value===e)?e:`off`,this.saved=!1,this.requestUpdate(),this.saveDefaultModelOptions()}updateLanguage(e){this.selectedLanguage=e===`zh`?`zh`:`en`,this.requestUpdate(),this.applyLanguage()}async applyLanguage(){await ve(v(),this.selectedLanguage)}updateShowToolDetails(e){this.showToolDetails=e,this.saved=!1,this.requestUpdate(),this.saveToolDisplayOptions()}updateExpandToolsByDefault(e){this.expandToolsByDefault=e,this.saved=!1,this.requestUpdate(),this.saveToolDisplayOptions()}updateAutoCompactEnabled(e){this.autoCompactEnabled=e,this.saved=!1,this.requestUpdate(),this.saveAutoCompactOptions()}updateAutoCompactRequireConfirmation(e){this.autoCompactRequireConfirmation=e,this.saved=!1,this.requestUpdate(),this.saveAutoCompactOptions()}updateAutoCompactThresholdPercent(e){this.autoCompactThresholdPercentInput=e;let t=Number(e);e!==``&&Number.isFinite(t)&&(this.autoCompactThresholdPercent=t),this.saved=!1,this.requestUpdate()}updateAutoCompactKeepRecentTurns(e){this.autoCompactKeepRecentTurns=Number(e)||3,this.saved=!1,this.requestUpdate()}commitAutoCompactThresholdPercent(){let e=Number(this.autoCompactThresholdPercentInput);if(!Number.isFinite(e)){this.autoCompactThresholdPercentInput=String(this.autoCompactThresholdPercent),this.requestUpdate();return}let t=Math.max(50,Math.min(95,Math.round(e)));this.autoCompactThresholdPercent=t,this.autoCompactThresholdPercentInput=String(t),this.requestUpdate(),this.saveAutoCompactOptions()}commitAutoCompactKeepRecentTurns(){let e=Math.max(1,Math.min(20,Math.round(this.autoCompactKeepRecentTurns||3)));this.autoCompactKeepRecentTurns=e,this.requestUpdate(),this.saveAutoCompactOptions()}markSaved(e=D(`defaultOptionsSaved`)){this.saved=!0,this.savedMessage=e,this.error=``,this.requestUpdate()}customShellProfiles(){return this.terminalShellConfig.profiles.filter(e=>!e.builtin)}async loadTerminalShell(){try{let e=await fetch(`/api/system/terminal-shell`,{cache:`no-store`}),t=await e.json().catch(()=>null);if(!e.ok)throw Error(t?.error||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=[...this.customShellProfiles(),{id:He(),name:Ue(e),command:e,builtin:!1}];this.customShellCommand=``,await this.saveTerminalShellConfig(this.terminalShellConfig.defaultProfileId,t,D(`terminalShellProfilesSaved`))}async deleteCustomTerminalShell(e){let t=this.terminalShellConfig.profiles.find(t=>t.id===e);if(!t||t.builtin||!await S({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(){try{let e=this.selectedModel?.reasoning?this.thinkingLevel:`off`;await ye(v(),{model:this.selectedModel,thinkingLevel:e}),this.markSaved()}catch(e){this.error=e instanceof Error?e.message:D(`requestFailed`),this.requestUpdate()}}async saveToolDisplayOptions(){try{await oe(v(),{showToolDetails:this.showToolDetails,expandToolsByDefault:this.expandToolsByDefault}),this.markSaved()}catch(e){this.error=e instanceof Error?e.message:D(`requestFailed`),this.requestUpdate()}}async saveAutoCompactOptions(){try{await Re(v(),{enabled:this.autoCompactEnabled,thresholdPercent:this.autoCompactThresholdPercent,keepRecentTurns:this.autoCompactKeepRecentTurns,minSourceChars:1600,requireConfirmation:this.autoCompactRequireConfirmation}),this.markSaved()}catch(e){this.error=e instanceof Error?e.message:D(`requestFailed`),this.requestUpdate()}}modelOptions(){if(!this.selectedModel)return this.models;let e=I(this.selectedModel);return this.models.some(t=>I(t)===e)?this.models:[this.selectedModel,...this.models]}shellProfileRow(e,t=!1){let n=e.id===this.terminalShellConfig.defaultProfileId||this.terminalShellConfig.defaultProfileId===`auto`&&t;return g`
|
|
412
412
|
<div class="quickforge-settings-subrow">
|
|
413
413
|
<div class="quickforge-settings-row-main">
|
|
414
414
|
<div class="quickforge-settings-row-title">${e.name}</div>
|
|
415
415
|
<div class="quickforge-settings-row-description quickforge-settings-mono" title=${e.command}>${e.command}</div>
|
|
416
416
|
</div>
|
|
417
417
|
<div class="quickforge-settings-row-control quickforge-settings-icon-actions">
|
|
418
|
-
${n?
|
|
418
|
+
${n?g`
|
|
419
419
|
<span class="quickforge-settings-icon-action quickforge-settings-icon-action-success" title=${D(`terminalShellDefaultBadge`)} aria-label=${D(`terminalShellDefaultBadge`)}>
|
|
420
|
-
${
|
|
420
|
+
${We}
|
|
421
421
|
</span>
|
|
422
|
-
`:
|
|
422
|
+
`:g`
|
|
423
423
|
<button
|
|
424
424
|
class="quickforge-settings-icon-action"
|
|
425
425
|
type="button"
|
|
@@ -427,10 +427,10 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
|
|
|
427
427
|
aria-label=${D(`terminalShellSetDefault`)}
|
|
428
428
|
@click=${()=>this.saveTerminalShellConfig(e.id)}
|
|
429
429
|
>
|
|
430
|
-
${
|
|
430
|
+
${Ge}
|
|
431
431
|
</button>
|
|
432
432
|
`}
|
|
433
|
-
${e.builtin?null:
|
|
433
|
+
${e.builtin?null:g`
|
|
434
434
|
<button
|
|
435
435
|
class="quickforge-settings-icon-action quickforge-settings-icon-action-danger"
|
|
436
436
|
type="button"
|
|
@@ -438,12 +438,12 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
|
|
|
438
438
|
aria-label=${D(`delete`)}
|
|
439
439
|
@click=${()=>this.deleteCustomTerminalShell(e.id)}
|
|
440
440
|
>
|
|
441
|
-
${
|
|
441
|
+
${Ke}
|
|
442
442
|
</button>
|
|
443
443
|
`}
|
|
444
444
|
</div>
|
|
445
445
|
</div>
|
|
446
|
-
`}terminalShellSettings(){let e=this.terminalShellConfig.profiles;return
|
|
446
|
+
`}terminalShellSettings(){let e=this.terminalShellConfig.profiles;return g`
|
|
447
447
|
<section class="quickforge-settings-section" aria-label=${D(`terminalShell`)}>
|
|
448
448
|
<div class="quickforge-settings-row quickforge-settings-row-top">
|
|
449
449
|
<div class="quickforge-settings-row-main">
|
|
@@ -456,7 +456,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
|
|
|
456
456
|
</div>
|
|
457
457
|
|
|
458
458
|
<div class="quickforge-settings-nested-list">
|
|
459
|
-
${e.length>0?e.map((e,t)=>this.shellProfileRow(e,t===0)):
|
|
459
|
+
${e.length>0?e.map((e,t)=>this.shellProfileRow(e,t===0)):g`<div class="quickforge-settings-empty-row">${D(`terminalShellNoDetected`)}</div>`}
|
|
460
460
|
</div>
|
|
461
461
|
|
|
462
462
|
<div class="quickforge-settings-row">
|
|
@@ -484,7 +484,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
|
|
|
484
484
|
</div>
|
|
485
485
|
</div>
|
|
486
486
|
</section>
|
|
487
|
-
`}renderSwitch(e,t,n=!1){return
|
|
487
|
+
`}renderSwitch(e,t,n=!1){return g`
|
|
488
488
|
<label class="quickforge-settings-switch" aria-disabled=${n?`true`:`false`}>
|
|
489
489
|
<input
|
|
490
490
|
type="checkbox"
|
|
@@ -494,7 +494,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
|
|
|
494
494
|
/>
|
|
495
495
|
<span aria-hidden="true"></span>
|
|
496
496
|
</label>
|
|
497
|
-
`}render(){return this.loading?
|
|
497
|
+
`}render(){return this.loading?g`<div class="text-sm text-muted-foreground">${D(`loading`)}</div>`:g`
|
|
498
498
|
<div class="quickforge-settings-stack">
|
|
499
499
|
<section class="quickforge-settings-section" aria-label=${D(`defaultOptions`)}>
|
|
500
500
|
<div class="quickforge-settings-row">
|
|
@@ -530,8 +530,8 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
|
|
|
530
530
|
.value=${this.selectedModel?I(this.selectedModel):``}
|
|
531
531
|
@change=${e=>this.updateModel(e.target.value)}
|
|
532
532
|
>
|
|
533
|
-
${this.modelOptions().length===0?
|
|
534
|
-
<option .value=${I(e)}>${
|
|
533
|
+
${this.modelOptions().length===0?g`<option value="">${D(`noModelAvailable`)}</option>`:this.modelOptions().map(e=>g`
|
|
534
|
+
<option .value=${I(e)}>${Ve(e)}</option>
|
|
535
535
|
`)}
|
|
536
536
|
</select>
|
|
537
537
|
</div>
|
|
@@ -552,7 +552,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
|
|
|
552
552
|
?disabled=${!this.selectedModel?.reasoning}
|
|
553
553
|
@change=${e=>this.updateThinkingLevel(e.target.value)}
|
|
554
554
|
>
|
|
555
|
-
${
|
|
555
|
+
${ze.map(e=>g`
|
|
556
556
|
<option .value=${e.value}>${e.label()}</option>
|
|
557
557
|
`)}
|
|
558
558
|
</select>
|
|
@@ -653,10 +653,80 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
|
|
|
653
653
|
|
|
654
654
|
${this.terminalShellSettings()}
|
|
655
655
|
|
|
656
|
-
${this.saved?
|
|
657
|
-
${this.error?
|
|
656
|
+
${this.saved?g`<div class="quickforge-settings-message">${this.savedMessage||D(`defaultOptionsSaved`)}</div>`:null}
|
|
657
|
+
${this.error?g`<div class="quickforge-settings-alert">${this.error}</div>`:null}
|
|
658
|
+
</div>
|
|
659
|
+
`}},L=`quickforge-default-options-settings-tab`;customElements.get(L)||customElements.define(L,qe);function Je(){return document.createElement(L)}var Ye=`memory-settings`,Xe={enabled:!0};function Ze(e){return!e||typeof e!=`object`?{...Xe}:{enabled:e.enabled!==!1}}async function Qe(e){return Ze(await e.settings.get(Ye))}async function $e(e,t){await e.settings.set(Ye,Ze(t))}var et=class extends _{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([Qe(v()),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 $e(v(),{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 g`
|
|
660
|
+
<label class="quickforge-settings-switch" aria-disabled=${this.saving?`true`:`false`}>
|
|
661
|
+
<input
|
|
662
|
+
type="checkbox"
|
|
663
|
+
.checked=${this.enabled}
|
|
664
|
+
?disabled=${this.saving}
|
|
665
|
+
@change=${e=>void this.updateEnabled(e.target.checked)}
|
|
666
|
+
/>
|
|
667
|
+
<span aria-hidden="true"></span>
|
|
668
|
+
</label>
|
|
669
|
+
`}render(){if(this.loading)return g`<div class="text-sm text-muted-foreground">${D(`loading`)}</div>`;let e=this.markdown!==this.savedMarkdown,t=this.saving||this.loadingDocument;return g`
|
|
670
|
+
<div class="quickforge-settings-stack">
|
|
671
|
+
<section class="quickforge-settings-section" aria-label=${D(`memory`)}>
|
|
672
|
+
<div class="quickforge-settings-row">
|
|
673
|
+
<div class="quickforge-settings-row-main">
|
|
674
|
+
<div class="quickforge-settings-row-title">
|
|
675
|
+
${D(`globalMemory`)}
|
|
676
|
+
<quickforge-info-tip .label=${D(`globalMemoryInfo`)}></quickforge-info-tip>
|
|
677
|
+
</div>
|
|
678
|
+
<div class="quickforge-settings-row-description">${D(`globalMemoryDescription`)}</div>
|
|
679
|
+
</div>
|
|
680
|
+
<div class="quickforge-settings-row-control">${this.renderSwitch()}</div>
|
|
681
|
+
</div>
|
|
682
|
+
|
|
683
|
+
<div class="quickforge-settings-row">
|
|
684
|
+
<div class="quickforge-settings-row-main">
|
|
685
|
+
<div class="quickforge-settings-row-title">${D(`memoryFile`)}</div>
|
|
686
|
+
<div class="quickforge-settings-row-description">${D(`memoryFileDescription`)}</div>
|
|
687
|
+
</div>
|
|
688
|
+
<div class="quickforge-settings-row-control quickforge-settings-row-control-wide">
|
|
689
|
+
<code class="text-xs text-muted-foreground">${this.memoryPath}</code>
|
|
690
|
+
</div>
|
|
691
|
+
</div>
|
|
692
|
+
|
|
693
|
+
<div class="quickforge-settings-row quickforge-settings-row-align-start quickforge-memory-content-row">
|
|
694
|
+
<div class="quickforge-settings-row-main">
|
|
695
|
+
<div class="quickforge-settings-row-title">${D(`memoryContent`)}</div>
|
|
696
|
+
<div class="quickforge-settings-row-description">${this.enabled?D(`memoryContentDescription`):D(`memoryContentDisabledDescription`)}</div>
|
|
697
|
+
</div>
|
|
698
|
+
<div class="quickforge-memory-editor-control">
|
|
699
|
+
<textarea
|
|
700
|
+
class="quickforge-settings-textarea quickforge-settings-mono quickforge-memory-editor"
|
|
701
|
+
.value=${this.markdown}
|
|
702
|
+
?disabled=${!this.enabled||t}
|
|
703
|
+
spellcheck="false"
|
|
704
|
+
@input=${e=>{this.markdown=e.target.value,this.message=``,this.requestUpdate()}}
|
|
705
|
+
></textarea>
|
|
706
|
+
<div class="quickforge-memory-editor-actions">
|
|
707
|
+
<button
|
|
708
|
+
class="quickforge-settings-button quickforge-settings-button-secondary"
|
|
709
|
+
type="button"
|
|
710
|
+
?disabled=${t}
|
|
711
|
+
@click=${()=>void this.reloadDocument()}
|
|
712
|
+
>${this.loadingDocument?D(`loading`):D(`memoryReload`)}</button>
|
|
713
|
+
<button
|
|
714
|
+
class="quickforge-settings-button quickforge-settings-button-primary"
|
|
715
|
+
type="button"
|
|
716
|
+
?disabled=${!this.enabled||t||!e}
|
|
717
|
+
@click=${()=>void this.saveDocument()}
|
|
718
|
+
>${this.saving?D(`saving`):D(`memorySave`)}</button>
|
|
719
|
+
</div>
|
|
720
|
+
</div>
|
|
721
|
+
</div>
|
|
722
|
+
|
|
723
|
+
<div class="quickforge-settings-note">${D(`memoryCurrentSessionNote`)}</div>
|
|
724
|
+
</section>
|
|
725
|
+
|
|
726
|
+
${this.message?g`<div class="quickforge-settings-message">${this.message}</div>`:null}
|
|
727
|
+
${this.error?g`<div class="quickforge-settings-alert">${this.error}</div>`:null}
|
|
658
728
|
</div>
|
|
659
|
-
`}},
|
|
729
|
+
`}},R=`quickforge-memory-settings-tab`;customElements.get(R)||customElements.define(R,et);function tt(){return document.createElement(R)}var nt=`quickforge-backup`,z=[{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:`projects`,countKey:`projects`,label:()=>D(`restoreProjects`),description:()=>D(`restoreProjectsDescription`)},{id:`scheduledTasks`,countKey:`scheduledTasks`,label:()=>D(`restoreScheduledTasks`),description:()=>D(`restoreScheduledTasksDescription`)}],rt=z;function it(e,t){let n=new Blob([`${JSON.stringify(t,null,2)}\n`],{type:`application/json`}),r=URL.createObjectURL(n),i=document.createElement(`a`);i.href=r,i.download=e,document.body.appendChild(i),i.click(),i.remove(),URL.revokeObjectURL(r)}function at(){return new Date().toISOString().replace(/[:.]/g,`-`)}function ot(e){return e?Object.entries(e).map(([e,t])=>`${e}: ${t}`).join(`, `):``}function st(e){return rt.filter(t=>(e.sections?.[t.countKey]??0)>0)}function ct(e){return st(e).map(e=>e.id)}function lt(e){return e instanceof RangeError||e instanceof Error&&e.message.includes(`Invalid string length`)}function B(e,t){return lt(e)?D(`backupStringTooLarge`):e instanceof Error?e.message:t}var ut=class extends _{exportSections=new Set(z.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`));it(`${nt}-settings-${at()}.json`,n),this.message=D(`backupExported`)}catch(e){this.error=B(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(ct(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=B(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 S({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=ot(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=B(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 g`
|
|
660
730
|
<label class="quickforge-settings-switch" aria-disabled=${n?`true`:`false`}>
|
|
661
731
|
<input
|
|
662
732
|
type="checkbox"
|
|
@@ -666,7 +736,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
|
|
|
666
736
|
/>
|
|
667
737
|
<span aria-hidden="true"></span>
|
|
668
738
|
</label>
|
|
669
|
-
`}renderPendingImport(){if(!this.pendingImport)return null;let{inspect:e,selectedSections:t}=this.pendingImport,n
|
|
739
|
+
`}renderPendingImport(){if(!this.pendingImport)return null;let{inspect:e,selectedSections:t}=this.pendingImport,n=st(e);return g`
|
|
670
740
|
<section class="quickforge-settings-section" aria-label=${D(`backupInspectTitle`)}>
|
|
671
741
|
<div class="quickforge-settings-row quickforge-settings-row-top">
|
|
672
742
|
<div class="quickforge-settings-row-main">
|
|
@@ -702,16 +772,16 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
|
|
|
702
772
|
</div>
|
|
703
773
|
</div>
|
|
704
774
|
|
|
705
|
-
${e.warnings?.length?
|
|
775
|
+
${e.warnings?.length?g`
|
|
706
776
|
<div class="quickforge-settings-warning quickforge-settings-warning-attached">
|
|
707
|
-
${e.warnings.map(e=>
|
|
777
|
+
${e.warnings.map(e=>g`<div>⚠ ${e}</div>`)}
|
|
708
778
|
</div>
|
|
709
779
|
`:null}
|
|
710
780
|
|
|
711
|
-
${e.invalidSections&&Object.keys(e.invalidSections).length?
|
|
781
|
+
${e.invalidSections&&Object.keys(e.invalidSections).length?g`
|
|
712
782
|
<div class="quickforge-settings-warning quickforge-settings-warning-attached">
|
|
713
783
|
<div>${D(`backupInvalidSections`)}</div>
|
|
714
|
-
${Object.entries(e.invalidSections).map(([e,t])=>
|
|
784
|
+
${Object.entries(e.invalidSections).map(([e,t])=>g`<div>${e}: ${t}</div>`)}
|
|
715
785
|
</div>
|
|
716
786
|
`:null}
|
|
717
787
|
|
|
@@ -751,7 +821,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
|
|
|
751
821
|
</div>
|
|
752
822
|
</div>
|
|
753
823
|
<div class="quickforge-settings-nested-list">
|
|
754
|
-
${n.map(n=>
|
|
824
|
+
${n.map(n=>g`
|
|
755
825
|
<div class="quickforge-settings-subrow">
|
|
756
826
|
<div class="quickforge-settings-row-main">
|
|
757
827
|
<div class="quickforge-settings-row-title">${n.label()} (${e.sections?.[n.countKey]??0})</div>
|
|
@@ -789,7 +859,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
|
|
|
789
859
|
</div>
|
|
790
860
|
</div>
|
|
791
861
|
</section>
|
|
792
|
-
`}render(){return
|
|
862
|
+
`}render(){return g`
|
|
793
863
|
<div class="quickforge-settings-stack">
|
|
794
864
|
<section class="quickforge-settings-section" aria-label=${D(`exportData`)}>
|
|
795
865
|
<div class="quickforge-settings-row quickforge-settings-row-top">
|
|
@@ -803,7 +873,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
|
|
|
803
873
|
</div>
|
|
804
874
|
|
|
805
875
|
<div class="quickforge-settings-nested-list">
|
|
806
|
-
${
|
|
876
|
+
${z.map(e=>g`
|
|
807
877
|
<div class="quickforge-settings-subrow">
|
|
808
878
|
<div class="quickforge-settings-row-main">
|
|
809
879
|
<div class="quickforge-settings-row-title">${e.label()}</div>
|
|
@@ -861,17 +931,17 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
|
|
|
861
931
|
</section>
|
|
862
932
|
|
|
863
933
|
${this.renderPendingImport()}
|
|
864
|
-
${this.message?
|
|
865
|
-
${this.safetyBackupPath?
|
|
866
|
-
${this.error?
|
|
934
|
+
${this.message?g`<div class="quickforge-settings-message">${this.message}</div>`:null}
|
|
935
|
+
${this.safetyBackupPath?g`<div class="quickforge-settings-note">${D(`backupSafetyBackupPath`)}: <code>${this.safetyBackupPath}</code></div>`:null}
|
|
936
|
+
${this.error?g`<div class="quickforge-settings-alert">${this.error}</div>`:null}
|
|
867
937
|
</div>
|
|
868
|
-
`}},
|
|
938
|
+
`}},V=`quickforge-backup-settings-tab`;customElements.get(V)||customElements.define(V,ut);function dt(){return document.createElement(V)}function ft(e){if(!e)return`-`;let t=new Date(e);return Number.isNaN(t.getTime())?e:t.toLocaleString(be())}function pt(e){let t={...e};return delete t.archivedAt,t}function H(){if(!(typeof BroadcastChannel>`u`))try{let e=new BroadcastChannel(`quickforge-sync`);e.postMessage({type:`sessions-changed`,sourceTabId:`archived-conversations-settings-tab`,timestamp:Date.now()}),e.close()}catch{}}var mt=class extends _{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`${T(t.title)} ${n}`.toLowerCase().includes(e)})}groupedSessions(){let e=new Map;for(let t of this.filteredSessions()){let n=t.scope===`project`&&t.projectId?t.projectId:`global`;e.set(n,[...e.get(n)??[],t])}return[...e.entries()]}projectLabel(e){return e===`global`?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=v(),n=await t.sessions.get(e),r=await t.sessions.getMetadata(e);if(!n||!r)throw Error(D(`sessionNotFound`));await t.sessions.save(pt(n),pt(r)),this.sessions=this.sessions.filter(t=>t.id!==e),this.message=D(`sessionRestored`),H()}catch(e){this.error=e instanceof Error?e.message:D(`restoreSessionFailed`)}finally{this.busySessionId=``,this.requestUpdate()}}}async deleteSession(e){if(!this.busySessionId&&await S({description:D(`deleteArchivedSessionConfirm`,{title:T(e.title)}),confirmLabel:D(`confirmDelete`),cancelLabel:D(`cancel`),variant:`destructive`})){this.busySessionId=e.id,this.message=``,this.error=``,this.requestUpdate();try{await v().sessions.delete(e.id),this.sessions=this.sessions.filter(t=>t.id!==e.id),this.message=D(`archivedSessionDeleted`),H()}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 S({description:D(`deleteAllArchivedSessionsConfirm`),confirmLabel:D(`confirmDelete`),cancelLabel:D(`cancel`),variant:`destructive`})){this.busySessionId=`__all__`,this.message=``,this.error=``,this.requestUpdate();try{let e=v();await Promise.all(this.sessions.map(t=>e.sessions.delete(t.id))),this.sessions=[],this.message=D(`archivedSessionsDeleted`),H()}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 g`
|
|
869
939
|
<div class="border-t border-border px-4 py-3 first:border-t-0">
|
|
870
940
|
<div class="flex items-start justify-between gap-3">
|
|
871
941
|
<div class="min-w-0">
|
|
872
|
-
<div class="truncate text-sm font-medium text-foreground">${
|
|
942
|
+
<div class="truncate text-sm font-medium text-foreground">${T(e.title)}</div>
|
|
873
943
|
<div class="mt-1 text-xs text-muted-foreground">
|
|
874
|
-
${D(`lastModified`)}: ${
|
|
944
|
+
${D(`lastModified`)}: ${ft(e.lastModified)} · ${D(`archivedAt`)}: ${ft(e.archivedAt)}
|
|
875
945
|
</div>
|
|
876
946
|
</div>
|
|
877
947
|
<div class="flex shrink-0 items-center gap-2">
|
|
@@ -894,7 +964,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
|
|
|
894
964
|
</div>
|
|
895
965
|
</div>
|
|
896
966
|
</div>
|
|
897
|
-
`}render(){let e=this.groupedSessions();return
|
|
967
|
+
`}render(){let e=this.groupedSessions();return g`
|
|
898
968
|
<div class="flex flex-col gap-4">
|
|
899
969
|
<div class="flex justify-end">
|
|
900
970
|
<button
|
|
@@ -923,17 +993,17 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
|
|
|
923
993
|
>
|
|
924
994
|
<option value="all">${D(`allProjects`)}</option>
|
|
925
995
|
<option value="global">${D(`normalChat`)}</option>
|
|
926
|
-
${this.projects.map(e=>
|
|
996
|
+
${this.projects.map(e=>g`<option value=${e.id}>${e.name}</option>`)}
|
|
927
997
|
</select>
|
|
928
998
|
</div>
|
|
929
999
|
|
|
930
|
-
${this.loading?
|
|
1000
|
+
${this.loading?g`
|
|
931
1001
|
<div class="px-4 py-8 text-center text-sm text-muted-foreground">${D(`loading`)}</div>
|
|
932
|
-
`:e.length===0?
|
|
1002
|
+
`:e.length===0?g`
|
|
933
1003
|
<div class="px-4 py-8 text-center text-sm text-muted-foreground">${D(`noArchivedConversations`)}</div>
|
|
934
|
-
`:
|
|
1004
|
+
`:g`
|
|
935
1005
|
<div>
|
|
936
|
-
${e.map(([e,t])=>
|
|
1006
|
+
${e.map(([e,t])=>g`
|
|
937
1007
|
<div class="border-b border-border last:border-b-0">
|
|
938
1008
|
<div class="flex items-center justify-between gap-3 bg-muted/20 px-4 py-2 text-sm text-muted-foreground">
|
|
939
1009
|
<div class="truncate">${this.projectLabel(e)}</div>
|
|
@@ -946,10 +1016,10 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
|
|
|
946
1016
|
`}
|
|
947
1017
|
</section>
|
|
948
1018
|
|
|
949
|
-
${this.message?
|
|
950
|
-
${this.error?
|
|
1019
|
+
${this.message?g`<div class="rounded-md border border-emerald-500/30 bg-emerald-500/10 px-3 py-2 text-sm text-emerald-700 dark:text-emerald-300">${this.message}</div>`:null}
|
|
1020
|
+
${this.error?g`<div class="rounded-md border border-destructive/30 bg-destructive/10 px-3 py-2 text-sm text-destructive">${this.error}</div>`:null}
|
|
951
1021
|
</div>
|
|
952
|
-
`}},
|
|
1022
|
+
`}},U=`quickforge-archived-conversations-settings-tab`;customElements.get(U)||customElements.define(U,mt);function ht(){return document.createElement(U)}function gt(){return Array.from({length:16},()=>`ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz23456789!@#$%^&*`[Math.floor(Math.random()*65)]).join(``)}var _t=class extends _{loading=!0;saving=!1;enabled=!1;hasPassword=!1;password=``;sessionTtlHours=12;activeTokenCount=0;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.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()}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 S({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.message=D(`lanAccessSaved`)}catch(e){this.error=e instanceof Error?e.message:D(`requestFailed`)}finally{this.saving=!1,this.requestUpdate()}}}}async revokeAll(){if(await S({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 g`
|
|
953
1023
|
<label class="quickforge-settings-switch" aria-disabled=${n?`true`:`false`}>
|
|
954
1024
|
<input
|
|
955
1025
|
type="checkbox"
|
|
@@ -959,7 +1029,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
|
|
|
959
1029
|
/>
|
|
960
1030
|
<span aria-hidden="true"></span>
|
|
961
1031
|
</label>
|
|
962
|
-
`}render(){return this.loading?
|
|
1032
|
+
`}render(){return this.loading?g`<div class="text-sm text-muted-foreground">${D(`loading`)}</div>`:g`
|
|
963
1033
|
<div class="quickforge-settings-stack">
|
|
964
1034
|
<div class="quickforge-settings-warning">${D(`lanAccessRiskWarning`)}</div>
|
|
965
1035
|
|
|
@@ -991,7 +1061,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
|
|
|
991
1061
|
<div class="quickforge-settings-row-description">${D(`lanAccessUrlsDescription`)}</div>
|
|
992
1062
|
</div>
|
|
993
1063
|
<div class="quickforge-settings-row-control quickforge-settings-row-control-wide quickforge-settings-readonly-value">
|
|
994
|
-
${this.lanUrls.length?this.lanUrls.map(e=>
|
|
1064
|
+
${this.lanUrls.length?this.lanUrls.map(e=>g`<div>${e}</div>`):`-`}
|
|
995
1065
|
</div>
|
|
996
1066
|
</div>
|
|
997
1067
|
</section>
|
|
@@ -1023,7 +1093,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
|
|
|
1023
1093
|
<button
|
|
1024
1094
|
class="quickforge-settings-button quickforge-settings-button-secondary"
|
|
1025
1095
|
type="button"
|
|
1026
|
-
@click=${()=>this.updatePassword(
|
|
1096
|
+
@click=${()=>this.updatePassword(gt())}
|
|
1027
1097
|
>
|
|
1028
1098
|
${D(`generatePassword`)}
|
|
1029
1099
|
</button>
|
|
@@ -1061,10 +1131,10 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
|
|
|
1061
1131
|
</div>
|
|
1062
1132
|
</section>
|
|
1063
1133
|
|
|
1064
|
-
${this.message?
|
|
1065
|
-
${this.error?
|
|
1134
|
+
${this.message?g`<div class="quickforge-settings-message">${this.message}</div>`:null}
|
|
1135
|
+
${this.error?g`<div class="quickforge-settings-alert">${this.error}</div>`:null}
|
|
1066
1136
|
</div>
|
|
1067
|
-
`}},
|
|
1137
|
+
`}},W=`quickforge-lan-access-settings-tab`;customElements.get(W)||customElements.define(W,_t);function vt(){return document.createElement(W)}var yt=18e4,bt=3e4,xt=1e3,St=`https://github.com/shawnstack/quickforge/releases/latest`;function G(){if(typeof document>`u`)return!1;let e=window;return document.body.classList.contains(`quickforge-desktop-app`)||e.__quickforgeDesktopApp===!0}function Ct(e){return new Promise(t=>window.setTimeout(t,e))}var wt=[{value:`startup`,label:()=>D(`frequencyStartup`)},{value:`daily`,label:()=>D(`frequencyDaily`)},{value:`weekly`,label:()=>D(`frequencyWeekly`)},{value:`off`,label:()=>D(`frequencyOff`)}],Tt=class extends _{about;updateInfo;loading=!0;checking=!1;updating=!1;restarting=!1;message=``;error=``;frequency=se.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([Ee(v()),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(G()){window.open(St,`_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<yt;){await Ct(xt);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<bt;){await Ct(xt);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 S({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(n?.error||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(G()){window.open(St,`_blank`,`noopener,noreferrer`),this.message=D(`desktopUpdateHint`),this.error=``,this.requestUpdate();return}if(!(!this.updateInfo?.updateAvailable||this.updating)&&await S({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(t?.error||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=v();await ge(t,{...await Ee(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 g`
|
|
1068
1138
|
<button
|
|
1069
1139
|
type="button"
|
|
1070
1140
|
class="quickforge-settings-segmented-option ${t?`quickforge-settings-segmented-option-active`:``}"
|
|
@@ -1073,7 +1143,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
|
|
|
1073
1143
|
>
|
|
1074
1144
|
${e.label()}
|
|
1075
1145
|
</button>
|
|
1076
|
-
`}infoRows(){let e=this.about;return e?
|
|
1146
|
+
`}infoRows(){let e=this.about;return e?g`
|
|
1077
1147
|
<div class="quickforge-settings-row">
|
|
1078
1148
|
<div class="quickforge-settings-row-main">
|
|
1079
1149
|
<div class="quickforge-settings-row-title">${D(`packageName`)}</div>
|
|
@@ -1099,7 +1169,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
|
|
|
1099
1169
|
</a>
|
|
1100
1170
|
</div>
|
|
1101
1171
|
</div>
|
|
1102
|
-
`:null}updateStatus(){return this.updateInfo?
|
|
1172
|
+
`:null}updateStatus(){return this.updateInfo?g`
|
|
1103
1173
|
<div class="quickforge-settings-row">
|
|
1104
1174
|
<div class="quickforge-settings-row-main">
|
|
1105
1175
|
<div class="quickforge-settings-row-title">${D(`latestVersion`)}</div>
|
|
@@ -1107,7 +1177,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
|
|
|
1107
1177
|
</div>
|
|
1108
1178
|
<div class="quickforge-settings-row-control quickforge-settings-readonly-value">${this.updateInfo.latestVersion}</div>
|
|
1109
1179
|
</div>
|
|
1110
|
-
${this.updateInfo.logFile?
|
|
1180
|
+
${this.updateInfo.logFile?g`
|
|
1111
1181
|
<div class="quickforge-settings-row">
|
|
1112
1182
|
<div class="quickforge-settings-row-main">
|
|
1113
1183
|
<div class="quickforge-settings-row-title">${D(`updateLog`)}</div>
|
|
@@ -1118,7 +1188,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
|
|
|
1118
1188
|
</div>
|
|
1119
1189
|
</div>
|
|
1120
1190
|
`:null}
|
|
1121
|
-
`:null}restartSection(){let e=this.serviceStatus?.restartUnsupportedReason||D(`backendRestartUnsupported`),t=this.restarting||!this.serviceStatus?.restartSupported;return
|
|
1191
|
+
`:null}restartSection(){let e=this.serviceStatus?.restartUnsupportedReason||D(`backendRestartUnsupported`),t=this.restarting||!this.serviceStatus?.restartSupported;return g`
|
|
1122
1192
|
<section class="quickforge-settings-section" aria-label=${D(`restartBackendService`)}>
|
|
1123
1193
|
<div class="quickforge-settings-row">
|
|
1124
1194
|
<div class="quickforge-settings-row-main">
|
|
@@ -1142,14 +1212,14 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
|
|
|
1142
1212
|
</div>
|
|
1143
1213
|
</div>
|
|
1144
1214
|
</section>
|
|
1145
|
-
`}render(){if(this.loading)return
|
|
1215
|
+
`}render(){if(this.loading)return g`<div class="text-sm text-muted-foreground">${D(`loading`)}</div>`;let e=this.checking||this.updating||!this.updateInfo?.updateAvailable,t=G();return g`
|
|
1146
1216
|
<div class="quickforge-settings-stack">
|
|
1147
1217
|
<section class="quickforge-settings-section" aria-label=${D(`projectInfo`)}>
|
|
1148
1218
|
${this.infoRows()}
|
|
1149
1219
|
</section>
|
|
1150
1220
|
|
|
1151
1221
|
<section class="quickforge-settings-section" aria-label=${D(t?`desktopUpdates`:`runtimeUpdates`)}>
|
|
1152
|
-
${t?null:
|
|
1222
|
+
${t?null:g`
|
|
1153
1223
|
<div class="quickforge-settings-row">
|
|
1154
1224
|
<div class="quickforge-settings-row-main">
|
|
1155
1225
|
<div class="quickforge-settings-row-title">
|
|
@@ -1157,12 +1227,12 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
|
|
|
1157
1227
|
<quickforge-info-tip .label=${D(`updateFrequencyDescription`)}></quickforge-info-tip>
|
|
1158
1228
|
</div>
|
|
1159
1229
|
<div class="quickforge-settings-row-description">
|
|
1160
|
-
${this.lastCheckAt?D(`lastCheckedAt`,{time:new Date(this.lastCheckAt).toLocaleString(
|
|
1230
|
+
${this.lastCheckAt?D(`lastCheckedAt`,{time:new Date(this.lastCheckAt).toLocaleString(be())}):D(`lastCheckedNever`)}
|
|
1161
1231
|
</div>
|
|
1162
1232
|
</div>
|
|
1163
1233
|
<div class="quickforge-settings-row-control quickforge-settings-row-control-wide">
|
|
1164
1234
|
<div class="quickforge-settings-segmented quickforge-settings-segmented-wrap" role="group" aria-label=${D(`updateFrequencySection`)}>
|
|
1165
|
-
${
|
|
1235
|
+
${wt.map(e=>this.renderFrequencyOption(e))}
|
|
1166
1236
|
</div>
|
|
1167
1237
|
</div>
|
|
1168
1238
|
</div>
|
|
@@ -1189,7 +1259,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
|
|
|
1189
1259
|
>
|
|
1190
1260
|
${this.checking?D(`checkingUpdate`):D(t?`openDesktopReleases`:`checkRuntimeUpdate`)}
|
|
1191
1261
|
</button>
|
|
1192
|
-
${t?null:
|
|
1262
|
+
${t?null:g`
|
|
1193
1263
|
<button
|
|
1194
1264
|
class="quickforge-settings-button quickforge-settings-button-primary"
|
|
1195
1265
|
type="button"
|
|
@@ -1205,15 +1275,15 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
|
|
|
1205
1275
|
|
|
1206
1276
|
${this.restartSection()}
|
|
1207
1277
|
|
|
1208
|
-
${this.message?
|
|
1209
|
-
${this.error?
|
|
1278
|
+
${this.message?g`<div class="quickforge-settings-message">${this.message}</div>`:null}
|
|
1279
|
+
${this.error?g`<div class="quickforge-settings-alert">${this.error}</div>`:null}
|
|
1210
1280
|
</div>
|
|
1211
|
-
`}},
|
|
1281
|
+
`}},K=`quickforge-about-settings-tab`;customElements.get(K)||customElements.define(K,Tt);function Et(){return document.createElement(K)}var Dt=class extends _{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?g`<div class="quickforge-settings-note">${D(`loading`)}</div>`:this.projects.length===0?g`
|
|
1212
1282
|
<div class="quickforge-settings-stack">
|
|
1213
1283
|
<div class="quickforge-settings-note">${D(`selectProjectForCommands`)}</div>
|
|
1214
|
-
${this.error?
|
|
1284
|
+
${this.error?g`<div class="quickforge-settings-alert">${this.error}</div>`:null}
|
|
1215
1285
|
</div>
|
|
1216
|
-
`:
|
|
1286
|
+
`:g`
|
|
1217
1287
|
<div class="quickforge-settings-stack">
|
|
1218
1288
|
<section class="quickforge-settings-section" aria-label=${D(`projectCommands`)}>
|
|
1219
1289
|
<div class="quickforge-settings-row">
|
|
@@ -1229,7 +1299,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
|
|
|
1229
1299
|
.value=${this.project?.id??``}
|
|
1230
1300
|
@change=${e=>this.selectProject(e)}
|
|
1231
1301
|
>
|
|
1232
|
-
${this.projects.map(e=>
|
|
1302
|
+
${this.projects.map(e=>g`<option value=${e.id} ?selected=${e.id===this.project?.id}>${e.name}</option>`)}
|
|
1233
1303
|
</select>
|
|
1234
1304
|
</div>
|
|
1235
1305
|
</div>
|
|
@@ -1293,7 +1363,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
|
|
|
1293
1363
|
</div>
|
|
1294
1364
|
|
|
1295
1365
|
<div class="quickforge-settings-nested-list">
|
|
1296
|
-
${this.loadingCommands?
|
|
1366
|
+
${this.loadingCommands?g`<div class="quickforge-settings-empty-row">${D(`loading`)}</div>`:this.commands.length===0?g`<div class="quickforge-settings-empty-row">${D(`noCommandsLoaded`)}</div>`:this.commands.map(e=>{let t=e.argumentHint?` ${e.argumentHint}`:``;return g`
|
|
1297
1367
|
<div class="quickforge-settings-subrow">
|
|
1298
1368
|
<div class="quickforge-settings-row-main">
|
|
1299
1369
|
<div class="quickforge-settings-row-title">
|
|
@@ -1303,25 +1373,25 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
|
|
|
1303
1373
|
${e.description||D(`noDescription`)}
|
|
1304
1374
|
</div>
|
|
1305
1375
|
</div>
|
|
1306
|
-
${e.relativePath?
|
|
1376
|
+
${e.relativePath?g`<div class="quickforge-settings-row-control quickforge-settings-row-control-wide quickforge-settings-readonly-value">${e.relativePath}</div>`:null}
|
|
1307
1377
|
</div>
|
|
1308
1378
|
`})}
|
|
1309
1379
|
</div>
|
|
1310
1380
|
</section>
|
|
1311
1381
|
|
|
1312
|
-
${this.saving?
|
|
1313
|
-
${this.saved?
|
|
1314
|
-
${this.message?
|
|
1315
|
-
${this.error?
|
|
1382
|
+
${this.saving?g`<div class="quickforge-settings-note">${D(`saving`)}</div>`:null}
|
|
1383
|
+
${this.saved?g`<div class="quickforge-settings-message">${D(`projectCommandsSaved`)}</div>`:null}
|
|
1384
|
+
${this.message?g`<div class="quickforge-settings-message">${this.message}</div>`:null}
|
|
1385
|
+
${this.error?g`<div class="quickforge-settings-alert">${this.error}</div>`:null}
|
|
1316
1386
|
</div>
|
|
1317
|
-
`}},
|
|
1387
|
+
`}},q=`quickforge-project-commands-settings-tab`;customElements.get(q)||customElements.define(q,Dt);function Ot(){return document.createElement(q)}var J={"x-quickforge-action":`channel-action`};function kt(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 At(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`)}}function jt(e){if(!e)return`-`;let t=new Date(e);return Number.isNaN(t.getTime())?e:t.toLocaleString()}var Mt=class extends _{loading=!0;channels=[];workspaces=[];selectedWorkspaceIdByChannel={};error=``;message=``;eventSource;busyChannelId=``;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}if(e.channelId&&e.log){let t=this.channels.find(t=>t.id===e.channelId);t&&(t.logs=[...t.logs||[],e.log].slice(-300),this.requestUpdate())}}upsertChannel(e){let t=this.channels.findIndex(t=>t.id===e.id);t>=0?this.channels=[...this.channels.slice(0,t),e,...this.channels.slice(t+1)]:this.channels=[...this.channels,e],this.ensureWorkspaceSelections(),this.requestUpdate()}selectedWorkspaceId(e){return this.selectedWorkspaceIdByChannel[e.id]||e.launchWorkspace?.id||`default`}handleWorkspaceChange(e,t){let n=t.currentTarget;n&&(this.selectedWorkspaceIdByChannel={...this.selectedWorkspaceIdByChannel,[e.id]:n.value||`default`},this.requestUpdate())}startOptions(e){return e.supportsWorkspaceSelection?{projectId:this.selectedWorkspaceId(e)}:void 0}async invoke(e,t){if(!this.busyChannelId&&!(t===`restart`&&!await S({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?{...J,"content-type":`application/json`}:J,body:n?JSON.stringify(n):void 0});this.upsertChannel(r)}catch(e){this.error=e instanceof Error?e.message:D(`requestFailed`)}finally{this.busyChannelId=``,this.requestUpdate()}}}async invokeAction(e,t){if(!this.busyChannelId&&!((t.destructive||t.id===`relogin`)&&!await S({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?{...J,"content-type":`application/json`}:J,body:n?JSON.stringify(n):void 0});this.upsertChannel(r)}catch(e){this.error=e instanceof Error?e.message:D(`requestFailed`)}finally{this.busyChannelId=``,this.requestUpdate()}}}workspaceSection(e,t){if(!e.supportsWorkspaceSelection)return null;let n=this.selectedWorkspaceId(e),r=e.launchWorkspace;return g`
|
|
1318
1388
|
<div class="quickforge-settings-row quickforge-settings-row-align-start">
|
|
1319
1389
|
<div class="quickforge-settings-row-main">
|
|
1320
1390
|
<div class="quickforge-settings-row-title">
|
|
1321
1391
|
${D(`channelWorkspace`)}
|
|
1322
1392
|
<quickforge-info-tip .label=${D(`channelWorkspaceDescription`)}></quickforge-info-tip>
|
|
1323
1393
|
</div>
|
|
1324
|
-
${r?
|
|
1394
|
+
${r?g`<div class="quickforge-settings-row-description">${D(`channelCurrentWorkspace`)}: <span class="quickforge-settings-mono">${r.path}</span></div>`:g`<div class="quickforge-settings-row-description">${D(`channelWorkspaceDescription`)}</div>`}
|
|
1325
1395
|
</div>
|
|
1326
1396
|
<div class="quickforge-settings-row-control quickforge-settings-row-control-wide">
|
|
1327
1397
|
<select
|
|
@@ -1330,15 +1400,15 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
|
|
|
1330
1400
|
.value=${n}
|
|
1331
1401
|
@change=${t=>this.handleWorkspaceChange(e,t)}
|
|
1332
1402
|
>
|
|
1333
|
-
${this.workspaces.map(e=>
|
|
1403
|
+
${this.workspaces.map(e=>g`
|
|
1334
1404
|
<option value=${e.id}>${e.kind===`default`?D(`channelDefaultWorkspace`):e.name} — ${e.path}</option>
|
|
1335
1405
|
`)}
|
|
1336
1406
|
</select>
|
|
1337
1407
|
</div>
|
|
1338
1408
|
</div>
|
|
1339
|
-
`}channelMeta(e){return
|
|
1409
|
+
`}channelMeta(e){return g`
|
|
1340
1410
|
<div class="quickforge-settings-nested-list">
|
|
1341
|
-
${[[D(`channelProvider`),e.provider||`-`],[D(`channelCommand`),e.commandLabel||`-`],[D(`channelPid`),e.pid?String(e.pid):`-`],[D(`channelStartedAt`),
|
|
1411
|
+
${[[D(`channelProvider`),e.provider||`-`],[D(`channelCommand`),e.commandLabel||`-`],[D(`channelPid`),e.pid?String(e.pid):`-`],[D(`channelStartedAt`),jt(e.startedAt)]].map(([e,t])=>g`
|
|
1342
1412
|
<div class="quickforge-settings-subrow">
|
|
1343
1413
|
<div class="quickforge-settings-row-main">
|
|
1344
1414
|
<div class="quickforge-settings-row-title">${e}</div>
|
|
@@ -1347,7 +1417,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
|
|
|
1347
1417
|
</div>
|
|
1348
1418
|
`)}
|
|
1349
1419
|
</div>
|
|
1350
|
-
`}qrSection(e){return!e.qrCodeText&&!e.qrCodeUrl&&e.status!==`waiting_scan`?null:
|
|
1420
|
+
`}qrSection(e){return!e.qrCodeText&&!e.qrCodeUrl&&e.status!==`waiting_scan`?null:g`
|
|
1351
1421
|
<div class="quickforge-settings-row quickforge-settings-row-align-start">
|
|
1352
1422
|
<div class="quickforge-settings-row-main">
|
|
1353
1423
|
<div class="quickforge-settings-row-title">
|
|
@@ -1355,64 +1425,64 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ft as t,H as n,It as r
|
|
|
1355
1425
|
<quickforge-info-tip .label=${D(`channelQrDescription`)}></quickforge-info-tip>
|
|
1356
1426
|
</div>
|
|
1357
1427
|
<div class="quickforge-settings-row-description">${D(`channelQrDescription`)}</div>
|
|
1358
|
-
${e.qrCodeUrl?
|
|
1428
|
+
${e.qrCodeUrl?g`
|
|
1359
1429
|
<div class="quickforge-settings-meta">
|
|
1360
1430
|
<a class="quickforge-settings-link quickforge-settings-mono" href=${e.qrCodeUrl} target="_blank" rel="noreferrer">${e.qrCodeUrl}</a>
|
|
1361
1431
|
</div>
|
|
1362
1432
|
`:null}
|
|
1363
1433
|
</div>
|
|
1364
|
-
${e.qrCodeText?
|
|
1434
|
+
${e.qrCodeText?g`<pre class="quickforge-channel-qr-text">${e.qrCodeText}</pre>`:null}
|
|
1365
1435
|
</div>
|
|
1366
|
-
`}logsSection(e){let t=e.logs||[];return
|
|
1436
|
+
`}logsSection(e){let t=e.logs||[];return g`
|
|
1367
1437
|
<details class="quickforge-channel-logs" open>
|
|
1368
1438
|
<summary class="quickforge-channel-logs-summary">${D(`channelRecentLogs`)}</summary>
|
|
1369
1439
|
<div class="quickforge-channel-logs-body">
|
|
1370
|
-
${t.length?t.slice(-80).map(e=>
|
|
1440
|
+
${t.length?t.slice(-80).map(e=>g`
|
|
1371
1441
|
<div class="quickforge-channel-log-row">
|
|
1372
1442
|
<span class="text-muted-foreground/55">${new Date(e.time).toLocaleTimeString()}</span>
|
|
1373
1443
|
<span class=${e.stream===`stderr`?`text-destructive/80`:`text-muted-foreground/70`}>${e.stream}</span>
|
|
1374
1444
|
<span class="min-w-0 whitespace-pre-wrap break-words text-foreground/85">${e.text}</span>
|
|
1375
1445
|
</div>
|
|
1376
|
-
`):
|
|
1446
|
+
`):g`<div class="quickforge-settings-empty-row">${D(`channelNoLogs`)}</div>`}
|
|
1377
1447
|
</div>
|
|
1378
1448
|
</details>
|
|
1379
|
-
`}channelCard(e){let t=this.busyChannelId===e.id||!!e.activeAction,n=e.status===`running`||e.status===`waiting_scan`||e.status===`starting`,r=e.status===`stopping`,i=!!(e.supportsWorkspaceSelection&&this.workspaces.length===0);return
|
|
1449
|
+
`}channelCard(e){let t=this.busyChannelId===e.id||!!e.activeAction,n=e.status===`running`||e.status===`waiting_scan`||e.status===`starting`,r=e.status===`stopping`,i=!!(e.supportsWorkspaceSelection&&this.workspaces.length===0);return g`
|
|
1380
1450
|
<section class="quickforge-settings-section" aria-label=${e.name}>
|
|
1381
1451
|
<div class="quickforge-settings-row quickforge-settings-row-top">
|
|
1382
1452
|
<div class="quickforge-settings-row-main">
|
|
1383
1453
|
<div class="quickforge-settings-row-title">
|
|
1384
1454
|
${e.name}
|
|
1385
|
-
<span class="quickforge-settings-badge ${
|
|
1455
|
+
<span class="quickforge-settings-badge ${kt(e.status)}">${At(e.status)}</span>
|
|
1386
1456
|
</div>
|
|
1387
1457
|
<div class="quickforge-settings-row-description">${e.description}</div>
|
|
1388
|
-
${e.requirements?.length?
|
|
1458
|
+
${e.requirements?.length?g`<div class="quickforge-settings-row-description">${D(`channelRequirements`)}: ${e.requirements.join(` · `)}</div>`:null}
|
|
1389
1459
|
</div>
|
|
1390
1460
|
<div class="quickforge-settings-row-control quickforge-settings-row-control-wide">
|
|
1391
1461
|
<button class="quickforge-settings-button quickforge-settings-button-primary" type="button" ?disabled=${t||n||r||i} @click=${()=>this.invoke(e,`start`)}>${D(`start`)}</button>
|
|
1392
1462
|
<button class="quickforge-settings-button quickforge-settings-button-secondary" type="button" ?disabled=${t||!n||r} @click=${()=>this.invoke(e,`stop`)}>${D(`stop`)}</button>
|
|
1393
1463
|
<button class="quickforge-settings-button quickforge-settings-button-secondary" type="button" ?disabled=${t||r||i} @click=${()=>this.invoke(e,`restart`)}>${D(`restart`)}</button>
|
|
1394
|
-
${e.actions?.map(n=>
|
|
1464
|
+
${e.actions?.map(n=>g`
|
|
1395
1465
|
<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>
|
|
1396
1466
|
`)}
|
|
1397
1467
|
</div>
|
|
1398
1468
|
</div>
|
|
1399
1469
|
|
|
1400
1470
|
${this.workspaceSection(e,t||n||r)}
|
|
1401
|
-
${i?
|
|
1471
|
+
${i?g`<div class="quickforge-settings-alert quickforge-settings-warning-attached">${D(`channelNoWorkspaces`)}</div>`:null}
|
|
1402
1472
|
${this.channelMeta(e)}
|
|
1403
|
-
${e.error?
|
|
1473
|
+
${e.error?g`<div class="quickforge-settings-alert quickforge-settings-warning-attached">${e.error}</div>`:null}
|
|
1404
1474
|
${this.qrSection(e)}
|
|
1405
1475
|
${this.logsSection(e)}
|
|
1406
1476
|
</section>
|
|
1407
|
-
`}render(){return this.loading?
|
|
1477
|
+
`}render(){return this.loading?g`<div class="quickforge-settings-note">${D(`loading`)}</div>`:g`
|
|
1408
1478
|
<div class="quickforge-settings-stack">
|
|
1409
1479
|
<section class="quickforge-settings-warning">
|
|
1410
1480
|
${D(`channelsSecurityWarning`)}
|
|
1411
1481
|
</section>
|
|
1412
1482
|
|
|
1413
|
-
${this.channels.length?
|
|
1483
|
+
${this.channels.length?g`${this.channels.map(e=>this.channelCard(e))}`:g`<div class="quickforge-settings-note">${D(`channelsEmpty`)}</div>`}
|
|
1414
1484
|
|
|
1415
|
-
${this.message?
|
|
1416
|
-
${this.error?
|
|
1485
|
+
${this.message?g`<div class="quickforge-settings-message">${this.message}</div>`:null}
|
|
1486
|
+
${this.error?g`<div class="quickforge-settings-alert">${this.error}</div>`:null}
|
|
1417
1487
|
</div>
|
|
1418
|
-
`}},
|
|
1488
|
+
`}},Y=`quickforge-channels-settings-tab`;customElements.get(Y)||customElements.define(Y,Mt);function Nt(){return document.createElement(Y)}var Pt=ie(),X=re(),Ft=(0,k.lazy)(()=>y(()=>import(`./AgentProfilesPage-CooGLweI.js`).then(e=>({default:e.AgentProfilesPage})),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11]))),It=(0,k.lazy)(()=>y(()=>import(`./mcp-servers-dialog-CsRQxx7A.js`).then(e=>({default:e.McpServersPanel})),__vite__mapDeps([12,1,2,3,4,5,6,7,8,9,10,11]))),Lt=(0,k.lazy)(()=>y(()=>import(`./skills-dialog-CmVLi_h6.js`).then(e=>e.n).then(e=>({default:e.SkillsManagerPanel})),__vite__mapDeps([9,1,2,3,4,5,6,7,8,10,11]))),Rt=(0,k.lazy)(()=>y(()=>import(`./PluginsPage-qXTjDrpd.js`).then(e=>({default:e.PluginsPage})),__vite__mapDeps([13,1,2,3,4,5,6,7,8,9,10,11,14]))),zt=(0,k.lazy)(()=>y(()=>import(`./ScheduledTasksPage-BBor8Yb2.js`).then(e=>({default:e.ScheduledTasksPage})),__vite__mapDeps([15,1,2,3,4,5,6,7,8,9,10,11]))),Bt=class extends _{tabName=``;renderReact;root;getTabName(){return this.tabName}connectedCallback(){super.connectedCallback(),this.updateComplete.then(()=>this.mountReact())}disconnectedCallback(){this.root?.unmount(),this.root=void 0,super.disconnectedCallback()}render(){return g`<div class="quickforge-react-settings-tab h-full min-h-0"></div>`}mountReact(){let e=this.querySelector(`.quickforge-react-settings-tab`);!e||!this.renderReact||(this.root??=(0,Pt.createRoot)(e),this.root.render(this.renderReact()))}},Z=`quickforge-react-settings-tab`;customElements.get(Z)||customElements.define(Z,Bt);function Q(e,t){let n=document.createElement(Z);return n.tabName=e,n.renderReact=t,n}function $({children:e}){return(0,X.jsx)(`div`,{className:`quickforge-settings-stack h-full min-h-[30rem]`,children:(0,X.jsx)(k.Suspense,{fallback:(0,X.jsx)(`div`,{className:`quickforge-settings-note`,children:D(`loading`)}),children:e})})}function Vt(e){window.dispatchEvent(new CustomEvent(`quickforge:open-session-from-settings`,{detail:{sessionId:e}}))}function Ht(){return Q(D(`agentsTab`),()=>(0,X.jsx)($,{children:(0,X.jsx)(Ft,{})}))}function Ut(){return Q(D(`skills`),()=>(0,X.jsx)($,{children:(0,X.jsx)(Lt,{active:!0,scope:`global`,embedded:!0,onSaved:()=>void 0})}))}function Wt(){return Q(D(`mcpServers`),()=>(0,X.jsx)($,{children:(0,X.jsx)(It,{active:!0})}))}function Gt(){return Q(D(`plugins`),()=>(0,X.jsx)($,{children:(0,X.jsx)(Rt,{})}))}function Kt(){return Q(D(`scheduledTasks`),()=>(0,X.jsx)($,{children:(0,X.jsx)(zt,{onOpenSession:Vt})}))}function qt(e){let t=[{key:`appearance`,tab:Pe(),getDescription:()=>D(`appearanceDescription`)},{key:`defaults`,tab:Je(),getDescription:()=>D(`defaultOptionsDescription`)},{key:`memory`,tab:tt(),getDescription:()=>D(`memoryDescription`)},{key:`customModels`,tab:je(e),getDescription:()=>D(`customModelsDescription`)},{key:`agents`,tab:Ht(),getDescription:()=>D(`agentsDescription`)},{key:`skills`,tab:Ut(),getDescription:()=>D(`globalSkillsDescription`)},{key:`mcp`,tab:Wt(),getDescription:void 0},{key:`plugins`,tab:Gt(),getDescription:()=>D(`pluginsDescription`)},{key:`scheduledTasks`,tab:Kt(),getDescription:()=>D(`scheduledTasksDescription`)},{key:`projectCommands`,tab:Ot(),getDescription:()=>D(`projectCommandsDescription`)},{key:`backup`,tab:dt(),getDescription:()=>D(`backupRestoreDescription`)},{key:`archivedConversations`,tab:ht(),getDescription:()=>D(`archivedConversationsDescription`)},{key:`channels`,tab:Nt(),getDescription:()=>D(`channelsDescription`)},{key:`lanAccess`,tab:vt(),getDescription:()=>D(`lanAccessDescription`)},{key:`about`,tab:Et(),getDescription:()=>D(`aboutQuickForgeDescription`)}];return{items:[...t],tabs:t.map(e=>e.tab),indexOf:e=>t.findIndex(t=>t.key===e)}}var Jt={appearance:d,defaults:h,memory:a,customModels:f,agents:t,skills:r,mcp:u,plugins:s,scheduledTasks:i,projectCommands:l,backup:te,archivedConversations:ne,channels:p,lanAccess:m,about:n};function Yt({tab:e}){let t=(0,k.useRef)(null);return(0,k.useEffect)(()=>{let n=t.current;if(n)return n.replaceChildren(e),()=>{e.parentNode===n&&n.removeChild(e)}},[e]),(0,X.jsx)(`div`,{ref:t,className:`quickforge-settings-tab-host min-h-0 flex-1`})}function Xt({initialTab:e,customProvider:t,onBack:n}){let r=(0,k.useMemo)(()=>qt(t),[t]),i=Math.max(0,r.indexOf(e)),[a,s]=(0,k.useState)(),c=a??i,l=r.items[c]??r.items[0],u=l?.getDescription?.(),d=l?Jt[l.key]:void 0,[f,p]=(0,k.useState)(``),m=f.trim().toLowerCase(),h=(0,k.useMemo)(()=>r.items.map((e,t)=>({item:e,index:t})).filter(({item:e})=>m?[e.key,e.tab.getTabName(),e.getDescription?.()??``].join(` `).toLowerCase().includes(m):!0),[r.items,m]);return(0,X.jsxs)(`div`,{className:`flex h-screen min-h-0 bg-[var(--quickforge-sidebar-bg)] text-foreground`,children:[(0,X.jsxs)(`aside`,{className:`relative z-10 hidden w-80 shrink-0 overflow-hidden bg-[var(--quickforge-sidebar-bg)] md:flex md:min-h-0 md:flex-col`,children:[(0,X.jsxs)(`div`,{className:`shrink-0 px-3 pb-2 pt-3`,children:[(0,X.jsxs)(`button`,{type:`button`,className:`group relative flex w-full items-center gap-2 overflow-hidden rounded-lg px-2 py-1.5 text-left text-muted-foreground/72 transition-[background-color,color,box-shadow] duration-160 ease-out hover:bg-[var(--quickforge-sidebar-hover-bg)] hover:text-foreground/86 hover:shadow-[0_8px_20px_-18px_rgb(15_23_42_/_0.35)]`,onClick: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)(o,{className:`size-4`})}),(0,X.jsx)(`span`,{className:`truncate text-sm leading-5`,children:`返回工作区`})]}),(0,X.jsxs)(`div`,{className:`quickforge-settings-inline-field mt-3`,children:[(0,X.jsx)(ee,{className:`pointer-events-none absolute left-3 top-1/2 size-4 -translate-y-1/2 text-muted-foreground/60`,"aria-hidden":`true`}),(0,X.jsx)(`input`,{value:f,onChange:e=>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===c,r=Jt[e.key];return(0,X.jsxs)(`button`,{type:`button`,className:E(`group relative flex w-full items-center gap-2.5 overflow-hidden rounded-lg px-2 py-1.5 text-left text-sm leading-5 transition-[background-color,color,box-shadow] duration-160 ease-out`,n?`bg-[var(--quickforge-sidebar-active-bg)] font-medium text-foreground/92 shadow-[0_8px_22px_-20px_rgb(15_23_42_/_0.32)]`:`text-muted-foreground/76 hover:bg-[var(--quickforge-sidebar-hover-bg)] hover:text-foreground/90 hover:shadow-[0_8px_20px_-18px_rgb(15_23_42_/_0.35)]`),onClick:()=>s(t),"aria-current":n?`page`:void 0,children:[(0,X.jsx)(`span`,{className:E(`inline-flex size-5 shrink-0 items-center justify-center transition-colors`,n?`text-foreground/72`:`text-muted-foreground/52 group-hover:text-foreground/68`),children:(0,X.jsx)(r,{className:`size-4`,"aria-hidden":`true`})}),(0,X.jsx)(`span`,{className:`truncate`,children:e.tab.getTabName()})]},e.key)}),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:`flex min-w-0 flex-1 flex-col bg-[var(--quickforge-main-bg)] md:overflow-hidden md:rounded-l-2xl`,children:[(0,X.jsxs)(`header`,{className:`flex h-14 shrink-0 items-center gap-2 border-b-[0.5px] border-[color-mix(in_oklab,var(--border)_34%,transparent)] px-3 pr-4 md:px-5`,children:[(0,X.jsx)(Te,{variant:`ghost`,size:`icon`,className:`md:hidden`,onClick:n,"aria-label":`返回工作区`,children:(0,X.jsx)(o,{className:`size-4`})}),(0,X.jsx)(`div`,{className:`min-w-0 flex-1`,children:(0,X.jsxs)(`div`,{className:`flex min-w-0 items-center gap-2`,children:[d?(0,X.jsx)(d,{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:l?.tab.getTabName()}),u?(0,X.jsx)(_e,{label:u}):null]})})]}),(0,X.jsx)(`div`,{className:`shrink-0 border-b-[0.5px] border-[color-mix(in_oklab,var(--border)_30%,transparent)] px-3 py-2 md:hidden`,children:(0,X.jsxs)(`div`,{className:`quickforge-settings-inline-field`,children:[(0,X.jsx)(ee,{className:`pointer-events-none absolute left-3 top-1/2 size-4 -translate-y-1/2 text-muted-foreground/60`,"aria-hidden":`true`}),(0,X.jsx)(`input`,{value:f,onChange:e=>p(e.target.value),placeholder:D(`searchSettings`),"aria-label":D(`searchSettings`),className:`quickforge-settings-input`})]})}),(0,X.jsxs)(`div`,{className:`quickforge-settings-mobile-tabs flex shrink-0 gap-1 overflow-x-auto border-b-[0.5px] border-[color-mix(in_oklab,var(--border)_30%,transparent)] px-3 py-2 md:hidden`,children:[h.map(({item:e,index:t})=>{let n=t===c,r=Jt[e.key];return(0,X.jsxs)(`button`,{type:`button`,className:E(`inline-flex shrink-0 items-center gap-1.5 rounded-full px-3 py-1.5 text-sm transition-colors`,n?`bg-muted text-foreground`:`text-muted-foreground hover:bg-muted/55 hover:text-foreground`),onClick:()=>s(t),children:[(0,X.jsx)(r,{className:`size-3.5 shrink-0`,"aria-hidden":`true`}),(0,X.jsx)(`span`,{children:e.tab.getTabName()})]},e.key)}),h.length===0?(0,X.jsx)(`div`,{className:`shrink-0 px-1 py-1.5 text-sm text-muted-foreground/70`,children:D(`noSettingsResults`)}):null]}),(0,X.jsx)(`section`,{className:`min-h-0 flex-1 overflow-y-auto px-4 py-5 md:px-8 md:py-7`,children:(0,X.jsx)(`div`,{className:`mx-auto flex min-h-full w-full max-w-5xl flex-col`,children:l?(0,X.jsx)(Yt,{tab:l.tab}):null})})]})]})}export{Xt as SettingsWorkspacePage};
|