ai-helper-agent 2.4.1 → 2.4.3
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/{agent-store-Ce3f4Ya3.js → agent-store-lS9vCASh.js} +1 -1
- package/dist/assets/background.js +39 -39
- package/dist/assets/{chat-export-CWSUeOo4.js → chat-export-BtpVORYa.js} +1 -1
- package/dist/assets/content.js +14 -14
- package/dist/assets/{dist-DhUTa_WT.js → dist-DuuG_8Br.js} +1 -1
- package/dist/assets/{i18n-ouMgDZ2t.js → i18n-DyM8bnfl.js} +4 -4
- package/dist/assets/jszip.min-DO6SOhXU.js +2 -0
- package/dist/assets/{lib-33nIefF6.js → lib-YwkWjNcC.js} +1 -1
- package/dist/assets/model-profiles-EyX5sKm7.js +24 -0
- package/dist/assets/options-BuHUzyz4.css +1 -0
- package/dist/assets/options.js +41 -34
- package/dist/assets/{page-snapshot-renderer-j72q92KH.js → page-snapshot-renderer-BzPoHaSD.js} +1 -1
- package/dist/assets/session-store-CzepYEnC.js +79 -0
- package/dist/assets/side_panel.css +1 -1
- package/dist/assets/side_panel.js +268 -268
- package/dist/assets/state-Dq5ubN7u.js +1 -0
- package/dist/assets/{utils-9i9g8vW8.js → utils-zobXrVjl.js} +1 -1
- package/dist/assets/{version-BrT5Y9A7.js → version-Bk266LQa.js} +1 -1
- package/dist/manifest.json +1 -1
- package/dist/offscreen/offscreen.js +4 -4
- package/dist/options.html +4 -4
- package/dist/side_panel.html +7 -6
- package/package.json +1 -1
- package/src/documents/image-extractor.js +88 -0
- package/src/documents/routes.js +72 -0
- package/src/documents/zip-reader.js +82 -0
- package/src/server.js +12 -0
- package/dist/assets/jszip.min-Bm_16osY.js +0 -2
- package/dist/assets/model-profiles-6dzdrSS4.js +0 -24
- package/dist/assets/options-Cp1UMkjK.css +0 -1
- package/dist/assets/session-store-CmGs_rhh.js +0 -76
package/dist/assets/options.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{a as e,c as t,i as n,l as r,n as i,o as a,r as o,s,t as c}from"./i18n-
|
|
1
|
+
import{a as e,c as t,i as n,l as r,n as i,o as a,r as o,s,t as c}from"./i18n-DyM8bnfl.js";import{$ as l,F as u,Q as d,Y as f,_ as p,a as m,b as h,c as g,d as _,g as v,h as y,i as b,k as x,m as ee,n as te,o as S,p as ne,r as C,s as w,t as T,u as re,v as ie,x as ae}from"./model-profiles-EyX5sKm7.js";import{n as oe}from"./network-scope-CNRYXk74.js";import{a as se,i as ce,o as le,r as ue,t as E}from"./version-Bk266LQa.js";e(`zh`,{optionsConst:{aiSearch:`AI搜索`,explain:`解释`,translate:`翻译`,summary:`总结`,copy:`复制`,defaultSystemPrompt:`AI Helper:IT技术助手。
|
|
2
2
|
|
|
3
3
|
## 能力
|
|
4
4
|
编程开发与调试(Java/Python/JavaScript/Go/C++)、架构优化、性能调优、代码审查、文档编写、浏览器工具调用
|
|
@@ -533,32 +533,32 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
533
533
|
<button class="toolbox-add-btn" id="ragInstallBtn" style="width:auto; flex:none; margin:0; padding:8px 18px; border-style:solid; color:var(--brand-500); border-color:var(--brand-500);">${t(`toolbox.ragInstallBtn`)}</button>
|
|
534
534
|
<button class="toolbox-add-btn" id="ragRedetectBtn" style="width:auto; flex:none; margin:0; padding:8px 18px;">${t(`toolbox.ragRedetectBtn`)}</button>
|
|
535
535
|
</div>`;return Dr(`📦`,t(`toolbox.ragStatusNotInstalledTitle`),t(`toolbox.ragStatusNotInstalledDesc`),c)}function kr(e){let n=!!(e&&e.trigger===`auto`),r=e&&e.phase===`verifying`?t(`toolbox.ragInstallVerifying`):t(n?`toolbox.ragAutoRestoreRunning`:`toolbox.ragInstallRunning`),i=e&&Array.isArray(e.logTail)&&e.logTail.length>0?q(e.logTail.join(`
|
|
536
|
-
`)):``,a=i?`<pre style="margin-top:12px; max-height:160px; overflow:auto; background:var(--code-bg); color:var(--code-fg); padding:10px; border-radius:6px; font-size:11px; white-space:pre-wrap; word-break:break-all;">${i}</pre>`:``;return Dr(`⏳`,r,t(`toolbox.ragInstallTip`),a)}function Ar(e){let n=document.getElementById(`ragSectionContent`);if(!n)return;let{connected:r,ragAvailable:i,nodeVersion:a,unreachable:o,install:s}=e||{};if(!r){n.innerHTML=Dr(`🔌`,t(`toolbox.ragStatusAgentOffTitle`),t(`toolbox.ragStatusAgentOffDesc`));return}if(o){n.innerHTML=Dr(`⚠️`,t(`toolbox.ragStatusUnreachableTitle`),t(`toolbox.ragStatusUnreachableDesc`));return}if(s&&s.running){n.innerHTML=kr(s);return}if(i){n.innerHTML=Dr(`✅`,t(`toolbox.ragStatusReadyTitle`),t(`toolbox.ragStatusReadyDesc`));return}if(!Er(a)){n.innerHTML=Dr(`⚠️`,t(`toolbox.ragStatusNodeLowTitle`),t(`toolbox.ragStatusNodeLowDesc`,{version:q(a||`?`)}));return}n.innerHTML=Or(s)}function jr(){br&&=(clearTimeout(br),null)}function Mr(){jr();let e=async()=>{let n=await wr();if(n&&n.running){Ar({connected:!0,ragAvailable:!1,nodeVersion:null,install:n}),br=setTimeout(e,vr);return}jr();let r=await Cr();r.connected&&!r.ragAvailable&&(r.install=n),Ar(r),n&&n.done&&(H(n.success?t(`toolbox.ragInstallSuccess`):t(`toolbox.ragInstallFailedToast`),n.success?`success`:`error`),n.success&&(Tr(),await xr?.()))};br=setTimeout(e,vr)}async function Nr(){let e=document.getElementById(`ragInstallBtn`);e&&(e.disabled=!0,e.textContent=t(`toolbox.ragInstallBtnBusy`));try{let n=await K(`POST`,`/api/rag/install`);if(!n||!n.started){H(n&&n.error?n.error:t(`toolbox.ragInstallFailedToast`),`error`);let r=await wr();if(r&&r.running){Mr();return}e&&(e.disabled=!1,e.textContent=t(`toolbox.ragInstallBtn`));return}H(t(`toolbox.ragInstallStarted`),`info`),Mr()}catch(n){H(`${t(`toolbox.ragInstallFailedToast`)}: ${n.message}`,`error`),e&&(e.disabled=!1,e.textContent=t(`toolbox.ragInstallBtn`))}}async function Pr(){let e=document.getElementById(`ragRedetectBtn`);e&&(e.disabled=!0);try{let e=await K(`POST`,`/api/rag/detect`);e&&e.success?e.available?(H(t(`toolbox.ragRedetectReady`),`success`),Tr(),await xr?.()):e.error?H(t(`toolbox.ragRedetectStillMissingDetail`,{error:e.error}),`error`):H(t(`toolbox.ragRedetectStillMissing`),`info`):H(t(`toolbox.ragRedetectFailed`,{error:e&&e.error||`unknown`}),`error`)}catch(e){H(t(`toolbox.ragRedetectFailed`,{error:e.message}),`error`)}await Ir()}async function Fr(){let e=document.getElementById(`ragInstallCmd`),n=e?e.textContent:`npm install ${yr.join(` `)}`;try{await navigator.clipboard.writeText(n),H(t(`toolbox.ragCopied`),`success`)}catch(e){r.warn(`[RAG] Clipboard write failed:`,e.message),H(t(`toolbox.ragCopyFailed`),`error`)}}async function Ir(){let e=await Cr();if(!e.connected||e.ragAvailable||e.unreachable){e.ragAvailable&&Tr(),Ar(e),jr();return}e.install=await wr(),Ar(e),e.install&&e.install.running?Mr():jr()}function Lr(){let e=document.getElementById(`ragSectionContent`);!e||e.dataset.ragEventsBound===`1`||(e.dataset.ragEventsBound=`1`,e.addEventListener(`click`,async e=>{let t=e.target.closest(`button`);t&&(t.id===`ragInstallBtn`?await Nr():t.id===`ragRedetectBtn`?await Pr():t.id===`ragCopyCmdBtn`&&await Fr())}))}var Rr=50*1024*1024,zr=
|
|
536
|
+
`)):``,a=i?`<pre style="margin-top:12px; max-height:160px; overflow:auto; background:var(--code-bg); color:var(--code-fg); padding:10px; border-radius:6px; font-size:11px; white-space:pre-wrap; word-break:break-all;">${i}</pre>`:``;return Dr(`⏳`,r,t(`toolbox.ragInstallTip`),a)}function Ar(e){let n=document.getElementById(`ragSectionContent`);if(!n)return;let{connected:r,ragAvailable:i,nodeVersion:a,unreachable:o,install:s}=e||{};if(!r){n.innerHTML=Dr(`🔌`,t(`toolbox.ragStatusAgentOffTitle`),t(`toolbox.ragStatusAgentOffDesc`));return}if(o){n.innerHTML=Dr(`⚠️`,t(`toolbox.ragStatusUnreachableTitle`),t(`toolbox.ragStatusUnreachableDesc`));return}if(s&&s.running){n.innerHTML=kr(s);return}if(i){n.innerHTML=Dr(`✅`,t(`toolbox.ragStatusReadyTitle`),t(`toolbox.ragStatusReadyDesc`));return}if(!Er(a)){n.innerHTML=Dr(`⚠️`,t(`toolbox.ragStatusNodeLowTitle`),t(`toolbox.ragStatusNodeLowDesc`,{version:q(a||`?`)}));return}n.innerHTML=Or(s)}function jr(){br&&=(clearTimeout(br),null)}function Mr(){jr();let e=async()=>{let n=await wr();if(n&&n.running){Ar({connected:!0,ragAvailable:!1,nodeVersion:null,install:n}),br=setTimeout(e,vr);return}jr();let r=await Cr();r.connected&&!r.ragAvailable&&(r.install=n),Ar(r),n&&n.done&&(H(n.success?t(`toolbox.ragInstallSuccess`):t(`toolbox.ragInstallFailedToast`),n.success?`success`:`error`),n.success&&(Tr(),await xr?.()))};br=setTimeout(e,vr)}async function Nr(){let e=document.getElementById(`ragInstallBtn`);e&&(e.disabled=!0,e.textContent=t(`toolbox.ragInstallBtnBusy`));try{let n=await K(`POST`,`/api/rag/install`);if(!n||!n.started){H(n&&n.error?n.error:t(`toolbox.ragInstallFailedToast`),`error`);let r=await wr();if(r&&r.running){Mr();return}e&&(e.disabled=!1,e.textContent=t(`toolbox.ragInstallBtn`));return}H(t(`toolbox.ragInstallStarted`),`info`),Mr()}catch(n){H(`${t(`toolbox.ragInstallFailedToast`)}: ${n.message}`,`error`),e&&(e.disabled=!1,e.textContent=t(`toolbox.ragInstallBtn`))}}async function Pr(){let e=document.getElementById(`ragRedetectBtn`);e&&(e.disabled=!0);try{let e=await K(`POST`,`/api/rag/detect`);e&&e.success?e.available?(H(t(`toolbox.ragRedetectReady`),`success`),Tr(),await xr?.()):e.error?H(t(`toolbox.ragRedetectStillMissingDetail`,{error:e.error}),`error`):H(t(`toolbox.ragRedetectStillMissing`),`info`):H(t(`toolbox.ragRedetectFailed`,{error:e&&e.error||`unknown`}),`error`)}catch(e){H(t(`toolbox.ragRedetectFailed`,{error:e.message}),`error`)}await Ir()}async function Fr(){let e=document.getElementById(`ragInstallCmd`),n=e?e.textContent:`npm install ${yr.join(` `)}`;try{await navigator.clipboard.writeText(n),H(t(`toolbox.ragCopied`),`success`)}catch(e){r.warn(`[RAG] Clipboard write failed:`,e.message),H(t(`toolbox.ragCopyFailed`),`error`)}}async function Ir(){let e=await Cr();if(!e.connected||e.ragAvailable||e.unreachable){e.ragAvailable&&Tr(),Ar(e),jr();return}e.install=await wr(),Ar(e),e.install&&e.install.running?Mr():jr()}function Lr(){let e=document.getElementById(`ragSectionContent`);!e||e.dataset.ragEventsBound===`1`||(e.dataset.ragEventsBound=`1`,e.addEventListener(`click`,async e=>{let t=e.target.closest(`button`);t&&(t.id===`ragInstallBtn`?await Nr():t.id===`ragRedetectBtn`?await Pr():t.id===`ragCopyCmdBtn`&&await Fr())}))}var Rr=50*1024*1024,zr=20,Br=400,Vr=80,Hr=5,Ur=.3,Wr=`.txt,.md,.markdown,.pdf,.docx,.doc,.xlsx,.xls,.csv,.pptx,.html,.htm,.json,.rtf,.odt,.odp,.ods,.epub`,Gr=[],Kr=``,qr=`all`,Jr=!1;function Yr(){if(Jr)return;Jr=!0;let e=document.getElementById(`knowledgeList`);e&&e.addEventListener(`click`,ii);let t=document.getElementById(`kbSearchInput`);if(t){let e=null;t.addEventListener(`input`,()=>{clearTimeout(e),e=setTimeout(()=>{Kr=t.value.trim(),ti(Gr)},200)});let n=document.getElementById(`kbSearchClear`);n&&n.addEventListener(`click`,()=>{t.value=``,Kr=``,ti(Gr),t.focus()})}let n=document.querySelectorAll(`.toolbox-filter-tab[data-target="kb"]`);n.forEach(e=>{e.addEventListener(`click`,()=>{n.forEach(e=>e.classList.remove(`active`)),e.classList.add(`active`),qr=e.dataset.filter,ti(Gr)})});let r=document.getElementById(`createKbBtn`);r&&r.addEventListener(`click`,()=>pi());let i=document.getElementById(`ragGlobalToggle`);i&&(chrome.storage.local.get(`ragEnabled`,e=>{let t=e.ragEnabled===!0;i.checked=t,Zr(t)}),i.addEventListener(`change`,()=>Qr(i.checked))),Sr(()=>Xr());let a=document.getElementById(`knowledgeGate`);a&&a.addEventListener(`click`,e=>{let t=e.target.closest(`[data-goto-tab]`);if(t){let e=document.querySelector(`.tab-nav-btn[data-tab="${t.dataset.gotoTab}"]`);e&&e.click();return}e.target.closest(`[data-action="enable-rag"]`)&&Qr(!0)}),Xr()}async function Xr(){let e=document.getElementById(`knowledgeGate`),t=document.getElementById(`knowledgeMain`);if(!e||!t)return;let n=await Cr(),{ragEnabled:r}=await chrome.storage.local.get(`ragEnabled`),i=document.getElementById(`createKbBtn`);if(!n.connected){$r(`agentOff`),i&&(i.disabled=!0);return}if(r!==!0){$r(`ragOff`),i&&(i.disabled=!0);return}if(!n.ragAvailable){$r(`ragUnavailable`),i&&(i.disabled=!0),Lr(),await Ir();return}i&&(i.disabled=!1),e.style.display=`none`,t.style.display=``,await X()}function Zr(e){let n=document.getElementById(`ragToggleLabel`);n&&(n.textContent=t(e?`common.enabled`:`common.disabled`),n.style.color=e?`var(--text-secondary)`:`var(--text-tertiary)`)}async function Qr(e){await chrome.storage.local.set({ragEnabled:e});let n=document.getElementById(`ragGlobalToggle`);n&&(n.checked=e),Zr(e),H(t(e?`toolbox.ragServiceEnabled`:`toolbox.ragServiceDisabled`),`info`),await Xr()}function $r(e){let n=document.getElementById(`knowledgeGate`),r=document.getElementById(`knowledgeMain`);if(!n||!r)return;if(r.style.display=`none`,n.style.display=``,e===`ragUnavailable`){n.innerHTML=`<div id="ragSectionContent">${ei()}</div>`;return}let i={agentOff:{icon:`🔌`,title:t(`knowledge.gateAgentOffTitle`),desc:t(`knowledge.gateAgentOffDesc`),btn:t(`knowledge.goToAgentTab`),tab:`agent`},ragOff:{icon:`📚`,title:t(`knowledge.gateRagOffTitle`),desc:t(`knowledge.gateRagOffDesc`),btn:t(`knowledge.enableNow`),action:`enable-rag`}}[e],a=i.tab?`<button class="toolbox-add-btn" data-goto-tab="${i.tab}" style="width:auto; margin-top:14px; padding:8px 18px; border-style:solid; color:var(--brand-500); border-color:var(--brand-500);">${q(i.btn)}</button>`:`<button class="toolbox-add-btn" data-action="${i.action}" style="width:auto; margin-top:14px; padding:8px 18px; border-style:solid; color:var(--brand-500); border-color:var(--brand-500);">${q(i.btn)}</button>`;n.innerHTML=`
|
|
537
537
|
<div class="toolbox-empty" style="text-align:left; padding:24px 20px;">
|
|
538
538
|
<div style="display:flex; align-items:center; gap:10px; font-size:15px; font-weight:600; color:var(--text-secondary);">
|
|
539
539
|
<span style="font-size:22px;">${i.icon}</span><span>${q(i.title)}</span>
|
|
540
540
|
</div>
|
|
541
541
|
<div style="margin-top:8px; line-height:1.7; color:var(--text-tertiary); font-size:13px;">${q(i.desc)}</div>
|
|
542
542
|
${a}
|
|
543
|
-
</div>`}async function X(){let e=document.getElementById(`knowledgeList`);if(e){e.innerHTML
|
|
543
|
+
</div>`}async function X(){let e=document.getElementById(`knowledgeList`);if(e){e.innerHTML=ei();try{let e=await K(`GET`,`/api/rag/collections`);if(!e||e.success!==!0)throw Error(e?.error||`unknown error`);Gr=e.collections||[],ti(Gr)}catch(n){r.warn(`[Knowledge] Failed to load collections:`,n.message),ri([]),e.innerHTML=`
|
|
544
544
|
<div class="toolbox-empty" style="grid-column:1/-1;">
|
|
545
545
|
<div class="toolbox-empty-icon">⚠️</div>
|
|
546
546
|
<div class="toolbox-empty-title">${q(t(`knowledge.loadFailed`,{error:n.message}))}</div>
|
|
547
547
|
<button class="toolbox-add-btn" id="kbRetryBtn" style="width:auto; margin-top:12px; padding:8px 18px;">${q(t(`knowledge.retry`))}</button>
|
|
548
|
-
</div>`}}}function
|
|
548
|
+
</div>`}}}function ei(){return`
|
|
549
549
|
<div class="toolbox-empty" style="grid-column:1/-1;">
|
|
550
550
|
<div class="toolbox-empty-icon">⏳</div>
|
|
551
551
|
<div class="toolbox-empty-title">${q(t(`toolbox.loading`))}</div>
|
|
552
|
-
</div>`}function
|
|
552
|
+
</div>`}function ti(e){let n=document.getElementById(`knowledgeList`);if(!n)return;if(e.length===0){ri(e),n.innerHTML=`
|
|
553
553
|
<div class="toolbox-empty" style="grid-column:1/-1; padding:50px 20px;">
|
|
554
554
|
<div class="toolbox-empty-icon">📚</div>
|
|
555
555
|
<div class="toolbox-empty-title">${q(t(`knowledge.emptyTitle`))}</div>
|
|
556
556
|
<div class="toolbox-empty-desc">${q(t(`knowledge.emptyDesc`))}</div>
|
|
557
|
-
</div>`;return}let r=e.filter(e=>
|
|
557
|
+
</div>`;return}let r=e.filter(e=>qr===`enabled`&&e.enabled===!1||qr===`disabled`&&e.enabled!==!1?!1:Kr?[e.name,e.description].filter(Boolean).join(` `).toLowerCase().includes(Kr.toLowerCase()):!0);if(ri(e),r.length===0){n.innerHTML=`
|
|
558
558
|
<div class="toolbox-empty" style="grid-column:1/-1; padding:50px 20px;">
|
|
559
559
|
<div class="toolbox-empty-icon">🔍</div>
|
|
560
560
|
<div class="toolbox-empty-title">${q(t(`toolbox.noMatchResult`))}</div>
|
|
561
|
-
</div>`;return}n.innerHTML=r.map(
|
|
561
|
+
</div>`;return}n.innerHTML=r.map(ni).join(``)}function ni(e){let n=e.enabled===!1,r=e.embeddingConfig?.mode===`openai-compat`?t(`knowledge.modeRemote`):t(`knowledge.modeLocal`),i=e.embeddingConfig?.modelName||``,a=i?`${r} · ${i}`:r;return`
|
|
562
562
|
<div class="kb-card${n?` kb-card-disabled`:``}" data-kb-id="${q(e.id)}">
|
|
563
563
|
<div class="kb-card-title">
|
|
564
564
|
<span>📚</span>
|
|
@@ -576,7 +576,7 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
576
576
|
<button class="kb-action-btn" type="button" data-action="toggle">${q(t(n?`knowledge.actionEnable`:`knowledge.actionDisable`))}</button>
|
|
577
577
|
<button class="kb-action-btn kb-action-danger" type="button" data-action="delete">${q(t(`knowledge.actionDelete`))}</button>
|
|
578
578
|
</div>
|
|
579
|
-
</div>`}function
|
|
579
|
+
</div>`}function ri(e){let n=document.getElementById(`knowledgeCount`);if(!n)return;let r=e.length;if(r===0){n.style.display=`none`;return}let i=e.filter(e=>e.enabled!==!1).length;n.textContent=t(`toolbox.enabledCountTotal`,{enabled:i,total:r}),n.style.display=``}async function ii(e){if(e.target.closest(`#kbRetryBtn`)){await X();return}let t=e.target.closest(`.kb-action-btn`);if(!t)return;let n=t.closest(`[data-kb-id]`),r=Gr.find(e=>e.id===n?.dataset.kbId);if(!r)return;let i=t.dataset.action;i===`ingest`?yi(r):i===`edit`?fi(r):i===`search`?Ci(r):i===`docs`?xi(r):i===`toggle`?await oi(r):i===`delete`&&await ai(r)}async function ai(e){if(await G(t(`knowledge.deleteConfirm`,{name:e.name,docs:e.documentCount||0,chunks:e.chunkCount||0}),t(`knowledge.deleteConfirmTitle`)))try{let n=await K(`DELETE`,`/api/rag/collections/${encodeURIComponent(e.id)}`);if(!n||n.success!==!0)throw Error(n?.error||`unknown error`);H(t(`knowledge.deleteSuccess`),`success`),await X()}catch(e){H(t(`knowledge.opFailed`,{error:e.message}),`error`)}}async function oi(e){try{let n=await K(`POST`,`/api/rag/collections/${encodeURIComponent(e.id)}/toggle`);if(!n||n.success!==!0)throw Error(n?.error||`unknown error`);H(n.enabled===!1?t(`knowledge.disableSuccess`,{name:e.name}):t(`knowledge.enableSuccess`,{name:e.name}),`success`),await X()}catch(e){H(t(`knowledge.opFailed`,{error:e.message}),`error`)}}function si(e={}){let n=e.mode===`openai-compat`;return`
|
|
580
580
|
<div class="form-group">
|
|
581
581
|
<label>${q(t(`knowledge.vectorSectionTitle`))}</label>
|
|
582
582
|
<div class="kb-radio-row">
|
|
@@ -612,7 +612,7 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
612
612
|
</div>
|
|
613
613
|
</div>
|
|
614
614
|
</div>
|
|
615
|
-
</div>`}function
|
|
615
|
+
</div>`}function ci(e,n=null){let r=e.querySelector(`#kbVecRemoteFields`),i=e.querySelector(`#kbVecHint`),a=()=>{let n=e.querySelector(`input[name="kbVecMode"]:checked`)?.value===`openai-compat`;r&&(r.style.display=n?``:`none`),i&&(i.textContent=t(n?`knowledge.vectorModeRemoteHint`:`knowledge.vectorModeLocalHint`))};e.querySelectorAll(`input[name="kbVecMode"]`).forEach(e=>e.addEventListener(`change`,a)),a();let o=e.querySelector(`#kbVecTestBtn`);if(!o)return;let s=e.querySelector(`#kbVecTestResult`),c=e.querySelector(`#kbVecDims`);o.addEventListener(`click`,async()=>{let r=e.querySelector(`#kbVecEndpoint`).value.trim(),i=e.querySelector(`#kbVecModel`).value.trim();if(!r){H(t(`knowledge.vectorEndpointRequired`),`warning`);return}if(!i){H(t(`knowledge.vectorModelRequired`),`warning`);return}let a=e.querySelector(`#kbVecApiKey`).value.trim(),l=parseInt(c?.value.trim()||``,10);o.disabled=!0;let u=o.textContent;o.textContent=t(`knowledge.vectorTesting`),s&&(s.textContent=``,s.style.color=``);try{let e=await K(`POST`,`/api/rag/test-embedding`,{mode:`openai-compat`,endpoint:r,apiKey:a,modelName:i,...n?{collectionId:n}:{},...Number.isFinite(l)&&l>0?{dimensions:l}:{}});if(!e||e.success!==!0)throw Error(e?.error||`unknown error`);if(s&&(s.textContent=`✓ ${t(`knowledge.vectorTestOk`,{model:e.model,dims:e.dimensions})}`,s.style.color=`var(--success-strong)`),c&&e.dimensions){let n=c.value.trim();c.value=String(e.dimensions),n!==String(e.dimensions)&&H(t(`knowledge.vectorDimsFilled`,{dims:e.dimensions}),`info`)}}catch(e){s&&(s.textContent=`✕ ${t(`knowledge.vectorTestFailed`,{error:e.message})}`,s.style.color=`var(--danger-strong)`)}finally{o.disabled=!1,o.textContent=u||t(`knowledge.vectorTestBtn`)}})}function li(e){if(e.querySelector(`input[name="kbVecMode"]:checked`)?.value!==`openai-compat`)return{mode:`local`};let t=parseInt(e.querySelector(`#kbVecDims`).value.trim(),10);return{mode:`openai-compat`,endpoint:e.querySelector(`#kbVecEndpoint`).value.trim(),apiKey:e.querySelector(`#kbVecApiKey`).value.trim(),modelName:e.querySelector(`#kbVecModel`).value.trim(),...Number.isFinite(t)&&t>0?{dimensions:t}:{}}}function ui(e={},t={}){let n=e.mode||`local`,r=t.mode||`local`;return n===r?r===`local`?!1:[`endpoint`,`modelName`,`dimensions`].some(n=>t[n]===void 0?!1:String(e[n]??``)!==String(t[n]??``)):!0}function di(e){return new Promise((t,n)=>{let r=Date.now(),i=setInterval(async()=>{if(Date.now()-r>18e5){clearInterval(i),n(Error(`rebuild polling timeout`));return}try{let n=(await K(`GET`,`/api/rag/collections/${encodeURIComponent(e)}/ingest/status`))?.progress;n&&n.done&&(clearInterval(i),t(n))}catch{}},1e3)})}function fi(e){let n=Ti({title:t(`knowledge.editTitle`),bodyHtml:`
|
|
616
616
|
<div class="form-group">
|
|
617
617
|
<label>${q(t(`knowledge.nameLabel`))}</label>
|
|
618
618
|
<input type="text" id="kbEditName" maxlength="100" placeholder="${q(t(`knowledge.namePlaceholder`))}" value="${q(e.name||``)}">
|
|
@@ -621,7 +621,7 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
621
621
|
<label>${q(t(`knowledge.descLabel`))}</label>
|
|
622
622
|
<input type="text" id="kbEditDesc" maxlength="500" placeholder="${q(t(`knowledge.descPlaceholder`))}" value="${q(e.description||``)}">
|
|
623
623
|
</div>
|
|
624
|
-
${
|
|
624
|
+
${si(e.embeddingConfig||{})}`,confirmText:t(`knowledge.editConfirm`),closeOnOverlay:!1,onConfirm:async({close:r,setBusy:i})=>{let{overlay:a}=n,o=a.querySelector(`#kbEditName`).value.trim(),s=a.querySelector(`#kbEditDesc`).value.trim();if(!o){H(t(`knowledge.nameRequired`),`warning`);return}let c=li(a);if(c.mode===`openai-compat`){if(!c.endpoint){H(t(`knowledge.vectorEndpointRequired`),`warning`);return}if(!c.modelName){H(t(`knowledge.vectorModelRequired`),`warning`);return}}if(!(ui(e.embeddingConfig||{},c)&&!await G(t(`knowledge.rebuildConfirm`),t(`knowledge.rebuildConfirmTitle`)))){i(!0,t(`knowledge.saving`));try{let n=await K(`PUT`,`/api/rag/collections/${encodeURIComponent(e.id)}`,{name:o,description:s,embeddingConfig:c});if(!n||n.success!==!0)throw Error(n?.error||`unknown error`);r(),n.collection?.rebuilding?(H(t(`knowledge.rebuildStarted`),`info`),await X(),di(e.id).then(e=>{e.phase===`error`?H(t(`knowledge.rebuildFailed`,{error:e.error||`unknown error`}),`error`):H(t(`knowledge.rebuildDone`),`success`),X()}).catch(e=>{H(t(`knowledge.rebuildFailed`,{error:e.message}),`error`),X()})):(H(t(`knowledge.editSuccess`),`success`),await X())}catch(e){i(!1,t(`knowledge.editConfirm`)),H(t(`knowledge.opFailed`,{error:e.message}),`error`)}}}});ci(n.overlay,e.id);let r=n.overlay.querySelector(`#kbEditName`);r?.focus(),r?.select()}function pi(){let e=Ti({title:t(`knowledge.createTitle`),bodyHtml:`
|
|
625
625
|
<div class="form-group">
|
|
626
626
|
<label>${q(t(`knowledge.nameLabel`))}</label>
|
|
627
627
|
<input type="text" id="kbCreateName" maxlength="100" placeholder="${q(t(`knowledge.namePlaceholder`))}">
|
|
@@ -630,7 +630,7 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
630
630
|
<label>${q(t(`knowledge.descLabel`))}</label>
|
|
631
631
|
<input type="text" id="kbCreateDesc" maxlength="500" placeholder="${q(t(`knowledge.descPlaceholder`))}">
|
|
632
632
|
</div>
|
|
633
|
-
${
|
|
633
|
+
${si({})}`,confirmText:t(`knowledge.createConfirm`),closeOnOverlay:!1,onConfirm:async({close:n,setBusy:r})=>{let{overlay:i}=e,a=i.querySelector(`#kbCreateName`).value.trim(),o=i.querySelector(`#kbCreateDesc`).value.trim();if(!a){H(t(`knowledge.nameRequired`),`warning`);return}let s=li(i);if(s.mode===`openai-compat`){if(!s.endpoint){H(t(`knowledge.vectorEndpointRequired`),`warning`);return}if(!s.modelName){H(t(`knowledge.vectorModelRequired`),`warning`);return}}r(!0,t(`knowledge.creating`));try{let e=await K(`POST`,`/api/rag/collections`,{name:a,description:o,embeddingConfig:s});if(!e||e.success!==!0)throw Error(e?.error||`unknown error`);n(),H(t(`knowledge.createSuccess`,{name:e.collection?.name||a}),`success`),await X()}catch(e){r(!1,t(`knowledge.createConfirm`)),H(t(`knowledge.opFailed`,{error:e.message}),`error`)}}});ci(e.overlay),e.overlay.querySelector(`#kbCreateName`)?.focus()}function mi(e){switch(e?.phase){case`parsing`:return`⏳ ${t(`knowledge.progressParsing`)}`;case`chunking`:return`⏳ ${t(`knowledge.progressChunking`)}`;case`embedding`:return`⏳ ${t(`knowledge.progressEmbedding`,{current:e.current||0,total:e.total||0})}`;case`storing`:return`⏳ ${t(`knowledge.progressStoring`)}`;case`rebuilding`:return`⏳ ${t(`knowledge.progressRebuilding`,{current:e.current||0,total:e.total||0})}`;default:return`⏳ ${t(`knowledge.ingesting`)}`}}function hi(e){return new Set(String(e||``).split(`,`).map(e=>e.trim().toLowerCase()).filter(e=>e.startsWith(`.`)))}function gi(e){let t=String(e||``).toLowerCase().lastIndexOf(`.`);return t>=0?String(e).slice(t).toLowerCase():``}function _i(e,{maxCount:t,maxSize:n,accept:r}){let i=hi(r);if(e.length>t)return{ok:!1,reason:`tooMany`,detail:{max:t,count:e.length}};for(let t of e){if(t.size>n)return{ok:!1,reason:`tooLarge`,detail:{name:t.name}};let e=gi(t.name);if(i.size>0&&!i.has(e))return{ok:!1,reason:`badType`,detail:{name:t.name}}}return{ok:!0,reason:null,detail:null}}async function vi(e,t,n){let r=e.length,i=0,a=0,o=[];for(let s=0;s<r;s++){let c=e[s];n&&n({index:s,total:r,file:c});try{let e=await t(c,s);i+=1,a+=e&&e.chunkCount||0}catch(e){o.push({name:c.name,error:e&&e.message||String(e)})}}return{total:r,successCount:i,failCount:o.length,totalChunks:a,failures:o}}function yi(e){let n=`
|
|
634
634
|
<div class="import-tabs" id="kbIngestTabs">
|
|
635
635
|
<button type="button" class="import-tab active" data-tab="file">${q(t(`knowledge.tabFile`))}</button>
|
|
636
636
|
<button type="button" class="import-tab" data-tab="text">${q(t(`knowledge.tabText`))}</button>
|
|
@@ -641,9 +641,9 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
641
641
|
<div class="upload-icon">📄</div>
|
|
642
642
|
<div style="margin-top:8px; color:var(--text-secondary); font-size:13px;">${q(t(`knowledge.dropHint`))}</div>
|
|
643
643
|
<div style="margin-top:6px; font-size:12px; color:var(--text-tertiary);">${q(t(`knowledge.dropSupported`))}</div>
|
|
644
|
-
<div id="kbSelectedFile" style="display:none; margin-top:8px; color:var(--success-strong); font-weight:500; font-size:13px;"></div>
|
|
645
644
|
</div>
|
|
646
|
-
<
|
|
645
|
+
<div id="kbSelectedFiles" class="kb-selected-files" style="display:none;"></div>
|
|
646
|
+
<input type="file" id="kbFileInput" multiple style="display:none" accept="${Wr}">
|
|
647
647
|
</div>
|
|
648
648
|
<div class="import-panel" data-panel="text">
|
|
649
649
|
<div class="form-group">
|
|
@@ -664,20 +664,27 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
664
664
|
<div class="kb-chunk-row">
|
|
665
665
|
<span class="kb-chunk-title">${q(t(`knowledge.chunkSettingsTitle`))}</span>
|
|
666
666
|
<label class="kb-chunk-inline">${q(t(`knowledge.chunkSizeLabel`))}
|
|
667
|
-
<input type="number" id="kbChunkSize" min="100" max="2000" step="50" value="${
|
|
667
|
+
<input type="number" id="kbChunkSize" min="100" max="2000" step="50" value="${Br}">
|
|
668
668
|
</label>
|
|
669
669
|
<label class="kb-chunk-inline">${q(t(`knowledge.chunkOverlapLabel`))}
|
|
670
|
-
<input type="number" id="kbChunkOverlap" min="0" max="500" step="10" value="${
|
|
670
|
+
<input type="number" id="kbChunkOverlap" min="0" max="500" step="10" value="${Vr}">
|
|
671
671
|
</label>
|
|
672
672
|
</div>
|
|
673
|
-
<div id="kbIngestStatus" class="kb-status" style="display:none;">⏳ ${q(t(`knowledge.ingesting`))}</div>`,r=
|
|
673
|
+
<div id="kbIngestStatus" class="kb-status" style="display:none;">⏳ ${q(t(`knowledge.ingesting`))}</div>`,r=[],i=Ti({title:t(`knowledge.ingestTitle`,{name:e.name}),bodyHtml:n,confirmText:t(`knowledge.ingestConfirm`),onConfirm:async({close:n,setBusy:a})=>{let{overlay:o}=i,s=o.querySelector(`.import-tab.active`)?.dataset.tab||`file`,c=o.querySelector(`#kbIngestStatus`),l=`/api/rag/collections/${encodeURIComponent(e.id)}/ingest`,u=parseInt(o.querySelector(`#kbChunkSize`).value,10),d=parseInt(o.querySelector(`#kbChunkOverlap`).value,10),f={...Number.isFinite(u)&&u>=100&&u<=2e3?{chunkSize:u}:{},...Number.isFinite(d)&&d>=0&&d<=500?{overlap:d}:{}};if(s===`file`){if(r.length===0){H(t(`knowledge.fileRequired`),`warning`);return}let e=_i(r,{maxCount:zr,maxSize:Rr,accept:Wr});if(!e.ok){e.reason===`tooMany`?H(t(`knowledge.maxBatchFiles`,{max:e.detail.max}),`warning`):e.reason===`tooLarge`?H(t(`knowledge.fileTooLarge`),`warning`):H(t(`knowledge.fileTypeUnsupported`,{name:e.detail.name}),`warning`);return}c&&(c.style.display=``,c.style.color=``),a(!0);let i=``,o=e=>{if(!c)return;let n=e?mi(e):`⏳ ${t(`knowledge.ingesting`)}`;c.textContent=i?`${i} · ${n}`:n};o(null);let s=setInterval(async()=>{try{let e=await K(`GET`,`${l}/status`);e&&e.success&&e.progress&&o(e.progress)}catch{}},800),u=r.length,d=[],p;try{p=await vi(r,async e=>{let t=await bi(e),n=await K(`POST`,l,{type:`file`,fileName:e.name,contentBase64:t,chunkConfig:f});if(!n||n.success!==!0)throw Error(n?.error||`unknown error`);return d.push(n.name||e.name),n},({index:e,file:n})=>{i=u>1?t(`knowledge.importingBatch`,{current:e+1,total:u,name:n.name}):``,o(null)})}finally{clearInterval(s)}p.failCount===0?(n(),H(u===1?t(`knowledge.ingestSuccess`,{name:d[0]||r[0].name,chunks:p.totalChunks}):t(`knowledge.batchAllSuccess`,{count:p.successCount,chunks:p.totalChunks}),`success`),await X()):p.successCount>0?(n(),H(t(`knowledge.batchPartial`,{success:p.successCount,fail:p.failCount,error:p.failures[0].error}),`warning`),await X()):(c&&(c.style.color=`var(--danger-strong)`,c.innerHTML=p.failures.map(e=>`<div class="kb-ingest-fail-item">✕ ${q(e.name)}:${q(e.error)}</div>`).join(``)),a(!1,t(`knowledge.ingestConfirm`)),H(t(`knowledge.batchAllFailed`,{error:p.failures[0].error}),`error`));return}let p;if(s===`text`){let e=o.querySelector(`#kbIngestText`).value,n=o.querySelector(`#kbIngestName`).value.trim();if(!e.trim()){H(t(`knowledge.contentRequired`),`warning`);return}p={type:`text`,content:e,name:n||void 0}}else{let e=o.querySelector(`#kbIngestUrl`).value.trim();if(!e){H(t(`knowledge.urlRequired`),`warning`);return}p={type:`url`,url:e}}p.chunkConfig=f,c&&(c.style.display=``,c.style.color=``,c.textContent=`⏳ ${t(`knowledge.ingesting`)}`),a(!0);let m=setInterval(async()=>{try{let e=await K(`GET`,`${l}/status`);c&&e&&e.success&&e.progress&&(c.textContent=mi(e.progress))}catch{}},800);try{let e=await K(`POST`,l,p);if(!e||e.success!==!0)throw Error(e?.error||`unknown error`);n(),H(t(`knowledge.ingestSuccess`,{name:e.name,chunks:e.chunkCount}),`success`),await X()}catch(e){c&&(c.style.display=`none`),a(!1),H(t(`knowledge.ingestFailed`,{error:e.message}),`error`)}finally{clearInterval(m)}}}),{overlay:a}=i;a.querySelector(`#kbIngestTabs`).addEventListener(`click`,e=>{let t=e.target.closest(`.import-tab`);t&&(a.querySelectorAll(`.import-tab`).forEach(e=>e.classList.toggle(`active`,e===t)),a.querySelectorAll(`.import-panel`).forEach(e=>{e.classList.toggle(`active`,e.dataset.panel===t.dataset.tab)}))});let o=a.querySelector(`#kbDropzone`),s=a.querySelector(`#kbFileInput`),c=a.querySelector(`#kbSelectedFiles`),l=e=>Number.isFinite(e)?e>=1024*1024?`${(e/1024/1024).toFixed(1)} MB`:e>=1024?`${Math.round(e/1024)} KB`:`${e} B`:``,u=()=>{if(r.length===0){c.style.display=`none`,c.innerHTML=``,o.classList.remove(`has-file`);return}o.classList.add(`has-file`),c.style.display=``,c.innerHTML=`
|
|
674
|
+
<div class="kb-selected-count">${q(t(`knowledge.selectedCount`,{count:r.length,max:zr}))}</div>
|
|
675
|
+
${r.map((e,n)=>`
|
|
676
|
+
<div class="kb-selected-file" data-idx="${n}">
|
|
677
|
+
<span class="kb-selected-name" title="${q(e.name)}">${q(e.name)}</span>
|
|
678
|
+
<span class="kb-selected-size">${q(l(e.size))}</span>
|
|
679
|
+
<button class="kb-selected-del" type="button" data-remove="${n}" title="${q(t(`knowledge.removeFile`))}">✕</button>
|
|
680
|
+
</div>`).join(``)}`},d=e=>{let n=Array.from(e||[]);if(n.length===0)return;let i=new Set(r.map(e=>`${e.name}::${e.size}`)),a=r.concat(n.filter(e=>!i.has(`${e.name}::${e.size}`))),o=_i(a,{maxCount:zr,maxSize:Rr,accept:Wr});if(!o.ok){o.reason===`tooMany`?H(t(`knowledge.maxBatchFiles`,{max:o.detail.max}),`warning`):o.reason===`tooLarge`?H(t(`knowledge.fileTooLarge`),`warning`):H(t(`knowledge.fileTypeUnsupported`,{name:o.detail.name}),`warning`);return}r=a,u()};o.addEventListener(`click`,()=>s.click()),s.addEventListener(`change`,()=>{d(s.files),s.value=``}),o.addEventListener(`dragover`,e=>e.preventDefault()),o.addEventListener(`drop`,e=>{e.preventDefault(),d(e.dataTransfer?.files)}),c.addEventListener(`click`,e=>{let t=e.target.closest(`[data-remove]`);if(!t)return;e.stopPropagation();let n=parseInt(t.dataset.remove,10);Number.isFinite(n)&&(r.splice(n,1),u())})}function bi(e){return new Promise((t,n)=>{let r=new FileReader;r.onload=()=>{let e=String(r.result||``);t(e.slice(e.indexOf(`,`)+1))},r.onerror=()=>n(r.error||Error(`File read failed`)),r.readAsDataURL(e)})}function xi(e){let n=Ti({title:t(`knowledge.docsTitle`,{name:e.name}),bodyHtml:`<div id="kbDocsBody">${ei()}</div>`,confirmText:null,cancelText:t(`common.close`),wide:!0}).overlay.querySelector(`#kbDocsBody`);n.addEventListener(`click`,async r=>{let i=r.target.closest(`[data-doc-delete]`);if(!i)return;let a=i.closest(`[data-doc-id]`),o=a?.dataset.docId,s=a?.querySelector(`.kb-doc-name`)?.textContent||o;if(o&&await G(t(`knowledge.docDeleteConfirm`,{name:s}),t(`knowledge.docDeleteConfirmTitle`)))try{let r=await K(`DELETE`,`/api/rag/collections/${encodeURIComponent(e.id)}/documents/${encodeURIComponent(o)}`);if(!r||r.success!==!0)throw Error(r?.error||`unknown error`);H(t(`knowledge.docDeleteSuccess`),`success`),await Si(n,e),X()}catch(e){H(t(`knowledge.opFailed`,{error:e.message}),`error`)}}),Si(n,e)}async function Si(e,n){e.innerHTML=ei();try{let r=await K(`GET`,`/api/rag/collections/${encodeURIComponent(n.id)}/documents`);if(!r||r.success!==!0)throw Error(r?.error||`unknown error`);let i=r.documents||[];if(i.length===0){e.innerHTML=`<div class="kb-status" style="color:var(--text-tertiary);">${q(t(`knowledge.docsEmpty`))}</div>`;return}e.innerHTML=`<div class="kb-doc-list">${i.map(e=>`
|
|
674
681
|
<div class="kb-doc-row" data-doc-id="${q(e.id)}">
|
|
675
682
|
<div class="kb-doc-info">
|
|
676
683
|
<div class="kb-doc-name" title="${q(e.name)}">${q(e.name)}</div>
|
|
677
|
-
<div class="kb-doc-meta">${q(t(`knowledge.docChunkCount`,{count:e.chunkCount}))} · ${q(
|
|
684
|
+
<div class="kb-doc-meta">${q(t(`knowledge.docChunkCount`,{count:e.chunkCount}))} · ${q(Ei(e.createdAt))}</div>
|
|
678
685
|
</div>
|
|
679
686
|
<button class="kb-doc-del" type="button" data-doc-delete title="${q(t(`knowledge.actionDelete`))}">✕</button>
|
|
680
|
-
</div>`).join(``)}</div>`}catch(n){e.innerHTML=`<div class="kb-status" style="color:var(--danger-strong);">${q(t(`knowledge.loadFailed`,{error:n.message}))}</div>`}}function
|
|
687
|
+
</div>`).join(``)}</div>`}catch(n){e.innerHTML=`<div class="kb-status" style="color:var(--danger-strong);">${q(t(`knowledge.loadFailed`,{error:n.message}))}</div>`}}function Ci(e){let n=`
|
|
681
688
|
<div class="kb-search-scope">${q(t(`knowledge.searchScope`,{name:e.name}))}</div>
|
|
682
689
|
<div class="kb-search-bar">
|
|
683
690
|
<input type="text" id="kbSearchQuery" placeholder="${q(t(`knowledge.searchQueryPlaceholder`))}">
|
|
@@ -685,13 +692,13 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
685
692
|
</div>
|
|
686
693
|
<div class="kb-search-opts">
|
|
687
694
|
<label class="kb-chunk-inline">${q(t(`knowledge.searchTopKLabel`))}
|
|
688
|
-
<input type="number" id="kbSearchTopK" min="1" max="20" value="${
|
|
695
|
+
<input type="number" id="kbSearchTopK" min="1" max="20" value="${Hr}">
|
|
689
696
|
</label>
|
|
690
697
|
<label class="kb-chunk-inline">${q(t(`knowledge.searchThresholdLabel`))}
|
|
691
|
-
<input type="number" id="kbSearchThreshold" min="0" max="1" step="0.05" value="${
|
|
698
|
+
<input type="number" id="kbSearchThreshold" min="0" max="1" step="0.05" value="${Ur}">
|
|
692
699
|
</label>
|
|
693
700
|
</div>
|
|
694
|
-
<div id="kbSearchResults"></div>`,{overlay:r}=
|
|
701
|
+
<div id="kbSearchResults"></div>`,{overlay:r}=Ti({title:t(`knowledge.searchTitle`),bodyHtml:n,confirmText:null,cancelText:t(`common.close`),wide:!0}),i=r.querySelector(`#kbSearchQuery`),a=r.querySelector(`#kbSearchBtn`),o=r.querySelector(`#kbSearchResults`),s=async()=>{let n=i.value.trim();if(!n){H(t(`knowledge.contentRequired`),`warning`);return}let s=parseInt(r.querySelector(`#kbSearchTopK`).value,10),c=parseFloat(r.querySelector(`#kbSearchThreshold`).value);a.disabled=!0,a.textContent=t(`knowledge.searching`),o.innerHTML=`<div class="kb-status">⏳ ${q(t(`knowledge.searching`))}</div>`;try{let t=await K(`POST`,`/api/rag/collections/${encodeURIComponent(e.id)}/search`,{query:n,topK:Number.isFinite(s)&&s>0?s:Hr,threshold:Number.isFinite(c)?c:Ur});if(!t||t.success!==!0)throw Error(t?.error||`unknown error`);wi(o,t)}catch(e){o.innerHTML=`<div class="kb-status" style="color:var(--danger-strong);">${q(t(`knowledge.searchFailed`,{error:e.message}))}</div>`}finally{a.disabled=!1,a.textContent=t(`knowledge.searchBtn`)}};a.addEventListener(`click`,s),i.addEventListener(`keydown`,e=>{e.key===`Enter`&&s()}),i.focus()}function wi(e,n){let r=n.results||[];if(r.length===0){e.innerHTML=`<div class="kb-status" style="color:var(--text-tertiary);">${q(t(`knowledge.searchNoHits`))}</div>`;return}e.innerHTML=`
|
|
695
702
|
${n.fallback?`<div class="kb-fallback-hint">⚠️ ${q(t(`knowledge.searchFallbackHint`))}</div>`:``}
|
|
696
703
|
<div class="kb-hit-count">${q(t(`knowledge.searchHitCount`,{count:r.length}))}</div>
|
|
697
704
|
<div class="kb-hit-list">${r.map(e=>`
|
|
@@ -701,7 +708,7 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
701
708
|
<span class="kb-hit-doc" title="${q(e.metadata?.documentName||``)}">${q(e.metadata?.documentName||``)}</span>
|
|
702
709
|
</div>
|
|
703
710
|
<div class="kb-hit-text">${q(e.content||``)}</div>
|
|
704
|
-
</div>`).join(``)}</div>`,e.querySelectorAll(`.kb-hit-text`).forEach(e=>{e.textContent.length>180&&(e.classList.add(`kb-hit-collapsed`),e.title=t(`knowledge.expandFull`),e.addEventListener(`click`,()=>{e.title=e.classList.toggle(`kb-hit-collapsed`)?t(`knowledge.expandFull`):t(`knowledge.collapse`)}))})}function
|
|
711
|
+
</div>`).join(``)}</div>`,e.querySelectorAll(`.kb-hit-text`).forEach(e=>{e.textContent.length>180&&(e.classList.add(`kb-hit-collapsed`),e.title=t(`knowledge.expandFull`),e.addEventListener(`click`,()=>{e.title=e.classList.toggle(`kb-hit-collapsed`)?t(`knowledge.expandFull`):t(`knowledge.collapse`)}))})}function Ti({title:e,bodyHtml:n,confirmText:i,cancelText:a,onConfirm:o,wide:s,closeOnOverlay:c=!0}){let l=document.createElement(`div`);l.className=`modal-overlay`,l.innerHTML=`
|
|
705
712
|
<div class="modal-content kb-modal${s?` kb-modal-wide`:``}">
|
|
706
713
|
<div class="modal-header">
|
|
707
714
|
<h3>${q(e)}</h3>
|
|
@@ -712,10 +719,10 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
712
719
|
<button class="btn btn-cancel" type="button" data-modal-cancel>${q(a||t(`common.cancel`))}</button>
|
|
713
720
|
${i?`<button class="btn btn-primary" type="button" data-modal-confirm>${q(i)}</button>`:``}
|
|
714
721
|
</div>
|
|
715
|
-
</div>`,document.body.appendChild(l);let u=()=>l.remove();l.querySelector(`.modal-close-btn`).addEventListener(`click`,u),l.querySelector(`[data-modal-cancel]`).addEventListener(`click`,u),l.querySelector(`[data-modal-confirm]`)?.addEventListener(`click`,e=>e.stopPropagation()),c&&l.addEventListener(`click`,e=>{e.target===l&&u()});let d=l.querySelector(`[data-modal-confirm]`);if(d&&typeof o==`function`){let e=!1;d.addEventListener(`click`,async()=>{if(!e)try{await o({overlay:l,close:u,busy:()=>e,setBusy:(t,n)=>{e=t,d.disabled=t,typeof n==`string`&&(d.textContent=n)}})}catch(e){r.warn(`[Knowledge] Modal confirm error:`,e.message)}})}return{overlay:l,close:u}}function
|
|
716
|
-
<div class="memory-entry-item${
|
|
722
|
+
</div>`,document.body.appendChild(l);let u=()=>l.remove();l.querySelector(`.modal-close-btn`).addEventListener(`click`,u),l.querySelector(`[data-modal-cancel]`).addEventListener(`click`,u),l.querySelector(`[data-modal-confirm]`)?.addEventListener(`click`,e=>e.stopPropagation()),c&&l.addEventListener(`click`,e=>{e.target===l&&u()});let d=l.querySelector(`[data-modal-confirm]`);if(d&&typeof o==`function`){let e=!1;d.addEventListener(`click`,async()=>{if(!e)try{await o({overlay:l,close:u,busy:()=>e,setBusy:(t,n)=>{e=t,d.disabled=t,typeof n==`string`&&(d.textContent=n)}})}catch(e){r.warn(`[Knowledge] Modal confirm error:`,e.message)}})}return{overlay:l,close:u}}function Ei(e){if(!e)return``;let t=new Date(e);if(Number.isNaN(t.getTime()))return String(e);let n=e=>String(e).padStart(2,`0`);return`${t.getFullYear()}-${n(t.getMonth()+1)}-${n(t.getDate())} ${n(t.getHours())}:${n(t.getMinutes())}`}var Di=!1,Oi=[],ki=[],Ai=!1,ji=null,Z=e=>document.getElementById(e);function Mi(){return{keyword:(Z(`memoryEntriesSearch`)?.value||``).trim().toLowerCase(),type:Z(`memoryEntriesTypeFilter`)?.value||`all`}}function Ni(){return Z(`memoryEntriesSort`)?.value||`createdDesc`}var Pi=(e,t)=>String(t.createdAt||``).localeCompare(String(e.createdAt||``)),Fi=e=>Number.isFinite(parseFloat(e))?parseFloat(e):0;function Ii(e){let t=[...e];switch(Ni()){case`importanceDesc`:return t.sort((e,t)=>Fi(t.importance)-Fi(e.importance)||Pi(e,t));case`valueDesc`:return t.sort((e,t)=>Fi(t.value)-Fi(e.value)||Pi(e,t));case`valueAsc`:return t.sort((e,t)=>Fi(e.value)-Fi(t.value)||Pi(e,t));default:return t.sort(Pi)}}function Li(e,t){return t.type!==`all`&&e.type!==t.type?!1:t.keyword?[e.content,e.title,e.category,...e.tags||[]].filter(Boolean).join(` `).toLowerCase().includes(t.keyword):!0}function Ri(e){return t(e===`summary`?`memoryEntries.filterSummary`:`memoryEntries.filterFact`)}function zi(e){return String(e||``).split(/[,,、]/).map(e=>e.trim()).filter(Boolean)}function Bi(e){return e?String(e).slice(0,10):``}function Vi(e){ji=e;let n=Z(`memoryEntriesStatus`);n&&(e?(n.style.display=``,n.innerHTML=q(e.rawText==null?t(e.key,e.params):e.rawText)):(n.style.display=`none`,n.innerHTML=``))}function Hi(e){let n=q(e.id),r=(e.tags||[]).map(e=>`<span class="memory-entry-tag-chip">${q(e)}</span>`).join(``),i=e.lastAccessAt?Bi(e.lastAccessAt):t(`memoryEntries.neverAccessed`);return`
|
|
723
|
+
<div class="memory-entry-item${ki.some(t=>t.id===e.id)?` low-value`:``}" data-id="${n}">
|
|
717
724
|
<div class="memory-entry-top">
|
|
718
|
-
<span class="memory-entry-badge ${e.type===`summary`?`summary`:`fact`}">${q(
|
|
725
|
+
<span class="memory-entry-badge ${e.type===`summary`?`summary`:`fact`}">${q(Ri(e.type))}</span>
|
|
719
726
|
<div class="memory-entry-content">${q(e.content||``)}</div>
|
|
720
727
|
<div class="memory-entry-actions">
|
|
721
728
|
<button type="button" data-act="edit">${q(t(`memoryEntries.editBtn`))}</button>
|
|
@@ -725,13 +732,13 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
725
732
|
<div class="memory-entry-meta">
|
|
726
733
|
<span>${q(t(`memoryEntries.importanceShort`))} ${Number(e.importance)||0}</span>
|
|
727
734
|
<span>${q(t(`memoryEntries.valueShort`))} ${q(e.value)}</span>
|
|
728
|
-
<span>${q(t(`memoryEntries.createdLabel`))} ${q(
|
|
735
|
+
<span>${q(t(`memoryEntries.createdLabel`))} ${q(Bi(e.createdAt)||`—`)}</span>
|
|
729
736
|
<span>${q(t(`memoryEntries.lastAccessLabel`))} ${q(i)} · ${q(t(`memoryEntries.accessCount`,{count:e.accessCount||0}))}</span>
|
|
730
737
|
${r?`<span>${q(t(`memoryEntries.tagsLabel`))}: ${r}</span>`:``}
|
|
731
738
|
</div>
|
|
732
|
-
</div>`}function
|
|
733
|
-
<span class="memory-entries-candidates-text">${q(t(`memoryEntries.candidatesHint`,{count:
|
|
734
|
-
<button type="button" class="memory-entries-compact-btn">${q(t(`memoryEntries.compactBtn`))}</button>`}}async function
|
|
739
|
+
</div>`}function Ui(){let e=Z(`memoryEntriesList`);if(!e)return;let n=Mi(),r=Ii(Oi.filter(e=>Li(e,n))),i=Z(`memoryEntriesCount`);if(i&&(i.textContent=t(`memoryEntries.count`,{shown:r.length,total:Oi.length})),!r.length){e.innerHTML=`<div class="memory-entries-empty">${q(Oi.length?t(`memoryEntries.noMatch`):t(`memoryEntries.empty`))}</div>`;return}e.innerHTML=r.map(Hi).join(``)}function Wi(){let e=Z(`memoryEntriesCandidates`);if(e){if(!ki.length){e.style.display=`none`,e.innerHTML=``;return}e.style.display=``,e.innerHTML=`
|
|
740
|
+
<span class="memory-entries-candidates-text">${q(t(`memoryEntries.candidatesHint`,{count:ki.length}))}</span>
|
|
741
|
+
<button type="button" class="memory-entries-compact-btn">${q(t(`memoryEntries.compactBtn`))}</button>`}}async function Gi(){let e=Z(`memoryEntriesList`);if(e){Vi({key:`memoryEntries.loading`}),e.innerHTML=``;try{let e=await K(`POST`,`/api/memory/manage`,{action:`review`});if(e&&e.httpStatus===404){Vi({key:`memoryEntries.unsupported`});return}if(!e||e.success!==!0){Vi({key:`memoryEntries.loadFail`,params:{error:e&&e.error||`unknown`}});return}Oi=Array.isArray(e.scored)?e.scored:[],ki=Array.isArray(e.candidates)?e.candidates:[],Vi(``),Wi(),Ui()}catch(e){r.warn(`[MemoryEntries] load failed:`,e.message),Vi({key:`memoryEntries.loadFail`,params:{error:e.message}})}}}async function Ki(){if(!Z(`memoryEntriesList`))return;let e=await Sn();if(!e||!e.connected){Oi=[],ki=[],Wi(),Z(`memoryEntriesList`).innerHTML=``,Vi({key:`memoryEntries.offline`});return}await Gi()}function qi(e){Ai=e,[`memoryEntriesRefreshBtn`].forEach(t=>{let n=Z(t);n&&(n.disabled=e)});let t=document.querySelector(`.memory-entries-compact-btn`);t&&(t.disabled=e),document.querySelectorAll(`.memory-entry-actions button`).forEach(t=>{t.disabled=e})}async function Ji(e,n,i){if(Ai)return!1;qi(!0);try{let r=await K(`POST`,`/api/memory/store`,e);if(!r||r.success!==!0)throw Error(r&&r.error||`unknown`);return H(t(n),`info`),await Gi(),!0}catch(e){return r.warn(`[MemoryEntries] store failed:`,e.message),H(t(i,{error:e.message}),`error`),!1}finally{qi(!1)}}async function Yi(e){await G(t(`memoryEntries.deleteConfirm`))&&await Ji({action:`delete`,memoryId:e.id},`memoryEntries.deleted`,`memoryEntries.deleteFail`)}async function Xi(){if(await G(t(`memoryEntries.compactConfirm`,{count:ki.length,threshold:10}))&&!Ai){qi(!0);try{let e=await K(`POST`,`/api/memory/manage`,{action:`compact`});if(!e||e.success!==!0)throw Error(e&&e.error||`unknown`);H(t(`memoryEntries.compactDone`,{facts:e.removedFacts??0,summaries:e.removedSummaries??0}),`info`),await Gi()}catch(e){r.warn(`[MemoryEntries] compact failed:`,e.message),H(t(`memoryEntries.compactFail`,{error:e.message}),`error`)}finally{qi(!1)}}}function Zi(e){let n=document.getElementById(`memoryEntryEditModal`);n&&n.remove();let r=document.createElement(`div`);r.className=`modal-overlay`,r.id=`memoryEntryEditModal`,r.innerHTML=`
|
|
735
742
|
<div class="modal-content" style="max-width: 560px;">
|
|
736
743
|
<div class="modal-header">
|
|
737
744
|
<h3>${q(t(`memoryEntries.editTitle`))}</h3>
|
|
@@ -739,7 +746,7 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
739
746
|
<div class="modal-body">
|
|
740
747
|
<div class="form-group">
|
|
741
748
|
<label>${q(t(`memoryEntries.typeLabel`))}</label>
|
|
742
|
-
<input type="text" value="${q(
|
|
749
|
+
<input type="text" value="${q(Ri(e.type))}${e.category?` · ${q(e.category)}`:``}" readonly style="background:var(--bg-subtle);color:var(--text-secondary);">
|
|
743
750
|
</div>
|
|
744
751
|
<div class="form-group">
|
|
745
752
|
<label>${q(t(`memoryEntries.contentLabel`))}</label>
|
|
@@ -758,7 +765,7 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
758
765
|
<button class="btn btn-cancel" id="memoryEntryEditCancel">${q(t(`memoryEntries.cancelBtn`))}</button>
|
|
759
766
|
<button class="btn btn-primary" id="memoryEntryEditSave" style="width:auto;">${q(t(`memoryEntries.saveBtn`))}</button>
|
|
760
767
|
</div>
|
|
761
|
-
</div>`,document.body.appendChild(r);let i=()=>r.remove();r.querySelector(`#memoryEntryEditCancel`).addEventListener(`click`,i),r.addEventListener(`click`,e=>{e.target===r&&i()}),r.querySelector(`#memoryEntryEditSave`).addEventListener(`click`,async()=>{let n=r.querySelector(`#memoryEntryEditContent`).value.trim();if(!n){H(t(`memoryEntries.contentEmpty`),`error`);return}let a={action:`update`,memoryId:e.id,type:e.type,content:n,tags:
|
|
768
|
+
</div>`,document.body.appendChild(r);let i=()=>r.remove();r.querySelector(`#memoryEntryEditCancel`).addEventListener(`click`,i),r.addEventListener(`click`,e=>{e.target===r&&i()}),r.querySelector(`#memoryEntryEditSave`).addEventListener(`click`,async()=>{let n=r.querySelector(`#memoryEntryEditContent`).value.trim();if(!n){H(t(`memoryEntries.contentEmpty`),`error`);return}let a={action:`update`,memoryId:e.id,type:e.type,content:n,tags:zi(r.querySelector(`#memoryEntryEditTags`).value)},o=Number(r.querySelector(`#memoryEntryEditImportance`).value);Number.isFinite(o)&&(a.importance=o),await Ji(a,`memoryEntries.saved`,`memoryEntries.saveFail`)&&i()})}function Qi(){Wi(),Ui(),ji&&Vi(ji)}function $i(){Di||(Di=!0,Z(`memoryEntriesRefreshBtn`)?.addEventListener(`click`,()=>Ki()),Z(`memoryEntriesSearch`)?.addEventListener(`input`,()=>Ui()),Z(`memoryEntriesTypeFilter`)?.addEventListener(`change`,()=>Ui()),Z(`memoryEntriesSort`)?.addEventListener(`change`,()=>Ui()),Z(`memoryEntriesList`)?.addEventListener(`click`,e=>{let t=e.target.closest(`.memory-entry-item`);if(!t)return;let n=Oi.find(e=>String(e.id)===t.dataset.id);if(!n)return;let r=e.target.closest(`[data-act]`);if(r){r.dataset.act===`edit`?Zi(n):r.dataset.act===`delete`&&Yi(n);return}e.target.closest(`.memory-entry-content`)&&t.classList.toggle(`expanded`)}),Z(`memoryEntriesCandidates`)?.addEventListener(`click`,e=>{e.target.closest(`.memory-entries-compact-btn`)&&Xi()}),s(()=>Qi()))}var ea=!1,ta={connected:!0,ragAvailable:!0},na=!1,ra=!1,ia=!1,Q=e=>document.getElementById(e);function aa(){return document.querySelector(`input[name="memoryEmbeddingMode"]:checked`)?.value||`openai-compat`}var oa=()=>aa()===`local`;function sa(){let e=oa()?`none`:``;[`memoryRemoteGroup`,`memoryModelGroup`,`memoryApiKeyGroup`,`memoryDimsGroup`,`memoryPrefixGroup`,`memoryTestRow`].forEach(t=>{let n=Q(t);n&&(n.style.display=e)});let t=Q(`memoryLocalNotice`);t&&(t.style.display=oa()?``:`none`)}function ca(){let e={enabled:Q(`memoryEnabled`)?.checked===!0,mode:aa()};if(oa())return e.modelName=``,e.queryPrefix=``,e.dimensions=0,e;e.modelName=(Q(`memoryModelInput`)?.value||``).trim(),e.baseUrl=(Q(`memoryBaseUrlInput`)?.value||``).trim(),e.queryPrefix=(Q(`memoryPrefixInput`)?.value||``).trim();let t=Number(Q(`memoryDimsInput`)?.value);e.dimensions=Number.isFinite(t)&&t>0?Math.floor(t):0;let n=(Q(`memoryApiKeyInput`)?.value||``).trim();return n&&(e.apiKey=n),e}function la(){let e=Q(`memoryEnabledLabel`);e&&(e.textContent=Q(`memoryEnabled`)?.checked===!0?t(`memoryPanel.enabled`):t(`memoryPanel.disabled`))}function ua(){let e=Q(`memoryEnabled`);e&&(e.disabled=na||ra)}function da(e){Q(`memoryEnabled`).checked=e.enabled===!0,la();let t=document.querySelector(`input[name="memoryEmbeddingMode"][value="${e.mode===`local`?`local`:`openai-compat`}"]`);t&&(t.checked=!0),Q(`memoryBaseUrlInput`).value=e.baseUrl||``,Q(`memoryModelInput`).value=e.modelName||``,Q(`memoryApiKeyInput`).value=``,Q(`memoryApiKeyClearBtn`).style.display=e.hasApiKey?``:`none`,Q(`memoryDimsInput`).value=e.dimensions>0?String(e.dimensions):``,Q(`memoryPrefixInput`).value=e.queryPrefix||``,sa()}function fa(e){let n=Q(`memoryStatus`);if(n){if(!e){n.innerHTML=`<span class="memory-status-muted">${q(t(`memoryPanel.statusLoading`))}</span>`;return}n.innerHTML=`
|
|
762
769
|
<div class="memory-status-row">
|
|
763
770
|
<span>${q(t(`memoryPanel.statusIndexed`,{indexed:e.indexed,total:e.total}))}</span>
|
|
764
771
|
<span class="memory-status-badge ${e.stale?`stale`:`fresh`}">${q(e.stale?t(`memoryPanel.statusStale`):t(`memoryPanel.statusFresh`))}</span>
|
|
@@ -768,18 +775,18 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
768
775
|
<span>${q(t(`memoryPanel.statusCurrent`))}: <code>${q(e.currentModelKey)}</code></span>
|
|
769
776
|
<span>${q(t(`memoryPanel.statusTier`))}: <code>${q(e.tier)}</code></span>
|
|
770
777
|
</div>
|
|
771
|
-
${e.stale?`<div class="memory-status-hint">${q(t(`memoryPanel.staleHint`))}</div>`:``}`}}function
|
|
778
|
+
${e.stale?`<div class="memory-status-hint">${q(t(`memoryPanel.staleHint`))}</div>`:``}`}}function pa(e){let n=Q(`memoryStatus`);if(!n)return;let r=e&&e.httpStatus===404?t(`memoryPanel.statusOldAgent`):t(`memoryPanel.statusFail`),i=e&&(e.error||e.message)||`unknown`;n.innerHTML=`
|
|
772
779
|
<div class="memory-status-row">
|
|
773
780
|
<span class="memory-status-badge fail">${q(r)}</span>
|
|
774
781
|
</div>
|
|
775
|
-
<div class="memory-status-keys"><span>${q(t(`memoryPanel.statusDetail`))}: <code>${q(i)}</code></span></div>`}function
|
|
782
|
+
<div class="memory-status-keys"><span>${q(t(`memoryPanel.statusDetail`))}: <code>${q(i)}</code></span></div>`}function ma(){let e=Q(`memoryStatus`);e&&(e.innerHTML=`<span class="memory-status-muted">${q(t(`memoryPanel.statusOffline`))}</span>`)}function ha(e){Q(`memoryReindexBtn`).disabled=e,Q(`memoryTestBtn`).disabled=e||oa(),Q(`memoryApiKeyClearBtn`).disabled=e}async function ga(){if(oa())return;ha(!0);let e=Q(`memoryTestResult`);e.textContent=t(`memoryPanel.testRunning`);try{let n=await K(`POST`,`/api/memory/test-embedding`,ca());if(!n||n.success!==!0)throw Error(n?.error||`unknown`);e.textContent=t(`memoryPanel.testOk`,{model:ca().modelName,dims:n.dimensions});let r=Q(`memoryDimsInput`);r.value=String(n.dimensions),H(t(`memoryPanel.testOk`,{model:ca().modelName,dims:n.dimensions}),`info`)}catch(n){e.textContent=t(`memoryPanel.testFail`,{error:n.message}),H(t(`memoryPanel.testFail`,{error:n.message}),`error`)}finally{ha(!1)}}async function _a(){if(ia)return{ok:!1,reason:`notLoaded`};ha(!0);try{let e=await K(`POST`,`/api/memory/embedding-config`,ca());if(!e||e.success!==!0)throw Error(e?.error||`unknown`);return Q(`memoryApiKeyInput`).value=``,await Sa(),{ok:!0}}catch(e){return{ok:!1,reason:`error`,error:e.message}}finally{ha(!1)}}async function va(){let e=await Sn();if(!e||!e.connected){H(t(`memoryPanel.saveSkippedOffline`),`info`);return}let n=await _a();n.ok||(n.reason===`notLoaded`?H(t(`memoryPanel.configNotLoaded`),`error`):H(t(`memoryPanel.saveFail`,{error:n.error}),`error`))}async function ya(){if(!await G(t(`memoryPanel.reindexConfirm`)))return;ha(!0);let e=Q(`memoryResult`);e.style.display=``,e.textContent=t(`memoryPanel.reindexRunning`);try{let n=await K(`POST`,`/api/memory/reindex`,{});if(!n||n.success!==!0)throw Error(n?.error||`unknown`);if(n.skipped===!0)e.textContent=t(`memoryPanel.reindexSkipped`);else{let r=t(`memoryPanel.reindexDone`,{indexed:n.indexed,total:n.total});n.failedBatches>0&&(r+=t(`memoryPanel.reindexBatchFail`,{count:n.failedBatches})),n.overWindow&&n.overWindow.count>0&&(r+=t(`memoryPanel.reindexOverWindow`,{count:n.overWindow.count,window:n.overWindow.window})),e.textContent=r,H(t(`memoryPanel.reindexDone`,{indexed:n.indexed,total:n.total}),`info`)}await Sa()}catch(n){e.textContent=t(`memoryPanel.reindexFail`,{error:n.message}),H(t(`memoryPanel.reindexFail`,{error:n.message}),`error`)}finally{ha(!1)}}async function ba(){if(await G(t(`memoryPanel.apiKeyClearConfirm`))){ha(!0);try{let e=await K(`POST`,`/api/memory/embedding-config`,{clearApiKey:!0});if(!e||e.success!==!0)throw Error(e?.error||`unknown`);Q(`memoryApiKeyClearBtn`).style.display=`none`,H(t(`memoryPanel.apiKeyCleared`),`info`)}catch(e){H(t(`memoryPanel.apiKeyClearFail`,{error:e.message}),`error`)}finally{ha(!1)}}}async function xa(){try{let e=await K(`GET`,`/api/memory/vector-status`);e&&e.success===!0?fa(e):pa(e)}catch(e){r.warn(`[MemoryPanel] status load failed:`,e.message),pa(e)}}async function Sa(){let e=(async()=>{ia=!0;try{let e=await K(`GET`,`/api/memory/embedding-config`);e&&e.success===!0&&e.config&&(da(e.config),ia=!1)}catch(e){r.warn(`[MemoryPanel] config load failed:`,e.message),H(t(`memoryPanel.statusFail`)+` — `+e.message,`error`)}})(),n=xa();await Promise.all([e,n])}function Ca(e){let n=Q(`memoryGate`),r=Q(`memoryMain`),i=document.querySelector(`.memory-scope-hint`),a=!e.connected||aa()===`local`&&!e.ragAvailable;if(na=a,ua(),[`memoryReindexBtn`,`memoryTestBtn`].forEach(e=>{let t=Q(e);t&&(t.disabled=a)}),!a){n.style.display=`none`,n.innerHTML=``,r.style.display=``,i&&(i.style.display=``);return}r.style.display=`none`,i&&(i.style.display=`none`),n.style.display=``;let o=!e.connected,s=o?`🔌`:`📚`,c=t(o?`memoryPanel.gateAgentOffTitle`:`memoryPanel.gateRagTitle`),l=t(o?`memoryPanel.gateAgentOffBody`:`memoryPanel.gateRagMissing`),u=t(o?`memoryPanel.goToAgentTab`:`memoryPanel.goToToolboxTab`),d=o?`agent`:`toolbox`;n.innerHTML=`
|
|
776
783
|
<div class="toolbox-empty" style="text-align:left; padding:24px 20px;">
|
|
777
784
|
<div style="display:flex; align-items:center; gap:10px; font-size:15px; font-weight:600; color:var(--text-secondary);">
|
|
778
785
|
<span style="font-size:22px;">${s}</span><span>${q(c)}</span>
|
|
779
786
|
</div>
|
|
780
787
|
<div style="margin-top:8px; line-height:1.7; color:var(--text-tertiary); font-size:13px;">${q(l)}</div>
|
|
781
788
|
<button class="toolbox-add-btn" data-goto-tab="${d}" style="width:auto; margin-top:14px; padding:8px 18px; border-style:solid; color:var(--brand-500); border-color:var(--brand-500);">${q(u)}</button>
|
|
782
|
-
</div>`}async function ya(){let e=Q(`memoryEnabled`),n=e.checked===!0;Qi=!0,aa();try{let e=await K(`POST`,`/api/memory/embedding-config`,{enabled:n});if(!e||e.success!==!0)throw Error(e?.error||`unknown`);H(t(n?`memoryPanel.toggleOnSaved`:`memoryPanel.toggleOffSaved`),`info`),await ga()}catch(i){r.warn(`[MemoryPanel] toggle persist failed:`,i.message),e.checked=!n,H(t(`memoryPanel.toggleFail`,{error:i.message}),`error`)}finally{Qi=!1,aa(),ia()}}function ba(){Yi||(Yi=!0,Ji(),Q(`memoryTestBtn`)?.addEventListener(`click`,da),Q(`memoryReindexBtn`)?.addEventListener(`click`,ma),Q(`memoryApiKeyClearBtn`)?.addEventListener(`click`,ha),Q(`memoryGate`)?.addEventListener(`click`,e=>{let t=e.target.closest(`[data-goto-tab]`);t&&document.querySelector(`.tab-nav-btn[data-tab="${t.dataset.gotoTab}"]`)?.click()}),document.querySelectorAll(`input[name="memoryEmbeddingMode"]`).forEach(e=>{e.addEventListener(`change`,()=>{na(),va(Xi)})}),Q(`memoryEnabled`)?.addEventListener(`change`,()=>{ia(),ya()}))}async function xa(){let e=await Cr();if(Xi=e,va(e),!e.connected){la(),await Vi();return}await _a(),await Vi()}var Sa=1;function Ca(){let e=document.getElementById(`saveBar`);if(!e)return;let t=()=>{let t=e.getBoundingClientRect().bottom>=window.innerHeight-Sa;e.classList.toggle(`floating`,t)};window.addEventListener(`scroll`,t,{passive:!0}),window.addEventListener(`resize`,t),typeof ResizeObserver<`u`&&new ResizeObserver(t).observe(document.body),t()}var wa=`https://raw.githubusercontent.com/xiweicheng/ai-helper/main`;function Ta(){return E&&E.version?E.version:`latest`}function Ea(e){return`curl -fsSL ${wa}/install.sh | AGENT_VERSION=${e} bash`}function Da(e){return`[Net.ServicePointManager]::SecurityProtocol=[Net.SecurityProtocolType]::Tls12; $env:AGENT_VERSION='${e}'; irm ${wa}/install.ps1 | iex`}function Oa(){let e=navigator.platform||``,t=navigator.userAgent||``;return/^win/i.test(e)||/\bwindows\b/i.test(t)}async function ka(e,n){if(e)try{await navigator.clipboard.writeText(e),n(t(`agentConfig.copyCmdSuccess`),`success`)}catch(e){r.warn(`[Options] clipboard write failed:`,e.message),n(t(`agentConfig.copyCmdFailed`),`error`)}}function Aa(){let e=Ta(),n=document.getElementById(`agentInstallTitle`);n&&(n.textContent=t(`agentConfig.installGuideTitle`,{version:e}));let r=document.getElementById(`installCmdUnix`),i=document.getElementById(`installCmdWin`);r&&(r.textContent=Ea(e)),i&&(i.textContent=Da(e))}function ja(e=H){if(!document.getElementById(`agentInstallGuide`))return;Aa(),s(Aa);let t=document.getElementById(`installCmdUnix`),n=document.getElementById(`installCmdWin`);document.getElementById(`copyInstallUnix`)?.addEventListener(`click`,()=>ka(t?.textContent,e)),document.getElementById(`copyInstallWin`)?.addEventListener(`click`,()=>ka(n?.textContent,e)),document.getElementById(`copyInstallAuto`)?.addEventListener(`click`,()=>{ka(Oa()?n?.textContent:t?.textContent,e)})}var $=[],Ma={},Na={};function Pa(){return document.querySelector(`.tab-panel.active`)?.dataset.tab||null}async function Fa(){ft();let e=Na[Pa()];if(e)try{await e()}catch(e){r.warn(`[Options] tab agent save failed:`,e.message)}}function Ia(e){document.querySelectorAll(`.tab-nav-btn`).forEach(e=>e.classList.remove(`active`)),document.querySelectorAll(`.tab-panel`).forEach(e=>e.classList.remove(`active`));let t=document.querySelector(`.tab-nav-btn[data-tab="${e}"]`),n=document.querySelector(`.tab-panel[data-tab="${e}"]`);t&&t.classList.add(`active`),n&&n.classList.add(`active`),window.location.hash!==`#`+e&&history.replaceState(null,``,`#`+e),Ma[e]?.()}function La(){let e=window.location.hash.replace(`#`,``);[`basic`,`toolbar`,`react`,`chat`,`agent`,`toolbox`,`knowledge`,`memory`].includes(e)&&Ia(e)}document.addEventListener(`DOMContentLoaded`,async function(){await ce(),await n(),i(),s(()=>{i(),yt().then(e=>{$=e,bt($)})});let e=document.getElementById(`languageInput`),r=document.getElementById(`languageDropdown`);e&&r&&((t=>{r.innerHTML=``,c.forEach(({code:e,label:n})=>{let i=document.createElement(`div`);i.className=`model-option`+(e===t?` selected`:``),i.dataset.value=e,i.textContent=n,r.appendChild(i)});let n=c.find(e=>e.code===t);e.value=n?n.label:``})(o()),e.addEventListener(`click`,e=>{e.stopPropagation(),r.classList.toggle(`show`)}),r.addEventListener(`click`,n=>{let o=n.target.closest(`.model-option`);if(!o)return;n.stopPropagation();let s=o.dataset.value;r.querySelectorAll(`.model-option`).forEach(e=>e.classList.remove(`selected`)),o.classList.add(`selected`),e.value=o.textContent,r.classList.remove(`show`),a(s),i(),H(t(`settings.languageChanged`),`success`)}),document.addEventListener(`click`,t=>{!r.contains(t.target)&&t.target!==e&&r.classList.remove(`show`)}));let l=()=>{let e=ue();document.querySelectorAll(`#themeSegment input[name="themePref"]`).forEach(t=>{t.checked=t.value===e})};l(),document.querySelectorAll(`#themeSegment input[name="themePref"]`).forEach(e=>{e.addEventListener(`change`,()=>{e.checked&&se(e.value)})}),le(l),document.querySelectorAll(`.tab-nav-btn`).forEach(e=>{e.addEventListener(`click`,function(){Ia(this.dataset.tab)})}),document.querySelectorAll(`.info-box, .warning-box`).forEach(e=>{let t=e.querySelector(`h3`);if(!t||e.classList.contains(`collapsible`))return;e.classList.add(`collapsible`,`collapsed`),t.classList.add(`collapsible-header`);let n=document.createElement(`span`);n.className=`collapsible-arrow`,n.textContent=`▶`,t.appendChild(n);let r=document.createElement(`div`);for(r.className=`collapsible-body`,r.style.display=`none`;t.nextSibling;)r.appendChild(t.nextSibling);e.appendChild(r)}),document.querySelectorAll(`.collapsible .collapsible-header`).forEach(e=>{let t=e.closest(`.collapsible`),n=t?.querySelector(`.collapsible-body`),r=e.querySelector(`.collapsible-arrow`);!t||!n||e.addEventListener(`click`,()=>{t.classList.contains(`open`)?(t.classList.remove(`open`),t.classList.add(`collapsed`),n.style.display=`none`,r&&(r.textContent=`▶`)):(t.classList.add(`open`),t.classList.remove(`collapsed`),n.style.display=``,r&&(r.textContent=`▼`))})}),ja(),Ma.memory=xa,Na.memory=pa,Ma.toolbox=()=>{J().catch(()=>{})},Ma.knowledge=()=>{Yr().catch(()=>{})},La(),window.addEventListener(`hashchange`,La),chrome.storage.local.get([`optionsInitialTab`],e=>{e.optionsInitialTab&&(Ia(e.optionsInitialTab),chrome.storage.local.remove(`optionsInitialTab`))}),chrome.runtime.onMessage.addListener(e=>{e.type===`SWITCH_TAB`&&e.tab&&Ia(e.tab)}),await g(),dt(),rn(),$=await yt(),bt($);let u=document.getElementById(`enableSelectionToolbar`),d=document.getElementById(`toolbarConfig`),f=document.getElementById(`toolbarToggleLabel`);d&&u&&(u.checked?d.classList.remove(`disabled`):d.classList.add(`disabled`),f&&(f.textContent=u.checked?t(`common.enabled`):t(`common.disabled`))),document.getElementById(`saveBtn`).addEventListener(`click`,Fa),Ca();let p=document.getElementById(`modelInput`),m=document.getElementById(`modelDropdown`);p.addEventListener(`click`,function(e){e.stopPropagation(),m.classList.contains(`show`)||(Le(m,``),Ue(De),p.select()),m.classList.toggle(`show`)}),p.addEventListener(`input`,function(){R(),m.classList.add(`show`),Le(m,this.value)}),p.addEventListener(`blur`,function(){p.value=De,Ue(De)}),m.addEventListener(`click`,function(e){if(e.target.classList.contains(`delete-model-btn`)){e.stopPropagation();let t=e.target.closest(`.model-option`).dataset.value;Re(t);return}let t=e.target.closest(`.ctx-set-btn`);if(t){e.stopPropagation();let n=e.target.closest(`.model-option`);n&&Te(t,n,{onPreview:e=>{Ge(n,e),We(`modelInput`,`modelSelectedCtxBadge`,`modelDropdown`)},onCommit:e=>Ke(n,e),onReset:()=>Ke(n,0)});return}let n=e.target.closest(`.model-option`);if(n){e.stopPropagation(),R();let t=n.dataset.value;Oe(t),p.value=t,Ue(t),m.classList.remove(`show`)}}),document.addEventListener(`click`,function(e){!m.contains(e.target)&&e.target!==p&&!Ee(e.target)&&m.classList.remove(`show`)});let h=document.getElementById(`addModelToggleBtn`),_=document.getElementById(`addModelForm`),v=document.getElementById(`addModelName`),y=document.getElementById(`addModelContextWindow`),b=document.getElementById(`confirmAddModelBtn`),x=document.getElementById(`cancelAddModelBtn`);h&&_&&(h.addEventListener(`click`,function(){let e=_.style.display!==`none`;_.style.display=e?`none`:``,h.textContent=t(e?`settings.addModel`:`settings.collapse`),e||(v.value=``,y.value=``,v.focus())}),x.addEventListener(`click`,function(){_.style.display=`none`,h.textContent=t(`settings.addModel`),v.value=``,y.value=``}),b.addEventListener(`click`,function(){let e=v.value.trim(),n=parseInt(y.value)||0;if(!e){H(`❌ `+t(`settings.modelNameRequired`),`error`);return}Pe(e,n),p.value=e,Oe(e),Ue(e),chrome.storage.local.set({modelName:e}),_.style.display=`none`,h.textContent=t(`settings.addModel`),v.value=``,y.value=``,H(`✅ `+t(`settings.modelAdded`),`success`)}),v.addEventListener(`keydown`,function(e){e.key===`Enter`&&b.click()}),y.addEventListener(`keydown`,function(e){e.key===`Enter`&&b.click()}));let ee=document.getElementById(`enableImageInput`),te=document.getElementById(`imageModelGroup`),S=document.getElementById(`imageApiGroup`),ne=document.getElementById(`imageApiKeyGroup`);ee&&te&&ee.addEventListener(`change`,function(){te.style.display=this.checked?``:`none`,S&&(S.style.display=this.checked?``:`none`),ne&&(ne.style.display=this.checked?``:`none`),chrome.storage.local.set({enableImageInput:this.checked})});let C=document.getElementById(`imageModelInput`),w=document.getElementById(`imageModelDropdown`);C&&w&&(C.addEventListener(`click`,function(e){e.stopPropagation(),w.classList.contains(`show`)||(Le(w,``),Qe(ke),C.select()),w.classList.toggle(`show`)}),C.addEventListener(`input`,function(){R(),w.classList.add(`show`),Le(w,this.value)}),C.addEventListener(`blur`,function(){C.value=ke,Qe(ke)}),w.addEventListener(`click`,function(e){if(e.target.classList.contains(`delete-model-btn`)){e.stopPropagation();let t=e.target.closest(`.model-option`).dataset.value;Je(t);return}let t=e.target.closest(`.ctx-set-btn`);if(t){e.stopPropagation();let n=e.target.closest(`.model-option`);n&&Te(t,n,{onPreview:e=>{Ge(n,e),We(`imageModelInput`,`imageModelSelectedCtxBadge`,`imageModelDropdown`)},onCommit:e=>Xe(n,e),onReset:()=>Xe(n,0)});return}let n=e.target.closest(`.model-option`);if(n){e.stopPropagation(),R();let t=n.dataset.value;Ae(t),C.value=t,Qe(t),w.classList.remove(`show`)}}),document.addEventListener(`click`,function(e){!w.contains(e.target)&&e.target!==C&&!Ee(e.target)&&w.classList.remove(`show`)}));let T=document.getElementById(`addImageModelToggleBtn`),re=document.getElementById(`addImageModelForm`),ie=document.getElementById(`addImageModelName`),oe=document.getElementById(`addImageModelContextWindow`),E=document.getElementById(`confirmAddImageModelBtn`),D=document.getElementById(`cancelAddImageModelBtn`);T&&re&&(T.addEventListener(`click`,function(){let e=re.style.display!==`none`;re.style.display=e?`none`:``,T.textContent=t(e?`settings.addModel`:`settings.collapse`),e||(ie.value=``,oe.value=``,ie.focus())}),D.addEventListener(`click`,function(){re.style.display=`none`,T.textContent=t(`settings.addModel`),ie.value=``,oe.value=``}),E.addEventListener(`click`,function(){let e=ie.value.trim(),n=parseInt(oe.value)||0;if(!e){H(`❌ `+t(`settings.modelNameRequired`),`error`);return}qe(e,n),C.value=e,Ae(e),Qe(e),chrome.storage.local.set({imageModelName:e}),re.style.display=`none`,T.textContent=t(`settings.addModel`),ie.value=``,oe.value=``,H(`✅ `+t(`settings.imageModelAdded`),`success`)}),ie.addEventListener(`keydown`,function(e){e.key===`Enter`&&E.click()}),oe.addEventListener(`keydown`,function(e){e.key===`Enter`&&E.click()}));async function O({apiBaseEl:e,apiKeyEl:n,dropdownId:r,addFn:i,btn:a,silent:o}){let s=(e?.value||``).trim(),c=(n?.value||``).trim();if(!s||!c){o||H(`⚠️ `+t(`settings.fetchModelsNeedConfig`),`error`);return}let l=a?a.textContent:``;a&&(a.disabled=!0,a.textContent=t(`settings.fetchModelsLoading`));try{let e=await _t({apiBase:s,apiKey:c}),n=0,a=document.getElementById(r);for(let t of e)a&&a.querySelector(`.model-option[data-value="${CSS.escape(t)}"]`)||(i(t,0),n++);o||H(t(`settings.fetchModelsSuccess`,{total:e.length,added:n}),`success`)}catch(e){o||(e&&(e.status===401||e.status===403)?H(t(`settings.fetchModelsAuthFailed`),`error`):e&&e.reason===`parse`?H(t(`settings.fetchModelsEmpty`),`info`):H(t(`settings.fetchModelsFailed`),`error`))}finally{a&&(a.disabled=!1,a.textContent=l||t(`settings.fetchModels`))}}let k=``,de=null;function fe(e,t){let n=(e||``).trim(),r=(t||``).trim();if(!n||!r)return;let i=`${n}|${r}`;i!==k&&(clearTimeout(de),de=setTimeout(()=>{k=i;let e=document.getElementById(`fetchModelsBtn`);e&&e.disabled||O({apiBaseEl:document.getElementById(`apiBase`),apiKeyEl:document.getElementById(`apiKey`),dropdownId:`modelDropdown`,addFn:Pe,btn:null,silent:!0})},500))}let pe=document.getElementById(`fetchModelsBtn`);pe&&pe.addEventListener(`click`,()=>{O({apiBaseEl:document.getElementById(`apiBase`),apiKeyEl:document.getElementById(`apiKey`),dropdownId:`modelDropdown`,addFn:Pe,btn:pe,silent:!1})});let me=document.getElementById(`fetchImageModelsBtn`);me&&me.addEventListener(`click`,()=>{O({apiBaseEl:document.getElementById(`imageApiBase`),apiKeyEl:document.getElementById(`imageApiKey`),dropdownId:`imageModelDropdown`,addFn:qe,btn:me,silent:!1})});let he=document.getElementById(`apiBase`),A=document.getElementById(`apiBaseDropdown`);he&&A&&(he.addEventListener(`click`,function(e){e.stopPropagation(),A.querySelectorAll(`.model-option`).forEach(e=>{e.style.display=``}),A.classList.toggle(`show`),it(he.value.trim())}),A.addEventListener(`click`,function(e){if(e.target.classList.contains(`delete-model-btn`)){e.stopPropagation();let t=e.target.closest(`.model-option`).dataset.value;tt(t);return}let n=e.target.closest(`.model-option`);if(n){e.stopPropagation();let r=n.dataset.value;he.value=r,it(r),A.classList.remove(`show`),chrome.storage.local.set({apiBase:r}),H(`✅ `+t(`settings.apiBaseSwitched`),`info`),fe(r,(document.getElementById(`apiKey`)?.value||``).trim())}}),document.addEventListener(`click`,function(e){!A.contains(e.target)&&e.target!==he&&A.classList.remove(`show`)}),he.addEventListener(`blur`,function(){let e=this.value.trim();e&&(chrome.storage.local.set({apiBase:e}),et(e),it(e))}),he.addEventListener(`input`,function(){let e=this.value.trim().toLowerCase();A.classList.add(`show`);let t=A.querySelectorAll(`.model-option`),n=!1;t.forEach(t=>{let r=(t.dataset.value||``).toLowerCase(),i=(t.dataset.label||``).toLowerCase();!e||r.includes(e)||i.includes(e)?(t.style.display=``,n=!0):t.style.display=`none`}),!n&&e&&t.forEach(e=>{e.style.display=``})}));let j=document.getElementById(`addApiBaseToggleBtn`),_e=document.getElementById(`addApiBaseForm`),ve=document.getElementById(`addApiBaseUrl`),ye=document.getElementById(`addApiBaseLabel`),M=document.getElementById(`confirmAddApiBaseBtn`),N=document.getElementById(`cancelAddApiBaseBtn`);j&&_e&&(j.addEventListener(`click`,function(){let e=_e.style.display!==`none`;_e.style.display=e?`none`:``,j.textContent=t(e?`settings.addAddress`:`settings.collapse`),e||(ve.value=``,ye.value=``,ve.focus())}),N.addEventListener(`click`,function(){_e.style.display=`none`,j.textContent=t(`settings.addAddress`),ve.value=``,ye.value=``}),M.addEventListener(`click`,function(){let e=ve.value.trim(),n=ye.value.trim();if(!e){H(`❌ `+t(`settings.apiBaseRequired`),`error`);return}try{new URL(e)}catch{H(`❌ `+t(`settings.urlInvalid`),`error`);return}et(e,n),he.value=e,it(e),chrome.storage.local.set({apiBase:e}),_e.style.display=`none`,j.textContent=t(`settings.addAddress`),ve.value=``,ye.value=``,H(`✅ `+t(`settings.apiBaseAdded`),`success`)}),ve.addEventListener(`keydown`,function(e){e.key===`Enter`&&M.click()}),ye.addEventListener(`keydown`,function(e){e.key===`Enter`&&M.click()}));let P=document.getElementById(`imageApiBase`),F=document.getElementById(`imageApiBaseDropdown`);P&&F&&(P.addEventListener(`click`,function(e){e.stopPropagation(),F.querySelectorAll(`.model-option`).forEach(e=>{e.style.display=``}),F.classList.toggle(`show`),ut(P.value.trim())}),F.addEventListener(`click`,function(e){if(e.target.classList.contains(`delete-model-btn`)){e.stopPropagation();let t=e.target.closest(`.model-option`).dataset.value;st(t);return}let n=e.target.closest(`.model-option`);if(n){e.stopPropagation();let r=n.dataset.value;P.value=r,ut(r),F.classList.remove(`show`),chrome.storage.local.set({imageApiBase:r}),H(`✅ `+t(`settings.imageApiBaseSwitched`),`info`)}}),document.addEventListener(`click`,function(e){!F.contains(e.target)&&e.target!==P&&F.classList.remove(`show`)}),P.addEventListener(`blur`,function(){let e=this.value.trim();e&&(chrome.storage.local.set({imageApiBase:e}),ot(e),ut(e))}),P.addEventListener(`input`,function(){let e=this.value.trim().toLowerCase();F.classList.add(`show`);let t=F.querySelectorAll(`.model-option`),n=!1;t.forEach(t=>{let r=(t.dataset.value||``).toLowerCase(),i=(t.dataset.label||``).toLowerCase();!e||r.includes(e)||i.includes(e)?(t.style.display=``,n=!0):t.style.display=`none`}),!n&&e&&t.forEach(e=>{e.style.display=``})}));let I=document.getElementById(`addImageApiBaseToggleBtn`),be=document.getElementById(`addImageApiBaseForm`),L=document.getElementById(`addImageApiBaseUrl`),xe=document.getElementById(`addImageApiBaseLabel`),Se=document.getElementById(`confirmAddImageApiBaseBtn`),Ce=document.getElementById(`cancelAddImageApiBaseBtn`);I&&be&&(I.addEventListener(`click`,function(){let e=be.style.display!==`none`;be.style.display=e?`none`:``,I.textContent=t(e?`settings.addAddress`:`settings.collapse`),e||(L.value=``,xe.value=``,L.focus())}),Ce.addEventListener(`click`,function(){be.style.display=`none`,I.textContent=t(`settings.addAddress`),L.value=``,xe.value=``}),Se.addEventListener(`click`,function(){let e=L.value.trim(),n=xe.value.trim();if(!e){H(`❌ `+t(`settings.apiBaseRequired`),`error`);return}try{new URL(e)}catch{H(`❌ `+t(`settings.urlInvalid`),`error`);return}ot(e,n),P.value=e,ut(e),chrome.storage.local.set({imageApiBase:e}),be.style.display=`none`,I.textContent=t(`settings.addAddress`),L.value=``,xe.value=``,H(`✅ `+t(`settings.imageApiBaseAdded`),`success`)}),L.addEventListener(`keydown`,function(e){e.key===`Enter`&&Se.click()}),xe.addEventListener(`keydown`,function(e){e.key===`Enter`&&Se.click()}));let we=document.getElementById(`imageApiKey`),je=document.getElementById(`toggleImageApiKeyBtn`);if(we&&we.addEventListener(`blur`,function(){chrome.storage.local.set({imageApiKey:ae(this.value.trim())})}),we&&je){let e=je.querySelector(`.icon-eye-open`),t=je.querySelector(`.icon-eye-closed`);je.addEventListener(`click`,function(){we.type===`password`?(we.type=`text`,e.style.display=`none`,t.style.display=`block`):(we.type=`password`,e.style.display=`block`,t.style.display=`none`)})}let z=document.getElementById(`toggleToken`),Me=document.getElementById(`apiKey`),Ne=z.querySelector(`.icon-eye-open`),Fe=z.querySelector(`.icon-eye-closed`);z.addEventListener(`click`,function(){Me.type===`password`?(Me.type=`text`,Ne.style.display=`none`,Fe.style.display=`block`):(Me.type=`password`,Ne.style.display=`block`,Fe.style.display=`none`)});let Ie=document.getElementById(`resetSystemPromptBtn`);Ie&&Ie.addEventListener(`click`,function(){document.getElementById(`systemPrompt`).value=ge()});let ze=document.getElementById(`toolbarIconOnly`);ze&&ze.addEventListener(`change`,function(){St()});let Be=document.getElementById(`enableSelectionToolbar`),Ve=document.getElementById(`toolbarConfig`),He=document.getElementById(`toolbarToggleLabel`);function Ye(){let e=Be&&Be.checked;Ve&&(e?Ve.classList.remove(`disabled`):Ve.classList.add(`disabled`)),He&&(He.textContent=t(e?`common.enabled`:`common.disabled`))}Be&&Be.addEventListener(`change`,function(){Ye(),St()}),document.getElementById(`toolbarToolsList`).addEventListener(`click`,function(e){let t=e.target.closest(`[data-action]`);if(!t)return;let n=t.dataset.action,r=parseInt(t.dataset.index);switch(n){case`moveUp`:$=Ct($,r,-1),Ra();break;case`moveDown`:$=Ct($,r,1),Ra();break;case`edit`:Tt($,r);break;case`delete`:$=wt($,r),Ra();break}}),document.getElementById(`addCustomToolBtn`).addEventListener(`click`,function(){Tt($,-1)}),document.getElementById(`domainAddBtn`).addEventListener(`click`,function(){let e=document.getElementById(`domainAddInput`);At(e.value,t=>{t.error?H(`❌ `+t.error,`error`):e.value=``})}),document.getElementById(`domainAddInput`).addEventListener(`keydown`,function(e){e.key===`Enter`&&At(this.value,e=>{e.error?H(`❌ `+e.error,`error`):this.value=``})}),document.getElementById(`domainBlocklistList`).addEventListener(`click`,function(e){let t=e.target.closest(`.domain-blocklist-item-remove`);t&&jt(t.dataset.domain)}),Ot(),chrome.storage.onChanged.addListener((e,t)=>{t===`local`&&e.blockedDomains&&Ot()}),document.getElementById(`toolEditCancel`).addEventListener(`click`,function(){Et()}),document.getElementById(`toolEditClose`).addEventListener(`click`,function(){Et()}),document.getElementById(`toolEditSave`).addEventListener(`click`,function(){let e=Dt($);if(e.error){H(`❌ `+e.error,`error`);return}$=e.tools,Ra()});let Ze=document.getElementById(`reflectionEnabled`),B=document.getElementById(`reflectionToggleLabel`),$e=document.querySelectorAll(`.reflection-sub`),nt=document.getElementById(`postReflectionEnabled`),rt=document.getElementById(`postReflectionLabel`),V=document.getElementById(`subtaskReflectionEnabled`),at=document.getElementById(`subtaskReflectionLabel`);function ct(){let e=!!(Ze&&Ze.checked);$e.forEach(t=>{t.style.display=e?`block`:`none`}),B&&(B.textContent=t(e?`common.enabled`:`common.disabled`))}function lt(e){chrome.storage.local.get([`reflectionConfig`],t=>{let n=t.reflectionConfig||{postReflection:{},subtaskReflection:{}};e(n),chrome.storage.local.set({reflectionConfig:n})})}Ze&&(Ze.addEventListener(`change`,function(){ct();let e=this.checked;lt(t=>{t.enabled=e})}),ct()),nt&&(nt.addEventListener(`change`,function(){rt&&(rt.textContent=this.checked?t(`common.enabled`):t(`common.disabled`));let e=this.checked;lt(t=>{t.postReflection||={},t.postReflection.enabled=e})}),rt&&(rt.textContent=nt.checked?t(`common.enabled`):t(`common.disabled`))),V&&(V.addEventListener(`change`,function(){at&&(at.textContent=this.checked?t(`common.enabled`):t(`common.disabled`));let e=this.checked;lt(t=>{t.subtaskReflection||={},t.subtaskReflection.enabled=e})}),at&&(at.textContent=V.checked?t(`common.enabled`):t(`common.disabled`)));let ft=document.getElementById(`streamEnabled`),pt=document.getElementById(`streamEnabledLabel`);function mt(){let e=document.getElementById(`streamExpandToolsWrap`);e&&(e.style.display=ft&&ft.checked?`block`:`none`)}ft&&pt&&(ft.addEventListener(`change`,function(){pt&&(pt.textContent=ft.checked?t(`common.enabled`):t(`common.disabled`)),chrome.storage.local.set({streamEnabled:ft.checked}),mt()}),pt&&(pt.textContent=ft.checked?t(`common.enabled`):t(`common.disabled`)),mt());let ht=document.getElementById(`streamExpandTools`),gt=document.getElementById(`streamExpandToolsLabel`);ht&>&&(ht.addEventListener(`change`,function(){gt.textContent=this.checked?t(`common.enabled`):t(`common.disabled`),chrome.storage.local.set({streamExpandTools:this.checked})}),gt.textContent=ht.checked?t(`common.enabled`):t(`common.disabled`));let vt=document.getElementById(`toolConfirmationEnabled`),xt=document.getElementById(`toolConfirmationEnabledLabel`);vt&&xt&&(vt.addEventListener(`change`,function(){xt.textContent=this.checked?t(`common.enabled`):t(`common.disabled`),chrome.storage.local.set({toolConfirmationEnabled:this.checked})}),xt.textContent=vt.checked?t(`common.enabled`):t(`common.disabled`));let U=document.getElementById(`completionVerificationEnabled`),kt=document.getElementById(`completionVerificationEnabledLabel`),Mt=document.querySelectorAll(`.completion-verification-sub`);function Nt(){let e=!!(U&&U.checked);Mt.forEach(t=>{t.style.display=e?`block`:`none`})}U&&kt&&(U.addEventListener(`change`,function(){let e=this.checked;Nt(),kt.textContent=t(e?`common.enabled`:`common.disabled`),chrome.storage.local.get([`completionVerificationConfig`],t=>{let n=Object.assign({},t.completionVerificationConfig||{},{enabled:e});chrome.storage.local.set({completionVerificationConfig:n})})}),kt.textContent=U.checked?t(`common.enabled`):t(`common.disabled`),Nt());let Pt=document.getElementById(`completionVerificationRerunEnabled`),Ft=document.getElementById(`completionVerificationRerunEnabledLabel`);Pt&&Ft&&(Pt.addEventListener(`change`,function(){let e=this.checked;Ft.textContent=t(e?`common.enabled`:`common.disabled`),chrome.storage.local.get([`completionVerificationConfig`],t=>{let n=Object.assign({},t.completionVerificationConfig||{},{rerunEnabled:e});chrome.storage.local.set({completionVerificationConfig:n})})}),Ft.textContent=Pt.checked?t(`common.enabled`):t(`common.disabled`));let It=document.getElementById(`networkAccessEnabled`),Lt=document.getElementById(`networkAccessEnabledLabel`);It&&Lt&&(It.addEventListener(`change`,function(){Lt.textContent=this.checked?t(`common.enabled`):t(`common.disabled`),en(this.checked),chrome.storage.local.set({networkAccessEnabled:this.checked})}),Lt.textContent=It.checked?t(`common.enabled`):t(`common.disabled`),en(It.checked));let zt=document.getElementById(`networkHostAddBtn`),Bt=document.getElementById(`networkHostAddInput`);zt&&Bt&&(zt.addEventListener(`click`,function(){Qt(Bt.value,e=>{e.error?H(`❌ `+e.error,`error`):Bt.value=``})}),Bt.addEventListener(`keydown`,function(e){e.key===`Enter`&&Qt(this.value,e=>{e.error?H(`❌ `+e.error,`error`):this.value=``})}));let Vt=document.getElementById(`networkAllowlistList`);Vt&&Vt.addEventListener(`click`,function(e){let t=e.target.closest(`.domain-blocklist-item-remove`);t&&$t(t.dataset.host)}),Xt(),chrome.storage.onChanged.addListener((e,n)=>{if(n===`local`&&(e.allowedNetworkHosts&&Xt(),e.networkAccessEnabled&&It&&Lt)){let n=e.networkAccessEnabled.newValue===!0;It.checked=n,Lt.textContent=t(n?`common.enabled`:`common.disabled`),en(n)}});let Ut=document.getElementById(`enableExecutionLog`),Gt=document.getElementById(`enableExecutionLogLabel`);Ut&&Gt&&(Ut.addEventListener(`change`,function(){Gt.textContent=this.checked?t(`common.enabled`):t(`common.disabled`),chrome.storage.local.set({enableExecutionLog:this.checked})}),Gt.textContent=Ut.checked?t(`common.enabled`):t(`common.disabled`));let qt=document.getElementById(`completionSoundEnabled`);qt&&qt.addEventListener(`change`,function(){chrome.storage.local.set({completionSoundEnabled:this.checked})});let Jt=document.getElementById(`completionConfettiEnabled`);Jt&&Jt.addEventListener(`change`,function(){chrome.storage.local.set({completionConfettiEnabled:this.checked})});let Yt=document.getElementById(`completionNotificationEnabled`);Yt&&Yt.addEventListener(`change`,function(){chrome.storage.local.set({completionNotificationEnabled:this.checked})});let Zt=document.getElementById(`scheduledNotificationEnabled`);Zt&&Zt.addEventListener(`change`,function(){chrome.storage.local.set({scheduledNotificationEnabled:this.checked})});let tn=document.getElementById(`interactionNotificationEnabled`);tn&&tn.addEventListener(`change`,function(){chrome.storage.local.set({interactionNotificationEnabled:this.checked})});let nn=document.getElementById(`showMessageTimestamp`);nn&&nn.addEventListener(`change`,function(){chrome.storage.local.set({showMessageTimestamp:this.checked})}),za(),document.getElementById(`exportConfigBtn`).addEventListener(`click`,Rt),document.getElementById(`importConfigBtn`).addEventListener(`click`,Ht),document.getElementById(`importConfigFile`).addEventListener(`change`,function(e){e.target.files&&e.target.files.length>0&&Wt(e.target.files[0])}),Kt(),_r(),Jr(),ba()});function Ra(){chrome.storage.local.set({toolbarTools:$},()=>{bt($),St()})}function za(){let e=document.getElementById(`agentUrl`),n=document.getElementById(`agentPairCode`),r=document.getElementById(`agentName`),i=document.getElementById(`agentConnectBtn`);document.getElementById(`agentStatusDot`);let a=document.getElementById(`agentStatusText`),o=document.getElementById(`agentStatus`),s=document.getElementById(`pairCodeGroup`),c=document.getElementById(`agentInfo`),l=document.getElementById(`agentWorkdir`),u=document.getElementById(`agentDetailToggle`),d=document.getElementById(`agentDetailPanel`),f=document.getElementById(`pairedAgentsSection`),p=document.getElementById(`pairedAgentsList`),m=document.getElementById(`addAgentTitle`);if(!e||!i)return;function g(){let e=document.getElementById(`agentDetailArea`);e&&f.nextSibling!==e&&f.parentNode.insertBefore(e,f.nextSibling)}function _(){let e=document.getElementById(`agentDetailArea`);if(!e)return;let t=p.querySelector(`.paired-agent-item.active`);t&&t!==e.parentNode?t.appendChild(e):t||g()}async function v(e){try{let t=new AbortController,n=setTimeout(()=>t.abort(),2e3),r=await fetch(`${e}/api/status`,{signal:t.signal,cache:`no-cache`});return clearTimeout(n),r.ok}catch{return!1}}async function y(){g();let e=await chrome.storage.local.get([`pairedAgents`,`activeAgentId`]),n=e.pairedAgents||[],r=e.activeAgentId;if(b=null,n.length===0){f.style.display=`none`,m.textContent=t(`agentConfig.addAgentTitle`);return}f.style.display=``,m.textContent=t(`agentConfig.addAnotherAgent`),p.innerHTML=n.map(e=>{let n=e.id===r,i=!!e.disabled,a,o,s;return i?(a=n?`active-disabled`:`disabled`,o=t(`common.disabled`),s=`disabled`):n?(a=`active-checking`,o=t(`agentConfig.connected`),s=`connected`):(a=`checking`,o=t(`agentConfig.checking`),s=`checking`),`
|
|
789
|
+
</div>`}async function wa(){let e=Q(`memoryEnabled`),n=e.checked===!0;ra=!0,ua();try{let e=await K(`POST`,`/api/memory/embedding-config`,{enabled:n});if(!e||e.success!==!0)throw Error(e?.error||`unknown`);H(t(n?`memoryPanel.toggleOnSaved`:`memoryPanel.toggleOffSaved`),`info`),await xa()}catch(i){r.warn(`[MemoryPanel] toggle persist failed:`,i.message),e.checked=!n,H(t(`memoryPanel.toggleFail`,{error:i.message}),`error`)}finally{ra=!1,ua(),la()}}function Ta(){ea||(ea=!0,$i(),Q(`memoryTestBtn`)?.addEventListener(`click`,ga),Q(`memoryReindexBtn`)?.addEventListener(`click`,ya),Q(`memoryApiKeyClearBtn`)?.addEventListener(`click`,ba),Q(`memoryGate`)?.addEventListener(`click`,e=>{let t=e.target.closest(`[data-goto-tab]`);t&&document.querySelector(`.tab-nav-btn[data-tab="${t.dataset.gotoTab}"]`)?.click()}),document.querySelectorAll(`input[name="memoryEmbeddingMode"]`).forEach(e=>{e.addEventListener(`change`,()=>{sa(),Ca(ta)})}),Q(`memoryEnabled`)?.addEventListener(`change`,()=>{la(),wa()}))}async function Ea(){let e=await Cr();if(ta=e,Ca(e),!e.connected){ma(),await Ki();return}await Sa(),await Ki()}var Da=1;function Oa(){let e=document.getElementById(`saveBar`);if(!e)return;let t=()=>{let t=e.getBoundingClientRect().bottom>=window.innerHeight-Da;e.classList.toggle(`floating`,t)};window.addEventListener(`scroll`,t,{passive:!0}),window.addEventListener(`resize`,t),typeof ResizeObserver<`u`&&new ResizeObserver(t).observe(document.body),t()}var ka=`https://raw.githubusercontent.com/xiweicheng/ai-helper/main`;function Aa(){return E&&E.version?E.version:`latest`}function ja(e){return`curl -fsSL ${ka}/install.sh | AGENT_VERSION=${e} bash`}function Ma(e){return`[Net.ServicePointManager]::SecurityProtocol=[Net.SecurityProtocolType]::Tls12; $env:AGENT_VERSION='${e}'; irm ${ka}/install.ps1 | iex`}function Na(){let e=navigator.platform||``,t=navigator.userAgent||``;return/^win/i.test(e)||/\bwindows\b/i.test(t)}async function Pa(e,n){if(e)try{await navigator.clipboard.writeText(e),n(t(`agentConfig.copyCmdSuccess`),`success`)}catch(e){r.warn(`[Options] clipboard write failed:`,e.message),n(t(`agentConfig.copyCmdFailed`),`error`)}}function Fa(){let e=Aa(),n=document.getElementById(`agentInstallTitle`);n&&(n.textContent=t(`agentConfig.installGuideTitle`,{version:e}));let r=document.getElementById(`installCmdUnix`),i=document.getElementById(`installCmdWin`);r&&(r.textContent=ja(e)),i&&(i.textContent=Ma(e))}function Ia(e=H){if(!document.getElementById(`agentInstallGuide`))return;Fa(),s(Fa);let t=document.getElementById(`installCmdUnix`),n=document.getElementById(`installCmdWin`);document.getElementById(`copyInstallUnix`)?.addEventListener(`click`,()=>Pa(t?.textContent,e)),document.getElementById(`copyInstallWin`)?.addEventListener(`click`,()=>Pa(n?.textContent,e)),document.getElementById(`copyInstallAuto`)?.addEventListener(`click`,()=>{Pa(Na()?n?.textContent:t?.textContent,e)})}var $=[],La={},Ra={};function za(){return document.querySelector(`.tab-panel.active`)?.dataset.tab||null}async function Ba(){ft();let e=Ra[za()];if(e)try{await e()}catch(e){r.warn(`[Options] tab agent save failed:`,e.message)}}function Va(e){document.querySelectorAll(`.tab-nav-btn`).forEach(e=>e.classList.remove(`active`)),document.querySelectorAll(`.tab-panel`).forEach(e=>e.classList.remove(`active`));let t=document.querySelector(`.tab-nav-btn[data-tab="${e}"]`),n=document.querySelector(`.tab-panel[data-tab="${e}"]`);t&&t.classList.add(`active`),n&&n.classList.add(`active`),window.location.hash!==`#`+e&&history.replaceState(null,``,`#`+e),La[e]?.()}function Ha(){let e=window.location.hash.replace(`#`,``);[`basic`,`toolbar`,`react`,`chat`,`agent`,`toolbox`,`knowledge`,`memory`].includes(e)&&Va(e)}document.addEventListener(`DOMContentLoaded`,async function(){await ce(),await n(),i(),s(()=>{i(),yt().then(e=>{$=e,bt($)})});let e=document.getElementById(`languageInput`),r=document.getElementById(`languageDropdown`);e&&r&&((t=>{r.innerHTML=``,c.forEach(({code:e,label:n})=>{let i=document.createElement(`div`);i.className=`model-option`+(e===t?` selected`:``),i.dataset.value=e,i.textContent=n,r.appendChild(i)});let n=c.find(e=>e.code===t);e.value=n?n.label:``})(o()),e.addEventListener(`click`,e=>{e.stopPropagation(),r.classList.toggle(`show`)}),r.addEventListener(`click`,n=>{let o=n.target.closest(`.model-option`);if(!o)return;n.stopPropagation();let s=o.dataset.value;r.querySelectorAll(`.model-option`).forEach(e=>e.classList.remove(`selected`)),o.classList.add(`selected`),e.value=o.textContent,r.classList.remove(`show`),a(s),i(),H(t(`settings.languageChanged`),`success`)}),document.addEventListener(`click`,t=>{!r.contains(t.target)&&t.target!==e&&r.classList.remove(`show`)}));let l=()=>{let e=ue();document.querySelectorAll(`#themeSegment input[name="themePref"]`).forEach(t=>{t.checked=t.value===e})};l(),document.querySelectorAll(`#themeSegment input[name="themePref"]`).forEach(e=>{e.addEventListener(`change`,()=>{e.checked&&se(e.value)})}),le(l),document.querySelectorAll(`.tab-nav-btn`).forEach(e=>{e.addEventListener(`click`,function(){Va(this.dataset.tab)})}),document.querySelectorAll(`.info-box, .warning-box`).forEach(e=>{let t=e.querySelector(`h3`);if(!t||e.classList.contains(`collapsible`))return;e.classList.add(`collapsible`,`collapsed`),t.classList.add(`collapsible-header`);let n=document.createElement(`span`);n.className=`collapsible-arrow`,n.textContent=`▶`,t.appendChild(n);let r=document.createElement(`div`);for(r.className=`collapsible-body`,r.style.display=`none`;t.nextSibling;)r.appendChild(t.nextSibling);e.appendChild(r)}),document.querySelectorAll(`.collapsible .collapsible-header`).forEach(e=>{let t=e.closest(`.collapsible`),n=t?.querySelector(`.collapsible-body`),r=e.querySelector(`.collapsible-arrow`);!t||!n||e.addEventListener(`click`,()=>{t.classList.contains(`open`)?(t.classList.remove(`open`),t.classList.add(`collapsed`),n.style.display=`none`,r&&(r.textContent=`▶`)):(t.classList.add(`open`),t.classList.remove(`collapsed`),n.style.display=``,r&&(r.textContent=`▼`))})}),Ia(),La.memory=Ea,Ra.memory=va,La.toolbox=()=>{J().catch(()=>{})},La.knowledge=()=>{Xr().catch(()=>{})},Ha(),window.addEventListener(`hashchange`,Ha),chrome.storage.local.get([`optionsInitialTab`],e=>{e.optionsInitialTab&&(Va(e.optionsInitialTab),chrome.storage.local.remove(`optionsInitialTab`))}),chrome.runtime.onMessage.addListener(e=>{e.type===`SWITCH_TAB`&&e.tab&&Va(e.tab)}),await g(),dt(),rn(),$=await yt(),bt($);let u=document.getElementById(`enableSelectionToolbar`),d=document.getElementById(`toolbarConfig`),f=document.getElementById(`toolbarToggleLabel`);d&&u&&(u.checked?d.classList.remove(`disabled`):d.classList.add(`disabled`),f&&(f.textContent=u.checked?t(`common.enabled`):t(`common.disabled`))),document.getElementById(`saveBtn`).addEventListener(`click`,Ba),Oa();let p=document.getElementById(`modelInput`),m=document.getElementById(`modelDropdown`);p.addEventListener(`click`,function(e){e.stopPropagation(),m.classList.contains(`show`)||(Le(m,``),Ue(De),p.select()),m.classList.toggle(`show`)}),p.addEventListener(`input`,function(){R(),m.classList.add(`show`),Le(m,this.value)}),p.addEventListener(`blur`,function(){p.value=De,Ue(De)}),m.addEventListener(`click`,function(e){if(e.target.classList.contains(`delete-model-btn`)){e.stopPropagation();let t=e.target.closest(`.model-option`).dataset.value;Re(t);return}let t=e.target.closest(`.ctx-set-btn`);if(t){e.stopPropagation();let n=e.target.closest(`.model-option`);n&&Te(t,n,{onPreview:e=>{Ge(n,e),We(`modelInput`,`modelSelectedCtxBadge`,`modelDropdown`)},onCommit:e=>Ke(n,e),onReset:()=>Ke(n,0)});return}let n=e.target.closest(`.model-option`);if(n){e.stopPropagation(),R();let t=n.dataset.value;Oe(t),p.value=t,Ue(t),m.classList.remove(`show`)}}),document.addEventListener(`click`,function(e){!m.contains(e.target)&&e.target!==p&&!Ee(e.target)&&m.classList.remove(`show`)});let h=document.getElementById(`addModelToggleBtn`),_=document.getElementById(`addModelForm`),v=document.getElementById(`addModelName`),y=document.getElementById(`addModelContextWindow`),b=document.getElementById(`confirmAddModelBtn`),x=document.getElementById(`cancelAddModelBtn`);h&&_&&(h.addEventListener(`click`,function(){let e=_.style.display!==`none`;_.style.display=e?`none`:``,h.textContent=t(e?`settings.addModel`:`settings.collapse`),e||(v.value=``,y.value=``,v.focus())}),x.addEventListener(`click`,function(){_.style.display=`none`,h.textContent=t(`settings.addModel`),v.value=``,y.value=``}),b.addEventListener(`click`,function(){let e=v.value.trim(),n=parseInt(y.value)||0;if(!e){H(`❌ `+t(`settings.modelNameRequired`),`error`);return}Pe(e,n),p.value=e,Oe(e),Ue(e),chrome.storage.local.set({modelName:e}),_.style.display=`none`,h.textContent=t(`settings.addModel`),v.value=``,y.value=``,H(`✅ `+t(`settings.modelAdded`),`success`)}),v.addEventListener(`keydown`,function(e){e.key===`Enter`&&b.click()}),y.addEventListener(`keydown`,function(e){e.key===`Enter`&&b.click()}));let ee=document.getElementById(`enableImageInput`),te=document.getElementById(`imageModelGroup`),S=document.getElementById(`imageApiGroup`),ne=document.getElementById(`imageApiKeyGroup`);ee&&te&&ee.addEventListener(`change`,function(){te.style.display=this.checked?``:`none`,S&&(S.style.display=this.checked?``:`none`),ne&&(ne.style.display=this.checked?``:`none`),chrome.storage.local.set({enableImageInput:this.checked})});let C=document.getElementById(`imageModelInput`),w=document.getElementById(`imageModelDropdown`);C&&w&&(C.addEventListener(`click`,function(e){e.stopPropagation(),w.classList.contains(`show`)||(Le(w,``),Qe(ke),C.select()),w.classList.toggle(`show`)}),C.addEventListener(`input`,function(){R(),w.classList.add(`show`),Le(w,this.value)}),C.addEventListener(`blur`,function(){C.value=ke,Qe(ke)}),w.addEventListener(`click`,function(e){if(e.target.classList.contains(`delete-model-btn`)){e.stopPropagation();let t=e.target.closest(`.model-option`).dataset.value;Je(t);return}let t=e.target.closest(`.ctx-set-btn`);if(t){e.stopPropagation();let n=e.target.closest(`.model-option`);n&&Te(t,n,{onPreview:e=>{Ge(n,e),We(`imageModelInput`,`imageModelSelectedCtxBadge`,`imageModelDropdown`)},onCommit:e=>Xe(n,e),onReset:()=>Xe(n,0)});return}let n=e.target.closest(`.model-option`);if(n){e.stopPropagation(),R();let t=n.dataset.value;Ae(t),C.value=t,Qe(t),w.classList.remove(`show`)}}),document.addEventListener(`click`,function(e){!w.contains(e.target)&&e.target!==C&&!Ee(e.target)&&w.classList.remove(`show`)}));let T=document.getElementById(`addImageModelToggleBtn`),re=document.getElementById(`addImageModelForm`),ie=document.getElementById(`addImageModelName`),oe=document.getElementById(`addImageModelContextWindow`),E=document.getElementById(`confirmAddImageModelBtn`),D=document.getElementById(`cancelAddImageModelBtn`);T&&re&&(T.addEventListener(`click`,function(){let e=re.style.display!==`none`;re.style.display=e?`none`:``,T.textContent=t(e?`settings.addModel`:`settings.collapse`),e||(ie.value=``,oe.value=``,ie.focus())}),D.addEventListener(`click`,function(){re.style.display=`none`,T.textContent=t(`settings.addModel`),ie.value=``,oe.value=``}),E.addEventListener(`click`,function(){let e=ie.value.trim(),n=parseInt(oe.value)||0;if(!e){H(`❌ `+t(`settings.modelNameRequired`),`error`);return}qe(e,n),C.value=e,Ae(e),Qe(e),chrome.storage.local.set({imageModelName:e}),re.style.display=`none`,T.textContent=t(`settings.addModel`),ie.value=``,oe.value=``,H(`✅ `+t(`settings.imageModelAdded`),`success`)}),ie.addEventListener(`keydown`,function(e){e.key===`Enter`&&E.click()}),oe.addEventListener(`keydown`,function(e){e.key===`Enter`&&E.click()}));async function O({apiBaseEl:e,apiKeyEl:n,dropdownId:r,addFn:i,btn:a,silent:o}){let s=(e?.value||``).trim(),c=(n?.value||``).trim();if(!s||!c){o||H(`⚠️ `+t(`settings.fetchModelsNeedConfig`),`error`);return}let l=a?a.textContent:``;a&&(a.disabled=!0,a.textContent=t(`settings.fetchModelsLoading`));try{let e=await _t({apiBase:s,apiKey:c}),n=0,a=document.getElementById(r);for(let t of e)a&&a.querySelector(`.model-option[data-value="${CSS.escape(t)}"]`)||(i(t,0),n++);o||H(t(`settings.fetchModelsSuccess`,{total:e.length,added:n}),`success`)}catch(e){o||(e&&(e.status===401||e.status===403)?H(t(`settings.fetchModelsAuthFailed`),`error`):e&&e.reason===`parse`?H(t(`settings.fetchModelsEmpty`),`info`):H(t(`settings.fetchModelsFailed`),`error`))}finally{a&&(a.disabled=!1,a.textContent=l||t(`settings.fetchModels`))}}let k=``,de=null;function fe(e,t){let n=(e||``).trim(),r=(t||``).trim();if(!n||!r)return;let i=`${n}|${r}`;i!==k&&(clearTimeout(de),de=setTimeout(()=>{k=i;let e=document.getElementById(`fetchModelsBtn`);e&&e.disabled||O({apiBaseEl:document.getElementById(`apiBase`),apiKeyEl:document.getElementById(`apiKey`),dropdownId:`modelDropdown`,addFn:Pe,btn:null,silent:!0})},500))}let pe=document.getElementById(`fetchModelsBtn`);pe&&pe.addEventListener(`click`,()=>{O({apiBaseEl:document.getElementById(`apiBase`),apiKeyEl:document.getElementById(`apiKey`),dropdownId:`modelDropdown`,addFn:Pe,btn:pe,silent:!1})});let me=document.getElementById(`fetchImageModelsBtn`);me&&me.addEventListener(`click`,()=>{O({apiBaseEl:document.getElementById(`imageApiBase`),apiKeyEl:document.getElementById(`imageApiKey`),dropdownId:`imageModelDropdown`,addFn:qe,btn:me,silent:!1})});let he=document.getElementById(`apiBase`),A=document.getElementById(`apiBaseDropdown`);he&&A&&(he.addEventListener(`click`,function(e){e.stopPropagation(),A.querySelectorAll(`.model-option`).forEach(e=>{e.style.display=``}),A.classList.toggle(`show`),it(he.value.trim())}),A.addEventListener(`click`,function(e){if(e.target.classList.contains(`delete-model-btn`)){e.stopPropagation();let t=e.target.closest(`.model-option`).dataset.value;tt(t);return}let n=e.target.closest(`.model-option`);if(n){e.stopPropagation();let r=n.dataset.value;he.value=r,it(r),A.classList.remove(`show`),chrome.storage.local.set({apiBase:r}),H(`✅ `+t(`settings.apiBaseSwitched`),`info`),fe(r,(document.getElementById(`apiKey`)?.value||``).trim())}}),document.addEventListener(`click`,function(e){!A.contains(e.target)&&e.target!==he&&A.classList.remove(`show`)}),he.addEventListener(`blur`,function(){let e=this.value.trim();e&&(chrome.storage.local.set({apiBase:e}),et(e),it(e))}),he.addEventListener(`input`,function(){let e=this.value.trim().toLowerCase();A.classList.add(`show`);let t=A.querySelectorAll(`.model-option`),n=!1;t.forEach(t=>{let r=(t.dataset.value||``).toLowerCase(),i=(t.dataset.label||``).toLowerCase();!e||r.includes(e)||i.includes(e)?(t.style.display=``,n=!0):t.style.display=`none`}),!n&&e&&t.forEach(e=>{e.style.display=``})}));let j=document.getElementById(`addApiBaseToggleBtn`),_e=document.getElementById(`addApiBaseForm`),ve=document.getElementById(`addApiBaseUrl`),ye=document.getElementById(`addApiBaseLabel`),M=document.getElementById(`confirmAddApiBaseBtn`),N=document.getElementById(`cancelAddApiBaseBtn`);j&&_e&&(j.addEventListener(`click`,function(){let e=_e.style.display!==`none`;_e.style.display=e?`none`:``,j.textContent=t(e?`settings.addAddress`:`settings.collapse`),e||(ve.value=``,ye.value=``,ve.focus())}),N.addEventListener(`click`,function(){_e.style.display=`none`,j.textContent=t(`settings.addAddress`),ve.value=``,ye.value=``}),M.addEventListener(`click`,function(){let e=ve.value.trim(),n=ye.value.trim();if(!e){H(`❌ `+t(`settings.apiBaseRequired`),`error`);return}try{new URL(e)}catch{H(`❌ `+t(`settings.urlInvalid`),`error`);return}et(e,n),he.value=e,it(e),chrome.storage.local.set({apiBase:e}),_e.style.display=`none`,j.textContent=t(`settings.addAddress`),ve.value=``,ye.value=``,H(`✅ `+t(`settings.apiBaseAdded`),`success`)}),ve.addEventListener(`keydown`,function(e){e.key===`Enter`&&M.click()}),ye.addEventListener(`keydown`,function(e){e.key===`Enter`&&M.click()}));let P=document.getElementById(`imageApiBase`),F=document.getElementById(`imageApiBaseDropdown`);P&&F&&(P.addEventListener(`click`,function(e){e.stopPropagation(),F.querySelectorAll(`.model-option`).forEach(e=>{e.style.display=``}),F.classList.toggle(`show`),ut(P.value.trim())}),F.addEventListener(`click`,function(e){if(e.target.classList.contains(`delete-model-btn`)){e.stopPropagation();let t=e.target.closest(`.model-option`).dataset.value;st(t);return}let n=e.target.closest(`.model-option`);if(n){e.stopPropagation();let r=n.dataset.value;P.value=r,ut(r),F.classList.remove(`show`),chrome.storage.local.set({imageApiBase:r}),H(`✅ `+t(`settings.imageApiBaseSwitched`),`info`)}}),document.addEventListener(`click`,function(e){!F.contains(e.target)&&e.target!==P&&F.classList.remove(`show`)}),P.addEventListener(`blur`,function(){let e=this.value.trim();e&&(chrome.storage.local.set({imageApiBase:e}),ot(e),ut(e))}),P.addEventListener(`input`,function(){let e=this.value.trim().toLowerCase();F.classList.add(`show`);let t=F.querySelectorAll(`.model-option`),n=!1;t.forEach(t=>{let r=(t.dataset.value||``).toLowerCase(),i=(t.dataset.label||``).toLowerCase();!e||r.includes(e)||i.includes(e)?(t.style.display=``,n=!0):t.style.display=`none`}),!n&&e&&t.forEach(e=>{e.style.display=``})}));let I=document.getElementById(`addImageApiBaseToggleBtn`),be=document.getElementById(`addImageApiBaseForm`),L=document.getElementById(`addImageApiBaseUrl`),xe=document.getElementById(`addImageApiBaseLabel`),Se=document.getElementById(`confirmAddImageApiBaseBtn`),Ce=document.getElementById(`cancelAddImageApiBaseBtn`);I&&be&&(I.addEventListener(`click`,function(){let e=be.style.display!==`none`;be.style.display=e?`none`:``,I.textContent=t(e?`settings.addAddress`:`settings.collapse`),e||(L.value=``,xe.value=``,L.focus())}),Ce.addEventListener(`click`,function(){be.style.display=`none`,I.textContent=t(`settings.addAddress`),L.value=``,xe.value=``}),Se.addEventListener(`click`,function(){let e=L.value.trim(),n=xe.value.trim();if(!e){H(`❌ `+t(`settings.apiBaseRequired`),`error`);return}try{new URL(e)}catch{H(`❌ `+t(`settings.urlInvalid`),`error`);return}ot(e,n),P.value=e,ut(e),chrome.storage.local.set({imageApiBase:e}),be.style.display=`none`,I.textContent=t(`settings.addAddress`),L.value=``,xe.value=``,H(`✅ `+t(`settings.imageApiBaseAdded`),`success`)}),L.addEventListener(`keydown`,function(e){e.key===`Enter`&&Se.click()}),xe.addEventListener(`keydown`,function(e){e.key===`Enter`&&Se.click()}));let we=document.getElementById(`imageApiKey`),je=document.getElementById(`toggleImageApiKeyBtn`);if(we&&we.addEventListener(`blur`,function(){chrome.storage.local.set({imageApiKey:ae(this.value.trim())})}),we&&je){let e=je.querySelector(`.icon-eye-open`),t=je.querySelector(`.icon-eye-closed`);je.addEventListener(`click`,function(){we.type===`password`?(we.type=`text`,e.style.display=`none`,t.style.display=`block`):(we.type=`password`,e.style.display=`block`,t.style.display=`none`)})}let z=document.getElementById(`toggleToken`),Me=document.getElementById(`apiKey`),Ne=z.querySelector(`.icon-eye-open`),Fe=z.querySelector(`.icon-eye-closed`);z.addEventListener(`click`,function(){Me.type===`password`?(Me.type=`text`,Ne.style.display=`none`,Fe.style.display=`block`):(Me.type=`password`,Ne.style.display=`block`,Fe.style.display=`none`)});let Ie=document.getElementById(`resetSystemPromptBtn`);Ie&&Ie.addEventListener(`click`,function(){document.getElementById(`systemPrompt`).value=ge()});let ze=document.getElementById(`toolbarIconOnly`);ze&&ze.addEventListener(`change`,function(){St()});let Be=document.getElementById(`enableSelectionToolbar`),Ve=document.getElementById(`toolbarConfig`),He=document.getElementById(`toolbarToggleLabel`);function Ye(){let e=Be&&Be.checked;Ve&&(e?Ve.classList.remove(`disabled`):Ve.classList.add(`disabled`)),He&&(He.textContent=t(e?`common.enabled`:`common.disabled`))}Be&&Be.addEventListener(`change`,function(){Ye(),St()}),document.getElementById(`toolbarToolsList`).addEventListener(`click`,function(e){let t=e.target.closest(`[data-action]`);if(!t)return;let n=t.dataset.action,r=parseInt(t.dataset.index);switch(n){case`moveUp`:$=Ct($,r,-1),Ua();break;case`moveDown`:$=Ct($,r,1),Ua();break;case`edit`:Tt($,r);break;case`delete`:$=wt($,r),Ua();break}}),document.getElementById(`addCustomToolBtn`).addEventListener(`click`,function(){Tt($,-1)}),document.getElementById(`domainAddBtn`).addEventListener(`click`,function(){let e=document.getElementById(`domainAddInput`);At(e.value,t=>{t.error?H(`❌ `+t.error,`error`):e.value=``})}),document.getElementById(`domainAddInput`).addEventListener(`keydown`,function(e){e.key===`Enter`&&At(this.value,e=>{e.error?H(`❌ `+e.error,`error`):this.value=``})}),document.getElementById(`domainBlocklistList`).addEventListener(`click`,function(e){let t=e.target.closest(`.domain-blocklist-item-remove`);t&&jt(t.dataset.domain)}),Ot(),chrome.storage.onChanged.addListener((e,t)=>{t===`local`&&e.blockedDomains&&Ot()}),document.getElementById(`toolEditCancel`).addEventListener(`click`,function(){Et()}),document.getElementById(`toolEditClose`).addEventListener(`click`,function(){Et()}),document.getElementById(`toolEditSave`).addEventListener(`click`,function(){let e=Dt($);if(e.error){H(`❌ `+e.error,`error`);return}$=e.tools,Ua()});let Ze=document.getElementById(`reflectionEnabled`),B=document.getElementById(`reflectionToggleLabel`),$e=document.querySelectorAll(`.reflection-sub`),nt=document.getElementById(`postReflectionEnabled`),rt=document.getElementById(`postReflectionLabel`),V=document.getElementById(`subtaskReflectionEnabled`),at=document.getElementById(`subtaskReflectionLabel`);function ct(){let e=!!(Ze&&Ze.checked);$e.forEach(t=>{t.style.display=e?`block`:`none`}),B&&(B.textContent=t(e?`common.enabled`:`common.disabled`))}function lt(e){chrome.storage.local.get([`reflectionConfig`],t=>{let n=t.reflectionConfig||{postReflection:{},subtaskReflection:{}};e(n),chrome.storage.local.set({reflectionConfig:n})})}Ze&&(Ze.addEventListener(`change`,function(){ct();let e=this.checked;lt(t=>{t.enabled=e})}),ct()),nt&&(nt.addEventListener(`change`,function(){rt&&(rt.textContent=this.checked?t(`common.enabled`):t(`common.disabled`));let e=this.checked;lt(t=>{t.postReflection||={},t.postReflection.enabled=e})}),rt&&(rt.textContent=nt.checked?t(`common.enabled`):t(`common.disabled`))),V&&(V.addEventListener(`change`,function(){at&&(at.textContent=this.checked?t(`common.enabled`):t(`common.disabled`));let e=this.checked;lt(t=>{t.subtaskReflection||={},t.subtaskReflection.enabled=e})}),at&&(at.textContent=V.checked?t(`common.enabled`):t(`common.disabled`)));let ft=document.getElementById(`streamEnabled`),pt=document.getElementById(`streamEnabledLabel`);function mt(){let e=document.getElementById(`streamExpandToolsWrap`);e&&(e.style.display=ft&&ft.checked?`block`:`none`)}ft&&pt&&(ft.addEventListener(`change`,function(){pt&&(pt.textContent=ft.checked?t(`common.enabled`):t(`common.disabled`)),chrome.storage.local.set({streamEnabled:ft.checked}),mt()}),pt&&(pt.textContent=ft.checked?t(`common.enabled`):t(`common.disabled`)),mt());let ht=document.getElementById(`streamExpandTools`),gt=document.getElementById(`streamExpandToolsLabel`);ht&>&&(ht.addEventListener(`change`,function(){gt.textContent=this.checked?t(`common.enabled`):t(`common.disabled`),chrome.storage.local.set({streamExpandTools:this.checked})}),gt.textContent=ht.checked?t(`common.enabled`):t(`common.disabled`));let vt=document.getElementById(`toolConfirmationEnabled`),xt=document.getElementById(`toolConfirmationEnabledLabel`);vt&&xt&&(vt.addEventListener(`change`,function(){xt.textContent=this.checked?t(`common.enabled`):t(`common.disabled`),chrome.storage.local.set({toolConfirmationEnabled:this.checked})}),xt.textContent=vt.checked?t(`common.enabled`):t(`common.disabled`));let U=document.getElementById(`completionVerificationEnabled`),kt=document.getElementById(`completionVerificationEnabledLabel`),Mt=document.querySelectorAll(`.completion-verification-sub`);function Nt(){let e=!!(U&&U.checked);Mt.forEach(t=>{t.style.display=e?`block`:`none`})}U&&kt&&(U.addEventListener(`change`,function(){let e=this.checked;Nt(),kt.textContent=t(e?`common.enabled`:`common.disabled`),chrome.storage.local.get([`completionVerificationConfig`],t=>{let n=Object.assign({},t.completionVerificationConfig||{},{enabled:e});chrome.storage.local.set({completionVerificationConfig:n})})}),kt.textContent=U.checked?t(`common.enabled`):t(`common.disabled`),Nt());let Pt=document.getElementById(`completionVerificationRerunEnabled`),Ft=document.getElementById(`completionVerificationRerunEnabledLabel`);Pt&&Ft&&(Pt.addEventListener(`change`,function(){let e=this.checked;Ft.textContent=t(e?`common.enabled`:`common.disabled`),chrome.storage.local.get([`completionVerificationConfig`],t=>{let n=Object.assign({},t.completionVerificationConfig||{},{rerunEnabled:e});chrome.storage.local.set({completionVerificationConfig:n})})}),Ft.textContent=Pt.checked?t(`common.enabled`):t(`common.disabled`));let It=document.getElementById(`networkAccessEnabled`),Lt=document.getElementById(`networkAccessEnabledLabel`);It&&Lt&&(It.addEventListener(`change`,function(){Lt.textContent=this.checked?t(`common.enabled`):t(`common.disabled`),en(this.checked),chrome.storage.local.set({networkAccessEnabled:this.checked})}),Lt.textContent=It.checked?t(`common.enabled`):t(`common.disabled`),en(It.checked));let zt=document.getElementById(`networkHostAddBtn`),Bt=document.getElementById(`networkHostAddInput`);zt&&Bt&&(zt.addEventListener(`click`,function(){Qt(Bt.value,e=>{e.error?H(`❌ `+e.error,`error`):Bt.value=``})}),Bt.addEventListener(`keydown`,function(e){e.key===`Enter`&&Qt(this.value,e=>{e.error?H(`❌ `+e.error,`error`):this.value=``})}));let Vt=document.getElementById(`networkAllowlistList`);Vt&&Vt.addEventListener(`click`,function(e){let t=e.target.closest(`.domain-blocklist-item-remove`);t&&$t(t.dataset.host)}),Xt(),chrome.storage.onChanged.addListener((e,n)=>{if(n===`local`&&(e.allowedNetworkHosts&&Xt(),e.networkAccessEnabled&&It&&Lt)){let n=e.networkAccessEnabled.newValue===!0;It.checked=n,Lt.textContent=t(n?`common.enabled`:`common.disabled`),en(n)}});let Ut=document.getElementById(`enableExecutionLog`),Gt=document.getElementById(`enableExecutionLogLabel`);Ut&&Gt&&(Ut.addEventListener(`change`,function(){Gt.textContent=this.checked?t(`common.enabled`):t(`common.disabled`),chrome.storage.local.set({enableExecutionLog:this.checked})}),Gt.textContent=Ut.checked?t(`common.enabled`):t(`common.disabled`));let qt=document.getElementById(`completionSoundEnabled`);qt&&qt.addEventListener(`change`,function(){chrome.storage.local.set({completionSoundEnabled:this.checked})});let Jt=document.getElementById(`completionConfettiEnabled`);Jt&&Jt.addEventListener(`change`,function(){chrome.storage.local.set({completionConfettiEnabled:this.checked})});let Yt=document.getElementById(`completionNotificationEnabled`);Yt&&Yt.addEventListener(`change`,function(){chrome.storage.local.set({completionNotificationEnabled:this.checked})});let Zt=document.getElementById(`scheduledNotificationEnabled`);Zt&&Zt.addEventListener(`change`,function(){chrome.storage.local.set({scheduledNotificationEnabled:this.checked})});let tn=document.getElementById(`interactionNotificationEnabled`);tn&&tn.addEventListener(`change`,function(){chrome.storage.local.set({interactionNotificationEnabled:this.checked})});let nn=document.getElementById(`showMessageTimestamp`);nn&&nn.addEventListener(`change`,function(){chrome.storage.local.set({showMessageTimestamp:this.checked})}),Wa(),document.getElementById(`exportConfigBtn`).addEventListener(`click`,Rt),document.getElementById(`importConfigBtn`).addEventListener(`click`,Ht),document.getElementById(`importConfigFile`).addEventListener(`change`,function(e){e.target.files&&e.target.files.length>0&&Wt(e.target.files[0])}),Kt(),_r(),Yr(),Ta()});function Ua(){chrome.storage.local.set({toolbarTools:$},()=>{bt($),St()})}function Wa(){let e=document.getElementById(`agentUrl`),n=document.getElementById(`agentPairCode`),r=document.getElementById(`agentName`),i=document.getElementById(`agentConnectBtn`);document.getElementById(`agentStatusDot`);let a=document.getElementById(`agentStatusText`),o=document.getElementById(`agentStatus`),s=document.getElementById(`pairCodeGroup`),c=document.getElementById(`agentInfo`),l=document.getElementById(`agentWorkdir`),u=document.getElementById(`agentDetailToggle`),d=document.getElementById(`agentDetailPanel`),f=document.getElementById(`pairedAgentsSection`),p=document.getElementById(`pairedAgentsList`),m=document.getElementById(`addAgentTitle`);if(!e||!i)return;function g(){let e=document.getElementById(`agentDetailArea`);e&&f.nextSibling!==e&&f.parentNode.insertBefore(e,f.nextSibling)}function _(){let e=document.getElementById(`agentDetailArea`);if(!e)return;let t=p.querySelector(`.paired-agent-item.active`);t&&t!==e.parentNode?t.appendChild(e):t||g()}async function v(e){try{let t=new AbortController,n=setTimeout(()=>t.abort(),2e3),r=await fetch(`${e}/api/status`,{signal:t.signal,cache:`no-cache`});return clearTimeout(n),r.ok}catch{return!1}}async function y(){g();let e=await chrome.storage.local.get([`pairedAgents`,`activeAgentId`]),n=e.pairedAgents||[],r=e.activeAgentId;if(b=null,n.length===0){f.style.display=`none`,m.textContent=t(`agentConfig.addAgentTitle`);return}f.style.display=``,m.textContent=t(`agentConfig.addAnotherAgent`),p.innerHTML=n.map(e=>{let n=e.id===r,i=!!e.disabled,a,o,s;return i?(a=n?`active-disabled`:`disabled`,o=t(`common.disabled`),s=`disabled`):n?(a=`active-checking`,o=t(`agentConfig.connected`),s=`connected`):(a=`checking`,o=t(`agentConfig.checking`),s=`checking`),`
|
|
783
790
|
<div class="paired-agent-item${n?` active`:``}${i?` disabled`:``}" data-agent-id="${e.id}">
|
|
784
791
|
<span class="paired-agent-dot ${a}" title="${o}"></span>
|
|
785
792
|
<span class="paired-agent-name" data-agent-id="${e.id}" data-original="${E(e.name)}" title="${t(`agentConfig.clickToEditName`)}">${E(e.name)}</span>
|
package/dist/assets/{page-snapshot-renderer-j72q92KH.js → page-snapshot-renderer-BzPoHaSD.js}
RENAMED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{a as e,c as t}from"./i18n-
|
|
1
|
+
import{a as e,c as t}from"./i18n-DyM8bnfl.js";e(`zh`,{pageInteraction:{refHint:`ref 编号仅本次查询有效,页面导航/刷新或切换 tab 后需重新 query_elements`,snapshotHeader:`可交互元素快照:{count} 个元素`,snapshotTruncated:`(共 {total} 个,已截断,请用 filterByText 缩小范围)`,snapshotPageInfo:`(第 {page}/{totalPages} 页,本次输出 {count} 个)`,snapshotHasMore:`还有更多元素:调用 query_elements 时带 page={next} 查看`,snapshotPageOutOfRange:`page={page} 超出范围(共 {totalPages} 页)`,snapshotOverlayBlock:`[打开层]`,snapshotBodyBlock:`[页面主体]`,snapshotFooter:`(ref 编号仅当前快照有效;页面变化后请重新调用 query_elements)`,snapshotHeaderFrames:`(含 {n} 个 iframe)`,snapshotFramesLimited:`(部分 iframe 超出数量/深度上限,未展开)`,snapshotFrameBlock:`[frame #{index}{title}{hostSeg}]`,snapshotFramePlaceholder:`iframe #{index}{title}`,snapshotFrameUnreachable:`(内容不可访问)`}}),e(`en`,{pageInteraction:{refHint:`ref numbers are only valid for the current query; re-run query_elements after page navigation/refresh or tab switch`,snapshotHeader:`Interactive elements snapshot: {count} element(s)`,snapshotTruncated:` (of {total} total; truncated — narrow down with filterByText)`,snapshotPageInfo:` (page {page}/{totalPages}, {count} shown)`,snapshotHasMore:`More elements available: call query_elements with page={next}`,snapshotPageOutOfRange:`page={page} is out of range (only {totalPages} page(s))`,snapshotOverlayBlock:`[Open overlays]`,snapshotBodyBlock:`[Page body]`,snapshotFooter:`(ref numbers are valid only for this snapshot; re-run query_elements after the page changes)`,snapshotHeaderFrames:` ({n} iframe(s))`,snapshotFramesLimited:` (some iframes exceed count/depth limits; not expanded)`,snapshotFrameBlock:`[frame #{index}{title}{hostSeg}]`,snapshotFramePlaceholder:`iframe #{index}{title}`,snapshotFrameUnreachable:` (content inaccessible)`}});function n(e){if(!e)return``;if(e===`about:srcdoc`)return`srcdoc`;if(e===`about:blank`)return`blank`;try{return new URL(e).hostname||``}catch{return``}}function r(e,t){for(let n of e)n.t===`el`&&n.localRef!=null&&t.push(n),n.children&&n.children.length&&r(n.children,t)}function i(e,n,r){if(e.status===`hidden`||e.status===`off`)return!1;let i=e.title?` "${e.title}"`:``,a;return a=e.status===`ok`&&e.frameIndex!=null?t(`pageInteraction.snapshotFramePlaceholder`,{index:e.frameIndex,title:i}):e.status===`unreachable`&&e.frameIndex!=null?t(`pageInteraction.snapshotFramePlaceholder`,{index:e.frameIndex,title:i})+t(`pageInteraction.snapshotFrameUnreachable`):`iframe${i}`,a=` `.repeat(e.depth||0)+a,r.budget-=a.length+1,n.push(a),!0}function a(e,t,n){if(!e)return!1;if(e.t===`frame`)return i(e,t,n);let r=[],o=!1;for(let t of e.children||[])a(t,r,n)&&(o=!0);if(e.t===`el`){if(e.localRef!=null&&n.selected.has(e)){if(n.budget<=0)return n.truncated=!0,o;let i=e.role||``,a=e.name||``,s=e.attrs||``,c=e.depth+i.length+(a?a.length+2:0)+(s?s.length+1:0)+12;if(n.budget-c<0)return n.truncated=!0,o;let l=`${` `.repeat(e.depth)}${i}${a?` "${a}"`:``} [ref ${e.localRef}]${s?` `+s:``}`;return n.budget-=l.length+1,n.count+=1,t.push(l,...r),!0}return o?(t.push(...r),!0):!1}if(e.t===`container`){if(o){let i=`${` `.repeat(e.depth)}${e.role}${e.name?` "${e.name}"`:``}`;return n.budget-=i.length+1,t.push(i,...r),!0}return!1}return o?(t.push(...r),!0):!1}function o(e,n,r){let i=[];if((e.overlayTrees||[]).length){for(let t of e.overlayTrees)a(t,i,r);i.length&&n.push(t(`pageInteraction.snapshotOverlayBlock`),...i,t(`pageInteraction.snapshotBodyBlock`))}for(let t of e.bodyTree||[])a(t,n,r)}function s(e={}){let{frames:i=[],page:a=1,maxResults:s=100,maxChars:c=6e3,countOnly:l=!1,frameCount:u=0,framesLimited:d=0}=e||{},f=Number.isInteger(a)&&a>=1?a:1,p=Math.max(1,s),m=[];for(let e of i)r(e.overlayTrees||[],m),r(e.bodyTree||[],m);let h=m.length;if(l)return{success:!0,content:``,count:h,total:h,truncated:!1,hint:``};let g=Math.ceil(h/p),_=u>0?t(`pageInteraction.snapshotHeaderFrames`,{n:u}):``,v=d>0?t(`pageInteraction.snapshotFramesLimited`):``;if(h>0&&f>g)return{success:!0,content:[t(`pageInteraction.snapshotHeader`,{count:h})+_+v,t(`pageInteraction.snapshotPageOutOfRange`,{page:f,totalPages:g}),t(`pageInteraction.snapshotFooter`)].join(`
|
|
2
2
|
`),count:0,total:h,page:f,totalPages:g,hasMore:!1,truncated:!1,hint:``};let y=(f-1)*p,b=new Set(m.slice(y,y+p)),x=f<g,S={selected:b,budget:c,truncated:!1,count:0},C=[],w=i.find(e=>e.isTop)||i[0];w&&o(w,C,S);for(let e of i.filter(e=>e!==w)){let r=[];if(o(e,r,S),!r.length)continue;let i=` `.repeat(Math.max(0,(e.depth||1)-1)*2),a=e.frameInfo&&e.frameInfo.title?` "${e.frameInfo.title}"`:``,s=n(e.frameInfo&&e.frameInfo.url);C.push(i+t(`pageInteraction.snapshotFrameBlock`,{index:e.frameIndex,title:a,hostSeg:s?` · `+s:``}),...r.map(e=>i+` `+e))}let T=g>1,E=t(`pageInteraction.snapshotHeader`,{count:T?h:S.count})+_+v+(T?t(`pageInteraction.snapshotPageInfo`,{page:f,totalPages:g,count:S.count}):``)+(S.truncated?t(`pageInteraction.snapshotTruncated`,{total:h}):``);return C.unshift(E),x&&C.push(t(`pageInteraction.snapshotHasMore`,{next:f+1})),C.push(t(`pageInteraction.snapshotFooter`)),{success:!0,content:C.join(`
|
|
3
3
|
`),count:S.count,total:h,page:f,totalPages:g,hasMore:x,truncated:S.truncated,hint:x?t(`pageInteraction.snapshotHasMore`,{next:f+1}):t(`pageInteraction.refHint`)}}export{s as t};
|