ai-helper-agent 2.4.1 → 2.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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-ouMgDZ2t.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-6dzdrSS4.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-BrT5Y9A7.js";e(`zh`,{optionsConst:{aiSearch:`AI搜索`,explain:`解释`,translate:`翻译`,summary:`总结`,copy:`复制`,defaultSystemPrompt:`AI Helper:IT技术助手。
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-D9_2eWuQ.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-DfZDoMBc.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-8JfKpCto.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=400,Br=80,Vr=5,Hr=.3,Ur=`.txt,.md,.markdown,.pdf,.docx,.doc,.xlsx,.xls,.csv,.pptx,.html,.htm,.json,.rtf,.odt,.odp,.ods,.epub`,Wr=[],Gr=``,Kr=`all`,qr=!1;function Jr(){if(qr)return;qr=!0;let e=document.getElementById(`knowledgeList`);e&&e.addEventListener(`click`,ri);let t=document.getElementById(`kbSearchInput`);if(t){let e=null;t.addEventListener(`input`,()=>{clearTimeout(e),e=setTimeout(()=>{Gr=t.value.trim(),ei(Wr)},200)});let n=document.getElementById(`kbSearchClear`);n&&n.addEventListener(`click`,()=>{t.value=``,Gr=``,ei(Wr),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`),Kr=e.dataset.filter,ei(Wr)})});let r=document.getElementById(`createKbBtn`);r&&r.addEventListener(`click`,()=>fi());let i=document.getElementById(`ragGlobalToggle`);i&&(chrome.storage.local.get(`ragEnabled`,e=>{let t=e.ragEnabled===!0;i.checked=t,Xr(t)}),i.addEventListener(`change`,()=>Zr(i.checked))),Sr(()=>Yr());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"]`)&&Zr(!0)}),Yr()}async function Yr(){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){Qr(`agentOff`),i&&(i.disabled=!0);return}if(r!==!0){Qr(`ragOff`),i&&(i.disabled=!0);return}if(!n.ragAvailable){Qr(`ragUnavailable`),i&&(i.disabled=!0),Lr(),await Ir();return}i&&(i.disabled=!1),e.style.display=`none`,t.style.display=``,await X()}function Xr(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 Zr(e){await chrome.storage.local.set({ragEnabled:e});let n=document.getElementById(`ragGlobalToggle`);n&&(n.checked=e),Xr(e),H(t(e?`toolbox.ragServiceEnabled`:`toolbox.ragServiceDisabled`),`info`),await Yr()}function Qr(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">${$r()}</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=`
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=$r();try{let e=await K(`GET`,`/api/rag/collections`);if(!e||e.success!==!0)throw Error(e?.error||`unknown error`);Wr=e.collections||[],ei(Wr)}catch(n){r.warn(`[Knowledge] Failed to load collections:`,n.message),ni([]),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 $r(){return`
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 ei(e){let n=document.getElementById(`knowledgeList`);if(!n)return;if(e.length===0){ni(e),n.innerHTML=`
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=>Kr===`enabled`&&e.enabled===!1||Kr===`disabled`&&e.enabled!==!1?!1:Gr?[e.name,e.description].filter(Boolean).join(` `).toLowerCase().includes(Gr.toLowerCase()):!0);if(ni(e),r.length===0){n.innerHTML=`
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(ti).join(``)}function ti(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`
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 ni(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 ri(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=Wr.find(e=>e.id===n?.dataset.kbId);if(!r)return;let i=t.dataset.action;i===`ingest`?mi(r):i===`edit`?di(r):i===`search`?vi(r):i===`docs`?gi(r):i===`toggle`?await ai(r):i===`delete`&&await ii(r)}async function ii(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 ai(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 oi(e={}){let n=e.mode===`openai-compat`;return`
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 si(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 ci(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 li(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 ui(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 di(e){let n=bi({title:t(`knowledge.editTitle`),bodyHtml:`
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
- ${oi(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=ci(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(!(li(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(),ui(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`)}}}});si(n.overlay,e.id);let r=n.overlay.querySelector(`#kbEditName`);r?.focus(),r?.select()}function fi(){let e=bi({title:t(`knowledge.createTitle`),bodyHtml:`
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
- ${oi({})}`,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=ci(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`)}}});si(e.overlay),e.overlay.querySelector(`#kbCreateName`)?.focus()}function pi(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 mi(e){let n=`
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
- <input type="file" id="kbFileInput" style="display:none" accept="${Ur}">
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="${zr}">
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="${Br}">
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=null,i=bi({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=null;if(s===`file`){if(!r){H(t(`knowledge.fileRequired`),`warning`);return}let e=await hi(r);c={type:`file`,fileName:r.name,contentBase64:e}}else if(s===`text`){let e=o.querySelector(`#kbIngestText`).value,n=o.querySelector(`#kbIngestName`).value.trim();if(!e.trim()){H(t(`knowledge.contentRequired`),`warning`);return}c={type:`text`,content:e,name:n||void 0}}else{let e=o.querySelector(`#kbIngestUrl`).value.trim();if(!e){H(t(`knowledge.urlRequired`),`warning`);return}c={type:`url`,url:e}}let l=parseInt(o.querySelector(`#kbChunkSize`).value,10),u=parseInt(o.querySelector(`#kbChunkOverlap`).value,10);c.chunkConfig={...Number.isFinite(l)&&l>=100&&l<=2e3?{chunkSize:l}:{},...Number.isFinite(u)&&u>=0&&u<=500?{overlap:u}:{}};let d=o.querySelector(`#kbIngestStatus`);d&&(d.style.display=``,d.textContent=`⏳ ${t(`knowledge.ingesting`)}`),a(!0);let f=setInterval(async()=>{try{let t=await K(`GET`,`/api/rag/collections/${encodeURIComponent(e.id)}/ingest/status`);d&&t&&t.success&&t.progress&&(d.textContent=pi(t.progress))}catch{}},800);try{let r=await K(`POST`,`/api/rag/collections/${encodeURIComponent(e.id)}/ingest`,c);if(!r||r.success!==!0)throw Error(r?.error||`unknown error`);n(),H(t(`knowledge.ingestSuccess`,{name:r.name,chunks:r.chunkCount}),`success`),await X()}catch(e){d&&(d.style.display=`none`),a(!1),H(t(`knowledge.ingestFailed`,{error:e.message}),`error`)}finally{clearInterval(f)}}}),{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(`#kbSelectedFile`),l=e=>{if(e){if(e.size>Rr){H(t(`knowledge.fileTooLarge`),`warning`);return}r=e,o.classList.add(`has-file`),c.style.display=``,c.textContent=t(`knowledge.selectedFile`,{name:e.name})}};o.addEventListener(`click`,()=>s.click()),s.addEventListener(`change`,()=>l(s.files?.[0])),o.addEventListener(`dragover`,e=>e.preventDefault()),o.addEventListener(`drop`,e=>{e.preventDefault(),l(e.dataTransfer?.files?.[0])})}function hi(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 gi(e){let n=bi({title:t(`knowledge.docsTitle`,{name:e.name}),bodyHtml:`<div id="kbDocsBody">${$r()}</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 _i(n,e),X()}catch(e){H(t(`knowledge.opFailed`,{error:e.message}),`error`)}}),_i(n,e)}async function _i(e,n){e.innerHTML=$r();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=>`
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(xi(e.createdAt))}</div>
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 vi(e){let n=`
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="${Vr}">
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="${Hr}">
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}=bi({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:Vr,threshold:Number.isFinite(c)?c:Hr});if(!t||t.success!==!0)throw Error(t?.error||`unknown error`);yi(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 yi(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=`
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 bi({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=`
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 xi(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 Si=!1,Ci=[],wi=[],Ti=!1,Ei=null,Z=e=>document.getElementById(e);function Di(){return{keyword:(Z(`memoryEntriesSearch`)?.value||``).trim().toLowerCase(),type:Z(`memoryEntriesTypeFilter`)?.value||`all`}}function Oi(){return Z(`memoryEntriesSort`)?.value||`createdDesc`}var ki=(e,t)=>String(t.createdAt||``).localeCompare(String(e.createdAt||``)),Ai=e=>Number.isFinite(parseFloat(e))?parseFloat(e):0;function ji(e){let t=[...e];switch(Oi()){case`importanceDesc`:return t.sort((e,t)=>Ai(t.importance)-Ai(e.importance)||ki(e,t));case`valueDesc`:return t.sort((e,t)=>Ai(t.value)-Ai(e.value)||ki(e,t));case`valueAsc`:return t.sort((e,t)=>Ai(e.value)-Ai(t.value)||ki(e,t));default:return t.sort(ki)}}function Mi(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 Ni(e){return t(e===`summary`?`memoryEntries.filterSummary`:`memoryEntries.filterFact`)}function Pi(e){return String(e||``).split(/[,,、]/).map(e=>e.trim()).filter(Boolean)}function Fi(e){return e?String(e).slice(0,10):``}function Ii(e){Ei=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 Li(e){let n=q(e.id),r=(e.tags||[]).map(e=>`<span class="memory-entry-tag-chip">${q(e)}</span>`).join(``),i=e.lastAccessAt?Fi(e.lastAccessAt):t(`memoryEntries.neverAccessed`);return`
716
- <div class="memory-entry-item${wi.some(t=>t.id===e.id)?` low-value`:``}" data-id="${n}">
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(Ni(e.type))}</span>
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(Fi(e.createdAt)||`—`)}</span>
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 Ri(){let e=Z(`memoryEntriesList`);if(!e)return;let n=Di(),r=ji(Ci.filter(e=>Mi(e,n))),i=Z(`memoryEntriesCount`);if(i&&(i.textContent=t(`memoryEntries.count`,{shown:r.length,total:Ci.length})),!r.length){e.innerHTML=`<div class="memory-entries-empty">${q(Ci.length?t(`memoryEntries.noMatch`):t(`memoryEntries.empty`))}</div>`;return}e.innerHTML=r.map(Li).join(``)}function zi(){let e=Z(`memoryEntriesCandidates`);if(e){if(!wi.length){e.style.display=`none`,e.innerHTML=``;return}e.style.display=``,e.innerHTML=`
733
- <span class="memory-entries-candidates-text">${q(t(`memoryEntries.candidatesHint`,{count:wi.length}))}</span>
734
- <button type="button" class="memory-entries-compact-btn">${q(t(`memoryEntries.compactBtn`))}</button>`}}async function Bi(){let e=Z(`memoryEntriesList`);if(e){Ii({key:`memoryEntries.loading`}),e.innerHTML=``;try{let e=await K(`POST`,`/api/memory/manage`,{action:`review`});if(e&&e.httpStatus===404){Ii({key:`memoryEntries.unsupported`});return}if(!e||e.success!==!0){Ii({key:`memoryEntries.loadFail`,params:{error:e&&e.error||`unknown`}});return}Ci=Array.isArray(e.scored)?e.scored:[],wi=Array.isArray(e.candidates)?e.candidates:[],Ii(``),zi(),Ri()}catch(e){r.warn(`[MemoryEntries] load failed:`,e.message),Ii({key:`memoryEntries.loadFail`,params:{error:e.message}})}}}async function Vi(){if(!Z(`memoryEntriesList`))return;let e=await Sn();if(!e||!e.connected){Ci=[],wi=[],zi(),Z(`memoryEntriesList`).innerHTML=``,Ii({key:`memoryEntries.offline`});return}await Bi()}function Hi(e){Ti=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 Ui(e,n,i){if(Ti)return!1;Hi(!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 Bi(),!0}catch(e){return r.warn(`[MemoryEntries] store failed:`,e.message),H(t(i,{error:e.message}),`error`),!1}finally{Hi(!1)}}async function Wi(e){await G(t(`memoryEntries.deleteConfirm`))&&await Ui({action:`delete`,memoryId:e.id},`memoryEntries.deleted`,`memoryEntries.deleteFail`)}async function Gi(){if(await G(t(`memoryEntries.compactConfirm`,{count:wi.length,threshold:10}))&&!Ti){Hi(!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 Bi()}catch(e){r.warn(`[MemoryEntries] compact failed:`,e.message),H(t(`memoryEntries.compactFail`,{error:e.message}),`error`)}finally{Hi(!1)}}}function Ki(e){let n=document.getElementById(`memoryEntryEditModal`);n&&n.remove();let r=document.createElement(`div`);r.className=`modal-overlay`,r.id=`memoryEntryEditModal`,r.innerHTML=`
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(Ni(e.type))}${e.category?` · ${q(e.category)}`:``}" readonly style="background:var(--bg-subtle);color:var(--text-secondary);">
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:Pi(r.querySelector(`#memoryEntryEditTags`).value)},o=Number(r.querySelector(`#memoryEntryEditImportance`).value);Number.isFinite(o)&&(a.importance=o),await Ui(a,`memoryEntries.saved`,`memoryEntries.saveFail`)&&i()})}function qi(){zi(),Ri(),Ei&&Ii(Ei)}function Ji(){Si||(Si=!0,Z(`memoryEntriesRefreshBtn`)?.addEventListener(`click`,()=>Vi()),Z(`memoryEntriesSearch`)?.addEventListener(`input`,()=>Ri()),Z(`memoryEntriesTypeFilter`)?.addEventListener(`change`,()=>Ri()),Z(`memoryEntriesSort`)?.addEventListener(`change`,()=>Ri()),Z(`memoryEntriesList`)?.addEventListener(`click`,e=>{let t=e.target.closest(`.memory-entry-item`);if(!t)return;let n=Ci.find(e=>String(e.id)===t.dataset.id);if(!n)return;let r=e.target.closest(`[data-act]`);if(r){r.dataset.act===`edit`?Ki(n):r.dataset.act===`delete`&&Wi(n);return}e.target.closest(`.memory-entry-content`)&&t.classList.toggle(`expanded`)}),Z(`memoryEntriesCandidates`)?.addEventListener(`click`,e=>{e.target.closest(`.memory-entries-compact-btn`)&&Gi()}),s(()=>qi()))}var Yi=!1,Xi={connected:!0,ragAvailable:!0},Zi=!1,Qi=!1,$i=!1,Q=e=>document.getElementById(e);function ea(){return document.querySelector(`input[name="memoryEmbeddingMode"]:checked`)?.value||`openai-compat`}var ta=()=>ea()===`local`;function na(){let e=ta()?`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=ta()?``:`none`)}function ra(){let e={enabled:Q(`memoryEnabled`)?.checked===!0,mode:ea()};if(ta())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 ia(){let e=Q(`memoryEnabledLabel`);e&&(e.textContent=Q(`memoryEnabled`)?.checked===!0?t(`memoryPanel.enabled`):t(`memoryPanel.disabled`))}function aa(){let e=Q(`memoryEnabled`);e&&(e.disabled=Zi||Qi)}function oa(e){Q(`memoryEnabled`).checked=e.enabled===!0,ia();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||``,na()}function sa(e){let n=Q(`memoryStatus`);if(n){if(!e){n.innerHTML=`<span class="memory-status-muted">${q(t(`memoryPanel.statusLoading`))}</span>`;return}n.innerHTML=`
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 ca(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=`
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 la(){let e=Q(`memoryStatus`);e&&(e.innerHTML=`<span class="memory-status-muted">${q(t(`memoryPanel.statusOffline`))}</span>`)}function ua(e){Q(`memoryReindexBtn`).disabled=e,Q(`memoryTestBtn`).disabled=e||ta(),Q(`memoryApiKeyClearBtn`).disabled=e}async function da(){if(ta())return;ua(!0);let e=Q(`memoryTestResult`);e.textContent=t(`memoryPanel.testRunning`);try{let n=await K(`POST`,`/api/memory/test-embedding`,ra());if(!n||n.success!==!0)throw Error(n?.error||`unknown`);e.textContent=t(`memoryPanel.testOk`,{model:ra().modelName,dims:n.dimensions});let r=Q(`memoryDimsInput`);r.value=String(n.dimensions),H(t(`memoryPanel.testOk`,{model:ra().modelName,dims:n.dimensions}),`info`)}catch(n){e.textContent=t(`memoryPanel.testFail`,{error:n.message}),H(t(`memoryPanel.testFail`,{error:n.message}),`error`)}finally{ua(!1)}}async function fa(){if($i)return{ok:!1,reason:`notLoaded`};ua(!0);try{let e=await K(`POST`,`/api/memory/embedding-config`,ra());if(!e||e.success!==!0)throw Error(e?.error||`unknown`);return Q(`memoryApiKeyInput`).value=``,await _a(),{ok:!0}}catch(e){return{ok:!1,reason:`error`,error:e.message}}finally{ua(!1)}}async function pa(){let e=await Sn();if(!e||!e.connected){H(t(`memoryPanel.saveSkippedOffline`),`info`);return}let n=await fa();n.ok||(n.reason===`notLoaded`?H(t(`memoryPanel.configNotLoaded`),`error`):H(t(`memoryPanel.saveFail`,{error:n.error}),`error`))}async function ma(){if(!await G(t(`memoryPanel.reindexConfirm`)))return;ua(!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 _a()}catch(n){e.textContent=t(`memoryPanel.reindexFail`,{error:n.message}),H(t(`memoryPanel.reindexFail`,{error:n.message}),`error`)}finally{ua(!1)}}async function ha(){if(await G(t(`memoryPanel.apiKeyClearConfirm`))){ua(!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{ua(!1)}}}async function ga(){try{let e=await K(`GET`,`/api/memory/vector-status`);e&&e.success===!0?sa(e):ca(e)}catch(e){r.warn(`[MemoryPanel] status load failed:`,e.message),ca(e)}}async function _a(){let e=(async()=>{$i=!0;try{let e=await K(`GET`,`/api/memory/embedding-config`);e&&e.success===!0&&e.config&&(oa(e.config),$i=!1)}catch(e){r.warn(`[MemoryPanel] config load failed:`,e.message),H(t(`memoryPanel.statusFail`)+` — `+e.message,`error`)}})(),n=ga();await Promise.all([e,n])}function va(e){let n=Q(`memoryGate`),r=Q(`memoryMain`),i=document.querySelector(`.memory-scope-hint`),a=!e.connected||ea()===`local`&&!e.ragAvailable;if(Zi=a,aa(),[`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=`
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&&gt&&(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&&gt&&(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>
@@ -1,3 +1,3 @@
1
- import{a as e,c as t}from"./i18n-ouMgDZ2t.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(`
1
+ import{a as e,c as t}from"./i18n-D9_2eWuQ.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};