ai-helper-agent 2.3.1 → 2.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +13 -3
- package/dist/assets/__vite-browser-external-CM3Eme-n.js +1 -0
- package/dist/assets/agent-store-Ce3f4Ya3.js +1 -0
- package/dist/assets/background.js +104 -80
- package/dist/assets/chat-export-BNCkL6fS.js +37 -0
- package/dist/assets/chunk-CMxvf4Kt.js +1 -0
- package/dist/assets/content.js +159 -156
- package/dist/assets/{dist-BQOFgIxk.js → dist-DhUTa_WT.js} +5 -6
- package/dist/assets/dist-LQPh1k0y.js +24 -0
- package/dist/assets/i18n-ouMgDZ2t.js +49 -0
- package/dist/assets/jszip.min-Bm_16osY.js +2 -0
- package/dist/assets/lib-33nIefF6.js +220 -0
- package/dist/assets/{marked.min.js-08SGy6CO.js → marked.min.js-D2rXgLAQ.js} +7 -8
- package/dist/assets/{marked.min.js-loader-4kRZ9iCP.js → marked.min.js-loader-tKH5SQVQ.js} +1 -1
- package/dist/assets/model-profiles-6dzdrSS4.js +24 -0
- package/dist/assets/network-scope-CNRYXk74.js +1 -0
- package/dist/assets/options-Cp1UMkjK.css +1 -0
- package/dist/assets/options.js +108 -102
- package/dist/assets/{page-snapshot-renderer-CVL6r6Kf.js → page-snapshot-renderer-j72q92KH.js} +2 -3
- package/dist/assets/pdf-DnVqBaAN.js +6 -0
- package/dist/assets/session-store-CmGs_rhh.js +76 -0
- package/dist/assets/side_panel.css +1 -1
- package/dist/assets/side_panel.js +958 -1124
- package/dist/assets/theme-BRAX5X2F.css +1 -0
- package/dist/assets/{modulepreload-polyfill-P2Xu9kJm.js → theme-CLwYsx9o.js} +1 -1
- package/dist/assets/utils-9i9g8vW8.js +112 -0
- package/dist/assets/version-t8HzLv3V.js +1 -0
- package/dist/assets/xlsx-DGkz7cnk.js +105 -0
- package/dist/manifest.json +2 -5
- package/dist/offscreen/offscreen.js +7 -7
- package/dist/options.html +151 -75
- package/dist/side_panel.html +167 -137
- package/package.json +1 -1
- package/src/config.js +3 -2
- package/src/executor.js +99 -18
- package/src/locales/en.json +16 -2
- package/src/locales/zh.json +16 -2
- package/src/memory/injection.js +12 -2
- package/src/memory/routes.js +6 -0
- package/src/memory/service.js +57 -2
- package/src/rag/manager.js +1 -1
- package/src/rag/url-guard.js +27 -12
- package/src/security.js +433 -31
- package/src/server.js +28 -8
- package/dist/assets/agent-store-DcAs6YyA.js +0 -2
- package/dist/assets/agent-store-DcAs6YyA.js.map +0 -1
- package/dist/assets/background.js.map +0 -1
- package/dist/assets/dist-BQOFgIxk.js.map +0 -1
- package/dist/assets/i18n-C4jSRoCH.js +0 -50
- package/dist/assets/i18n-C4jSRoCH.js.map +0 -1
- package/dist/assets/jszip.min-BXqW2-9v.js +0 -3
- package/dist/assets/jszip.min-BXqW2-9v.js.map +0 -1
- package/dist/assets/lib-Bi7BFuND.js +0 -221
- package/dist/assets/lib-Bi7BFuND.js.map +0 -1
- package/dist/assets/marked.min.js-08SGy6CO.js.map +0 -1
- package/dist/assets/model-profiles-Dl_MsXWa.js +0 -25
- package/dist/assets/model-profiles-Dl_MsXWa.js.map +0 -1
- package/dist/assets/options-8-nu3P5K.css +0 -1
- package/dist/assets/options.js.map +0 -1
- package/dist/assets/page-snapshot-renderer-CVL6r6Kf.js.map +0 -1
- package/dist/assets/pdf-HiJ0icvU.js +0 -7
- package/dist/assets/pdf-HiJ0icvU.js.map +0 -1
- package/dist/assets/rolldown-runtime-C0FnF6B9.js +0 -1
- package/dist/assets/session-store-CzVQCgQ_.js +0 -77
- package/dist/assets/session-store-CzVQCgQ_.js.map +0 -1
- package/dist/assets/side_panel.js.map +0 -1
- package/dist/assets/version-CNG2KGnJ.js +0 -2
- package/dist/assets/version-CNG2KGnJ.js.map +0 -1
- package/dist/assets/xlsx-BHKh7vjA.js +0 -106
- package/dist/assets/xlsx-BHKh7vjA.js.map +0 -1
- package/dist/icons/badges/license-MIT.svg +0 -21
- package/dist/icons/badges/platform.svg +0 -21
- package/dist/icons/badges/prs-welcome.svg +0 -21
- package/dist/icons/badges/version.svg +0 -21
package/dist/assets/options.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{a as e,c as t,i as n,l as r,n as i,o as a,r as o,s,t as c}from"./i18n-
|
|
1
|
+
import{a as e,c as t,i as n,l as r,n as i,o as a,r as o,s,t as c}from"./i18n-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-t8HzLv3V.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++)、架构优化、性能调优、代码审查、文档编写、浏览器工具调用
|
|
@@ -10,7 +10,7 @@ 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-C4j
|
|
|
10
10
|
Programming development and debugging (Java/Python/JavaScript/Go/C++), architecture optimization, performance tuning, code review, documentation writing, browser tool invocation
|
|
11
11
|
|
|
12
12
|
## Requirements
|
|
13
|
-
Precise technical terminology, runnable code examples, Markdown format, actionable solutions, no security-violating code`}}),e(`zh`,{selToolbar:{sysPromptAisearch:`你正在处理用户在网页上选中的内容。使用ReAct Agent模式,通过多轮思考、搜索和推理来回答选中的问题。`,sysPromptExplain:`你正在处理用户在网页上选中的内容。用1-3句简洁解释选中内容,必要时补充一个简短示例。不要展开长篇论述。`,sysPromptTranslate:`你正在处理用户在网页上选中的内容。自动检测语言:中文→英文,英文→中文,其他语言→同时给出中英文。只输出翻译结果,不添加额外说明。`,sysPromptSummary:`你正在处理用户在网页上选中的内容。用3-5个要点总结选中内容,每条要点一句话,提炼核心信息即可。`,sysPromptCopy:`将选中内容复制到剪贴板。`}}),e(`en`,{selToolbar:{sysPromptAisearch:`You are processing content selected by the user on a web page. Use ReAct Agent mode to answer selected questions through multiple rounds of thinking, searching, and reasoning.`,sysPromptExplain:`You are processing content selected by the user on a web page. Explain the selected content in 1-3 concise sentences, supplementing with a brief example if necessary. Do not expand into lengthy discussions.`,sysPromptTranslate:`You are processing content selected by the user on a web page. Auto-detect language: Chinese→English, English→Chinese, other languages→provide both Chinese and English. Output only the translation result, no additional explanations.`,sysPromptSummary:`You are processing content selected by the user on a web page. Summarize the selected content in 3-5 bullet points, one sentence per point, distilling the core information.`,sysPromptCopy:`Copy the selected content to the clipboard.`}});var
|
|
13
|
+
Precise technical terminology, runnable code examples, Markdown format, actionable solutions, no security-violating code`}}),e(`zh`,{selToolbar:{sysPromptAisearch:`你正在处理用户在网页上选中的内容。使用ReAct Agent模式,通过多轮思考、搜索和推理来回答选中的问题。`,sysPromptExplain:`你正在处理用户在网页上选中的内容。用1-3句简洁解释选中内容,必要时补充一个简短示例。不要展开长篇论述。`,sysPromptTranslate:`你正在处理用户在网页上选中的内容。自动检测语言:中文→英文,英文→中文,其他语言→同时给出中英文。只输出翻译结果,不添加额外说明。`,sysPromptSummary:`你正在处理用户在网页上选中的内容。用3-5个要点总结选中内容,每条要点一句话,提炼核心信息即可。`,sysPromptCopy:`将选中内容复制到剪贴板。`}}),e(`en`,{selToolbar:{sysPromptAisearch:`You are processing content selected by the user on a web page. Use ReAct Agent mode to answer selected questions through multiple rounds of thinking, searching, and reasoning.`,sysPromptExplain:`You are processing content selected by the user on a web page. Explain the selected content in 1-3 concise sentences, supplementing with a brief example if necessary. Do not expand into lengthy discussions.`,sysPromptTranslate:`You are processing content selected by the user on a web page. Auto-detect language: Chinese→English, English→Chinese, other languages→provide both Chinese and English. Output only the translation result, no additional explanations.`,sysPromptSummary:`You are processing content selected by the user on a web page. Summarize the selected content in 3-5 bullet points, one sentence per point, distilling the core information.`,sysPromptCopy:`Copy the selected content to the clipboard.`}});var D=[`deepseek-v4-pro`,`deepseek-v4-flash`],O=[`https://api.deepseek.com`,`https://api.hunyuan.cloud.tencent.com/v1`,`https://dashscope.aliyuncs.com/compatible-mode/v1`,`https://qianfan.baidubce.com/v2`,`https://ark.cn-beijing.volces.com/api/v3`,`https://open.bigmodel.cn/api/paas/v4`,`https://api.moonshot.cn/v1`,`https://api.stepfun.com/v1`,`https://api.minimaxi.com/v1`,`https://spark-api-open.xf-yun.com/v1`,`https://api.baichuan-ai.com/v1`,`https://api.siliconflow.cn/v1`,`https://api.openai.com/v1`,`https://api.anthropic.com/v1`,`https://generativelanguage.googleapis.com/v1beta/openai`,`https://openrouter.ai/api/v1`,`https://api.groq.com/openai/v1`,`https://api.mistral.ai/v1`],k=d,de=[{id:`ai-search`,name:t(`optionsConst.aiSearch`),systemPrompt:`You are processing content selected by the user on a web page. Use ReAct Agent mode to answer the selected question through multiple rounds of thinking, searching, and reasoning.`,builtin:!0,order:0},{id:`explain`,name:t(`optionsConst.explain`),systemPrompt:`You are processing content selected by the user on a web page. Explain the selected content in 1-3 concise sentences, adding a brief example if necessary. Do not elaborate at length.`,builtin:!0,order:1},{id:`translate`,name:t(`optionsConst.translate`),systemPrompt:`You are processing content selected by the user on a web page. Auto-detect language: Chinese to English, English to Chinese, other languages provide both Chinese and English. Output only the translation result without additional explanations.`,builtin:!0,order:2},{id:`summary`,name:t(`optionsConst.summary`),systemPrompt:`You are processing content selected by the user on a web page. Summarize the selected content in 3-5 key points, one sentence per point, distilling the core information.`,builtin:!0,order:3},{id:`copy`,name:t(`optionsConst.copy`),systemPrompt:`Copy the selected content to the clipboard.`,builtin:!0,order:99}],fe={"ai-search":`optionsConst.aiSearch`,explain:`optionsConst.explain`,translate:`optionsConst.translate`,summary:`optionsConst.summary`,copy:`optionsConst.copy`};function pe(e){let n=fe[e];return n?t(n):void 0}var me={"ai-search":`selToolbar.sysPromptAisearch`,explain:`selToolbar.sysPromptExplain`,translate:`selToolbar.sysPromptTranslate`,summary:`selToolbar.sysPromptSummary`,copy:`selToolbar.sysPromptCopy`};function he(e){let n=me[e];return n?t(n):void 0}function ge(){return t(`optionsConst.defaultSystemPrompt`)}var A={maxInputHistory:20,maxHistoryMessages:50,...f},j=[1e3,2e3,4e3,8e3,16e3,32e3,64e3,128e3,2e5,256e3,512e3,1e6],_e=j.length-1;function ve(e){let t=Number(e)||0,n=0,r=1/0;for(let e=0;e<j.length;e++){let i=Math.abs(j[e]-t);i<r&&(r=i,n=e)}return n}function ye(e){return j[Math.min(Math.max(Math.round(Number(e)||0),0),_e)]}var M=null,N=null,P=null,F=null,I=null,be=[],L=null;function xe(){M=document.createElement(`div`),M.className=`ctx-popover`,M.setAttribute(`role`,`dialog`),M.setAttribute(`aria-label`,t(`settings.ctxSliderIconTitle`)),M.innerHTML=`
|
|
14
14
|
<div class="ctx-popover-title-row">
|
|
15
15
|
<span class="ctx-popover-title"></span>
|
|
16
16
|
<button type="button" class="ctx-popover-auto-btn"></button>
|
|
@@ -19,13 +19,13 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
19
19
|
<span class="ctx-popover-value"></span>
|
|
20
20
|
<span class="ctx-popover-auto-tag"></span>
|
|
21
21
|
</div>
|
|
22
|
-
<input type="range" class="ctx-popover-slider" min="0" max="${
|
|
22
|
+
<input type="range" class="ctx-popover-slider" min="0" max="${_e}" step="1">
|
|
23
23
|
<div class="ctx-popover-scale" aria-hidden="true"></div>
|
|
24
24
|
<div class="ctx-popover-scale-labels" aria-hidden="true">
|
|
25
25
|
<span class="ctx-popover-scale-start"></span>
|
|
26
26
|
<span class="ctx-popover-scale-end"></span>
|
|
27
27
|
</div>
|
|
28
|
-
`,P=N.querySelector(`.ctx-popover-slider`),F=N.querySelector(`.ctx-popover-value`),I=N.querySelector(`.ctx-popover-auto-tag`),L=N.querySelector(`.ctx-popover-auto-btn`);let e=N.querySelector(`.ctx-popover-scale`);for(let t=0;t<M.length;t++){let t=document.createElement(`span`);t.className=`ctx-popover-scale-dot`,e.appendChild(t)}me=[...e.children],N.querySelector(`.ctx-popover-scale-start`).textContent=x(M[0]),N.querySelector(`.ctx-popover-scale-end`).textContent=x(M[de]),L.textContent=t(`settings.ctxSliderResetAuto`),L.title=t(`settings.ctxSliderAutoTitle`),I.textContent=t(`settings.ctxSliderAuto`),P.addEventListener(`pointerdown`,()=>{if(!R)return;let e=parseInt(R.optionEl.dataset.contextWindow,10)||0;R.drag={originTokens:e,originIndex:fe(e||l(R.optionEl.dataset.value)),moved:!1}}),P.addEventListener(`input`,()=>{if(!R)return;R.drag&&(R.drag.moved=!0);let e=pe(P.value);ge(e,!1),R.callbacks.onPreview?.(e)}),P.addEventListener(`change`,()=>{R&&R.callbacks.onCommit?.(pe(P.value))}),L.addEventListener(`click`,()=>{R&&(R.callbacks.onReset?.(),ge(l(R.optionEl.dataset.value),!0))})}function ge(e,t){let n=fe(e);P.value=String(n),F.textContent=x(e),F.classList.toggle(`is-auto`,t),I.style.display=t?``:`none`,L.style.display=t?`none`:``,me.forEach((e,t)=>e.classList.toggle(`is-active`,t===n));let r=(n/de*100).toFixed(1)+`%`;P.style.setProperty(`--ctx-fill`,r)}function _e(e){!e||!e.moved||!R||(R.callbacks.onPreview?.(e.originTokens),e.originTokens>0?ge(e.originTokens,!1):ge(l(R.optionEl.dataset.value),!0))}function ve(){let e=R.anchorBtn.getBoundingClientRect(),t=N.getBoundingClientRect(),n=e.right-t.width;n=Math.max(8,Math.min(n,window.innerWidth-t.width-8));let r=e.bottom+6;if(r+t.height>window.innerHeight-8){let n=e.top-6-t.height;r=n>=8?n:Math.max(8,window.innerHeight-t.height-8)}N.style.left=`${Math.round(n)}px`,N.style.top=`${Math.round(r)}px`}function ye(e,t,n={}){if(!e||!t)return;if(R&&R.anchorBtn===e){z();return}z();let r=parseInt(t.dataset.contextWindow,10)||0;he(),R={anchorBtn:e,optionEl:t,callbacks:n},N.querySelector(`.ctx-popover-title`).textContent=t.dataset.value||``,r>0?ge(r,!1):ge(l(t.dataset.value),!0),document.body.appendChild(N),ve(),P.focus({preventScroll:!0}),R.onDocClick=t=>{N.contains(t.target)||e.contains(t.target)||z()},R.onKeyDown=e=>{e.key===`Escape`&&z()},R.onScroll=()=>z(),R.onResize=()=>z(),R.onDocPointerUp=()=>{if(!R?.drag)return;let e=R.drag;if(R.drag=null,!e.moved)return;let t=Number(P.value);t===e.originIndex&&R.callbacks.onCommit?.(pe(t))},R.onDocPointerCancel=()=>{if(!R?.drag)return;let e=R.drag;R.drag=null,_e(e)},document.addEventListener(`click`,R.onDocClick,!0),document.addEventListener(`keydown`,R.onKeyDown),document.addEventListener(`scroll`,R.onScroll,!0),document.addEventListener(`pointerup`,R.onDocPointerUp,!0),document.addEventListener(`pointercancel`,R.onDocPointerCancel,!0),window.addEventListener(`resize`,R.onResize)}function z(){if(!R)return;let e=R;_e(e.drag),R=null,document.removeEventListener(`click`,e.onDocClick,!0),document.removeEventListener(`keydown`,e.onKeyDown),document.removeEventListener(`scroll`,e.onScroll,!0),document.removeEventListener(`pointerup`,e.onDocPointerUp,!0),document.removeEventListener(`pointercancel`,e.onDocPointerCancel,!0),window.removeEventListener(`resize`,e.onResize),N?.remove(),N=null,P=null,F=null,I=null,L=null,me=[]}function be(e){return!!(N&&e&&N.contains(e))}var xe=`deepseek-v4-pro`;function Se(e){xe=e}var Ce=``;function we(e){Ce=e}var Te=`<svg width="14" height="14" viewBox="0 0 14 14" aria-hidden="true"><g stroke="currentColor" stroke-width="1.4" stroke-linecap="round" fill="none"><path d="M1.2 4h3.1M9.7 4h3.1M1.2 10h4.6M11.2 10h1.6"/><circle cx="7" cy="4" r="1.6"/><circle cx="8.5" cy="10" r="1.6"/></g></svg>`;function B(){let e=document.createElement(`button`);return e.type=`button`,e.className=`ctx-set-btn`,e.title=t(`settings.ctxSliderIconTitle`),e.setAttribute(`aria-label`,t(`settings.ctxSliderIconTitle`)),e.innerHTML=Te,e}function Ee(e,n){let r=e.querySelector(`.model-option-right`);if(!r)return;let i=Number(n)||0,a=r.querySelector(`.model-ctx-badge`);a||(a=document.createElement(`span`),a.className=`model-ctx-badge`,r.insertBefore(a,r.firstChild)),i>0?(a.classList.remove(`is-auto`),a.textContent=x(i),a.removeAttribute(`title`)):(a.classList.add(`is-auto`),a.textContent=x(l(e.dataset.value)),a.title=t(`settings.ctxBadgeAutoTip`))}function De(e){let t=document.createElement(`span`);t.className=`model-option-left`;let n=[];for(let t of[...e.childNodes])t.nodeType===Node.TEXT_NODE&&n.push(t);n.forEach(e=>{t.appendChild(e)}),e.insertBefore(t,e.firstChild)}function Oe(e,n){let r=document.getElementById(`modelDropdown`),i=r.querySelector(`.model-option[data-value="${e}"]`);if(i){if(n&&n>0){i.dataset.contextWindow=n,i.dataset.isCustom=`true`;let e=i.querySelector(`.model-option-left`);e||=(De(i),i.querySelector(`.model-option-left`));let r=i.querySelector(`.model-option-right`);if(!r){r=document.createElement(`span`),r.className=`model-option-right`;let e=i.querySelector(`:scope > .model-ctx-badge`);e&&r.appendChild(e),r.appendChild(B());let n=i.querySelector(`:scope > .delete-model-btn`);n||(n=document.createElement(`button`),n.type=`button`,n.className=`delete-model-btn`,n.title=t(`settings.deleteModel`),n.innerHTML=`×`),n.style.display=`inline-block`,r.appendChild(n),i.appendChild(r)}else if(!r.querySelector(`.ctx-set-btn`)){let e=r.querySelector(`.delete-model-btn`);e?r.insertBefore(B(),e):r.appendChild(B())}Ee(i,n),Pe()}return}Ae(r,ke(e,n||0),e),Pe()}function ke(e,n=0){let r=document.createElement(`div`);r.className=`model-option`,r.dataset.value=e,(!se.includes(e)||n&&n>0)&&(r.dataset.isCustom=`true`),n&&n>0&&(r.dataset.contextWindow=n);let i=document.createElement(`span`);i.className=`model-option-left`,i.textContent=e,r.appendChild(i);let a=document.createElement(`span`);a.className=`model-option-right`,a.appendChild(B());let o=document.createElement(`button`);return o.type=`button`,o.className=`delete-model-btn`,o.title=t(`settings.deleteModel`),o.innerHTML=`×`,o.style.display=`inline-block`,a.appendChild(o),r.appendChild(a),Ee(r,n||0),r}function Ae(e,t,n){let r=[...e.querySelectorAll(`.model-option`)].find(e=>b(e.dataset.value,n)>0);r?e.insertBefore(t,r):e.appendChild(t)}function je(e,n){if(!e)return;let r=String(n||``).trim().toLowerCase(),i=0;e.querySelectorAll(`.model-option`).forEach(e=>{let t=!r||e.textContent.toLowerCase().includes(r);e.style.display=t?``:`none`,t&&(i+=1)});let a=e.querySelector(`.model-dropdown-empty`);r&&i===0?(a||(a=document.createElement(`div`),a.className=`model-dropdown-empty`,e.appendChild(a)),a.textContent=t(`settings.noMatch`)):a&&a.remove()}function Me(e){z();let t=document.getElementById(`modelDropdown`),n=t.querySelector(`.model-option[data-value="${e}"]`);if(n&&n.remove(),xe===e){let e=t.querySelector(`.model-option`),n=e?e.dataset.value:``;Se(n);let r=document.getElementById(`modelInput`);r&&(r.value=n),Le(n)}Pe()}function Ne(){let e=document.getElementById(`modelDropdown`),t=[];return e?.querySelectorAll(`.model-option`).forEach(e=>{t.push({name:e.dataset.value,contextWindow:parseInt(e.dataset.contextWindow)||0})}),t}function Pe(){let e=Ne();chrome.storage.local.set({customModels:e},()=>{r.debug(`[Options] customModel list saved:`,e),p(e)})}function Fe(e){chrome.storage.local.get([`customModels`],t=>{Ie(ee(t.customModels)),typeof e==`function`&&e()})}function Ie(e,t){let n=document.getElementById(`modelDropdown`);if(!n)return;z(),n.innerHTML=``;let r=[...e||[]].sort((e,t)=>b(e?.name,t?.name));for(let e of r)n.appendChild(ke(e.name,e.contextWindow||0));let i=t===void 0?xe:t;n.querySelectorAll(`.model-option`).forEach(e=>{e.classList.toggle(`selected`,e.dataset.value===i)})}function Le(e){document.querySelectorAll(`.model-option`).forEach(t=>{t.dataset.value===e?t.classList.add(`selected`):t.classList.remove(`selected`)}),Re(`modelInput`,`modelSelectedCtxBadge`,`modelDropdown`)}function Re(e,t,n){let r=document.getElementById(e),i=document.getElementById(t),a=document.getElementById(n);if(!i||!a)return;if(r&&!r.value){i.style.display=`none`;return}let o=a.querySelector(`.model-option.selected`)||(r?a.querySelector(`.model-option[data-value="${r.value}"]`):null);if(o){let e=parseInt(o.dataset.contextWindow);e>0?(i.textContent=x(e),i.style.display=``):i.style.display=`none`}else i.style.display=`none`}function ze(e,t){if(!e||!e.querySelector(`.model-option-right`))return;let n=Number(t)||0,r=se.includes(e.dataset.value);n>0?(e.dataset.contextWindow=String(n),r&&(e.dataset.isCustom=`true`)):(delete e.dataset.contextWindow,r&&delete e.dataset.isCustom),Ee(e,n)}function Be(e,t){ze(e,t),Pe(),Re(`modelInput`,`modelSelectedCtxBadge`,`modelDropdown`)}function Ve(e,n){let r=document.getElementById(`imageModelDropdown`);if(!r)return;let i=r.querySelector(`.model-option[data-value="${e}"]`);if(i){if(n&&n>0){i.dataset.contextWindow=n;let e=i.querySelector(`.model-option-left`);e||=(De(i),i.querySelector(`.model-option-left`));let t=i.querySelector(`.model-option-right`);if(!t){t=document.createElement(`span`),t.className=`model-option-right`;let e=i.querySelector(`:scope > .model-ctx-badge`);e&&t.appendChild(e),t.appendChild(B());let n=i.querySelector(`:scope > .delete-model-btn`);n&&t.appendChild(n),i.appendChild(t)}else if(!t.querySelector(`.ctx-set-btn`)){let e=t.querySelector(`.delete-model-btn`);e?t.insertBefore(B(),e):t.appendChild(B())}Ee(i,n),Ue()}return}let a=document.createElement(`div`);a.className=`model-option`,a.dataset.value=e,n&&n>0&&(a.dataset.contextWindow=n);let o=document.createElement(`span`);o.className=`model-option-left`,o.textContent=e,a.appendChild(o);let s=document.createElement(`span`);s.className=`model-option-right`,s.appendChild(B());let c=document.createElement(`button`);c.type=`button`,c.className=`delete-model-btn`,c.title=t(`settings.deleteModel`),c.innerHTML=`×`,c.style.display=`inline-block`,s.appendChild(c),a.appendChild(s),Ee(a,n||0),Ae(r,a,e),Ue()}function He(e){z();let t=document.getElementById(`imageModelDropdown`);if(!t)return;let n=t.querySelector(`.model-option[data-value="${e}"]`);if(n&&n.remove(),Ce===e){let e=t.querySelector(`.model-option`),n=e?e.dataset.value:``;we(n);let r=document.getElementById(`imageModelInput`);r&&(r.value=n),Ke(n)}Ue()}function Ue(){let e=document.getElementById(`imageModelDropdown`);if(!e)return;let t=[];e.querySelectorAll(`.model-option`).forEach(e=>{t.push({name:e.dataset.value,contextWindow:parseInt(e.dataset.contextWindow)||0})}),chrome.storage.local.set({imageModels:t},()=>{r.debug(`[Options] image recognitionmodel saved:`,t)})}function We(e,t){ze(e,t),Ue(),Re(`imageModelInput`,`imageModelSelectedCtxBadge`,`imageModelDropdown`)}function Ge(e){chrome.storage.local.get([`imageModels`],n=>{let i=document.getElementById(`imageModelDropdown`);if(!i){typeof e==`function`&&e();return}let a=n.imageModels||[],o=!1;z(),i.innerHTML=``;let s=e=>typeof e==`string`?e:e&&e.name||``;[...a].sort((e,t)=>b(s(e),s(t))).forEach(e=>{let n,r=0;if(typeof e==`string`)n=e,o=!0;else if(e&&typeof e==`object`&&e.name)n=e.name,r=e.contextWindow||0;else return;let a=document.createElement(`div`);a.className=`model-option`,a.dataset.value=n,r&&r>0&&(a.dataset.contextWindow=r);let s=document.createElement(`span`);s.className=`model-option-left`,s.textContent=n,a.appendChild(s);let c=document.createElement(`span`);c.className=`model-option-right`,c.appendChild(B());let l=document.createElement(`button`);l.type=`button`,l.className=`delete-model-btn`,l.title=t(`settings.deleteModel`),l.innerHTML=`×`,l.style.display=`inline-block`,c.appendChild(l),a.appendChild(c),Ee(a,r||0),i.appendChild(a)}),o&&(Ue(),r.debug(`[Options] image recognitionmodelauto-migratedisnewformat`)),typeof e==`function`&&e()})}function Ke(e){let t=document.getElementById(`imageModelDropdown`);t&&(t.querySelectorAll(`.model-option`).forEach(t=>{t.dataset.value===e?t.classList.add(`selected`):t.classList.remove(`selected`)}),Re(`imageModelInput`,`imageModelSelectedCtxBadge`,`imageModelDropdown`))}var V=[];function qe(e,n,r){let i=document.createElement(`div`);i.className=`model-option`,i.dataset.value=e,n&&(i.dataset.label=n),r&&(i.dataset.isCustom=`true`);let a=document.createElement(`span`);a.className=`model-option-left`,a.textContent=n||e,i.appendChild(a);let o=document.createElement(`span`);if(o.className=`model-option-right`,n){let t=document.createElement(`span`);t.className=`api-base-url-hint`,t.textContent=e.length>50?e.substring(0,47)+`...`:e,o.appendChild(t)}let s=document.createElement(`button`);return s.type=`button`,s.className=`delete-model-btn`,s.title=t(`settings.deleteApiBase`),s.innerHTML=`×`,s.style.display=`inline-block`,o.appendChild(s),i.appendChild(o),i}function Je(e,t){let n=document.getElementById(`apiBaseDropdown`);if(!n)return;let r=n.querySelector(`.model-option[data-value="${CSS.escape(e)}"]`);if(r){if(t){r.dataset.label=t;let e=r.querySelector(`.model-option-left`);e&&(e.textContent=t)}Xe();return}E.includes(e)&&V.includes(e)&&(V=V.filter(t=>t!==e));let i=qe(e,t,!E.includes(e));n.appendChild(i),Xe()}function Ye(e){let t=document.getElementById(`apiBaseDropdown`);if(!t)return;let n=t.querySelector(`.model-option[data-value="${CSS.escape(e)}"]`);n&&n.remove(),E.includes(e)&&!V.includes(e)&&V.push(e);let r=document.getElementById(`apiBase`);r&&r.value.trim()===e&&(r.value=``),Xe()}function Xe(){let e=document.getElementById(`apiBaseDropdown`);if(!e)return;let t=[];e.querySelectorAll(`.model-option[data-is-custom="true"]`).forEach(e=>{t.push({url:e.dataset.value,label:e.dataset.label||``})}),chrome.storage.local.set({customApiBases:t,deletedPresetApiBases:V},()=>{r.debug(`[Options] API Base URL column table saved:`,t,`deletedpreset:`,V)})}function Ze(e){chrome.storage.local.get([`customApiBases`,`deletedPresetApiBases`],t=>{let n=document.getElementById(`apiBaseDropdown`);if(!n){typeof e==`function`&&e();return}V=t.deletedPresetApiBases||[];let r=t.customApiBases||[];n.innerHTML=``,E.forEach(e=>{if(!V.includes(e)){let t=qe(e,null,!1);n.appendChild(t)}}),r.forEach(e=>{if(typeof e==`string`){if(!E.includes(e)){let t=qe(e,null,!0);n.appendChild(t)}}else if(e&&e.url){let t=qe(e.url,e.label||null,!0);n.appendChild(t)}}),typeof e==`function`&&e()})}function Qe(e){let t=document.getElementById(`apiBaseDropdown`);t&&t.querySelectorAll(`.model-option`).forEach(t=>{t.dataset.value===e?t.classList.add(`selected`):t.classList.remove(`selected`)})}var H=[];function $e(e,n,r){let i=document.createElement(`div`);i.className=`model-option`,i.dataset.value=e,n&&(i.dataset.label=n),r&&(i.dataset.isCustom=`true`);let a=document.createElement(`span`);a.className=`model-option-left`,a.textContent=n||e,i.appendChild(a);let o=document.createElement(`span`);if(o.className=`model-option-right`,n){let t=document.createElement(`span`);t.className=`api-base-url-hint`,t.textContent=e.length>50?e.substring(0,47)+`...`:e,o.appendChild(t)}let s=document.createElement(`button`);return s.type=`button`,s.className=`delete-model-btn`,s.title=t(`settings.deleteApiBase`),s.innerHTML=`×`,s.style.display=`inline-block`,o.appendChild(s),i.appendChild(o),i}function et(e,t){let n=document.getElementById(`imageApiBaseDropdown`);if(!n)return;let r=n.querySelector(`.model-option[data-value="${CSS.escape(e)}"]`);if(r){if(t){r.dataset.label=t;let e=r.querySelector(`.model-option-left`);e&&(e.textContent=t)}nt();return}E.includes(e)&&H.includes(e)&&(H=H.filter(t=>t!==e));let i=$e(e,t,!E.includes(e));n.appendChild(i),nt()}function tt(e){let t=document.getElementById(`imageApiBaseDropdown`);if(!t)return;let n=t.querySelector(`.model-option[data-value="${CSS.escape(e)}"]`);n&&n.remove(),E.includes(e)&&!H.includes(e)&&H.push(e);let r=document.getElementById(`imageApiBase`);r&&r.value.trim()===e&&(r.value=``),nt()}function nt(){let e=document.getElementById(`imageApiBaseDropdown`);if(!e)return;let t=[];e.querySelectorAll(`.model-option[data-is-custom="true"]`).forEach(e=>{t.push({url:e.dataset.value,label:e.dataset.label||``})}),chrome.storage.local.set({customImageApiBases:t,deletedPresetImageApiBases:H},()=>{r.debug(`[Options] image API Base URL column table saved:`,t)})}function rt(e){chrome.storage.local.get([`customImageApiBases`,`deletedPresetImageApiBases`],t=>{let n=document.getElementById(`imageApiBaseDropdown`);if(!n){typeof e==`function`&&e();return}H=t.deletedPresetImageApiBases||[];let r=t.customImageApiBases||[];n.innerHTML=``,E.forEach(e=>{if(!H.includes(e)){let t=$e(e,null,!1);n.appendChild(t)}}),r.forEach(e=>{if(typeof e==`string`){if(!E.includes(e)){let t=$e(e,null,!0);n.appendChild(t)}}else if(e&&e.url){let t=$e(e.url,e.label||null,!0);n.appendChild(t)}}),typeof e==`function`&&e()})}function it(e){let t=document.getElementById(`imageApiBaseDropdown`);t&&t.querySelectorAll(`.model-option`).forEach(t=>{t.dataset.value===e?t.classList.add(`selected`):t.classList.remove(`selected`)})}function at(){chrome.storage.local.get(`apiBase.apiKey.modelName.customModels.systemPrompt.enableImageInput.imageModelName.imageModels.imageApiBase.imageApiKey.enableFileInput.reactMaxIterations.reactApiTimeout.reactLoopTimeout.reactToolTimeout.preselectMinToolCount.toolConfirmationEnabled.enableExecutionLog.reflectionConfig.streamEnabled.streamExpandTools.completionSoundEnabled.completionConfettiEnabled.completionNotificationEnabled.scheduledNotificationEnabled.interactionNotificationEnabled.showMessageTimestamp.sidePanelScope.autoGroupTabs`.split(`.`),function(e){e.apiBase&&(document.getElementById(`apiBase`).value=e.apiBase),e.apiKey&&(document.getElementById(`apiKey`).value=h(e.apiKey)),e.modelName&&(Se(e.modelName),document.getElementById(`modelInput`).value=e.modelName),e.systemPrompt&&(document.getElementById(`systemPrompt`).value=e.systemPrompt);let n=document.getElementById(`enableImageInput`),r=document.getElementById(`imageModelGroup`),i=document.getElementById(`imageApiGroup`),a=document.getElementById(`imageApiKeyGroup`);if(n&&r&&(n.checked=e.enableImageInput||!1,r.style.display=n.checked?``:`none`,i&&(i.style.display=n.checked?``:`none`),a&&(a.style.display=n.checked?``:`none`)),e.imageModelName){we(e.imageModelName);let t=document.getElementById(`imageModelInput`);t&&(t.value=e.imageModelName)}e.imageApiBase&&(document.getElementById(`imageApiBase`).value=e.imageApiBase),e.imageApiKey&&(document.getElementById(`imageApiKey`).value=h(e.imageApiKey)),document.getElementById(`reactMaxIterations`).value=e.reactMaxIterations||D.maxIterations,document.getElementById(`reactApiTimeout`).value=Math.round((e.reactApiTimeout||D.apiTimeout)/6e4),document.getElementById(`reactLoopTimeout`).value=Math.round((e.reactLoopTimeout||D.loopTimeout)/6e4),document.getElementById(`reactToolTimeout`).value=Math.round((e.reactToolTimeout||D.toolTimeout)/6e4);let o=document.getElementById(`enableToolPreselect`);o&&(o.checked=e.enableToolPreselect===void 0?D.enableToolPreselect:e.enableToolPreselect,o.dispatchEvent(new Event(`change`)));let s=document.getElementById(`preselectMinToolCount`);s&&(s.value=e.preselectMinToolCount===void 0?D.preselectMinToolCount:e.preselectMinToolCount),document.getElementById(`toolConfirmationEnabled`).checked=e.toolConfirmationEnabled===void 0?D.toolConfirmationEnabled:e.toolConfirmationEnabled,document.getElementById(`toolConfirmationEnabled`).dispatchEvent(new Event(`change`)),document.getElementById(`enableExecutionLog`).checked=e.enableExecutionLog===void 0?j.enableExecutionLog:e.enableExecutionLog,document.getElementById(`enableExecutionLog`).dispatchEvent(new Event(`change`));let c=e.reflectionConfig||u;document.getElementById(`reflectionEnabled`).checked=c.enabled!==!1,document.getElementById(`postReflectionEnabled`).checked=c.postReflection?.enabled!==!1,document.getElementById(`subtaskReflectionEnabled`).checked=c.subtaskReflection?.enabled===!0,document.getElementById(`streamEnabled`).checked=e.streamEnabled===void 0||e.streamEnabled;let l=document.getElementById(`streamExpandTools`),d=document.getElementById(`streamExpandToolsLabel`),f=document.getElementById(`streamExpandToolsWrap`);l&&(l.checked=e.streamExpandTools===!0),d&&(d.textContent=l?.checked?t(`common.enabled`):t(`common.disabled`)),f&&(f.style.display=e.streamEnabled===void 0||e.streamEnabled?`block`:`none`);function p(){let e=document.getElementById(`reflectionConfig`),t=document.getElementById(`reflectionEnabled`);e&&(!t||!t.checked?e.classList.add(`disabled`):e.classList.remove(`disabled`));function n(e,t){let n=document.getElementById(e),r=document.getElementById(t);n&&r&&(r.checked?n.classList.remove(`disabled`):n.classList.add(`disabled`))}n(`postReflectionSection`,`postReflectionEnabled`),n(`subtaskReflectionSection`,`subtaskReflectionEnabled`)}let m=document.getElementById(`completionSoundEnabled`),g=document.getElementById(`completionConfettiEnabled`);m&&(m.checked=e.completionSoundEnabled!==!1),g&&(g.checked=e.completionConfettiEnabled!==!1);let _=document.getElementById(`completionNotificationEnabled`),v=document.getElementById(`scheduledNotificationEnabled`),y=document.getElementById(`interactionNotificationEnabled`);_&&(_.checked=e.completionNotificationEnabled!==!1),v&&(v.checked=e.scheduledNotificationEnabled!==!1),y&&(y.checked=e.interactionNotificationEnabled!==!1);let b=document.getElementById(`showMessageTimestamp`);b&&(b.checked=e.showMessageTimestamp!==!1);let x=e.sidePanelScope===`tab-specific`?`tab-specific`:`global`,ee=document.querySelectorAll(`input[name="sidePanelScope"]`);ee.forEach(e=>{e.checked=e.value===x}),ee.forEach(e=>{e.dataset.scopeListenerBound||(e.dataset.scopeListenerBound=`1`,e.addEventListener(`change`,()=>{e.checked&&(chrome.storage.local.set({sidePanelScope:e.value}),te())}))});let S=document.getElementById(`autoGroupTabs`);S&&(S.checked=e.autoGroupTabs!==!1);function te(){if(!S)return;let e=document.querySelector(`input[name="sidePanelScope"]:checked`)?.value||`global`;S.disabled=e!==`tab-specific`}te(),S&&!S.dataset.groupListenerBound&&(S.dataset.groupListenerBound=`1`,S.addEventListener(`change`,()=>{chrome.storage.local.set({autoGroupTabs:S.checked})})),Fe(()=>{e.modelName&&Le(e.modelName),p()}),Ge(()=>{e.imageModelName&&Ke(e.imageModelName)}),Ze(()=>{e.apiBase&&Qe(e.apiBase)}),rt(()=>{e.imageApiBase&&it(e.imageApiBase)})})}function ot(){let e=document.getElementById(`apiBase`).value.trim(),n=document.getElementById(`apiKey`).value.trim(),r=document.getElementById(`systemPrompt`).value.trim(),i=parseInt(document.getElementById(`reactMaxIterations`).value)||D.maxIterations,a=(parseInt(document.getElementById(`reactApiTimeout`).value)||5)*6e4,o=(parseInt(document.getElementById(`reactLoopTimeout`).value)||5)*6e4,s=(parseInt(document.getElementById(`reactToolTimeout`).value)||5)*6e4,c=document.getElementById(`toolConfirmationEnabled`).checked,l=document.getElementById(`enableExecutionLog`).checked,d=document.getElementById(`streamEnabled`)?.checked!==!1,f=document.getElementById(`streamExpandTools`)?.checked===!0,p=document.getElementById(`completionSoundEnabled`)?.checked!==!1,m=document.getElementById(`completionConfettiEnabled`)?.checked!==!1,h=document.getElementById(`completionNotificationEnabled`)?.checked!==!1,g=document.getElementById(`scheduledNotificationEnabled`)?.checked!==!1,_=document.getElementById(`interactionNotificationEnabled`)?.checked!==!1,v=document.getElementById(`showMessageTimestamp`)?.checked!==!1,y=document.getElementById(`enableImageInput`)?.checked||!1,b=Ce||``,x=document.getElementById(`imageApiBase`)?.value.trim()||``,ee=document.getElementById(`imageApiKey`)?.value.trim()||``,S={enabled:document.getElementById(`reflectionEnabled`).checked,postReflection:{...u.postReflection,enabled:document.getElementById(`postReflectionEnabled`).checked},subtaskReflection:{...u.subtaskReflection,enabled:document.getElementById(`subtaskReflectionEnabled`).checked}};if(i<10||i>1e3){U(`❌ ${t(`settings.maxIterationsRangeError`)}`,`error`);return}if(a<6e4||a>6e5){U(`❌ ${t(`settings.apiTimeoutRangeError`)}`,`error`);return}if(o<6e4||o>72e5){U(`❌ ${t(`settings.loopTimeoutRangeError`)}`,`error`);return}if(s<6e4||s>18e5){U(`❌ ${t(`settings.toolTimeoutRangeError`)}`,`error`);return}if(e||=`https://api.deepseek.com`,!n){U(`❌ ${t(`settings.apiKeyEmpty`)}`,`error`);return}chrome.storage.local.set({apiBase:e,apiKey:ae(n),modelName:xe||`deepseek-v4-pro`,systemPrompt:r,reactMaxIterations:i,reactApiTimeout:a,reactLoopTimeout:o,reactToolTimeout:s,toolConfirmationEnabled:c,enableExecutionLog:l,enableImageInput:y,imageModelName:b,imageApiBase:x,imageApiKey:ae(ee),reflectionConfig:S,streamEnabled:d,streamExpandTools:f,completionSoundEnabled:p,completionConfettiEnabled:m,completionNotificationEnabled:h,scheduledNotificationEnabled:g,interactionNotificationEnabled:_,showMessageTimestamp:v,sidePanelScope:document.querySelector(`input[name="sidePanelScope"]:checked`)?.value||`global`,autoGroupTabs:document.getElementById(`autoGroupTabs`)?.checked!==!1},async function(){if(chrome.runtime.lastError)U(`❌ ${t(`settings.saveFailed`,{message:chrome.runtime.lastError.message})}`,`error`);else{ie({apiBase:e,apiKey:n,modelName:xe||`deepseek-v4-pro`,models:Ne()}),U(`✅ ${t(`settings.saveSuccess`)}`,`success`);let r=document.getElementById(`status`);r.style.display=`none`;let i=document.getElementById(`saveBtn`);i&&(i.classList.add(`saved`),setTimeout(()=>i.classList.remove(`saved`),1500));let a=await chrome.storage.local.get([`pairedAgents`,`activeAgentId`]),o=null,s=(a.pairedAgents||[]).find(e=>e.id===a.activeAgentId);if(s){o={url:s.url,connected:!0,name:s.name};try{let e=await fetch(`${s.url}/api/status/detail`,{headers:{Authorization:`Bearer ${s.token}`}});if(e.ok){let t=await e.json();o.workdir=t.workdir}}catch{}}}})}function U(e,t=`info`,n=3e3){let r=document.getElementById(`toastContainer`);if(!r)return;let i=document.createElement(`div`);i.className=`toast ${t}`,i.textContent=e,r.appendChild(i),requestAnimationFrame(()=>{i.classList.add(`toast-show`)}),setTimeout(()=>{i.classList.remove(`toast-show`),setTimeout(()=>{i.parentNode&&i.parentNode.removeChild(i)},300)},n)}function st(e){if(!e||typeof e!=`object`)return[];let t=Array.isArray(e.data)?e.data:Array.isArray(e.models)?e.models:null;if(!t)return[];let n=new Set,r=[];for(let e of t){let t=``;if(typeof e==`string`)t=e;else if(e&&typeof e==`object`){let n=e.id||e.name||e.model;typeof n==`string`&&(t=n)}t=(t||``).trim(),!(!t||n.has(t))&&(n.add(t),r.push(t))}return r}var ct=class extends Error{constructor(e,{status:t,reason:n}={}){super(e),this.name=`FetchModelsError`,this.status=t,this.reason=n}};function lt(e){return`${String(e).trim().replace(/\/+$/,``)}/models`}function ut(e){return/anthropic\.com/i.test(String(e||``))}async function dt({apiBase:e,apiKey:t,timeoutMs:n=15e3}={}){let r=(e||``).trim(),i=(t||``).trim();if(!r||!i)throw new ct(`missing apiBase or apiKey`,{reason:`invalid-config`});let a={Authorization:`Bearer ${i}`};ut(r)&&(a[`x-api-key`]=i,a[`anthropic-version`]=`2023-06-01`);let o=new AbortController,s=setTimeout(()=>o.abort(),n),c;try{c=await fetch(lt(r),{method:`GET`,headers:a,signal:o.signal})}catch(e){throw clearTimeout(s),e&&e.name===`AbortError`?new ct(`request timeout`,{reason:`timeout`}):new ct(e&&e.message||`network error`,{reason:`network`})}if(clearTimeout(s),!c.ok)throw new ct(`HTTP ${c.status}`,{status:c.status,reason:`http`});let l;try{l=await c.json()}catch{throw new ct(`invalid JSON`,{reason:`parse`})}let u=st(l);if(!u.length)throw new ct(`no models parsed`,{reason:`parse`});return u}var ft=-1;function pt(){return new Promise(e=>{chrome.storage.local.get([`toolbarTools`,`toolbarIconOnly`,`enableSelectionToolbar`],t=>{let n=t.toolbarTools&&t.toolbarTools.length>0?t.toolbarTools:[...ce],r=t.toolbarIconOnly!==void 0&&t.toolbarIconOnly,i=t.enableSelectionToolbar===void 0||t.enableSelectionToolbar,a=new Map(ce.map(e=>[e.id,e])),o=n.map(e=>{if(e.builtin&&a.has(e.id)){let t=k(e.id),n=A(e.id);return{...e,systemPrompt:n||a.get(e.id).systemPrompt,name:t||e.name}}return e}),s=document.getElementById(`toolbarIconOnly`);s&&(s.checked=r);let c=document.getElementById(`enableSelectionToolbar`);c&&(c.checked=i),e(o)})})}function mt(e){let n=document.getElementById(`toolbarToolsList`);if(!n)return;let r=[...e].filter(e=>e.id!==`ai-search`&&e.id!==`copy`).sort((e,t)=>e.order-t.order);n.innerHTML=r.map((e,n)=>{let i=e.builtin,a=i&&k(e.id)||e.name,o=i?`<span class="tool-badge builtin">${t(`toolbar.builtinBadge`)}</span>`:`<span class="tool-badge custom">${t(`toolbar.customBadge`)}</span>`,s=e.systemPrompt?`<div class="tool-prompt-preview" title="${St(e.systemPrompt)}">${St(e.systemPrompt)}</div>`:``,c=n===0,l=n===r.length-1,u=``;return i||(u+=`<button class="tool-action-btn" data-action="edit" data-index="${n}">${t(`common.edit`)}</button>`,u+=`<button class="tool-action-btn danger" data-action="delete" data-index="${n}">${t(`common.delete`)}</button>`),`
|
|
28
|
+
`,N=M.querySelector(`.ctx-popover-slider`),P=M.querySelector(`.ctx-popover-value`),F=M.querySelector(`.ctx-popover-auto-tag`),I=M.querySelector(`.ctx-popover-auto-btn`);let e=M.querySelector(`.ctx-popover-scale`);for(let t=0;t<j.length;t++){let t=document.createElement(`span`);t.className=`ctx-popover-scale-dot`,e.appendChild(t)}be=[...e.children],M.querySelector(`.ctx-popover-scale-start`).textContent=x(j[0]),M.querySelector(`.ctx-popover-scale-end`).textContent=x(j[_e]),I.textContent=t(`settings.ctxSliderResetAuto`),I.title=t(`settings.ctxSliderAutoTitle`),F.textContent=t(`settings.ctxSliderAuto`),N.addEventListener(`pointerdown`,()=>{if(!L)return;let e=parseInt(L.optionEl.dataset.contextWindow,10)||0;L.drag={originTokens:e,originIndex:ve(e||u(L.optionEl.dataset.value)),moved:!1}}),N.addEventListener(`input`,()=>{if(!L)return;L.drag&&(L.drag.moved=!0);let e=ye(N.value);Se(e,!1),L.callbacks.onPreview?.(e)}),N.addEventListener(`change`,()=>{L&&L.callbacks.onCommit?.(ye(N.value))}),I.addEventListener(`click`,()=>{L&&(L.callbacks.onReset?.(),Se(u(L.optionEl.dataset.value),!0))})}function Se(e,t){let n=ve(e);N.value=String(n),P.textContent=x(e),P.classList.toggle(`is-auto`,t),F.style.display=t?``:`none`,I.style.display=t?`none`:``,be.forEach((e,t)=>e.classList.toggle(`is-active`,t===n));let r=(n/_e*100).toFixed(1)+`%`;N.style.setProperty(`--ctx-fill`,r)}function Ce(e){!e||!e.moved||!L||(L.callbacks.onPreview?.(e.originTokens),e.originTokens>0?Se(e.originTokens,!1):Se(u(L.optionEl.dataset.value),!0))}function we(){let e=L.anchorBtn.getBoundingClientRect(),t=M.getBoundingClientRect(),n=e.right-t.width;n=Math.max(8,Math.min(n,window.innerWidth-t.width-8));let r=e.bottom+6;if(r+t.height>window.innerHeight-8){let n=e.top-6-t.height;r=n>=8?n:Math.max(8,window.innerHeight-t.height-8)}M.style.left=`${Math.round(n)}px`,M.style.top=`${Math.round(r)}px`}function Te(e,t,n={}){if(!e||!t)return;if(L&&L.anchorBtn===e){R();return}R();let r=parseInt(t.dataset.contextWindow,10)||0;xe(),L={anchorBtn:e,optionEl:t,callbacks:n},M.querySelector(`.ctx-popover-title`).textContent=t.dataset.value||``,r>0?Se(r,!1):Se(u(t.dataset.value),!0),document.body.appendChild(M),we(),N.focus({preventScroll:!0}),L.onDocClick=t=>{M.contains(t.target)||e.contains(t.target)||R()},L.onKeyDown=e=>{e.key===`Escape`&&R()},L.onScroll=()=>R(),L.onResize=()=>R(),L.onDocPointerUp=()=>{if(!L?.drag)return;let e=L.drag;if(L.drag=null,!e.moved)return;let t=Number(N.value);t===e.originIndex&&L.callbacks.onCommit?.(ye(t))},L.onDocPointerCancel=()=>{if(!L?.drag)return;let e=L.drag;L.drag=null,Ce(e)},document.addEventListener(`click`,L.onDocClick,!0),document.addEventListener(`keydown`,L.onKeyDown),document.addEventListener(`scroll`,L.onScroll,!0),document.addEventListener(`pointerup`,L.onDocPointerUp,!0),document.addEventListener(`pointercancel`,L.onDocPointerCancel,!0),window.addEventListener(`resize`,L.onResize)}function R(){if(!L)return;let e=L;Ce(e.drag),L=null,document.removeEventListener(`click`,e.onDocClick,!0),document.removeEventListener(`keydown`,e.onKeyDown),document.removeEventListener(`scroll`,e.onScroll,!0),document.removeEventListener(`pointerup`,e.onDocPointerUp,!0),document.removeEventListener(`pointercancel`,e.onDocPointerCancel,!0),window.removeEventListener(`resize`,e.onResize),M?.remove(),M=null,N=null,P=null,F=null,I=null,be=[]}function Ee(e){return!!(M&&e&&M.contains(e))}var De=`deepseek-v4-pro`;function Oe(e){De=e}var ke=``;function Ae(e){ke=e}var je=`<svg width="14" height="14" viewBox="0 0 14 14" aria-hidden="true"><g stroke="currentColor" stroke-width="1.4" stroke-linecap="round" fill="none"><path d="M1.2 4h3.1M9.7 4h3.1M1.2 10h4.6M11.2 10h1.6"/><circle cx="7" cy="4" r="1.6"/><circle cx="8.5" cy="10" r="1.6"/></g></svg>`;function z(){let e=document.createElement(`button`);return e.type=`button`,e.className=`ctx-set-btn`,e.title=t(`settings.ctxSliderIconTitle`),e.setAttribute(`aria-label`,t(`settings.ctxSliderIconTitle`)),e.innerHTML=je,e}function Me(e,n){let r=e.querySelector(`.model-option-right`);if(!r)return;let i=Number(n)||0,a=r.querySelector(`.model-ctx-badge`);a||(a=document.createElement(`span`),a.className=`model-ctx-badge`,r.insertBefore(a,r.firstChild)),i>0?(a.classList.remove(`is-auto`),a.textContent=x(i),a.removeAttribute(`title`)):(a.classList.add(`is-auto`),a.textContent=x(u(e.dataset.value)),a.title=t(`settings.ctxBadgeAutoTip`))}function Ne(e){let t=document.createElement(`span`);t.className=`model-option-left`;let n=[];for(let t of[...e.childNodes])t.nodeType===Node.TEXT_NODE&&n.push(t);n.forEach(e=>{t.appendChild(e)}),e.insertBefore(t,e.firstChild)}function Pe(e,n){let r=document.getElementById(`modelDropdown`),i=r.querySelector(`.model-option[data-value="${e}"]`);if(i){if(n&&n>0){i.dataset.contextWindow=n,i.dataset.isCustom=`true`;let e=i.querySelector(`.model-option-left`);e||=(Ne(i),i.querySelector(`.model-option-left`));let r=i.querySelector(`.model-option-right`);if(!r){r=document.createElement(`span`),r.className=`model-option-right`;let e=i.querySelector(`:scope > .model-ctx-badge`);e&&r.appendChild(e),r.appendChild(z());let n=i.querySelector(`:scope > .delete-model-btn`);n||(n=document.createElement(`button`),n.type=`button`,n.className=`delete-model-btn`,n.title=t(`settings.deleteModel`),n.innerHTML=`×`),n.style.display=`inline-block`,r.appendChild(n),i.appendChild(r)}else if(!r.querySelector(`.ctx-set-btn`)){let e=r.querySelector(`.delete-model-btn`);e?r.insertBefore(z(),e):r.appendChild(z())}Me(i,n),Be()}return}Ie(r,Fe(e,n||0),e),Be()}function Fe(e,n=0){let r=document.createElement(`div`);r.className=`model-option`,r.dataset.value=e,(!D.includes(e)||n&&n>0)&&(r.dataset.isCustom=`true`),n&&n>0&&(r.dataset.contextWindow=n);let i=document.createElement(`span`);i.className=`model-option-left`,i.textContent=e,r.appendChild(i);let a=document.createElement(`span`);a.className=`model-option-right`,a.appendChild(z());let o=document.createElement(`button`);return o.type=`button`,o.className=`delete-model-btn`,o.title=t(`settings.deleteModel`),o.innerHTML=`×`,o.style.display=`inline-block`,a.appendChild(o),r.appendChild(a),Me(r,n||0),r}function Ie(e,t,n){let r=[...e.querySelectorAll(`.model-option`)].find(e=>b(e.dataset.value,n)>0);r?e.insertBefore(t,r):e.appendChild(t)}function Le(e,n){if(!e)return;let r=String(n||``).trim().toLowerCase(),i=0;e.querySelectorAll(`.model-option`).forEach(e=>{let t=!r||e.textContent.toLowerCase().includes(r);e.style.display=t?``:`none`,t&&(i+=1)});let a=e.querySelector(`.model-dropdown-empty`);r&&i===0?(a||(a=document.createElement(`div`),a.className=`model-dropdown-empty`,e.appendChild(a)),a.textContent=t(`settings.noMatch`)):a&&a.remove()}function Re(e){R();let t=document.getElementById(`modelDropdown`),n=t.querySelector(`.model-option[data-value="${e}"]`);if(n&&n.remove(),De===e){let e=t.querySelector(`.model-option`),n=e?e.dataset.value:``;Oe(n);let r=document.getElementById(`modelInput`);r&&(r.value=n),Ue(n)}Be()}function ze(){let e=document.getElementById(`modelDropdown`),t=[];return e?.querySelectorAll(`.model-option`).forEach(e=>{t.push({name:e.dataset.value,contextWindow:parseInt(e.dataset.contextWindow)||0})}),t}function Be(){let e=ze();chrome.storage.local.set({customModels:e},()=>{r.debug(`[Options] customModel list saved:`,e),p(e)})}function Ve(e){chrome.storage.local.get([`customModels`],t=>{He(ee(t.customModels)),typeof e==`function`&&e()})}function He(e,t){let n=document.getElementById(`modelDropdown`);if(!n)return;R(),n.innerHTML=``;let r=[...e||[]].sort((e,t)=>b(e?.name,t?.name));for(let e of r)n.appendChild(Fe(e.name,e.contextWindow||0));let i=t===void 0?De:t;n.querySelectorAll(`.model-option`).forEach(e=>{e.classList.toggle(`selected`,e.dataset.value===i)})}function Ue(e){document.querySelectorAll(`.model-option`).forEach(t=>{t.dataset.value===e?t.classList.add(`selected`):t.classList.remove(`selected`)}),We(`modelInput`,`modelSelectedCtxBadge`,`modelDropdown`)}function We(e,t,n){let r=document.getElementById(e),i=document.getElementById(t),a=document.getElementById(n);if(!i||!a)return;if(r&&!r.value){i.style.display=`none`;return}let o=a.querySelector(`.model-option.selected`)||(r?a.querySelector(`.model-option[data-value="${r.value}"]`):null);if(o){let e=parseInt(o.dataset.contextWindow);e>0?(i.textContent=x(e),i.style.display=``):i.style.display=`none`}else i.style.display=`none`}function Ge(e,t){if(!e||!e.querySelector(`.model-option-right`))return;let n=Number(t)||0,r=D.includes(e.dataset.value);n>0?(e.dataset.contextWindow=String(n),r&&(e.dataset.isCustom=`true`)):(delete e.dataset.contextWindow,r&&delete e.dataset.isCustom),Me(e,n)}function Ke(e,t){Ge(e,t),Be(),We(`modelInput`,`modelSelectedCtxBadge`,`modelDropdown`)}function qe(e,n){let r=document.getElementById(`imageModelDropdown`);if(!r)return;let i=r.querySelector(`.model-option[data-value="${e}"]`);if(i){if(n&&n>0){i.dataset.contextWindow=n;let e=i.querySelector(`.model-option-left`);e||=(Ne(i),i.querySelector(`.model-option-left`));let t=i.querySelector(`.model-option-right`);if(!t){t=document.createElement(`span`),t.className=`model-option-right`;let e=i.querySelector(`:scope > .model-ctx-badge`);e&&t.appendChild(e),t.appendChild(z());let n=i.querySelector(`:scope > .delete-model-btn`);n&&t.appendChild(n),i.appendChild(t)}else if(!t.querySelector(`.ctx-set-btn`)){let e=t.querySelector(`.delete-model-btn`);e?t.insertBefore(z(),e):t.appendChild(z())}Me(i,n),Ye()}return}let a=document.createElement(`div`);a.className=`model-option`,a.dataset.value=e,n&&n>0&&(a.dataset.contextWindow=n);let o=document.createElement(`span`);o.className=`model-option-left`,o.textContent=e,a.appendChild(o);let s=document.createElement(`span`);s.className=`model-option-right`,s.appendChild(z());let c=document.createElement(`button`);c.type=`button`,c.className=`delete-model-btn`,c.title=t(`settings.deleteModel`),c.innerHTML=`×`,c.style.display=`inline-block`,s.appendChild(c),a.appendChild(s),Me(a,n||0),Ie(r,a,e),Ye()}function Je(e){R();let t=document.getElementById(`imageModelDropdown`);if(!t)return;let n=t.querySelector(`.model-option[data-value="${e}"]`);if(n&&n.remove(),ke===e){let e=t.querySelector(`.model-option`),n=e?e.dataset.value:``;Ae(n);let r=document.getElementById(`imageModelInput`);r&&(r.value=n),Qe(n)}Ye()}function Ye(){let e=document.getElementById(`imageModelDropdown`);if(!e)return;let t=[];e.querySelectorAll(`.model-option`).forEach(e=>{t.push({name:e.dataset.value,contextWindow:parseInt(e.dataset.contextWindow)||0})}),chrome.storage.local.set({imageModels:t},()=>{r.debug(`[Options] image recognitionmodel saved:`,t)})}function Xe(e,t){Ge(e,t),Ye(),We(`imageModelInput`,`imageModelSelectedCtxBadge`,`imageModelDropdown`)}function Ze(e){chrome.storage.local.get([`imageModels`],n=>{let i=document.getElementById(`imageModelDropdown`);if(!i){typeof e==`function`&&e();return}let a=n.imageModels||[],o=!1;R(),i.innerHTML=``;let s=e=>typeof e==`string`?e:e&&e.name||``;[...a].sort((e,t)=>b(s(e),s(t))).forEach(e=>{let n,r=0;if(typeof e==`string`)n=e,o=!0;else if(e&&typeof e==`object`&&e.name)n=e.name,r=e.contextWindow||0;else return;let a=document.createElement(`div`);a.className=`model-option`,a.dataset.value=n,r&&r>0&&(a.dataset.contextWindow=r);let s=document.createElement(`span`);s.className=`model-option-left`,s.textContent=n,a.appendChild(s);let c=document.createElement(`span`);c.className=`model-option-right`,c.appendChild(z());let l=document.createElement(`button`);l.type=`button`,l.className=`delete-model-btn`,l.title=t(`settings.deleteModel`),l.innerHTML=`×`,l.style.display=`inline-block`,c.appendChild(l),a.appendChild(c),Me(a,r||0),i.appendChild(a)}),o&&(Ye(),r.debug(`[Options] image recognitionmodelauto-migratedisnewformat`)),typeof e==`function`&&e()})}function Qe(e){let t=document.getElementById(`imageModelDropdown`);t&&(t.querySelectorAll(`.model-option`).forEach(t=>{t.dataset.value===e?t.classList.add(`selected`):t.classList.remove(`selected`)}),We(`imageModelInput`,`imageModelSelectedCtxBadge`,`imageModelDropdown`))}var B=[];function $e(e,n,r){let i=document.createElement(`div`);i.className=`model-option`,i.dataset.value=e,n&&(i.dataset.label=n),r&&(i.dataset.isCustom=`true`);let a=document.createElement(`span`);a.className=`model-option-left`,a.textContent=n||e,i.appendChild(a);let o=document.createElement(`span`);if(o.className=`model-option-right`,n){let t=document.createElement(`span`);t.className=`api-base-url-hint`,t.textContent=e.length>50?e.substring(0,47)+`...`:e,o.appendChild(t)}let s=document.createElement(`button`);return s.type=`button`,s.className=`delete-model-btn`,s.title=t(`settings.deleteApiBase`),s.innerHTML=`×`,s.style.display=`inline-block`,o.appendChild(s),i.appendChild(o),i}function et(e,t){let n=document.getElementById(`apiBaseDropdown`);if(!n)return;let r=n.querySelector(`.model-option[data-value="${CSS.escape(e)}"]`);if(r){if(t){r.dataset.label=t;let e=r.querySelector(`.model-option-left`);e&&(e.textContent=t)}nt();return}O.includes(e)&&B.includes(e)&&(B=B.filter(t=>t!==e));let i=$e(e,t,!O.includes(e));n.appendChild(i),nt()}function tt(e){let t=document.getElementById(`apiBaseDropdown`);if(!t)return;let n=t.querySelector(`.model-option[data-value="${CSS.escape(e)}"]`);n&&n.remove(),O.includes(e)&&!B.includes(e)&&B.push(e);let r=document.getElementById(`apiBase`);r&&r.value.trim()===e&&(r.value=``),nt()}function nt(){let e=document.getElementById(`apiBaseDropdown`);if(!e)return;let t=[];e.querySelectorAll(`.model-option[data-is-custom="true"]`).forEach(e=>{t.push({url:e.dataset.value,label:e.dataset.label||``})}),chrome.storage.local.set({customApiBases:t,deletedPresetApiBases:B},()=>{r.debug(`[Options] API Base URL column table saved:`,t,`deletedpreset:`,B)})}function rt(e){chrome.storage.local.get([`customApiBases`,`deletedPresetApiBases`],t=>{let n=document.getElementById(`apiBaseDropdown`);if(!n){typeof e==`function`&&e();return}B=t.deletedPresetApiBases||[];let r=t.customApiBases||[];n.innerHTML=``,O.forEach(e=>{if(!B.includes(e)){let t=$e(e,null,!1);n.appendChild(t)}}),r.forEach(e=>{if(typeof e==`string`){if(!O.includes(e)){let t=$e(e,null,!0);n.appendChild(t)}}else if(e&&e.url){let t=$e(e.url,e.label||null,!0);n.appendChild(t)}}),typeof e==`function`&&e()})}function it(e){let t=document.getElementById(`apiBaseDropdown`);t&&t.querySelectorAll(`.model-option`).forEach(t=>{t.dataset.value===e?t.classList.add(`selected`):t.classList.remove(`selected`)})}var V=[];function at(e,n,r){let i=document.createElement(`div`);i.className=`model-option`,i.dataset.value=e,n&&(i.dataset.label=n),r&&(i.dataset.isCustom=`true`);let a=document.createElement(`span`);a.className=`model-option-left`,a.textContent=n||e,i.appendChild(a);let o=document.createElement(`span`);if(o.className=`model-option-right`,n){let t=document.createElement(`span`);t.className=`api-base-url-hint`,t.textContent=e.length>50?e.substring(0,47)+`...`:e,o.appendChild(t)}let s=document.createElement(`button`);return s.type=`button`,s.className=`delete-model-btn`,s.title=t(`settings.deleteApiBase`),s.innerHTML=`×`,s.style.display=`inline-block`,o.appendChild(s),i.appendChild(o),i}function ot(e,t){let n=document.getElementById(`imageApiBaseDropdown`);if(!n)return;let r=n.querySelector(`.model-option[data-value="${CSS.escape(e)}"]`);if(r){if(t){r.dataset.label=t;let e=r.querySelector(`.model-option-left`);e&&(e.textContent=t)}ct();return}O.includes(e)&&V.includes(e)&&(V=V.filter(t=>t!==e));let i=at(e,t,!O.includes(e));n.appendChild(i),ct()}function st(e){let t=document.getElementById(`imageApiBaseDropdown`);if(!t)return;let n=t.querySelector(`.model-option[data-value="${CSS.escape(e)}"]`);n&&n.remove(),O.includes(e)&&!V.includes(e)&&V.push(e);let r=document.getElementById(`imageApiBase`);r&&r.value.trim()===e&&(r.value=``),ct()}function ct(){let e=document.getElementById(`imageApiBaseDropdown`);if(!e)return;let t=[];e.querySelectorAll(`.model-option[data-is-custom="true"]`).forEach(e=>{t.push({url:e.dataset.value,label:e.dataset.label||``})}),chrome.storage.local.set({customImageApiBases:t,deletedPresetImageApiBases:V},()=>{r.debug(`[Options] image API Base URL column table saved:`,t)})}function lt(e){chrome.storage.local.get([`customImageApiBases`,`deletedPresetImageApiBases`],t=>{let n=document.getElementById(`imageApiBaseDropdown`);if(!n){typeof e==`function`&&e();return}V=t.deletedPresetImageApiBases||[];let r=t.customImageApiBases||[];n.innerHTML=``,O.forEach(e=>{if(!V.includes(e)){let t=at(e,null,!1);n.appendChild(t)}}),r.forEach(e=>{if(typeof e==`string`){if(!O.includes(e)){let t=at(e,null,!0);n.appendChild(t)}}else if(e&&e.url){let t=at(e.url,e.label||null,!0);n.appendChild(t)}}),typeof e==`function`&&e()})}function ut(e){let t=document.getElementById(`imageApiBaseDropdown`);t&&t.querySelectorAll(`.model-option`).forEach(t=>{t.dataset.value===e?t.classList.add(`selected`):t.classList.remove(`selected`)})}function dt(){chrome.storage.local.get(`apiBase.apiKey.modelName.customModels.systemPrompt.enableImageInput.imageModelName.imageModels.imageApiBase.imageApiKey.enableFileInput.reactMaxIterations.reactApiTimeout.reactLoopTimeout.reactToolTimeout.toolConfirmationEnabled.networkAccessEnabled.enableExecutionLog.reflectionConfig.completionVerificationConfig.streamEnabled.streamExpandTools.completionSoundEnabled.completionConfettiEnabled.completionNotificationEnabled.scheduledNotificationEnabled.interactionNotificationEnabled.showMessageTimestamp.sidePanelScope.autoGroupTabs`.split(`.`),function(e){e.apiBase&&(document.getElementById(`apiBase`).value=e.apiBase),e.apiKey&&(document.getElementById(`apiKey`).value=h(e.apiKey)),e.modelName&&(Oe(e.modelName),document.getElementById(`modelInput`).value=e.modelName),e.systemPrompt&&(document.getElementById(`systemPrompt`).value=e.systemPrompt);let n=document.getElementById(`enableImageInput`),r=document.getElementById(`imageModelGroup`),i=document.getElementById(`imageApiGroup`),a=document.getElementById(`imageApiKeyGroup`);if(n&&r&&(n.checked=e.enableImageInput||!1,r.style.display=n.checked?``:`none`,i&&(i.style.display=n.checked?``:`none`),a&&(a.style.display=n.checked?``:`none`)),e.imageModelName){Ae(e.imageModelName);let t=document.getElementById(`imageModelInput`);t&&(t.value=e.imageModelName)}e.imageApiBase&&(document.getElementById(`imageApiBase`).value=e.imageApiBase),e.imageApiKey&&(document.getElementById(`imageApiKey`).value=h(e.imageApiKey)),document.getElementById(`reactMaxIterations`).value=e.reactMaxIterations||k.maxIterations,document.getElementById(`reactApiTimeout`).value=Math.round((e.reactApiTimeout||k.apiTimeout)/6e4),document.getElementById(`reactLoopTimeout`).value=Math.round((e.reactLoopTimeout||k.loopTimeout)/6e4),document.getElementById(`reactToolTimeout`).value=Math.round((e.reactToolTimeout||k.toolTimeout)/6e4);let o=document.getElementById(`enableToolPreselect`);o&&(o.checked=e.enableToolPreselect===void 0?k.enableToolPreselect:e.enableToolPreselect),document.getElementById(`toolConfirmationEnabled`).checked=e.toolConfirmationEnabled===void 0?k.toolConfirmationEnabled:e.toolConfirmationEnabled,document.getElementById(`toolConfirmationEnabled`).dispatchEvent(new Event(`change`)),document.getElementById(`networkAccessEnabled`).checked=e.networkAccessEnabled===!0,document.getElementById(`networkAccessEnabled`).dispatchEvent(new Event(`change`));let s=document.getElementById(`completionVerificationEnabled`);s&&(s.checked=!!(e.completionVerificationConfig&&e.completionVerificationConfig.enabled===!0),s.dispatchEvent(new Event(`change`)));let c=document.getElementById(`completionVerificationRerunEnabled`);c&&(c.checked=!!(e.completionVerificationConfig&&e.completionVerificationConfig.rerunEnabled===!0),c.dispatchEvent(new Event(`change`))),document.getElementById(`enableExecutionLog`).checked=e.enableExecutionLog===void 0?A.enableExecutionLog:e.enableExecutionLog,document.getElementById(`enableExecutionLog`).dispatchEvent(new Event(`change`));let u=e.reflectionConfig||l;document.getElementById(`reflectionEnabled`).checked=u.enabled!==!1,document.getElementById(`postReflectionEnabled`).checked=u.postReflection?.enabled!==!1,document.getElementById(`subtaskReflectionEnabled`).checked=u.subtaskReflection?.enabled===!0,document.getElementById(`streamEnabled`).checked=e.streamEnabled===void 0?!0:e.streamEnabled;let d=document.getElementById(`streamExpandTools`),f=document.getElementById(`streamExpandToolsLabel`),p=document.getElementById(`streamExpandToolsWrap`);d&&(d.checked=e.streamExpandTools===!0),f&&(f.textContent=d?.checked?t(`common.enabled`):t(`common.disabled`)),p&&(p.style.display=e.streamEnabled===void 0||e.streamEnabled?`block`:`none`);function m(){let e=document.getElementById(`reflectionEnabled`),n=!!(e&&e.checked);document.querySelectorAll(`.reflection-sub`).forEach(e=>{e.style.display=n?`block`:`none`});let r=document.getElementById(`reflectionToggleLabel`);r&&(r.textContent=t(n?`common.enabled`:`common.disabled`));let i=document.getElementById(`postReflectionEnabled`),a=document.getElementById(`postReflectionLabel`);a&&(a.textContent=i&&i.checked?t(`common.enabled`):t(`common.disabled`));let o=document.getElementById(`subtaskReflectionEnabled`),s=document.getElementById(`subtaskReflectionLabel`);s&&(s.textContent=o&&o.checked?t(`common.enabled`):t(`common.disabled`))}let g=document.getElementById(`completionSoundEnabled`),_=document.getElementById(`completionConfettiEnabled`);g&&(g.checked=e.completionSoundEnabled!==!1),_&&(_.checked=e.completionConfettiEnabled!==!1);let v=document.getElementById(`completionNotificationEnabled`),y=document.getElementById(`scheduledNotificationEnabled`),b=document.getElementById(`interactionNotificationEnabled`);v&&(v.checked=e.completionNotificationEnabled!==!1),y&&(y.checked=e.scheduledNotificationEnabled!==!1),b&&(b.checked=e.interactionNotificationEnabled!==!1);let x=document.getElementById(`showMessageTimestamp`);x&&(x.checked=e.showMessageTimestamp!==!1);let ee=e.sidePanelScope===`tab-specific`?`tab-specific`:`global`,te=document.querySelectorAll(`input[name="sidePanelScope"]`);te.forEach(e=>{e.checked=e.value===ee}),te.forEach(e=>{e.dataset.scopeListenerBound||(e.dataset.scopeListenerBound=`1`,e.addEventListener(`change`,()=>{e.checked&&(chrome.storage.local.set({sidePanelScope:e.value}),ne())}))});let S=document.getElementById(`autoGroupTabs`);S&&(S.checked=e.autoGroupTabs!==!1);function ne(){S&&(S.disabled=(document.querySelector(`input[name="sidePanelScope"]:checked`)?.value||`global`)!==`tab-specific`)}ne(),S&&!S.dataset.groupListenerBound&&(S.dataset.groupListenerBound=`1`,S.addEventListener(`change`,()=>{chrome.storage.local.set({autoGroupTabs:S.checked})})),Ve(()=>{e.modelName&&Ue(e.modelName),m()}),Ze(()=>{e.imageModelName&&Qe(e.imageModelName)}),rt(()=>{e.apiBase&&it(e.apiBase)}),lt(()=>{e.imageApiBase&&ut(e.imageApiBase)})})}function ft(){let e=document.getElementById(`apiBase`).value.trim(),n=document.getElementById(`apiKey`).value.trim(),r=document.getElementById(`systemPrompt`).value.trim(),i=parseInt(document.getElementById(`reactMaxIterations`).value)||k.maxIterations,a=(parseInt(document.getElementById(`reactApiTimeout`).value)||5)*6e4,o=(parseInt(document.getElementById(`reactLoopTimeout`).value)||5)*6e4,s=(parseInt(document.getElementById(`reactToolTimeout`).value)||5)*6e4,c=document.getElementById(`toolConfirmationEnabled`).checked,u=document.getElementById(`networkAccessEnabled`).checked,d=document.getElementById(`enableExecutionLog`).checked,f=document.getElementById(`streamEnabled`)?.checked!==!1,p=document.getElementById(`streamExpandTools`)?.checked===!0,m=document.getElementById(`completionSoundEnabled`)?.checked!==!1,h=document.getElementById(`completionConfettiEnabled`)?.checked!==!1,g=document.getElementById(`completionNotificationEnabled`)?.checked!==!1,_=document.getElementById(`scheduledNotificationEnabled`)?.checked!==!1,v=document.getElementById(`interactionNotificationEnabled`)?.checked!==!1,y=document.getElementById(`showMessageTimestamp`)?.checked!==!1,b=document.getElementById(`enableImageInput`)?.checked||!1,x=ke||``,ee=document.getElementById(`imageApiBase`)?.value.trim()||``,te=document.getElementById(`imageApiKey`)?.value.trim()||``,S={enabled:document.getElementById(`reflectionEnabled`).checked,postReflection:{...l.postReflection,enabled:document.getElementById(`postReflectionEnabled`).checked},subtaskReflection:{...l.subtaskReflection,enabled:document.getElementById(`subtaskReflectionEnabled`).checked}};if(i<10||i>1e3){H(`❌ ${t(`settings.maxIterationsRangeError`)}`,`error`);return}if(a<6e4||a>6e5){H(`❌ ${t(`settings.apiTimeoutRangeError`)}`,`error`);return}if(o<6e4||o>72e5){H(`❌ ${t(`settings.loopTimeoutRangeError`)}`,`error`);return}if(s<6e4||s>18e5){H(`❌ ${t(`settings.toolTimeoutRangeError`)}`,`error`);return}if(e||=`https://api.deepseek.com`,!n){H(`❌ ${t(`settings.apiKeyEmpty`)}`,`error`);return}chrome.storage.local.set({apiBase:e,apiKey:ae(n),modelName:De||`deepseek-v4-pro`,systemPrompt:r,reactMaxIterations:i,reactApiTimeout:a,reactLoopTimeout:o,reactToolTimeout:s,toolConfirmationEnabled:c,networkAccessEnabled:u,enableExecutionLog:d,enableImageInput:b,imageModelName:x,imageApiBase:ee,imageApiKey:ae(te),reflectionConfig:S,streamEnabled:f,streamExpandTools:p,completionSoundEnabled:m,completionConfettiEnabled:h,completionNotificationEnabled:g,scheduledNotificationEnabled:_,interactionNotificationEnabled:v,showMessageTimestamp:y,sidePanelScope:document.querySelector(`input[name="sidePanelScope"]:checked`)?.value||`global`,autoGroupTabs:document.getElementById(`autoGroupTabs`)?.checked!==!1},async function(){if(chrome.runtime.lastError)H(`❌ ${t(`settings.saveFailed`,{message:chrome.runtime.lastError.message})}`,`error`);else{ie({apiBase:e,apiKey:n,modelName:De||`deepseek-v4-pro`,models:ze()}),H(`✅ ${t(`settings.saveSuccess`)}`,`success`);let r=document.getElementById(`status`);r.style.display=`none`;let i=document.getElementById(`saveBtn`);i&&(i.classList.add(`saved`),setTimeout(()=>i.classList.remove(`saved`),1500));let a=await chrome.storage.local.get([`pairedAgents`,`activeAgentId`]),o=null,s=(a.pairedAgents||[]).find(e=>e.id===a.activeAgentId);if(s){o={url:s.url,connected:!0,name:s.name};try{let e=await fetch(`${s.url}/api/status/detail`,{headers:{Authorization:`Bearer ${s.token}`}});if(e.ok){let t=await e.json();o.workdir=t.workdir}}catch{}}}})}function H(e,t=`info`,n=3e3){let r=document.getElementById(`toastContainer`);if(!r)return;let i=document.createElement(`div`);i.className=`toast ${t}`,i.textContent=e,r.appendChild(i),requestAnimationFrame(()=>{i.classList.add(`toast-show`)}),setTimeout(()=>{i.classList.remove(`toast-show`),setTimeout(()=>{i.parentNode&&i.parentNode.removeChild(i)},300)},n)}function pt(e){if(!e||typeof e!=`object`)return[];let t=Array.isArray(e.data)?e.data:Array.isArray(e.models)?e.models:null;if(!t)return[];let n=new Set,r=[];for(let e of t){let t=``;if(typeof e==`string`)t=e;else if(e&&typeof e==`object`){let n=e.id||e.name||e.model;typeof n==`string`&&(t=n)}t=(t||``).trim(),!(!t||n.has(t))&&(n.add(t),r.push(t))}return r}var mt=class extends Error{constructor(e,{status:t,reason:n}={}){super(e),this.name=`FetchModelsError`,this.status=t,this.reason=n}};function ht(e){return`${String(e).trim().replace(/\/+$/,``)}/models`}function gt(e){return/anthropic\.com/i.test(String(e||``))}async function _t({apiBase:e,apiKey:t,timeoutMs:n=15e3}={}){let r=(e||``).trim(),i=(t||``).trim();if(!r||!i)throw new mt(`missing apiBase or apiKey`,{reason:`invalid-config`});let a={Authorization:`Bearer ${i}`};gt(r)&&(a[`x-api-key`]=i,a[`anthropic-version`]=`2023-06-01`);let o=new AbortController,s=setTimeout(()=>o.abort(),n),c;try{c=await fetch(ht(r),{method:`GET`,headers:a,signal:o.signal})}catch(e){throw clearTimeout(s),e&&e.name===`AbortError`?new mt(`request timeout`,{reason:`timeout`}):new mt(e&&e.message||`network error`,{reason:`network`})}if(clearTimeout(s),!c.ok)throw new mt(`HTTP ${c.status}`,{status:c.status,reason:`http`});let l;try{l=await c.json()}catch{throw new mt(`invalid JSON`,{reason:`parse`})}let u=pt(l);if(!u.length)throw new mt(`no models parsed`,{reason:`parse`});return u}var vt=-1;function yt(){return new Promise(e=>{chrome.storage.local.get([`toolbarTools`,`toolbarIconOnly`,`enableSelectionToolbar`],t=>{let n=t.toolbarTools&&t.toolbarTools.length>0?t.toolbarTools:[...de],r=t.toolbarIconOnly===void 0?!1:t.toolbarIconOnly,i=t.enableSelectionToolbar===void 0?!0:t.enableSelectionToolbar,a=new Map(de.map(e=>[e.id,e])),o=n.map(e=>{if(e.builtin&&a.has(e.id)){let t=pe(e.id),n=he(e.id);return{...e,systemPrompt:n||a.get(e.id).systemPrompt,name:t||e.name}}return e}),s=document.getElementById(`toolbarIconOnly`);s&&(s.checked=r);let c=document.getElementById(`enableSelectionToolbar`);c&&(c.checked=i),e(o)})})}function bt(e){let n=document.getElementById(`toolbarToolsList`);if(!n)return;let r=[...e].filter(e=>e.id!==`ai-search`&&e.id!==`copy`).sort((e,t)=>e.order-t.order);n.innerHTML=r.map((e,n)=>{let i=e.builtin,a=i&&pe(e.id)||e.name,o=i?`<span class="tool-badge builtin">${t(`toolbar.builtinBadge`)}</span>`:`<span class="tool-badge custom">${t(`toolbar.customBadge`)}</span>`,s=e.systemPrompt?`<div class="tool-prompt-preview" title="${U(e.systemPrompt)}">${U(e.systemPrompt)}</div>`:``,c=n===0,l=n===r.length-1,u=``;return i||(u+=`<button class="tool-action-btn" data-action="edit" data-index="${n}">${t(`common.edit`)}</button>`,u+=`<button class="tool-action-btn danger" data-action="delete" data-index="${n}">${t(`common.delete`)}</button>`),`
|
|
29
29
|
<div class="tool-item" data-tool-id="${e.id}" draggable="true" data-sorted-index="${n}">
|
|
30
30
|
<div class="tool-drag-handle" title="${t(`toolbar.dragSort`)}">⋮⋮</div>
|
|
31
31
|
<div class="tool-order-btns">
|
|
@@ -33,21 +33,28 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
33
33
|
<button class="tool-order-btn" data-action="moveDown" data-index="${n}" ${l?`disabled`:``} title="${t(`toolbar.moveDown`)}">▼</button>
|
|
34
34
|
</div>
|
|
35
35
|
<div class="tool-info">
|
|
36
|
-
<div class="tool-name">${
|
|
36
|
+
<div class="tool-name">${U(a)}${o}</div>
|
|
37
37
|
${s}
|
|
38
38
|
</div>
|
|
39
39
|
<div class="tool-actions">
|
|
40
40
|
${u}
|
|
41
41
|
</div>
|
|
42
42
|
</div>
|
|
43
|
-
`}).join(``),
|
|
43
|
+
`}).join(``),xt()}function xt(){let e=document.getElementById(`toolbarToolsList`);if(!e)return;let t=e.querySelectorAll(`.tool-item`);t.forEach(e=>{e.addEventListener(`dragstart`,t=>{e.classList.add(`dragging`),t.dataTransfer.effectAllowed=`move`,t.dataTransfer.setData(`text/plain`,e.dataset.sortedIndex)}),e.addEventListener(`dragend`,()=>{e.classList.remove(`dragging`),t.forEach(e=>e.classList.remove(`drag-over`))}),e.addEventListener(`dragover`,t=>{t.preventDefault(),t.dataTransfer.dropEffect=`move`,e.classList.add(`drag-over`)}),e.addEventListener(`dragleave`,()=>{e.classList.remove(`drag-over`)}),e.addEventListener(`drop`,t=>{t.stopPropagation(),t.preventDefault();let n=parseInt(t.dataTransfer.getData(`text/plain`)),r=parseInt(e.dataset.sortedIndex);isNaN(n)||isNaN(r)||n===r||(chrome.storage.local.get([`toolbarTools`],e=>{let t=e.toolbarTools&&e.toolbarTools.length>0?e.toolbarTools:[...de],i=[...t].filter(e=>e.id!==`ai-search`&&e.id!==`copy`).sort((e,t)=>e.order-t.order);if(n>=i.length||r>=i.length)return;let a=i[n].order;i[n].order=i[r].order,i[r].order=a;let o=t.filter(e=>e.id===`ai-search`||e.id===`copy`),s=[...i,...o];chrome.storage.local.set({toolbarTools:s},()=>{bt(s)})}),e.classList.remove(`drag-over`))})})}function St(){let e=document.getElementById(`toolbarIconOnly`)?.checked||!1,t=document.getElementById(`enableSelectionToolbar`)?.checked!==!1;chrome.storage.local.get([`toolbarTools`],n=>{let i=n.toolbarTools||[...de];chrome.storage.local.set({toolbarTools:i,toolbarIconOnly:e,enableSelectionToolbar:t},()=>{r.debug(`[Options] toolbarconfiguration saved`)})})}function Ct(e,t,n){let r=e.filter(e=>e.id===`ai-search`||e.id===`copy`),i=[...e].filter(e=>e.id!==`ai-search`&&e.id!==`copy`).sort((e,t)=>e.order-t.order),a=t+n;if(a<0||a>=i.length)return e;let o=i[t].order;return i[t].order=i[a].order,i[a].order=o,[...i,...r]}function wt(e,t){let n=e.filter(e=>e.id===`ai-search`||e.id===`copy`),i=[...e].filter(e=>e.id!==`ai-search`&&e.id!==`copy`).sort((e,t)=>e.order-t.order);return i[t].builtin?(r.warn(`[Options] cannot deletebuilt-in tool`),e):(i.splice(t,1),[...i,...n])}function Tt(e,n=-1){vt=n;let r=document.getElementById(`toolEditModal`),i=document.getElementById(`toolEditModalTitle`),a=document.getElementById(`toolEditName`),o=document.getElementById(`toolEditPrompt`);if(n>=0){let r=[...e].filter(e=>e.id!==`ai-search`&&e.id!==`copy`).sort((e,t)=>e.order-t.order)[n];i.textContent=t(`toolbar.editCustomToolTitle`),a.value=r.name,o.value=r.systemPrompt||``}else i.textContent=t(`toolbar.toolEditModalTitle`),a.value=``,o.value=``;r.style.display=`flex`}function Et(){document.getElementById(`toolEditModal`).style.display=`none`,vt=-1}function Dt(e){let n=document.getElementById(`toolEditName`).value.trim(),r=document.getElementById(`toolEditPrompt`).value.trim();if(!n)return{error:t(`toolbar.toolNameEmpty`)};if(!r)return{error:t(`toolbar.toolPromptEmpty`)};let i=[...e].sort((e,t)=>e.order-t.order);if(vt>=0){let e=i.filter(e=>e.id!==`ai-search`&&e.id!==`copy`)[vt];if(!e)return{error:t(`toolbar.toolNotFound`)};if(e.builtin)return{error:t(`toolbar.cannotEditBuiltin`)};e.name=n,e.systemPrompt=r}else{let e=i.length>0?Math.max(...i.map(e=>e.order)):0;i.push({id:`custom_`+Date.now(),name:n,systemPrompt:r,builtin:!1,order:e+1})}return Et(),e.filter(e=>e.id===`ai-search`||e.id===`copy`).forEach(e=>{i.find(t=>t.id===e.id)||i.push(e)}),{tools:i}}function U(e){let t=document.createElement(`div`);return t.textContent=e,t.innerHTML}function Ot(){chrome.storage.local.get([`blockedDomains`],e=>{kt(e.blockedDomains||[])})}function kt(e){let n=document.getElementById(`domainBlocklistList`);n&&(e.length===0?n.innerHTML=`<div class="domain-blocklist-empty">${t(`toolbar.noBlockedDomains`)}</div>`:n.innerHTML=e.map(e=>`
|
|
44
44
|
<div class="domain-blocklist-item">
|
|
45
|
-
<span class="domain-blocklist-item-name" title="${
|
|
46
|
-
<button class="domain-blocklist-item-remove" data-domain="${
|
|
45
|
+
<span class="domain-blocklist-item-name" title="${U(e)}">${U(e)}</span>
|
|
46
|
+
<button class="domain-blocklist-item-remove" data-domain="${U(e)}" title="${t(`toolbar.unblock`)}">
|
|
47
47
|
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 6 6 18"/><path d="m6 6 12 12"/></svg>
|
|
48
48
|
</button>
|
|
49
49
|
</div>
|
|
50
|
-
`).join(``))}function Tt(e,n){if(e=e.trim().toLowerCase(),!e){n&&n({error:t(`toolbar.domainEmpty`)});return}if(!e.includes(`.`)){n&&n({error:t(`toolbar.domainInvalid`)});return}chrome.storage.local.get([`blockedDomains`],r=>{let i=r.blockedDomains||[];if(i.includes(e)){n&&n({error:t(`toolbar.domainExists`)});return}i.push(e),chrome.storage.local.set({blockedDomains:i},()=>{wt(i),n&&n({})})})}function Et(e){chrome.storage.local.get([`blockedDomains`],t=>{let n=(t.blockedDomains||[]).filter(t=>t!==e);chrome.storage.local.set({blockedDomains:n},()=>{wt(n)})})}var Dt=`apiBase.modelName.customModels.systemPrompt.enableImageInput.imageModelName.imageModels.imageApiBase.reactMaxIterations.reactApiTimeout.reactLoopTimeout.reactToolTimeout.enableToolPreselect.toolConfirmationEnabled.reflectionConfig.enableExecutionLog.toolbarTools.toolbarIconOnly.enableSelectionToolbar.blockedDomains.streamEnabled.streamExpandTools.completionSoundEnabled.completionConfettiEnabled.completionNotificationEnabled.scheduledNotificationEnabled.interactionNotificationEnabled.showMessageTimestamp.sidePanelScope.autoGroupTabs.customAgents.activeAgentId.activeAssistantId.temperature.topP.selectedTempIndex.customPrompts.pairedAgents.agentStreamEnabled.enableTools.isolateChat.enableSelectionQuery.deletedPresetModels.modelProfiles.activeProfileId.mcpEnabled.skillsEnabled.ragEnabled`.split(`.`),Ot=[`apiKey`,`imageApiKey`,`agentToken`];function kt(e){for(let t of[`apiKey`,`imageApiKey`])e[t]&&(e[t]=ae(h(e[t])));Array.isArray(e.modelProfiles)&&(e.modelProfiles=e.modelProfiles.map(e=>e.apiKey?{...e,apiKey:ae(h(e.apiKey))}:e)),Array.isArray(e.pairedAgents)&&(e.pairedAgents=e.pairedAgents.map(e=>e.token?{...e,token:ae(h(e.token))}:e))}function At(e){let t=e&&e.reflectionConfig;if(t&&typeof t==`object`&&`toolReflection`in t){let n={...t};delete n.toolReflection,e.reflectionConfig=n}}async function jt(e){let t=e?[...Dt,...Ot]:Dt;return new Promise(n=>{chrome.storage.local.get(null,r=>{let i={};for(let e of t)r[e]!==void 0&&(i[e]=r[e]);for(let e of Object.keys(r))(e.startsWith(`agentEnabledTools_`)||e.startsWith(`agentMcpClosedServers_`))&&(i[e]=r[e]);!e&&i.pairedAgents&&(i.pairedAgents=i.pairedAgents.map(e=>({...e,token:``}))),!e&&Array.isArray(i.modelProfiles)&&(i.modelProfiles=v(i.modelProfiles)),At(i),n(i)})})}async function Mt(){let e=document.getElementById(`exportIncludeSecrets`)?.checked||!1;try{let n=await jt(e),r={version:1,app:`ai-helper`,exportedAt:new Date().toISOString(),includeSecrets:e,config:n},i=new Date,a=`ai-helper-config-${i.getFullYear()+String(i.getMonth()+1).padStart(2,`0`)+String(i.getDate()).padStart(2,`0`)+`-`+String(i.getHours()).padStart(2,`0`)+String(i.getMinutes()).padStart(2,`0`)+String(i.getSeconds()).padStart(2,`0`)}.json`,o=JSON.stringify(r,null,2),s=new Blob([o],{type:`application/json;charset=utf-8;`}),c=URL.createObjectURL(s),l=document.createElement(`a`);l.href=c,l.download=a,document.body.appendChild(l),l.click(),document.body.removeChild(l),URL.revokeObjectURL(c),Pt(),Ht(t(`configDialog.exportSuccess`),`success`)}catch(e){r.error(`[Options] exportconfiguration failed:`,e),Ht(t(`configDialog.exportFailed`,{error:e.message}),`error`)}}function Nt(){let e=document.getElementById(`exportConfigModal`);e&&(e.style.display=`flex`)}function Pt(){let e=document.getElementById(`exportConfigModal`);e&&(e.style.display=`none`)}function Ft(e){let n=e.config||e,r=Object.keys(n).length,i=e.exportedAt?new Date(e.exportedAt).toLocaleString(o()===`zh`?`zh-CN`:`en-US`):t(`configDialog.unknownTime`),a=document.getElementById(`importSummary`);a&&(a.textContent=t(`configDialog.importSummary`,{time:i,count:r}));let s=document.getElementById(`importConfigModal`);s&&(s.dataset.importData=JSON.stringify(e),s.style.display=`flex`)}function It(){let e=document.getElementById(`importConfigModal`);e&&(e.style.display=`none`)}function Lt(){let e=document.getElementById(`importConfigFile`);e&&(e.value=``,e.click())}function Rt(e){if(!e||typeof e!=`object`)return{valid:!1,error:t(`configDialog.invalidFileFormat`)};let n;if(e.version&&e.config&&typeof e.config==`object`)n=e.config;else if(e.apiBase||e.modelName!==void 0)n=e;else return{valid:!1,error:t(`configDialog.unrecognizedFormat`)};for(let e of Object.keys(n))if(!Dt.includes(e)&&!Ot.includes(e)&&!e.startsWith(`agentEnabledTools_`)&&!e.startsWith(`agentMcpClosedServers_`))return{valid:!1,error:t(`configDialog.unknownConfigKey`,{key:e})};return{valid:!0}}async function zt(e){try{let n=await e.text(),r=JSON.parse(n),i=Rt(r);if(!i.valid){Ht(t(`configDialog.importFailed`,{error:i.error}),`error`);return}Ft(r)}catch(e){r.error(`[Options] import fileparse failed:`,e),Ht(t(`configDialog.importParseFailed`),`error`)}}async function Bt(){let e=document.getElementById(`importConfigModal`);if(!e)return;let n=e.dataset.importData;if(n)try{let e=JSON.parse(n),r=e.config||e;if(At(r),(document.getElementById(`importStrategyReplace`)?.checked?`replace`:`merge`)==`merge`&&Array.isArray(r.modelProfiles)){let e=await _();r.modelProfiles=C(e.profiles,r.modelProfiles);let t=r.activeProfileId;r.activeProfileId=r.modelProfiles.some(e=>e.id===t)?t:e.activeProfileId;let n=r.modelProfiles.find(e=>e.id===r.activeProfileId)||r.modelProfiles[0];n&&(r.apiBase=n.apiBase||`https://api.deepseek.com`,r.apiKey=n.apiKey||``,r.modelName=n.modelName||`deepseek-v4-pro`,r.customModels=ee(n.models))}if(kt(r),await new Promise(e=>{chrome.storage.local.set(r,e)}),await g(),!Array.isArray(r.modelProfiles)){let e=await chrome.storage.local.get([`apiBase`,`apiKey`,`modelName`,`customModels`]);await ie({apiBase:e.apiBase||`https://api.deepseek.com`,apiKey:h(e.apiKey)||``,modelName:e.modelName||`deepseek-v4-pro`,models:ee(e.customModels)})}It(),Ht(t(`configDialog.importedCount`,{count:Object.keys(r).length}),`success`),setTimeout(()=>{at(()=>{pt().then(()=>{typeof updateToolbarUI==`function`&&updateToolbarUI()}),Ct()})},300)}catch(e){r.error(`[Options] importconfiguration failed:`,e),Ht(t(`configDialog.importFailed`,{error:e.message}),`error`)}}function Vt(){let e=document.getElementById(`exportConfigCloseBtn`),t=document.getElementById(`exportConfigCancelBtn`),n=document.getElementById(`exportConfigOkBtn`),r=document.getElementById(`exportConfigModal`);e&&e.addEventListener(`click`,Pt),t&&t.addEventListener(`click`,Pt),n&&n.addEventListener(`click`,Mt),r&&r.addEventListener(`click`,e=>{e.target===r&&Pt()});let i=document.getElementById(`importConfigCloseBtn`),a=document.getElementById(`importConfigCancelBtn`),o=document.getElementById(`importConfigOkBtn`),s=document.getElementById(`importConfigModal`);i&&i.addEventListener(`click`,It),a&&a.addEventListener(`click`,It),o&&o.addEventListener(`click`,Bt),s&&s.addEventListener(`click`,e=>{e.target===s&&It()})}function Ht(e,t=`info`){let n=document.getElementById(`toastContainer`);if(!n)return;let r=document.createElement(`div`);r.className=`toast ${t}`,r.textContent=e,n.appendChild(r),requestAnimationFrame(()=>r.classList.add(`toast-show`)),setTimeout(()=>{r.classList.remove(`toast-show`),setTimeout(()=>{r.parentNode&&r.parentNode.removeChild(r)},300)},3e3)}var Ut=null,Wt=null;async function Gt(){Jt(),Yt(),s(()=>{Kt()}),await Kt()}async function Kt(){let e=await _(),t=document.getElementById(`profileDropdown`),n=document.getElementById(`profileInput`);if(!t||!n)return;let r=e.profiles.find(t=>t.id===e.activeProfileId)||e.profiles[0];t.innerHTML=``;for(let n of e.profiles){let e=document.createElement(`div`);e.className=`profile-option`,e.dataset.value=n.id,r&&n.id===r.id&&e.classList.add(`selected`);let i=document.createElement(`span`);i.className=`profile-option-left`,i.textContent=n.name,e.appendChild(i);let a=re(n.apiBase);if(a){let t=document.createElement(`span`);t.className=`profile-option-right`,t.textContent=a,e.appendChild(t)}t.appendChild(e)}n.value=r?r.name:``,qt(r)}function qt(e){let n=document.getElementById(`profileScopeHint`);n&&(n.textContent=e?t(`settings.profileScopeHint`,{name:e.name}):``)}function Jt(){let e=document.getElementById(`profileInput`),t=document.getElementById(`profileDropdown`);!e||!t||(e.addEventListener(`click`,e=>{e.stopPropagation(),t.classList.toggle(`show`)}),t.addEventListener(`click`,e=>{let n=e.target.closest(`.profile-option`);n&&(e.stopPropagation(),t.classList.remove(`show`),Xt(n.dataset.value))}),document.addEventListener(`click`,n=>{!t.contains(n.target)&&n.target!==e&&t.classList.remove(`show`)}),document.getElementById(`profileNewBtn`)?.addEventListener(`click`,Zt),document.getElementById(`profileDupBtn`)?.addEventListener(`click`,Qt),document.getElementById(`profileRenameBtn`)?.addEventListener(`click`,$t),document.getElementById(`profileDeleteBtn`)?.addEventListener(`click`,en),rn())}function Yt(){chrome.storage.onChanged.addListener(async(e,t)=>{if(t===`local`&&(e.modelProfiles&&Kt(),e.activeProfileId)){let e=await _(),t=e.profiles.find(t=>t.id===e.activeProfileId);t&&nn(t),Kt()}})}async function Xt(e){if(e===(await _()).activeProfileId)return;let n=await w(e);n&&(nn(n),await Kt(),U(`✅ ${t(`settings.profileSwitched`,{name:n.name})}`,`success`))}async function Zt(){let e=ne(tn())||``,n=await an({mode:`name`,title:t(`settings.profileNameTitle`),defaultValue:e});if(!n)return;let r=await m({name:n,apiBase:T,apiKey:``,modelName:S,models:[]},{activate:!0});nn(r),await Kt(),U(`✅ ${t(`settings.profileCreated`,{name:r.name})}`,`success`)}async function Qt(){let e=await _(),n=e.profiles.find(t=>t.id===e.activeProfileId)||e.profiles[0];if(!n)return;let r=await an({mode:`name`,title:t(`settings.saveAsProfile`),defaultValue:`${n.name} ${t(`settings.profileCopySuffix`)}`});if(!r)return;let i=document.getElementById(`modelInput`),a=await m({name:r,apiBase:tn(),apiKey:document.getElementById(`apiKey`)?.value.trim()||``,modelName:i?.value||xe||`deepseek-v4-pro`,models:Ne()},{activate:!0});nn(a),await Kt(),U(`✅ ${t(`settings.profileCreated`,{name:a.name})}`,`success`)}async function $t(){let e=await _(),n=e.profiles.find(t=>t.id===e.activeProfileId)||e.profiles[0];if(!n)return;let r=await an({mode:`name`,title:t(`settings.renameProfile`),defaultValue:n.name});!r||r===n.name||(await y(n.id,r),await Kt(),U(`✅ ${t(`settings.profileRenamed`,{name:r})}`,`success`))}async function en(){let e=await _(),n=e.profiles.find(t=>t.id===e.activeProfileId)||e.profiles[0];if(!n)return;if(e.profiles.length<=1){U(`⚠️ ${t(`settings.atLeastOneProfile`)}`,`error`);return}if(!await an({mode:`confirm`,title:t(`settings.deleteProfile`),message:t(`settings.deleteProfileConfirm`,{name:n.name})}))return;let r=await te(n.id);if(!r.deleted){U(`⚠️ ${t(`settings.atLeastOneProfile`)}`,`error`);return}r.nextActive&&nn(r.nextActive),await Kt(),U(`🗑️ ${t(`settings.profileDeleted`,{name:n.name})}`,`success`)}function tn(){return document.getElementById(`apiBase`)?.value.trim()||`https://api.deepseek.com`}function nn(e){let t=e.apiBase||`https://api.deepseek.com`,n=e.modelName||`deepseek-v4-pro`,r=document.getElementById(`apiBase`);r&&(r.value=t),Qe(t);let i=document.getElementById(`apiKey`);i&&(i.value=e.apiKey||``),Se(n);let a=document.getElementById(`modelInput`);a&&(a.value=n),Ie(e.models||[],n),Re(`modelInput`,`modelSelectedCtxBadge`,`modelDropdown`)}function rn(){let e=document.getElementById(`profileModal`);!e||e.dataset.bound||(e.dataset.bound=`1`,document.getElementById(`profileModalOkBtn`)?.addEventListener(`click`,on),document.getElementById(`profileModalCancelBtn`)?.addEventListener(`click`,()=>sn(null)),document.getElementById(`profileModalCloseBtn`)?.addEventListener(`click`,()=>sn(null)),e.addEventListener(`click`,t=>{t.target===e&&sn(null)}),document.getElementById(`profileNameInput`)?.addEventListener(`keydown`,e=>{e.key===`Enter`&&on(),e.key===`Escape`&&sn(null)}))}function an({mode:e,title:t,message:n=``,defaultValue:r=``}){let i=document.getElementById(`profileModal`);if(!i)return Promise.resolve(null);Ut=e,document.getElementById(`profileModalTitle`).textContent=t;let a=document.getElementById(`profileModalMessage`);a.textContent=n,a.style.display=n?``:`none`;let o=document.getElementById(`profileNameInput`);return o.value=r,o.style.display=e===`name`?``:`none`,i.style.display=`flex`,e===`name`&&setTimeout(()=>o.focus(),50),new Promise(e=>{Wt=e})}function on(){if(Wt){if(Ut===`name`){let e=document.getElementById(`profileNameInput`).value.trim();if(!e){U(`❌ ${t(`settings.profileNameRequired`)}`,`error`);return}sn(e)}else sn(!0)}}function sn(e){let t=document.getElementById(`profileModal`);t&&(t.style.display=`none`),Ut=null;let n=Wt;Wt=null,n&&n(e)}var W={agentBaseUrl:null,agentToken:null,agentConnected:!1,agentName:null,agentId:null,cachedMcpServers:[],cachedSkills:[],editingMcpId:null,refreshCallback:null};async function cn(){typeof W.refreshCallback==`function`&&await W.refreshCallback()}function G(e,n=t(`customConfirm.defaultTitle`)){return new Promise(r=>{let i=document.createElement(`div`);i.className=`modal-overlay`,i.innerHTML=`
|
|
50
|
+
`).join(``))}function At(e,n){if(e=e.trim().toLowerCase(),!e){n&&n({error:t(`toolbar.domainEmpty`)});return}if(!e.includes(`.`)){n&&n({error:t(`toolbar.domainInvalid`)});return}chrome.storage.local.get([`blockedDomains`],r=>{let i=r.blockedDomains||[];if(i.includes(e)){n&&n({error:t(`toolbar.domainExists`)});return}i.push(e),chrome.storage.local.set({blockedDomains:i},()=>{kt(i),n&&n({})})})}function jt(e){chrome.storage.local.get([`blockedDomains`],t=>{let n=(t.blockedDomains||[]).filter(t=>t!==e);chrome.storage.local.set({blockedDomains:n},()=>{kt(n)})})}var Mt=`apiBase.modelName.customModels.systemPrompt.enableImageInput.imageModelName.imageModels.imageApiBase.reactMaxIterations.reactApiTimeout.reactLoopTimeout.reactToolTimeout.enableToolPreselect.toolConfirmationEnabled.reflectionConfig.completionVerificationConfig.enableExecutionLog.toolbarTools.toolbarIconOnly.enableSelectionToolbar.blockedDomains.streamEnabled.streamExpandTools.completionSoundEnabled.completionConfettiEnabled.completionNotificationEnabled.scheduledNotificationEnabled.interactionNotificationEnabled.showMessageTimestamp.sidePanelScope.autoGroupTabs.customAgents.activeAgentId.activeAssistantId.temperature.topP.selectedTempIndex.customPrompts.pairedAgents.agentStreamEnabled.enableTools.isolateChat.enableSelectionQuery.deletedPresetModels.modelProfiles.activeProfileId.mcpEnabled.skillsEnabled.ragEnabled.appTheme.selectionToolbarFollowTheme`.split(`.`),Nt=[`apiKey`,`imageApiKey`,`agentToken`];function Pt(e){for(let t of[`apiKey`,`imageApiKey`])e[t]&&(e[t]=ae(h(e[t])));Array.isArray(e.modelProfiles)&&(e.modelProfiles=e.modelProfiles.map(e=>e.apiKey?{...e,apiKey:ae(h(e.apiKey))}:e)),Array.isArray(e.pairedAgents)&&(e.pairedAgents=e.pairedAgents.map(e=>e.token?{...e,token:ae(h(e.token))}:e))}function Ft(e){let t=e&&e.reflectionConfig;if(t&&typeof t==`object`&&`toolReflection`in t){let n={...t};delete n.toolReflection,e.reflectionConfig=n}}async function It(e){let t=e?[...Mt,...Nt]:Mt;return new Promise(n=>{chrome.storage.local.get(null,r=>{let i={};for(let e of t)r[e]!==void 0&&(i[e]=r[e]);for(let e of Object.keys(r))(e.startsWith(`agentEnabledTools_`)||e.startsWith(`agentMcpClosedServers_`))&&(i[e]=r[e]);!e&&i.pairedAgents&&(i.pairedAgents=i.pairedAgents.map(e=>({...e,token:``}))),!e&&Array.isArray(i.modelProfiles)&&(i.modelProfiles=v(i.modelProfiles)),Ft(i),n(i)})})}async function Lt(){let e=document.getElementById(`exportIncludeSecrets`)?.checked||!1;try{let n=await It(e),r={version:1,app:`ai-helper`,exportedAt:new Date().toISOString(),includeSecrets:e,config:n},i=new Date,a=`ai-helper-config-${i.getFullYear()+String(i.getMonth()+1).padStart(2,`0`)+String(i.getDate()).padStart(2,`0`)+`-`+String(i.getHours()).padStart(2,`0`)+String(i.getMinutes()).padStart(2,`0`)+String(i.getSeconds()).padStart(2,`0`)}.json`,o=JSON.stringify(r,null,2),s=new Blob([o],{type:`application/json;charset=utf-8;`}),c=URL.createObjectURL(s),l=document.createElement(`a`);l.href=c,l.download=a,document.body.appendChild(l),l.click(),document.body.removeChild(l),URL.revokeObjectURL(c),zt(),qt(t(`configDialog.exportSuccess`),`success`)}catch(e){r.error(`[Options] exportconfiguration failed:`,e),qt(t(`configDialog.exportFailed`,{error:e.message}),`error`)}}function Rt(){let e=document.getElementById(`exportConfigModal`);e&&(e.style.display=`flex`)}function zt(){let e=document.getElementById(`exportConfigModal`);e&&(e.style.display=`none`)}function Bt(e){let n=e.config||e,r=Object.keys(n).length,i=e.exportedAt?new Date(e.exportedAt).toLocaleString(o()===`zh`?`zh-CN`:`en-US`):t(`configDialog.unknownTime`),a=document.getElementById(`importSummary`);a&&(a.textContent=t(`configDialog.importSummary`,{time:i,count:r}));let s=document.getElementById(`importConfigModal`);s&&(s.dataset.importData=JSON.stringify(e),s.style.display=`flex`)}function Vt(){let e=document.getElementById(`importConfigModal`);e&&(e.style.display=`none`)}function Ht(){let e=document.getElementById(`importConfigFile`);e&&(e.value=``,e.click())}function Ut(e){if(!e||typeof e!=`object`)return{valid:!1,error:t(`configDialog.invalidFileFormat`)};let n;if(e.version&&e.config&&typeof e.config==`object`)n=e.config;else if(e.apiBase||e.modelName!==void 0)n=e;else return{valid:!1,error:t(`configDialog.unrecognizedFormat`)};for(let e of Object.keys(n))if(!Mt.includes(e)&&!Nt.includes(e)&&!e.startsWith(`agentEnabledTools_`)&&!e.startsWith(`agentMcpClosedServers_`))return{valid:!1,error:t(`configDialog.unknownConfigKey`,{key:e})};return{valid:!0}}async function Wt(e){try{let n=await e.text(),r=JSON.parse(n),i=Ut(r);if(!i.valid){qt(t(`configDialog.importFailed`,{error:i.error}),`error`);return}Bt(r)}catch(e){r.error(`[Options] import fileparse failed:`,e),qt(t(`configDialog.importParseFailed`),`error`)}}async function Gt(){let e=document.getElementById(`importConfigModal`);if(!e)return;let n=e.dataset.importData;if(n)try{let e=JSON.parse(n),r=e.config||e;if(delete r.networkAccessEnabled,delete r.allowedNetworkHosts,Ft(r),(document.getElementById(`importStrategyReplace`)?.checked?`replace`:`merge`)==`merge`&&Array.isArray(r.modelProfiles)){let e=await _();r.modelProfiles=ne(e.profiles,r.modelProfiles);let t=r.activeProfileId;r.activeProfileId=r.modelProfiles.some(e=>e.id===t)?t:e.activeProfileId;let n=r.modelProfiles.find(e=>e.id===r.activeProfileId)||r.modelProfiles[0];n&&(r.apiBase=n.apiBase||`https://api.deepseek.com`,r.apiKey=n.apiKey||``,r.modelName=n.modelName||`deepseek-v4-pro`,r.customModels=ee(n.models))}if(Pt(r),await new Promise(e=>{chrome.storage.local.set(r,e)}),await g(),!Array.isArray(r.modelProfiles)){let e=await chrome.storage.local.get([`apiBase`,`apiKey`,`modelName`,`customModels`]);await ie({apiBase:e.apiBase||`https://api.deepseek.com`,apiKey:h(e.apiKey)||``,modelName:e.modelName||`deepseek-v4-pro`,models:ee(e.customModels)})}Vt(),qt(t(`configDialog.importedCount`,{count:Object.keys(r).length}),`success`),setTimeout(()=>{dt(()=>{yt().then(()=>{typeof updateToolbarUI==`function`&&updateToolbarUI()}),Ot()})},300)}catch(e){r.error(`[Options] importconfiguration failed:`,e),qt(t(`configDialog.importFailed`,{error:e.message}),`error`)}}function Kt(){let e=document.getElementById(`exportConfigCloseBtn`),t=document.getElementById(`exportConfigCancelBtn`),n=document.getElementById(`exportConfigOkBtn`),r=document.getElementById(`exportConfigModal`);e&&e.addEventListener(`click`,zt),t&&t.addEventListener(`click`,zt),n&&n.addEventListener(`click`,Lt),r&&r.addEventListener(`click`,e=>{e.target===r&&zt()});let i=document.getElementById(`importConfigCloseBtn`),a=document.getElementById(`importConfigCancelBtn`),o=document.getElementById(`importConfigOkBtn`),s=document.getElementById(`importConfigModal`);i&&i.addEventListener(`click`,Vt),a&&a.addEventListener(`click`,Vt),o&&o.addEventListener(`click`,Gt),s&&s.addEventListener(`click`,e=>{e.target===s&&Vt()})}function qt(e,t=`info`){let n=document.getElementById(`toastContainer`);if(!n)return;let r=document.createElement(`div`);r.className=`toast ${t}`,r.textContent=e,n.appendChild(r),requestAnimationFrame(()=>r.classList.add(`toast-show`)),setTimeout(()=>{r.classList.remove(`toast-show`),setTimeout(()=>{r.parentNode&&r.parentNode.removeChild(r)},300)},3e3)}function Jt(e){let t=document.createElement(`div`);return t.textContent=e,t.innerHTML}function Yt(){return new Promise(e=>{chrome.storage.local.get([`allowedNetworkHosts`],t=>{e(Array.isArray(t.allowedNetworkHosts)?t.allowedNetworkHosts:k.allowedNetworkHosts)})})}function Xt(){Yt().then(e=>Zt(e))}function Zt(e){let n=document.getElementById(`networkAllowlistList`);n&&(e.length===0?n.innerHTML=`<div class="domain-blocklist-empty">${t(`react.networkAllowlistEmpty`)}</div>`:n.innerHTML=e.map(e=>`
|
|
51
|
+
<div class="domain-blocklist-item">
|
|
52
|
+
<span class="domain-blocklist-item-name" title="${Jt(e)}">${Jt(e)}</span>
|
|
53
|
+
<button class="domain-blocklist-item-remove" data-host="${Jt(e)}" title="${t(`react.networkHostRemove`)}">
|
|
54
|
+
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 6 6 18"/><path d="m6 6 12 12"/></svg>
|
|
55
|
+
</button>
|
|
56
|
+
</div>
|
|
57
|
+
`).join(``))}function Qt(e,n){let r=oe([e])[0];if(!r){n&&n({error:t(`react.networkHostEmpty`)});return}if(/\s/.test(r)){n&&n({error:t(`react.networkHostInvalid`)});return}Yt().then(e=>{if(e.includes(r)){n&&n({error:t(`react.networkHostExists`)});return}let i=[...e,r];chrome.storage.local.set({allowedNetworkHosts:i},()=>{Zt(i),n&&n({})})})}function $t(e){Yt().then(t=>{let n=t.filter(t=>t!==e);chrome.storage.local.set({allowedNetworkHosts:n},()=>{Zt(n)})})}function en(e){let t=document.getElementById(`networkAllowlistWrap`);t&&(t.style.display=e?`block`:`none`)}var tn=null,nn=null;async function rn(){sn(),cn(),s(()=>{an()}),await an()}async function an(){let e=await _(),t=document.getElementById(`profileDropdown`),n=document.getElementById(`profileInput`);if(!t||!n)return;let r=e.profiles.find(t=>t.id===e.activeProfileId)||e.profiles[0];t.innerHTML=``;for(let n of e.profiles){let e=document.createElement(`div`);e.className=`profile-option`,e.dataset.value=n.id,r&&n.id===r.id&&e.classList.add(`selected`);let i=document.createElement(`span`);i.className=`profile-option-left`,i.textContent=n.name,e.appendChild(i);let a=re(n.apiBase);if(a){let t=document.createElement(`span`);t.className=`profile-option-right`,t.textContent=a,e.appendChild(t)}t.appendChild(e)}n.value=r?r.name:``,on(r)}function on(e){let n=document.getElementById(`profileScopeHint`);n&&(n.textContent=e?t(`settings.profileScopeHint`,{name:e.name}):``)}function sn(){let e=document.getElementById(`profileInput`),t=document.getElementById(`profileDropdown`);!e||!t||(e.addEventListener(`click`,e=>{e.stopPropagation(),t.classList.toggle(`show`)}),t.addEventListener(`click`,e=>{let n=e.target.closest(`.profile-option`);n&&(e.stopPropagation(),t.classList.remove(`show`),ln(n.dataset.value))}),document.addEventListener(`click`,n=>{!t.contains(n.target)&&n.target!==e&&t.classList.remove(`show`)}),document.getElementById(`profileNewBtn`)?.addEventListener(`click`,un),document.getElementById(`profileDupBtn`)?.addEventListener(`click`,dn),document.getElementById(`profileRenameBtn`)?.addEventListener(`click`,fn),document.getElementById(`profileDeleteBtn`)?.addEventListener(`click`,pn),gn())}function cn(){chrome.storage.onChanged.addListener(async(e,t)=>{if(t===`local`&&(e.modelProfiles&&an(),e.activeProfileId)){let e=await _(),t=e.profiles.find(t=>t.id===e.activeProfileId);t&&hn(t),an()}})}async function ln(e){if(e===(await _()).activeProfileId)return;let n=await C(e);n&&(hn(n),await an(),H(`✅ ${t(`settings.profileSwitched`,{name:n.name})}`,`success`))}async function un(){let e=w(mn())||``,n=await _n({mode:`name`,title:t(`settings.profileNameTitle`),defaultValue:e});if(!n)return;let r=await m({name:n,apiBase:T,apiKey:``,modelName:te,models:[]},{activate:!0});hn(r),await an(),H(`✅ ${t(`settings.profileCreated`,{name:r.name})}`,`success`)}async function dn(){let e=await _(),n=e.profiles.find(t=>t.id===e.activeProfileId)||e.profiles[0];if(!n)return;let r=await _n({mode:`name`,title:t(`settings.saveAsProfile`),defaultValue:`${n.name} ${t(`settings.profileCopySuffix`)}`});if(!r)return;let i=document.getElementById(`modelInput`),a=await m({name:r,apiBase:mn(),apiKey:document.getElementById(`apiKey`)?.value.trim()||``,modelName:i?.value||De||`deepseek-v4-pro`,models:ze()},{activate:!0});hn(a),await an(),H(`✅ ${t(`settings.profileCreated`,{name:a.name})}`,`success`)}async function fn(){let e=await _(),n=e.profiles.find(t=>t.id===e.activeProfileId)||e.profiles[0];if(!n)return;let r=await _n({mode:`name`,title:t(`settings.renameProfile`),defaultValue:n.name});!r||r===n.name||(await y(n.id,r),await an(),H(`✅ ${t(`settings.profileRenamed`,{name:r})}`,`success`))}async function pn(){let e=await _(),n=e.profiles.find(t=>t.id===e.activeProfileId)||e.profiles[0];if(!n)return;if(e.profiles.length<=1){H(`⚠️ ${t(`settings.atLeastOneProfile`)}`,`error`);return}if(!await _n({mode:`confirm`,title:t(`settings.deleteProfile`),message:t(`settings.deleteProfileConfirm`,{name:n.name})}))return;let r=await S(n.id);if(!r.deleted){H(`⚠️ ${t(`settings.atLeastOneProfile`)}`,`error`);return}r.nextActive&&hn(r.nextActive),await an(),H(`🗑️ ${t(`settings.profileDeleted`,{name:n.name})}`,`success`)}function mn(){return document.getElementById(`apiBase`)?.value.trim()||`https://api.deepseek.com`}function hn(e){let t=e.apiBase||`https://api.deepseek.com`,n=e.modelName||`deepseek-v4-pro`,r=document.getElementById(`apiBase`);r&&(r.value=t),it(t);let i=document.getElementById(`apiKey`);i&&(i.value=e.apiKey||``),Oe(n);let a=document.getElementById(`modelInput`);a&&(a.value=n),He(e.models||[],n),We(`modelInput`,`modelSelectedCtxBadge`,`modelDropdown`)}function gn(){let e=document.getElementById(`profileModal`);!e||e.dataset.bound||(e.dataset.bound=`1`,document.getElementById(`profileModalOkBtn`)?.addEventListener(`click`,vn),document.getElementById(`profileModalCancelBtn`)?.addEventListener(`click`,()=>yn(null)),document.getElementById(`profileModalCloseBtn`)?.addEventListener(`click`,()=>yn(null)),e.addEventListener(`click`,t=>{t.target===e&&yn(null)}),document.getElementById(`profileNameInput`)?.addEventListener(`keydown`,e=>{e.key===`Enter`&&vn(),e.key===`Escape`&&yn(null)}))}function _n({mode:e,title:t,message:n=``,defaultValue:r=``}){let i=document.getElementById(`profileModal`);if(!i)return Promise.resolve(null);tn=e,document.getElementById(`profileModalTitle`).textContent=t;let a=document.getElementById(`profileModalMessage`);a.textContent=n,a.style.display=n?``:`none`;let o=document.getElementById(`profileNameInput`);return o.value=r,o.style.display=e===`name`?``:`none`,i.style.display=`flex`,e===`name`&&setTimeout(()=>o.focus(),50),new Promise(e=>{nn=e})}function vn(){if(nn)if(tn===`name`){let e=document.getElementById(`profileNameInput`).value.trim();if(!e){H(`❌ ${t(`settings.profileNameRequired`)}`,`error`);return}yn(e)}else yn(!0)}function yn(e){let t=document.getElementById(`profileModal`);t&&(t.style.display=`none`),tn=null;let n=nn;nn=null,n&&n(e)}var W={agentBaseUrl:null,agentToken:null,agentConnected:!1,agentName:null,agentId:null,cachedMcpServers:[],cachedSkills:[],editingMcpId:null,refreshCallback:null};async function bn(){typeof W.refreshCallback==`function`&&await W.refreshCallback()}function G(e,n=t(`customConfirm.defaultTitle`)){return new Promise(r=>{let i=document.createElement(`div`);i.className=`modal-overlay`,i.innerHTML=`
|
|
51
58
|
<div class="modal-content" style="max-width: 400px;">
|
|
52
59
|
<div class="modal-header">
|
|
53
60
|
<h3>${q(n)}</h3>
|
|
@@ -60,7 +67,7 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
60
67
|
<button class="btn btn-primary" id="confirmOkBtn" style="width: auto;">${t(`common.ok`)}</button>
|
|
61
68
|
</div>
|
|
62
69
|
</div>
|
|
63
|
-
`,document.body.appendChild(i);let a=e=>{i.remove(),r(e)};i.querySelector(`#confirmCancelBtn`).addEventListener(`click`,()=>a(!1)),i.querySelector(`#confirmOkBtn`).addEventListener(`click`,()=>a(!0)),i.addEventListener(`click`,e=>{e.target===i&&a(!1)})})}function
|
|
70
|
+
`,document.body.appendChild(i);let a=e=>{i.remove(),r(e)};i.querySelector(`#confirmCancelBtn`).addEventListener(`click`,()=>a(!1)),i.querySelector(`#confirmOkBtn`).addEventListener(`click`,()=>a(!0)),i.addEventListener(`click`,e=>{e.target===i&&a(!1)})})}function xn(e,n){let r=document.getElementById(`agentSkillViewerModal`);r&&r.remove();let i=document.createElement(`div`);i.className=`modal-overlay`,i.id=`agentSkillViewerModal`;let a=document.createElement(`div`);a.className=`modal-content agent-skill-editor-container`,a.style.width=`700px`,a.style.maxHeight=`85vh`,a.innerHTML=`
|
|
64
71
|
<div class="modal-header">
|
|
65
72
|
<h3>${t(`toolbox.viewSkillTitle`,{name:e})}</h3>
|
|
66
73
|
<button class="modal-close-btn">✕</button>
|
|
@@ -68,19 +75,19 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
68
75
|
<div class="modal-body">
|
|
69
76
|
<div class="form-group">
|
|
70
77
|
<label>${t(`toolbox.skillNameLabel`)}</label>
|
|
71
|
-
<input type="text" value="${q(n.frontmatter?.name||n.name||``)}" readonly style="background
|
|
78
|
+
<input type="text" value="${q(n.frontmatter?.name||n.name||``)}" readonly style="background:var(--bg-subtle);color:var(--text-secondary);">
|
|
72
79
|
</div>
|
|
73
80
|
<div class="form-group">
|
|
74
81
|
<label>${t(`toolbox.skillDescLabel`)}</label>
|
|
75
|
-
<input type="text" value="${q(n.frontmatter?.description||``)}" readonly style="background
|
|
82
|
+
<input type="text" value="${q(n.frontmatter?.description||``)}" readonly style="background:var(--bg-subtle);color:var(--text-secondary);">
|
|
76
83
|
</div>
|
|
77
84
|
<div class="form-group">
|
|
78
85
|
<label>${t(`toolbox.skillVersionLabel`)}</label>
|
|
79
|
-
<input type="text" value="${q(n.frontmatter?.version||`1.0`)}" readonly style="background
|
|
86
|
+
<input type="text" value="${q(n.frontmatter?.version||`1.0`)}" readonly style="background:var(--bg-subtle);color:var(--text-secondary);">
|
|
80
87
|
</div>
|
|
81
88
|
<div class="form-group">
|
|
82
89
|
<label>${t(`toolbox.skillMarkdownLabel`)}</label>
|
|
83
|
-
<textarea readonly style="min-height: 350px; font-family: monospace; background
|
|
90
|
+
<textarea readonly style="min-height: 350px; font-family: monospace; background:var(--bg-subtle); color:var(--text-secondary); resize: vertical;">${q(n.markdown||``)}</textarea>
|
|
84
91
|
</div>
|
|
85
92
|
${n.resources&&n.resources.length>0?`
|
|
86
93
|
<div class="form-group">
|
|
@@ -93,7 +100,7 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
93
100
|
<div class="modal-actions">
|
|
94
101
|
<button class="btn btn-cancel">${t(`common.close`)}</button>
|
|
95
102
|
</div>
|
|
96
|
-
`,i.appendChild(a),document.body.appendChild(i);let o=()=>i.remove();a.querySelector(`.modal-close-btn`).addEventListener(`click`,o),a.querySelector(`.btn-cancel`).addEventListener(`click`,o),i.addEventListener(`click`,e=>{e.target===i&&o()})}async function
|
|
103
|
+
`,i.appendChild(a),document.body.appendChild(i);let o=()=>i.remove();a.querySelector(`.modal-close-btn`).addEventListener(`click`,o),a.querySelector(`.btn-cancel`).addEventListener(`click`,o),i.addEventListener(`click`,e=>{e.target===i&&o()})}async function Sn(){let e=await chrome.storage.local.get([`pairedAgents`,`activeAgentId`]),t=(e.pairedAgents||[]).find(t=>t.id===e.activeAgentId);return W.agentBaseUrl=t?.url||null,W.agentToken=t?.token||null,W.agentConnected=!!t,W.agentName=t?.name||null,W.agentId=t?.id||null,{url:W.agentBaseUrl,token:W.agentToken,connected:W.agentConnected,agentName:W.agentName,agentId:W.agentId}}async function K(e,t,n=null){let r={"Content-Type":`application/json`,Authorization:`Bearer ${W.agentToken}`};t.startsWith(`/api/memory/store`)&&(r[`X-Memory-Caller`]=`user`);let i={method:e,headers:r};n&&(i.body=JSON.stringify(n));let a=await fetch(`${W.agentBaseUrl}${t}`,i),o=await a.json();return o&&typeof o==`object`&&!Array.isArray(o)&&(o.httpStatus=a.status),o}function q(e){return e?String(e).replace(/&/g,`&`).replace(/</g,`<`).replace(/>/g,`>`).replace(/"/g,`"`).replace(/'/g,`'`):``}var Cn=``,wn=`all`;async function Tn(){if(await Sn(),!W.agentConnected)return{servers:[]};try{return await K(`GET`,`/api/mcp/servers`)}catch{return{servers:[]}}}function En(e){let n=document.getElementById(`mcpServerList`);if(!n)return;if(W.cachedMcpServers=e||[],!W.agentConnected){n.innerHTML=`
|
|
97
104
|
<div class="toolbox-empty">
|
|
98
105
|
<div class="toolbox-empty-icon">🔌</div>
|
|
99
106
|
<div class="toolbox-empty-title">${t(`toolbox.emptyAgentNotConnectedTitle`)}</div>
|
|
@@ -103,7 +110,7 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
103
110
|
<div class="toolbox-empty-icon">📦</div>
|
|
104
111
|
<div class="toolbox-empty-title">${t(`toolbox.emptyNoMcpTitle`)}</div>
|
|
105
112
|
<div class="toolbox-empty-desc">${t(`toolbox.emptyNoMcpDesc`)}</div>
|
|
106
|
-
</div>`;return}let r=e.filter(e=>{if(
|
|
113
|
+
</div>`;return}let r=e.filter(e=>{if(wn===`enabled`&&e.enabled===!1||wn===`disabled`&&e.enabled!==!1)return!1;if(Cn){let t=Cn.toLowerCase();if(![e.name,e.id,e.command,e.url,(e.args||[]).join(` `)].filter(Boolean).join(` `).toLowerCase().includes(t))return!1}return!0});if(r.length===0){n.innerHTML=`
|
|
107
114
|
<div class="toolbox-empty">
|
|
108
115
|
<div class="toolbox-empty-icon">🔍</div>
|
|
109
116
|
<div class="toolbox-empty-title">${t(`toolbox.noMatchResult`)}</div>
|
|
@@ -114,19 +121,19 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
114
121
|
<input type="text" id="mcpEditId" value="${q(e.id)}" placeholder="${t(`toolbox.mcpIdPlaceholder`)}" class="toolbox-input">
|
|
115
122
|
<input type="text" id="mcpEditName" value="${q(e.name||``)}" placeholder="${t(`toolbox.mcpNamePlaceholder`)}" class="toolbox-input">
|
|
116
123
|
</div>
|
|
117
|
-
${
|
|
118
|
-
${
|
|
124
|
+
${Nn(`mcpEdit`,n)}
|
|
125
|
+
${Pn(`mcpEdit`,n,e.url||``,e.command||``,(e.args||[]).join(` `))}
|
|
119
126
|
<div class="mcp-env-section" id="mcpEditEnvSection" style="display:${n===`stdio`?``:`none`};">
|
|
120
127
|
<div class="mcp-env-header">
|
|
121
128
|
<span class="mcp-env-title">${t(`toolbox.mcpEnvVars`)}</span>
|
|
122
129
|
<span class="mcp-env-hint">${t(`toolbox.mcpEnvVarsHint`)}</span>
|
|
123
130
|
</div>
|
|
124
131
|
<div class="mcp-env-rows" id="mcpEditEnvRows">
|
|
125
|
-
${
|
|
132
|
+
${Dn(e.env||{})}
|
|
126
133
|
</div>
|
|
127
134
|
<button type="button" class="toolbox-btn mcp-env-add-row" data-action="add-env-row" data-target="mcpEditEnvRows" style="font-size: 12px; padding: 2px 10px;">${t(`toolbox.mcpAddVar`)}</button>
|
|
128
135
|
</div>
|
|
129
|
-
${
|
|
136
|
+
${jn(`mcpEdit`,e.headers||{},n)}
|
|
130
137
|
<div class="mcp-add-form-actions">
|
|
131
138
|
<button class="toolbox-btn toolbox-btn-cancel" data-mcp-id="${q(e.id)}" data-action="cancel-edit">${t(`common.cancel`)}</button>
|
|
132
139
|
<button class="toolbox-btn toolbox-btn-primary" data-mcp-id="${q(e.id)}" data-action="save-edit">${t(`common.save`)}</button>
|
|
@@ -149,9 +156,9 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
149
156
|
</div>
|
|
150
157
|
<div class="mcp-card-body${e.enabled===!1?` disabled`:``}">
|
|
151
158
|
<div class="mcp-server-command">
|
|
152
|
-
<code>${q(
|
|
159
|
+
<code>${q(Fn(e))}</code>
|
|
153
160
|
</div>
|
|
154
|
-
${
|
|
161
|
+
${In(e)}
|
|
155
162
|
${e.tools&&e.tools.length>0?`
|
|
156
163
|
<div class="mcp-tools-section">
|
|
157
164
|
<button class="mcp-tools-toggle" data-mcp-id="${q(e.id)}" data-action="toggle-tools">
|
|
@@ -172,7 +179,7 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
172
179
|
<button class="toolbox-btn toolbox-btn-danger" data-mcp-id="${q(e.id)}" data-action="delete">${t(`common.delete`)}</button>
|
|
173
180
|
</div>
|
|
174
181
|
</div>
|
|
175
|
-
</div>`}).join(``)}function
|
|
182
|
+
</div>`}).join(``)}function Dn(e={}){let n=Object.entries(e);return n.length===0&&n.push([``,``]),n.map(([e,n])=>`
|
|
176
183
|
<div class="mcp-env-row">
|
|
177
184
|
<input type="text" class="mcp-env-key toolbox-input" placeholder="${t(`toolbox.mcpVarNamePlaceholder`)}" value="${q(e)}" style="flex: 1;">
|
|
178
185
|
<div class="mcp-env-value-wrap token-input-wrapper" style="flex: 2;">
|
|
@@ -190,7 +197,7 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
190
197
|
</div>
|
|
191
198
|
<button type="button" class="mcp-env-remove toolbox-btn toolbox-btn-danger" title="${t(`toolbox.mcpRemoveRow`)}" data-action="remove-env-row" style="flex-shrink: 0;">×</button>
|
|
192
199
|
</div>
|
|
193
|
-
`).join(``)}function
|
|
200
|
+
`).join(``)}function On(e){let t={};return e.querySelectorAll(`.mcp-env-row`).forEach(e=>{let n=e.querySelector(`.mcp-env-key`)?.value.trim(),r=e.querySelector(`.mcp-env-value`)?.value;n&&r!==void 0&&(t[n]=r)}),Object.keys(t).length>0?t:{}}function kn(e={}){let n=Object.entries(e);return n.length===0&&n.push([``,``]),n.map(([e,n])=>`
|
|
194
201
|
<div class="mcp-env-row">
|
|
195
202
|
<input type="text" class="mcp-env-key toolbox-input" placeholder="${t(`toolbox.mcpHeaderNamePlaceholder`)}" value="${q(e)}" style="flex: 1;">
|
|
196
203
|
<div class="mcp-env-value-wrap token-input-wrapper" style="flex: 2;">
|
|
@@ -208,17 +215,17 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
208
215
|
</div>
|
|
209
216
|
<button type="button" class="mcp-env-remove toolbox-btn toolbox-btn-danger" title="${t(`toolbox.mcpRemoveRow`)}" data-action="remove-env-row" style="flex-shrink: 0;">×</button>
|
|
210
217
|
</div>
|
|
211
|
-
`).join(``)}function
|
|
218
|
+
`).join(``)}function An(e){let t={};return e.querySelectorAll(`.mcp-env-row`).forEach(e=>{let n=e.querySelector(`.mcp-env-key`)?.value.trim(),r=e.querySelector(`.mcp-env-value`)?.value;n&&r!==void 0&&(t[n]=r)}),Object.keys(t).length>0?t:{}}function jn(e,n={},r=`stdio`){return`
|
|
212
219
|
<div class="mcp-env-section" id="${e}HeadersSection" style="display:${r===`sse`||r===`streamableHttp`||r===`websocket`?``:`none`};">
|
|
213
220
|
<div class="mcp-env-header">
|
|
214
221
|
<span class="mcp-env-title">${t(`toolbox.mcpHeaders`)}</span>
|
|
215
222
|
<span class="mcp-env-hint">${t(`toolbox.mcpHeadersHint`)}</span>
|
|
216
223
|
</div>
|
|
217
224
|
<div class="mcp-env-rows" id="${e}HeaderRows">
|
|
218
|
-
${
|
|
225
|
+
${kn(n)}
|
|
219
226
|
</div>
|
|
220
227
|
<button type="button" class="toolbox-btn mcp-env-add-row" data-action="add-env-row" data-target="${e}HeaderRows" style="font-size: 12px; padding: 2px 10px;">${t(`toolbox.mcpAddHeader`)}</button>
|
|
221
|
-
</div>`}function
|
|
228
|
+
</div>`}function Mn(e){let n=e.target.closest(`[data-action]`);if(!n)return!1;let r=n.dataset.action;if(r===`toggle-env-eye`){let e=n.closest(`.mcp-env-value-wrap`),t=e?.querySelector(`.mcp-env-value`),r=e?.querySelector(`.icon-eye-open`),i=e?.querySelector(`.icon-eye-closed`);return t&&(t.type===`password`?(t.type=`text`,r&&(r.style.display=`none`),i&&(i.style.display=`block`)):(t.type=`password`,r&&(r.style.display=`block`),i&&(i.style.display=`none`))),!0}if(r===`remove-env-row`)return n.closest(`.mcp-env-row`)?.remove(),!0;if(r===`add-env-row`){let e=n.dataset.target,r=e?document.getElementById(e):null;if(r){let e=document.createElement(`div`);e.className=`mcp-env-row`,e.innerHTML=`
|
|
222
229
|
<input type="text" class="mcp-env-key toolbox-input" placeholder="${t(`toolbox.mcpVarNamePlaceholder`)}" style="flex: 1;">
|
|
223
230
|
<div class="mcp-env-value-wrap token-input-wrapper" style="flex: 2;">
|
|
224
231
|
<input type="password" class="mcp-env-value token-input" placeholder="${t(`toolbox.mcpVarValuePlaceholder`)}">
|
|
@@ -234,7 +241,7 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
234
241
|
</button>
|
|
235
242
|
</div>
|
|
236
243
|
<button type="button" class="mcp-env-remove toolbox-btn toolbox-btn-danger" title="${t(`toolbox.mcpRemoveRow`)}" data-action="remove-env-row" style="flex-shrink: 0;">×</button>
|
|
237
|
-
`,r.appendChild(e);let n=e.querySelector(`.mcp-env-key`);n&&setTimeout(()=>n.focus(),0)}return!0}return!1}function
|
|
244
|
+
`,r.appendChild(e);let n=e.querySelector(`.mcp-env-key`);n&&setTimeout(()=>n.focus(),0)}return!0}return!1}function Nn(e,n=`stdio`){return`
|
|
238
245
|
<div class="mcp-transport-group" id="${e}TransportGroup" data-prefix="${e}">
|
|
239
246
|
${[{value:`stdio`,label:`stdio`,title:t(`toolbox.transportStdioTitle`)},{value:`sse`,label:`SSE`,title:t(`toolbox.transportSseTitle`)},{value:`streamableHttp`,label:`Streamable HTTP`,title:t(`toolbox.transportStreamableHttpTitle`)},{value:`websocket`,label:`WebSocket`,title:t(`toolbox.transportWebsocketTitle`)}].map(t=>`
|
|
240
247
|
<button type="button"
|
|
@@ -244,37 +251,37 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
244
251
|
data-prefix="${e}"
|
|
245
252
|
title="${t.title}">${t.label}</button>
|
|
246
253
|
`).join(``)}
|
|
247
|
-
</div>`}function
|
|
254
|
+
</div>`}function Pn(e,n=`stdio`,r=``,i=``,a=``){let o=n===`sse`||n===`streamableHttp`||n===`websocket`;return`
|
|
248
255
|
<div class="mcp-add-form-row" id="${e}StdioRow" style="display:${o?`none`:`flex`};">
|
|
249
256
|
<input type="text" id="${e}Command" value="${q(i)}" placeholder="${t(`toolbox.mcpCommandPlaceholder`)}" class="toolbox-input" style="flex: 2;">
|
|
250
257
|
<input type="text" id="${e}Args" value="${q(a)}" placeholder="${t(`toolbox.mcpArgsPlaceholder`)}" class="toolbox-input" style="flex: 3;">
|
|
251
258
|
</div>
|
|
252
259
|
<div class="mcp-add-form-row" id="${e}UrlRow" style="display:${o?`flex`:`none`};">
|
|
253
260
|
<input type="text" id="${e}Url" value="${q(r)}" placeholder="http://localhost:3000/mcp" class="toolbox-input" style="flex: 1;">
|
|
254
|
-
</div>`}function
|
|
261
|
+
</div>`}function Fn(e){let t=e.transport||`stdio`;return t===`stdio`||!t?`${e.command||``} ${(e.args||[]).join(` `)}`:e.url||``}function In(e){let n=Object.keys(e.headers||{}).length;return n>0?`<div class="mcp-server-meta">${t(`toolbox.mcpCustomHeadersCount`,{count:n})}</div>`:``}function Ln(e){return document.querySelector(`#${e}TransportGroup .mcp-transport-btn.active`)?.dataset.value||`stdio`}function Rn(e){let t=e.dataset.prefix,n=e.dataset.value,r=document.getElementById(`${t}TransportGroup`);r&&(r.querySelectorAll(`.mcp-transport-btn`).forEach(e=>e.classList.remove(`active`)),e.classList.add(`active`));let i=n===`stdio`,a=n===`sse`||n===`streamableHttp`||n===`websocket`,o=n===`sse`||n===`streamableHttp`,s=document.getElementById(`${t}StdioRow`),c=document.getElementById(`${t}UrlRow`),l=document.getElementById(`${t}EnvSection`),u=document.getElementById(`${t}HeadersSection`);s&&(s.style.display=i?`flex`:`none`),c&&(c.style.display=a?`flex`:`none`),l&&(l.style.display=i?``:`none`),u&&(u.style.display=o?``:`none`)}function zn(){let e=document.getElementById(`mcpAddForm`);e&&(e.innerHTML=`
|
|
255
262
|
<div class="mcp-add-form">
|
|
256
263
|
<div class="mcp-add-form-row">
|
|
257
264
|
<input type="text" id="mcpAddId" placeholder="${t(`toolbox.mcpIdPlaceholderUnique`)}" class="toolbox-input">
|
|
258
265
|
<input type="text" id="mcpAddName" placeholder="${t(`toolbox.mcpNamePlaceholder`)}" class="toolbox-input">
|
|
259
266
|
</div>
|
|
260
|
-
${
|
|
261
|
-
${
|
|
267
|
+
${Nn(`mcpAdd`)}
|
|
268
|
+
${Pn(`mcpAdd`)}
|
|
262
269
|
<div class="mcp-env-section" id="mcpAddEnvSection">
|
|
263
270
|
<div class="mcp-env-header">
|
|
264
271
|
<span class="mcp-env-title">${t(`toolbox.mcpEnvVars`)}</span>
|
|
265
272
|
<span class="mcp-env-hint">${t(`toolbox.mcpEnvVarsHint`)}</span>
|
|
266
273
|
</div>
|
|
267
274
|
<div class="mcp-env-rows" id="mcpAddEnvRows">
|
|
268
|
-
${
|
|
275
|
+
${Dn()}
|
|
269
276
|
</div>
|
|
270
277
|
<button type="button" class="toolbox-btn mcp-env-add-row" data-action="add-env-row" data-target="mcpAddEnvRows" style="font-size: 12px; padding: 2px 10px;">${t(`toolbox.mcpAddVar`)}</button>
|
|
271
278
|
</div>
|
|
272
|
-
${
|
|
279
|
+
${jn(`mcpAdd`,{},`stdio`)}
|
|
273
280
|
<div class="mcp-add-form-actions">
|
|
274
281
|
<button class="toolbox-btn toolbox-btn-cancel" id="mcpAddCancel">${t(`common.cancel`)}</button>
|
|
275
282
|
<button class="toolbox-btn toolbox-btn-primary" id="mcpAddConfirm">${t(`common.add`)}</button>
|
|
276
283
|
</div>
|
|
277
|
-
</div>`)}function
|
|
284
|
+
</div>`)}function Bn(){let e=document.getElementById(`mcpAddForm`);e&&(e.innerHTML=``)}async function Vn(e){try{let n=await K(`POST`,`/api/mcp/servers`,e);if(n.success)return!0;throw Error(n.error||t(`toolbox.mcpAddFailedShort`))}catch(e){throw e}}async function Hn(e){try{let n=await K(`DELETE`,`/api/mcp/servers`,{id:e});if(n.success)return!0;throw Error(n.error||t(`toolbox.mcpDeleteFailedShort`))}catch(e){throw e}}async function Un(e){let n=await K(`POST`,`/api/mcp/servers/connect`,{id:e});if(n.success)return n;throw Error(n.error||t(`toolbox.mcpConnectFailedShort`))}async function Wn(e){let n=await K(`POST`,`/api/mcp/servers/disconnect`,{id:e});if(n.success)return!0;throw Error(n.error||t(`toolbox.mcpDisconnectFailedShort`))}async function Gn(e,n){let r=await K(`PUT`,`/api/mcp/servers/toggle`,{id:e,enabled:n});if(r.success)return!0;throw Error(r.error||t(`toolbox.mcpOperationFailedShort`))}function Kn(){let e=document.getElementById(`mcpSearchInput`),t=document.querySelectorAll(`.toolbox-filter-tab[data-target="mcp"]`);if(e){let t=null;e.addEventListener(`input`,()=>{clearTimeout(t),t=setTimeout(()=>{Cn=e.value.trim(),En(W.cachedMcpServers)},200)})}let n=document.getElementById(`mcpSearchClear`);n&&n.addEventListener(`click`,()=>{e.value=``,Cn=``,En(W.cachedMcpServers),e.focus()}),t.forEach(e=>{e.addEventListener(`click`,()=>{t.forEach(e=>e.classList.remove(`active`)),e.classList.add(`active`),wn=e.dataset.filter,En(W.cachedMcpServers)})})}var qn=``,Jn=`all`;async function Yn(){if(await Sn(),!W.agentConnected)return{skills:[]};try{return await K(`GET`,`/api/skill/list`)}catch{return{skills:[]}}}function Xn(e){let n=document.getElementById(`skillList`);if(!n)return;if(W.cachedSkills=e||[],!W.agentConnected){n.innerHTML=`
|
|
278
285
|
<div class="toolbox-empty">
|
|
279
286
|
<div class="toolbox-empty-icon">🔌</div>
|
|
280
287
|
<div class="toolbox-empty-title">${t(`toolbox.emptyAgentNotConnectedTitle`)}</div>
|
|
@@ -284,7 +291,7 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
284
291
|
<div class="toolbox-empty-icon">🧩</div>
|
|
285
292
|
<div class="toolbox-empty-title">${t(`toolbox.emptyNoSkillTitle`)}</div>
|
|
286
293
|
<div class="toolbox-empty-desc">${t(`toolbox.emptyNoSkillDesc`)}</div>
|
|
287
|
-
</div>`;return}let r=e.filter(e=>{if(
|
|
294
|
+
</div>`;return}let r=e.filter(e=>{if(Jn===`enabled`&&e.enabled===!1||Jn===`disabled`&&e.enabled!==!1)return!1;if(qn){let t=qn.toLowerCase();if(![e.name,e.description].filter(Boolean).join(` `).toLowerCase().includes(t))return!1}return!0});if(r.length===0){n.innerHTML=`
|
|
288
295
|
<div class="toolbox-empty">
|
|
289
296
|
<div class="toolbox-empty-icon">🔍</div>
|
|
290
297
|
<div class="toolbox-empty-title">${t(`toolbox.noMatchResult`)}</div>
|
|
@@ -305,7 +312,7 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
305
312
|
${n.truncated&&e.enabled!==!1?`<button class="skill-expand-btn" data-skill-name="${q(e.name)}" data-target="desc" data-full="${encodeURIComponent(e.description||``)}">${t(`toolbox.expand`)}</button>`:``}
|
|
306
313
|
${r?`
|
|
307
314
|
<div class="skill-card-params">
|
|
308
|
-
${
|
|
315
|
+
${Zn(e.parameters)}
|
|
309
316
|
</div>`:``}
|
|
310
317
|
<div class="skill-card-actions">
|
|
311
318
|
${e.enabled===!1?``:`<button class="toolbox-btn toolbox-btn-primary" data-skill-name="${q(e.name)}" data-action="run-skill">${t(`toolbox.run`)}</button>`}
|
|
@@ -341,7 +348,7 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
341
348
|
</div>
|
|
342
349
|
</div>
|
|
343
350
|
</div>
|
|
344
|
-
`}).join(``)),n.innerHTML=o}function
|
|
351
|
+
`}).join(``)),n.innerHTML=o}function Zn(e){if(!e||!e.properties)return``;let t=e.properties,n=e.required||[];return Object.entries(t).map(([e,t])=>{let r=n.includes(e);return`<span class="skill-param-tag ${r?`required`:``}" title="${q(t.description||``)}">${q(e)}${r?`*`:``}</span>`}).join(``)}async function Qn(e){let n=await K(`POST`,`/api/skill/import`,e);if(n.success)return!0;throw Error(n.error||t(`toolbox.skillImportFailedShort`))}async function $n(e){let n=await K(`DELETE`,`/api/skill/delete`,{name:e});if(n.success)return!0;throw Error(n.error||t(`toolbox.skillDeleteFailedShort`))}async function er(e){let n=await K(`POST`,`/api/skill/toggle`,{name:e});if(n.success)return n.enabled!==!1;throw Error(n.error||t(`toolbox.skillOperationFailedShort`))}async function tr(e,t={}){return await K(`POST`,`/api/skill/run`,{name:e,params:t})}function nr(e){let t=e.parameters||{},n=t.properties||{},r=Array.isArray(t.required)?t.required:[],i=Object.entries(n);return{hasRequired:i.length>0,required:i.filter(([e])=>r.includes(e)),optional:i.filter(([e])=>!r.includes(e)),all:i}}function rr(e,n){return new Promise(r=>{let i=document.createElement(`div`);i.className=`modal-overlay`;let a=n.required.map(([e,n])=>`
|
|
345
352
|
<div class="form-group">
|
|
346
353
|
<label for="skill-param-${e}">${q(n.description||e)} <span class="param-required">${t(`toolbox.required`)}</span></label>
|
|
347
354
|
<input type="text" id="skill-param-${e}" class="form-input"
|
|
@@ -360,9 +367,9 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
360
367
|
<button class="modal-close-btn" id="skillParamsCancel">×</button>
|
|
361
368
|
</div>
|
|
362
369
|
<div class="modal-body">
|
|
363
|
-
<p style="margin:0 0 16px;color
|
|
370
|
+
<p style="margin:0 0 16px;color:var(--text-secondary);font-size:13px;">${t(`toolbox.fillParamsHint`)}</p>
|
|
364
371
|
${a}
|
|
365
|
-
${n.required.length>0&&n.optional.length>0?`<div style="border-top:1px dashed
|
|
372
|
+
${n.required.length>0&&n.optional.length>0?`<div style="border-top:1px dashed var(--border-default);margin:12px 0;"></div>`:``}
|
|
366
373
|
${o}
|
|
367
374
|
</div>
|
|
368
375
|
<div class="modal-actions">
|
|
@@ -370,7 +377,7 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
370
377
|
<button class="btn btn-primary" id="skillParamsSubmit">${t(`toolbox.run`)}</button>
|
|
371
378
|
</div>
|
|
372
379
|
</div>
|
|
373
|
-
`,document.body.appendChild(i);let s=()=>{i.remove(),r(null)};i.addEventListener(`click`,e=>{e.target===i&&s()}),i.querySelectorAll(`#skillParamsCancel`).forEach(e=>{e.addEventListener(`click`,s)}),i.querySelector(`#skillParamsSubmit`).addEventListener(`click`,()=>{let e={},t=!0;for(let[r,a]of n.required){let n=i.querySelector(`#skill-param-${r}`),a=n?.value?.trim();a?(e[r]=a,n&&(n.style.borderColor=``)):(t=!1,n&&(n.style.borderColor
|
|
380
|
+
`,document.body.appendChild(i);let s=()=>{i.remove(),r(null)};i.addEventListener(`click`,e=>{e.target===i&&s()}),i.querySelectorAll(`#skillParamsCancel`).forEach(e=>{e.addEventListener(`click`,s)}),i.querySelector(`#skillParamsSubmit`).addEventListener(`click`,()=>{let e={},t=!0;for(let[r,a]of n.required){let n=i.querySelector(`#skill-param-${r}`),a=n?.value?.trim();a?(e[r]=a,n&&(n.style.borderColor=``)):(t=!1,n&&(n.style.borderColor=`var(--danger-500)`))}for(let[t]of n.optional){let n=i.querySelector(`#skill-param-${t}`);n&&(e[t]=n.value)}t&&(i.remove(),r(e))}),i.addEventListener(`keydown`,e=>{e.key===`Enter`&&i.querySelector(`#skillParamsSubmit`).click()});let c=i.querySelector(`input`);c&&setTimeout(()=>c.focus(),100)})}function ir(e,n,r){let i=document.createElement(`div`);i.className=`modal-overlay`,i.id=`skillResultModal`;let a=n?.success&&n.skill?.steps||[],o={};a.forEach(e=>{o[e.id]=e});let s=r.results||{},c=Object.keys(s),l=``,u=0,d=0,f=0;l=c.length===0?`<div style="padding:16px;text-align:center;color:var(--text-tertiary);">${r.error||t(`toolbox.noExecutionResult`)}</div>`:c.map((e,n)=>{let r=s[e],i=o[e]||{},a=i.name||i.description||e,c=i.tool||``,l=r?.success,p=r?.skipped;p?f++:l?u++:d++;let m=p?`⊘`:l?`✓`:`✗`,h=p?`step-skipped`:l?`step-success`:`step-error`,g=p?r.message||t(`toolbox.conditionNotMetSkipped`):l?r.content||r.stdout||r.message||t(`toolbox.executionSuccess`):r.error||t(`toolbox.executionFailed`),_=g.length>500?g.substring(0,500)+`\n${t(`toolbox.truncated`,{count:g.length})}`:g;return`
|
|
374
381
|
<div class="skill-run-step ${h}">
|
|
375
382
|
<div class="step-header">
|
|
376
383
|
<span class="step-status-icon">${m}</span>
|
|
@@ -393,7 +400,7 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
393
400
|
<button class="btn btn-primary modal-close-btn">${t(`common.close`)}</button>
|
|
394
401
|
</div>
|
|
395
402
|
</div>
|
|
396
|
-
`,document.body.appendChild(i),i.addEventListener(`click`,e=>{(e.target===i||e.target.classList.contains(`modal-close-btn`))&&i.remove()})}async function
|
|
403
|
+
`,document.body.appendChild(i),i.addEventListener(`click`,e=>{(e.target===i||e.target.classList.contains(`modal-close-btn`))&&i.remove()})}async function ar(){return await K(`POST`,`/api/skill/reload`)}async function or(e){return await K(`GET`,`/api/skill/markdown?name=${encodeURIComponent(e)}`)}function sr(e,n=null){let r=document.getElementById(`agentSkillEditorModal`);r&&r.remove();let i=!!n,a=document.createElement(`div`);a.className=`modal-overlay`,a.id=`agentSkillEditorModal`;let o=document.createElement(`div`);o.className=`modal-content agent-skill-editor-container`,o.style.width=`700px`,o.style.maxHeight=`85vh`,o.innerHTML=`
|
|
397
404
|
<div class="modal-header">
|
|
398
405
|
<h3>${t(i?`toolbox.editAgentSkill`:`toolbox.newAgentSkill`)}</h3>
|
|
399
406
|
<button class="modal-close-btn">✕</button>
|
|
@@ -427,7 +434,7 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
427
434
|
<button class="btn btn-cancel" id="cancelAgentSkillBtn">${t(`common.cancel`)}</button>
|
|
428
435
|
<button class="btn btn-primary" id="saveAgentSkillBtn" style="width: auto;">${t(`common.save`)}</button>
|
|
429
436
|
</div>
|
|
430
|
-
`,a.appendChild(o),document.body.appendChild(a);let s=()=>a.remove();a.querySelector(`.modal-close-btn`).addEventListener(`click`,s),a.querySelector(`#cancelAgentSkillBtn`).addEventListener(`click`,s),a.querySelector(`#saveAgentSkillBtn`).addEventListener(`click`,async()=>{let e=a.querySelector(`#agentSkillName`).value.trim(),r=a.querySelector(`#agentSkillDesc`).value.trim(),o=a.querySelector(`#agentSkillVersion`).value.trim()||`1.0`,c=a.querySelector(`#agentSkillMarkdown`).value.trim(),l
|
|
437
|
+
`,a.appendChild(o),document.body.appendChild(a);let s=()=>a.remove();a.querySelector(`.modal-close-btn`).addEventListener(`click`,s),a.querySelector(`#cancelAgentSkillBtn`).addEventListener(`click`,s),a.querySelector(`#saveAgentSkillBtn`).addEventListener(`click`,async()=>{let e=a.querySelector(`#agentSkillName`).value.trim(),r=a.querySelector(`#agentSkillDesc`).value.trim(),o=a.querySelector(`#agentSkillVersion`).value.trim()||`1.0`,c=a.querySelector(`#agentSkillMarkdown`).value.trim(),l=i?n.frontmatter?.enabled!==!1:!0;if(!e)return H(t(`toolbox.skillNameRequired`),`error`);if(!c)return H(t(`toolbox.skillMarkdownRequired`),`error`);try{let n=await K(`POST`,`/api/skill/save-markdown`,{name:e,description:r,version:o,markdown:c,enabled:l});n.success?(H(t(`toolbox.agentSkillSaved`,{name:e}),`success`),s(),bn()):H(n.error||t(`toolbox.saveFailedShort`),`error`)}catch(e){H(t(`toolbox.saveFailed`,{error:e.message}),`error`)}})}function cr(){let e=document.getElementById(`skillImportModal`);e&&e.remove();let n=document.createElement(`div`);n.className=`modal-overlay`,n.id=`skillImportModal`;let r=document.createElement(`div`);r.className=`modal-content`,r.style.width=`640px`,r.innerHTML=`
|
|
431
438
|
<div class="modal-header">
|
|
432
439
|
<h3>${t(`toolbox.importSkillTitle`)}</h3>
|
|
433
440
|
<button class="modal-close-btn">×</button>
|
|
@@ -495,63 +502,63 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
495
502
|
<button class="btn btn-cancel" id="cancelImportBtn">${t(`common.cancel`)}</button>
|
|
496
503
|
<button class="btn btn-primary" id="confirmImportBtn" style="width: auto;">${t(`toolbox.importBtn`)}</button>
|
|
497
504
|
</div>
|
|
498
|
-
`,n.appendChild(r),document.body.appendChild(n);let i=()=>n.remove();n.querySelector(`.modal-close-btn`).addEventListener(`click`,i),n.querySelector(`#cancelImportBtn`).addEventListener(`click`,i),n.querySelectorAll(`.import-tab`).forEach(e=>{e.addEventListener(`click`,()=>{n.querySelectorAll(`.import-tab`).forEach(e=>e.classList.remove(`active`)),e.classList.add(`active`),n.querySelectorAll(`.import-panel`).forEach(e=>e.classList.remove(`active`)),n.querySelector(`[data-panel="${e.dataset.tab}"]`).classList.add(`active`)})});let a=(e,t)=>{let r=n.querySelector(e),i=n.querySelector(t);!r||!i||(r.addEventListener(`click`,()=>i.click()),r.addEventListener(`dragover`,e=>{e.preventDefault(),r.style.borderColor=`#667eea`,r.style.background=`#f5f7ff`}),r.addEventListener(`dragleave`,()=>{r.style.borderColor=`#d0d5dd`,r.style.background=`#fafbfc`}),r.addEventListener(`drop`,e=>{e.preventDefault(),r.style.borderColor=`#d0d5dd`,r.style.background=`#fafbfc`;let t=e.dataTransfer.files;t.length>0&&(i.files=t,o(r,t[0].name))}),i.addEventListener(`change`,()=>{i.files&&i.files[0]&&o(r,i.files[0].name)}))},o=(e,t)=>{e.classList.add(`has-file`);let n=e.querySelector(`.file-name`);n&&n.remove();let r=document.createElement(`span`);r.className=`file-name`,r.textContent=`✓ ${t}`,e.appendChild(r)};a(`#jsonDropZone`,`#skillJsonFile`),a(`#zipDropZone`,`#skillZipFile`),n.querySelector(`#confirmImportBtn`).addEventListener(`click`,async()=>{let e=n.querySelector(`.import-tab.active`)?.dataset.tab;try{if(e===`json`){let e=n.querySelector(`#skillJsonFile`).files[0];if(!e)return U(t(`toolbox.selectJsonFile`),`warning`);let r=await e.text(),i=JSON.parse(r);await Bn(i),U(t(`toolbox.workflowSkillImported`,{name:i.name}),`success`)}else if(e===`markdown`){let e=n.querySelector(`#quickAgentName`).value.trim(),r=n.querySelector(`#quickAgentDesc`).value.trim(),i=n.querySelector(`#quickAgentMarkdown`).value.trim();if(!e)return U(t(`toolbox.skillNameRequired`),`warning`);if(!i)return U(t(`toolbox.skillMarkdownRequired`),`warning`);let a=await K(`POST`,`/api/skill/save-markdown`,{name:e,description:r,version:`1.0`,markdown:i});if(a.success)U(t(`toolbox.agentSkillCreated`,{name:e}),`success`);else return U(a.error||t(`toolbox.createFailedShort`),`error`)}else if(e===`zip`){let e=n.querySelector(`#skillZipFile`).files[0];if(!e)return U(t(`toolbox.selectZipFile`),`warning`);if(e.size>52428800)return U(t(`toolbox.fileTooLarge`),`warning`);let r=await K(`POST`,`/api/skill/import-zip`,{zipData:await new Promise((n,r)=>{let i=new FileReader;i.onload=()=>n(i.result.split(`,`)[1]),i.onerror=()=>r(Error(t(`toolbox.fileReadFailed`))),i.readAsDataURL(e)})});if(r.success)U(t(`toolbox.agentSkillImported`,{name:r.skill?.name||`unknown`}),`success`);else return U(r.error||t(`toolbox.skillImportFailedShort`),`error`)}else if(e===`url`){let e=n.querySelector(`#skillUrl`).value.trim();if(!e)return U(t(`toolbox.urlRequired`),`warning`);let r=await K(`POST`,`/api/skill/import-url`,{url:e});if(r.success)U(t(`toolbox.agentSkillImported`,{name:r.skill?.name||`unknown`}),`success`);else return U(r.error||t(`toolbox.skillImportFailedShort`),`error`)}i(),cn()}catch(e){U(t(`toolbox.importFailed`,{error:e.message}),`error`)}})}function Zn(){let e=document.getElementById(`skillSearchInput`),t=document.querySelectorAll(`.toolbox-filter-tab[data-target="skill"]`);if(e){let t=null;e.addEventListener(`input`,()=>{clearTimeout(t),t=setTimeout(()=>{Fn=e.value.trim(),Rn(W.cachedSkills||[])},200)})}let n=document.getElementById(`skillSearchClear`);n&&n.addEventListener(`click`,()=>{e.value=``,Fn=``,Rn(W.cachedSkills||[]),e.focus()}),t.forEach(e=>{e.addEventListener(`click`,()=>{t.forEach(e=>e.classList.remove(`active`)),e.classList.add(`active`),In=e.dataset.filter,Rn(W.cachedSkills||[])})})}W.refreshCallback=J;function Qn(){try{chrome.runtime.sendMessage({type:`RELOAD_MCP_TOOLS`},e=>{e?.success&&r.debug(`[Toolbox] Background re loaded ${e.count} MCP tool`)})}catch{}}function $n(e){let n=document.getElementById(`mcpSection`);if(!n)return;let r=n.querySelector(`.toolbox-tool-count`);if(!r){r=document.createElement(`span`),r.className=`toolbox-tool-count`;let e=n.querySelector(`.toolbox-section-title`);e&&e.insertAdjacentElement(`afterend`,r)}let i=e.filter(e=>e.enabled!==!1).length,a=e.length;a===0?r.style.display=`none`:(r.textContent=t(`toolbox.enabledCountTotal`,{enabled:i,total:a}),r.style.display=``)}function er(e){let n=document.getElementById(`skillSection`);if(!n)return;let r=n.querySelector(`.toolbox-tool-count`);if(!r){r=document.createElement(`span`),r.className=`toolbox-tool-count`;let e=n.querySelector(`.toolbox-section-title`);e&&e.insertAdjacentElement(`afterend`,r)}let i=e.filter(e=>e.enabled!==!1).length,a=e.length;a===0?r.style.display=`none`:(r.textContent=t(`toolbox.enabledCountTotal`,{enabled:i,total:a}),r.style.display=``)}async function J(){let[e,n]=await Promise.all([pn(),Ln()]),r=e.servers||[],i=n.skills||[];mn(r),Rn(i),$n(r),er(i);let a=document.getElementById(`toolboxAgentStatus`);if(a){if(W.agentConnected){let e=W.agentName||t(`toolbox.unknownAgent`);a.innerHTML=`<span class="toolbox-status-dot connected"></span> ${t(`toolbox.currentAgentSupports`,{name:q(e)})}`,a.className=`toolbox-agent-status connected`}else a.innerHTML=`<span class="toolbox-status-dot disconnected"></span> ${t(`toolbox.agentNotConnectedHint`)}`,a.className=`toolbox-agent-status disconnected`}let o=!W.agentConnected,s=document.getElementById(`addMcpServerBtn`),c=document.getElementById(`importSkillBtn`),l=document.getElementById(`reloadSkillsBtn`);s&&(s.disabled=o),c&&(c.disabled=o),l&&(l.disabled=o)}function tr(e){W.cachedMcpServers.find(t=>t.id===e)&&(W.editingMcpId=e,document.getElementById(`mcpServerList`)&&mn(W.cachedMcpServers))}function nr(){W.editingMcpId=null,mn(W.cachedMcpServers)}async function rr(){let e=document.getElementById(`mcpEditId`),n=document.getElementById(`mcpEditName`),r=document.getElementById(`mcpEditCommand`),i=document.getElementById(`mcpEditArgs`),a=document.getElementById(`mcpEditUrl`),o=e?.value.trim(),s=n?.value.trim(),c=Tn(`mcpEdit`),l=r?.value.trim(),u=i?.value.trim(),d=a?.value.trim(),f=c===`sse`||c===`streamableHttp`||c===`websocket`;if(!o){Y(t(`toolbox.mcpIdRequired`),`warning`);return}if(f){if(!d){Y(t(`toolbox.mcpUrlRequired`),`warning`);return}}else if(!l){Y(t(`toolbox.mcpCommandRequired`),`warning`);return}let p={id:o,name:s||o,transport:c,command:l,args:u?u.split(/\s+/):[],url:d,env:gn(document.getElementById(`mcpEditEnvRows`)),headers:vn(document.getElementById(`mcpEditHeaderRows`)),enabled:W.cachedMcpServers.find(e=>e.id===W.editingMcpId)?.enabled!==!1};try{if(await kn(p),W.cachedMcpServers.find(e=>e.id===W.editingMcpId)?.connected){Y(t(`toolbox.mcpReconnecting`),`info`),await Mn(W.editingMcpId),await new Promise(e=>setTimeout(e,500));let e=await jn(o);if(e.success)Y(t(`toolbox.mcpUpdateReconnected`,{count:e.toolCount||0}),`success`);else{let n=e.error||t(`toolbox.mcpUnknownError`);Y(t(`toolbox.mcpUpdatedReconnectFailed`,{error:n}),`warning`)}}else Y(t(`toolbox.mcpUpdateSuccess`),`success`);W.editingMcpId=null,Qn(),await J()}catch(e){Y(t(`toolbox.mcpUpdateFailed`,{error:e.message}),`error`)}}function ir(e,n){let r={mcp:[`mcpToggleLabel`,`mcpSection`],skill:[`skillToggleLabel`,`skillSection`]},[i,a]=r[e]||r.mcp,o=document.getElementById(i),s=document.getElementById(a);o&&(o.textContent=t(n?`common.enabled`:`common.disabled`),o.style.color=n?`#666`:`#999`),s&&(n?s.classList.remove(`disabled-section`):s.classList.add(`disabled-section`))}function ar(){let e=document.getElementById(`mcpGlobalToggle`),n=document.getElementById(`skillGlobalToggle`);document.getElementById(`mcpToggleLabel`),document.getElementById(`skillToggleLabel`),document.getElementById(`mcpSection`),document.getElementById(`skillSection`),chrome.storage.local.get([`mcpEnabled`,`skillsEnabled`],t=>{let r=t.mcpEnabled===!0,i=t.skillsEnabled!==!1;e&&(e.checked=r),n&&(n.checked=i),ir(`mcp`,r),ir(`skill`,i)}),e&&e.addEventListener(`change`,()=>{let n=e.checked;chrome.storage.local.set({mcpEnabled:n}),ir(`mcp`,n),Y(t(n?`toolbox.mcpServiceEnabled`:`toolbox.mcpServiceDisabled`),`info`)}),n&&n.addEventListener(`change`,()=>{let e=n.checked;chrome.storage.local.set({skillsEnabled:e}),ir(`skill`,e),Y(t(e?`toolbox.skillServiceEnabled`:`toolbox.skillServiceDisabled`),`info`)});let i=document.getElementById(`addMcpServerBtn`);i&&i.addEventListener(`click`,()=>{let e=document.getElementById(`mcpAddForm`);e&&e.innerHTML.trim()?On():Dn()});let a=document.getElementById(`mcpAddForm`);a&&a.addEventListener(`click`,async e=>{if(e.target.dataset.action===`transport-change`){En(e.target);return}if(!bn(e)&&(e.target.id===`mcpAddCancel`&&On(),e.target.id===`mcpAddConfirm`)){let e=document.getElementById(`mcpAddId`)?.value.trim(),n=document.getElementById(`mcpAddName`)?.value.trim(),r=Tn(`mcpAdd`),i=document.getElementById(`mcpAddCommand`)?.value.trim(),a=document.getElementById(`mcpAddArgs`)?.value.trim(),o=document.getElementById(`mcpAddUrl`)?.value.trim(),s=r===`sse`||r===`streamableHttp`||r===`websocket`;if(!e){Y(t(`toolbox.mcpIdRequired`),`warning`);return}if(s){if(!o){Y(t(`toolbox.mcpUrlRequired`),`warning`);return}}else if(!i){Y(t(`toolbox.mcpCommandRequired`),`warning`);return}let c=document.getElementById(`mcpAddEnvRows`),l=document.getElementById(`mcpAddHeaderRows`),u={id:e,name:n||e,transport:r,command:i,args:a?a.split(/\s+/):[],url:o,env:c?gn(c):{},headers:l?vn(l):{},enabled:!0};try{await kn(u),Y(t(`toolbox.mcpAddSuccess`),`success`),On(),Qn(),await J()}catch(e){Y(t(`toolbox.mcpAddFailed`,{error:e.message}),`error`)}}});let o=document.getElementById(`mcpServerList`);o&&o.addEventListener(`click`,async e=>{if(e.target.dataset.action===`transport-change`){En(e.target);return}if(bn(e))return;let n=e.target.closest(`button, input`);if(!n)return;let r=n.dataset.action,i=n.dataset.mcpId;if(!(!r||!i))try{if(r===`connect`)Y(t(`toolbox.mcpConnecting`),`info`),await jn(i),Y(t(`toolbox.mcpConnectSuccess`),`success`),Qn(),await J();else if(r===`disconnect`)await Mn(i),Y(t(`toolbox.mcpDisconnectSuccess`),`success`),Qn(),await J();else if(r===`toggle`){let e=n.checked;await Nn(i,e),Y(t(e?`toolbox.mcpEnabledToast`:`toolbox.mcpDisabledToast`),`success`),Qn(),await J()}else if(r===`delete`){if(!await G(t(`toolbox.mcpConfirmDelete`),t(`toolbox.deleteConfirmTitle`)))return;await An(i),Y(t(`toolbox.deleteSuccess`),`success`),Qn(),await J()}else if(r===`edit`)tr(i);else if(r===`cancel-edit`)nr();else if(r===`save-edit`)await rr();else if(r===`toggle-tools`){let e=document.getElementById(`mcp-tools-${i}`),r=n;if(e){let n=e.style.display===`none`;e.style.display=n?`block`:`none`,r.innerHTML=n?`▼ ${t(`toolbox.collapseTools`,{count:e.children.length})}`:`▶ ${t(`toolbox.viewTools`,{count:e.children.length})}`}}}catch(e){Y(t(`toolbox.operationFailed`,{error:e.message}),`error`)}});let s=document.getElementById(`skillList`);s&&s.addEventListener(`click`,async e=>{let n=e.target.closest(`button`);if(!n)return;let i=n.dataset.action,a=n.dataset.skillName;if(n.classList.contains(`skill-expand-btn`)){let e=n.dataset.target;if(e===`desc`){let e=n.previousElementSibling;e&&e.classList.contains(`skill-card-desc`)&&(e.textContent=decodeURIComponent(n.dataset.full||``),n.remove())}else if(e===`resources`)try{let e=JSON.parse(decodeURIComponent(n.dataset.full||`[]`)),r=n.parentElement;r&&r.classList.contains(`skill-card-params`)&&(r.innerHTML=e.map(e=>`<span class="skill-param-tag" title="${t(`toolbox.sizeBytes`,{size:e.size})}">📄 ${q(e.name)}</span>`).join(``))}catch(e){r.error(`Failed to expand resources:`,e)}return}if(!(!i||!a))try{if(i===`delete-skill`){if(!await G(t(`toolbox.skillConfirmDelete`,{name:a}),t(`toolbox.deleteConfirmTitle`)))return;await Vn(a),Y(t(`toolbox.deleteSuccess`),`success`),await J()}else if(i===`toggle-skill`)Y(await Hn(a)?t(`toolbox.skillEnabledToast`,{name:a}):t(`toolbox.skillDisabledToast`,{name:a}),`success`),await J();else if(i===`run-skill`){let e=await K(`GET`,`/api/skill/detail?name=${encodeURIComponent(a)}`);if(!e?.success||!e.skill){Y(t(`toolbox.skillInfoFailed`,{error:e?.error||t(`agentConfig.unknownError`)}),`error`);return}let n=Wn(e.skill);if(n.hasRequired){let r=await Gn(a,n);if(r===null)return;Y(t(`toolbox.skillRunning`,{name:a}),`info`),Kn(a,e,await Un(a,r))}else Y(t(`toolbox.skillRunning`,{name:a}),`info`),Kn(a,e,await Un(a))}else if(i===`edit-agent-skill`)try{let e=await Jn(a);e.success?Yn(a,e):Y(e.error||t(`toolbox.skillContentFailed`),`error`)}catch(e){Y(t(`toolbox.skillGetFailed`,{error:e.message}),`error`)}else if(i===`view-agent-skill`)try{let e=await Jn(a);e.success?ln(a,e):Y(e.error||t(`toolbox.skillContentFailed`),`error`)}catch(e){Y(t(`toolbox.skillGetFailed`,{error:e.message}),`error`)}}catch(e){Y(t(`toolbox.operationFailed`,{error:e.message}),`error`)}});let c=document.getElementById(`importSkillBtn`);c&&c.addEventListener(`click`,()=>Xn());let l=document.getElementById(`reloadSkillsBtn`);l&&l.addEventListener(`click`,async()=>{try{let e=await qn();Y(t(`toolbox.skillsReloaded`,{count:e.count||0}),`success`),await J()}catch(e){Y(t(`toolbox.skillsReloadFailed`,{error:e.message}),`error`)}}),Pn(),Zn(),J()}function Y(e,t=`info`){let n=document.getElementById(`toastContainer`);if(!n)return;let r=document.createElement(`div`);r.className=`toast ${t}`,r.textContent=e,n.appendChild(r),requestAnimationFrame(()=>r.classList.add(`toast-show`)),setTimeout(()=>{r.classList.remove(`toast-show`),setTimeout(()=>r.remove(),300)},2500)}var or=2e3,sr=[`vectra`,`@huggingface/transformers`,`pdf-parse`,`mammoth`,`officeparser`,`cheerio`],cr=null,lr=null;function ur(e){lr=e}async function dr(){if(await un(),!W.agentConnected)return{connected:!1,ragAvailable:!1,nodeVersion:null};try{let e=await K(`GET`,`/api/status`);return{connected:!0,ragAvailable:e.ragAvailable===!0,nodeVersion:e.nodeVersion||null}}catch(e){return r.warn(`[RAG] Failed to fetch agent status:`,e.message),{connected:!0,ragAvailable:!1,nodeVersion:null,unreachable:!0}}}async function fr(){try{return await K(`GET`,`/api/rag/install/status`)}catch(e){return r.warn(`[RAG] Failed to fetch install status:`,e.message),null}}function pr(){try{chrome.runtime.sendMessage({type:`RELOAD_RAG_TOOLS`},e=>{e?.success&&r.debug(`[Toolbox] Background re loaded ${e.count} RAG tool`)})}catch{}}function mr(e){if(!e)return!0;let t=parseInt(String(e).replace(/^v/i,``),10);return!Number.isFinite(t)||t>=22}function hr(e,t,n,r=``){return`
|
|
505
|
+
`,n.appendChild(r),document.body.appendChild(n);let i=()=>n.remove();n.querySelector(`.modal-close-btn`).addEventListener(`click`,i),n.querySelector(`#cancelImportBtn`).addEventListener(`click`,i),n.querySelectorAll(`.import-tab`).forEach(e=>{e.addEventListener(`click`,()=>{n.querySelectorAll(`.import-tab`).forEach(e=>e.classList.remove(`active`)),e.classList.add(`active`),n.querySelectorAll(`.import-panel`).forEach(e=>e.classList.remove(`active`)),n.querySelector(`[data-panel="${e.dataset.tab}"]`).classList.add(`active`)})});let a=(e,t)=>{let r=n.querySelector(e),i=n.querySelector(t);!r||!i||(r.addEventListener(`click`,()=>i.click()),r.addEventListener(`dragover`,e=>{e.preventDefault(),r.style.borderColor=`var(--brand-500)`,r.style.background=`var(--brand-soft-bg)`}),r.addEventListener(`dragleave`,()=>{r.style.borderColor=`var(--border-default)`,r.style.background=`var(--bg-subtle)`}),r.addEventListener(`drop`,e=>{e.preventDefault(),r.style.borderColor=`var(--border-default)`,r.style.background=`var(--bg-subtle)`;let t=e.dataTransfer.files;t.length>0&&(i.files=t,o(r,t[0].name))}),i.addEventListener(`change`,()=>{i.files&&i.files[0]&&o(r,i.files[0].name)}))},o=(e,t)=>{e.classList.add(`has-file`);let n=e.querySelector(`.file-name`);n&&n.remove();let r=document.createElement(`span`);r.className=`file-name`,r.textContent=`✓ ${t}`,e.appendChild(r)};a(`#jsonDropZone`,`#skillJsonFile`),a(`#zipDropZone`,`#skillZipFile`),n.querySelector(`#confirmImportBtn`).addEventListener(`click`,async()=>{let e=n.querySelector(`.import-tab.active`)?.dataset.tab;try{if(e===`json`){let e=n.querySelector(`#skillJsonFile`).files[0];if(!e)return H(t(`toolbox.selectJsonFile`),`warning`);let r=await e.text(),i=JSON.parse(r);await Qn(i),H(t(`toolbox.workflowSkillImported`,{name:i.name}),`success`)}else if(e===`markdown`){let e=n.querySelector(`#quickAgentName`).value.trim(),r=n.querySelector(`#quickAgentDesc`).value.trim(),i=n.querySelector(`#quickAgentMarkdown`).value.trim();if(!e)return H(t(`toolbox.skillNameRequired`),`warning`);if(!i)return H(t(`toolbox.skillMarkdownRequired`),`warning`);let a=await K(`POST`,`/api/skill/save-markdown`,{name:e,description:r,version:`1.0`,markdown:i});if(a.success)H(t(`toolbox.agentSkillCreated`,{name:e}),`success`);else return H(a.error||t(`toolbox.createFailedShort`),`error`)}else if(e===`zip`){let e=n.querySelector(`#skillZipFile`).files[0];if(!e)return H(t(`toolbox.selectZipFile`),`warning`);if(e.size>50*1024*1024)return H(t(`toolbox.fileTooLarge`),`warning`);let r=await K(`POST`,`/api/skill/import-zip`,{zipData:await new Promise((n,r)=>{let i=new FileReader;i.onload=()=>n(i.result.split(`,`)[1]),i.onerror=()=>r(Error(t(`toolbox.fileReadFailed`))),i.readAsDataURL(e)})});if(r.success)H(t(`toolbox.agentSkillImported`,{name:r.skill?.name||`unknown`}),`success`);else return H(r.error||t(`toolbox.skillImportFailedShort`),`error`)}else if(e===`url`){let e=n.querySelector(`#skillUrl`).value.trim();if(!e)return H(t(`toolbox.urlRequired`),`warning`);let r=await K(`POST`,`/api/skill/import-url`,{url:e});if(r.success)H(t(`toolbox.agentSkillImported`,{name:r.skill?.name||`unknown`}),`success`);else return H(r.error||t(`toolbox.skillImportFailedShort`),`error`)}i(),bn()}catch(e){H(t(`toolbox.importFailed`,{error:e.message}),`error`)}})}function lr(){let e=document.getElementById(`skillSearchInput`),t=document.querySelectorAll(`.toolbox-filter-tab[data-target="skill"]`);if(e){let t=null;e.addEventListener(`input`,()=>{clearTimeout(t),t=setTimeout(()=>{qn=e.value.trim(),Xn(W.cachedSkills||[])},200)})}let n=document.getElementById(`skillSearchClear`);n&&n.addEventListener(`click`,()=>{e.value=``,qn=``,Xn(W.cachedSkills||[]),e.focus()}),t.forEach(e=>{e.addEventListener(`click`,()=>{t.forEach(e=>e.classList.remove(`active`)),e.classList.add(`active`),Jn=e.dataset.filter,Xn(W.cachedSkills||[])})})}W.refreshCallback=J;function ur(){try{chrome.runtime.sendMessage({type:`RELOAD_MCP_TOOLS`},e=>{e?.success&&r.debug(`[Toolbox] Background re loaded ${e.count} MCP tool`)})}catch{}}function dr(e){let n=document.getElementById(`mcpSection`);if(!n)return;let r=n.querySelector(`.toolbox-tool-count`);if(!r){r=document.createElement(`span`),r.className=`toolbox-tool-count`;let e=n.querySelector(`.toolbox-section-title`);e&&e.insertAdjacentElement(`afterend`,r)}let i=e.filter(e=>e.enabled!==!1).length,a=e.length;a===0?r.style.display=`none`:(r.textContent=t(`toolbox.enabledCountTotal`,{enabled:i,total:a}),r.style.display=``)}function fr(e){let n=document.getElementById(`skillSection`);if(!n)return;let r=n.querySelector(`.toolbox-tool-count`);if(!r){r=document.createElement(`span`),r.className=`toolbox-tool-count`;let e=n.querySelector(`.toolbox-section-title`);e&&e.insertAdjacentElement(`afterend`,r)}let i=e.filter(e=>e.enabled!==!1).length,a=e.length;a===0?r.style.display=`none`:(r.textContent=t(`toolbox.enabledCountTotal`,{enabled:i,total:a}),r.style.display=``)}async function J(){let[e,n]=await Promise.all([Tn(),Yn()]),r=e.servers||[],i=n.skills||[];En(r),Xn(i),dr(r),fr(i);let a=document.getElementById(`toolboxAgentStatus`);a&&(W.agentConnected?(a.innerHTML=`<span class="toolbox-status-dot connected"></span> ${t(`toolbox.currentAgentSupports`,{name:q(W.agentName||t(`toolbox.unknownAgent`))})}`,a.className=`toolbox-agent-status connected`):(a.innerHTML=`<span class="toolbox-status-dot disconnected"></span> ${t(`toolbox.agentNotConnectedHint`)}`,a.className=`toolbox-agent-status disconnected`));let o=!W.agentConnected,s=document.getElementById(`addMcpServerBtn`),c=document.getElementById(`importSkillBtn`),l=document.getElementById(`reloadSkillsBtn`);s&&(s.disabled=o),c&&(c.disabled=o),l&&(l.disabled=o)}function pr(e){W.cachedMcpServers.find(t=>t.id===e)&&(W.editingMcpId=e,document.getElementById(`mcpServerList`)&&En(W.cachedMcpServers))}function mr(){W.editingMcpId=null,En(W.cachedMcpServers)}async function hr(){let e=document.getElementById(`mcpEditId`),n=document.getElementById(`mcpEditName`),r=document.getElementById(`mcpEditCommand`),i=document.getElementById(`mcpEditArgs`),a=document.getElementById(`mcpEditUrl`),o=e?.value.trim(),s=n?.value.trim(),c=Ln(`mcpEdit`),l=r?.value.trim(),u=i?.value.trim(),d=a?.value.trim(),f=c===`sse`||c===`streamableHttp`||c===`websocket`;if(!o){Y(t(`toolbox.mcpIdRequired`),`warning`);return}if(f){if(!d){Y(t(`toolbox.mcpUrlRequired`),`warning`);return}}else if(!l){Y(t(`toolbox.mcpCommandRequired`),`warning`);return}let p={id:o,name:s||o,transport:c,command:l,args:u?u.split(/\s+/):[],url:d,env:On(document.getElementById(`mcpEditEnvRows`)),headers:An(document.getElementById(`mcpEditHeaderRows`)),enabled:W.cachedMcpServers.find(e=>e.id===W.editingMcpId)?.enabled!==!1};try{if(await Vn(p),W.cachedMcpServers.find(e=>e.id===W.editingMcpId)?.connected){Y(t(`toolbox.mcpReconnecting`),`info`),await Wn(W.editingMcpId),await new Promise(e=>setTimeout(e,500));let e=await Un(o);e.success?Y(t(`toolbox.mcpUpdateReconnected`,{count:e.toolCount||0}),`success`):Y(t(`toolbox.mcpUpdatedReconnectFailed`,{error:e.error||t(`toolbox.mcpUnknownError`)}),`warning`)}else Y(t(`toolbox.mcpUpdateSuccess`),`success`);W.editingMcpId=null,ur(),await J()}catch(e){Y(t(`toolbox.mcpUpdateFailed`,{error:e.message}),`error`)}}function gr(e,n){let r={mcp:[`mcpToggleLabel`,`mcpSection`],skill:[`skillToggleLabel`,`skillSection`]},[i,a]=r[e]||r.mcp,o=document.getElementById(i),s=document.getElementById(a);o&&(o.textContent=t(n?`common.enabled`:`common.disabled`),o.style.color=n?`var(--text-secondary)`:`var(--text-tertiary)`),s&&(n?s.classList.remove(`disabled-section`):s.classList.add(`disabled-section`))}function _r(){let e=document.getElementById(`mcpGlobalToggle`),n=document.getElementById(`skillGlobalToggle`);document.getElementById(`mcpToggleLabel`),document.getElementById(`skillToggleLabel`),document.getElementById(`mcpSection`),document.getElementById(`skillSection`),chrome.storage.local.get([`mcpEnabled`,`skillsEnabled`],t=>{let r=t.mcpEnabled===!0,i=t.skillsEnabled!==!1;e&&(e.checked=r),n&&(n.checked=i),gr(`mcp`,r),gr(`skill`,i)}),e&&e.addEventListener(`change`,()=>{let n=e.checked;chrome.storage.local.set({mcpEnabled:n}),gr(`mcp`,n),Y(t(n?`toolbox.mcpServiceEnabled`:`toolbox.mcpServiceDisabled`),`info`)}),n&&n.addEventListener(`change`,()=>{let e=n.checked;chrome.storage.local.set({skillsEnabled:e}),gr(`skill`,e),Y(t(e?`toolbox.skillServiceEnabled`:`toolbox.skillServiceDisabled`),`info`)});let i=document.getElementById(`addMcpServerBtn`);i&&i.addEventListener(`click`,()=>{let e=document.getElementById(`mcpAddForm`);e&&e.innerHTML.trim()?Bn():zn()});let a=document.getElementById(`mcpAddForm`);a&&a.addEventListener(`click`,async e=>{if(e.target.dataset.action===`transport-change`){Rn(e.target);return}if(!Mn(e)&&(e.target.id===`mcpAddCancel`&&Bn(),e.target.id===`mcpAddConfirm`)){let e=document.getElementById(`mcpAddId`)?.value.trim(),n=document.getElementById(`mcpAddName`)?.value.trim(),r=Ln(`mcpAdd`),i=document.getElementById(`mcpAddCommand`)?.value.trim(),a=document.getElementById(`mcpAddArgs`)?.value.trim(),o=document.getElementById(`mcpAddUrl`)?.value.trim(),s=r===`sse`||r===`streamableHttp`||r===`websocket`;if(!e){Y(t(`toolbox.mcpIdRequired`),`warning`);return}if(s){if(!o){Y(t(`toolbox.mcpUrlRequired`),`warning`);return}}else if(!i){Y(t(`toolbox.mcpCommandRequired`),`warning`);return}let c=document.getElementById(`mcpAddEnvRows`),l=document.getElementById(`mcpAddHeaderRows`),u={id:e,name:n||e,transport:r,command:i,args:a?a.split(/\s+/):[],url:o,env:c?On(c):{},headers:l?An(l):{},enabled:!0};try{await Vn(u),Y(t(`toolbox.mcpAddSuccess`),`success`),Bn(),ur(),await J()}catch(e){Y(t(`toolbox.mcpAddFailed`,{error:e.message}),`error`)}}});let o=document.getElementById(`mcpServerList`);o&&o.addEventListener(`click`,async e=>{if(e.target.dataset.action===`transport-change`){Rn(e.target);return}if(Mn(e))return;let n=e.target.closest(`button, input`);if(!n)return;let r=n.dataset.action,i=n.dataset.mcpId;if(!(!r||!i))try{if(r===`connect`)Y(t(`toolbox.mcpConnecting`),`info`),await Un(i),Y(t(`toolbox.mcpConnectSuccess`),`success`),ur(),await J();else if(r===`disconnect`)await Wn(i),Y(t(`toolbox.mcpDisconnectSuccess`),`success`),ur(),await J();else if(r===`toggle`){let e=n.checked;await Gn(i,e),Y(t(e?`toolbox.mcpEnabledToast`:`toolbox.mcpDisabledToast`),`success`),ur(),await J()}else if(r===`delete`){if(!await G(t(`toolbox.mcpConfirmDelete`),t(`toolbox.deleteConfirmTitle`)))return;await Hn(i),Y(t(`toolbox.deleteSuccess`),`success`),ur(),await J()}else if(r===`edit`)pr(i);else if(r===`cancel-edit`)mr();else if(r===`save-edit`)await hr();else if(r===`toggle-tools`){let e=document.getElementById(`mcp-tools-${i}`),r=n;if(e){let n=e.style.display===`none`;e.style.display=n?`block`:`none`,r.innerHTML=n?`▼ ${t(`toolbox.collapseTools`,{count:e.children.length})}`:`▶ ${t(`toolbox.viewTools`,{count:e.children.length})}`}}}catch(e){Y(t(`toolbox.operationFailed`,{error:e.message}),`error`)}});let s=document.getElementById(`skillList`);s&&s.addEventListener(`click`,async e=>{let n=e.target.closest(`button`);if(!n)return;let i=n.dataset.action,a=n.dataset.skillName;if(n.classList.contains(`skill-expand-btn`)){let e=n.dataset.target;if(e===`desc`){let e=n.previousElementSibling;e&&e.classList.contains(`skill-card-desc`)&&(e.textContent=decodeURIComponent(n.dataset.full||``),n.remove())}else if(e===`resources`)try{let e=JSON.parse(decodeURIComponent(n.dataset.full||`[]`)),r=n.parentElement;r&&r.classList.contains(`skill-card-params`)&&(r.innerHTML=e.map(e=>`<span class="skill-param-tag" title="${t(`toolbox.sizeBytes`,{size:e.size})}">📄 ${q(e.name)}</span>`).join(``))}catch(e){r.error(`Failed to expand resources:`,e)}return}if(!(!i||!a))try{if(i===`delete-skill`){if(!await G(t(`toolbox.skillConfirmDelete`,{name:a}),t(`toolbox.deleteConfirmTitle`)))return;await $n(a),Y(t(`toolbox.deleteSuccess`),`success`),await J()}else if(i===`toggle-skill`)Y(await er(a)?t(`toolbox.skillEnabledToast`,{name:a}):t(`toolbox.skillDisabledToast`,{name:a}),`success`),await J();else if(i===`run-skill`){let e=await K(`GET`,`/api/skill/detail?name=${encodeURIComponent(a)}`);if(!e?.success||!e.skill){Y(t(`toolbox.skillInfoFailed`,{error:e?.error||t(`agentConfig.unknownError`)}),`error`);return}let n=nr(e.skill);if(n.hasRequired){let r=await rr(a,n);if(r===null)return;Y(t(`toolbox.skillRunning`,{name:a}),`info`),ir(a,e,await tr(a,r))}else Y(t(`toolbox.skillRunning`,{name:a}),`info`),ir(a,e,await tr(a))}else if(i===`edit-agent-skill`)try{let e=await or(a);e.success?sr(a,e):Y(e.error||t(`toolbox.skillContentFailed`),`error`)}catch(e){Y(t(`toolbox.skillGetFailed`,{error:e.message}),`error`)}else if(i===`view-agent-skill`)try{let e=await or(a);e.success?xn(a,e):Y(e.error||t(`toolbox.skillContentFailed`),`error`)}catch(e){Y(t(`toolbox.skillGetFailed`,{error:e.message}),`error`)}}catch(e){Y(t(`toolbox.operationFailed`,{error:e.message}),`error`)}});let c=document.getElementById(`importSkillBtn`);c&&c.addEventListener(`click`,()=>cr());let l=document.getElementById(`reloadSkillsBtn`);l&&l.addEventListener(`click`,async()=>{try{Y(t(`toolbox.skillsReloaded`,{count:(await ar()).count||0}),`success`),await J()}catch(e){Y(t(`toolbox.skillsReloadFailed`,{error:e.message}),`error`)}}),Kn(),lr(),J()}function Y(e,t=`info`){let n=document.getElementById(`toastContainer`);if(!n)return;let r=document.createElement(`div`);r.className=`toast ${t}`,r.textContent=e,n.appendChild(r),requestAnimationFrame(()=>r.classList.add(`toast-show`)),setTimeout(()=>{r.classList.remove(`toast-show`),setTimeout(()=>r.remove(),300)},2500)}var vr=2e3,yr=[`vectra`,`@huggingface/transformers`,`pdf-parse`,`mammoth`,`officeparser`,`cheerio`],br=null,xr=null;function Sr(e){xr=e}async function Cr(){if(await Sn(),!W.agentConnected)return{connected:!1,ragAvailable:!1,nodeVersion:null};try{let e=await K(`GET`,`/api/status`);return{connected:!0,ragAvailable:e.ragAvailable===!0,nodeVersion:e.nodeVersion||null}}catch(e){return r.warn(`[RAG] Failed to fetch agent status:`,e.message),{connected:!0,ragAvailable:!1,nodeVersion:null,unreachable:!0}}}async function wr(){try{return await K(`GET`,`/api/rag/install/status`)}catch(e){return r.warn(`[RAG] Failed to fetch install status:`,e.message),null}}function Tr(){try{chrome.runtime.sendMessage({type:`RELOAD_RAG_TOOLS`},e=>{e?.success&&r.debug(`[Toolbox] Background re loaded ${e.count} RAG tool`)})}catch{}}function Er(e){if(!e)return!0;let t=parseInt(String(e).replace(/^v/i,``),10);return!Number.isFinite(t)||t>=22}function Dr(e,t,n,r=``){return`
|
|
499
506
|
<div class="toolbox-empty" style="text-align:left; padding:20px 16px;">
|
|
500
507
|
<div class="toolbox-empty-title" style="display:flex; align-items:center; gap:8px; font-size:14px;">
|
|
501
508
|
<span style="font-size:20px;">${e}</span><span>${t}</span>
|
|
502
509
|
</div>
|
|
503
510
|
<div class="toolbox-empty-desc" style="margin-top:6px; line-height:1.6;">${n}</div>
|
|
504
511
|
${r}
|
|
505
|
-
</div>`}function
|
|
512
|
+
</div>`}function Or(e){let n=e&&Array.isArray(e.packages)&&e.packages.length>0?e.packages:yr,r=`npm install ${n.join(` `)}`,i=e&&e.done&&!e.success,a=i&&Array.isArray(e.logTail)&&e.logTail.length>0?q(e.logTail.join(`
|
|
506
513
|
`)):``,o=i?`
|
|
507
|
-
<div style="margin-top:12px; padding:10px 12px; background
|
|
508
|
-
<div style="color
|
|
509
|
-
${a?`<div style="font-size:11px; color
|
|
510
|
-
<pre style="margin:0; max-height:130px; overflow:auto; font-size:11px; color
|
|
511
|
-
<div style="margin-top:8px; font-size:11px; color
|
|
512
|
-
</div>`:``,s=n.map(e=>`<code style="background
|
|
514
|
+
<div style="margin-top:12px; padding:10px 12px; background:var(--danger-soft-bg); border:1px solid var(--danger-soft-border); border-radius:6px;">
|
|
515
|
+
<div style="color:var(--danger-strong); font-weight:600; font-size:12px; margin-bottom:6px;">⚠️ ${q(e.error||t(`toolbox.ragInstallFailedToast`))}</div>
|
|
516
|
+
${a?`<div style="font-size:11px; color:var(--text-tertiary); margin-bottom:4px;">${t(`toolbox.ragInstallLogLabel`)}</div>
|
|
517
|
+
<pre style="margin:0; max-height:130px; overflow:auto; font-size:11px; color:var(--text-secondary); white-space:pre-wrap; word-break:break-all;">${a}</pre>`:``}
|
|
518
|
+
<div style="margin-top:8px; font-size:11px; color:var(--warning-strong); line-height:1.6;">💡 ${t(`toolbox.ragInstallFailedAdvice`)}</div>
|
|
519
|
+
</div>`:``,s=n.map(e=>`<code style="background:var(--border-subtle); padding:1px 6px; border-radius:4px; margin:0 6px 4px 0; font-size:12px; display:inline-block;">${q(e)}</code>`).join(``),c=`
|
|
513
520
|
<div style="margin-top:12px; font-size:13px;">
|
|
514
|
-
<div style="color
|
|
521
|
+
<div style="color:var(--text-secondary); margin-bottom:6px;"><strong>${t(`toolbox.ragInstallPackagesLabel`)}</strong></div>
|
|
515
522
|
<div style="margin-bottom:8px;">${s}</div>
|
|
516
|
-
<div style="color
|
|
517
|
-
<div style="color
|
|
518
|
-
<div style="color
|
|
523
|
+
<div style="color:var(--text-tertiary); font-size:12px; line-height:1.6; margin-bottom:4px;">${t(`toolbox.ragInstallRequirements`)}</div>
|
|
524
|
+
<div style="color:var(--text-secondary); font-size:12px; line-height:1.6; margin-bottom:10px;">💡 ${t(`toolbox.ragInstallNoRestartNeeded`)}</div>
|
|
525
|
+
<div style="color:var(--text-secondary); margin-bottom:6px;"><strong>${t(`toolbox.ragInstallCommandLabel`)}</strong></div>
|
|
519
526
|
<div style="display:flex; align-items:center; gap:8px;">
|
|
520
|
-
<code id="ragInstallCmd" style="flex:1; min-width:0; background
|
|
527
|
+
<code id="ragInstallCmd" style="flex:1; min-width:0; background:var(--code-bg); color:var(--code-fg); padding:8px 10px; border-radius:6px; font-size:12px; overflow-x:auto; white-space:nowrap; display:block;">${q(r)}</code>
|
|
521
528
|
<button class="toolbox-add-btn" id="ragCopyCmdBtn" style="width:auto; flex:none; margin:0; padding:6px 12px; font-size:12px;">${t(`toolbox.ragCopyCmd`)}</button>
|
|
522
529
|
</div>
|
|
523
530
|
${o}
|
|
524
531
|
</div>
|
|
525
532
|
<div style="margin-top:16px; display:flex; gap:10px;">
|
|
526
|
-
<button class="toolbox-add-btn" id="ragInstallBtn" style="width:auto; flex:none; margin:0; padding:8px 18px; border-style:solid; color
|
|
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>
|
|
527
534
|
<button class="toolbox-add-btn" id="ragRedetectBtn" style="width:auto; flex:none; margin:0; padding:8px 18px;">${t(`toolbox.ragRedetectBtn`)}</button>
|
|
528
|
-
</div>`;return
|
|
529
|
-
`)):``,a=i?`<pre style="margin-top:12px; max-height:160px; overflow:auto; background
|
|
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=`
|
|
530
537
|
<div class="toolbox-empty" style="text-align:left; padding:24px 20px;">
|
|
531
|
-
<div style="display:flex; align-items:center; gap:10px; font-size:15px; font-weight:600; color
|
|
538
|
+
<div style="display:flex; align-items:center; gap:10px; font-size:15px; font-weight:600; color:var(--text-secondary);">
|
|
532
539
|
<span style="font-size:22px;">${i.icon}</span><span>${q(i.title)}</span>
|
|
533
540
|
</div>
|
|
534
|
-
<div style="margin-top:8px; line-height:1.7; color
|
|
541
|
+
<div style="margin-top:8px; line-height:1.7; color:var(--text-tertiary); font-size:13px;">${q(i.desc)}</div>
|
|
535
542
|
${a}
|
|
536
|
-
</div>`}async function X(){let e=document.getElementById(`knowledgeList`);if(e){e.innerHTML
|
|
543
|
+
</div>`}async function X(){let e=document.getElementById(`knowledgeList`);if(e){e.innerHTML=$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=`
|
|
537
544
|
<div class="toolbox-empty" style="grid-column:1/-1;">
|
|
538
545
|
<div class="toolbox-empty-icon">⚠️</div>
|
|
539
546
|
<div class="toolbox-empty-title">${q(t(`knowledge.loadFailed`,{error:n.message}))}</div>
|
|
540
547
|
<button class="toolbox-add-btn" id="kbRetryBtn" style="width:auto; margin-top:12px; padding:8px 18px;">${q(t(`knowledge.retry`))}</button>
|
|
541
|
-
</div>`}}}function
|
|
548
|
+
</div>`}}}function $r(){return`
|
|
542
549
|
<div class="toolbox-empty" style="grid-column:1/-1;">
|
|
543
550
|
<div class="toolbox-empty-icon">⏳</div>
|
|
544
551
|
<div class="toolbox-empty-title">${q(t(`toolbox.loading`))}</div>
|
|
545
|
-
</div>`}function
|
|
552
|
+
</div>`}function ei(e){let n=document.getElementById(`knowledgeList`);if(!n)return;if(e.length===0){ni(e),n.innerHTML=`
|
|
546
553
|
<div class="toolbox-empty" style="grid-column:1/-1; padding:50px 20px;">
|
|
547
554
|
<div class="toolbox-empty-icon">📚</div>
|
|
548
555
|
<div class="toolbox-empty-title">${q(t(`knowledge.emptyTitle`))}</div>
|
|
549
556
|
<div class="toolbox-empty-desc">${q(t(`knowledge.emptyDesc`))}</div>
|
|
550
|
-
</div>`;return}let r=e.filter(e=>
|
|
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=`
|
|
551
558
|
<div class="toolbox-empty" style="grid-column:1/-1; padding:50px 20px;">
|
|
552
559
|
<div class="toolbox-empty-icon">🔍</div>
|
|
553
560
|
<div class="toolbox-empty-title">${q(t(`toolbox.noMatchResult`))}</div>
|
|
554
|
-
</div>`;return}n.innerHTML=r.map(
|
|
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`
|
|
555
562
|
<div class="kb-card${n?` kb-card-disabled`:``}" data-kb-id="${q(e.id)}">
|
|
556
563
|
<div class="kb-card-title">
|
|
557
564
|
<span>📚</span>
|
|
@@ -569,7 +576,7 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
569
576
|
<button class="kb-action-btn" type="button" data-action="toggle">${q(t(n?`knowledge.actionEnable`:`knowledge.actionDisable`))}</button>
|
|
570
577
|
<button class="kb-action-btn kb-action-danger" type="button" data-action="delete">${q(t(`knowledge.actionDelete`))}</button>
|
|
571
578
|
</div>
|
|
572
|
-
</div>`}function
|
|
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`
|
|
573
580
|
<div class="form-group">
|
|
574
581
|
<label>${q(t(`knowledge.vectorSectionTitle`))}</label>
|
|
575
582
|
<div class="kb-radio-row">
|
|
@@ -605,7 +612,7 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
605
612
|
</div>
|
|
606
613
|
</div>
|
|
607
614
|
</div>
|
|
608
|
-
</div>`}function
|
|
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:`
|
|
609
616
|
<div class="form-group">
|
|
610
617
|
<label>${q(t(`knowledge.nameLabel`))}</label>
|
|
611
618
|
<input type="text" id="kbEditName" maxlength="100" placeholder="${q(t(`knowledge.namePlaceholder`))}" value="${q(e.name||``)}">
|
|
@@ -614,7 +621,7 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
614
621
|
<label>${q(t(`knowledge.descLabel`))}</label>
|
|
615
622
|
<input type="text" id="kbEditDesc" maxlength="500" placeholder="${q(t(`knowledge.descPlaceholder`))}" value="${q(e.description||``)}">
|
|
616
623
|
</div>
|
|
617
|
-
${
|
|
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:`
|
|
618
625
|
<div class="form-group">
|
|
619
626
|
<label>${q(t(`knowledge.nameLabel`))}</label>
|
|
620
627
|
<input type="text" id="kbCreateName" maxlength="100" placeholder="${q(t(`knowledge.namePlaceholder`))}">
|
|
@@ -623,7 +630,7 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
623
630
|
<label>${q(t(`knowledge.descLabel`))}</label>
|
|
624
631
|
<input type="text" id="kbCreateDesc" maxlength="500" placeholder="${q(t(`knowledge.descPlaceholder`))}">
|
|
625
632
|
</div>
|
|
626
|
-
${
|
|
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=`
|
|
627
634
|
<div class="import-tabs" id="kbIngestTabs">
|
|
628
635
|
<button type="button" class="import-tab active" data-tab="file">${q(t(`knowledge.tabFile`))}</button>
|
|
629
636
|
<button type="button" class="import-tab" data-tab="text">${q(t(`knowledge.tabText`))}</button>
|
|
@@ -632,11 +639,11 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
632
639
|
<div class="import-panel active" data-panel="file">
|
|
633
640
|
<div class="upload-drop-zone" id="kbDropzone">
|
|
634
641
|
<div class="upload-icon">📄</div>
|
|
635
|
-
<div style="margin-top:8px; color
|
|
636
|
-
<div style="margin-top:6px; font-size:12px; color
|
|
637
|
-
<div id="kbSelectedFile" style="display:none; margin-top:8px; color
|
|
642
|
+
<div style="margin-top:8px; color:var(--text-secondary); font-size:13px;">${q(t(`knowledge.dropHint`))}</div>
|
|
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>
|
|
638
645
|
</div>
|
|
639
|
-
<input type="file" id="kbFileInput" style="display:none" accept="${
|
|
646
|
+
<input type="file" id="kbFileInput" style="display:none" accept="${Ur}">
|
|
640
647
|
</div>
|
|
641
648
|
<div class="import-panel" data-panel="text">
|
|
642
649
|
<div class="form-group">
|
|
@@ -657,20 +664,20 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
657
664
|
<div class="kb-chunk-row">
|
|
658
665
|
<span class="kb-chunk-title">${q(t(`knowledge.chunkSettingsTitle`))}</span>
|
|
659
666
|
<label class="kb-chunk-inline">${q(t(`knowledge.chunkSizeLabel`))}
|
|
660
|
-
<input type="number" id="kbChunkSize" min="100" max="2000" step="50" value="${
|
|
667
|
+
<input type="number" id="kbChunkSize" min="100" max="2000" step="50" value="${zr}">
|
|
661
668
|
</label>
|
|
662
669
|
<label class="kb-chunk-inline">${q(t(`knowledge.chunkOverlapLabel`))}
|
|
663
|
-
<input type="number" id="kbChunkOverlap" min="0" max="500" step="10" value="${
|
|
670
|
+
<input type="number" id="kbChunkOverlap" min="0" max="500" step="10" value="${Br}">
|
|
664
671
|
</label>
|
|
665
672
|
</div>
|
|
666
|
-
<div id="kbIngestStatus" class="kb-status" style="display:none;">⏳ ${q(t(`knowledge.ingesting`))}</div>`,r=null,i=
|
|
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=>`
|
|
667
674
|
<div class="kb-doc-row" data-doc-id="${q(e.id)}">
|
|
668
675
|
<div class="kb-doc-info">
|
|
669
676
|
<div class="kb-doc-name" title="${q(e.name)}">${q(e.name)}</div>
|
|
670
|
-
<div class="kb-doc-meta">${q(t(`knowledge.docChunkCount`,{count:e.chunkCount}))} · ${q(
|
|
677
|
+
<div class="kb-doc-meta">${q(t(`knowledge.docChunkCount`,{count:e.chunkCount}))} · ${q(xi(e.createdAt))}</div>
|
|
671
678
|
</div>
|
|
672
679
|
<button class="kb-doc-del" type="button" data-doc-delete title="${q(t(`knowledge.actionDelete`))}">✕</button>
|
|
673
|
-
</div>`).join(``)}</div>`}catch(n){e.innerHTML=`<div class="kb-status" style="color
|
|
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=`
|
|
674
681
|
<div class="kb-search-scope">${q(t(`knowledge.searchScope`,{name:e.name}))}</div>
|
|
675
682
|
<div class="kb-search-bar">
|
|
676
683
|
<input type="text" id="kbSearchQuery" placeholder="${q(t(`knowledge.searchQueryPlaceholder`))}">
|
|
@@ -678,13 +685,13 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
678
685
|
</div>
|
|
679
686
|
<div class="kb-search-opts">
|
|
680
687
|
<label class="kb-chunk-inline">${q(t(`knowledge.searchTopKLabel`))}
|
|
681
|
-
<input type="number" id="kbSearchTopK" min="1" max="20" value="${
|
|
688
|
+
<input type="number" id="kbSearchTopK" min="1" max="20" value="${Vr}">
|
|
682
689
|
</label>
|
|
683
690
|
<label class="kb-chunk-inline">${q(t(`knowledge.searchThresholdLabel`))}
|
|
684
|
-
<input type="number" id="kbSearchThreshold" min="0" max="1" step="0.05" value="${
|
|
691
|
+
<input type="number" id="kbSearchThreshold" min="0" max="1" step="0.05" value="${Hr}">
|
|
685
692
|
</label>
|
|
686
693
|
</div>
|
|
687
|
-
<div id="kbSearchResults"></div>`,{overlay:r}=
|
|
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=`
|
|
688
695
|
${n.fallback?`<div class="kb-fallback-hint">⚠️ ${q(t(`knowledge.searchFallbackHint`))}</div>`:``}
|
|
689
696
|
<div class="kb-hit-count">${q(t(`knowledge.searchHitCount`,{count:r.length}))}</div>
|
|
690
697
|
<div class="kb-hit-list">${r.map(e=>`
|
|
@@ -694,7 +701,7 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
694
701
|
<span class="kb-hit-doc" title="${q(e.metadata?.documentName||``)}">${q(e.metadata?.documentName||``)}</span>
|
|
695
702
|
</div>
|
|
696
703
|
<div class="kb-hit-text">${q(e.content||``)}</div>
|
|
697
|
-
</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
|
|
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=`
|
|
698
705
|
<div class="modal-content kb-modal${s?` kb-modal-wide`:``}">
|
|
699
706
|
<div class="modal-header">
|
|
700
707
|
<h3>${q(e)}</h3>
|
|
@@ -705,10 +712,10 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
705
712
|
<button class="btn btn-cancel" type="button" data-modal-cancel>${q(a||t(`common.cancel`))}</button>
|
|
706
713
|
${i?`<button class="btn btn-primary" type="button" data-modal-confirm>${q(i)}</button>`:``}
|
|
707
714
|
</div>
|
|
708
|
-
</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
|
|
709
|
-
<div class="memory-entry-item${
|
|
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}">
|
|
710
717
|
<div class="memory-entry-top">
|
|
711
|
-
<span class="memory-entry-badge ${e.type===`summary`?`summary`:`fact`}">${q(
|
|
718
|
+
<span class="memory-entry-badge ${e.type===`summary`?`summary`:`fact`}">${q(Ni(e.type))}</span>
|
|
712
719
|
<div class="memory-entry-content">${q(e.content||``)}</div>
|
|
713
720
|
<div class="memory-entry-actions">
|
|
714
721
|
<button type="button" data-act="edit">${q(t(`memoryEntries.editBtn`))}</button>
|
|
@@ -718,13 +725,13 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
718
725
|
<div class="memory-entry-meta">
|
|
719
726
|
<span>${q(t(`memoryEntries.importanceShort`))} ${Number(e.importance)||0}</span>
|
|
720
727
|
<span>${q(t(`memoryEntries.valueShort`))} ${q(e.value)}</span>
|
|
721
|
-
<span>${q(t(`memoryEntries.createdLabel`))} ${q(
|
|
728
|
+
<span>${q(t(`memoryEntries.createdLabel`))} ${q(Fi(e.createdAt)||`—`)}</span>
|
|
722
729
|
<span>${q(t(`memoryEntries.lastAccessLabel`))} ${q(i)} · ${q(t(`memoryEntries.accessCount`,{count:e.accessCount||0}))}</span>
|
|
723
730
|
${r?`<span>${q(t(`memoryEntries.tagsLabel`))}: ${r}</span>`:``}
|
|
724
731
|
</div>
|
|
725
|
-
</div>`}function
|
|
726
|
-
<span class="memory-entries-candidates-text">${q(t(`memoryEntries.candidatesHint`,{count:
|
|
727
|
-
<button type="button" class="memory-entries-compact-btn">${q(t(`memoryEntries.compactBtn`))}</button>`}}async function
|
|
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=`
|
|
728
735
|
<div class="modal-content" style="max-width: 560px;">
|
|
729
736
|
<div class="modal-header">
|
|
730
737
|
<h3>${q(t(`memoryEntries.editTitle`))}</h3>
|
|
@@ -732,7 +739,7 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
732
739
|
<div class="modal-body">
|
|
733
740
|
<div class="form-group">
|
|
734
741
|
<label>${q(t(`memoryEntries.typeLabel`))}</label>
|
|
735
|
-
<input type="text" value="${q(
|
|
742
|
+
<input type="text" value="${q(Ni(e.type))}${e.category?` · ${q(e.category)}`:``}" readonly style="background:var(--bg-subtle);color:var(--text-secondary);">
|
|
736
743
|
</div>
|
|
737
744
|
<div class="form-group">
|
|
738
745
|
<label>${q(t(`memoryEntries.contentLabel`))}</label>
|
|
@@ -751,7 +758,7 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
751
758
|
<button class="btn btn-cancel" id="memoryEntryEditCancel">${q(t(`memoryEntries.cancelBtn`))}</button>
|
|
752
759
|
<button class="btn btn-primary" id="memoryEntryEditSave" style="width:auto;">${q(t(`memoryEntries.saveBtn`))}</button>
|
|
753
760
|
</div>
|
|
754
|
-
</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){
|
|
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=`
|
|
755
762
|
<div class="memory-status-row">
|
|
756
763
|
<span>${q(t(`memoryPanel.statusIndexed`,{indexed:e.indexed,total:e.total}))}</span>
|
|
757
764
|
<span class="memory-status-badge ${e.stale?`stale`:`fresh`}">${q(e.stale?t(`memoryPanel.statusStale`):t(`memoryPanel.statusFresh`))}</span>
|
|
@@ -761,27 +768,26 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
761
768
|
<span>${q(t(`memoryPanel.statusCurrent`))}: <code>${q(e.currentModelKey)}</code></span>
|
|
762
769
|
<span>${q(t(`memoryPanel.statusTier`))}: <code>${q(e.tier)}</code></span>
|
|
763
770
|
</div>
|
|
764
|
-
${e.stale?`<div class="memory-status-hint">${q(t(`memoryPanel.staleHint`))}</div>`:``}`}}function
|
|
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=`
|
|
765
772
|
<div class="memory-status-row">
|
|
766
773
|
<span class="memory-status-badge fail">${q(r)}</span>
|
|
767
774
|
</div>
|
|
768
|
-
<div class="memory-status-keys"><span>${q(t(`memoryPanel.statusDetail`))}: <code>${q(i)}</code></span></div>`}function
|
|
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=`
|
|
769
776
|
<div class="toolbox-empty" style="text-align:left; padding:24px 20px;">
|
|
770
|
-
<div style="display:flex; align-items:center; gap:10px; font-size:15px; font-weight:600; color
|
|
777
|
+
<div style="display:flex; align-items:center; gap:10px; font-size:15px; font-weight:600; color:var(--text-secondary);">
|
|
771
778
|
<span style="font-size:22px;">${s}</span><span>${q(c)}</span>
|
|
772
779
|
</div>
|
|
773
|
-
<div style="margin-top:8px; line-height:1.7; color
|
|
774
|
-
<button class="toolbox-add-btn" data-goto-tab="${d}" style="width:auto; margin-top:14px; padding:8px 18px; border-style:solid; color
|
|
775
|
-
</div>`}async function sa(){let e=Q(`memoryEnabled`),n=e.checked===!0;Bi=!0,qi();try{let e=await K(`POST`,`/api/memory/embedding-config`,{enabled:n});if(!e||e.success!==!0)throw Error(e?.error||`unknown`);U(t(n?`memoryPanel.toggleOnSaved`:`memoryPanel.toggleOffSaved`),`info`),await ia()}catch(i){r.warn(`[MemoryPanel] toggle persist failed:`,i.message),e.checked=!n,U(t(`memoryPanel.toggleFail`,{error:i.message}),`error`)}finally{Bi=!1,qi(),Ki()}}function ca(){Li||(Li=!0,Ii(),Q(`memoryTestBtn`)?.addEventListener(`click`,$i),Q(`memoryReindexBtn`)?.addEventListener(`click`,na),Q(`memoryApiKeyClearBtn`)?.addEventListener(`click`,ra),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`,()=>{Wi(),oa(Ri)})}),Q(`memoryEnabled`)?.addEventListener(`change`,()=>{Ki(),sa()}))}async function la(){let e=await dr();if(Ri=e,oa(e),!e.connected){Zi(),await ki();return}await aa(),await ki()}var ua=1;function da(){let e=document.getElementById(`saveBar`);if(!e)return;let t=()=>{let t=e.getBoundingClientRect().bottom>=window.innerHeight-ua;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 fa=`https://raw.githubusercontent.com/xiweicheng/ai-helper/main`;function pa(){return oe&&oe.version?oe.version:`latest`}function ma(e){return`curl -fsSL ${fa}/install.sh | AGENT_VERSION=${e} bash`}function ha(e){return`[Net.ServicePointManager]::SecurityProtocol=[Net.SecurityProtocolType]::Tls12; $env:AGENT_VERSION='${e}'; irm ${fa}/install.ps1 | iex`}function ga(){let e=navigator.platform||``,t=navigator.userAgent||``;return/^win/i.test(e)||/\bwindows\b/i.test(t)}async function _a(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 va(){let e=pa(),n=document.getElementById(`agentInstallTitle`);n&&(n.textContent=t(`agentConfig.installGuideTitle`,{version:e}));let r=document.getElementById(`installCmdUnix`),i=document.getElementById(`installCmdWin`);r&&(r.textContent=ma(e)),i&&(i.textContent=ha(e))}function ya(e=U){if(!document.getElementById(`agentInstallGuide`))return;va(),s(va);let t=document.getElementById(`installCmdUnix`),n=document.getElementById(`installCmdWin`);document.getElementById(`copyInstallUnix`)?.addEventListener(`click`,()=>_a(t?.textContent,e)),document.getElementById(`copyInstallWin`)?.addEventListener(`click`,()=>_a(n?.textContent,e)),document.getElementById(`copyInstallAuto`)?.addEventListener(`click`,()=>{_a(ga()?n?.textContent:t?.textContent,e)})}var $=[],ba={},xa={};function Sa(){return document.querySelector(`.tab-panel.active`)?.dataset.tab||null}async function Ca(){ot();let e=xa[Sa()];if(e)try{await e()}catch(e){r.warn(`[Options] tab agent save failed:`,e.message)}}function wa(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),ba[e]?.()}function Ta(){let e=window.location.hash.replace(`#`,``);[`basic`,`toolbar`,`react`,`reflection`,`chat`,`agent`,`toolbox`,`knowledge`,`memory`].includes(e)&&wa(e)}document.addEventListener(`DOMContentLoaded`,async function(){await n(),i(),s(()=>{i(),pt().then(e=>{$=e,mt($)})});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(),U(t(`settings.languageChanged`),`success`)}),document.addEventListener(`click`,t=>{!r.contains(t.target)&&t.target!==e&&r.classList.remove(`show`)})),document.querySelectorAll(`.tab-nav-btn`).forEach(e=>{e.addEventListener(`click`,function(){wa(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=`▼`))})}),ya(),ba.memory=la,xa.memory=ta,ba.toolbox=()=>{J().catch(()=>{})},ba.knowledge=()=>{Lr().catch(()=>{})},Ta(),window.addEventListener(`hashchange`,Ta),chrome.storage.local.get([`optionsInitialTab`],e=>{e.optionsInitialTab&&(wa(e.optionsInitialTab),chrome.storage.local.remove(`optionsInitialTab`))}),chrome.runtime.onMessage.addListener(e=>{e.type===`SWITCH_TAB`&&e.tab&&wa(e.tab)}),await g(),at(),Gt(),$=await pt(),mt($);let l=document.getElementById(`enableSelectionToolbar`),u=document.getElementById(`toolbarConfig`),d=document.getElementById(`toolbarToggleLabel`);u&&l&&(l.checked?u.classList.remove(`disabled`):u.classList.add(`disabled`),d&&(d.textContent=l.checked?t(`common.enabled`):t(`common.disabled`))),document.getElementById(`saveBtn`).addEventListener(`click`,Ca),da();let f=document.getElementById(`modelInput`),p=document.getElementById(`modelDropdown`);f.addEventListener(`click`,function(e){e.stopPropagation(),p.classList.contains(`show`)||(je(p,``),Le(xe),f.select()),p.classList.toggle(`show`)}),f.addEventListener(`input`,function(){z(),p.classList.add(`show`),je(p,this.value)}),f.addEventListener(`blur`,function(){f.value=xe,Le(xe)}),p.addEventListener(`click`,function(e){if(e.target.classList.contains(`delete-model-btn`)){e.stopPropagation();let t=e.target.closest(`.model-option`).dataset.value;Me(t);return}let t=e.target.closest(`.ctx-set-btn`);if(t){e.stopPropagation();let n=e.target.closest(`.model-option`);n&&ye(t,n,{onPreview:e=>{ze(n,e),Re(`modelInput`,`modelSelectedCtxBadge`,`modelDropdown`)},onCommit:e=>Be(n,e),onReset:()=>Be(n,0)});return}let n=e.target.closest(`.model-option`);if(n){e.stopPropagation(),z();let t=n.dataset.value;Se(t),f.value=t,Le(t),p.classList.remove(`show`)}}),document.addEventListener(`click`,function(e){!p.contains(e.target)&&e.target!==f&&!be(e.target)&&p.classList.remove(`show`)});let m=document.getElementById(`addModelToggleBtn`),h=document.getElementById(`addModelForm`),_=document.getElementById(`addModelName`),v=document.getElementById(`addModelContextWindow`),y=document.getElementById(`confirmAddModelBtn`),b=document.getElementById(`cancelAddModelBtn`);m&&h&&(m.addEventListener(`click`,function(){let e=h.style.display!==`none`;h.style.display=e?`none`:``,m.textContent=t(e?`settings.addModel`:`settings.collapse`),e||(_.value=``,v.value=``,_.focus())}),b.addEventListener(`click`,function(){h.style.display=`none`,m.textContent=t(`settings.addModel`),_.value=``,v.value=``}),y.addEventListener(`click`,function(){let e=_.value.trim(),n=parseInt(v.value)||0;if(!e){U(`❌ `+t(`settings.modelNameRequired`),`error`);return}Oe(e,n),f.value=e,Se(e),Le(e),chrome.storage.local.set({modelName:e}),h.style.display=`none`,m.textContent=t(`settings.addModel`),_.value=``,v.value=``,U(`✅ `+t(`settings.modelAdded`),`success`)}),_.addEventListener(`keydown`,function(e){e.key===`Enter`&&y.click()}),v.addEventListener(`keydown`,function(e){e.key===`Enter`&&y.click()}));let x=document.getElementById(`enableImageInput`),ee=document.getElementById(`imageModelGroup`),S=document.getElementById(`imageApiGroup`),te=document.getElementById(`imageApiKeyGroup`);x&&ee&&x.addEventListener(`change`,function(){ee.style.display=this.checked?``:`none`,S&&(S.style.display=this.checked?``:`none`),te&&(te.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`)||(je(w,``),Ke(Ce),C.select()),w.classList.toggle(`show`)}),C.addEventListener(`input`,function(){z(),w.classList.add(`show`),je(w,this.value)}),C.addEventListener(`blur`,function(){C.value=Ce,Ke(Ce)}),w.addEventListener(`click`,function(e){if(e.target.classList.contains(`delete-model-btn`)){e.stopPropagation();let t=e.target.closest(`.model-option`).dataset.value;He(t);return}let t=e.target.closest(`.ctx-set-btn`);if(t){e.stopPropagation();let n=e.target.closest(`.model-option`);n&&ye(t,n,{onPreview:e=>{ze(n,e),Re(`imageModelInput`,`imageModelSelectedCtxBadge`,`imageModelDropdown`)},onCommit:e=>We(n,e),onReset:()=>We(n,0)});return}let n=e.target.closest(`.model-option`);if(n){e.stopPropagation(),z();let t=n.dataset.value;we(t),C.value=t,Ke(t),w.classList.remove(`show`)}}),document.addEventListener(`click`,function(e){!w.contains(e.target)&&e.target!==C&&!be(e.target)&&w.classList.remove(`show`)}));let ne=document.getElementById(`addImageModelToggleBtn`),T=document.getElementById(`addImageModelForm`),re=document.getElementById(`addImageModelName`),ie=document.getElementById(`addImageModelContextWindow`),oe=document.getElementById(`confirmAddImageModelBtn`),se=document.getElementById(`cancelAddImageModelBtn`);ne&&T&&(ne.addEventListener(`click`,function(){let e=T.style.display!==`none`;T.style.display=e?`none`:``,ne.textContent=t(e?`settings.addModel`:`settings.collapse`),e||(re.value=``,ie.value=``,re.focus())}),se.addEventListener(`click`,function(){T.style.display=`none`,ne.textContent=t(`settings.addModel`),re.value=``,ie.value=``}),oe.addEventListener(`click`,function(){let e=re.value.trim(),n=parseInt(ie.value)||0;if(!e){U(`❌ `+t(`settings.modelNameRequired`),`error`);return}Ve(e,n),C.value=e,we(e),Ke(e),chrome.storage.local.set({imageModelName:e}),T.style.display=`none`,ne.textContent=t(`settings.addModel`),re.value=``,ie.value=``,U(`✅ `+t(`settings.imageModelAdded`),`success`)}),re.addEventListener(`keydown`,function(e){e.key===`Enter`&&oe.click()}),ie.addEventListener(`keydown`,function(e){e.key===`Enter`&&oe.click()}));async function E({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||U(`⚠️ `+t(`settings.fetchModelsNeedConfig`),`error`);return}let l=a?a.textContent:``;a&&(a.disabled=!0,a.textContent=t(`settings.fetchModelsLoading`));try{let e=await dt({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||U(t(`settings.fetchModelsSuccess`,{total:e.length,added:n}),`success`)}catch(e){o||(e&&(e.status===401||e.status===403)?U(t(`settings.fetchModelsAuthFailed`),`error`):e&&e.reason===`parse`?U(t(`settings.fetchModelsEmpty`),`info`):U(t(`settings.fetchModelsFailed`),`error`))}finally{a&&(a.disabled=!1,a.textContent=l||t(`settings.fetchModels`))}}let D=``,ce=null;function O(e,t){let n=(e||``).trim(),r=(t||``).trim();if(!n||!r)return;let i=`${n}|${r}`;i!==D&&(clearTimeout(ce),ce=setTimeout(()=>{D=i;let e=document.getElementById(`fetchModelsBtn`);e&&e.disabled||E({apiBaseEl:document.getElementById(`apiBase`),apiKeyEl:document.getElementById(`apiKey`),dropdownId:`modelDropdown`,addFn:Oe,btn:null,silent:!0})},500))}let k=document.getElementById(`fetchModelsBtn`);k&&k.addEventListener(`click`,()=>{E({apiBaseEl:document.getElementById(`apiBase`),apiKeyEl:document.getElementById(`apiKey`),dropdownId:`modelDropdown`,addFn:Oe,btn:k,silent:!1})});let le=document.getElementById(`fetchImageModelsBtn`);le&&le.addEventListener(`click`,()=>{E({apiBaseEl:document.getElementById(`imageApiBase`),apiKeyEl:document.getElementById(`imageApiKey`),dropdownId:`imageModelDropdown`,addFn:Ve,btn:le,silent:!1})});let A=document.getElementById(`apiBase`),j=document.getElementById(`apiBaseDropdown`);A&&j&&(A.addEventListener(`click`,function(e){e.stopPropagation(),j.querySelectorAll(`.model-option`).forEach(e=>{e.style.display=``}),j.classList.toggle(`show`),Qe(A.value.trim())}),j.addEventListener(`click`,function(e){if(e.target.classList.contains(`delete-model-btn`)){e.stopPropagation();let t=e.target.closest(`.model-option`).dataset.value;Ye(t);return}let n=e.target.closest(`.model-option`);if(n){e.stopPropagation();let r=n.dataset.value;A.value=r,Qe(r),j.classList.remove(`show`),chrome.storage.local.set({apiBase:r}),U(`✅ `+t(`settings.apiBaseSwitched`),`info`),O(r,(document.getElementById(`apiKey`)?.value||``).trim())}}),document.addEventListener(`click`,function(e){!j.contains(e.target)&&e.target!==A&&j.classList.remove(`show`)}),A.addEventListener(`blur`,function(){let e=this.value.trim();e&&(chrome.storage.local.set({apiBase:e}),Je(e),Qe(e))}),A.addEventListener(`input`,function(){let e=this.value.trim().toLowerCase();j.classList.add(`show`);let t=j.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 M=document.getElementById(`addApiBaseToggleBtn`),de=document.getElementById(`addApiBaseForm`),fe=document.getElementById(`addApiBaseUrl`),pe=document.getElementById(`addApiBaseLabel`),N=document.getElementById(`confirmAddApiBaseBtn`),P=document.getElementById(`cancelAddApiBaseBtn`);M&&de&&(M.addEventListener(`click`,function(){let e=de.style.display!==`none`;de.style.display=e?`none`:``,M.textContent=t(e?`settings.addAddress`:`settings.collapse`),e||(fe.value=``,pe.value=``,fe.focus())}),P.addEventListener(`click`,function(){de.style.display=`none`,M.textContent=t(`settings.addAddress`),fe.value=``,pe.value=``}),N.addEventListener(`click`,function(){let e=fe.value.trim(),n=pe.value.trim();if(!e){U(`❌ `+t(`settings.apiBaseRequired`),`error`);return}try{new URL(e)}catch{U(`❌ `+t(`settings.urlInvalid`),`error`);return}Je(e,n),A.value=e,Qe(e),chrome.storage.local.set({apiBase:e}),de.style.display=`none`,M.textContent=t(`settings.addAddress`),fe.value=``,pe.value=``,U(`✅ `+t(`settings.apiBaseAdded`),`success`)}),fe.addEventListener(`keydown`,function(e){e.key===`Enter`&&N.click()}),pe.addEventListener(`keydown`,function(e){e.key===`Enter`&&N.click()}));let F=document.getElementById(`imageApiBase`),I=document.getElementById(`imageApiBaseDropdown`);F&&I&&(F.addEventListener(`click`,function(e){e.stopPropagation(),I.querySelectorAll(`.model-option`).forEach(e=>{e.style.display=``}),I.classList.toggle(`show`),it(F.value.trim())}),I.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;F.value=r,it(r),I.classList.remove(`show`),chrome.storage.local.set({imageApiBase:r}),U(`✅ `+t(`settings.imageApiBaseSwitched`),`info`)}}),document.addEventListener(`click`,function(e){!I.contains(e.target)&&e.target!==F&&I.classList.remove(`show`)}),F.addEventListener(`blur`,function(){let e=this.value.trim();e&&(chrome.storage.local.set({imageApiBase:e}),et(e),it(e))}),F.addEventListener(`input`,function(){let e=this.value.trim().toLowerCase();I.classList.add(`show`);let t=I.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 L=document.getElementById(`addImageApiBaseToggleBtn`),me=document.getElementById(`addImageApiBaseForm`),R=document.getElementById(`addImageApiBaseUrl`),he=document.getElementById(`addImageApiBaseLabel`),ge=document.getElementById(`confirmAddImageApiBaseBtn`),_e=document.getElementById(`cancelAddImageApiBaseBtn`);L&&me&&(L.addEventListener(`click`,function(){let e=me.style.display!==`none`;me.style.display=e?`none`:``,L.textContent=t(e?`settings.addAddress`:`settings.collapse`),e||(R.value=``,he.value=``,R.focus())}),_e.addEventListener(`click`,function(){me.style.display=`none`,L.textContent=t(`settings.addAddress`),R.value=``,he.value=``}),ge.addEventListener(`click`,function(){let e=R.value.trim(),n=he.value.trim();if(!e){U(`❌ `+t(`settings.apiBaseRequired`),`error`);return}try{new URL(e)}catch{U(`❌ `+t(`settings.urlInvalid`),`error`);return}et(e,n),F.value=e,it(e),chrome.storage.local.set({imageApiBase:e}),me.style.display=`none`,L.textContent=t(`settings.addAddress`),R.value=``,he.value=``,U(`✅ `+t(`settings.imageApiBaseAdded`),`success`)}),R.addEventListener(`keydown`,function(e){e.key===`Enter`&&ge.click()}),he.addEventListener(`keydown`,function(e){e.key===`Enter`&&ge.click()}));let ve=document.getElementById(`imageApiKey`),Te=document.getElementById(`toggleImageApiKeyBtn`);if(ve&&ve.addEventListener(`blur`,function(){chrome.storage.local.set({imageApiKey:ae(this.value.trim())})}),ve&&Te){let e=Te.querySelector(`.icon-eye-open`),t=Te.querySelector(`.icon-eye-closed`);Te.addEventListener(`click`,function(){ve.type===`password`?(ve.type=`text`,e.style.display=`none`,t.style.display=`block`):(ve.type=`password`,e.style.display=`block`,t.style.display=`none`)})}let B=document.getElementById(`toggleToken`),Ee=document.getElementById(`apiKey`),De=B.querySelector(`.icon-eye-open`),ke=B.querySelector(`.icon-eye-closed`);B.addEventListener(`click`,function(){Ee.type===`password`?(Ee.type=`text`,De.style.display=`none`,ke.style.display=`block`):(Ee.type=`password`,De.style.display=`block`,ke.style.display=`none`)});let Ae=document.getElementById(`resetSystemPromptBtn`);Ae&&Ae.addEventListener(`click`,function(){document.getElementById(`systemPrompt`).value=ue()});let Ne=document.getElementById(`toolbarIconOnly`);Ne&&Ne.addEventListener(`change`,function(){gt()});let Pe=document.getElementById(`enableSelectionToolbar`),Fe=document.getElementById(`toolbarConfig`),Ie=document.getElementById(`toolbarToggleLabel`);function Ue(){let e=Pe&&Pe.checked;Fe&&(e?Fe.classList.remove(`disabled`):Fe.classList.add(`disabled`)),Ie&&(Ie.textContent=t(e?`common.enabled`:`common.disabled`))}Pe&&Pe.addEventListener(`change`,function(){Ue(),gt()}),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`:$=_t($,r,-1),Ea();break;case`moveDown`:$=_t($,r,1),Ea();break;case`edit`:yt($,r);break;case`delete`:$=vt($,r),Ea()}}),document.getElementById(`addCustomToolBtn`).addEventListener(`click`,function(){yt($,-1)}),document.getElementById(`domainAddBtn`).addEventListener(`click`,function(){let e=document.getElementById(`domainAddInput`);Tt(e.value,t=>{t.error?U(`❌ `+t.error,`error`):e.value=``})}),document.getElementById(`domainAddInput`).addEventListener(`keydown`,function(e){e.key===`Enter`&&Tt(this.value,e=>{e.error?U(`❌ `+e.error,`error`):this.value=``})}),document.getElementById(`domainBlocklistList`).addEventListener(`click`,function(e){let t=e.target.closest(`.domain-blocklist-item-remove`);t&&Et(t.dataset.domain)}),Ct(),chrome.storage.onChanged.addListener((e,t)=>{t===`local`&&e.blockedDomains&&Ct()}),document.getElementById(`toolEditCancel`).addEventListener(`click`,function(){bt()}),document.getElementById(`toolEditClose`).addEventListener(`click`,function(){bt()}),document.getElementById(`toolEditSave`).addEventListener(`click`,function(){let e=xt($);if(e.error){U(`❌ `+e.error,`error`);return}$=e.tools,Ea()});let Ge=document.getElementById(`reflectionEnabled`),V=document.getElementById(`reflectionConfig`),qe=document.getElementById(`reflectionToggleLabel`);function Xe(){if(!V)return;let e=Ge&&Ge.checked;e?V.classList.remove(`disabled`):V.classList.add(`disabled`),qe&&(qe.textContent=t(e?`common.enabled`:`common.disabled`))}function Ze(e,t){let n=document.getElementById(e),r=document.getElementById(t);!n||!r||(r.checked?n.classList.remove(`disabled`):n.classList.add(`disabled`))}Ge&&(Ge.addEventListener(`change`,function(){Xe();let e=this.checked;chrome.storage.local.get([`reflectionConfig`],t=>{let n=t.reflectionConfig||{postReflection:{},subtaskReflection:{}};n.enabled=e,chrome.storage.local.set({reflectionConfig:n})})}),Xe());function H(e,t){chrome.storage.local.get([`reflectionConfig`],n=>{let r=n.reflectionConfig||{postReflection:{},subtaskReflection:{}};r[e]||(r[e]={}),r[e].enabled=t,chrome.storage.local.set({reflectionConfig:r})})}let $e=document.getElementById(`postReflectionEnabled`);$e&&$e.addEventListener(`change`,function(){Ze(`postReflectionSection`,`postReflectionEnabled`),H(`postReflection`,this.checked)});let nt=document.getElementById(`subtaskReflectionEnabled`);nt&&nt.addEventListener(`change`,function(){Ze(`subtaskReflectionSection`,`subtaskReflectionEnabled`),H(`subtaskReflection`,this.checked)}),Xe(),Ze(`postReflectionSection`,`postReflectionEnabled`),Ze(`subtaskReflectionSection`,`subtaskReflectionEnabled`);let rt=document.getElementById(`streamEnabled`),ot=document.getElementById(`streamEnabledLabel`);function st(){let e=document.getElementById(`streamExpandToolsWrap`);e&&(e.style.display=rt&&rt.checked?`block`:`none`)}rt&&ot&&(rt.addEventListener(`change`,function(){ot&&(ot.textContent=rt.checked?t(`common.enabled`):t(`common.disabled`)),chrome.storage.local.set({streamEnabled:rt.checked}),st()}),ot&&(ot.textContent=rt.checked?t(`common.enabled`):t(`common.disabled`)),st());let ct=document.getElementById(`streamExpandTools`),lt=document.getElementById(`streamExpandToolsLabel`);ct&<&&(ct.addEventListener(`change`,function(){lt.textContent=this.checked?t(`common.enabled`):t(`common.disabled`),chrome.storage.local.set({streamExpandTools:this.checked})}),lt.textContent=ct.checked?t(`common.enabled`):t(`common.disabled`));let ut=document.getElementById(`toolConfirmationEnabled`),ft=document.getElementById(`toolConfirmationEnabledLabel`);ut&&ft&&(ut.addEventListener(`change`,function(){ft.textContent=this.checked?t(`common.enabled`):t(`common.disabled`),chrome.storage.local.set({toolConfirmationEnabled:this.checked})}),ft.textContent=ut.checked?t(`common.enabled`):t(`common.disabled`));let ht=document.getElementById(`enableExecutionLog`),St=document.getElementById(`enableExecutionLogLabel`);ht&&St&&(ht.addEventListener(`change`,function(){St.textContent=this.checked?t(`common.enabled`):t(`common.disabled`),chrome.storage.local.set({enableExecutionLog:this.checked})}),St.textContent=ht.checked?t(`common.enabled`):t(`common.disabled`));let wt=document.getElementById(`completionSoundEnabled`);wt&&wt.addEventListener(`change`,function(){chrome.storage.local.set({completionSoundEnabled:this.checked})});let Dt=document.getElementById(`completionConfettiEnabled`);Dt&&Dt.addEventListener(`change`,function(){chrome.storage.local.set({completionConfettiEnabled:this.checked})});let Ot=document.getElementById(`completionNotificationEnabled`);Ot&&Ot.addEventListener(`change`,function(){chrome.storage.local.set({completionNotificationEnabled:this.checked})});let kt=document.getElementById(`scheduledNotificationEnabled`);kt&&kt.addEventListener(`change`,function(){chrome.storage.local.set({scheduledNotificationEnabled:this.checked})});let At=document.getElementById(`interactionNotificationEnabled`);At&&At.addEventListener(`change`,function(){chrome.storage.local.set({interactionNotificationEnabled:this.checked})});let jt=document.getElementById(`showMessageTimestamp`);jt&&jt.addEventListener(`change`,function(){chrome.storage.local.set({showMessageTimestamp:this.checked})}),Da(),document.getElementById(`exportConfigBtn`).addEventListener(`click`,Nt),document.getElementById(`importConfigBtn`).addEventListener(`click`,Lt),document.getElementById(`importConfigFile`).addEventListener(`change`,function(e){e.target.files&&e.target.files.length>0&&zt(e.target.files[0])}),Vt(),ar(),Ir(),ca()});function Ea(){chrome.storage.local.set({toolbarTools:$},()=>{mt($),gt()})}function Da(){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`),`
|
|
780
|
+
<div style="margin-top:8px; line-height:1.7; color:var(--text-tertiary); font-size:13px;">${q(l)}</div>
|
|
781
|
+
<button class="toolbox-add-btn" data-goto-tab="${d}" style="width:auto; margin-top:14px; padding:8px 18px; border-style:solid; color:var(--brand-500); border-color:var(--brand-500);">${q(u)}</button>
|
|
782
|
+
</div>`}async function ya(){let e=Q(`memoryEnabled`),n=e.checked===!0;Qi=!0,aa();try{let e=await K(`POST`,`/api/memory/embedding-config`,{enabled:n});if(!e||e.success!==!0)throw Error(e?.error||`unknown`);H(t(n?`memoryPanel.toggleOnSaved`:`memoryPanel.toggleOffSaved`),`info`),await ga()}catch(i){r.warn(`[MemoryPanel] toggle persist failed:`,i.message),e.checked=!n,H(t(`memoryPanel.toggleFail`,{error:i.message}),`error`)}finally{Qi=!1,aa(),ia()}}function ba(){Yi||(Yi=!0,Ji(),Q(`memoryTestBtn`)?.addEventListener(`click`,da),Q(`memoryReindexBtn`)?.addEventListener(`click`,ma),Q(`memoryApiKeyClearBtn`)?.addEventListener(`click`,ha),Q(`memoryGate`)?.addEventListener(`click`,e=>{let t=e.target.closest(`[data-goto-tab]`);t&&document.querySelector(`.tab-nav-btn[data-tab="${t.dataset.gotoTab}"]`)?.click()}),document.querySelectorAll(`input[name="memoryEmbeddingMode"]`).forEach(e=>{e.addEventListener(`change`,()=>{na(),va(Xi)})}),Q(`memoryEnabled`)?.addEventListener(`change`,()=>{ia(),ya()}))}async function xa(){let e=await Cr();if(Xi=e,va(e),!e.connected){la(),await Vi();return}await _a(),await Vi()}var Sa=1;function Ca(){let e=document.getElementById(`saveBar`);if(!e)return;let t=()=>{let t=e.getBoundingClientRect().bottom>=window.innerHeight-Sa;e.classList.toggle(`floating`,t)};window.addEventListener(`scroll`,t,{passive:!0}),window.addEventListener(`resize`,t),typeof ResizeObserver<`u`&&new ResizeObserver(t).observe(document.body),t()}var wa=`https://raw.githubusercontent.com/xiweicheng/ai-helper/main`;function Ta(){return E&&E.version?E.version:`latest`}function Ea(e){return`curl -fsSL ${wa}/install.sh | AGENT_VERSION=${e} bash`}function Da(e){return`[Net.ServicePointManager]::SecurityProtocol=[Net.SecurityProtocolType]::Tls12; $env:AGENT_VERSION='${e}'; irm ${wa}/install.ps1 | iex`}function Oa(){let e=navigator.platform||``,t=navigator.userAgent||``;return/^win/i.test(e)||/\bwindows\b/i.test(t)}async function ka(e,n){if(e)try{await navigator.clipboard.writeText(e),n(t(`agentConfig.copyCmdSuccess`),`success`)}catch(e){r.warn(`[Options] clipboard write failed:`,e.message),n(t(`agentConfig.copyCmdFailed`),`error`)}}function Aa(){let e=Ta(),n=document.getElementById(`agentInstallTitle`);n&&(n.textContent=t(`agentConfig.installGuideTitle`,{version:e}));let r=document.getElementById(`installCmdUnix`),i=document.getElementById(`installCmdWin`);r&&(r.textContent=Ea(e)),i&&(i.textContent=Da(e))}function ja(e=H){if(!document.getElementById(`agentInstallGuide`))return;Aa(),s(Aa);let t=document.getElementById(`installCmdUnix`),n=document.getElementById(`installCmdWin`);document.getElementById(`copyInstallUnix`)?.addEventListener(`click`,()=>ka(t?.textContent,e)),document.getElementById(`copyInstallWin`)?.addEventListener(`click`,()=>ka(n?.textContent,e)),document.getElementById(`copyInstallAuto`)?.addEventListener(`click`,()=>{ka(Oa()?n?.textContent:t?.textContent,e)})}var $=[],Ma={},Na={};function Pa(){return document.querySelector(`.tab-panel.active`)?.dataset.tab||null}async function Fa(){ft();let e=Na[Pa()];if(e)try{await e()}catch(e){r.warn(`[Options] tab agent save failed:`,e.message)}}function Ia(e){document.querySelectorAll(`.tab-nav-btn`).forEach(e=>e.classList.remove(`active`)),document.querySelectorAll(`.tab-panel`).forEach(e=>e.classList.remove(`active`));let t=document.querySelector(`.tab-nav-btn[data-tab="${e}"]`),n=document.querySelector(`.tab-panel[data-tab="${e}"]`);t&&t.classList.add(`active`),n&&n.classList.add(`active`),window.location.hash!==`#`+e&&history.replaceState(null,``,`#`+e),Ma[e]?.()}function La(){let e=window.location.hash.replace(`#`,``);[`basic`,`toolbar`,`react`,`chat`,`agent`,`toolbox`,`knowledge`,`memory`].includes(e)&&Ia(e)}document.addEventListener(`DOMContentLoaded`,async function(){await ce(),await n(),i(),s(()=>{i(),yt().then(e=>{$=e,bt($)})});let e=document.getElementById(`languageInput`),r=document.getElementById(`languageDropdown`);e&&r&&((t=>{r.innerHTML=``,c.forEach(({code:e,label:n})=>{let i=document.createElement(`div`);i.className=`model-option`+(e===t?` selected`:``),i.dataset.value=e,i.textContent=n,r.appendChild(i)});let n=c.find(e=>e.code===t);e.value=n?n.label:``})(o()),e.addEventListener(`click`,e=>{e.stopPropagation(),r.classList.toggle(`show`)}),r.addEventListener(`click`,n=>{let o=n.target.closest(`.model-option`);if(!o)return;n.stopPropagation();let s=o.dataset.value;r.querySelectorAll(`.model-option`).forEach(e=>e.classList.remove(`selected`)),o.classList.add(`selected`),e.value=o.textContent,r.classList.remove(`show`),a(s),i(),H(t(`settings.languageChanged`),`success`)}),document.addEventListener(`click`,t=>{!r.contains(t.target)&&t.target!==e&&r.classList.remove(`show`)}));let l=()=>{let e=ue();document.querySelectorAll(`#themeSegment input[name="themePref"]`).forEach(t=>{t.checked=t.value===e})};l(),document.querySelectorAll(`#themeSegment input[name="themePref"]`).forEach(e=>{e.addEventListener(`change`,()=>{e.checked&&se(e.value)})}),le(l),document.querySelectorAll(`.tab-nav-btn`).forEach(e=>{e.addEventListener(`click`,function(){Ia(this.dataset.tab)})}),document.querySelectorAll(`.info-box, .warning-box`).forEach(e=>{let t=e.querySelector(`h3`);if(!t||e.classList.contains(`collapsible`))return;e.classList.add(`collapsible`,`collapsed`),t.classList.add(`collapsible-header`);let n=document.createElement(`span`);n.className=`collapsible-arrow`,n.textContent=`▶`,t.appendChild(n);let r=document.createElement(`div`);for(r.className=`collapsible-body`,r.style.display=`none`;t.nextSibling;)r.appendChild(t.nextSibling);e.appendChild(r)}),document.querySelectorAll(`.collapsible .collapsible-header`).forEach(e=>{let t=e.closest(`.collapsible`),n=t?.querySelector(`.collapsible-body`),r=e.querySelector(`.collapsible-arrow`);!t||!n||e.addEventListener(`click`,()=>{t.classList.contains(`open`)?(t.classList.remove(`open`),t.classList.add(`collapsed`),n.style.display=`none`,r&&(r.textContent=`▶`)):(t.classList.add(`open`),t.classList.remove(`collapsed`),n.style.display=``,r&&(r.textContent=`▼`))})}),ja(),Ma.memory=xa,Na.memory=pa,Ma.toolbox=()=>{J().catch(()=>{})},Ma.knowledge=()=>{Yr().catch(()=>{})},La(),window.addEventListener(`hashchange`,La),chrome.storage.local.get([`optionsInitialTab`],e=>{e.optionsInitialTab&&(Ia(e.optionsInitialTab),chrome.storage.local.remove(`optionsInitialTab`))}),chrome.runtime.onMessage.addListener(e=>{e.type===`SWITCH_TAB`&&e.tab&&Ia(e.tab)}),await g(),dt(),rn(),$=await yt(),bt($);let u=document.getElementById(`enableSelectionToolbar`),d=document.getElementById(`toolbarConfig`),f=document.getElementById(`toolbarToggleLabel`);d&&u&&(u.checked?d.classList.remove(`disabled`):d.classList.add(`disabled`),f&&(f.textContent=u.checked?t(`common.enabled`):t(`common.disabled`))),document.getElementById(`saveBtn`).addEventListener(`click`,Fa),Ca();let p=document.getElementById(`modelInput`),m=document.getElementById(`modelDropdown`);p.addEventListener(`click`,function(e){e.stopPropagation(),m.classList.contains(`show`)||(Le(m,``),Ue(De),p.select()),m.classList.toggle(`show`)}),p.addEventListener(`input`,function(){R(),m.classList.add(`show`),Le(m,this.value)}),p.addEventListener(`blur`,function(){p.value=De,Ue(De)}),m.addEventListener(`click`,function(e){if(e.target.classList.contains(`delete-model-btn`)){e.stopPropagation();let t=e.target.closest(`.model-option`).dataset.value;Re(t);return}let t=e.target.closest(`.ctx-set-btn`);if(t){e.stopPropagation();let n=e.target.closest(`.model-option`);n&&Te(t,n,{onPreview:e=>{Ge(n,e),We(`modelInput`,`modelSelectedCtxBadge`,`modelDropdown`)},onCommit:e=>Ke(n,e),onReset:()=>Ke(n,0)});return}let n=e.target.closest(`.model-option`);if(n){e.stopPropagation(),R();let t=n.dataset.value;Oe(t),p.value=t,Ue(t),m.classList.remove(`show`)}}),document.addEventListener(`click`,function(e){!m.contains(e.target)&&e.target!==p&&!Ee(e.target)&&m.classList.remove(`show`)});let h=document.getElementById(`addModelToggleBtn`),_=document.getElementById(`addModelForm`),v=document.getElementById(`addModelName`),y=document.getElementById(`addModelContextWindow`),b=document.getElementById(`confirmAddModelBtn`),x=document.getElementById(`cancelAddModelBtn`);h&&_&&(h.addEventListener(`click`,function(){let e=_.style.display!==`none`;_.style.display=e?`none`:``,h.textContent=t(e?`settings.addModel`:`settings.collapse`),e||(v.value=``,y.value=``,v.focus())}),x.addEventListener(`click`,function(){_.style.display=`none`,h.textContent=t(`settings.addModel`),v.value=``,y.value=``}),b.addEventListener(`click`,function(){let e=v.value.trim(),n=parseInt(y.value)||0;if(!e){H(`❌ `+t(`settings.modelNameRequired`),`error`);return}Pe(e,n),p.value=e,Oe(e),Ue(e),chrome.storage.local.set({modelName:e}),_.style.display=`none`,h.textContent=t(`settings.addModel`),v.value=``,y.value=``,H(`✅ `+t(`settings.modelAdded`),`success`)}),v.addEventListener(`keydown`,function(e){e.key===`Enter`&&b.click()}),y.addEventListener(`keydown`,function(e){e.key===`Enter`&&b.click()}));let ee=document.getElementById(`enableImageInput`),te=document.getElementById(`imageModelGroup`),S=document.getElementById(`imageApiGroup`),ne=document.getElementById(`imageApiKeyGroup`);ee&&te&&ee.addEventListener(`change`,function(){te.style.display=this.checked?``:`none`,S&&(S.style.display=this.checked?``:`none`),ne&&(ne.style.display=this.checked?``:`none`),chrome.storage.local.set({enableImageInput:this.checked})});let C=document.getElementById(`imageModelInput`),w=document.getElementById(`imageModelDropdown`);C&&w&&(C.addEventListener(`click`,function(e){e.stopPropagation(),w.classList.contains(`show`)||(Le(w,``),Qe(ke),C.select()),w.classList.toggle(`show`)}),C.addEventListener(`input`,function(){R(),w.classList.add(`show`),Le(w,this.value)}),C.addEventListener(`blur`,function(){C.value=ke,Qe(ke)}),w.addEventListener(`click`,function(e){if(e.target.classList.contains(`delete-model-btn`)){e.stopPropagation();let t=e.target.closest(`.model-option`).dataset.value;Je(t);return}let t=e.target.closest(`.ctx-set-btn`);if(t){e.stopPropagation();let n=e.target.closest(`.model-option`);n&&Te(t,n,{onPreview:e=>{Ge(n,e),We(`imageModelInput`,`imageModelSelectedCtxBadge`,`imageModelDropdown`)},onCommit:e=>Xe(n,e),onReset:()=>Xe(n,0)});return}let n=e.target.closest(`.model-option`);if(n){e.stopPropagation(),R();let t=n.dataset.value;Ae(t),C.value=t,Qe(t),w.classList.remove(`show`)}}),document.addEventListener(`click`,function(e){!w.contains(e.target)&&e.target!==C&&!Ee(e.target)&&w.classList.remove(`show`)}));let T=document.getElementById(`addImageModelToggleBtn`),re=document.getElementById(`addImageModelForm`),ie=document.getElementById(`addImageModelName`),oe=document.getElementById(`addImageModelContextWindow`),E=document.getElementById(`confirmAddImageModelBtn`),D=document.getElementById(`cancelAddImageModelBtn`);T&&re&&(T.addEventListener(`click`,function(){let e=re.style.display!==`none`;re.style.display=e?`none`:``,T.textContent=t(e?`settings.addModel`:`settings.collapse`),e||(ie.value=``,oe.value=``,ie.focus())}),D.addEventListener(`click`,function(){re.style.display=`none`,T.textContent=t(`settings.addModel`),ie.value=``,oe.value=``}),E.addEventListener(`click`,function(){let e=ie.value.trim(),n=parseInt(oe.value)||0;if(!e){H(`❌ `+t(`settings.modelNameRequired`),`error`);return}qe(e,n),C.value=e,Ae(e),Qe(e),chrome.storage.local.set({imageModelName:e}),re.style.display=`none`,T.textContent=t(`settings.addModel`),ie.value=``,oe.value=``,H(`✅ `+t(`settings.imageModelAdded`),`success`)}),ie.addEventListener(`keydown`,function(e){e.key===`Enter`&&E.click()}),oe.addEventListener(`keydown`,function(e){e.key===`Enter`&&E.click()}));async function O({apiBaseEl:e,apiKeyEl:n,dropdownId:r,addFn:i,btn:a,silent:o}){let s=(e?.value||``).trim(),c=(n?.value||``).trim();if(!s||!c){o||H(`⚠️ `+t(`settings.fetchModelsNeedConfig`),`error`);return}let l=a?a.textContent:``;a&&(a.disabled=!0,a.textContent=t(`settings.fetchModelsLoading`));try{let e=await _t({apiBase:s,apiKey:c}),n=0,a=document.getElementById(r);for(let t of e)a&&a.querySelector(`.model-option[data-value="${CSS.escape(t)}"]`)||(i(t,0),n++);o||H(t(`settings.fetchModelsSuccess`,{total:e.length,added:n}),`success`)}catch(e){o||(e&&(e.status===401||e.status===403)?H(t(`settings.fetchModelsAuthFailed`),`error`):e&&e.reason===`parse`?H(t(`settings.fetchModelsEmpty`),`info`):H(t(`settings.fetchModelsFailed`),`error`))}finally{a&&(a.disabled=!1,a.textContent=l||t(`settings.fetchModels`))}}let k=``,de=null;function fe(e,t){let n=(e||``).trim(),r=(t||``).trim();if(!n||!r)return;let i=`${n}|${r}`;i!==k&&(clearTimeout(de),de=setTimeout(()=>{k=i;let e=document.getElementById(`fetchModelsBtn`);e&&e.disabled||O({apiBaseEl:document.getElementById(`apiBase`),apiKeyEl:document.getElementById(`apiKey`),dropdownId:`modelDropdown`,addFn:Pe,btn:null,silent:!0})},500))}let pe=document.getElementById(`fetchModelsBtn`);pe&&pe.addEventListener(`click`,()=>{O({apiBaseEl:document.getElementById(`apiBase`),apiKeyEl:document.getElementById(`apiKey`),dropdownId:`modelDropdown`,addFn:Pe,btn:pe,silent:!1})});let me=document.getElementById(`fetchImageModelsBtn`);me&&me.addEventListener(`click`,()=>{O({apiBaseEl:document.getElementById(`imageApiBase`),apiKeyEl:document.getElementById(`imageApiKey`),dropdownId:`imageModelDropdown`,addFn:qe,btn:me,silent:!1})});let he=document.getElementById(`apiBase`),A=document.getElementById(`apiBaseDropdown`);he&&A&&(he.addEventListener(`click`,function(e){e.stopPropagation(),A.querySelectorAll(`.model-option`).forEach(e=>{e.style.display=``}),A.classList.toggle(`show`),it(he.value.trim())}),A.addEventListener(`click`,function(e){if(e.target.classList.contains(`delete-model-btn`)){e.stopPropagation();let t=e.target.closest(`.model-option`).dataset.value;tt(t);return}let n=e.target.closest(`.model-option`);if(n){e.stopPropagation();let r=n.dataset.value;he.value=r,it(r),A.classList.remove(`show`),chrome.storage.local.set({apiBase:r}),H(`✅ `+t(`settings.apiBaseSwitched`),`info`),fe(r,(document.getElementById(`apiKey`)?.value||``).trim())}}),document.addEventListener(`click`,function(e){!A.contains(e.target)&&e.target!==he&&A.classList.remove(`show`)}),he.addEventListener(`blur`,function(){let e=this.value.trim();e&&(chrome.storage.local.set({apiBase:e}),et(e),it(e))}),he.addEventListener(`input`,function(){let e=this.value.trim().toLowerCase();A.classList.add(`show`);let t=A.querySelectorAll(`.model-option`),n=!1;t.forEach(t=>{let r=(t.dataset.value||``).toLowerCase(),i=(t.dataset.label||``).toLowerCase();!e||r.includes(e)||i.includes(e)?(t.style.display=``,n=!0):t.style.display=`none`}),!n&&e&&t.forEach(e=>{e.style.display=``})}));let j=document.getElementById(`addApiBaseToggleBtn`),_e=document.getElementById(`addApiBaseForm`),ve=document.getElementById(`addApiBaseUrl`),ye=document.getElementById(`addApiBaseLabel`),M=document.getElementById(`confirmAddApiBaseBtn`),N=document.getElementById(`cancelAddApiBaseBtn`);j&&_e&&(j.addEventListener(`click`,function(){let e=_e.style.display!==`none`;_e.style.display=e?`none`:``,j.textContent=t(e?`settings.addAddress`:`settings.collapse`),e||(ve.value=``,ye.value=``,ve.focus())}),N.addEventListener(`click`,function(){_e.style.display=`none`,j.textContent=t(`settings.addAddress`),ve.value=``,ye.value=``}),M.addEventListener(`click`,function(){let e=ve.value.trim(),n=ye.value.trim();if(!e){H(`❌ `+t(`settings.apiBaseRequired`),`error`);return}try{new URL(e)}catch{H(`❌ `+t(`settings.urlInvalid`),`error`);return}et(e,n),he.value=e,it(e),chrome.storage.local.set({apiBase:e}),_e.style.display=`none`,j.textContent=t(`settings.addAddress`),ve.value=``,ye.value=``,H(`✅ `+t(`settings.apiBaseAdded`),`success`)}),ve.addEventListener(`keydown`,function(e){e.key===`Enter`&&M.click()}),ye.addEventListener(`keydown`,function(e){e.key===`Enter`&&M.click()}));let P=document.getElementById(`imageApiBase`),F=document.getElementById(`imageApiBaseDropdown`);P&&F&&(P.addEventListener(`click`,function(e){e.stopPropagation(),F.querySelectorAll(`.model-option`).forEach(e=>{e.style.display=``}),F.classList.toggle(`show`),ut(P.value.trim())}),F.addEventListener(`click`,function(e){if(e.target.classList.contains(`delete-model-btn`)){e.stopPropagation();let t=e.target.closest(`.model-option`).dataset.value;st(t);return}let n=e.target.closest(`.model-option`);if(n){e.stopPropagation();let r=n.dataset.value;P.value=r,ut(r),F.classList.remove(`show`),chrome.storage.local.set({imageApiBase:r}),H(`✅ `+t(`settings.imageApiBaseSwitched`),`info`)}}),document.addEventListener(`click`,function(e){!F.contains(e.target)&&e.target!==P&&F.classList.remove(`show`)}),P.addEventListener(`blur`,function(){let e=this.value.trim();e&&(chrome.storage.local.set({imageApiBase:e}),ot(e),ut(e))}),P.addEventListener(`input`,function(){let e=this.value.trim().toLowerCase();F.classList.add(`show`);let t=F.querySelectorAll(`.model-option`),n=!1;t.forEach(t=>{let r=(t.dataset.value||``).toLowerCase(),i=(t.dataset.label||``).toLowerCase();!e||r.includes(e)||i.includes(e)?(t.style.display=``,n=!0):t.style.display=`none`}),!n&&e&&t.forEach(e=>{e.style.display=``})}));let I=document.getElementById(`addImageApiBaseToggleBtn`),be=document.getElementById(`addImageApiBaseForm`),L=document.getElementById(`addImageApiBaseUrl`),xe=document.getElementById(`addImageApiBaseLabel`),Se=document.getElementById(`confirmAddImageApiBaseBtn`),Ce=document.getElementById(`cancelAddImageApiBaseBtn`);I&&be&&(I.addEventListener(`click`,function(){let e=be.style.display!==`none`;be.style.display=e?`none`:``,I.textContent=t(e?`settings.addAddress`:`settings.collapse`),e||(L.value=``,xe.value=``,L.focus())}),Ce.addEventListener(`click`,function(){be.style.display=`none`,I.textContent=t(`settings.addAddress`),L.value=``,xe.value=``}),Se.addEventListener(`click`,function(){let e=L.value.trim(),n=xe.value.trim();if(!e){H(`❌ `+t(`settings.apiBaseRequired`),`error`);return}try{new URL(e)}catch{H(`❌ `+t(`settings.urlInvalid`),`error`);return}ot(e,n),P.value=e,ut(e),chrome.storage.local.set({imageApiBase:e}),be.style.display=`none`,I.textContent=t(`settings.addAddress`),L.value=``,xe.value=``,H(`✅ `+t(`settings.imageApiBaseAdded`),`success`)}),L.addEventListener(`keydown`,function(e){e.key===`Enter`&&Se.click()}),xe.addEventListener(`keydown`,function(e){e.key===`Enter`&&Se.click()}));let we=document.getElementById(`imageApiKey`),je=document.getElementById(`toggleImageApiKeyBtn`);if(we&&we.addEventListener(`blur`,function(){chrome.storage.local.set({imageApiKey:ae(this.value.trim())})}),we&&je){let e=je.querySelector(`.icon-eye-open`),t=je.querySelector(`.icon-eye-closed`);je.addEventListener(`click`,function(){we.type===`password`?(we.type=`text`,e.style.display=`none`,t.style.display=`block`):(we.type=`password`,e.style.display=`block`,t.style.display=`none`)})}let z=document.getElementById(`toggleToken`),Me=document.getElementById(`apiKey`),Ne=z.querySelector(`.icon-eye-open`),Fe=z.querySelector(`.icon-eye-closed`);z.addEventListener(`click`,function(){Me.type===`password`?(Me.type=`text`,Ne.style.display=`none`,Fe.style.display=`block`):(Me.type=`password`,Ne.style.display=`block`,Fe.style.display=`none`)});let Ie=document.getElementById(`resetSystemPromptBtn`);Ie&&Ie.addEventListener(`click`,function(){document.getElementById(`systemPrompt`).value=ge()});let ze=document.getElementById(`toolbarIconOnly`);ze&&ze.addEventListener(`change`,function(){St()});let Be=document.getElementById(`enableSelectionToolbar`),Ve=document.getElementById(`toolbarConfig`),He=document.getElementById(`toolbarToggleLabel`);function Ye(){let e=Be&&Be.checked;Ve&&(e?Ve.classList.remove(`disabled`):Ve.classList.add(`disabled`)),He&&(He.textContent=t(e?`common.enabled`:`common.disabled`))}Be&&Be.addEventListener(`change`,function(){Ye(),St()}),document.getElementById(`toolbarToolsList`).addEventListener(`click`,function(e){let t=e.target.closest(`[data-action]`);if(!t)return;let n=t.dataset.action,r=parseInt(t.dataset.index);switch(n){case`moveUp`:$=Ct($,r,-1),Ra();break;case`moveDown`:$=Ct($,r,1),Ra();break;case`edit`:Tt($,r);break;case`delete`:$=wt($,r),Ra();break}}),document.getElementById(`addCustomToolBtn`).addEventListener(`click`,function(){Tt($,-1)}),document.getElementById(`domainAddBtn`).addEventListener(`click`,function(){let e=document.getElementById(`domainAddInput`);At(e.value,t=>{t.error?H(`❌ `+t.error,`error`):e.value=``})}),document.getElementById(`domainAddInput`).addEventListener(`keydown`,function(e){e.key===`Enter`&&At(this.value,e=>{e.error?H(`❌ `+e.error,`error`):this.value=``})}),document.getElementById(`domainBlocklistList`).addEventListener(`click`,function(e){let t=e.target.closest(`.domain-blocklist-item-remove`);t&&jt(t.dataset.domain)}),Ot(),chrome.storage.onChanged.addListener((e,t)=>{t===`local`&&e.blockedDomains&&Ot()}),document.getElementById(`toolEditCancel`).addEventListener(`click`,function(){Et()}),document.getElementById(`toolEditClose`).addEventListener(`click`,function(){Et()}),document.getElementById(`toolEditSave`).addEventListener(`click`,function(){let e=Dt($);if(e.error){H(`❌ `+e.error,`error`);return}$=e.tools,Ra()});let Ze=document.getElementById(`reflectionEnabled`),B=document.getElementById(`reflectionToggleLabel`),$e=document.querySelectorAll(`.reflection-sub`),nt=document.getElementById(`postReflectionEnabled`),rt=document.getElementById(`postReflectionLabel`),V=document.getElementById(`subtaskReflectionEnabled`),at=document.getElementById(`subtaskReflectionLabel`);function ct(){let e=!!(Ze&&Ze.checked);$e.forEach(t=>{t.style.display=e?`block`:`none`}),B&&(B.textContent=t(e?`common.enabled`:`common.disabled`))}function lt(e){chrome.storage.local.get([`reflectionConfig`],t=>{let n=t.reflectionConfig||{postReflection:{},subtaskReflection:{}};e(n),chrome.storage.local.set({reflectionConfig:n})})}Ze&&(Ze.addEventListener(`change`,function(){ct();let e=this.checked;lt(t=>{t.enabled=e})}),ct()),nt&&(nt.addEventListener(`change`,function(){rt&&(rt.textContent=this.checked?t(`common.enabled`):t(`common.disabled`));let e=this.checked;lt(t=>{t.postReflection||={},t.postReflection.enabled=e})}),rt&&(rt.textContent=nt.checked?t(`common.enabled`):t(`common.disabled`))),V&&(V.addEventListener(`change`,function(){at&&(at.textContent=this.checked?t(`common.enabled`):t(`common.disabled`));let e=this.checked;lt(t=>{t.subtaskReflection||={},t.subtaskReflection.enabled=e})}),at&&(at.textContent=V.checked?t(`common.enabled`):t(`common.disabled`)));let ft=document.getElementById(`streamEnabled`),pt=document.getElementById(`streamEnabledLabel`);function mt(){let e=document.getElementById(`streamExpandToolsWrap`);e&&(e.style.display=ft&&ft.checked?`block`:`none`)}ft&&pt&&(ft.addEventListener(`change`,function(){pt&&(pt.textContent=ft.checked?t(`common.enabled`):t(`common.disabled`)),chrome.storage.local.set({streamEnabled:ft.checked}),mt()}),pt&&(pt.textContent=ft.checked?t(`common.enabled`):t(`common.disabled`)),mt());let ht=document.getElementById(`streamExpandTools`),gt=document.getElementById(`streamExpandToolsLabel`);ht&>&&(ht.addEventListener(`change`,function(){gt.textContent=this.checked?t(`common.enabled`):t(`common.disabled`),chrome.storage.local.set({streamExpandTools:this.checked})}),gt.textContent=ht.checked?t(`common.enabled`):t(`common.disabled`));let vt=document.getElementById(`toolConfirmationEnabled`),xt=document.getElementById(`toolConfirmationEnabledLabel`);vt&&xt&&(vt.addEventListener(`change`,function(){xt.textContent=this.checked?t(`common.enabled`):t(`common.disabled`),chrome.storage.local.set({toolConfirmationEnabled:this.checked})}),xt.textContent=vt.checked?t(`common.enabled`):t(`common.disabled`));let U=document.getElementById(`completionVerificationEnabled`),kt=document.getElementById(`completionVerificationEnabledLabel`),Mt=document.querySelectorAll(`.completion-verification-sub`);function Nt(){let e=!!(U&&U.checked);Mt.forEach(t=>{t.style.display=e?`block`:`none`})}U&&kt&&(U.addEventListener(`change`,function(){let e=this.checked;Nt(),kt.textContent=t(e?`common.enabled`:`common.disabled`),chrome.storage.local.get([`completionVerificationConfig`],t=>{let n=Object.assign({},t.completionVerificationConfig||{},{enabled:e});chrome.storage.local.set({completionVerificationConfig:n})})}),kt.textContent=U.checked?t(`common.enabled`):t(`common.disabled`),Nt());let Pt=document.getElementById(`completionVerificationRerunEnabled`),Ft=document.getElementById(`completionVerificationRerunEnabledLabel`);Pt&&Ft&&(Pt.addEventListener(`change`,function(){let e=this.checked;Ft.textContent=t(e?`common.enabled`:`common.disabled`),chrome.storage.local.get([`completionVerificationConfig`],t=>{let n=Object.assign({},t.completionVerificationConfig||{},{rerunEnabled:e});chrome.storage.local.set({completionVerificationConfig:n})})}),Ft.textContent=Pt.checked?t(`common.enabled`):t(`common.disabled`));let It=document.getElementById(`networkAccessEnabled`),Lt=document.getElementById(`networkAccessEnabledLabel`);It&&Lt&&(It.addEventListener(`change`,function(){Lt.textContent=this.checked?t(`common.enabled`):t(`common.disabled`),en(this.checked),chrome.storage.local.set({networkAccessEnabled:this.checked})}),Lt.textContent=It.checked?t(`common.enabled`):t(`common.disabled`),en(It.checked));let zt=document.getElementById(`networkHostAddBtn`),Bt=document.getElementById(`networkHostAddInput`);zt&&Bt&&(zt.addEventListener(`click`,function(){Qt(Bt.value,e=>{e.error?H(`❌ `+e.error,`error`):Bt.value=``})}),Bt.addEventListener(`keydown`,function(e){e.key===`Enter`&&Qt(this.value,e=>{e.error?H(`❌ `+e.error,`error`):this.value=``})}));let Vt=document.getElementById(`networkAllowlistList`);Vt&&Vt.addEventListener(`click`,function(e){let t=e.target.closest(`.domain-blocklist-item-remove`);t&&$t(t.dataset.host)}),Xt(),chrome.storage.onChanged.addListener((e,n)=>{if(n===`local`&&(e.allowedNetworkHosts&&Xt(),e.networkAccessEnabled&&It&&Lt)){let n=e.networkAccessEnabled.newValue===!0;It.checked=n,Lt.textContent=t(n?`common.enabled`:`common.disabled`),en(n)}});let Ut=document.getElementById(`enableExecutionLog`),Gt=document.getElementById(`enableExecutionLogLabel`);Ut&&Gt&&(Ut.addEventListener(`change`,function(){Gt.textContent=this.checked?t(`common.enabled`):t(`common.disabled`),chrome.storage.local.set({enableExecutionLog:this.checked})}),Gt.textContent=Ut.checked?t(`common.enabled`):t(`common.disabled`));let qt=document.getElementById(`completionSoundEnabled`);qt&&qt.addEventListener(`change`,function(){chrome.storage.local.set({completionSoundEnabled:this.checked})});let Jt=document.getElementById(`completionConfettiEnabled`);Jt&&Jt.addEventListener(`change`,function(){chrome.storage.local.set({completionConfettiEnabled:this.checked})});let Yt=document.getElementById(`completionNotificationEnabled`);Yt&&Yt.addEventListener(`change`,function(){chrome.storage.local.set({completionNotificationEnabled:this.checked})});let Zt=document.getElementById(`scheduledNotificationEnabled`);Zt&&Zt.addEventListener(`change`,function(){chrome.storage.local.set({scheduledNotificationEnabled:this.checked})});let tn=document.getElementById(`interactionNotificationEnabled`);tn&&tn.addEventListener(`change`,function(){chrome.storage.local.set({interactionNotificationEnabled:this.checked})});let nn=document.getElementById(`showMessageTimestamp`);nn&&nn.addEventListener(`change`,function(){chrome.storage.local.set({showMessageTimestamp:this.checked})}),za(),document.getElementById(`exportConfigBtn`).addEventListener(`click`,Rt),document.getElementById(`importConfigBtn`).addEventListener(`click`,Ht),document.getElementById(`importConfigFile`).addEventListener(`change`,function(e){e.target.files&&e.target.files.length>0&&Wt(e.target.files[0])}),Kt(),_r(),Jr(),ba()});function Ra(){chrome.storage.local.set({toolbarTools:$},()=>{bt($),St()})}function za(){let e=document.getElementById(`agentUrl`),n=document.getElementById(`agentPairCode`),r=document.getElementById(`agentName`),i=document.getElementById(`agentConnectBtn`);document.getElementById(`agentStatusDot`);let a=document.getElementById(`agentStatusText`),o=document.getElementById(`agentStatus`),s=document.getElementById(`pairCodeGroup`),c=document.getElementById(`agentInfo`),l=document.getElementById(`agentWorkdir`),u=document.getElementById(`agentDetailToggle`),d=document.getElementById(`agentDetailPanel`),f=document.getElementById(`pairedAgentsSection`),p=document.getElementById(`pairedAgentsList`),m=document.getElementById(`addAgentTitle`);if(!e||!i)return;function g(){let e=document.getElementById(`agentDetailArea`);e&&f.nextSibling!==e&&f.parentNode.insertBefore(e,f.nextSibling)}function _(){let e=document.getElementById(`agentDetailArea`);if(!e)return;let t=p.querySelector(`.paired-agent-item.active`);t&&t!==e.parentNode?t.appendChild(e):t||g()}async function v(e){try{let t=new AbortController,n=setTimeout(()=>t.abort(),2e3),r=await fetch(`${e}/api/status`,{signal:t.signal,cache:`no-cache`});return clearTimeout(n),r.ok}catch{return!1}}async function y(){g();let e=await chrome.storage.local.get([`pairedAgents`,`activeAgentId`]),n=e.pairedAgents||[],r=e.activeAgentId;if(b=null,n.length===0){f.style.display=`none`,m.textContent=t(`agentConfig.addAgentTitle`);return}f.style.display=``,m.textContent=t(`agentConfig.addAnotherAgent`),p.innerHTML=n.map(e=>{let n=e.id===r,i=!!e.disabled,a,o,s;return i?(a=n?`active-disabled`:`disabled`,o=t(`common.disabled`),s=`disabled`):n?(a=`active-checking`,o=t(`agentConfig.connected`),s=`connected`):(a=`checking`,o=t(`agentConfig.checking`),s=`checking`),`
|
|
776
783
|
<div class="paired-agent-item${n?` active`:``}${i?` disabled`:``}" data-agent-id="${e.id}">
|
|
777
784
|
<span class="paired-agent-dot ${a}" title="${o}"></span>
|
|
778
|
-
<span class="paired-agent-name" data-agent-id="${e.id}" data-original="${
|
|
779
|
-
<span class="paired-agent-url">${
|
|
785
|
+
<span class="paired-agent-name" data-agent-id="${e.id}" data-original="${E(e.name)}" title="${t(`agentConfig.clickToEditName`)}">${E(e.name)}</span>
|
|
786
|
+
<span class="paired-agent-url">${E(e.url)}</span>
|
|
780
787
|
<span class="paired-agent-status-text ${s}">${o}</span>
|
|
781
788
|
<div class="paired-agent-actions">
|
|
782
789
|
${i?`<button class="paired-agent-btn enable-btn" data-action="enable" data-id="${e.id}">${t(`agentConfig.enable`)}</button>`:n?`<button class="paired-agent-btn disconnect-btn" data-action="deactivate" data-id="${e.id}">${t(`agentConfig.disconnect`)}</button>`:`<button class="paired-agent-btn switch-btn" data-action="switch" data-id="${e.id}">${t(`agentConfig.connect`)}</button>`}
|
|
783
790
|
${i?``:`<button class="paired-agent-btn disable-btn" data-action="disable" data-id="${e.id}">${t(`agentConfig.disable`)}</button>`}
|
|
784
791
|
<button class="paired-agent-btn delete-btn" data-action="delete" data-id="${e.id}">${t(`common.delete`)}</button>
|
|
785
792
|
</div>
|
|
786
|
-
</div>`}).join(``),ee(n),_(),n.forEach(e=>{e.disabled||v(e.url).then(t=>{x(e.id,t)})})}let b=null;function x(e,n){let r=p.querySelector(`[data-agent-id="${e}"]`);if(!r)return;let i=r.querySelector(`.paired-agent-dot`),a=r.querySelector(`.paired-agent-status-text`),o=r.classList.contains(`active`),s=o?n?`active-online`:`active-offline`:n?`online`:`offline`,c=t(o?n?`agentConfig.connected`:`agentConfig.notConnected`:n?`agentConfig.online`:`agentConfig.offline`);i&&(i.className=`paired-agent-dot ${s}`,i.title=`${o?t(`agentConfig.currentInUse`):``}${c}`),a&&(a.className=`paired-agent-status-text ${n?`online`:`offline`}`,a.textContent=c),o&&b!==null&&b!==n&&chrome.runtime.sendMessage({type:`AGENT_STATUS_CHANGE`,connected:n,status:t(n?`agentConfig.online`:`agentConfig.offline`),agentId:e}).catch(()=>{}),o&&(b=n)}function ee(e){p.querySelectorAll(`.paired-agent-name`).forEach(e=>{e.addEventListener(`click`,()=>{if(e.querySelector(`input`))return;let t=e.dataset.agentId,n=e.dataset.original,r=document.createElement(`input`);r.type=`text`,r.value=n,r.className=`paired-agent-name-input`,r.style.cssText=`flex:1;font-size:14px;font-weight:500;border:1px solid #667eea;border-radius:4px;padding:2px 6px;outline:none;color:#2d3748;`,e.innerHTML=``,e.appendChild(r),r.focus(),r.select(),r.addEventListener(`blur`,async()=>{let i=r.value.trim()||n;r.remove(),e.textContent=i,e.dataset.original=i;let a=(await chrome.storage.local.get([`pairedAgents`,`activeAgentId`])).pairedAgents||[],o=a.findIndex(e=>e.id===t);o!==-1&&(a[o].name=i,await chrome.storage.local.set({pairedAgents:a}))}),r.addEventListener(`keydown`,e=>{e.key===`Enter`&&r.blur(),e.key===`Escape`&&(r.value=n,r.blur())})})}),p.querySelectorAll(`.paired-agent-btn`).forEach(e=>{e.addEventListener(`click`,async t=>{t.stopPropagation();let n=e.dataset.action,r=e.dataset.id;n===`switch`?await S(r):n===`deactivate`?await ue(r):n===`disable`?await C(r):n===`enable`?await w(r):n===`delete`&&await te(r)})})}async function S(n){let r=((await chrome.storage.local.get(`pairedAgents`)).pairedAgents||[]).find(e=>e.id===n);r&&(await chrome.storage.local.set({activeAgentId:n}),e.value=r.url,await ne(r.url,h(r.token)),chrome.runtime.sendMessage({type:`AGENT_CONNECTION_CHANGED`,connected:!0,agentId:n}).catch(()=>{}),U(t(`agentConfig.connectedTo`,{name:r.name}),`success`),await y(),J().catch(()=>{}))}async function te(e){let n=await chrome.storage.local.get([`pairedAgents`,`activeAgentId`]),r=n.pairedAgents||[],i=r.find(t=>t.id===e);if(!i||!await G(t(`agentConfig.confirmDeleteAgent`,{name:i.name,url:i.url}),t(`agentConfig.deleteAgentTitle`)))return;let a=r.filter(t=>t.id!==e),o=n.activeAgentId;n.activeAgentId===e&&(o=a.length>0?a[0].id:null),await chrome.storage.local.set({pairedAgents:a,activeAgentId:o}),o&&o!==n.activeAgentId?(a.find(e=>e.id===o),chrome.runtime.sendMessage({type:`AGENT_CONNECTION_CHANGED`,connected:!0,agentId:o}).catch(()=>{})):o||chrome.runtime.sendMessage({type:`AGENT_CONNECTION_CHANGED`,connected:!1}).catch(()=>{}),U(t(`agentConfig.agentDeleted`,{name:i.name}),`info`),await y(),await T(),o!==n.activeAgentId&&J().catch(()=>{})}async function C(e){let n=await chrome.storage.local.get([`pairedAgents`,`activeAgentId`]),r=n.pairedAgents||[],i=r.find(t=>t.id===e);if(!i)return;if(n.activeAgentId===e){let t=r.find(t=>t.id!==e&&!t.disabled);t?(await chrome.storage.local.set({activeAgentId:t.id}),chrome.runtime.sendMessage({type:`AGENT_CONNECTION_CHANGED`,connected:!0,agentId:t.id}).catch(()=>{})):(await chrome.storage.local.set({activeAgentId:null}),chrome.runtime.sendMessage({type:`AGENT_CONNECTION_CHANGED`,connected:!1}).catch(()=>{}))}let a=r.findIndex(t=>t.id===e);r[a].disabled=!0,await chrome.storage.local.set({pairedAgents:r}),U(t(`agentConfig.agentDisabledToast`,{name:i.name}),`info`),await y(),await T(),n.activeAgentId===e&&J().catch(()=>{})}async function w(e){let n=(await chrome.storage.local.get([`pairedAgents`,`activeAgentId`])).pairedAgents||[],r=n.findIndex(t=>t.id===e);r!==-1&&(n[r].disabled=!1,await chrome.storage.local.set({pairedAgents:n}),U(t(`agentConfig.agentEnabledToast`,{name:n[r].name}),`success`),await y())}async function ne(e,n){k(`checking`,t(`agentConfig.fetchingAgentInfo`));try{let r=await fetch(`${e}/api/status`,{cache:`no-cache`});if(!r.ok){k(`disconnected`,t(`agentConfig.agentUnreachable`));return}let i=await r.json();try{let r=await fetch(`${e}/api/status/detail`,{cache:`no-cache`,headers:{Authorization:`Bearer ${n}`}});if(r.ok){let e=le(i,await r.json()),t=[`Agent v${e.version}`];e.platformName&&e.arch&&t.push(`${e.platformName} ${e.arch}`),e.nodeVersion&&t.push(`Node ${e.nodeVersion}`),k(`connected`,t.join(` | `),e)}else k(`disconnected`,t(`agentConfig.tokenExpired`))}catch{k(`disconnected`,t(`agentConfig.tokenExpired`))}}catch{k(`disconnected`,t(`agentConfig.cannotConnectAgent`))}}async function T(){let n=await chrome.storage.local.get([`pairedAgents`,`activeAgentId`]),r=n.pairedAgents||[],i=n.activeAgentId;if(!i||r.length===0){k(`disconnected`,r.length>0?t(`agentConfig.notConnectedSelect`):t(`agentConfig.notConnectedAdd`));return}let a=r.find(e=>e.id===i);a&&(e.value=a.url,await ne(a.url,h(a.token)))}function re(e){if(e==null||e===0)return t(`agentConfig.unlimited`);let n=[`B`,`KB`,`MB`,`GB`],r=0,i=e;for(;i>=1024&&r<n.length-1;)i/=1024,r++;return Math.round(i*10)/10+` `+n[r]}function ie(e){return e==null||e===0?t(`agentConfig.unlimited`):e<1e3?e+`ms`:e<6e4?(e/1e3).toFixed(0)+`s`:(e/6e4).toFixed(1)+` min`}function oe(e){if(e==null||e<0)return`-`;if(e<60)return e+`s`;if(e<3600)return Math.floor(e/60)+`min `+e%60+`s`;if(e<86400){let t=Math.floor(e/3600),n=Math.floor(e%3600/60);return t+`h `+n+`min`}let t=Math.floor(e/86400),n=Math.floor(e%86400/3600);return t+`d `+n+`h`}function se(e){return e==null||e<0?`-`:e<1e3?e+`μs`:e<1e6?(e/1e3).toFixed(1)+`ms`:(e/1e6).toFixed(2)+`s`}function E(e){return e==null||e<0?`-`:e<1e3?e+`ms`:e<6e4?(e/1e3).toFixed(1)+`s`:e<36e5?(e/6e4).toFixed(1)+`min`:(e/36e5).toFixed(2)+`h`}function D(e){return!Array.isArray(e)||e.length===0?t(`agentConfig.idle`):e.map(e=>{let n=(e.command||``).replace(/\s+/g,` `).trim(),r=n.length>48?n.slice(0,48)+`…`:n||t(`agentConfig.unknownCommand`),i=e.pid?`pid=${O(String(e.pid))}`:``,a=E(e.duration);return[`<code>${O(r)}</code>`,i,O(a)].filter(Boolean).join(` · `)}).join(`<br>`)}function ce(e){if(!d)return;let n=[];if(e.version&&n.push(`<div class="detail-row"><span class="detail-label">${t(`agentConfig.detailVersion`)}</span><span class="detail-value">${O(e.version)}</span></div>`),e.platformName){let r=e.arch?` (${e.arch})`:``;n.push(`<div class="detail-row"><span class="detail-label">${t(`agentConfig.detailSystem`)}</span><span class="detail-value">${O(e.platformName)}${r}</span></div>`)}else if(e.platform){let r=e.arch?` (${e.arch})`:``;n.push(`<div class="detail-row"><span class="detail-label">${t(`agentConfig.detailSystem`)}</span><span class="detail-value">${O(e.platform)}${r}</span></div>`)}if(e.hostname&&n.push(`<div class="detail-row"><span class="detail-label">${t(`agentConfig.detailHostname`)}</span><span class="detail-value">${O(e.hostname)}</span></div>`),e.shell&&n.push(`<div class="detail-row"><span class="detail-label">Shell</span><span class="detail-value">${O(e.shell)}</span></div>`),e.homeDir&&n.push(`<div class="detail-row"><span class="detail-label">${t(`agentConfig.detailHomeDir`)}</span><span class="detail-value">${O(e.homeDir)}</span></div>`),e.nodeVersion&&n.push(`<div class="detail-row"><span class="detail-label">Node.js</span><span class="detail-value">${O(e.nodeVersion)}</span></div>`),e.runningProcesses!=null){let r=Array.isArray(e.runningProcesses)?e.runningProcesses.length:0,i=r>0?t(`agentConfig.detailRunningProcessesCount`,{count:r}):t(`agentConfig.detailRunningProcesses`);n.push(`<div class="detail-row"><span class="detail-label">${i}</span><span class="detail-value">${D(e.runningProcesses)}</span></div>`)}if(e.resourceUsage){let r=e.resourceUsage;n.push(`<div class="detail-row"><span class="detail-label">${t(`agentConfig.detailMemoryUsage`)}</span><span class="detail-value">${t(`agentConfig.detailMemoryDetail`,{used:r.memoryUsedMB,total:r.memoryTotalMB,rss:r.memoryRssMB})}</span></div>`),n.push(`<div class="detail-row"><span class="detail-label">${t(`agentConfig.detailUptime`)}</span><span class="detail-value">${oe(r.uptimeSeconds)}</span></div>`),n.push(`<div class="detail-row"><span class="detail-label">${t(`agentConfig.detailCpuUser`)}</span><span class="detail-value">${se(r.cpuUser)}</span></div>`),n.push(`<div class="detail-row"><span class="detail-label">${t(`agentConfig.detailCpuSystem`)}</span><span class="detail-value">${se(r.cpuSystem)}</span></div>`)}if(e.commandTimeout!=null&&n.push(`<div class="detail-row"><span class="detail-label">${t(`agentConfig.detailCommandTimeout`)}</span><span class="detail-value">${ie(e.commandTimeout)}</span></div>`),e.uploadMaxSize!=null&&n.push(`<div class="detail-row"><span class="detail-label">${t(`agentConfig.detailUploadMaxSize`)}</span><span class="detail-value">${re(e.uploadMaxSize)}</span></div>`),e.fileMaxSize!=null&&n.push(`<div class="detail-row"><span class="detail-label">${t(`agentConfig.detailFileMaxSize`)}</span><span class="detail-value">${re(e.fileMaxSize)}</span></div>`),e.allowedPaths&&e.allowedPaths.length>0){let r=e.allowedPaths.map(e=>`<code>${O(e)}</code>`).join(`<br>`);n.push(`<div class="detail-row"><span class="detail-label">${t(`agentConfig.detailAllowedPaths`)}</span><span class="detail-value">${r}</span></div>`)}e.pairCodeTTL!=null&&n.push(`<div class="detail-row"><span class="detail-label">${t(`agentConfig.detailPairCodeTTL`)}</span><span class="detail-value">${e.pairCodeTTL}s</span></div>`),d.innerHTML=n.join(``),u.style.display=`block`}function O(e){let t=document.createElement(`div`);return t.textContent=e,t.innerHTML}function k(e,n,r){o.className=`agent-status `+e,a.textContent=n,s.style.display=``,e===`connected`?(o.className=`agent-status connected`,r&&(c.style.display=``,r.workdir&&(l.innerHTML=t(`agentConfig.detailWorkdir`,{dir:r.workdir})),ce(r))):e===`checking`?o.className=`agent-status checking`:(c.style.display=`none`,o.className=`agent-status disconnected`,u&&(u.style.display=`none`),d&&(d.innerHTML=``))}function le(e,t){return{version:t?.version||e?.version,platformName:t?.platformName||e?.platformName,platform:t?.platform||e?.platform,arch:t?.arch||e?.arch,hostname:t?.hostname||e?.hostname,shell:t?.shell||e?.shell,homeDir:t?.homeDir||e?.homeDir,nodeVersion:t?.nodeVersion||e?.nodeVersion,searchTools:t?.searchTools||e?.searchTools,runningProcesses:t?.runningProcesses??e?.runningProcesses,workdir:t?.workdir||e?.workdir||``,allowedPaths:t?.allowedPaths||e?.allowedPaths||[],commandTimeout:t?.commandTimeout||e?.commandTimeout,fileMaxSize:t?.fileMaxSize||e?.fileMaxSize,uploadMaxSize:t?.uploadMaxSize??e?.uploadMaxSize,pairCodeTTL:t?.pairCodeTTL||e?.pairCodeTTL,resourceUsage:t?.resourceUsage||null}}async function A(){let a=e.value.trim()||`http://127.0.0.1:18910`,o=n.value.trim();if(!o||o.length!==6){U(t(`agentConfig.pairCodeRequired`),`warning`);return}k(`checking`,t(`agentConfig.pairing`)),i.disabled=!0,i.textContent=t(`agentConfig.pairingBtn`);try{let e=await(await fetch(`${a}/api/pair`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({code:o,extensionId:chrome.runtime.id})})).json();if(e.success&&e.token){let i=r?.value.trim()||null;if(!i){try{let[t,n]=await Promise.all([fetch(`${a}/api/status`),fetch(`${a}/api/status/detail`,{headers:{Authorization:`Bearer ${e.token}`}})]),r=t.ok?await t.json():{},o=n.ok?await n.json():{},s=[];o.platformName?s.push(o.platformName):r.platformName&&s.push(r.platformName),o.arch?s.push(o.arch):r.arch&&s.push(r.arch),i=s.length>0?s.join(` `):new URL(a).hostname}catch{i=new URL(a).hostname}i||=t(`agentConfig.unnamedAgent`)}let o=`pa_${Date.now().toString(36)}_${Math.random().toString(36).slice(2,8)}`,s={id:o,name:i,url:a,token:e.token,pairedAt:new Date().toISOString()},c=(await chrome.storage.local.get(`pairedAgents`)).pairedAgents||[];c.push({...s,token:ae(s.token)}),await chrome.storage.local.set({pairedAgents:c,activeAgentId:o}),n.value=``,r&&(r.value=``),U(t(`agentConfig.pairSuccess`,{name:i}),`success`);try{let[t,n]=await Promise.all([fetch(`${a}/api/status`),fetch(`${a}/api/status/detail`,{headers:{Authorization:`Bearer ${e.token}`}})]);if(t.ok&&n.ok){let e=le(await t.json(),await n.json()),r=[`Agent v${e.version}`];e.platformName&&e.arch&&r.push(`${e.platformName} ${e.arch}`),e.nodeVersion&&r.push(`Node ${e.nodeVersion}`),k(`connected`,r.join(` | `),e)}}catch{}await y(),chrome.runtime.sendMessage({type:`AGENT_CONNECTION_CHANGED`,connected:!0,agentId:o}).catch(()=>{})}else k(`disconnected`,t(`agentConfig.pairFailed`,{error:e.error||t(`agentConfig.unknownError`)})),U(e.error||t(`agentConfig.pairFailedShort`),`error`)}catch(e){k(`disconnected`,t(`agentConfig.connectFailed`)),U(t(`agentConfig.cannotConnectAgentMsg`,{error:e.message}),`error`)}finally{i.disabled=!1,i.textContent=t(`agentConfig.connect`)}}async function ue(e){(await chrome.storage.local.get([`pairedAgents`,`activeAgentId`])).activeAgentId===e&&(await chrome.storage.local.set({activeAgentId:null}),k(`disconnected`,t(`agentConfig.notConnectedSelect`)),U(t(`agentConfig.disconnectedToast`),`info`),await y(),chrome.runtime.sendMessage({type:`AGENT_CONNECTION_CHANGED`,connected:!1}).catch(()=>{}))}u&&d&&u.addEventListener(`click`,()=>{let e=getComputedStyle(d).display!==`none`;d.style.display=e?`none`:`block`,u.textContent=t(e?`agentConfig.detailToggle`:`agentConfig.detailToggleOpen`),u.classList.toggle(`open`,!e)}),i.addEventListener(`click`,A),n.addEventListener(`keydown`,e=>{e.key===`Enter`&&A()}),(async()=>{await y(),await T()})(),chrome.runtime.sendMessage({type:`OPTIONS_PAGE_OPEN`}).catch(()=>{}),chrome.runtime.onMessage.addListener(function(e,t,n){e.type===`AGENT_STATUS_CHANGE`&&(async()=>{await y(),await T(),J().catch(()=>{})})()}),window.addEventListener(`beforeunload`,()=>{chrome.runtime.sendMessage({type:`OPTIONS_PAGE_CLOSED`}).catch(()=>{})})}
|
|
787
|
-
//# sourceMappingURL=options-Djm7emls.js.map
|
|
793
|
+
</div>`}).join(``),ee(n),_(),n.forEach(e=>{e.disabled||v(e.url).then(t=>{x(e.id,t)})})}let b=null;function x(e,n){let r=p.querySelector(`[data-agent-id="${e}"]`);if(!r)return;let i=r.querySelector(`.paired-agent-dot`),a=r.querySelector(`.paired-agent-status-text`),o=r.classList.contains(`active`),s=o?n?`active-online`:`active-offline`:n?`online`:`offline`,c=t(o?n?`agentConfig.connected`:`agentConfig.notConnected`:n?`agentConfig.online`:`agentConfig.offline`);i&&(i.className=`paired-agent-dot ${s}`,i.title=`${o?t(`agentConfig.currentInUse`):``}${c}`),a&&(a.className=`paired-agent-status-text ${n?`online`:`offline`}`,a.textContent=c),o&&b!==null&&b!==n&&chrome.runtime.sendMessage({type:`AGENT_STATUS_CHANGE`,connected:n,status:t(n?`agentConfig.online`:`agentConfig.offline`),agentId:e}).catch(()=>{}),o&&(b=n)}function ee(e){p.querySelectorAll(`.paired-agent-name`).forEach(e=>{e.addEventListener(`click`,()=>{if(e.querySelector(`input`))return;let t=e.dataset.agentId,n=e.dataset.original,r=document.createElement(`input`);r.type=`text`,r.value=n,r.className=`paired-agent-name-input`,r.style.cssText=`flex:1;font-size:14px;font-weight:500;border:1px solid var(--brand-500);border-radius:4px;padding:2px 6px;outline:none;color:var(--text-primary);`,e.innerHTML=``,e.appendChild(r),r.focus(),r.select(),r.addEventListener(`blur`,async()=>{let i=r.value.trim()||n;r.remove(),e.textContent=i,e.dataset.original=i;let a=(await chrome.storage.local.get([`pairedAgents`,`activeAgentId`])).pairedAgents||[],o=a.findIndex(e=>e.id===t);o!==-1&&(a[o].name=i,await chrome.storage.local.set({pairedAgents:a}))}),r.addEventListener(`keydown`,e=>{e.key===`Enter`&&r.blur(),e.key===`Escape`&&(r.value=n,r.blur())})})}),p.querySelectorAll(`.paired-agent-btn`).forEach(e=>{e.addEventListener(`click`,async t=>{t.stopPropagation();let n=e.dataset.action,r=e.dataset.id;n===`switch`?await te(r):n===`deactivate`?await de(r):n===`disable`?await ne(r):n===`enable`?await C(r):n===`delete`&&await S(r)})})}async function te(n){let r=((await chrome.storage.local.get(`pairedAgents`)).pairedAgents||[]).find(e=>e.id===n);r&&(await chrome.storage.local.set({activeAgentId:n}),e.value=r.url,await w(r.url,h(r.token)),chrome.runtime.sendMessage({type:`AGENT_CONNECTION_CHANGED`,connected:!0,agentId:n}).catch(()=>{}),H(t(`agentConfig.connectedTo`,{name:r.name}),`success`),await y(),J().catch(()=>{}))}async function S(e){let n=await chrome.storage.local.get([`pairedAgents`,`activeAgentId`]),r=n.pairedAgents||[],i=r.find(t=>t.id===e);if(!i||!await G(t(`agentConfig.confirmDeleteAgent`,{name:i.name,url:i.url}),t(`agentConfig.deleteAgentTitle`)))return;let a=r.filter(t=>t.id!==e),o=n.activeAgentId;n.activeAgentId===e&&(o=a.length>0?a[0].id:null),await chrome.storage.local.set({pairedAgents:a,activeAgentId:o}),o&&o!==n.activeAgentId?(a.find(e=>e.id===o),chrome.runtime.sendMessage({type:`AGENT_CONNECTION_CHANGED`,connected:!0,agentId:o}).catch(()=>{})):o||chrome.runtime.sendMessage({type:`AGENT_CONNECTION_CHANGED`,connected:!1}).catch(()=>{}),H(t(`agentConfig.agentDeleted`,{name:i.name}),`info`),await y(),await T(),o!==n.activeAgentId&&J().catch(()=>{})}async function ne(e){let n=await chrome.storage.local.get([`pairedAgents`,`activeAgentId`]),r=n.pairedAgents||[],i=r.find(t=>t.id===e);if(!i)return;if(n.activeAgentId===e){let t=r.find(t=>t.id!==e&&!t.disabled);t?(await chrome.storage.local.set({activeAgentId:t.id}),chrome.runtime.sendMessage({type:`AGENT_CONNECTION_CHANGED`,connected:!0,agentId:t.id}).catch(()=>{})):(await chrome.storage.local.set({activeAgentId:null}),chrome.runtime.sendMessage({type:`AGENT_CONNECTION_CHANGED`,connected:!1}).catch(()=>{}))}let a=r.findIndex(t=>t.id===e);r[a].disabled=!0,await chrome.storage.local.set({pairedAgents:r}),H(t(`agentConfig.agentDisabledToast`,{name:i.name}),`info`),await y(),await T(),n.activeAgentId===e&&J().catch(()=>{})}async function C(e){let n=(await chrome.storage.local.get([`pairedAgents`,`activeAgentId`])).pairedAgents||[],r=n.findIndex(t=>t.id===e);r!==-1&&(n[r].disabled=!1,await chrome.storage.local.set({pairedAgents:n}),H(t(`agentConfig.agentEnabledToast`,{name:n[r].name}),`success`),await y())}async function w(e,n){D(`checking`,t(`agentConfig.fetchingAgentInfo`));try{let r=await fetch(`${e}/api/status`,{cache:`no-cache`});if(!r.ok){D(`disconnected`,t(`agentConfig.agentUnreachable`));return}let i=await r.json();try{let r=await fetch(`${e}/api/status/detail`,{cache:`no-cache`,headers:{Authorization:`Bearer ${n}`}});if(r.ok){let e=O(i,await r.json()),t=[`Agent v${e.version}`];e.platformName&&e.arch&&t.push(`${e.platformName} ${e.arch}`),e.nodeVersion&&t.push(`Node ${e.nodeVersion}`),D(`connected`,t.join(` | `),e)}else D(`disconnected`,t(`agentConfig.tokenExpired`))}catch{D(`disconnected`,t(`agentConfig.tokenExpired`))}}catch{D(`disconnected`,t(`agentConfig.cannotConnectAgent`))}}async function T(){let n=await chrome.storage.local.get([`pairedAgents`,`activeAgentId`]),r=n.pairedAgents||[],i=n.activeAgentId;if(!i||r.length===0){D(`disconnected`,r.length>0?t(`agentConfig.notConnectedSelect`):t(`agentConfig.notConnectedAdd`));return}let a=r.find(e=>e.id===i);a&&(e.value=a.url,await w(a.url,h(a.token)))}function re(e){if(e==null||e===0)return t(`agentConfig.unlimited`);let n=[`B`,`KB`,`MB`,`GB`],r=0,i=e;for(;i>=1024&&r<n.length-1;)i/=1024,r++;return Math.round(i*10)/10+` `+n[r]}function ie(e){return e==null||e===0?t(`agentConfig.unlimited`):e<1e3?e+`ms`:e<6e4?(e/1e3).toFixed(0)+`s`:(e/6e4).toFixed(1)+` min`}function oe(e){if(e==null||e<0)return`-`;if(e<60)return e+`s`;if(e<3600)return Math.floor(e/60)+`min `+e%60+`s`;if(e<86400){let t=Math.floor(e/3600),n=Math.floor(e%3600/60);return t+`h `+n+`min`}let t=Math.floor(e/86400),n=Math.floor(e%86400/3600);return t+`d `+n+`h`}function se(e){return e==null||e<0?`-`:e<1e3?e+`μs`:e<1e6?(e/1e3).toFixed(1)+`ms`:(e/1e6).toFixed(2)+`s`}function ce(e){return e==null||e<0?`-`:e<1e3?e+`ms`:e<6e4?(e/1e3).toFixed(1)+`s`:e<36e5?(e/6e4).toFixed(1)+`min`:(e/36e5).toFixed(2)+`h`}function le(e){return!Array.isArray(e)||e.length===0?t(`agentConfig.idle`):e.map(e=>{let n=(e.command||``).replace(/\s+/g,` `).trim(),r=n.length>48?n.slice(0,48)+`…`:n||t(`agentConfig.unknownCommand`),i=e.pid?`pid=${E(String(e.pid))}`:``,a=ce(e.duration);return[`<code>${E(r)}</code>`,i,E(a)].filter(Boolean).join(` · `)}).join(`<br>`)}function ue(e){if(!d)return;let n=[];if(e.version&&n.push(`<div class="detail-row"><span class="detail-label">${t(`agentConfig.detailVersion`)}</span><span class="detail-value">${E(e.version)}</span></div>`),e.platformName){let r=e.arch?` (${e.arch})`:``;n.push(`<div class="detail-row"><span class="detail-label">${t(`agentConfig.detailSystem`)}</span><span class="detail-value">${E(e.platformName)}${r}</span></div>`)}else if(e.platform){let r=e.arch?` (${e.arch})`:``;n.push(`<div class="detail-row"><span class="detail-label">${t(`agentConfig.detailSystem`)}</span><span class="detail-value">${E(e.platform)}${r}</span></div>`)}if(e.hostname&&n.push(`<div class="detail-row"><span class="detail-label">${t(`agentConfig.detailHostname`)}</span><span class="detail-value">${E(e.hostname)}</span></div>`),e.shell&&n.push(`<div class="detail-row"><span class="detail-label">Shell</span><span class="detail-value">${E(e.shell)}</span></div>`),e.homeDir&&n.push(`<div class="detail-row"><span class="detail-label">${t(`agentConfig.detailHomeDir`)}</span><span class="detail-value">${E(e.homeDir)}</span></div>`),e.nodeVersion&&n.push(`<div class="detail-row"><span class="detail-label">Node.js</span><span class="detail-value">${E(e.nodeVersion)}</span></div>`),e.runningProcesses!=null){let r=Array.isArray(e.runningProcesses)?e.runningProcesses.length:0,i=r>0?t(`agentConfig.detailRunningProcessesCount`,{count:r}):t(`agentConfig.detailRunningProcesses`);n.push(`<div class="detail-row"><span class="detail-label">${i}</span><span class="detail-value">${le(e.runningProcesses)}</span></div>`)}if(e.resourceUsage){let r=e.resourceUsage;n.push(`<div class="detail-row"><span class="detail-label">${t(`agentConfig.detailMemoryUsage`)}</span><span class="detail-value">${t(`agentConfig.detailMemoryDetail`,{used:r.memoryUsedMB,total:r.memoryTotalMB,rss:r.memoryRssMB})}</span></div>`),n.push(`<div class="detail-row"><span class="detail-label">${t(`agentConfig.detailUptime`)}</span><span class="detail-value">${oe(r.uptimeSeconds)}</span></div>`),n.push(`<div class="detail-row"><span class="detail-label">${t(`agentConfig.detailCpuUser`)}</span><span class="detail-value">${se(r.cpuUser)}</span></div>`),n.push(`<div class="detail-row"><span class="detail-label">${t(`agentConfig.detailCpuSystem`)}</span><span class="detail-value">${se(r.cpuSystem)}</span></div>`)}if(e.commandTimeout!=null&&n.push(`<div class="detail-row"><span class="detail-label">${t(`agentConfig.detailCommandTimeout`)}</span><span class="detail-value">${ie(e.commandTimeout)}</span></div>`),e.uploadMaxSize!=null&&n.push(`<div class="detail-row"><span class="detail-label">${t(`agentConfig.detailUploadMaxSize`)}</span><span class="detail-value">${re(e.uploadMaxSize)}</span></div>`),e.fileMaxSize!=null&&n.push(`<div class="detail-row"><span class="detail-label">${t(`agentConfig.detailFileMaxSize`)}</span><span class="detail-value">${re(e.fileMaxSize)}</span></div>`),e.allowedPaths&&e.allowedPaths.length>0){let r=e.allowedPaths.map(e=>`<code>${E(e)}</code>`).join(`<br>`);n.push(`<div class="detail-row"><span class="detail-label">${t(`agentConfig.detailAllowedPaths`)}</span><span class="detail-value">${r}</span></div>`)}e.pairCodeTTL!=null&&n.push(`<div class="detail-row"><span class="detail-label">${t(`agentConfig.detailPairCodeTTL`)}</span><span class="detail-value">${e.pairCodeTTL}s</span></div>`),d.innerHTML=n.join(``),u.style.display=`block`}function E(e){let t=document.createElement(`div`);return t.textContent=e,t.innerHTML}function D(e,n,r){o.className=`agent-status `+e,a.textContent=n,s.style.display=``,e===`connected`?(o.className=`agent-status connected`,r&&(c.style.display=``,r.workdir&&(l.innerHTML=t(`agentConfig.detailWorkdir`,{dir:r.workdir})),ue(r))):e===`checking`?o.className=`agent-status checking`:(c.style.display=`none`,o.className=`agent-status disconnected`,u&&(u.style.display=`none`),d&&(d.innerHTML=``))}function O(e,t){return{version:t?.version||e?.version,platformName:t?.platformName||e?.platformName,platform:t?.platform||e?.platform,arch:t?.arch||e?.arch,hostname:t?.hostname||e?.hostname,shell:t?.shell||e?.shell,homeDir:t?.homeDir||e?.homeDir,nodeVersion:t?.nodeVersion||e?.nodeVersion,searchTools:t?.searchTools||e?.searchTools,runningProcesses:t?.runningProcesses??e?.runningProcesses,workdir:t?.workdir||e?.workdir||``,allowedPaths:t?.allowedPaths||e?.allowedPaths||[],commandTimeout:t?.commandTimeout||e?.commandTimeout,fileMaxSize:t?.fileMaxSize||e?.fileMaxSize,uploadMaxSize:t?.uploadMaxSize??e?.uploadMaxSize,pairCodeTTL:t?.pairCodeTTL||e?.pairCodeTTL,resourceUsage:t?.resourceUsage||null}}async function k(){let a=e.value.trim()||`http://127.0.0.1:18910`,o=n.value.trim();if(!o||o.length!==6){H(t(`agentConfig.pairCodeRequired`),`warning`);return}D(`checking`,t(`agentConfig.pairing`)),i.disabled=!0,i.textContent=t(`agentConfig.pairingBtn`);try{let e=await(await fetch(`${a}/api/pair`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({code:o,extensionId:chrome.runtime.id})})).json();if(e.success&&e.token){let i=r?.value.trim()||null;if(!i){try{let[t,n]=await Promise.all([fetch(`${a}/api/status`),fetch(`${a}/api/status/detail`,{headers:{Authorization:`Bearer ${e.token}`}})]),r=t.ok?await t.json():{},o=n.ok?await n.json():{},s=[];o.platformName?s.push(o.platformName):r.platformName&&s.push(r.platformName),o.arch?s.push(o.arch):r.arch&&s.push(r.arch),i=s.length>0?s.join(` `):new URL(a).hostname}catch{i=new URL(a).hostname}i||=t(`agentConfig.unnamedAgent`)}let o=`pa_${Date.now().toString(36)}_${Math.random().toString(36).slice(2,8)}`,s={id:o,name:i,url:a,token:e.token,pairedAt:new Date().toISOString()},c=(await chrome.storage.local.get(`pairedAgents`)).pairedAgents||[];c.push({...s,token:ae(s.token)}),await chrome.storage.local.set({pairedAgents:c,activeAgentId:o}),n.value=``,r&&(r.value=``),H(t(`agentConfig.pairSuccess`,{name:i}),`success`);try{let[t,n]=await Promise.all([fetch(`${a}/api/status`),fetch(`${a}/api/status/detail`,{headers:{Authorization:`Bearer ${e.token}`}})]);if(t.ok&&n.ok){let e=O(await t.json(),await n.json()),r=[`Agent v${e.version}`];e.platformName&&e.arch&&r.push(`${e.platformName} ${e.arch}`),e.nodeVersion&&r.push(`Node ${e.nodeVersion}`),D(`connected`,r.join(` | `),e)}}catch{}await y(),chrome.runtime.sendMessage({type:`AGENT_CONNECTION_CHANGED`,connected:!0,agentId:o}).catch(()=>{})}else D(`disconnected`,t(`agentConfig.pairFailed`,{error:e.error||t(`agentConfig.unknownError`)})),H(e.error||t(`agentConfig.pairFailedShort`),`error`)}catch(e){D(`disconnected`,t(`agentConfig.connectFailed`)),H(t(`agentConfig.cannotConnectAgentMsg`,{error:e.message}),`error`)}finally{i.disabled=!1,i.textContent=t(`agentConfig.connect`)}}async function de(e){(await chrome.storage.local.get([`pairedAgents`,`activeAgentId`])).activeAgentId===e&&(await chrome.storage.local.set({activeAgentId:null}),D(`disconnected`,t(`agentConfig.notConnectedSelect`)),H(t(`agentConfig.disconnectedToast`),`info`),await y(),chrome.runtime.sendMessage({type:`AGENT_CONNECTION_CHANGED`,connected:!1}).catch(()=>{}))}u&&d&&u.addEventListener(`click`,()=>{let e=getComputedStyle(d).display!==`none`;d.style.display=e?`none`:`block`,u.textContent=t(e?`agentConfig.detailToggle`:`agentConfig.detailToggleOpen`),u.classList.toggle(`open`,!e)}),i.addEventListener(`click`,k),n.addEventListener(`keydown`,e=>{e.key===`Enter`&&k()}),(async()=>{await y(),await T()})(),chrome.runtime.sendMessage({type:`OPTIONS_PAGE_OPEN`}).catch(()=>{}),chrome.runtime.onMessage.addListener(function(e,t,n){e.type===`AGENT_STATUS_CHANGE`&&(async()=>{await y(),await T(),J().catch(()=>{})})()}),window.addEventListener(`beforeunload`,()=>{chrome.runtime.sendMessage({type:`OPTIONS_PAGE_CLOSED`}).catch(()=>{})})}
|