@shawnstack/quickforge 1.7.0 → 1.7.2
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/dist/assets/AgentProfilesPage-BFgyFa5e.js +1 -0
- package/dist/assets/ChatPanelHost-Cld9HcVz.js +288 -0
- package/dist/assets/{PluginsPage-B8bHMwfv.js → PluginsPage-DEMqwhOA.js} +1 -1
- package/dist/assets/ScheduledTasksPage-DTP_gedp.js +2 -0
- package/dist/assets/{SettingsWorkspacePage-BOP9CtoI.js → SettingsWorkspacePage-Dr9zT5Bs.js} +112 -112
- package/dist/assets/SharedConversationPage-op3DRwcw.js +1 -0
- package/dist/assets/TerminalDock-BL_UovwU.js +2 -0
- package/dist/assets/WorkspaceInspector-73dhAime.js +13 -0
- package/dist/assets/icons-BP8YOS-Z.js +1 -0
- package/dist/assets/index-Cu2bBHLv.css +3 -0
- package/dist/assets/index-yV1wtqTr.js +66 -0
- package/dist/assets/mcp-servers-dialog-Bp6kbIup.js +5 -0
- package/dist/assets/{monaco-C13M09wD.js → monaco-BTsVCDWS.js} +1 -1
- package/dist/assets/{react-vendor-2RKYr-A4.js → react-vendor-Dr5xvL-e.js} +1 -1
- package/dist/assets/{skills-dialog-MpoxntiV.js → skills-dialog-DiJAUfvW.js} +1 -1
- package/dist/index.html +6 -6
- package/package.json +1 -1
- package/server/acp/server.mjs +19 -7
- package/server/mcp/registry.mjs +54 -14
- package/server/plugins/loader.mjs +9 -1
- package/server/plugins/registry.mjs +32 -10
- package/server/routes/backup.mjs +79 -72
- package/server/routes/mcp.mjs +0 -5
- package/server/routes/scheduled-tasks.mjs +72 -32
- package/server/routes/workspace.mjs +171 -49
- package/server/utils/scheduled-tasks.mjs +23 -10
- package/server/utils/workspace.mjs +25 -3
- package/dist/assets/AgentProfilesPage-DQ8URegq.js +0 -1
- package/dist/assets/ChatPanelHost-vi1tDqlJ.js +0 -291
- package/dist/assets/ScheduledTasksPage-AaUz5el2.js +0 -2
- package/dist/assets/SharedConversationPage-9A4L9UcQ.js +0 -1
- package/dist/assets/TerminalDock-DQOXpaDe.js +0 -2
- package/dist/assets/WorkspaceInspector-DaM7TJHb.js +0 -13
- package/dist/assets/icons-ko_i0WpN.js +0 -1
- package/dist/assets/index-B2eauKpo.css +0 -3
- package/dist/assets/index-B8Awq5FV.js +0 -63
- package/dist/assets/mcp-servers-dialog-XE4K8PCO.js +0 -5
|
@@ -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{
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/AgentProfilesPage-BFgyFa5e.js","assets/rolldown-runtime-DWdDZTNf.js","assets/index-yV1wtqTr.js","assets/pi-ai-Cr3rpCXT.js","assets/pi-web-ui-DoRGtREc.js","assets/lit-vendor-Dr3cpBGF.js","assets/css-utils-rkE68RDy.js","assets/icons-BP8YOS-Z.js","assets/react-vendor-Dr5xvL-e.js","assets/skills-dialog-DiJAUfvW.js","assets/logger-B65Akg8A.js","assets/index-Cu2bBHLv.css","assets/mcp-servers-dialog-Bp6kbIup.js","assets/PluginsPage-DEMqwhOA.js","assets/plugin-api-BbUkYm3Y.js","assets/ScheduledTasksPage-DTP_gedp.js"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{A as t,Dt as n,Et as r,H as i,Mt as a,Ot as o,Pt as s,Tt as c,_ as ee,f as l,ft as u,h as d,jt as te,l as f,ot as p,s as m,st as ne,x as re}from"./icons-BP8YOS-Z.js";import{n as ie,r as ae}from"./react-vendor-Dr5xvL-e.js";import{p as h}from"./lit-vendor-Dr3cpBGF.js";import{m as g,x as _}from"./pi-web-ui-DoRGtREc.js";import{J as v}from"./pi-ai-Cr3rpCXT.js";import{t as y}from"./logger-B65Akg8A.js";import{B as b,C as oe,D as se,E as ce,F as le,I as ue,O as x,P as de,R as fe,S as pe,T as me,V as S,_t as he,at as ge,ct as _e,ft as ve,gt as ye,ht as C,j as be,k as w,lt as T,mt as xe,nt as Se,rt as Ce,st as we,tt as E,ut as Te,vt as Ee,w as De,yt as D,z as Oe}from"./index-yV1wtqTr.js";var O=e(s(),1),ke={openai:{name:`OpenAI`,baseUrl:`https://api.openai.com/v1`,protocol:`openai-completions`,modelId:`gpt-4o`,supportsImages:!0},deepseek:{name:`DeepSeek`,baseUrl:`https://api.deepseek.com/v1`,protocol:`openai-completions`,modelId:`deepseek-chat`},glm:{name:`Zhipu GLM`,baseUrl:`https://open.bigmodel.cn/api/paas/v4`,protocol:`openai-completions`,modelId:`glm-4-plus`},ollama:{name:`Ollama`,baseUrl:`http://localhost:11434/v1`,protocol:`openai-completions`,modelId:`llama3.1`},litellm:{name:E.name,baseUrl:E.baseUrl,protocol:`openai-completions`,modelId:E.modelId,supportsImages:E.supportsImages}},Ae=[{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`)}],k=()=>({modelId:``,contextWindow:E.contextWindow,maxTokens:E.maxTokens,reasoning:!0,supportsImages:!1,open:!1}),A=()=>({name:E.name,baseUrl:E.baseUrl,apiKey:``,headerRows:[],protocol:`openai-completions`,models:[k()]}),je=class extends g{providers=[];form=A();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 _().customProviders.getAll()}catch(e){y.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=A(),this.apiKeyVisible=!1,this.advancedOpen=!1,this.activePreset=``,this.resetTestState(),this.formOpen=!0,this.requestUpdate()}async openEditForm(e){let t=await _().providerKeys.get(e.name)??e.apiKey??``,n=e.models??[],r=n.length>0?n.map(e=>({modelId:e.id,contextWindow:e.contextWindow??E.contextWindow,maxTokens:e.maxTokens??E.maxTokens,reasoning:e.reasoning===!0,supportsImages:e.input?.includes(`image`)===!0,open:!1})):[k()],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=A(),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,k()]},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:[k()]};else{let t=ke[e];this.form={...this.form,name:t.name,baseUrl:t.baseUrl,protocol:t.protocol,models:[{...k(),modelId:t.modelId,supportsImages:t.supportsImages===!0,open:!1}]}}this.resetTestState(),this.requestUpdate()}buildHeadersFromRows(){let e={};for(let t of this.form.headerRows){let n=t.key.trim(),r=t.value.trim();n&&r&&(e[n]=r)}return e}buildModel(e,t){let n=this.form.name.trim(),r=this.form.baseUrl.trim(),i=e.reasoning===!0,a=e.supportsImages===!0?[`text`,`image`]:[`text`],o=r.includes(`api.deepseek.com`);return we({id:e.modelId,name:`${e.modelId} (${n})`,api:this.form.protocol,provider:n,baseUrl:r.replace(/\/$/,``),reasoning:i,input:a,cost:{input:0,output:0,cacheRead:0,cacheWrite:0},contextWindow:Number(e.contextWindow)||E.contextWindow,maxTokens:Number(e.maxTokens)||E.maxTokens,headers:Object.keys(t).length>0?t:void 0,thinkingLevelMap:o&&i?{low:`high`,medium:`high`,high:`high`,xhigh:`max`}:void 0,compat:this.form.protocol===`openai-completions`?{supportsStore:!1,supportsDeveloperRole:!1,supportsReasoningEffort:i,supportsUsageInStreaming:!1,supportsStrictMode:!1,maxTokensField:`max_tokens`,...o&&i?{requiresReasoningContentOnAssistantMessages:!0,thinkingFormat:`deepseek`}:{}}:void 0})}async testConnection(){let e=this.form.baseUrl.trim(),t=this.form.models.find(e=>e.modelId.trim());if(!e||!t){this.testing=!1,this.testResult=`fail`,this.testError=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){b(D(`fillProviderBaseUrlModel`));return}let n=this.form.models.filter(e=>e.modelId.trim());if(n.length===0){b(D(`atLeastOneModel`));return}let r=n.map(e=>e.modelId.trim());if(new Set(r).size!==r.length){b(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??Te(),name:e,type:this.form.protocol,baseUrl:a[0].baseUrl,apiKey:o||void 0,models:a};try{let e=_();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){y.error(`Failed to save custom model:`,e),b(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=_();await t.customProviders.delete(e.id),await t.providerKeys.delete(e.name),await this.loadProviders()}catch(e){y.error(`Failed to delete custom provider:`,e),b(D(`deleteFailed`))}}renderProvider(e){let t=e.models??[],n=t.length,r=e.type===`anthropic-messages`?`Anthropic Messages`:`OpenAI Compatible`;return h`
|
|
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{Ct as t,Et as n,Ot as
|
|
|
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?h`<span class="quickforge-settings-badge quickforge-settings-badge-warning">${D(`noModelAdded`)}</span>`:null}
|
|
14
14
|
</div>
|
|
15
|
-
${n>0?
|
|
15
|
+
${n>0?h`
|
|
16
16
|
<div class="quickforge-settings-meta">
|
|
17
|
-
${t.slice(0,6).map(e=>
|
|
17
|
+
${t.slice(0,6).map(e=>h`
|
|
18
18
|
<code class="quickforge-settings-command-name">${e.id}</code>
|
|
19
19
|
`)}
|
|
20
|
-
${t.length>6?
|
|
20
|
+
${t.length>6?h`<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{Ct as t,Et as n,Ot as
|
|
|
40
40
|
</button>
|
|
41
41
|
</div>
|
|
42
42
|
</div>
|
|
43
|
-
`}renderPresetChips(){return
|
|
43
|
+
`}renderPresetChips(){return h`
|
|
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
|
+
${Ae.map(e=>h`
|
|
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{Ct as t,Et as n,Ot as
|
|
|
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 h`
|
|
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{Ct as t,Et as n,Ot as
|
|
|
73
73
|
@input=${e=>this.updateModelField(t,`modelId`,e.target.value)}
|
|
74
74
|
placeholder=${D(`modelIdPlaceholder`)}
|
|
75
75
|
/>
|
|
76
|
-
${n?
|
|
76
|
+
${n?h`
|
|
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{Ct as t,Et as n,Ot as
|
|
|
115
115
|
</label>
|
|
116
116
|
`:null}
|
|
117
117
|
</div>
|
|
118
|
-
${this.form.models.length>1?
|
|
118
|
+
${this.form.models.length>1?h`
|
|
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{Ct as t,Et as n,Ot as
|
|
|
126
126
|
</button>
|
|
127
127
|
`:null}
|
|
128
128
|
</div>
|
|
129
|
-
`}renderHeadersEditor(){return
|
|
129
|
+
`}renderHeadersEditor(){return h`
|
|
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?h``:h`
|
|
136
136
|
<div class="quickforge-settings-nested-list">
|
|
137
|
-
${this.form.headerRows.map((e,t)=>
|
|
137
|
+
${this.form.headerRows.map((e,t)=>h`
|
|
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{Ct as t,Et as n,Ot as
|
|
|
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?h``:this.testing?h`<span class="quickforge-settings-status">${D(`testingConnection`)}</span>`:this.testResult===`ok`?h`<span class="quickforge-settings-badge quickforge-settings-badge-success">✓ ${D(`connectionOk`)}</span>`:h`<span class="quickforge-settings-alert">✗ ${this.testError||D(`connectionFailed`)}</span>`}renderForm(){return h`
|
|
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{Ct as t,Et as n,Ot as
|
|
|
226
226
|
aria-pressed=${this.apiKeyVisible?`true`:`false`}
|
|
227
227
|
@click=${()=>this.toggleApiKeyVisibility()}
|
|
228
228
|
>
|
|
229
|
-
${this.apiKeyVisible?
|
|
229
|
+
${this.apiKeyVisible?h`<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>`:h`<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{Ct as t,Et as n,Ot as
|
|
|
257
257
|
${D(`providerAdvanced`)}
|
|
258
258
|
</button>
|
|
259
259
|
|
|
260
|
-
${this.advancedOpen?
|
|
260
|
+
${this.advancedOpen?h`
|
|
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{Ct as t,Et as n,Ot as
|
|
|
308
308
|
</div>
|
|
309
309
|
</div>
|
|
310
310
|
</section>
|
|
311
|
-
`}render(){return this.formOpen?
|
|
311
|
+
`}render(){return this.formOpen?h`
|
|
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{Ct as t,Et as n,Ot as
|
|
|
318
318
|
</div>
|
|
319
319
|
${this.renderForm()}
|
|
320
320
|
</div>
|
|
321
|
-
`:
|
|
321
|
+
`:h`
|
|
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{Ct as t,Et as n,Ot as
|
|
|
335
335
|
</button>
|
|
336
336
|
</div>
|
|
337
337
|
|
|
338
|
-
${this.loading?
|
|
338
|
+
${this.loading?h`<div class="quickforge-settings-empty-row">${D(`loading`)}</div>`:this.providers.length===0?h`<div class="quickforge-settings-empty-row">${D(`noCustomModels`)}</div>`:this.providers.map(e=>this.renderProvider(e))}
|
|
339
339
|
</section>
|
|
340
340
|
</div>
|
|
341
|
-
`}},
|
|
341
|
+
`}},j=`quickforge-custom-providers-only-tab`;customElements.get(j)||customElements.define(j,je);function Me(e){let t=document.createElement(j);return e&&(t.autoEditProviderName=e),t}var Ne=[{value:`light`,label:()=>D(`lightTheme`)},{value:`dark`,label:()=>D(`darkTheme`)}],Pe=class extends g{theme=me();interfaceFontSizePx=x.interfaceFontSizePx;messageFontSizePx=x.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=_(),[t,n]=await Promise.all([ce(e),de(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 se(_(),{theme:e}),this.error=``,this.requestUpdate()}catch(e){this.error=e instanceof Error?e.message:D(`requestFailed`),this.requestUpdate()}}}currentFontSizeSettings(){return le({interfaceFontSizePx:this.interfaceFontSizePx,messageFontSizePx:this.messageFontSizePx})}previewFontSize(e){let t=le(e);this.interfaceFontSizePx=t.interfaceFontSizePx,this.messageFontSizePx=t.messageFontSizePx,be(t),this.requestUpdate()}updateInterfaceFontSize(e){this.previewFontSize({...this.currentFontSizeSettings(),interfaceFontSizePx:Number(e)||x.interfaceFontSizePx})}updateMessageFontSize(e){this.previewFontSize({...this.currentFontSizeSettings(),messageFontSizePx:Number(e)||x.messageFontSizePx})}async saveFontSize(){try{await ue(_(),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 h`
|
|
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{Ct as t,Et as n,Ot as
|
|
|
347
347
|
>
|
|
348
348
|
${e.label()}
|
|
349
349
|
</button>
|
|
350
|
-
`}getFontSizeRangeProgress(e){return(e-
|
|
350
|
+
`}getFontSizeRangeProgress(e){return(e-w.min)/(w.max-w.min)*100}renderFontSizeSlider(e,t,n,r){return h`
|
|
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?h`<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{Ct as t,Et as n,Ot as
|
|
|
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(w.min)}
|
|
366
|
+
max=${String(w.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{Ct as t,Et as n,Ot as
|
|
|
371
371
|
/>
|
|
372
372
|
</div>
|
|
373
373
|
</div>
|
|
374
|
-
`}render(){return this.loading?
|
|
374
|
+
`}render(){return this.loading?h`<div class="text-sm text-muted-foreground">${D(`loading`)}</div>`:h`
|
|
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{Ct as t,Et as n,Ot as
|
|
|
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
|
+
${Ne.map(e=>this.renderThemeOption(e))}
|
|
388
388
|
</div>
|
|
389
389
|
</div>
|
|
390
390
|
</div>
|
|
@@ -394,13 +394,13 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ct as t,Et as n,Ot as
|
|
|
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?h`<span class="quickforge-settings-error">${this.error}</span>`:null}
|
|
398
398
|
</div>
|
|
399
|
-
`}},
|
|
399
|
+
`}},M=`quickforge-appearance-settings-tab`;customElements.get(M)||customElements.define(M,Pe);function Fe(){return document.createElement(M)}var Ie=`auto-compact-settings`,N={enabled:!0,thresholdPercent:80,keepRecentTurns:3,minSourceChars:1600,requireConfirmation:!0};function P(e,t,n,r){let i=Number(e);return Number.isFinite(i)?Math.min(r,Math.max(n,Math.round(i))):t}function Le(e){if(!e||typeof e!=`object`)return{...N};let t=e;return{enabled:t.enabled!==!1,thresholdPercent:P(t.thresholdPercent,N.thresholdPercent,50,95),keepRecentTurns:P(t.keepRecentTurns,N.keepRecentTurns,1,20),minSourceChars:P(t.minSourceChars,N.minSourceChars,0,2e5),requireConfirmation:t.requireConfirmation!==!1}}async function Re(e){return Le(await e.settings.get(Ie))}async function ze(e,t){await e.settings.set(Ie,Le(t))}var Be=`auto-archive-settings`,Ve={enabled:!1};function He(e){return!e||typeof e!=`object`?{...Ve}:{enabled:e.enabled===!0}}async function Ue(e){return He(await e.settings.get(Be))}async function We(e,t){await e.settings.set(Be,He(t))}var Ge=[{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`)}],Ke=[{value:`compact`,label:()=>D(`toolDisplayCompact`)},{value:`detailed`,label:()=>D(`toolDisplayDetailed`)}],F=`__custom__`;function qe(e){return(e??``).trim().replace(/\/$/,``)}function I(e){return JSON.stringify([e.provider,e.id,e.api,qe(e.baseUrl)])}function Je(e){return`${e.provider} / ${e.id}`}function Ye(){return`custom_${globalThis.crypto?.randomUUID?.().slice(0,8)||Date.now().toString(36)}`}function Xe(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 Ze=h`
|
|
400
400
|
<svg class="size-3.5" viewBox="0 0 16 16" fill="none" aria-hidden="true">
|
|
401
401
|
<path d="M4.5 4.5 11.5 11.5M11.5 4.5 4.5 11.5" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" />
|
|
402
402
|
</svg>
|
|
403
|
-
`,Qe=class extends
|
|
403
|
+
`,Qe=class extends g{models=[];selectedModel;thinkingLevel=`off`;toolDisplayMode=`compact`;showContextUsage=!1;autoCompactEnabled=!0;autoCompactRequireConfirmation=!0;autoCompactThresholdPercent=80;autoCompactThresholdPercentInput=`80`;autoCompactKeepRecentTurns=3;autoArchiveEnabled=!1;selectedLanguage=he();loading=!0;saved=!1;savedMessage=``;error=``;terminalShellConfig={terminalShell:`auto`,defaultProfileId:`auto`,profiles:[]};customShellCommand=``;customShellEditorOpen=!1;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);let r=this.querySelector(`[data-terminal-shell-select]`);r&&(r.value=this.customShellEditorOpen?F:this.selectedTerminalShellProfileId())}async loadSettings(){this.loading=!0,this.error=``,this.requestUpdate();try{let e=_(),[t,n,r,i,a]=await Promise.all([Ce(e),ge(e),fe(e),Re(e),Ue(e)]);this.models=t,this.selectedModel=n.model?t.find(e=>I(e)===I(n.model))??n.model:t[0],this.thinkingLevel=n.thinkingLevel??Se(this.selectedModel),this.toolDisplayMode=r.toolDisplayMode,this.showContextUsage=r.showContextUsage,this.autoCompactEnabled=i.enabled,this.autoCompactRequireConfirmation=i.requireConfirmation,this.autoCompactThresholdPercent=i.thresholdPercent,this.autoCompactThresholdPercentInput=String(i.thresholdPercent),this.autoCompactKeepRecentTurns=i.keepRecentTurns,this.autoArchiveEnabled=a.enabled,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=Se(t),this.saved=!1,this.requestUpdate(),this.saveDefaultModelOptions()}updateThinkingLevel(e){this.thinkingLevel=Ge.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 ye(_(),this.selectedLanguage)}updateToolDisplayMode(e){this.toolDisplayMode!==e&&(this.toolDisplayMode=e,this.saved=!1,this.requestUpdate(),this.saveToolDisplayOptions())}updateShowContextUsage(e){this.showContextUsage=e,this.saved=!1,this.requestUpdate(),this.saveToolDisplayOptions()}updateAutoCompactEnabled(e){this.autoCompactEnabled=e,this.saved=!1,this.requestUpdate(),this.saveAutoCompactOptions()}updateAutoCompactRequireConfirmation(e){this.autoCompactRequireConfirmation=e,this.saved=!1,this.requestUpdate(),this.saveAutoCompactOptions()}updateAutoArchiveEnabled(e){this.autoArchiveEnabled=e,this.saved=!1,this.requestUpdate(),this.saveAutoArchiveOptions()}updateAutoCompactThresholdPercent(e){this.autoCompactThresholdPercentInput=e;let t=Number(e);e!==``&&Number.isFinite(t)&&(this.autoCompactThresholdPercent=t),this.saved=!1,this.requestUpdate()}updateAutoCompactKeepRecentTurns(e){this.autoCompactKeepRecentTurns=Number(e)||3,this.saved=!1,this.requestUpdate()}commitAutoCompactThresholdPercent(){let e=Number(this.autoCompactThresholdPercentInput);if(!Number.isFinite(e)){this.autoCompactThresholdPercentInput=String(this.autoCompactThresholdPercent),this.requestUpdate();return}let t=Math.max(50,Math.min(95,Math.round(e)));this.autoCompactThresholdPercent=t,this.autoCompactThresholdPercentInput=String(t),this.requestUpdate(),this.saveAutoCompactOptions()}commitAutoCompactKeepRecentTurns(){let e=Math.max(1,Math.min(20,Math.round(this.autoCompactKeepRecentTurns||3)));this.autoCompactKeepRecentTurns=e,this.requestUpdate(),this.saveAutoCompactOptions()}markSaved(e=D(`defaultOptionsSaved`)){this.saved=!0,this.savedMessage=e,this.error=``,this.requestUpdate()}customShellProfiles(){return this.terminalShellConfig.profiles.filter(e=>!e.builtin)}selectedTerminalShellProfileId(){let e=this.terminalShellConfig.profiles;return e.some(e=>e.id===this.terminalShellConfig.defaultProfileId)?this.terminalShellConfig.defaultProfileId:e[0]?.id||F}updateTerminalShellSelection(e){if(e===F){this.customShellEditorOpen=!0,this.requestUpdate();return}this.customShellEditorOpen=!1,this.requestUpdate(),this.saveTerminalShellConfig(e)}async loadTerminalShell(){try{let e=await fetch(`/api/system/terminal-shell`,{cache:`no-store`}),t=await e.json().catch(()=>null);if(!e.ok)throw Error(t?.error||D(`requestFailed`));this.terminalShellConfig={terminalShell:t?.terminalShell||`auto`,defaultProfileId:t?.defaultProfileId||`auto`,profiles:Array.isArray(t?.profiles)?t.profiles:[]}}catch(e){this.error=e instanceof Error?e.message:D(`requestFailed`)}}async saveTerminalShellConfig(e,t=this.customShellProfiles(),n=D(`terminalShellSaved`)){try{let r=await fetch(`/api/system/terminal-shell`,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify({defaultProfileId:e,profiles:t})}),i=await r.json().catch(()=>null);if(!r.ok)throw Error(i?.error||D(`requestFailed`));this.terminalShellConfig=i,this.markSaved(n)}catch(e){this.error=e instanceof Error?e.message:D(`requestFailed`),this.requestUpdate()}}async addCustomTerminalShell(){let e=this.customShellCommand.trim();if(!e){this.error=D(`terminalShellProfileRequired`),this.requestUpdate();return}let t={id:Ye(),name:Xe(e),command:e,builtin:!1},n=[...this.customShellProfiles(),t];this.customShellCommand=``,this.customShellEditorOpen=!1,await this.saveTerminalShellConfig(t.id,n,D(`terminalShellProfilesSaved`))}async deleteCustomTerminalShell(e){let t=this.terminalShellConfig.profiles.find(t=>t.id===e);if(!t||t.builtin||!await 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 _e(_(),{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(_(),{toolDisplayMode:this.toolDisplayMode,showContextUsage:this.showContextUsage}),this.markSaved()}catch(e){this.error=e instanceof Error?e.message:D(`requestFailed`),this.requestUpdate()}}async saveAutoCompactOptions(){try{await ze(_(),{enabled:this.autoCompactEnabled,thresholdPercent:this.autoCompactThresholdPercent,keepRecentTurns:this.autoCompactKeepRecentTurns,minSourceChars:1600,requireConfirmation:this.autoCompactRequireConfirmation}),this.markSaved()}catch(e){this.error=e instanceof Error?e.message:D(`requestFailed`),this.requestUpdate()}}async saveAutoArchiveOptions(){try{if(await We(_(),{enabled:this.autoArchiveEnabled}),this.markSaved(D(`autoArchiveSaved`)),typeof BroadcastChannel<`u`)try{let e=new BroadcastChannel(`quickforge-sync`);e.postMessage({type:`settings-changed`,sourceTabId:`default-options-settings-tab`,timestamp:Date.now()}),e.close()}catch{}}catch(e){this.error=e instanceof Error?e.message:D(`requestFailed`),this.requestUpdate()}}modelOptions(){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]}terminalShellSettings(){let e=this.terminalShellConfig.profiles,t=this.selectedTerminalShellProfileId(),n=e.find(e=>e.id===t),r=this.customShellEditorOpen||e.length===0;return h`
|
|
404
404
|
<section class="quickforge-settings-section" aria-label=${D(`terminalShell`)}>
|
|
405
405
|
<div class="quickforge-settings-row">
|
|
406
406
|
<div class="quickforge-settings-row-main">
|
|
@@ -420,10 +420,10 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ct as t,Et as n,Ot as
|
|
|
420
420
|
aria-label=${D(`terminalShellDefault`)}
|
|
421
421
|
@change=${e=>this.updateTerminalShellSelection(e.target.value)}
|
|
422
422
|
>
|
|
423
|
-
${e.map(e=>
|
|
423
|
+
${e.map(e=>h`<option value=${e.id}>${e.name}</option>`)}
|
|
424
424
|
<option value=${F}>${D(`terminalShellCustomOption`)}</option>
|
|
425
425
|
</select>
|
|
426
|
-
${n&&!n.builtin&&!r?
|
|
426
|
+
${n&&!n.builtin&&!r?h`
|
|
427
427
|
<button
|
|
428
428
|
class="quickforge-settings-icon-action quickforge-settings-icon-action-danger"
|
|
429
429
|
type="button"
|
|
@@ -437,7 +437,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ct as t,Et as n,Ot as
|
|
|
437
437
|
</div>
|
|
438
438
|
</div>
|
|
439
439
|
|
|
440
|
-
${r?
|
|
440
|
+
${r?h`
|
|
441
441
|
<div class="quickforge-settings-row">
|
|
442
442
|
<div class="quickforge-settings-row-main">
|
|
443
443
|
<div class="quickforge-settings-row-title">${D(`terminalShellCommand`)}</div>
|
|
@@ -464,7 +464,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ct as t,Et as n,Ot as
|
|
|
464
464
|
</div>
|
|
465
465
|
`:null}
|
|
466
466
|
</section>
|
|
467
|
-
`}renderToolDisplayModeOption(e){let t=this.toolDisplayMode===e.value;return
|
|
467
|
+
`}renderToolDisplayModeOption(e){let t=this.toolDisplayMode===e.value;return h`
|
|
468
468
|
<button
|
|
469
469
|
type="button"
|
|
470
470
|
class="quickforge-settings-segmented-option ${t?`quickforge-settings-segmented-option-active`:``}"
|
|
@@ -473,7 +473,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ct as t,Et as n,Ot as
|
|
|
473
473
|
>
|
|
474
474
|
${e.label()}
|
|
475
475
|
</button>
|
|
476
|
-
`}renderSwitch(e,t,n=!1){return
|
|
476
|
+
`}renderSwitch(e,t,n=!1){return h`
|
|
477
477
|
<label class="quickforge-settings-switch" aria-disabled=${n?`true`:`false`}>
|
|
478
478
|
<input
|
|
479
479
|
type="checkbox"
|
|
@@ -483,7 +483,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ct as t,Et as n,Ot as
|
|
|
483
483
|
/>
|
|
484
484
|
<span aria-hidden="true"></span>
|
|
485
485
|
</label>
|
|
486
|
-
`}render(){return this.loading?
|
|
486
|
+
`}render(){return this.loading?h`<div class="text-sm text-muted-foreground">${D(`loading`)}</div>`:h`
|
|
487
487
|
<div class="quickforge-settings-stack">
|
|
488
488
|
<section class="quickforge-settings-section" aria-label=${D(`defaultOptions`)}>
|
|
489
489
|
<div class="quickforge-settings-row">
|
|
@@ -519,7 +519,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ct as t,Et as n,Ot as
|
|
|
519
519
|
.value=${this.selectedModel?I(this.selectedModel):``}
|
|
520
520
|
@change=${e=>this.updateModel(e.target.value)}
|
|
521
521
|
>
|
|
522
|
-
${this.modelOptions().length===0?
|
|
522
|
+
${this.modelOptions().length===0?h`<option value="">${D(`noModelAvailable`)}</option>`:this.modelOptions().map(e=>h`
|
|
523
523
|
<option .value=${I(e)}>${Je(e)}</option>
|
|
524
524
|
`)}
|
|
525
525
|
</select>
|
|
@@ -541,7 +541,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ct as t,Et as n,Ot as
|
|
|
541
541
|
?disabled=${!this.selectedModel?.reasoning}
|
|
542
542
|
@change=${e=>this.updateThinkingLevel(e.target.value)}
|
|
543
543
|
>
|
|
544
|
-
${Ge.map(e=>
|
|
544
|
+
${Ge.map(e=>h`
|
|
545
545
|
<option .value=${e.value}>${e.label()}</option>
|
|
546
546
|
`)}
|
|
547
547
|
</select>
|
|
@@ -660,10 +660,10 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ct as t,Et as n,Ot as
|
|
|
660
660
|
|
|
661
661
|
${this.terminalShellSettings()}
|
|
662
662
|
|
|
663
|
-
${this.saved?
|
|
664
|
-
${this.error?
|
|
663
|
+
${this.saved?h`<div class="quickforge-settings-message">${this.savedMessage||D(`defaultOptionsSaved`)}</div>`:null}
|
|
664
|
+
${this.error?h`<div class="quickforge-settings-alert">${this.error}</div>`:null}
|
|
665
665
|
</div>
|
|
666
|
-
`}},L=`quickforge-default-options-settings-tab`;customElements.get(L)||customElements.define(L,Qe);function $e(){return document.createElement(L)}var et=`memory-settings`,tt={enabled:!0};function nt(e){return!e||typeof e!=`object`?{...tt}:{enabled:e.enabled!==!1}}async function rt(e){return nt(await e.settings.get(et))}async function it(e,t){await e.settings.set(et,nt(t))}var at=class extends
|
|
666
|
+
`}},L=`quickforge-default-options-settings-tab`;customElements.get(L)||customElements.define(L,Qe);function $e(){return document.createElement(L)}var et=`memory-settings`,tt={enabled:!0};function nt(e){return!e||typeof e!=`object`?{...tt}:{enabled:e.enabled!==!1}}async function rt(e){return nt(await e.settings.get(et))}async function it(e,t){await e.settings.set(et,nt(t))}var at=class extends g{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([rt(_()),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 it(_(),{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 h`
|
|
667
667
|
<label class="quickforge-settings-switch" aria-disabled=${this.saving?`true`:`false`}>
|
|
668
668
|
<input
|
|
669
669
|
type="checkbox"
|
|
@@ -673,7 +673,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ct as t,Et as n,Ot as
|
|
|
673
673
|
/>
|
|
674
674
|
<span aria-hidden="true"></span>
|
|
675
675
|
</label>
|
|
676
|
-
`}render(){if(this.loading)return
|
|
676
|
+
`}render(){if(this.loading)return h`<div class="text-sm text-muted-foreground">${D(`loading`)}</div>`;let e=this.markdown!==this.savedMarkdown,t=this.saving||this.loadingDocument;return h`
|
|
677
677
|
<div class="quickforge-settings-stack">
|
|
678
678
|
<section class="quickforge-settings-section" aria-label=${D(`memory`)}>
|
|
679
679
|
<div class="quickforge-settings-row">
|
|
@@ -730,10 +730,10 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ct as t,Et as n,Ot as
|
|
|
730
730
|
<div class="quickforge-settings-note">${D(`memoryCurrentSessionNote`)}</div>
|
|
731
731
|
</section>
|
|
732
732
|
|
|
733
|
-
${this.message?
|
|
734
|
-
${this.error?
|
|
733
|
+
${this.message?h`<div class="quickforge-settings-message">${this.message}</div>`:null}
|
|
734
|
+
${this.error?h`<div class="quickforge-settings-alert">${this.error}</div>`:null}
|
|
735
735
|
</div>
|
|
736
|
-
`}},R=`quickforge-memory-settings-tab`;customElements.get(R)||customElements.define(R,at);function ot(){return document.createElement(R)}var st=`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:`
|
|
736
|
+
`}},R=`quickforge-memory-settings-tab`;customElements.get(R)||customElements.define(R,at);function ot(){return document.createElement(R)}var st=`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:`scheduledTasks`,countKey:`scheduledTasks`,label:()=>D(`restoreScheduledTasks`),description:()=>D(`restoreScheduledTasksDescription`)}],ct=z;function lt(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 ut(){return new Date().toISOString().replace(/[:.]/g,`-`)}function dt(e){return e?Object.entries(e).map(([e,t])=>`${e}: ${t}`).join(`, `):``}function ft(e){return ct.filter(t=>(e.sections?.[t.countKey]??0)>0)}function pt(e){return ft(e).map(e=>e.id)}function mt(e){return e instanceof RangeError||e instanceof Error&&e.message.includes(`Invalid string length`)}function B(e,t){return mt(e)?D(`backupStringTooLarge`):e instanceof Error?e.message:t}var ht=class extends g{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`));lt(`${st}-settings-${ut()}.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(pt(t));this.pendingImport={backup:null,importToken:t.importToken,inspect:t,selectedSections:n,mode:`replace`},this.message=t.ignoredConversations?D(`backupInspectedWithIgnoredConversations`):D(`backupInspected`)}catch(e){this.error=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=dt(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 h`
|
|
737
737
|
<label class="quickforge-settings-switch" aria-disabled=${n?`true`:`false`}>
|
|
738
738
|
<input
|
|
739
739
|
type="checkbox"
|
|
@@ -743,7 +743,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ct as t,Et as n,Ot as
|
|
|
743
743
|
/>
|
|
744
744
|
<span aria-hidden="true"></span>
|
|
745
745
|
</label>
|
|
746
|
-
`}renderPendingImport(){if(!this.pendingImport)return null;let{inspect:e,selectedSections:t}=this.pendingImport,n=ft(e);return
|
|
746
|
+
`}renderPendingImport(){if(!this.pendingImport)return null;let{inspect:e,selectedSections:t}=this.pendingImport,n=ft(e);return h`
|
|
747
747
|
<section class="quickforge-settings-section" aria-label=${D(`backupInspectTitle`)}>
|
|
748
748
|
<div class="quickforge-settings-row quickforge-settings-row-top">
|
|
749
749
|
<div class="quickforge-settings-row-main">
|
|
@@ -779,16 +779,16 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ct as t,Et as n,Ot as
|
|
|
779
779
|
</div>
|
|
780
780
|
</div>
|
|
781
781
|
|
|
782
|
-
${e.warnings?.length?
|
|
782
|
+
${e.warnings?.length?h`
|
|
783
783
|
<div class="quickforge-settings-warning quickforge-settings-warning-attached">
|
|
784
|
-
${e.warnings.map(e=>
|
|
784
|
+
${e.warnings.map(e=>h`<div>⚠ ${e}</div>`)}
|
|
785
785
|
</div>
|
|
786
786
|
`:null}
|
|
787
787
|
|
|
788
|
-
${e.invalidSections&&Object.keys(e.invalidSections).length?
|
|
788
|
+
${e.invalidSections&&Object.keys(e.invalidSections).length?h`
|
|
789
789
|
<div class="quickforge-settings-warning quickforge-settings-warning-attached">
|
|
790
790
|
<div>${D(`backupInvalidSections`)}</div>
|
|
791
|
-
${Object.entries(e.invalidSections).map(([e,t])=>
|
|
791
|
+
${Object.entries(e.invalidSections).map(([e,t])=>h`<div>${e}: ${t}</div>`)}
|
|
792
792
|
</div>
|
|
793
793
|
`:null}
|
|
794
794
|
|
|
@@ -828,7 +828,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ct as t,Et as n,Ot as
|
|
|
828
828
|
</div>
|
|
829
829
|
</div>
|
|
830
830
|
<div class="quickforge-settings-nested-list">
|
|
831
|
-
${n.map(n=>
|
|
831
|
+
${n.map(n=>h`
|
|
832
832
|
<div class="quickforge-settings-subrow">
|
|
833
833
|
<div class="quickforge-settings-row-main">
|
|
834
834
|
<div class="quickforge-settings-row-title">${n.label()} (${e.sections?.[n.countKey]??0})</div>
|
|
@@ -866,7 +866,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ct as t,Et as n,Ot as
|
|
|
866
866
|
</div>
|
|
867
867
|
</div>
|
|
868
868
|
</section>
|
|
869
|
-
`}render(){return
|
|
869
|
+
`}render(){return h`
|
|
870
870
|
<div class="quickforge-settings-stack">
|
|
871
871
|
<section class="quickforge-settings-section" aria-label=${D(`exportData`)}>
|
|
872
872
|
<div class="quickforge-settings-row quickforge-settings-row-top">
|
|
@@ -880,7 +880,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ct as t,Et as n,Ot as
|
|
|
880
880
|
</div>
|
|
881
881
|
|
|
882
882
|
<div class="quickforge-settings-nested-list">
|
|
883
|
-
${z.map(e=>
|
|
883
|
+
${z.map(e=>h`
|
|
884
884
|
<div class="quickforge-settings-subrow">
|
|
885
885
|
<div class="quickforge-settings-row-main">
|
|
886
886
|
<div class="quickforge-settings-row-title">${e.label()}</div>
|
|
@@ -938,11 +938,11 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ct as t,Et as n,Ot as
|
|
|
938
938
|
</section>
|
|
939
939
|
|
|
940
940
|
${this.renderPendingImport()}
|
|
941
|
-
${this.message?
|
|
942
|
-
${this.safetyBackupPath?
|
|
943
|
-
${this.error?
|
|
941
|
+
${this.message?h`<div class="quickforge-settings-message">${this.message}</div>`:null}
|
|
942
|
+
${this.safetyBackupPath?h`<div class="quickforge-settings-note">${D(`backupSafetyBackupPath`)}: <code>${this.safetyBackupPath}</code></div>`:null}
|
|
943
|
+
${this.error?h`<div class="quickforge-settings-alert">${this.error}</div>`:null}
|
|
944
944
|
</div>
|
|
945
|
-
`}},V=`quickforge-backup-settings-tab`;customElements.get(V)||customElements.define(V,ht);function gt(){return document.createElement(V)}function _t(e){if(!e)return`-`;let t=new Date(e);return Number.isNaN(t.getTime())?e:t.toLocaleString(
|
|
945
|
+
`}},V=`quickforge-backup-settings-tab`;customElements.get(V)||customElements.define(V,ht);function gt(){return document.createElement(V)}function _t(e){if(!e)return`-`;let t=new Date(e);return Number.isNaN(t.getTime())?e:t.toLocaleString(Ee())}function vt(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 yt=class extends g{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=_(),n=await t.sessions.get(e),r=await t.sessions.getMetadata(e);if(!n||!r)throw Error(D(`sessionNotFound`));await t.sessions.save(vt(n),vt(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 _().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=_();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 h`
|
|
946
946
|
<div class="border-t border-border px-4 py-3 first:border-t-0">
|
|
947
947
|
<div class="flex items-start justify-between gap-3">
|
|
948
948
|
<div class="min-w-0">
|
|
@@ -971,7 +971,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ct as t,Et as n,Ot as
|
|
|
971
971
|
</div>
|
|
972
972
|
</div>
|
|
973
973
|
</div>
|
|
974
|
-
`}render(){let e=this.groupedSessions();return
|
|
974
|
+
`}render(){let e=this.groupedSessions();return h`
|
|
975
975
|
<div class="flex flex-col gap-4">
|
|
976
976
|
<div class="flex justify-end">
|
|
977
977
|
<button
|
|
@@ -1000,17 +1000,17 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ct as t,Et as n,Ot as
|
|
|
1000
1000
|
>
|
|
1001
1001
|
<option value="all">${D(`allProjects`)}</option>
|
|
1002
1002
|
<option value="global">${D(`normalChat`)}</option>
|
|
1003
|
-
${this.projects.map(e=>
|
|
1003
|
+
${this.projects.map(e=>h`<option value=${e.id}>${e.name}</option>`)}
|
|
1004
1004
|
</select>
|
|
1005
1005
|
</div>
|
|
1006
1006
|
|
|
1007
|
-
${this.loading?
|
|
1007
|
+
${this.loading?h`
|
|
1008
1008
|
<div class="px-4 py-8 text-center text-sm text-muted-foreground">${D(`loading`)}</div>
|
|
1009
|
-
`:e.length===0?
|
|
1009
|
+
`:e.length===0?h`
|
|
1010
1010
|
<div class="px-4 py-8 text-center text-sm text-muted-foreground">${D(`noArchivedConversations`)}</div>
|
|
1011
|
-
`:
|
|
1011
|
+
`:h`
|
|
1012
1012
|
<div>
|
|
1013
|
-
${e.map(([e,t])=>
|
|
1013
|
+
${e.map(([e,t])=>h`
|
|
1014
1014
|
<div class="border-b border-border last:border-b-0">
|
|
1015
1015
|
<div class="flex items-center justify-between gap-3 bg-muted/20 px-4 py-2 text-sm text-muted-foreground">
|
|
1016
1016
|
<div class="truncate">${this.projectLabel(e)}</div>
|
|
@@ -1023,10 +1023,10 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ct as t,Et as n,Ot as
|
|
|
1023
1023
|
`}
|
|
1024
1024
|
</section>
|
|
1025
1025
|
|
|
1026
|
-
${this.message?
|
|
1027
|
-
${this.error?
|
|
1026
|
+
${this.message?h`<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}
|
|
1027
|
+
${this.error?h`<div class="rounded-md border border-destructive/30 bg-destructive/10 px-3 py-2 text-sm text-destructive">${this.error}</div>`:null}
|
|
1028
1028
|
</div>
|
|
1029
|
-
`}},U=`quickforge-archived-conversations-settings-tab`;customElements.get(U)||customElements.define(U,yt);function bt(){return document.createElement(U)}function xt(){return Array.from({length:16},()=>`ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz23456789!@#$%^&*`[Math.floor(Math.random()*65)]).join(``)}var St=class extends
|
|
1029
|
+
`}},U=`quickforge-archived-conversations-settings-tab`;customElements.get(U)||customElements.define(U,yt);function bt(){return document.createElement(U)}function xt(){return Array.from({length:16},()=>`ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz23456789!@#$%^&*`[Math.floor(Math.random()*65)]).join(``)}var St=class extends g{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 h`
|
|
1030
1030
|
<label class="quickforge-settings-switch" aria-disabled=${n?`true`:`false`}>
|
|
1031
1031
|
<input
|
|
1032
1032
|
type="checkbox"
|
|
@@ -1036,7 +1036,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ct as t,Et as n,Ot as
|
|
|
1036
1036
|
/>
|
|
1037
1037
|
<span aria-hidden="true"></span>
|
|
1038
1038
|
</label>
|
|
1039
|
-
`}render(){return this.loading?
|
|
1039
|
+
`}render(){return this.loading?h`<div class="text-sm text-muted-foreground">${D(`loading`)}</div>`:h`
|
|
1040
1040
|
<div class="quickforge-settings-stack">
|
|
1041
1041
|
<div class="quickforge-settings-warning">${D(`lanAccessRiskWarning`)}</div>
|
|
1042
1042
|
|
|
@@ -1068,7 +1068,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ct as t,Et as n,Ot as
|
|
|
1068
1068
|
<div class="quickforge-settings-row-description">${D(`lanAccessUrlsDescription`)}</div>
|
|
1069
1069
|
</div>
|
|
1070
1070
|
<div class="quickforge-settings-row-control quickforge-settings-row-control-wide quickforge-settings-readonly-value">
|
|
1071
|
-
${this.lanUrls.length?this.lanUrls.map(e=>
|
|
1071
|
+
${this.lanUrls.length?this.lanUrls.map(e=>h`<div>${e}</div>`):`-`}
|
|
1072
1072
|
</div>
|
|
1073
1073
|
</div>
|
|
1074
1074
|
</section>
|
|
@@ -1138,10 +1138,10 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ct as t,Et as n,Ot as
|
|
|
1138
1138
|
</div>
|
|
1139
1139
|
</section>
|
|
1140
1140
|
|
|
1141
|
-
${this.message?
|
|
1142
|
-
${this.error?
|
|
1141
|
+
${this.message?h`<div class="quickforge-settings-message">${this.message}</div>`:null}
|
|
1142
|
+
${this.error?h`<div class="quickforge-settings-alert">${this.error}</div>`:null}
|
|
1143
1143
|
</div>
|
|
1144
|
-
`}},W=`quickforge-lan-access-settings-tab`;customElements.get(W)||customElements.define(W,St);function Ct(){return document.createElement(W)}var wt=18e4,Tt=3e4,Et=1e3,Dt=`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 Ot(e){return new Promise(t=>window.setTimeout(t,e))}var kt=[{value:`startup`,label:()=>D(`frequencyStartup`)},{value:`daily`,label:()=>D(`frequencyDaily`)},{value:`weekly`,label:()=>D(`frequencyWeekly`)},{value:`off`,label:()=>D(`frequencyOff`)}],At=class extends
|
|
1144
|
+
`}},W=`quickforge-lan-access-settings-tab`;customElements.get(W)||customElements.define(W,St);function Ct(){return document.createElement(W)}var wt=18e4,Tt=3e4,Et=1e3,Dt=`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 Ot(e){return new Promise(t=>window.setTimeout(t,e))}var kt=[{value:`startup`,label:()=>D(`frequencyStartup`)},{value:`daily`,label:()=>D(`frequencyDaily`)},{value:`weekly`,label:()=>D(`frequencyWeekly`)},{value:`off`,label:()=>D(`frequencyOff`)}],At=class extends g{about;updateInfo;loading=!0;checking=!1;updating=!1;restarting=!1;message=``;error=``;frequency=pe.frequency;lastCheckAt=null;serviceStatus;getTabName(){return D(`about`)}async connectedCallback(){super.connectedCallback(),await this.loadAbout()}async loadAbout(){this.loading=!0,this.error=``,this.requestUpdate();try{let e=await fetch(`/api/system/about`,{cache:`no-store`}),t=await e.json().catch(()=>null);if(!e.ok)throw Error(t?.error||D(`requestFailed`));this.about=t;try{let[e,t]=await Promise.all([oe(_()),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(Dt,`_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<wt;){await Ot(Et);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<Tt;){await Ot(Et);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(Dt,`_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=_();await De(t,{...await oe(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 h`
|
|
1145
1145
|
<button
|
|
1146
1146
|
type="button"
|
|
1147
1147
|
class="quickforge-settings-segmented-option ${t?`quickforge-settings-segmented-option-active`:``}"
|
|
@@ -1150,7 +1150,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ct as t,Et as n,Ot as
|
|
|
1150
1150
|
>
|
|
1151
1151
|
${e.label()}
|
|
1152
1152
|
</button>
|
|
1153
|
-
`}infoRows(){let e=this.about;return e?
|
|
1153
|
+
`}infoRows(){let e=this.about;return e?h`
|
|
1154
1154
|
<div class="quickforge-settings-row">
|
|
1155
1155
|
<div class="quickforge-settings-row-main">
|
|
1156
1156
|
<div class="quickforge-settings-row-title">${D(`packageName`)}</div>
|
|
@@ -1176,7 +1176,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ct as t,Et as n,Ot as
|
|
|
1176
1176
|
</a>
|
|
1177
1177
|
</div>
|
|
1178
1178
|
</div>
|
|
1179
|
-
`:null}updateStatus(){return this.updateInfo?
|
|
1179
|
+
`:null}updateStatus(){return this.updateInfo?h`
|
|
1180
1180
|
<div class="quickforge-settings-row">
|
|
1181
1181
|
<div class="quickforge-settings-row-main">
|
|
1182
1182
|
<div class="quickforge-settings-row-title">${D(`latestVersion`)}</div>
|
|
@@ -1184,7 +1184,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ct as t,Et as n,Ot as
|
|
|
1184
1184
|
</div>
|
|
1185
1185
|
<div class="quickforge-settings-row-control quickforge-settings-readonly-value">${this.updateInfo.latestVersion}</div>
|
|
1186
1186
|
</div>
|
|
1187
|
-
${this.updateInfo.logFile?
|
|
1187
|
+
${this.updateInfo.logFile?h`
|
|
1188
1188
|
<div class="quickforge-settings-row">
|
|
1189
1189
|
<div class="quickforge-settings-row-main">
|
|
1190
1190
|
<div class="quickforge-settings-row-title">${D(`updateLog`)}</div>
|
|
@@ -1195,7 +1195,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ct as t,Et as n,Ot as
|
|
|
1195
1195
|
</div>
|
|
1196
1196
|
</div>
|
|
1197
1197
|
`:null}
|
|
1198
|
-
`:null}restartSection(){let e=this.serviceStatus?.restartUnsupportedReason||D(`backendRestartUnsupported`),t=this.restarting||!this.serviceStatus?.restartSupported;return
|
|
1198
|
+
`:null}restartSection(){let e=this.serviceStatus?.restartUnsupportedReason||D(`backendRestartUnsupported`),t=this.restarting||!this.serviceStatus?.restartSupported;return h`
|
|
1199
1199
|
<section class="quickforge-settings-section" aria-label=${D(`restartBackendService`)}>
|
|
1200
1200
|
<div class="quickforge-settings-row">
|
|
1201
1201
|
<div class="quickforge-settings-row-main">
|
|
@@ -1219,14 +1219,14 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ct as t,Et as n,Ot as
|
|
|
1219
1219
|
</div>
|
|
1220
1220
|
</div>
|
|
1221
1221
|
</section>
|
|
1222
|
-
`}render(){if(this.loading)return
|
|
1222
|
+
`}render(){if(this.loading)return h`<div class="text-sm text-muted-foreground">${D(`loading`)}</div>`;let e=this.checking||this.updating||!this.updateInfo?.updateAvailable,t=G();return h`
|
|
1223
1223
|
<div class="quickforge-settings-stack">
|
|
1224
1224
|
<section class="quickforge-settings-section" aria-label=${D(`projectInfo`)}>
|
|
1225
1225
|
${this.infoRows()}
|
|
1226
1226
|
</section>
|
|
1227
1227
|
|
|
1228
1228
|
<section class="quickforge-settings-section" aria-label=${D(t?`desktopUpdates`:`runtimeUpdates`)}>
|
|
1229
|
-
${t?null:
|
|
1229
|
+
${t?null:h`
|
|
1230
1230
|
<div class="quickforge-settings-row">
|
|
1231
1231
|
<div class="quickforge-settings-row-main">
|
|
1232
1232
|
<div class="quickforge-settings-row-title">
|
|
@@ -1234,7 +1234,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ct as t,Et as n,Ot as
|
|
|
1234
1234
|
<quickforge-info-tip .label=${D(`updateFrequencyDescription`)}></quickforge-info-tip>
|
|
1235
1235
|
</div>
|
|
1236
1236
|
<div class="quickforge-settings-row-description">
|
|
1237
|
-
${this.lastCheckAt?D(`lastCheckedAt`,{time:new Date(this.lastCheckAt).toLocaleString(
|
|
1237
|
+
${this.lastCheckAt?D(`lastCheckedAt`,{time:new Date(this.lastCheckAt).toLocaleString(Ee())}):D(`lastCheckedNever`)}
|
|
1238
1238
|
</div>
|
|
1239
1239
|
</div>
|
|
1240
1240
|
<div class="quickforge-settings-row-control quickforge-settings-row-control-wide">
|
|
@@ -1266,7 +1266,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ct as t,Et as n,Ot as
|
|
|
1266
1266
|
>
|
|
1267
1267
|
${this.checking?D(`checkingUpdate`):D(t?`openDesktopReleases`:`checkRuntimeUpdate`)}
|
|
1268
1268
|
</button>
|
|
1269
|
-
${t?null:
|
|
1269
|
+
${t?null:h`
|
|
1270
1270
|
<button
|
|
1271
1271
|
class="quickforge-settings-button quickforge-settings-button-primary"
|
|
1272
1272
|
type="button"
|
|
@@ -1282,15 +1282,15 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ct as t,Et as n,Ot as
|
|
|
1282
1282
|
|
|
1283
1283
|
${this.restartSection()}
|
|
1284
1284
|
|
|
1285
|
-
${this.message?
|
|
1286
|
-
${this.error?
|
|
1285
|
+
${this.message?h`<div class="quickforge-settings-message">${this.message}</div>`:null}
|
|
1286
|
+
${this.error?h`<div class="quickforge-settings-alert">${this.error}</div>`:null}
|
|
1287
1287
|
</div>
|
|
1288
|
-
`}},K=`quickforge-about-settings-tab`;customElements.get(K)||customElements.define(K,At);function jt(){return document.createElement(K)}var Mt=class extends
|
|
1288
|
+
`}},K=`quickforge-about-settings-tab`;customElements.get(K)||customElements.define(K,At);function jt(){return document.createElement(K)}var Mt=class extends g{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?h`<div class="quickforge-settings-note">${D(`loading`)}</div>`:this.projects.length===0?h`
|
|
1289
1289
|
<div class="quickforge-settings-stack">
|
|
1290
1290
|
<div class="quickforge-settings-note">${D(`selectProjectForCommands`)}</div>
|
|
1291
|
-
${this.error?
|
|
1291
|
+
${this.error?h`<div class="quickforge-settings-alert">${this.error}</div>`:null}
|
|
1292
1292
|
</div>
|
|
1293
|
-
`:
|
|
1293
|
+
`:h`
|
|
1294
1294
|
<div class="quickforge-settings-stack">
|
|
1295
1295
|
<section class="quickforge-settings-section" aria-label=${D(`projectCommands`)}>
|
|
1296
1296
|
<div class="quickforge-settings-row">
|
|
@@ -1306,7 +1306,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ct as t,Et as n,Ot as
|
|
|
1306
1306
|
.value=${this.project?.id??``}
|
|
1307
1307
|
@change=${e=>this.selectProject(e)}
|
|
1308
1308
|
>
|
|
1309
|
-
${this.projects.map(e=>
|
|
1309
|
+
${this.projects.map(e=>h`<option value=${e.id} ?selected=${e.id===this.project?.id}>${e.name}</option>`)}
|
|
1310
1310
|
</select>
|
|
1311
1311
|
</div>
|
|
1312
1312
|
</div>
|
|
@@ -1370,7 +1370,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ct as t,Et as n,Ot as
|
|
|
1370
1370
|
</div>
|
|
1371
1371
|
|
|
1372
1372
|
<div class="quickforge-settings-nested-list">
|
|
1373
|
-
${this.loadingCommands?
|
|
1373
|
+
${this.loadingCommands?h`<div class="quickforge-settings-empty-row">${D(`loading`)}</div>`:this.commands.length===0?h`<div class="quickforge-settings-empty-row">${D(`noCommandsLoaded`)}</div>`:this.commands.map(e=>{let t=e.argumentHint?` ${e.argumentHint}`:``;return h`
|
|
1374
1374
|
<div class="quickforge-settings-subrow">
|
|
1375
1375
|
<div class="quickforge-settings-row-main">
|
|
1376
1376
|
<div class="quickforge-settings-row-title">
|
|
@@ -1380,25 +1380,25 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ct as t,Et as n,Ot as
|
|
|
1380
1380
|
${e.description||D(`noDescription`)}
|
|
1381
1381
|
</div>
|
|
1382
1382
|
</div>
|
|
1383
|
-
${e.relativePath?
|
|
1383
|
+
${e.relativePath?h`<div class="quickforge-settings-row-control quickforge-settings-row-control-wide quickforge-settings-readonly-value">${e.relativePath}</div>`:null}
|
|
1384
1384
|
</div>
|
|
1385
1385
|
`})}
|
|
1386
1386
|
</div>
|
|
1387
1387
|
</section>
|
|
1388
1388
|
|
|
1389
|
-
${this.saving?
|
|
1390
|
-
${this.saved?
|
|
1391
|
-
${this.message?
|
|
1392
|
-
${this.error?
|
|
1389
|
+
${this.saving?h`<div class="quickforge-settings-note">${D(`saving`)}</div>`:null}
|
|
1390
|
+
${this.saved?h`<div class="quickforge-settings-message">${D(`projectCommandsSaved`)}</div>`:null}
|
|
1391
|
+
${this.message?h`<div class="quickforge-settings-message">${this.message}</div>`:null}
|
|
1392
|
+
${this.error?h`<div class="quickforge-settings-alert">${this.error}</div>`:null}
|
|
1393
1393
|
</div>
|
|
1394
|
-
`}},q=`quickforge-project-commands-settings-tab`;customElements.get(q)||customElements.define(q,Mt);function Nt(){return document.createElement(q)}var J={"x-quickforge-action":`channel-action`};function Pt(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 Ft(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 It(e){if(!e)return`-`;let t=new Date(e);return Number.isNaN(t.getTime())?e:t.toLocaleString()}var Lt=class extends
|
|
1394
|
+
`}},q=`quickforge-project-commands-settings-tab`;customElements.get(q)||customElements.define(q,Mt);function Nt(){return document.createElement(q)}var J={"x-quickforge-action":`channel-action`};function Pt(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 Ft(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 It(e){if(!e)return`-`;let t=new Date(e);return Number.isNaN(t.getTime())?e:t.toLocaleString()}var Lt=class extends g{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 h`
|
|
1395
1395
|
<div class="quickforge-settings-row quickforge-settings-row-align-start">
|
|
1396
1396
|
<div class="quickforge-settings-row-main">
|
|
1397
1397
|
<div class="quickforge-settings-row-title">
|
|
1398
1398
|
${D(`channelWorkspace`)}
|
|
1399
1399
|
<quickforge-info-tip .label=${D(`channelWorkspaceDescription`)}></quickforge-info-tip>
|
|
1400
1400
|
</div>
|
|
1401
|
-
${r?
|
|
1401
|
+
${r?h`<div class="quickforge-settings-row-description">${D(`channelCurrentWorkspace`)}: <span class="quickforge-settings-mono">${r.path}</span></div>`:h`<div class="quickforge-settings-row-description">${D(`channelWorkspaceDescription`)}</div>`}
|
|
1402
1402
|
</div>
|
|
1403
1403
|
<div class="quickforge-settings-row-control quickforge-settings-row-control-wide">
|
|
1404
1404
|
<select
|
|
@@ -1407,15 +1407,15 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ct as t,Et as n,Ot as
|
|
|
1407
1407
|
.value=${n}
|
|
1408
1408
|
@change=${t=>this.handleWorkspaceChange(e,t)}
|
|
1409
1409
|
>
|
|
1410
|
-
${this.workspaces.map(e=>
|
|
1410
|
+
${this.workspaces.map(e=>h`
|
|
1411
1411
|
<option value=${e.id}>${e.kind===`default`?D(`channelDefaultWorkspace`):e.name} — ${e.path}</option>
|
|
1412
1412
|
`)}
|
|
1413
1413
|
</select>
|
|
1414
1414
|
</div>
|
|
1415
1415
|
</div>
|
|
1416
|
-
`}channelMeta(e){return
|
|
1416
|
+
`}channelMeta(e){return h`
|
|
1417
1417
|
<div class="quickforge-settings-nested-list">
|
|
1418
|
-
${[[D(`channelProvider`),e.provider||`-`],[D(`channelCommand`),e.commandLabel||`-`],[D(`channelPid`),e.pid?String(e.pid):`-`],[D(`channelStartedAt`),It(e.startedAt)]].map(([e,t])=>
|
|
1418
|
+
${[[D(`channelProvider`),e.provider||`-`],[D(`channelCommand`),e.commandLabel||`-`],[D(`channelPid`),e.pid?String(e.pid):`-`],[D(`channelStartedAt`),It(e.startedAt)]].map(([e,t])=>h`
|
|
1419
1419
|
<div class="quickforge-settings-subrow">
|
|
1420
1420
|
<div class="quickforge-settings-row-main">
|
|
1421
1421
|
<div class="quickforge-settings-row-title">${e}</div>
|
|
@@ -1424,7 +1424,7 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ct as t,Et as n,Ot as
|
|
|
1424
1424
|
</div>
|
|
1425
1425
|
`)}
|
|
1426
1426
|
</div>
|
|
1427
|
-
`}qrSection(e){return!e.qrCodeText&&!e.qrCodeUrl&&e.status!==`waiting_scan`?null:
|
|
1427
|
+
`}qrSection(e){return!e.qrCodeText&&!e.qrCodeUrl&&e.status!==`waiting_scan`?null:h`
|
|
1428
1428
|
<div class="quickforge-settings-row quickforge-settings-row-align-start">
|
|
1429
1429
|
<div class="quickforge-settings-row-main">
|
|
1430
1430
|
<div class="quickforge-settings-row-title">
|
|
@@ -1432,28 +1432,28 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ct as t,Et as n,Ot as
|
|
|
1432
1432
|
<quickforge-info-tip .label=${D(`channelQrDescription`)}></quickforge-info-tip>
|
|
1433
1433
|
</div>
|
|
1434
1434
|
<div class="quickforge-settings-row-description">${D(`channelQrDescription`)}</div>
|
|
1435
|
-
${e.qrCodeUrl?
|
|
1435
|
+
${e.qrCodeUrl?h`
|
|
1436
1436
|
<div class="quickforge-settings-meta">
|
|
1437
1437
|
<a class="quickforge-settings-link quickforge-settings-mono" href=${e.qrCodeUrl} target="_blank" rel="noreferrer">${e.qrCodeUrl}</a>
|
|
1438
1438
|
</div>
|
|
1439
1439
|
`:null}
|
|
1440
1440
|
</div>
|
|
1441
|
-
${e.qrCodeText?
|
|
1441
|
+
${e.qrCodeText?h`<pre class="quickforge-channel-qr-text">${e.qrCodeText}</pre>`:null}
|
|
1442
1442
|
</div>
|
|
1443
|
-
`}logsSection(e){let t=e.logs||[];return
|
|
1443
|
+
`}logsSection(e){let t=e.logs||[];return h`
|
|
1444
1444
|
<details class="quickforge-channel-logs" open>
|
|
1445
1445
|
<summary class="quickforge-channel-logs-summary">${D(`channelRecentLogs`)}</summary>
|
|
1446
1446
|
<div class="quickforge-channel-logs-body">
|
|
1447
|
-
${t.length?t.slice(-80).map(e=>
|
|
1447
|
+
${t.length?t.slice(-80).map(e=>h`
|
|
1448
1448
|
<div class="quickforge-channel-log-row">
|
|
1449
1449
|
<span class="text-muted-foreground/55">${new Date(e.time).toLocaleTimeString()}</span>
|
|
1450
1450
|
<span class=${e.stream===`stderr`?`text-destructive/80`:`text-muted-foreground/70`}>${e.stream}</span>
|
|
1451
1451
|
<span class="min-w-0 whitespace-pre-wrap break-words text-foreground/85">${e.text}</span>
|
|
1452
1452
|
</div>
|
|
1453
|
-
`):
|
|
1453
|
+
`):h`<div class="quickforge-settings-empty-row">${D(`channelNoLogs`)}</div>`}
|
|
1454
1454
|
</div>
|
|
1455
1455
|
</details>
|
|
1456
|
-
`}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
|
|
1456
|
+
`}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 h`
|
|
1457
1457
|
<section class="quickforge-settings-section" aria-label=${e.name}>
|
|
1458
1458
|
<div class="quickforge-settings-row quickforge-settings-row-top">
|
|
1459
1459
|
<div class="quickforge-settings-row-main">
|
|
@@ -1462,34 +1462,34 @@ import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Ct as t,Et as n,Ot as
|
|
|
1462
1462
|
<span class="quickforge-settings-badge ${Pt(e.status)}">${Ft(e.status)}</span>
|
|
1463
1463
|
</div>
|
|
1464
1464
|
<div class="quickforge-settings-row-description">${e.description}</div>
|
|
1465
|
-
${e.requirements?.length?
|
|
1465
|
+
${e.requirements?.length?h`<div class="quickforge-settings-row-description">${D(`channelRequirements`)}: ${e.requirements.join(` · `)}</div>`:null}
|
|
1466
1466
|
</div>
|
|
1467
1467
|
<div class="quickforge-settings-row-control quickforge-settings-row-control-wide">
|
|
1468
1468
|
<button class="quickforge-settings-button quickforge-settings-button-primary" type="button" ?disabled=${t||n||r||i} @click=${()=>this.invoke(e,`start`)}>${D(`start`)}</button>
|
|
1469
1469
|
<button class="quickforge-settings-button quickforge-settings-button-secondary" type="button" ?disabled=${t||!n||r} @click=${()=>this.invoke(e,`stop`)}>${D(`stop`)}</button>
|
|
1470
1470
|
<button class="quickforge-settings-button quickforge-settings-button-secondary" type="button" ?disabled=${t||r||i} @click=${()=>this.invoke(e,`restart`)}>${D(`restart`)}</button>
|
|
1471
|
-
${e.actions?.map(n=>
|
|
1471
|
+
${e.actions?.map(n=>h`
|
|
1472
1472
|
<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>
|
|
1473
1473
|
`)}
|
|
1474
1474
|
</div>
|
|
1475
1475
|
</div>
|
|
1476
1476
|
|
|
1477
1477
|
${this.workspaceSection(e,t||n||r)}
|
|
1478
|
-
${i?
|
|
1478
|
+
${i?h`<div class="quickforge-settings-alert quickforge-settings-warning-attached">${D(`channelNoWorkspaces`)}</div>`:null}
|
|
1479
1479
|
${this.channelMeta(e)}
|
|
1480
|
-
${e.error?
|
|
1480
|
+
${e.error?h`<div class="quickforge-settings-alert quickforge-settings-warning-attached">${e.error}</div>`:null}
|
|
1481
1481
|
${this.qrSection(e)}
|
|
1482
1482
|
${this.logsSection(e)}
|
|
1483
1483
|
</section>
|
|
1484
|
-
`}render(){return this.loading?
|
|
1484
|
+
`}render(){return this.loading?h`<div class="quickforge-settings-note">${D(`loading`)}</div>`:h`
|
|
1485
1485
|
<div class="quickforge-settings-stack">
|
|
1486
1486
|
<section class="quickforge-settings-warning">
|
|
1487
1487
|
${D(`channelsSecurityWarning`)}
|
|
1488
1488
|
</section>
|
|
1489
1489
|
|
|
1490
|
-
${this.channels.length?
|
|
1490
|
+
${this.channels.length?h`${this.channels.map(e=>this.channelCard(e))}`:h`<div class="quickforge-settings-note">${D(`channelsEmpty`)}</div>`}
|
|
1491
1491
|
|
|
1492
|
-
${this.message?
|
|
1493
|
-
${this.error?
|
|
1492
|
+
${this.message?h`<div class="quickforge-settings-message">${this.message}</div>`:null}
|
|
1493
|
+
${this.error?h`<div class="quickforge-settings-alert">${this.error}</div>`:null}
|
|
1494
1494
|
</div>
|
|
1495
|
-
`}},Y=`quickforge-channels-settings-tab`;customElements.get(Y)||customElements.define(Y,Lt);function Rt(){return document.createElement(Y)}var zt=
|
|
1495
|
+
`}},Y=`quickforge-channels-settings-tab`;customElements.get(Y)||customElements.define(Y,Lt);function Rt(){return document.createElement(Y)}var zt=ae(),X=ie(),Bt=(0,O.lazy)(()=>v(()=>import(`./AgentProfilesPage-BFgyFa5e.js`).then(e=>({default:e.AgentProfilesPage})),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11]))),Vt=(0,O.lazy)(()=>v(()=>import(`./mcp-servers-dialog-Bp6kbIup.js`).then(e=>({default:e.McpServersPanel})),__vite__mapDeps([12,1,2,3,4,5,6,7,8,9,10,11]))),Ht=(0,O.lazy)(()=>v(()=>import(`./skills-dialog-DiJAUfvW.js`).then(e=>e.n).then(e=>({default:e.SkillsManagerPanel})),__vite__mapDeps([9,1,2,3,4,5,6,7,8,10,11]))),Ut=(0,O.lazy)(()=>v(()=>import(`./PluginsPage-DEMqwhOA.js`).then(e=>({default:e.PluginsPage})),__vite__mapDeps([13,1,2,3,4,5,6,7,8,9,10,11,14]))),Wt=(0,O.lazy)(()=>v(()=>import(`./ScheduledTasksPage-DTP_gedp.js`).then(e=>({default:e.ScheduledTasksPage})),__vite__mapDeps([15,1,2,3,4,5,6,7,8,9,10,11]))),Gt=class extends g{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 h`<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,zt.createRoot)(e),this.root.render(this.renderReact()))}},Z=`quickforge-react-settings-tab`;customElements.get(Z)||customElements.define(Z,Gt);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)(O.Suspense,{fallback:(0,X.jsx)(`div`,{className:`quickforge-settings-note`,children:D(`loading`)}),children:e})})}function Kt(e){window.dispatchEvent(new CustomEvent(`quickforge:open-session-from-settings`,{detail:{sessionId:e}}))}function qt(){return Q(D(`agentsTab`),()=>(0,X.jsx)($,{children:(0,X.jsx)(Bt,{})}))}function Jt(){return Q(D(`skills`),()=>(0,X.jsx)($,{children:(0,X.jsx)(Ht,{active:!0,scope:`global`,embedded:!0,onSaved:()=>void 0})}))}function Yt(){return Q(D(`mcpServers`),()=>(0,X.jsx)($,{children:(0,X.jsx)(Vt,{active:!0})}))}function Xt(){return Q(D(`plugins`),()=>(0,X.jsx)($,{children:(0,X.jsx)(Ut,{})}))}function Zt(){return Q(D(`scheduledTasks`),()=>(0,X.jsx)($,{children:(0,X.jsx)(Wt,{onOpenSession:Kt})}))}function Qt(e){let t=[{key:`appearance`,tab:Fe(),getDescription:()=>D(`appearanceDescription`)},{key:`defaults`,tab:$e(),getDescription:()=>D(`defaultOptionsDescription`)},{key:`memory`,tab:ot(),getDescription:()=>D(`memoryDescription`)},{key:`customModels`,tab:Me(e),getDescription:()=>D(`customModelsDescription`)},{key:`agents`,tab:qt(),getDescription:()=>D(`agentsDescription`)},{key:`skills`,tab:Jt(),getDescription:()=>D(`globalSkillsDescription`)},{key:`mcp`,tab:Yt(),getDescription:void 0},{key:`plugins`,tab:Xt(),getDescription:()=>D(`pluginsDescription`)},{key:`scheduledTasks`,tab:Zt(),getDescription:()=>D(`scheduledTasksDescription`)},{key:`projectCommands`,tab:Nt(),getDescription:()=>D(`projectCommandsDescription`)},{key:`backup`,tab:gt(),getDescription:()=>D(`backupRestoreDescription`)},{key:`archivedConversations`,tab:bt(),getDescription:()=>D(`archivedConversationsDescription`)},{key:`channels`,tab:Rt(),getDescription:()=>D(`channelsDescription`)},{key:`lanAccess`,tab:Ct(),getDescription:()=>D(`lanAccessDescription`)},{key:`about`,tab:jt(),getDescription:()=>D(`aboutQuickForgeDescription`)}];return{items:[...t],tabs:t.map(e=>e.tab),indexOf:e=>t.findIndex(t=>t.key===e)}}var $t={appearance:t,defaults:f,memory:r,customModels:ne,agents:n,skills:o,mcp:d,plugins:re,scheduledTasks:c,projectCommands:m,backup:u,archivedConversations:a,channels:l,lanAccess:p,about:i};function en({tab:e}){let t=(0,O.useRef)(null);return(0,O.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 tn({initialTab:e,customProvider:t,onBack:n}){let r=(0,O.useMemo)(()=>Qt(t),[t]),i=Math.max(0,r.indexOf(e)),[a,o]=(0,O.useState)(),s=a??i,c=r.items[s]??r.items[0],l=c?.getDescription?.(),u=c?$t[c.key]:void 0,[d,f]=(0,O.useState)(``),p=d.trim().toLowerCase(),m=(0,O.useMemo)(()=>r.items.map((e,t)=>({item:e,index:t})).filter(({item:e})=>p?[e.key,e.tab.getTabName(),e.getDescription?.()??``].join(` `).toLowerCase().includes(p):!0),[r.items,p]);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)(te,{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:d,onChange:e=>f(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:[m.map(({item:e,index:t})=>{let n=t===s,r=$t[e.key];return(0,X.jsxs)(`button`,{type:`button`,className:C(`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:()=>o(t),"aria-current":n?`page`:void 0,children:[(0,X.jsx)(`span`,{className:C(`inline-flex size-5 shrink-0 items-center justify-center transition-colors`,n?`text-foreground/72`:`text-muted-foreground/52 group-hover:text-foreground/68`),children:(0,X.jsx)(r,{className:`size-4`,"aria-hidden":`true`})}),(0,X.jsx)(`span`,{className:`truncate`,children:e.tab.getTabName()})]},e.key)}),m.length===0?(0,X.jsx)(`div`,{className:`px-2 py-3 text-sm text-muted-foreground/70`,children: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-tl-2xl`,children:[(0,X.jsxs)(`header`,{className:`flex h-14 shrink-0 items-center gap-2 border-b-[0.5px] border-[color-mix(in_oklab,var(--border)_34%,transparent)] px-3 pr-4 md:px-5`,children:[(0,X.jsx)(xe,{variant:`ghost`,size:`icon`,className:`md:hidden`,onClick:n,"aria-label":`返回工作区`,children:(0,X.jsx)(te,{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:[u?(0,X.jsx)(u,{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:c?.tab.getTabName()}),l?(0,X.jsx)(ve,{label:l}):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:d,onChange:e=>f(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:[m.map(({item:e,index:t})=>{let n=t===s,r=$t[e.key];return(0,X.jsxs)(`button`,{type:`button`,className:C(`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:()=>o(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)}),m.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:c?(0,X.jsx)(en,{tab:c.tab}):null})})]})]})}export{tn as SettingsWorkspacePage};
|