ai-helper-agent 2.2.0 → 2.3.1
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 +94 -1
- package/README.zh-CN.md +94 -1
- package/dist/assets/{agent-store-DOyMdB_7.js → agent-store-DcAs6YyA.js} +2 -2
- package/dist/assets/{agent-store-DOyMdB_7.js.map → agent-store-DcAs6YyA.js.map} +1 -1
- package/dist/assets/background.js +83 -89
- package/dist/assets/background.js.map +1 -1
- package/dist/assets/content.js +81 -65
- package/dist/assets/{i18n-MmYITlVj.js → i18n-C4jSRoCH.js} +5 -5
- package/dist/assets/i18n-C4jSRoCH.js.map +1 -0
- package/dist/assets/{model-profiles-CV_sUuPf.js → model-profiles-Dl_MsXWa.js} +5 -5
- package/dist/assets/model-profiles-Dl_MsXWa.js.map +1 -0
- package/dist/assets/options-8-nu3P5K.css +1 -0
- package/dist/assets/options.js +264 -197
- package/dist/assets/options.js.map +1 -1
- package/dist/assets/{page-snapshot-renderer-CE53ibi-.js → page-snapshot-renderer-CVL6r6Kf.js} +2 -2
- package/dist/assets/{page-snapshot-renderer-CE53ibi-.js.map → page-snapshot-renderer-CVL6r6Kf.js.map} +1 -1
- package/dist/assets/{session-store-B0ZPGm7d.js → session-store-CzVQCgQ_.js} +4 -4
- package/dist/assets/session-store-CzVQCgQ_.js.map +1 -0
- package/dist/assets/side_panel.css +1 -1
- package/dist/assets/side_panel.js +327 -293
- package/dist/assets/side_panel.js.map +1 -1
- package/dist/assets/version-CNG2KGnJ.js +2 -0
- package/dist/assets/version-CNG2KGnJ.js.map +1 -0
- package/dist/libs/jspdf.min.js +1 -1
- package/dist/manifest.json +2 -2
- package/dist/offscreen/offscreen.js +4 -4
- package/dist/options.html +140 -3
- package/dist/side_panel.html +27 -4
- package/package.json +1 -1
- package/src/config.js +72 -24
- package/src/crypto-lite.js +31 -0
- package/src/locales/en.json +55 -0
- package/src/locales/zh.json +55 -0
- package/src/memory/embedding-config.js +95 -0
- package/src/memory/fusion.js +60 -0
- package/src/memory/injection.js +118 -0
- package/src/memory/routes.js +193 -0
- package/src/memory/service.js +957 -0
- package/src/memory/tags.js +62 -0
- package/src/memory/tier.js +37 -0
- package/src/memory/tokens.js +158 -0
- package/src/memory/vectors.js +128 -0
- package/src/rag/embedding/index.js +7 -0
- package/src/rag/embedding/local.js +25 -0
- package/src/rag/keyword-match.js +112 -0
- package/src/rag/manager.js +15 -0
- package/src/rag/searcher.js +15 -87
- package/src/server.js +6 -0
- package/dist/assets/i18n-MmYITlVj.js.map +0 -1
- package/dist/assets/model-profiles-CV_sUuPf.js.map +0 -1
- package/dist/assets/options-Df_1Dtn8.css +0 -1
- package/dist/assets/session-store-B0ZPGm7d.js.map +0 -1
- /package/dist/_locales/{zh → zh_CN}/messages.json +0 -0
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-C4jSRoCH.js";import{F as l,Q as u,Y as d,Z 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 S,o as te,p as C,r as w,s as ne,t as T,u as re,v as ie,x as ae}from"./model-profiles-Dl_MsXWa.js";import{t as oe}from"./version-CNG2KGnJ.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-MmY
|
|
|
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 se=[`deepseek-v4-pro`,`deepseek-v4-flash`],E=[`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`],D=f,ce=[{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}],O={"ai-search":`optionsConst.aiSearch`,explain:`optionsConst.explain`,translate:`optionsConst.translate`,summary:`optionsConst.summary`,copy:`optionsConst.copy`};function k(e){let n=O[e];return n?t(n):void 0}var le={"ai-search":`selToolbar.sysPromptAisearch`,explain:`selToolbar.sysPromptExplain`,translate:`selToolbar.sysPromptTranslate`,summary:`selToolbar.sysPromptSummary`,copy:`selToolbar.sysPromptCopy`};function A(e){let n=le[e];return n?t(n):void 0}function ue(){return t(`optionsConst.defaultSystemPrompt`)}var j={maxInputHistory:20,maxHistoryMessages:50,...d},M=[1e3,2e3,4e3,8e3,16e3,32e3,64e3,128e3,2e5,256e3,512e3,1e6],de=M.length-1;function fe(e){let t=Number(e)||0,n=0,r=1/0;for(let e=0;e<M.length;e++){let i=Math.abs(M[e]-t);i<r&&(r=i,n=e)}return n}function pe(e){return M[Math.min(Math.max(Math.round(Number(e)||0),0),de)]}var N=null,P=null,F=null,I=null,L=null,me=[],R=null;function he(){N=document.createElement(`div`),N.className=`ctx-popover`,N.setAttribute(`role`,`dialog`),N.setAttribute(`aria-label`,t(`settings.ctxSliderIconTitle`)),N.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="${de}" 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
|
-
`,M=j.querySelector(`.ctx-popover-slider`),pe=j.querySelector(`.ctx-popover-value`),me=j.querySelector(`.ctx-popover-auto-tag`),N=j.querySelector(`.ctx-popover-auto-btn`);let e=j.querySelector(`.ctx-popover-scale`);for(let t=0;t<k.length;t++){let t=document.createElement(`span`);t.className=`ctx-popover-scale-dot`,e.appendChild(t)}P=[...e.children],j.querySelector(`.ctx-popover-scale-start`).textContent=l(k[0]),j.querySelector(`.ctx-popover-scale-end`).textContent=l(k[A]),N.textContent=t(`settings.ctxSliderResetAuto`),N.title=t(`settings.ctxSliderAutoTitle`),me.textContent=t(`settings.ctxSliderAuto`),M.addEventListener(`pointerdown`,()=>{if(!F)return;let e=parseInt(F.optionEl.dataset.contextWindow,10)||0;F.drag={originTokens:e,originIndex:de(e||u(F.optionEl.dataset.value)),moved:!1}}),M.addEventListener(`input`,()=>{if(!F)return;F.drag&&(F.drag.moved=!0);let e=fe(M.value);I(e,!1),F.callbacks.onPreview?.(e)}),M.addEventListener(`change`,()=>{F&&F.callbacks.onCommit?.(fe(M.value))}),N.addEventListener(`click`,()=>{F&&(F.callbacks.onReset?.(),I(u(F.optionEl.dataset.value),!0))})}function I(e,t){let n=de(e);M.value=String(n),pe.textContent=l(e),pe.classList.toggle(`is-auto`,t),me.style.display=t?``:`none`,N.style.display=t?`none`:``,P.forEach((e,t)=>e.classList.toggle(`is-active`,t===n));let r=(n/A*100).toFixed(1)+`%`;M.style.setProperty(`--ctx-fill`,r)}function ge(e){!e||!e.moved||!F||(F.callbacks.onPreview?.(e.originTokens),e.originTokens>0?I(e.originTokens,!1):I(u(F.optionEl.dataset.value),!0))}function _e(){let e=F.anchorBtn.getBoundingClientRect(),t=j.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)}j.style.left=`${Math.round(n)}px`,j.style.top=`${Math.round(r)}px`}function ve(e,t,n={}){if(!e||!t)return;if(F&&F.anchorBtn===e){L();return}L();let r=parseInt(t.dataset.contextWindow,10)||0;he(),F={anchorBtn:e,optionEl:t,callbacks:n},j.querySelector(`.ctx-popover-title`).textContent=t.dataset.value||``,r>0?I(r,!1):I(u(t.dataset.value),!0),document.body.appendChild(j),_e(),M.focus({preventScroll:!0}),F.onDocClick=t=>{j.contains(t.target)||e.contains(t.target)||L()},F.onKeyDown=e=>{e.key===`Escape`&&L()},F.onScroll=()=>L(),F.onResize=()=>L(),F.onDocPointerUp=()=>{if(!F?.drag)return;let e=F.drag;if(F.drag=null,!e.moved)return;let t=Number(M.value);t===e.originIndex&&F.callbacks.onCommit?.(fe(t))},F.onDocPointerCancel=()=>{if(!F?.drag)return;let e=F.drag;F.drag=null,ge(e)},document.addEventListener(`click`,F.onDocClick,!0),document.addEventListener(`keydown`,F.onKeyDown),document.addEventListener(`scroll`,F.onScroll,!0),document.addEventListener(`pointerup`,F.onDocPointerUp,!0),document.addEventListener(`pointercancel`,F.onDocPointerCancel,!0),window.addEventListener(`resize`,F.onResize)}function L(){if(!F)return;let e=F;ge(e.drag),F=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),j?.remove(),j=null,M=null,pe=null,me=null,N=null,P=[]}function ye(e){return!!(j&&e&&j.contains(e))}var R=`deepseek-v4-pro`;function be(e){R=e}var xe=``;function Se(e){xe=e}var Ce=`<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=Ce,e}function B(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=l(i),a.removeAttribute(`title`)):(a.classList.add(`is-auto`),a.textContent=l(u(e.dataset.value)),a.title=t(`settings.ctxBadgeAutoTip`))}function we(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 Te(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||=(we(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())}B(i,n),je()}return}De(r,Ee(e,n||0),e),je()}function Ee(e,n=0){let r=document.createElement(`div`);r.className=`model-option`,r.dataset.value=e,(!ae.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),B(r,n||0),r}function De(e,t,n){let r=[...e.querySelectorAll(`.model-option`)].find(e=>y(e.dataset.value,n)>0);r?e.insertBefore(t,r):e.appendChild(t)}function Oe(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 ke(e){L();let t=document.getElementById(`modelDropdown`),n=t.querySelector(`.model-option[data-value="${e}"]`);if(n&&n.remove(),R===e){let e=t.querySelector(`.model-option`),n=e?e.dataset.value:``;be(n);let r=document.getElementById(`modelInput`);r&&(r.value=n),Pe(n)}je()}function Ae(){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 je(){let e=Ae();chrome.storage.local.set({customModels:e},()=>{r.debug(`[Options] customModel list saved:`,e),p(e)})}function Me(e){chrome.storage.local.get([`customModels`],t=>{Ne(ee(t.customModels)),typeof e==`function`&&e()})}function Ne(e,t){let n=document.getElementById(`modelDropdown`);if(!n)return;L(),n.innerHTML=``;let r=[...e||[]].sort((e,t)=>y(e?.name,t?.name));for(let e of r)n.appendChild(Ee(e.name,e.contextWindow||0));let i=t===void 0?R:t;n.querySelectorAll(`.model-option`).forEach(e=>{e.classList.toggle(`selected`,e.dataset.value===i)})}function Pe(e){document.querySelectorAll(`.model-option`).forEach(t=>{t.dataset.value===e?t.classList.add(`selected`):t.classList.remove(`selected`)}),Fe(`modelInput`,`modelSelectedCtxBadge`,`modelDropdown`)}function Fe(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=l(e),i.style.display=``):i.style.display=`none`}else i.style.display=`none`}function Ie(e,t){if(!e||!e.querySelector(`.model-option-right`))return;let n=Number(t)||0,r=ae.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),B(e,n)}function Le(e,t){Ie(e,t),je(),Fe(`modelInput`,`modelSelectedCtxBadge`,`modelDropdown`)}function Re(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||=(we(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())}B(i,n),Be()}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),B(a,n||0),De(r,a,e),Be()}function ze(e){L();let t=document.getElementById(`imageModelDropdown`);if(!t)return;let 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(`imageModelInput`);r&&(r.value=n),Ue(n)}Be()}function Be(){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 Ve(e,t){Ie(e,t),Be(),Fe(`imageModelInput`,`imageModelSelectedCtxBadge`,`imageModelDropdown`)}function He(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;L(),i.innerHTML=``;let s=e=>typeof e==`string`?e:e&&e.name||``;[...a].sort((e,t)=>y(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),B(a,r||0),i.appendChild(a)}),o&&(Be(),r.debug(`[Options] image recognitionmodelauto-migratedisnewformat`)),typeof e==`function`&&e()})}function Ue(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`)}),Fe(`imageModelInput`,`imageModelSelectedCtxBadge`,`imageModelDropdown`))}var V=[];function We(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 Ge(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)}qe();return}T.includes(e)&&V.includes(e)&&(V=V.filter(t=>t!==e));let i=We(e,t,!T.includes(e));n.appendChild(i),qe()}function Ke(e){let t=document.getElementById(`apiBaseDropdown`);if(!t)return;let n=t.querySelector(`.model-option[data-value="${CSS.escape(e)}"]`);n&&n.remove(),T.includes(e)&&!V.includes(e)&&V.push(e);let r=document.getElementById(`apiBase`);r&&r.value.trim()===e&&(r.value=``),qe()}function qe(){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 Je(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=``,T.forEach(e=>{if(!V.includes(e)){let t=We(e,null,!1);n.appendChild(t)}}),r.forEach(e=>{if(typeof e==`string`){if(!T.includes(e)){let t=We(e,null,!0);n.appendChild(t)}}else if(e&&e.url){let t=We(e.url,e.label||null,!0);n.appendChild(t)}}),typeof e==`function`&&e()})}function Ye(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 Xe(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 Ze(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)}$e();return}T.includes(e)&&H.includes(e)&&(H=H.filter(t=>t!==e));let i=Xe(e,t,!T.includes(e));n.appendChild(i),$e()}function Qe(e){let t=document.getElementById(`imageApiBaseDropdown`);if(!t)return;let n=t.querySelector(`.model-option[data-value="${CSS.escape(e)}"]`);n&&n.remove(),T.includes(e)&&!H.includes(e)&&H.push(e);let r=document.getElementById(`imageApiBase`);r&&r.value.trim()===e&&(r.value=``),$e()}function $e(){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 et(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=``,T.forEach(e=>{if(!H.includes(e)){let t=Xe(e,null,!1);n.appendChild(t)}}),r.forEach(e=>{if(typeof e==`string`){if(!T.includes(e)){let t=Xe(e,null,!0);n.appendChild(t)}}else if(e&&e.url){let t=Xe(e.url,e.label||null,!0);n.appendChild(t)}}),typeof e==`function`&&e()})}function tt(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 nt(){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=e.apiKey),e.modelName&&(be(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){Se(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=e.imageApiKey),document.getElementById(`reactMaxIterations`).value=e.reactMaxIterations||E.maxIterations,document.getElementById(`reactApiTimeout`).value=Math.round((e.reactApiTimeout||E.apiTimeout)/6e4),document.getElementById(`reactLoopTimeout`).value=Math.round((e.reactLoopTimeout||E.loopTimeout)/6e4),document.getElementById(`reactToolTimeout`).value=Math.round((e.reactToolTimeout||E.toolTimeout)/6e4);let o=document.getElementById(`enableToolPreselect`);o&&(o.checked=e.enableToolPreselect===void 0?E.enableToolPreselect:e.enableToolPreselect,o.dispatchEvent(new Event(`change`)));let s=document.getElementById(`preselectMinToolCount`);s&&(s.value=e.preselectMinToolCount===void 0?E.preselectMinToolCount:e.preselectMinToolCount),document.getElementById(`toolConfirmationEnabled`).checked=e.toolConfirmationEnabled===void 0?E.toolConfirmationEnabled:e.toolConfirmationEnabled,document.getElementById(`toolConfirmationEnabled`).dispatchEvent(new Event(`change`)),document.getElementById(`enableExecutionLog`).checked=e.enableExecutionLog===void 0?ue.enableExecutionLog:e.enableExecutionLog,document.getElementById(`enableExecutionLog`).dispatchEvent(new Event(`change`));let c=e.reflectionConfig||d;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`),u=document.getElementById(`streamExpandToolsLabel`),f=document.getElementById(`streamExpandToolsWrap`);l&&(l.checked=e.streamExpandTools===!0),u&&(u.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`),h=document.getElementById(`completionConfettiEnabled`);m&&(m.checked=e.completionSoundEnabled!==!1),h&&(h.checked=e.completionConfettiEnabled!==!1);let g=document.getElementById(`completionNotificationEnabled`),_=document.getElementById(`scheduledNotificationEnabled`),v=document.getElementById(`interactionNotificationEnabled`);g&&(g.checked=e.completionNotificationEnabled!==!1),_&&(_.checked=e.scheduledNotificationEnabled!==!1),v&&(v.checked=e.interactionNotificationEnabled!==!1);let y=document.getElementById(`showMessageTimestamp`);y&&(y.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 b=document.getElementById(`autoGroupTabs`);b&&(b.checked=e.autoGroupTabs!==!1);function ne(){if(!b)return;let e=document.querySelector(`input[name="sidePanelScope"]:checked`)?.value||`global`;b.disabled=e!==`tab-specific`}ne(),b&&!b.dataset.groupListenerBound&&(b.dataset.groupListenerBound=`1`,b.addEventListener(`change`,()=>{chrome.storage.local.set({autoGroupTabs:b.checked})})),Me(()=>{e.modelName&&Pe(e.modelName),p()}),He(()=>{e.imageModelName&&Ue(e.imageModelName)}),Je(()=>{e.apiBase&&Ye(e.apiBase)}),et(()=>{e.imageApiBase&&tt(e.imageApiBase)})})}function rt(){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)||E.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,u=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,ee=xe||``,te=document.getElementById(`imageApiBase`)?.value.trim()||``,b=document.getElementById(`imageApiKey`)?.value.trim()||``,ne={enabled:document.getElementById(`reflectionEnabled`).checked,postReflection:{...d.postReflection,enabled:document.getElementById(`postReflectionEnabled`).checked},subtaskReflection:{...d.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:n,modelName:R||`deepseek-v4-pro`,systemPrompt:r,reactMaxIterations:i,reactApiTimeout:a,reactLoopTimeout:o,reactToolTimeout:s,toolConfirmationEnabled:c,enableExecutionLog:l,enableImageInput:y,imageModelName:ee,imageApiBase:te,imageApiKey:b,reflectionConfig:ne,streamEnabled:u,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{w({apiBase:e,apiKey:n,modelName:R||`deepseek-v4-pro`,models:Ae()}),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 it(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 W=class extends Error{constructor(e,{status:t,reason:n}={}){super(e),this.name=`FetchModelsError`,this.status=t,this.reason=n}};function at(e){return`${String(e).trim().replace(/\/+$/,``)}/models`}function ot(e){return/anthropic\.com/i.test(String(e||``))}async function st({apiBase:e,apiKey:t,timeoutMs:n=15e3}={}){let r=(e||``).trim(),i=(t||``).trim();if(!r||!i)throw new W(`missing apiBase or apiKey`,{reason:`invalid-config`});let a={Authorization:`Bearer ${i}`};ot(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(at(r),{method:`GET`,headers:a,signal:o.signal})}catch(e){throw clearTimeout(s),e&&e.name===`AbortError`?new W(`request timeout`,{reason:`timeout`}):new W(e&&e.message||`network error`,{reason:`network`})}if(clearTimeout(s),!c.ok)throw new W(`HTTP ${c.status}`,{status:c.status,reason:`http`});let l;try{l=await c.json()}catch{throw new W(`invalid JSON`,{reason:`parse`})}let u=it(l);if(!u.length)throw new W(`no models parsed`,{reason:`parse`});return u}var ct=-1;function lt(){return new Promise(e=>{chrome.storage.local.get([`toolbarTools`,`toolbarIconOnly`,`enableSelectionToolbar`],t=>{let n=t.toolbarTools&&t.toolbarTools.length>0?t.toolbarTools:[...oe],r=t.toolbarIconOnly!==void 0&&t.toolbarIconOnly,i=t.enableSelectionToolbar===void 0||t.enableSelectionToolbar,a=new Map(oe.map(e=>[e.id,e])),o=n.map(e=>{if(e.builtin&&a.has(e.id)){let t=D(e.id),n=ce(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 ut(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&&D(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="${G(e.systemPrompt)}">${G(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
|
+
`,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>`),`
|
|
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,34 +33,34 @@ 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">${St(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(``),ht()}function ht(){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:[...ce],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},()=>{mt(s)})}),e.classList.remove(`drag-over`))})})}function gt(){let e=document.getElementById(`toolbarIconOnly`)?.checked||!1,t=document.getElementById(`enableSelectionToolbar`)?.checked!==!1;chrome.storage.local.get([`toolbarTools`],n=>{let i=n.toolbarTools||[...ce];chrome.storage.local.set({toolbarTools:i,toolbarIconOnly:e,enableSelectionToolbar:t},()=>{r.debug(`[Options] toolbarconfiguration saved`)})})}function _t(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 vt(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 yt(e,n=-1){ft=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 bt(){document.getElementById(`toolEditModal`).style.display=`none`,ft=-1}function xt(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(ft>=0){let e=i.filter(e=>e.id!==`ai-search`&&e.id!==`copy`)[ft];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 bt(),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 St(e){let t=document.createElement(`div`);return t.textContent=e,t.innerHTML}function Ct(){chrome.storage.local.get([`blockedDomains`],e=>{wt(e.blockedDomains||[])})}function wt(e){let n=document.getElementById(`domainBlocklistList`);n&&(n.innerHTML=e.length===0?`<div class="domain-blocklist-empty">${t(`toolbar.noBlockedDomains`)}</div>`: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="${St(e)}">${St(e)}</span>
|
|
46
|
+
<button class="domain-blocklist-item-remove" data-domain="${St(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 bt(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},()=>{yt(i),n&&n({})})})}function xt(e){chrome.storage.local.get([`blockedDomains`],t=>{let n=(t.blockedDomains||[]).filter(t=>t!==e);chrome.storage.local.set({blockedDomains:n},()=>{yt(n)})})}var St=`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(`.`),Ct=[`apiKey`,`imageApiKey`,`agentToken`];function wt(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 Tt(e){let t=e?[...St,...Ct]:St;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=_(i.modelProfiles)),wt(i),n(i)})})}async function Et(){let e=document.getElementById(`exportIncludeSecrets`)?.checked||!1;try{let n=await Tt(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),Ot(),It(t(`configDialog.exportSuccess`),`success`)}catch(e){r.error(`[Options] exportconfiguration failed:`,e),It(t(`configDialog.exportFailed`,{error:e.message}),`error`)}}function Dt(){let e=document.getElementById(`exportConfigModal`);e&&(e.style.display=`flex`)}function Ot(){let e=document.getElementById(`exportConfigModal`);e&&(e.style.display=`none`)}function kt(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 At(){let e=document.getElementById(`importConfigModal`);e&&(e.style.display=`none`)}function jt(){let e=document.getElementById(`importConfigFile`);e&&(e.value=``,e.click())}function Mt(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(!St.includes(e)&&!Ct.includes(e)&&!e.startsWith(`agentEnabledTools_`)&&!e.startsWith(`agentMcpClosedServers_`))return{valid:!1,error:t(`configDialog.unknownConfigKey`,{key:e})};return{valid:!0}}async function Nt(e){try{let n=await e.text(),r=JSON.parse(n),i=Mt(r);if(!i.valid){It(t(`configDialog.importFailed`,{error:i.error}),`error`);return}kt(r)}catch(e){r.error(`[Options] import fileparse failed:`,e),It(t(`configDialog.importParseFailed`),`error`)}}async function Pt(){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(wt(r),(document.getElementById(`importStrategyReplace`)?.checked?`replace`:`merge`)==`merge`&&Array.isArray(r.modelProfiles)){let e=await g();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(await new Promise(e=>{chrome.storage.local.set(r,e)}),await h(),!Array.isArray(r.modelProfiles)){let e=await chrome.storage.local.get([`apiBase`,`apiKey`,`modelName`,`customModels`]);await w({apiBase:e.apiBase||`https://api.deepseek.com`,apiKey:e.apiKey||``,modelName:e.modelName||`deepseek-v4-pro`,models:ee(e.customModels)})}At(),It(t(`configDialog.importedCount`,{count:Object.keys(r).length}),`success`),setTimeout(()=>{nt(()=>{lt().then(()=>{typeof updateToolbarUI==`function`&&updateToolbarUI()}),vt()})},300)}catch(e){r.error(`[Options] importconfiguration failed:`,e),It(t(`configDialog.importFailed`,{error:e.message}),`error`)}}function Ft(){let e=document.getElementById(`exportConfigCloseBtn`),t=document.getElementById(`exportConfigCancelBtn`),n=document.getElementById(`exportConfigOkBtn`),r=document.getElementById(`exportConfigModal`);e&&e.addEventListener(`click`,Ot),t&&t.addEventListener(`click`,Ot),n&&n.addEventListener(`click`,Et),r&&r.addEventListener(`click`,e=>{e.target===r&&Ot()});let i=document.getElementById(`importConfigCloseBtn`),a=document.getElementById(`importConfigCancelBtn`),o=document.getElementById(`importConfigOkBtn`),s=document.getElementById(`importConfigModal`);i&&i.addEventListener(`click`,At),a&&a.addEventListener(`click`,At),o&&o.addEventListener(`click`,Pt),s&&s.addEventListener(`click`,e=>{e.target===s&&At()})}function It(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 Lt=null,Rt=null;async function zt(){Vt(),Ht(),s(()=>{K()}),await K()}async function K(){let e=await g(),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=ie(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:``,Bt(r)}function Bt(e){let n=document.getElementById(`profileScopeHint`);n&&(n.textContent=e?t(`settings.profileScopeHint`,{name:e.name}):``)}function Vt(){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`),Ut(n.dataset.value))}),document.addEventListener(`click`,n=>{!t.contains(n.target)&&n.target!==e&&t.classList.remove(`show`)}),document.getElementById(`profileNewBtn`)?.addEventListener(`click`,Wt),document.getElementById(`profileDupBtn`)?.addEventListener(`click`,Gt),document.getElementById(`profileRenameBtn`)?.addEventListener(`click`,Kt),document.getElementById(`profileDeleteBtn`)?.addEventListener(`click`,qt),Xt())}function Ht(){chrome.storage.onChanged.addListener(async(e,t)=>{if(t===`local`&&(e.modelProfiles&&K(),e.activeProfileId)){let e=await g(),t=e.profiles.find(t=>t.id===e.activeProfileId);t&&Yt(t),K()}})}async function Ut(e){if(e===(await g()).activeProfileId)return;let n=await x(e);n&&(Yt(n),await K(),U(`✅ ${t(`settings.profileSwitched`,{name:n.name})}`,`success`))}async function Wt(){let e=S(Jt())||``,n=await Zt({mode:`name`,title:t(`settings.profileNameTitle`),defaultValue:e});if(!n)return;let r=await m({name:n,apiBase:C,apiKey:``,modelName:te,models:[]},{activate:!0});Yt(r),await K(),U(`✅ ${t(`settings.profileCreated`,{name:r.name})}`,`success`)}async function Gt(){let e=await g(),n=e.profiles.find(t=>t.id===e.activeProfileId)||e.profiles[0];if(!n)return;let r=await Zt({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:Jt(),apiKey:document.getElementById(`apiKey`)?.value.trim()||``,modelName:i?.value||R||`deepseek-v4-pro`,models:Ae()},{activate:!0});Yt(a),await K(),U(`✅ ${t(`settings.profileCreated`,{name:a.name})}`,`success`)}async function Kt(){let e=await g(),n=e.profiles.find(t=>t.id===e.activeProfileId)||e.profiles[0];if(!n)return;let r=await Zt({mode:`name`,title:t(`settings.renameProfile`),defaultValue:n.name});!r||r===n.name||(await v(n.id,r),await K(),U(`✅ ${t(`settings.profileRenamed`,{name:r})}`,`success`))}async function qt(){let e=await g(),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 Zt({mode:`confirm`,title:t(`settings.deleteProfile`),message:t(`settings.deleteProfileConfirm`,{name:n.name})}))return;let r=await b(n.id);if(!r.deleted){U(`⚠️ ${t(`settings.atLeastOneProfile`)}`,`error`);return}r.nextActive&&Yt(r.nextActive),await K(),U(`🗑️ ${t(`settings.profileDeleted`,{name:n.name})}`,`success`)}function Jt(){return document.getElementById(`apiBase`)?.value.trim()||`https://api.deepseek.com`}function Yt(e){let t=e.apiBase||`https://api.deepseek.com`,n=e.modelName||`deepseek-v4-pro`,r=document.getElementById(`apiBase`);r&&(r.value=t),Ye(t);let i=document.getElementById(`apiKey`);i&&(i.value=e.apiKey||``),be(n);let a=document.getElementById(`modelInput`);a&&(a.value=n),Ne(e.models||[],n),Fe(`modelInput`,`modelSelectedCtxBadge`,`modelDropdown`)}function Xt(){let e=document.getElementById(`profileModal`);!e||e.dataset.bound||(e.dataset.bound=`1`,document.getElementById(`profileModalOkBtn`)?.addEventListener(`click`,Qt),document.getElementById(`profileModalCancelBtn`)?.addEventListener(`click`,()=>$t(null)),document.getElementById(`profileModalCloseBtn`)?.addEventListener(`click`,()=>$t(null)),e.addEventListener(`click`,t=>{t.target===e&&$t(null)}),document.getElementById(`profileNameInput`)?.addEventListener(`keydown`,e=>{e.key===`Enter`&&Qt(),e.key===`Escape`&&$t(null)}))}function Zt({mode:e,title:t,message:n=``,defaultValue:r=``}){let i=document.getElementById(`profileModal`);if(!i)return Promise.resolve(null);Lt=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=>{Rt=e})}function Qt(){if(Rt){if(Lt===`name`){let e=document.getElementById(`profileNameInput`).value.trim();if(!e){U(`❌ ${t(`settings.profileNameRequired`)}`,`error`);return}$t(e)}else $t(!0)}}function $t(e){let t=document.getElementById(`profileModal`);t&&(t.style.display=`none`),Lt=null;let n=Rt;Rt=null,n&&n(e)}var q={agentBaseUrl:null,agentToken:null,agentConnected:!1,agentName:null,agentId:null,cachedMcpServers:[],cachedSkills:[],editingMcpId:null,refreshCallback:null};async function en(){typeof q.refreshCallback==`function`&&await q.refreshCallback()}function tn(e,n=t(`customConfirm.defaultTitle`)){return new Promise(r=>{let i=document.createElement(`div`);i.className=`modal-overlay`,i.innerHTML=`
|
|
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=`
|
|
51
51
|
<div class="modal-content" style="max-width: 400px;">
|
|
52
52
|
<div class="modal-header">
|
|
53
|
-
<h3>${
|
|
53
|
+
<h3>${q(n)}</h3>
|
|
54
54
|
</div>
|
|
55
55
|
<div class="modal-body">
|
|
56
|
-
<p>${
|
|
56
|
+
<p>${q(e)}</p>
|
|
57
57
|
</div>
|
|
58
58
|
<div class="modal-actions">
|
|
59
59
|
<button class="btn btn-cancel" id="confirmCancelBtn">${t(`common.cancel`)}</button>
|
|
60
60
|
<button class="btn btn-primary" id="confirmOkBtn" style="width: auto;">${t(`common.ok`)}</button>
|
|
61
61
|
</div>
|
|
62
62
|
</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
|
|
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 ln(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
64
|
<div class="modal-header">
|
|
65
65
|
<h3>${t(`toolbox.viewSkillTitle`,{name:e})}</h3>
|
|
66
66
|
<button class="modal-close-btn">✕</button>
|
|
@@ -68,32 +68,32 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
68
68
|
<div class="modal-body">
|
|
69
69
|
<div class="form-group">
|
|
70
70
|
<label>${t(`toolbox.skillNameLabel`)}</label>
|
|
71
|
-
<input type="text" value="${
|
|
71
|
+
<input type="text" value="${q(n.frontmatter?.name||n.name||``)}" readonly style="background:#f5f5f5;color:#666;">
|
|
72
72
|
</div>
|
|
73
73
|
<div class="form-group">
|
|
74
74
|
<label>${t(`toolbox.skillDescLabel`)}</label>
|
|
75
|
-
<input type="text" value="${
|
|
75
|
+
<input type="text" value="${q(n.frontmatter?.description||``)}" readonly style="background:#f5f5f5;color:#666;">
|
|
76
76
|
</div>
|
|
77
77
|
<div class="form-group">
|
|
78
78
|
<label>${t(`toolbox.skillVersionLabel`)}</label>
|
|
79
|
-
<input type="text" value="${
|
|
79
|
+
<input type="text" value="${q(n.frontmatter?.version||`1.0`)}" readonly style="background:#f5f5f5;color:#666;">
|
|
80
80
|
</div>
|
|
81
81
|
<div class="form-group">
|
|
82
82
|
<label>${t(`toolbox.skillMarkdownLabel`)}</label>
|
|
83
|
-
<textarea readonly style="min-height: 350px; font-family: monospace; background:#f5f5f5; color:#666; resize: vertical;">${
|
|
83
|
+
<textarea readonly style="min-height: 350px; font-family: monospace; background:#f5f5f5; color:#666; resize: vertical;">${q(n.markdown||``)}</textarea>
|
|
84
84
|
</div>
|
|
85
85
|
${n.resources&&n.resources.length>0?`
|
|
86
86
|
<div class="form-group">
|
|
87
87
|
<label>${t(`toolbox.existingResources`)} (${n.resources.length})</label>
|
|
88
88
|
<div class="skill-resources-preview">
|
|
89
|
-
${n.resources.map(e=>`<span class="skill-resource-tag">📄 ${
|
|
89
|
+
${n.resources.map(e=>`<span class="skill-resource-tag">📄 ${q(e.name||e)}</span>`).join(``)}
|
|
90
90
|
</div>
|
|
91
91
|
</div>`:``}
|
|
92
92
|
</div>
|
|
93
93
|
<div class="modal-actions">
|
|
94
94
|
<button class="btn btn-cancel">${t(`common.close`)}</button>
|
|
95
95
|
</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
|
|
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 un(){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={method:e,headers:{"Content-Type":`application/json`,Authorization:`Bearer ${W.agentToken}`}};n&&(r.body=JSON.stringify(n));let i=await fetch(`${W.agentBaseUrl}${t}`,r),a=await i.json();return a&&typeof a==`object`&&!Array.isArray(a)&&(a.httpStatus=i.status),a}function q(e){return e?String(e).replace(/&/g,`&`).replace(/</g,`<`).replace(/>/g,`>`).replace(/"/g,`"`).replace(/'/g,`'`):``}var dn=``,fn=`all`;async function pn(){if(await un(),!W.agentConnected)return{servers:[]};try{return await K(`GET`,`/api/mcp/servers`)}catch{return{servers:[]}}}function mn(e){let n=document.getElementById(`mcpServerList`);if(!n)return;if(W.cachedMcpServers=e||[],!W.agentConnected){n.innerHTML=`
|
|
97
97
|
<div class="toolbox-empty">
|
|
98
98
|
<div class="toolbox-empty-icon">🔌</div>
|
|
99
99
|
<div class="toolbox-empty-title">${t(`toolbox.emptyAgentNotConnectedTitle`)}</div>
|
|
@@ -103,33 +103,33 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
103
103
|
<div class="toolbox-empty-icon">📦</div>
|
|
104
104
|
<div class="toolbox-empty-title">${t(`toolbox.emptyNoMcpTitle`)}</div>
|
|
105
105
|
<div class="toolbox-empty-desc">${t(`toolbox.emptyNoMcpDesc`)}</div>
|
|
106
|
-
</div>`;return}let r=e.filter(e=>{if(
|
|
106
|
+
</div>`;return}let r=e.filter(e=>{if(fn===`enabled`&&e.enabled===!1||fn===`disabled`&&e.enabled!==!1)return!1;if(dn){let t=dn.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
107
|
<div class="toolbox-empty">
|
|
108
108
|
<div class="toolbox-empty-icon">🔍</div>
|
|
109
109
|
<div class="toolbox-empty-title">${t(`toolbox.noMatchResult`)}</div>
|
|
110
|
-
</div>`;return}n.innerHTML=r.map(e=>{if(e.id===
|
|
110
|
+
</div>`;return}n.innerHTML=r.map(e=>{if(e.id===W.editingMcpId){let n=e.transport||`stdio`;return`
|
|
111
111
|
<div class="mcp-server-card editing">
|
|
112
112
|
<div class="mcp-add-form">
|
|
113
113
|
<div class="mcp-add-form-row">
|
|
114
|
-
<input type="text" id="mcpEditId" value="${
|
|
115
|
-
<input type="text" id="mcpEditName" value="${
|
|
114
|
+
<input type="text" id="mcpEditId" value="${q(e.id)}" placeholder="${t(`toolbox.mcpIdPlaceholder`)}" class="toolbox-input">
|
|
115
|
+
<input type="text" id="mcpEditName" value="${q(e.name||``)}" placeholder="${t(`toolbox.mcpNamePlaceholder`)}" class="toolbox-input">
|
|
116
116
|
</div>
|
|
117
|
-
${
|
|
118
|
-
${
|
|
117
|
+
${xn(`mcpEdit`,n)}
|
|
118
|
+
${Sn(`mcpEdit`,n,e.url||``,e.command||``,(e.args||[]).join(` `))}
|
|
119
119
|
<div class="mcp-env-section" id="mcpEditEnvSection" style="display:${n===`stdio`?``:`none`};">
|
|
120
120
|
<div class="mcp-env-header">
|
|
121
121
|
<span class="mcp-env-title">${t(`toolbox.mcpEnvVars`)}</span>
|
|
122
122
|
<span class="mcp-env-hint">${t(`toolbox.mcpEnvVarsHint`)}</span>
|
|
123
123
|
</div>
|
|
124
124
|
<div class="mcp-env-rows" id="mcpEditEnvRows">
|
|
125
|
-
${
|
|
125
|
+
${hn(e.env||{})}
|
|
126
126
|
</div>
|
|
127
127
|
<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
128
|
</div>
|
|
129
|
-
${
|
|
129
|
+
${yn(`mcpEdit`,e.headers||{},n)}
|
|
130
130
|
<div class="mcp-add-form-actions">
|
|
131
|
-
<button class="toolbox-btn toolbox-btn-cancel" data-mcp-id="${
|
|
132
|
-
<button class="toolbox-btn toolbox-btn-primary" data-mcp-id="${
|
|
131
|
+
<button class="toolbox-btn toolbox-btn-cancel" data-mcp-id="${q(e.id)}" data-action="cancel-edit">${t(`common.cancel`)}</button>
|
|
132
|
+
<button class="toolbox-btn toolbox-btn-primary" data-mcp-id="${q(e.id)}" data-action="save-edit">${t(`common.save`)}</button>
|
|
133
133
|
</div>
|
|
134
134
|
</div>
|
|
135
135
|
</div>`}let n=e.connected?`connected`:`disconnected`,r=e.connected?t(`toolbox.mcpConnected`):t(`toolbox.mcpDisconnected`),i=e.connected?`🟢`:`🔴`;return e.toolCount,`
|
|
@@ -137,46 +137,46 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
137
137
|
<div class="mcp-server-header">
|
|
138
138
|
<div class="mcp-server-info">
|
|
139
139
|
<span class="mcp-server-status ${n}" title="${r}">${i}</span>
|
|
140
|
-
<span class="mcp-server-name">${
|
|
141
|
-
<span class="mcp-server-badge">${
|
|
140
|
+
<span class="mcp-server-name">${q(e.name||e.id)}</span>
|
|
141
|
+
<span class="mcp-server-badge">${q(e.transport||`stdio`)}</span>
|
|
142
142
|
</div>
|
|
143
143
|
<div class="mcp-server-header-right">
|
|
144
144
|
<label class="toolbox-toggle" title="${e.enabled===!1?t(`toolbox.mcpToggleDisabled`):t(`toolbox.mcpToggleEnabled`)}">
|
|
145
|
-
<input type="checkbox" ${e.enabled===!1?``:`checked`} data-mcp-id="${
|
|
145
|
+
<input type="checkbox" ${e.enabled===!1?``:`checked`} data-mcp-id="${q(e.id)}" data-action="toggle">
|
|
146
146
|
<span class="toolbox-toggle-slider"></span>
|
|
147
147
|
</label>
|
|
148
148
|
</div>
|
|
149
149
|
</div>
|
|
150
150
|
<div class="mcp-card-body${e.enabled===!1?` disabled`:``}">
|
|
151
151
|
<div class="mcp-server-command">
|
|
152
|
-
<code>${
|
|
152
|
+
<code>${q(Cn(e))}</code>
|
|
153
153
|
</div>
|
|
154
|
-
${
|
|
154
|
+
${wn(e)}
|
|
155
155
|
${e.tools&&e.tools.length>0?`
|
|
156
156
|
<div class="mcp-tools-section">
|
|
157
|
-
<button class="mcp-tools-toggle" data-mcp-id="${
|
|
157
|
+
<button class="mcp-tools-toggle" data-mcp-id="${q(e.id)}" data-action="toggle-tools">
|
|
158
158
|
▶ ${t(`toolbox.viewTools`,{count:e.tools.length})}
|
|
159
159
|
</button>
|
|
160
|
-
<div class="mcp-tools-list" id="mcp-tools-${
|
|
160
|
+
<div class="mcp-tools-list" id="mcp-tools-${q(e.id)}" style="display:none;">
|
|
161
161
|
${e.tools.map(e=>`
|
|
162
162
|
<div class="mcp-tool-item">
|
|
163
|
-
<div class="mcp-tool-name">${
|
|
164
|
-
<div class="mcp-tool-desc">${
|
|
163
|
+
<div class="mcp-tool-name">${q(e.name)}</div>
|
|
164
|
+
<div class="mcp-tool-desc">${q(e.description||``)}</div>
|
|
165
165
|
</div>
|
|
166
166
|
`).join(``)}
|
|
167
167
|
</div>
|
|
168
168
|
</div>`:``}
|
|
169
169
|
<div class="mcp-server-actions">
|
|
170
|
-
${e.connected?`<button class="toolbox-btn toolbox-btn-warn" data-mcp-id="${
|
|
171
|
-
<button class="toolbox-btn toolbox-btn-edit" data-mcp-id="${
|
|
172
|
-
<button class="toolbox-btn toolbox-btn-danger" data-mcp-id="${
|
|
170
|
+
${e.connected?`<button class="toolbox-btn toolbox-btn-warn" data-mcp-id="${q(e.id)}" data-action="disconnect">${t(`toolbox.mcpDisconnectBtn`)}</button>`:`<button class="toolbox-btn toolbox-btn-primary" data-mcp-id="${q(e.id)}" data-action="connect">${t(`toolbox.mcpConnectBtn`)}</button>`}
|
|
171
|
+
<button class="toolbox-btn toolbox-btn-edit" data-mcp-id="${q(e.id)}" data-action="edit">${t(`common.edit`)}</button>
|
|
172
|
+
<button class="toolbox-btn toolbox-btn-danger" data-mcp-id="${q(e.id)}" data-action="delete">${t(`common.delete`)}</button>
|
|
173
173
|
</div>
|
|
174
174
|
</div>
|
|
175
|
-
</div>`}).join(``)}function
|
|
175
|
+
</div>`}).join(``)}function hn(e={}){let n=Object.entries(e);return n.length===0&&n.push([``,``]),n.map(([e,n])=>`
|
|
176
176
|
<div class="mcp-env-row">
|
|
177
|
-
<input type="text" class="mcp-env-key toolbox-input" placeholder="${t(`toolbox.mcpVarNamePlaceholder`)}" value="${
|
|
177
|
+
<input type="text" class="mcp-env-key toolbox-input" placeholder="${t(`toolbox.mcpVarNamePlaceholder`)}" value="${q(e)}" style="flex: 1;">
|
|
178
178
|
<div class="mcp-env-value-wrap token-input-wrapper" style="flex: 2;">
|
|
179
|
-
<input type="password" class="mcp-env-value token-input" placeholder="${t(`toolbox.mcpVarValuePlaceholder`)}" value="${
|
|
179
|
+
<input type="password" class="mcp-env-value token-input" placeholder="${t(`toolbox.mcpVarValuePlaceholder`)}" value="${q(n)}">
|
|
180
180
|
<button type="button" class="mcp-env-eye toggle-token-btn" title="${t(`toolbox.mcpToggleEye`)}" data-action="toggle-env-eye">
|
|
181
181
|
<svg class="icon-eye-open" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
182
182
|
<path d="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"></path>
|
|
@@ -190,11 +190,11 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
190
190
|
</div>
|
|
191
191
|
<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
192
|
</div>
|
|
193
|
-
`).join(``)}function
|
|
193
|
+
`).join(``)}function gn(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 _n(e={}){let n=Object.entries(e);return n.length===0&&n.push([``,``]),n.map(([e,n])=>`
|
|
194
194
|
<div class="mcp-env-row">
|
|
195
|
-
<input type="text" class="mcp-env-key toolbox-input" placeholder="${t(`toolbox.mcpHeaderNamePlaceholder`)}" value="${
|
|
195
|
+
<input type="text" class="mcp-env-key toolbox-input" placeholder="${t(`toolbox.mcpHeaderNamePlaceholder`)}" value="${q(e)}" style="flex: 1;">
|
|
196
196
|
<div class="mcp-env-value-wrap token-input-wrapper" style="flex: 2;">
|
|
197
|
-
<input type="password" class="mcp-env-value token-input" placeholder="${t(`toolbox.mcpVarValuePlaceholder`)}" value="${
|
|
197
|
+
<input type="password" class="mcp-env-value token-input" placeholder="${t(`toolbox.mcpVarValuePlaceholder`)}" value="${q(n)}">
|
|
198
198
|
<button type="button" class="mcp-env-eye toggle-token-btn" title="${t(`toolbox.mcpToggleEye`)}" data-action="toggle-env-eye">
|
|
199
199
|
<svg class="icon-eye-open" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
200
200
|
<path d="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"></path>
|
|
@@ -208,17 +208,17 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
208
208
|
</div>
|
|
209
209
|
<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
210
|
</div>
|
|
211
|
-
`).join(``)}function
|
|
211
|
+
`).join(``)}function vn(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 yn(e,n={},r=`stdio`){return`
|
|
212
212
|
<div class="mcp-env-section" id="${e}HeadersSection" style="display:${r===`sse`||r===`streamableHttp`||r===`websocket`?``:`none`};">
|
|
213
213
|
<div class="mcp-env-header">
|
|
214
214
|
<span class="mcp-env-title">${t(`toolbox.mcpHeaders`)}</span>
|
|
215
215
|
<span class="mcp-env-hint">${t(`toolbox.mcpHeadersHint`)}</span>
|
|
216
216
|
</div>
|
|
217
217
|
<div class="mcp-env-rows" id="${e}HeaderRows">
|
|
218
|
-
${
|
|
218
|
+
${_n(n)}
|
|
219
219
|
</div>
|
|
220
220
|
<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
|
|
221
|
+
</div>`}function bn(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
222
|
<input type="text" class="mcp-env-key toolbox-input" placeholder="${t(`toolbox.mcpVarNamePlaceholder`)}" style="flex: 1;">
|
|
223
223
|
<div class="mcp-env-value-wrap token-input-wrapper" style="flex: 2;">
|
|
224
224
|
<input type="password" class="mcp-env-value token-input" placeholder="${t(`toolbox.mcpVarValuePlaceholder`)}">
|
|
@@ -234,7 +234,7 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
234
234
|
</button>
|
|
235
235
|
</div>
|
|
236
236
|
<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
|
|
237
|
+
`,r.appendChild(e);let n=e.querySelector(`.mcp-env-key`);n&&setTimeout(()=>n.focus(),0)}return!0}return!1}function xn(e,n=`stdio`){return`
|
|
238
238
|
<div class="mcp-transport-group" id="${e}TransportGroup" data-prefix="${e}">
|
|
239
239
|
${[{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
240
|
<button type="button"
|
|
@@ -244,37 +244,37 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
244
244
|
data-prefix="${e}"
|
|
245
245
|
title="${t.title}">${t.label}</button>
|
|
246
246
|
`).join(``)}
|
|
247
|
-
</div>`}function
|
|
247
|
+
</div>`}function Sn(e,n=`stdio`,r=``,i=``,a=``){let o=n===`sse`||n===`streamableHttp`||n===`websocket`;return`
|
|
248
248
|
<div class="mcp-add-form-row" id="${e}StdioRow" style="display:${o?`none`:`flex`};">
|
|
249
|
-
<input type="text" id="${e}Command" value="${
|
|
250
|
-
<input type="text" id="${e}Args" value="${
|
|
249
|
+
<input type="text" id="${e}Command" value="${q(i)}" placeholder="${t(`toolbox.mcpCommandPlaceholder`)}" class="toolbox-input" style="flex: 2;">
|
|
250
|
+
<input type="text" id="${e}Args" value="${q(a)}" placeholder="${t(`toolbox.mcpArgsPlaceholder`)}" class="toolbox-input" style="flex: 3;">
|
|
251
251
|
</div>
|
|
252
252
|
<div class="mcp-add-form-row" id="${e}UrlRow" style="display:${o?`flex`:`none`};">
|
|
253
|
-
<input type="text" id="${e}Url" value="${
|
|
254
|
-
</div>`}function
|
|
253
|
+
<input type="text" id="${e}Url" value="${q(r)}" placeholder="http://localhost:3000/mcp" class="toolbox-input" style="flex: 1;">
|
|
254
|
+
</div>`}function Cn(e){let t=e.transport||`stdio`;return t===`stdio`||!t?`${e.command||``} ${(e.args||[]).join(` `)}`:e.url||``}function wn(e){let n=Object.keys(e.headers||{}).length;return n>0?`<div class="mcp-server-meta">${t(`toolbox.mcpCustomHeadersCount`,{count:n})}</div>`:``}function Tn(e){return document.querySelector(`#${e}TransportGroup .mcp-transport-btn.active`)?.dataset.value||`stdio`}function En(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 Dn(){let e=document.getElementById(`mcpAddForm`);e&&(e.innerHTML=`
|
|
255
255
|
<div class="mcp-add-form">
|
|
256
256
|
<div class="mcp-add-form-row">
|
|
257
257
|
<input type="text" id="mcpAddId" placeholder="${t(`toolbox.mcpIdPlaceholderUnique`)}" class="toolbox-input">
|
|
258
258
|
<input type="text" id="mcpAddName" placeholder="${t(`toolbox.mcpNamePlaceholder`)}" class="toolbox-input">
|
|
259
259
|
</div>
|
|
260
|
-
${
|
|
261
|
-
${
|
|
260
|
+
${xn(`mcpAdd`)}
|
|
261
|
+
${Sn(`mcpAdd`)}
|
|
262
262
|
<div class="mcp-env-section" id="mcpAddEnvSection">
|
|
263
263
|
<div class="mcp-env-header">
|
|
264
264
|
<span class="mcp-env-title">${t(`toolbox.mcpEnvVars`)}</span>
|
|
265
265
|
<span class="mcp-env-hint">${t(`toolbox.mcpEnvVarsHint`)}</span>
|
|
266
266
|
</div>
|
|
267
267
|
<div class="mcp-env-rows" id="mcpAddEnvRows">
|
|
268
|
-
${
|
|
268
|
+
${hn()}
|
|
269
269
|
</div>
|
|
270
270
|
<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
271
|
</div>
|
|
272
|
-
${
|
|
272
|
+
${yn(`mcpAdd`,{},`stdio`)}
|
|
273
273
|
<div class="mcp-add-form-actions">
|
|
274
274
|
<button class="toolbox-btn toolbox-btn-cancel" id="mcpAddCancel">${t(`common.cancel`)}</button>
|
|
275
275
|
<button class="toolbox-btn toolbox-btn-primary" id="mcpAddConfirm">${t(`common.add`)}</button>
|
|
276
276
|
</div>
|
|
277
|
-
</div>`)}function
|
|
277
|
+
</div>`)}function On(){let e=document.getElementById(`mcpAddForm`);e&&(e.innerHTML=``)}async function kn(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 An(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 jn(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 Mn(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 Nn(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 Pn(){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(()=>{dn=e.value.trim(),mn(W.cachedMcpServers)},200)})}let n=document.getElementById(`mcpSearchClear`);n&&n.addEventListener(`click`,()=>{e.value=``,dn=``,mn(W.cachedMcpServers),e.focus()}),t.forEach(e=>{e.addEventListener(`click`,()=>{t.forEach(e=>e.classList.remove(`active`)),e.classList.add(`active`),fn=e.dataset.filter,mn(W.cachedMcpServers)})})}var Fn=``,In=`all`;async function Ln(){if(await un(),!W.agentConnected)return{skills:[]};try{return await K(`GET`,`/api/skill/list`)}catch{return{skills:[]}}}function Rn(e){let n=document.getElementById(`skillList`);if(!n)return;if(W.cachedSkills=e||[],!W.agentConnected){n.innerHTML=`
|
|
278
278
|
<div class="toolbox-empty">
|
|
279
279
|
<div class="toolbox-empty-icon">🔌</div>
|
|
280
280
|
<div class="toolbox-empty-title">${t(`toolbox.emptyAgentNotConnectedTitle`)}</div>
|
|
@@ -284,7 +284,7 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
284
284
|
<div class="toolbox-empty-icon">🧩</div>
|
|
285
285
|
<div class="toolbox-empty-title">${t(`toolbox.emptyNoSkillTitle`)}</div>
|
|
286
286
|
<div class="toolbox-empty-desc">${t(`toolbox.emptyNoSkillDesc`)}</div>
|
|
287
|
-
</div>`;return}let r=e.filter(e=>{if(
|
|
287
|
+
</div>`;return}let r=e.filter(e=>{if(In===`enabled`&&e.enabled===!1||In===`disabled`&&e.enabled!==!1)return!1;if(Fn){let t=Fn.toLowerCase();if(![e.name,e.description].filter(Boolean).join(` `).toLowerCase().includes(t))return!1}return!0});if(r.length===0){n.innerHTML=`
|
|
288
288
|
<div class="toolbox-empty">
|
|
289
289
|
<div class="toolbox-empty-icon">🔍</div>
|
|
290
290
|
<div class="toolbox-empty-title">${t(`toolbox.noMatchResult`)}</div>
|
|
@@ -293,24 +293,24 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
293
293
|
<div class="skill-card-header">
|
|
294
294
|
<div class="skill-card-info">
|
|
295
295
|
<span class="skill-card-icon">⚙️</span>
|
|
296
|
-
<span class="skill-card-name">${
|
|
297
|
-
<span class="skill-card-version">v${
|
|
296
|
+
<span class="skill-card-name">${q(e.name)}</span>
|
|
297
|
+
<span class="skill-card-version">v${q(e.version||`1.0`)}</span>
|
|
298
298
|
<span class="skill-card-badge badge-workflow">Workflow</span>
|
|
299
299
|
${e.enabled===!1?`<span class="skill-card-badge badge-disabled">${t(`toolbox.disable`)}</span>`:``}
|
|
300
300
|
<span class="skill-card-step-count">${t(`toolbox.stepCount`,{count:e.stepCount||0})}</span>
|
|
301
301
|
</div>
|
|
302
302
|
</div>
|
|
303
303
|
<div class="skill-card-body${e.enabled===!1?` disabled`:``}">
|
|
304
|
-
<div class="skill-card-desc">${
|
|
305
|
-
${n.truncated&&e.enabled!==!1?`<button class="skill-expand-btn" data-skill-name="${
|
|
304
|
+
<div class="skill-card-desc">${q(n.content)}</div>
|
|
305
|
+
${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
306
|
${r?`
|
|
307
307
|
<div class="skill-card-params">
|
|
308
|
-
${
|
|
308
|
+
${zn(e.parameters)}
|
|
309
309
|
</div>`:``}
|
|
310
310
|
<div class="skill-card-actions">
|
|
311
|
-
${e.enabled===!1?``:`<button class="toolbox-btn toolbox-btn-primary" data-skill-name="${
|
|
312
|
-
<button class="toolbox-btn toolbox-btn-secondary" data-skill-name="${
|
|
313
|
-
<button class="toolbox-btn toolbox-btn-danger" data-skill-name="${
|
|
311
|
+
${e.enabled===!1?``:`<button class="toolbox-btn toolbox-btn-primary" data-skill-name="${q(e.name)}" data-action="run-skill">${t(`toolbox.run`)}</button>`}
|
|
312
|
+
<button class="toolbox-btn toolbox-btn-secondary" data-skill-name="${q(e.name)}" data-action="toggle-skill">${e.enabled===!1?t(`toolbox.enable`):t(`toolbox.disable`)}</button>
|
|
313
|
+
<button class="toolbox-btn toolbox-btn-danger" data-skill-name="${q(e.name)}" data-action="delete-skill">${t(`common.delete`)}</button>
|
|
314
314
|
</div>
|
|
315
315
|
</div>
|
|
316
316
|
</div>
|
|
@@ -319,8 +319,8 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
319
319
|
<div class="skill-card-header">
|
|
320
320
|
<div class="skill-card-info">
|
|
321
321
|
<span class="skill-card-icon">🤖</span>
|
|
322
|
-
<span class="skill-card-name">${
|
|
323
|
-
<span class="skill-card-version">v${
|
|
322
|
+
<span class="skill-card-name">${q(e.name)}</span>
|
|
323
|
+
<span class="skill-card-version">v${q(e.version||`1.0`)}</span>
|
|
324
324
|
<span class="skill-card-badge badge-agent">Agent</span>
|
|
325
325
|
${n?`<span class="skill-card-badge badge-builtin">${t(`toolbox.builtin`)}</span>`:``}
|
|
326
326
|
${e.enabled===!1?`<span class="skill-card-badge badge-disabled">${t(`toolbox.disable`)}</span>`:``}
|
|
@@ -328,30 +328,30 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
328
328
|
</div>
|
|
329
329
|
</div>
|
|
330
330
|
<div class="skill-card-body${e.enabled===!1?` disabled`:``}">
|
|
331
|
-
<div class="skill-card-desc">${
|
|
332
|
-
${a.truncated&&e.enabled!==!1?`<button class="skill-expand-btn" data-skill-name="${
|
|
331
|
+
<div class="skill-card-desc">${q(a.content)}</div>
|
|
332
|
+
${a.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>`:``}
|
|
333
333
|
${o?`
|
|
334
334
|
<div class="skill-card-params">
|
|
335
|
-
${c?e.resources.map(e=>`<span class="skill-param-tag" title="${t(`toolbox.sizeBytes`,{size:e.size})}">📄 ${
|
|
335
|
+
${c?e.resources.map(e=>`<span class="skill-param-tag" title="${t(`toolbox.sizeBytes`,{size:e.size})}">📄 ${q(e.name)}</span>`).join(``):e.resources.slice(0,5).map(e=>`<span class="skill-param-tag" title="${t(`toolbox.sizeBytes`,{size:e.size})}">📄 ${q(e.name)}</span>`).join(``)+`<button class="skill-expand-btn skill-expand-resources" data-skill-name="${q(e.name)}" data-target="resources" data-full="${encodeURIComponent(JSON.stringify(e.resources))}">${t(`toolbox.moreCount`,{count:e.resources.length-5})}</button>`}
|
|
336
336
|
</div>`:``}
|
|
337
337
|
<div class="skill-card-actions">
|
|
338
|
-
${r?`<button class="toolbox-btn toolbox-btn-secondary" data-skill-name="${
|
|
339
|
-
<button class="toolbox-btn toolbox-btn-secondary" data-skill-name="${
|
|
340
|
-
${i?`<button class="toolbox-btn toolbox-btn-danger" data-skill-name="${
|
|
338
|
+
${r?`<button class="toolbox-btn toolbox-btn-secondary" data-skill-name="${q(e.name)}" data-action="edit-agent-skill">${t(`toolbox.editSkillMd`)}</button>`:`<button class="toolbox-btn toolbox-btn-secondary" data-skill-name="${q(e.name)}" data-action="view-agent-skill">${t(`toolbox.viewDetails`)}</button>`}
|
|
339
|
+
<button class="toolbox-btn toolbox-btn-secondary" data-skill-name="${q(e.name)}" data-action="toggle-skill">${e.enabled===!1?t(`toolbox.enable`):t(`toolbox.disable`)}</button>
|
|
340
|
+
${i?`<button class="toolbox-btn toolbox-btn-danger" data-skill-name="${q(e.name)}" data-action="delete-skill">${t(`common.delete`)}</button>`:``}
|
|
341
341
|
</div>
|
|
342
342
|
</div>
|
|
343
343
|
</div>
|
|
344
|
-
`}).join(``)),n.innerHTML=o}function
|
|
344
|
+
`}).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 Bn(e){let n=await K(`POST`,`/api/skill/import`,e);if(n.success)return!0;throw Error(n.error||t(`toolbox.skillImportFailedShort`))}async function Vn(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 Hn(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 Un(e,t={}){return await K(`POST`,`/api/skill/run`,{name:e,params:t})}function Wn(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 Gn(e,n){return new Promise(r=>{let i=document.createElement(`div`);i.className=`modal-overlay`;let a=n.required.map(([e,n])=>`
|
|
345
345
|
<div class="form-group">
|
|
346
|
-
<label for="skill-param-${e}">${
|
|
346
|
+
<label for="skill-param-${e}">${q(n.description||e)} <span class="param-required">${t(`toolbox.required`)}</span></label>
|
|
347
347
|
<input type="text" id="skill-param-${e}" class="form-input"
|
|
348
|
-
placeholder="${
|
|
348
|
+
placeholder="${q(n.type||`string`)}${n.default===void 0?``:t(`toolbox.defaultParamHint`,{default:n.default})}" />
|
|
349
349
|
</div>
|
|
350
350
|
`).join(``),o=n.optional.map(([e,n])=>`
|
|
351
351
|
<div class="form-group">
|
|
352
|
-
<label for="skill-param-${e}">${
|
|
352
|
+
<label for="skill-param-${e}">${q(n.description||e)} <span class="param-optional">${t(`toolbox.optional`)}</span></label>
|
|
353
353
|
<input type="text" id="skill-param-${e}" class="form-input"
|
|
354
|
-
placeholder="${
|
|
354
|
+
placeholder="${q(n.type||`string`)}${n.default===void 0?``:t(`toolbox.defaultParamHint`,{default:n.default})}" />
|
|
355
355
|
</div>
|
|
356
356
|
`).join(``);i.innerHTML=`
|
|
357
357
|
<div class="modal-content" style="max-width:500px;">
|
|
@@ -370,14 +370,14 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
370
370
|
<button class="btn btn-primary" id="skillParamsSubmit">${t(`toolbox.run`)}</button>
|
|
371
371
|
</div>
|
|
372
372
|
</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=`#e53e3e`))}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
|
|
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=`#e53e3e`))}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 Kn(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:#999;">${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
374
|
<div class="skill-run-step ${h}">
|
|
375
375
|
<div class="step-header">
|
|
376
376
|
<span class="step-status-icon">${m}</span>
|
|
377
|
-
<span class="step-title">${
|
|
378
|
-
${c?`<span class="step-tool-tag">${
|
|
377
|
+
<span class="step-title">${q(a)}</span>
|
|
378
|
+
${c?`<span class="step-tool-tag">${q(c)}</span>`:``}
|
|
379
379
|
</div>
|
|
380
|
-
<pre class="step-output">${
|
|
380
|
+
<pre class="step-output">${q(_)}</pre>
|
|
381
381
|
</div>
|
|
382
382
|
`}).join(``);let p=r.success?`✓`:`✗`,m=r.success?t(`toolbox.executionComplete`):t(`toolbox.executionFailed`),h=r.success?t(`toolbox.executionSummary`,{success:u,fail:d,skip:f}):r.error||t(`agentConfig.unknownError`);i.innerHTML=`
|
|
383
383
|
<div class="modal-content" style="max-width:700px;max-height:85vh;">
|
|
@@ -386,14 +386,14 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
386
386
|
<button class="modal-close-btn">×</button>
|
|
387
387
|
</div>
|
|
388
388
|
<div class="modal-body" style="max-height:calc(85vh - 120px);overflow-y:auto;">
|
|
389
|
-
<div class="skill-run-summary">${
|
|
389
|
+
<div class="skill-run-summary">${q(h)}</div>
|
|
390
390
|
${l}
|
|
391
391
|
</div>
|
|
392
392
|
<div class="modal-actions">
|
|
393
393
|
<button class="btn btn-primary modal-close-btn">${t(`common.close`)}</button>
|
|
394
394
|
</div>
|
|
395
395
|
</div>
|
|
396
|
-
`,document.body.appendChild(i),i.addEventListener(`click`,e=>{(e.target===i||e.target.classList.contains(`modal-close-btn`))&&i.remove()})}async function
|
|
396
|
+
`,document.body.appendChild(i),i.addEventListener(`click`,e=>{(e.target===i||e.target.classList.contains(`modal-close-btn`))&&i.remove()})}async function qn(){return await K(`POST`,`/api/skill/reload`)}async function Jn(e){return await K(`GET`,`/api/skill/markdown?name=${encodeURIComponent(e)}`)}function Yn(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
397
|
<div class="modal-header">
|
|
398
398
|
<h3>${t(i?`toolbox.editAgentSkill`:`toolbox.newAgentSkill`)}</h3>
|
|
399
399
|
<button class="modal-close-btn">✕</button>
|
|
@@ -401,25 +401,25 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
401
401
|
<div class="modal-body">
|
|
402
402
|
<div class="form-group">
|
|
403
403
|
<label>${t(`toolbox.skillNameLabel`)}</label>
|
|
404
|
-
<input type="text" id="agentSkillName" placeholder="e.g. code-review" value="${
|
|
404
|
+
<input type="text" id="agentSkillName" placeholder="e.g. code-review" value="${q(i?n.name:``)}" ${i?`readonly`:``}>
|
|
405
405
|
</div>
|
|
406
406
|
<div class="form-group">
|
|
407
407
|
<label>${t(`toolbox.skillDescLabel`)}</label>
|
|
408
|
-
<input type="text" id="agentSkillDesc" placeholder="${t(`toolbox.skillDescPlaceholder`)}" value="${
|
|
408
|
+
<input type="text" id="agentSkillDesc" placeholder="${t(`toolbox.skillDescPlaceholder`)}" value="${q(i&&n.frontmatter?.description||``)}">
|
|
409
409
|
</div>
|
|
410
410
|
<div class="form-group">
|
|
411
411
|
<label>${t(`toolbox.skillVersionLabel`)}</label>
|
|
412
|
-
<input type="text" id="agentSkillVersion" placeholder="1.0" value="${
|
|
412
|
+
<input type="text" id="agentSkillVersion" placeholder="1.0" value="${q(i&&n.frontmatter?.version||`1.0`)}">
|
|
413
413
|
</div>
|
|
414
414
|
<div class="form-group">
|
|
415
415
|
<label>${t(`toolbox.skillMarkdownLabel`)}</label>
|
|
416
|
-
<textarea id="agentSkillMarkdown" style="min-height: 300px; font-family: monospace;" placeholder="${t(`toolbox.skillMarkdownPlaceholder`)}">${
|
|
416
|
+
<textarea id="agentSkillMarkdown" style="min-height: 300px; font-family: monospace;" placeholder="${t(`toolbox.skillMarkdownPlaceholder`)}">${q(i&&n.markdown||``)}</textarea>
|
|
417
417
|
</div>
|
|
418
418
|
${i&&n.resources&&n.resources.length>0?`
|
|
419
419
|
<div class="form-group">
|
|
420
420
|
<label>${t(`toolbox.existingResources`)}</label>
|
|
421
421
|
<div class="skill-resource-list">
|
|
422
|
-
${n.resources.map(e=>`<span class="skill-resource-tag">📄 ${
|
|
422
|
+
${n.resources.map(e=>`<span class="skill-resource-tag">📄 ${q(e.name)} (${e.size} ${t(`common.bytes`)})</span>`).join(``)}
|
|
423
423
|
</div>
|
|
424
424
|
</div>`:``}
|
|
425
425
|
</div>
|
|
@@ -427,7 +427,7 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
427
427
|
<button class="btn btn-cancel" id="cancelAgentSkillBtn">${t(`common.cancel`)}</button>
|
|
428
428
|
<button class="btn btn-primary" id="saveAgentSkillBtn" style="width: auto;">${t(`common.save`)}</button>
|
|
429
429
|
</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=!i||n.frontmatter?.enabled!==!1;if(!e)return U(t(`toolbox.skillNameRequired`),`error`);if(!c)return U(t(`toolbox.skillMarkdownRequired`),`error`);try{let n=await
|
|
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=!i||n.frontmatter?.enabled!==!1;if(!e)return U(t(`toolbox.skillNameRequired`),`error`);if(!c)return U(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?(U(t(`toolbox.agentSkillSaved`,{name:e}),`success`),s(),cn()):U(n.error||t(`toolbox.saveFailedShort`),`error`)}catch(e){U(t(`toolbox.saveFailed`,{error:e.message}),`error`)}})}function Xn(){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
431
|
<div class="modal-header">
|
|
432
432
|
<h3>${t(`toolbox.importSkillTitle`)}</h3>
|
|
433
433
|
<button class="modal-close-btn">×</button>
|
|
@@ -495,21 +495,21 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
495
495
|
<button class="btn btn-cancel" id="cancelImportBtn">${t(`common.cancel`)}</button>
|
|
496
496
|
<button class="btn btn-primary" id="confirmImportBtn" style="width: auto;">${t(`toolbox.importBtn`)}</button>
|
|
497
497
|
</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 Pn(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 J(`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 J(`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 J(`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(),en()}catch(e){U(t(`toolbox.importFailed`,{error:e.message}),`error`)}})}function Gn(){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(()=>{kn=e.value.trim(),Mn(q.cachedSkills||[])},200)})}let n=document.getElementById(`skillSearchClear`);n&&n.addEventListener(`click`,()=>{e.value=``,kn=``,Mn(q.cachedSkills||[]),e.focus()}),t.forEach(e=>{e.addEventListener(`click`,()=>{t.forEach(e=>e.classList.remove(`active`)),e.classList.add(`active`),An=e.dataset.filter,Mn(q.cachedSkills||[])})})}q.refreshCallback=X;function Kn(){try{chrome.runtime.sendMessage({type:`RELOAD_MCP_TOOLS`},e=>{e?.success&&r.debug(`[Toolbox] Background re loaded ${e.count} MCP tool`)})}catch{}}function qn(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 Jn(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 X(){let[e,n]=await Promise.all([sn(),jn()]),r=e.servers||[],i=n.skills||[];cn(r),Mn(i),qn(r),Jn(i);let a=document.getElementById(`toolboxAgentStatus`);if(a){if(q.agentConnected){let e=q.agentName||t(`toolbox.unknownAgent`);a.innerHTML=`<span class="toolbox-status-dot connected"></span> ${t(`toolbox.currentAgentSupports`,{name:Y(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=!q.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 Yn(e){q.cachedMcpServers.find(t=>t.id===e)&&(q.editingMcpId=e,document.getElementById(`mcpServerList`)&&cn(q.cachedMcpServers))}function Xn(){q.editingMcpId=null,cn(q.cachedMcpServers)}async function Zn(){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=yn(`mcpEdit`),l=r?.value.trim(),u=i?.value.trim(),d=a?.value.trim(),f=c===`sse`||c===`streamableHttp`||c===`websocket`;if(!o){Z(t(`toolbox.mcpIdRequired`),`warning`);return}if(f){if(!d){Z(t(`toolbox.mcpUrlRequired`),`warning`);return}}else if(!l){Z(t(`toolbox.mcpCommandRequired`),`warning`);return}let p={id:o,name:s||o,transport:c,command:l,args:u?u.split(/\s+/):[],url:d,env:un(document.getElementById(`mcpEditEnvRows`)),headers:fn(document.getElementById(`mcpEditHeaderRows`)),enabled:q.cachedMcpServers.find(e=>e.id===q.editingMcpId)?.enabled!==!1};try{if(await Cn(p),q.cachedMcpServers.find(e=>e.id===q.editingMcpId)?.connected){Z(t(`toolbox.mcpReconnecting`),`info`),await En(q.editingMcpId),await new Promise(e=>setTimeout(e,500));let e=await Tn(o);if(e.success)Z(t(`toolbox.mcpUpdateReconnected`,{count:e.toolCount||0}),`success`);else{let n=e.error||t(`toolbox.mcpUnknownError`);Z(t(`toolbox.mcpUpdatedReconnectFailed`,{error:n}),`warning`)}}else Z(t(`toolbox.mcpUpdateSuccess`),`success`);q.editingMcpId=null,Kn(),await X()}catch(e){Z(t(`toolbox.mcpUpdateFailed`,{error:e.message}),`error`)}}function Qn(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 $n(){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),Qn(`mcp`,r),Qn(`skill`,i)}),e&&e.addEventListener(`change`,()=>{let n=e.checked;chrome.storage.local.set({mcpEnabled:n}),Qn(`mcp`,n),Z(t(n?`toolbox.mcpServiceEnabled`:`toolbox.mcpServiceDisabled`),`info`)}),n&&n.addEventListener(`change`,()=>{let e=n.checked;chrome.storage.local.set({skillsEnabled:e}),Qn(`skill`,e),Z(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()?Sn():xn()});let a=document.getElementById(`mcpAddForm`);a&&a.addEventListener(`click`,async e=>{if(e.target.dataset.action===`transport-change`){bn(e.target);return}if(!mn(e)&&(e.target.id===`mcpAddCancel`&&Sn(),e.target.id===`mcpAddConfirm`)){let e=document.getElementById(`mcpAddId`)?.value.trim(),n=document.getElementById(`mcpAddName`)?.value.trim(),r=yn(`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){Z(t(`toolbox.mcpIdRequired`),`warning`);return}if(s){if(!o){Z(t(`toolbox.mcpUrlRequired`),`warning`);return}}else if(!i){Z(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?un(c):{},headers:l?fn(l):{},enabled:!0};try{await Cn(u),Z(t(`toolbox.mcpAddSuccess`),`success`),Sn(),Kn(),await X()}catch(e){Z(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`){bn(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`)Z(t(`toolbox.mcpConnecting`),`info`),await Tn(i),Z(t(`toolbox.mcpConnectSuccess`),`success`),Kn(),await X();else if(r===`disconnect`)await En(i),Z(t(`toolbox.mcpDisconnectSuccess`),`success`),Kn(),await X();else if(r===`toggle`){let e=n.checked;await Dn(i,e),Z(t(e?`toolbox.mcpEnabledToast`:`toolbox.mcpDisabledToast`),`success`),Kn(),await X()}else if(r===`delete`){if(!await tn(t(`toolbox.mcpConfirmDelete`),t(`toolbox.deleteConfirmTitle`)))return;await wn(i),Z(t(`toolbox.deleteSuccess`),`success`),Kn(),await X()}else if(r===`edit`)Yn(i);else if(r===`cancel-edit`)Xn();else if(r===`save-edit`)await Zn();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){Z(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})}">📄 ${Y(e.name)}</span>`).join(``))}catch(e){r.error(`Failed to expand resources:`,e)}return}if(!(!i||!a))try{if(i===`delete-skill`){if(!await tn(t(`toolbox.skillConfirmDelete`,{name:a}),t(`toolbox.deleteConfirmTitle`)))return;await Fn(a),Z(t(`toolbox.deleteSuccess`),`success`),await X()}else if(i===`toggle-skill`)Z(await In(a)?t(`toolbox.skillEnabledToast`,{name:a}):t(`toolbox.skillDisabledToast`,{name:a}),`success`),await X();else if(i===`run-skill`){let e=await J(`GET`,`/api/skill/detail?name=${encodeURIComponent(a)}`);if(!e?.success||!e.skill){Z(t(`toolbox.skillInfoFailed`,{error:e?.error||t(`agentConfig.unknownError`)}),`error`);return}let n=Rn(e.skill);if(n.hasRequired){let r=await zn(a,n);if(r===null)return;Z(t(`toolbox.skillRunning`,{name:a}),`info`),Bn(a,e,await Ln(a,r))}else Z(t(`toolbox.skillRunning`,{name:a}),`info`),Bn(a,e,await Ln(a))}else if(i===`edit-agent-skill`)try{let e=await Hn(a);e.success?Un(a,e):Z(e.error||t(`toolbox.skillContentFailed`),`error`)}catch(e){Z(t(`toolbox.skillGetFailed`,{error:e.message}),`error`)}else if(i===`view-agent-skill`)try{let e=await Hn(a);e.success?nn(a,e):Z(e.error||t(`toolbox.skillContentFailed`),`error`)}catch(e){Z(t(`toolbox.skillGetFailed`,{error:e.message}),`error`)}}catch(e){Z(t(`toolbox.operationFailed`,{error:e.message}),`error`)}});let c=document.getElementById(`importSkillBtn`);c&&c.addEventListener(`click`,()=>Wn());let l=document.getElementById(`reloadSkillsBtn`);l&&l.addEventListener(`click`,async()=>{try{let e=await Vn();Z(t(`toolbox.skillsReloaded`,{count:e.count||0}),`success`),await X()}catch(e){Z(t(`toolbox.skillsReloadFailed`,{error:e.message}),`error`)}}),On(),Gn(),X()}function Z(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 er=2e3,tr=[`vectra`,`@huggingface/transformers`,`pdf-parse`,`mammoth`,`officeparser`,`cheerio`],nr=null,rr=null;function ir(e){rr=e}async function ar(){if(await rn(),!q.agentConnected)return{connected:!1,ragAvailable:!1,nodeVersion:null};try{let e=await J(`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 or(){try{return await J(`GET`,`/api/rag/install/status`)}catch(e){return r.warn(`[RAG] Failed to fetch install status:`,e.message),null}}function sr(){try{chrome.runtime.sendMessage({type:`RELOAD_RAG_TOOLS`},e=>{e?.success&&r.debug(`[Toolbox] Background re loaded ${e.count} RAG tool`)})}catch{}}function cr(e){if(!e)return!0;let t=parseInt(String(e).replace(/^v/i,``),10);return!Number.isFinite(t)||t>=22}function lr(e,t,n,r=``){return`
|
|
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`
|
|
499
499
|
<div class="toolbox-empty" style="text-align:left; padding:20px 16px;">
|
|
500
500
|
<div class="toolbox-empty-title" style="display:flex; align-items:center; gap:8px; font-size:14px;">
|
|
501
501
|
<span style="font-size:20px;">${e}</span><span>${t}</span>
|
|
502
502
|
</div>
|
|
503
503
|
<div class="toolbox-empty-desc" style="margin-top:6px; line-height:1.6;">${n}</div>
|
|
504
504
|
${r}
|
|
505
|
-
</div>`}function
|
|
505
|
+
</div>`}function gr(e){let n=e&&Array.isArray(e.packages)&&e.packages.length>0?e.packages:sr,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
506
|
`)):``,o=i?`
|
|
507
507
|
<div style="margin-top:12px; padding:10px 12px; background:#fdf1f0; border:1px solid #f2c9c4; border-radius:6px;">
|
|
508
|
-
<div style="color:#c0392b; font-weight:600; font-size:12px; margin-bottom:6px;">⚠️ ${
|
|
508
|
+
<div style="color:#c0392b; font-weight:600; font-size:12px; margin-bottom:6px;">⚠️ ${q(e.error||t(`toolbox.ragInstallFailedToast`))}</div>
|
|
509
509
|
${a?`<div style="font-size:11px; color:#888; margin-bottom:4px;">${t(`toolbox.ragInstallLogLabel`)}</div>
|
|
510
510
|
<pre style="margin:0; max-height:130px; overflow:auto; font-size:11px; color:#666; white-space:pre-wrap; word-break:break-all;">${a}</pre>`:``}
|
|
511
511
|
<div style="margin-top:8px; font-size:11px; color:#b06a2b; line-height:1.6;">💡 ${t(`toolbox.ragInstallFailedAdvice`)}</div>
|
|
512
|
-
</div>`:``,s=n.map(e=>`<code style="background:#f2f3f5; padding:1px 6px; border-radius:4px; margin:0 6px 4px 0; font-size:12px; display:inline-block;">${
|
|
512
|
+
</div>`:``,s=n.map(e=>`<code style="background:#f2f3f5; padding:1px 6px; border-radius:4px; margin:0 6px 4px 0; font-size:12px; display:inline-block;">${q(e)}</code>`).join(``),c=`
|
|
513
513
|
<div style="margin-top:12px; font-size:13px;">
|
|
514
514
|
<div style="color:#555; margin-bottom:6px;"><strong>${t(`toolbox.ragInstallPackagesLabel`)}</strong></div>
|
|
515
515
|
<div style="margin-bottom:8px;">${s}</div>
|
|
@@ -517,7 +517,7 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
517
517
|
<div style="color:#8a8f99; font-size:12px; line-height:1.6; margin-bottom:10px;">💡 ${t(`toolbox.ragInstallNoRestartNeeded`)}</div>
|
|
518
518
|
<div style="color:#555; margin-bottom:6px;"><strong>${t(`toolbox.ragInstallCommandLabel`)}</strong></div>
|
|
519
519
|
<div style="display:flex; align-items:center; gap:8px;">
|
|
520
|
-
<code id="ragInstallCmd" style="flex:1; min-width:0; background:#2d2d2d; color:#e8e8e8; padding:8px 10px; border-radius:6px; font-size:12px; overflow-x:auto; white-space:nowrap; display:block;">${
|
|
520
|
+
<code id="ragInstallCmd" style="flex:1; min-width:0; background:#2d2d2d; color:#e8e8e8; padding:8px 10px; border-radius:6px; font-size:12px; overflow-x:auto; white-space:nowrap; display:block;">${q(r)}</code>
|
|
521
521
|
<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
522
|
</div>
|
|
523
523
|
${o}
|
|
@@ -525,196 +525,263 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
525
525
|
<div style="margin-top:16px; display:flex; gap:10px;">
|
|
526
526
|
<button class="toolbox-add-btn" id="ragInstallBtn" style="width:auto; flex:none; margin:0; padding:8px 18px; border-style:solid; color:#667eea; border-color:#667eea;">${t(`toolbox.ragInstallBtn`)}</button>
|
|
527
527
|
<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:#2d2d2d; color:#c8c8c8; padding:10px; border-radius:6px; font-size:11px; white-space:pre-wrap; word-break:break-all;">${i}</pre>`:``;return
|
|
528
|
+
</div>`;return hr(`📦`,t(`toolbox.ragStatusNotInstalledTitle`),t(`toolbox.ragStatusNotInstalledDesc`),c)}function _r(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(`
|
|
529
|
+
`)):``,a=i?`<pre style="margin-top:12px; max-height:160px; overflow:auto; background:#2d2d2d; color:#c8c8c8; padding:10px; border-radius:6px; font-size:11px; white-space:pre-wrap; word-break:break-all;">${i}</pre>`:``;return hr(`⏳`,r,t(`toolbox.ragInstallTip`),a)}function vr(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=hr(`🔌`,t(`toolbox.ragStatusAgentOffTitle`),t(`toolbox.ragStatusAgentOffDesc`));return}if(o){n.innerHTML=hr(`⚠️`,t(`toolbox.ragStatusUnreachableTitle`),t(`toolbox.ragStatusUnreachableDesc`));return}if(s&&s.running){n.innerHTML=_r(s);return}if(i){n.innerHTML=hr(`✅`,t(`toolbox.ragStatusReadyTitle`),t(`toolbox.ragStatusReadyDesc`));return}if(!mr(a)){n.innerHTML=hr(`⚠️`,t(`toolbox.ragStatusNodeLowTitle`),t(`toolbox.ragStatusNodeLowDesc`,{version:q(a||`?`)}));return}n.innerHTML=gr(s)}function yr(){cr&&=(clearTimeout(cr),null)}function br(){yr();let e=async()=>{let n=await fr();if(n&&n.running){vr({connected:!0,ragAvailable:!1,nodeVersion:null,install:n}),cr=setTimeout(e,or);return}yr();let r=await dr();r.connected&&!r.ragAvailable&&(r.install=n),vr(r),n&&n.done&&(U(n.success?t(`toolbox.ragInstallSuccess`):t(`toolbox.ragInstallFailedToast`),n.success?`success`:`error`),n.success&&(pr(),await lr?.()))};cr=setTimeout(e,or)}async function xr(){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){U(n&&n.error?n.error:t(`toolbox.ragInstallFailedToast`),`error`);let r=await fr();if(r&&r.running){br();return}e&&(e.disabled=!1,e.textContent=t(`toolbox.ragInstallBtn`));return}U(t(`toolbox.ragInstallStarted`),`info`),br()}catch(n){U(`${t(`toolbox.ragInstallFailedToast`)}: ${n.message}`,`error`),e&&(e.disabled=!1,e.textContent=t(`toolbox.ragInstallBtn`))}}async function Sr(){let e=document.getElementById(`ragRedetectBtn`);e&&(e.disabled=!0);try{let e=await K(`POST`,`/api/rag/detect`);e&&e.success?e.available?(U(t(`toolbox.ragRedetectReady`),`success`),pr(),await lr?.()):e.error?U(t(`toolbox.ragRedetectStillMissingDetail`,{error:e.error}),`error`):U(t(`toolbox.ragRedetectStillMissing`),`info`):U(t(`toolbox.ragRedetectFailed`,{error:e&&e.error||`unknown`}),`error`)}catch(e){U(t(`toolbox.ragRedetectFailed`,{error:e.message}),`error`)}await wr()}async function Cr(){let e=document.getElementById(`ragInstallCmd`),n=e?e.textContent:`npm install ${sr.join(` `)}`;try{await navigator.clipboard.writeText(n),U(t(`toolbox.ragCopied`),`success`)}catch(e){r.warn(`[RAG] Clipboard write failed:`,e.message),U(t(`toolbox.ragCopyFailed`),`error`)}}async function wr(){let e=await dr();if(!e.connected||e.ragAvailable||e.unreachable){e.ragAvailable&&pr(),vr(e),yr();return}e.install=await fr(),vr(e),e.install&&e.install.running?br():yr()}function Tr(){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 xr():t.id===`ragRedetectBtn`?await Sr():t.id===`ragCopyCmdBtn`&&await Cr())}))}var Er=52428800,Dr=400,Or=80,kr=5,Ar=.3,jr=`.txt,.md,.markdown,.pdf,.docx,.doc,.xlsx,.xls,.csv,.pptx,.html,.htm,.json,.rtf,.odt,.odp,.ods,.epub`,Mr=[],Nr=``,Pr=`all`,Fr=!1;function Ir(){if(Fr)return;Fr=!0;let e=document.getElementById(`knowledgeList`);e&&e.addEventListener(`click`,Gr);let t=document.getElementById(`kbSearchInput`);if(t){let e=null;t.addEventListener(`input`,()=>{clearTimeout(e),e=setTimeout(()=>{Nr=t.value.trim(),Hr(Mr)},200)});let n=document.getElementById(`kbSearchClear`);n&&n.addEventListener(`click`,()=>{t.value=``,Nr=``,Hr(Mr),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`),Pr=e.dataset.filter,Hr(Mr)})});let r=document.getElementById(`createKbBtn`);r&&r.addEventListener(`click`,()=>ei());let i=document.getElementById(`ragGlobalToggle`);i&&(chrome.storage.local.get(`ragEnabled`,e=>{let t=e.ragEnabled===!0;i.checked=t,Rr(t)}),i.addEventListener(`change`,()=>zr(i.checked))),ur(()=>Lr());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)}),Lr()}async function Lr(){let e=document.getElementById(`knowledgeGate`),t=document.getElementById(`knowledgeMain`);if(!e||!t)return;let n=await dr(),{ragEnabled:r}=await chrome.storage.local.get(`ragEnabled`),i=document.getElementById(`createKbBtn`);if(!n.connected){Br(`agentOff`),i&&(i.disabled=!0);return}if(r!==!0){Br(`ragOff`),i&&(i.disabled=!0);return}if(!n.ragAvailable){Br(`ragUnavailable`),i&&(i.disabled=!0),Tr(),await wr();return}i&&(i.disabled=!1),e.style.display=`none`,t.style.display=``,await X()}function Rr(e){let n=document.getElementById(`ragToggleLabel`);n&&(n.textContent=t(e?`common.enabled`:`common.disabled`),n.style.color=e?`#666`:`#999`)}async function zr(e){await chrome.storage.local.set({ragEnabled:e});let n=document.getElementById(`ragGlobalToggle`);n&&(n.checked=e),Rr(e),U(t(e?`toolbox.ragServiceEnabled`:`toolbox.ragServiceDisabled`),`info`),await Lr()}function Br(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">${Vr()}</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:#667eea; border-color:#667eea;">${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:#667eea; border-color:#667eea;">${q(i.btn)}</button>`;n.innerHTML=`
|
|
530
530
|
<div class="toolbox-empty" style="text-align:left; padding:24px 20px;">
|
|
531
531
|
<div style="display:flex; align-items:center; gap:10px; font-size:15px; font-weight:600; color:#555;">
|
|
532
|
-
<span style="font-size:22px;">${i.icon}</span><span>${
|
|
532
|
+
<span style="font-size:22px;">${i.icon}</span><span>${q(i.title)}</span>
|
|
533
533
|
</div>
|
|
534
|
-
<div style="margin-top:8px; line-height:1.7; color:#888; font-size:13px;">${
|
|
534
|
+
<div style="margin-top:8px; line-height:1.7; color:#888; font-size:13px;">${q(i.desc)}</div>
|
|
535
535
|
${a}
|
|
536
|
-
</div>`}async function
|
|
536
|
+
</div>`}async function X(){let e=document.getElementById(`knowledgeList`);if(e){e.innerHTML=Vr();try{let e=await K(`GET`,`/api/rag/collections`);if(!e||e.success!==!0)throw Error(e?.error||`unknown error`);Mr=e.collections||[],Hr(Mr)}catch(n){r.warn(`[Knowledge] Failed to load collections:`,n.message),Wr([]),e.innerHTML=`
|
|
537
537
|
<div class="toolbox-empty" style="grid-column:1/-1;">
|
|
538
538
|
<div class="toolbox-empty-icon">⚠️</div>
|
|
539
|
-
<div class="toolbox-empty-title">${
|
|
540
|
-
<button class="toolbox-add-btn" id="kbRetryBtn" style="width:auto; margin-top:12px; padding:8px 18px;">${
|
|
541
|
-
</div>`}}}function
|
|
539
|
+
<div class="toolbox-empty-title">${q(t(`knowledge.loadFailed`,{error:n.message}))}</div>
|
|
540
|
+
<button class="toolbox-add-btn" id="kbRetryBtn" style="width:auto; margin-top:12px; padding:8px 18px;">${q(t(`knowledge.retry`))}</button>
|
|
541
|
+
</div>`}}}function Vr(){return`
|
|
542
542
|
<div class="toolbox-empty" style="grid-column:1/-1;">
|
|
543
543
|
<div class="toolbox-empty-icon">⏳</div>
|
|
544
|
-
<div class="toolbox-empty-title">${
|
|
545
|
-
</div>`}function
|
|
544
|
+
<div class="toolbox-empty-title">${q(t(`toolbox.loading`))}</div>
|
|
545
|
+
</div>`}function Hr(e){let n=document.getElementById(`knowledgeList`);if(!n)return;if(e.length===0){Wr(e),n.innerHTML=`
|
|
546
546
|
<div class="toolbox-empty" style="grid-column:1/-1; padding:50px 20px;">
|
|
547
547
|
<div class="toolbox-empty-icon">📚</div>
|
|
548
|
-
<div class="toolbox-empty-title">${
|
|
549
|
-
<div class="toolbox-empty-desc">${
|
|
550
|
-
</div>`;return}let r=e.filter(e=>
|
|
548
|
+
<div class="toolbox-empty-title">${q(t(`knowledge.emptyTitle`))}</div>
|
|
549
|
+
<div class="toolbox-empty-desc">${q(t(`knowledge.emptyDesc`))}</div>
|
|
550
|
+
</div>`;return}let r=e.filter(e=>Pr===`enabled`&&e.enabled===!1||Pr===`disabled`&&e.enabled!==!1?!1:!Nr||[e.name,e.description].filter(Boolean).join(` `).toLowerCase().includes(Nr.toLowerCase()));if(Wr(e),r.length===0){n.innerHTML=`
|
|
551
551
|
<div class="toolbox-empty" style="grid-column:1/-1; padding:50px 20px;">
|
|
552
552
|
<div class="toolbox-empty-icon">🔍</div>
|
|
553
|
-
<div class="toolbox-empty-title">${
|
|
554
|
-
</div>`;return}n.innerHTML=r.map(
|
|
555
|
-
<div class="kb-card${n?` kb-card-disabled`:``}" data-kb-id="${
|
|
553
|
+
<div class="toolbox-empty-title">${q(t(`toolbox.noMatchResult`))}</div>
|
|
554
|
+
</div>`;return}n.innerHTML=r.map(Ur).join(``)}function Ur(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
|
+
<div class="kb-card${n?` kb-card-disabled`:``}" data-kb-id="${q(e.id)}">
|
|
556
556
|
<div class="kb-card-title">
|
|
557
557
|
<span>📚</span>
|
|
558
|
-
<span class="kb-card-name" title="${
|
|
559
|
-
${n?`<span class="kb-card-badge badge-disabled">${
|
|
558
|
+
<span class="kb-card-name" title="${q(e.name)}">${q(e.name)}</span>
|
|
559
|
+
${n?`<span class="kb-card-badge badge-disabled">${q(t(`knowledge.badgeDisabled`))}</span>`:``}
|
|
560
560
|
</div>
|
|
561
|
-
${e.description?`<div class="kb-card-desc" title="${
|
|
562
|
-
<div class="kb-card-meta">${
|
|
563
|
-
<div class="kb-card-model">${
|
|
561
|
+
${e.description?`<div class="kb-card-desc" title="${q(e.description)}">${q(e.description)}</div>`:``}
|
|
562
|
+
<div class="kb-card-meta">${q(t(`knowledge.statsSummary`,{docs:e.documentCount||0,chunks:e.chunkCount||0}))}</div>
|
|
563
|
+
<div class="kb-card-model">${q(a)}</div>
|
|
564
564
|
<div class="kb-card-actions">
|
|
565
|
-
<button class="kb-action-btn" type="button" data-action="edit">${
|
|
566
|
-
<button class="kb-action-btn" type="button" data-action="ingest">${
|
|
567
|
-
<button class="kb-action-btn" type="button" data-action="search">${
|
|
568
|
-
<button class="kb-action-btn" type="button" data-action="docs">${
|
|
569
|
-
<button class="kb-action-btn" type="button" data-action="toggle">${
|
|
570
|
-
<button class="kb-action-btn kb-action-danger" type="button" data-action="delete">${
|
|
571
|
-
</div>
|
|
572
|
-
</div>`}function
|
|
565
|
+
<button class="kb-action-btn" type="button" data-action="edit">${q(t(`knowledge.actionEdit`))}</button>
|
|
566
|
+
<button class="kb-action-btn" type="button" data-action="ingest">${q(t(`knowledge.actionIngest`))}</button>
|
|
567
|
+
<button class="kb-action-btn" type="button" data-action="search">${q(t(`knowledge.actionSearch`))}</button>
|
|
568
|
+
<button class="kb-action-btn" type="button" data-action="docs">${q(t(`knowledge.actionDocs`))}</button>
|
|
569
|
+
<button class="kb-action-btn" type="button" data-action="toggle">${q(t(n?`knowledge.actionEnable`:`knowledge.actionDisable`))}</button>
|
|
570
|
+
<button class="kb-action-btn kb-action-danger" type="button" data-action="delete">${q(t(`knowledge.actionDelete`))}</button>
|
|
571
|
+
</div>
|
|
572
|
+
</div>`}function Wr(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 Gr(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=Mr.find(e=>e.id===n?.dataset.kbId);if(!r)return;let i=t.dataset.action;i===`ingest`?ni(r):i===`edit`?$r(r):i===`search`?oi(r):i===`docs`?ii(r):i===`toggle`?await qr(r):i===`delete`&&await Kr(r)}async function Kr(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`);U(t(`knowledge.deleteSuccess`),`success`),await X()}catch(e){U(t(`knowledge.opFailed`,{error:e.message}),`error`)}}async function qr(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`);U(n.enabled===!1?t(`knowledge.disableSuccess`,{name:e.name}):t(`knowledge.enableSuccess`,{name:e.name}),`success`),await X()}catch(e){U(t(`knowledge.opFailed`,{error:e.message}),`error`)}}function Jr(e={}){let n=e.mode===`openai-compat`;return`
|
|
573
573
|
<div class="form-group">
|
|
574
|
-
<label>${
|
|
574
|
+
<label>${q(t(`knowledge.vectorSectionTitle`))}</label>
|
|
575
575
|
<div class="kb-radio-row">
|
|
576
576
|
<label class="kb-radio-inline">
|
|
577
577
|
<input type="radio" name="kbVecMode" value="local"${n?``:` checked`}>
|
|
578
|
-
${
|
|
578
|
+
${q(t(`knowledge.vectorModeLocal`))}
|
|
579
579
|
</label>
|
|
580
580
|
<label class="kb-radio-inline">
|
|
581
581
|
<input type="radio" name="kbVecMode" value="openai-compat"${n?` checked`:``}>
|
|
582
|
-
${
|
|
582
|
+
${q(t(`knowledge.vectorModeRemote`))}
|
|
583
583
|
</label>
|
|
584
584
|
</div>
|
|
585
|
-
<div class="kb-vec-hint" id="kbVecHint">${
|
|
585
|
+
<div class="kb-vec-hint" id="kbVecHint">${q(t(n?`knowledge.vectorModeRemoteHint`:`knowledge.vectorModeLocalHint`))}</div>
|
|
586
586
|
<div id="kbVecRemoteFields"${n?``:` style="display:none"`}>
|
|
587
587
|
<div class="form-group" style="margin-top:10px;">
|
|
588
|
-
<label>${
|
|
589
|
-
<input type="text" id="kbVecEndpoint" placeholder="${
|
|
588
|
+
<label>${q(t(`knowledge.vectorEndpointLabel`))}</label>
|
|
589
|
+
<input type="text" id="kbVecEndpoint" placeholder="${q(t(`knowledge.vectorEndpointPlaceholder`))}" value="${q(e.endpoint||``)}">
|
|
590
590
|
</div>
|
|
591
591
|
<div class="form-group">
|
|
592
|
-
<label>${
|
|
593
|
-
<input type="password" id="kbVecApiKey" value="" placeholder="${
|
|
592
|
+
<label>${q(t(`knowledge.vectorApiKeyLabel`))}</label>
|
|
593
|
+
<input type="password" id="kbVecApiKey" value="" placeholder="${q(e.apiKey||e.hasApiKey?t(`knowledge.vectorApiKeyKeep`):t(`knowledge.vectorApiKeyPlaceholder`))}">
|
|
594
594
|
</div>
|
|
595
595
|
<div class="form-group">
|
|
596
|
-
<label>${
|
|
597
|
-
<input type="text" id="kbVecModel" placeholder="${
|
|
596
|
+
<label>${q(t(`knowledge.vectorModelLabel`))}</label>
|
|
597
|
+
<input type="text" id="kbVecModel" placeholder="${q(t(`knowledge.vectorModelPlaceholder`))}" value="${q(n&&e.modelName||``)}">
|
|
598
598
|
</div>
|
|
599
599
|
<div class="form-group" style="margin-bottom:0;">
|
|
600
|
-
<label>${
|
|
600
|
+
<label>${q(t(`knowledge.vectorDimsLabel`))}</label>
|
|
601
601
|
<div class="kb-vec-test-row">
|
|
602
|
-
<input type="number" id="kbVecDims" min="1" max="8192" placeholder="${
|
|
603
|
-
<button class="kb-action-btn" type="button" id="kbVecTestBtn">${
|
|
602
|
+
<input type="number" id="kbVecDims" min="1" max="8192" placeholder="${q(t(`knowledge.vectorDimsPlaceholder`))}" value="${n&&e.dimensions?q(String(e.dimensions)):``}">
|
|
603
|
+
<button class="kb-action-btn" type="button" id="kbVecTestBtn">${q(t(`knowledge.vectorTestBtn`))}</button>
|
|
604
604
|
<span class="kb-vec-test-result" id="kbVecTestResult"></span>
|
|
605
605
|
</div>
|
|
606
606
|
</div>
|
|
607
607
|
</div>
|
|
608
|
-
</div>`}function
|
|
608
|
+
</div>`}function Yr(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){U(t(`knowledge.vectorEndpointRequired`),`warning`);return}if(!i){U(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=`#38a169`),c&&e.dimensions){let n=c.value.trim();c.value=String(e.dimensions),n!==String(e.dimensions)&&U(t(`knowledge.vectorDimsFilled`,{dims:e.dimensions}),`info`)}}catch(e){s&&(s.textContent=`✕ ${t(`knowledge.vectorTestFailed`,{error:e.message})}`,s.style.color=`#c0392b`)}finally{o.disabled=!1,o.textContent=u||t(`knowledge.vectorTestBtn`)}})}function Xr(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 Zr(e={},t={}){let n=e.mode||`local`,r=t.mode||`local`;return n!==r||r!==`local`&&[`endpoint`,`modelName`,`dimensions`].some(n=>t[n]!==void 0&&String(e[n]??``)!==String(t[n]??``))}function Qr(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 $r(e){let n=ci({title:t(`knowledge.editTitle`),bodyHtml:`
|
|
609
609
|
<div class="form-group">
|
|
610
|
-
<label>${
|
|
611
|
-
<input type="text" id="kbEditName" maxlength="100" placeholder="${
|
|
610
|
+
<label>${q(t(`knowledge.nameLabel`))}</label>
|
|
611
|
+
<input type="text" id="kbEditName" maxlength="100" placeholder="${q(t(`knowledge.namePlaceholder`))}" value="${q(e.name||``)}">
|
|
612
612
|
</div>
|
|
613
613
|
<div class="form-group">
|
|
614
|
-
<label>${
|
|
615
|
-
<input type="text" id="kbEditDesc" maxlength="500" placeholder="${
|
|
614
|
+
<label>${q(t(`knowledge.descLabel`))}</label>
|
|
615
|
+
<input type="text" id="kbEditDesc" maxlength="500" placeholder="${q(t(`knowledge.descPlaceholder`))}" value="${q(e.description||``)}">
|
|
616
616
|
</div>
|
|
617
|
-
${
|
|
617
|
+
${Jr(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){U(t(`knowledge.nameRequired`),`warning`);return}let c=Xr(a);if(c.mode===`openai-compat`){if(!c.endpoint){U(t(`knowledge.vectorEndpointRequired`),`warning`);return}if(!c.modelName){U(t(`knowledge.vectorModelRequired`),`warning`);return}}if(!(Zr(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?(U(t(`knowledge.rebuildStarted`),`info`),await X(),Qr(e.id).then(e=>{e.phase===`error`?U(t(`knowledge.rebuildFailed`,{error:e.error||`unknown error`}),`error`):U(t(`knowledge.rebuildDone`),`success`),X()}).catch(e=>{U(t(`knowledge.rebuildFailed`,{error:e.message}),`error`),X()})):(U(t(`knowledge.editSuccess`),`success`),await X())}catch(e){i(!1,t(`knowledge.editConfirm`)),U(t(`knowledge.opFailed`,{error:e.message}),`error`)}}}});Yr(n.overlay,e.id);let r=n.overlay.querySelector(`#kbEditName`);r?.focus(),r?.select()}function ei(){let e=ci({title:t(`knowledge.createTitle`),bodyHtml:`
|
|
618
618
|
<div class="form-group">
|
|
619
|
-
<label>${
|
|
620
|
-
<input type="text" id="kbCreateName" maxlength="100" placeholder="${
|
|
619
|
+
<label>${q(t(`knowledge.nameLabel`))}</label>
|
|
620
|
+
<input type="text" id="kbCreateName" maxlength="100" placeholder="${q(t(`knowledge.namePlaceholder`))}">
|
|
621
621
|
</div>
|
|
622
622
|
<div class="form-group">
|
|
623
|
-
<label>${
|
|
624
|
-
<input type="text" id="kbCreateDesc" maxlength="500" placeholder="${
|
|
623
|
+
<label>${q(t(`knowledge.descLabel`))}</label>
|
|
624
|
+
<input type="text" id="kbCreateDesc" maxlength="500" placeholder="${q(t(`knowledge.descPlaceholder`))}">
|
|
625
625
|
</div>
|
|
626
|
-
${
|
|
626
|
+
${Jr({})}`,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){U(t(`knowledge.nameRequired`),`warning`);return}let s=Xr(i);if(s.mode===`openai-compat`){if(!s.endpoint){U(t(`knowledge.vectorEndpointRequired`),`warning`);return}if(!s.modelName){U(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(),U(t(`knowledge.createSuccess`,{name:e.collection?.name||a}),`success`),await X()}catch(e){r(!1,t(`knowledge.createConfirm`)),U(t(`knowledge.opFailed`,{error:e.message}),`error`)}}});Yr(e.overlay),e.overlay.querySelector(`#kbCreateName`)?.focus()}function ti(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 ni(e){let n=`
|
|
627
627
|
<div class="import-tabs" id="kbIngestTabs">
|
|
628
|
-
<button type="button" class="import-tab active" data-tab="file">${
|
|
629
|
-
<button type="button" class="import-tab" data-tab="text">${
|
|
630
|
-
<button type="button" class="import-tab" data-tab="url">${
|
|
628
|
+
<button type="button" class="import-tab active" data-tab="file">${q(t(`knowledge.tabFile`))}</button>
|
|
629
|
+
<button type="button" class="import-tab" data-tab="text">${q(t(`knowledge.tabText`))}</button>
|
|
630
|
+
<button type="button" class="import-tab" data-tab="url">${q(t(`knowledge.tabUrl`))}</button>
|
|
631
631
|
</div>
|
|
632
632
|
<div class="import-panel active" data-panel="file">
|
|
633
633
|
<div class="upload-drop-zone" id="kbDropzone">
|
|
634
634
|
<div class="upload-icon">📄</div>
|
|
635
|
-
<div style="margin-top:8px; color:#666; font-size:13px;">${
|
|
636
|
-
<div style="margin-top:6px; font-size:12px; color:#999;">${
|
|
635
|
+
<div style="margin-top:8px; color:#666; font-size:13px;">${q(t(`knowledge.dropHint`))}</div>
|
|
636
|
+
<div style="margin-top:6px; font-size:12px; color:#999;">${q(t(`knowledge.dropSupported`))}</div>
|
|
637
637
|
<div id="kbSelectedFile" style="display:none; margin-top:8px; color:#38a169; font-weight:500; font-size:13px;"></div>
|
|
638
638
|
</div>
|
|
639
|
-
<input type="file" id="kbFileInput" style="display:none" accept="${
|
|
639
|
+
<input type="file" id="kbFileInput" style="display:none" accept="${jr}">
|
|
640
640
|
</div>
|
|
641
641
|
<div class="import-panel" data-panel="text">
|
|
642
642
|
<div class="form-group">
|
|
643
|
-
<label>${
|
|
644
|
-
<input type="text" id="kbIngestName" maxlength="100" placeholder="${
|
|
643
|
+
<label>${q(t(`knowledge.textNameLabel`))}</label>
|
|
644
|
+
<input type="text" id="kbIngestName" maxlength="100" placeholder="${q(t(`knowledge.textNamePlaceholder`))}">
|
|
645
645
|
</div>
|
|
646
646
|
<div class="form-group" style="margin-bottom:0;">
|
|
647
|
-
<label>${
|
|
648
|
-
<textarea id="kbIngestText" rows="8" placeholder="${
|
|
647
|
+
<label>${q(t(`knowledge.textContentLabel`))}</label>
|
|
648
|
+
<textarea id="kbIngestText" rows="8" placeholder="${q(t(`knowledge.textContentPlaceholder`))}"></textarea>
|
|
649
649
|
</div>
|
|
650
650
|
</div>
|
|
651
651
|
<div class="import-panel" data-panel="url">
|
|
652
652
|
<div class="form-group" style="margin-bottom:0;">
|
|
653
|
-
<label>${
|
|
654
|
-
<input type="url" id="kbIngestUrl" placeholder="${
|
|
653
|
+
<label>${q(t(`knowledge.urlLabel`))}</label>
|
|
654
|
+
<input type="url" id="kbIngestUrl" placeholder="${q(t(`knowledge.urlPlaceholder`))}">
|
|
655
655
|
</div>
|
|
656
656
|
</div>
|
|
657
657
|
<div class="kb-chunk-row">
|
|
658
|
-
<span class="kb-chunk-title">${
|
|
659
|
-
<label class="kb-chunk-inline">${
|
|
660
|
-
<input type="number" id="kbChunkSize" min="100" max="2000" step="50" value="${
|
|
658
|
+
<span class="kb-chunk-title">${q(t(`knowledge.chunkSettingsTitle`))}</span>
|
|
659
|
+
<label class="kb-chunk-inline">${q(t(`knowledge.chunkSizeLabel`))}
|
|
660
|
+
<input type="number" id="kbChunkSize" min="100" max="2000" step="50" value="${Dr}">
|
|
661
661
|
</label>
|
|
662
|
-
<label class="kb-chunk-inline">${
|
|
663
|
-
<input type="number" id="kbChunkOverlap" min="0" max="500" step="10" value="${
|
|
662
|
+
<label class="kb-chunk-inline">${q(t(`knowledge.chunkOverlapLabel`))}
|
|
663
|
+
<input type="number" id="kbChunkOverlap" min="0" max="500" step="10" value="${Or}">
|
|
664
664
|
</label>
|
|
665
665
|
</div>
|
|
666
|
-
<div id="kbIngestStatus" class="kb-status" style="display:none;">⏳ ${
|
|
667
|
-
<div class="kb-doc-row" data-doc-id="${
|
|
666
|
+
<div id="kbIngestStatus" class="kb-status" style="display:none;">⏳ ${q(t(`knowledge.ingesting`))}</div>`,r=null,i=ci({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){U(t(`knowledge.fileRequired`),`warning`);return}let e=await ri(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()){U(t(`knowledge.contentRequired`),`warning`);return}c={type:`text`,content:e,name:n||void 0}}else{let e=o.querySelector(`#kbIngestUrl`).value.trim();if(!e){U(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=ti(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(),U(t(`knowledge.ingestSuccess`,{name:r.name,chunks:r.chunkCount}),`success`),await X()}catch(e){d&&(d.style.display=`none`),a(!1),U(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>Er){U(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 ri(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 ii(e){let n=ci({title:t(`knowledge.docsTitle`,{name:e.name}),bodyHtml:`<div id="kbDocsBody">${Vr()}</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`);U(t(`knowledge.docDeleteSuccess`),`success`),await ai(n,e),X()}catch(e){U(t(`knowledge.opFailed`,{error:e.message}),`error`)}}),ai(n,e)}async function ai(e,n){e.innerHTML=Vr();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:#999;">${q(t(`knowledge.docsEmpty`))}</div>`;return}e.innerHTML=`<div class="kb-doc-list">${i.map(e=>`
|
|
667
|
+
<div class="kb-doc-row" data-doc-id="${q(e.id)}">
|
|
668
668
|
<div class="kb-doc-info">
|
|
669
|
-
<div class="kb-doc-name" title="${
|
|
670
|
-
<div class="kb-doc-meta">${
|
|
669
|
+
<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(li(e.createdAt))}</div>
|
|
671
671
|
</div>
|
|
672
|
-
<button class="kb-doc-del" type="button" data-doc-delete title="${
|
|
673
|
-
</div>`).join(``)}</div>`}catch(n){e.innerHTML=`<div class="kb-status" style="color:#c0392b;">${
|
|
674
|
-
<div class="kb-search-scope">${
|
|
672
|
+
<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:#c0392b;">${q(t(`knowledge.loadFailed`,{error:n.message}))}</div>`}}function oi(e){let n=`
|
|
674
|
+
<div class="kb-search-scope">${q(t(`knowledge.searchScope`,{name:e.name}))}</div>
|
|
675
675
|
<div class="kb-search-bar">
|
|
676
|
-
<input type="text" id="kbSearchQuery" placeholder="${
|
|
677
|
-
<button class="btn btn-primary" type="button" id="kbSearchBtn" style="width:auto; padding:8px 20px; flex:none;">${
|
|
676
|
+
<input type="text" id="kbSearchQuery" placeholder="${q(t(`knowledge.searchQueryPlaceholder`))}">
|
|
677
|
+
<button class="btn btn-primary" type="button" id="kbSearchBtn" style="width:auto; padding:8px 20px; flex:none;">${q(t(`knowledge.searchBtn`))}</button>
|
|
678
678
|
</div>
|
|
679
679
|
<div class="kb-search-opts">
|
|
680
|
-
<label class="kb-chunk-inline">${
|
|
681
|
-
<input type="number" id="kbSearchTopK" min="1" max="20" value="${
|
|
680
|
+
<label class="kb-chunk-inline">${q(t(`knowledge.searchTopKLabel`))}
|
|
681
|
+
<input type="number" id="kbSearchTopK" min="1" max="20" value="${kr}">
|
|
682
682
|
</label>
|
|
683
|
-
<label class="kb-chunk-inline">${
|
|
684
|
-
<input type="number" id="kbSearchThreshold" min="0" max="1" step="0.05" value="${
|
|
683
|
+
<label class="kb-chunk-inline">${q(t(`knowledge.searchThresholdLabel`))}
|
|
684
|
+
<input type="number" id="kbSearchThreshold" min="0" max="1" step="0.05" value="${Ar}">
|
|
685
685
|
</label>
|
|
686
686
|
</div>
|
|
687
|
-
<div id="kbSearchResults"></div>`,{overlay:r}=
|
|
688
|
-
${n.fallback?`<div class="kb-fallback-hint">⚠️ ${
|
|
689
|
-
<div class="kb-hit-count">${
|
|
687
|
+
<div id="kbSearchResults"></div>`,{overlay:r}=ci({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){U(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:kr,threshold:Number.isFinite(c)?c:Ar});if(!t||t.success!==!0)throw Error(t?.error||`unknown error`);si(o,t)}catch(e){o.innerHTML=`<div class="kb-status" style="color:#c0392b;">${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 si(e,n){let r=n.results||[];if(r.length===0){e.innerHTML=`<div class="kb-status" style="color:#999;">${q(t(`knowledge.searchNoHits`))}</div>`;return}e.innerHTML=`
|
|
688
|
+
${n.fallback?`<div class="kb-fallback-hint">⚠️ ${q(t(`knowledge.searchFallbackHint`))}</div>`:``}
|
|
689
|
+
<div class="kb-hit-count">${q(t(`knowledge.searchHitCount`,{count:r.length}))}</div>
|
|
690
690
|
<div class="kb-hit-list">${r.map(e=>`
|
|
691
691
|
<div class="kb-hit">
|
|
692
692
|
<div class="kb-hit-head">
|
|
693
|
-
<span class="kb-hit-score">${
|
|
694
|
-
<span class="kb-hit-doc" title="${
|
|
693
|
+
<span class="kb-hit-score">${q((e.score??0).toFixed(3))}</span>
|
|
694
|
+
<span class="kb-hit-doc" title="${q(e.metadata?.documentName||``)}">${q(e.metadata?.documentName||``)}</span>
|
|
695
695
|
</div>
|
|
696
|
-
<div class="kb-hit-text">${
|
|
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
|
|
696
|
+
<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 ci({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
698
|
<div class="modal-content kb-modal${s?` kb-modal-wide`:``}">
|
|
699
699
|
<div class="modal-header">
|
|
700
|
-
<h3>${
|
|
700
|
+
<h3>${q(e)}</h3>
|
|
701
701
|
<button class="modal-close-btn" type="button">✕</button>
|
|
702
702
|
</div>
|
|
703
703
|
<div class="kb-modal-body">${n}</div>
|
|
704
704
|
<div class="modal-actions">
|
|
705
|
-
<button class="btn btn-cancel" type="button" data-modal-cancel>${
|
|
706
|
-
${i?`<button class="btn btn-primary" type="button" data-modal-confirm>${
|
|
705
|
+
<button class="btn btn-cancel" type="button" data-modal-cancel>${q(a||t(`common.cancel`))}</button>
|
|
706
|
+
${i?`<button class="btn btn-primary" type="button" data-modal-confirm>${q(i)}</button>`:``}
|
|
707
|
+
</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 li(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 ui=!1,di=[],fi=[],pi=!1,mi=null,Z=e=>document.getElementById(e);function hi(){return{keyword:(Z(`memoryEntriesSearch`)?.value||``).trim().toLowerCase(),type:Z(`memoryEntriesTypeFilter`)?.value||`all`}}function gi(){return Z(`memoryEntriesSort`)?.value||`createdDesc`}var _i=(e,t)=>String(t.createdAt||``).localeCompare(String(e.createdAt||``)),vi=e=>Number.isFinite(parseFloat(e))?parseFloat(e):0;function yi(e){let t=[...e];switch(gi()){case`importanceDesc`:return t.sort((e,t)=>vi(t.importance)-vi(e.importance)||_i(e,t));case`valueDesc`:return t.sort((e,t)=>vi(t.value)-vi(e.value)||_i(e,t));case`valueAsc`:return t.sort((e,t)=>vi(e.value)-vi(t.value)||_i(e,t));default:return t.sort(_i)}}function bi(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)}function xi(e){return t(e===`summary`?`memoryEntries.filterSummary`:`memoryEntries.filterFact`)}function Si(e){return String(e||``).split(/[,,、]/).map(e=>e.trim()).filter(Boolean)}function Ci(e){return e?String(e).slice(0,10):``}function wi(e){mi=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 Ti(e){let n=q(e.id),r=(e.tags||[]).map(e=>`<span class="memory-entry-tag-chip">${q(e)}</span>`).join(``),i=e.lastAccessAt?Ci(e.lastAccessAt):t(`memoryEntries.neverAccessed`);return`
|
|
709
|
+
<div class="memory-entry-item${fi.some(t=>t.id===e.id)?` low-value`:``}" data-id="${n}">
|
|
710
|
+
<div class="memory-entry-top">
|
|
711
|
+
<span class="memory-entry-badge ${e.type===`summary`?`summary`:`fact`}">${q(xi(e.type))}</span>
|
|
712
|
+
<div class="memory-entry-content">${q(e.content||``)}</div>
|
|
713
|
+
<div class="memory-entry-actions">
|
|
714
|
+
<button type="button" data-act="edit">${q(t(`memoryEntries.editBtn`))}</button>
|
|
715
|
+
<button type="button" data-act="delete" class="memory-entry-del">${q(t(`memoryEntries.deleteBtn`))}</button>
|
|
716
|
+
</div>
|
|
717
|
+
</div>
|
|
718
|
+
<div class="memory-entry-meta">
|
|
719
|
+
<span>${q(t(`memoryEntries.importanceShort`))} ${Number(e.importance)||0}</span>
|
|
720
|
+
<span>${q(t(`memoryEntries.valueShort`))} ${q(e.value)}</span>
|
|
721
|
+
<span>${q(t(`memoryEntries.createdLabel`))} ${q(Ci(e.createdAt)||`—`)}</span>
|
|
722
|
+
<span>${q(t(`memoryEntries.lastAccessLabel`))} ${q(i)} · ${q(t(`memoryEntries.accessCount`,{count:e.accessCount||0}))}</span>
|
|
723
|
+
${r?`<span>${q(t(`memoryEntries.tagsLabel`))}: ${r}</span>`:``}
|
|
724
|
+
</div>
|
|
725
|
+
</div>`}function Ei(){let e=Z(`memoryEntriesList`);if(!e)return;let n=hi(),r=yi(di.filter(e=>bi(e,n))),i=Z(`memoryEntriesCount`);if(i&&(i.textContent=t(`memoryEntries.count`,{shown:r.length,total:di.length})),!r.length){e.innerHTML=`<div class="memory-entries-empty">${q(di.length?t(`memoryEntries.noMatch`):t(`memoryEntries.empty`))}</div>`;return}e.innerHTML=r.map(Ti).join(``)}function Di(){let e=Z(`memoryEntriesCandidates`);if(e){if(!fi.length){e.style.display=`none`,e.innerHTML=``;return}e.style.display=``,e.innerHTML=`
|
|
726
|
+
<span class="memory-entries-candidates-text">${q(t(`memoryEntries.candidatesHint`,{count:fi.length}))}</span>
|
|
727
|
+
<button type="button" class="memory-entries-compact-btn">${q(t(`memoryEntries.compactBtn`))}</button>`}}async function Oi(){let e=Z(`memoryEntriesList`);if(e){wi({key:`memoryEntries.loading`}),e.innerHTML=``;try{let e=await K(`POST`,`/api/memory/manage`,{action:`review`});if(e&&e.httpStatus===404){wi({key:`memoryEntries.unsupported`});return}if(!e||e.success!==!0){wi({key:`memoryEntries.loadFail`,params:{error:e&&e.error||`unknown`}});return}di=Array.isArray(e.scored)?e.scored:[],fi=Array.isArray(e.candidates)?e.candidates:[],wi(``),Di(),Ei()}catch(e){r.warn(`[MemoryEntries] load failed:`,e.message),wi({key:`memoryEntries.loadFail`,params:{error:e.message}})}}}async function ki(){if(!Z(`memoryEntriesList`))return;let e=await un();if(!e||!e.connected){di=[],fi=[],Di(),Z(`memoryEntriesList`).innerHTML=``,wi({key:`memoryEntries.offline`});return}await Oi()}function Ai(e){pi=e,[`memoryEntriesRefreshBtn`].forEach(t=>{let n=Z(t);n&&(n.disabled=e)});let t=document.querySelector(`.memory-entries-compact-btn`);t&&(t.disabled=e),document.querySelectorAll(`.memory-entry-actions button`).forEach(t=>{t.disabled=e})}async function ji(e,n,i){if(pi)return!1;Ai(!0);try{let r=await K(`POST`,`/api/memory/store`,e);if(!r||r.success!==!0)throw Error(r&&r.error||`unknown`);return U(t(n),`info`),await Oi(),!0}catch(e){return r.warn(`[MemoryEntries] store failed:`,e.message),U(t(i,{error:e.message}),`error`),!1}finally{Ai(!1)}}async function Mi(e){await G(t(`memoryEntries.deleteConfirm`))&&await ji({action:`delete`,memoryId:e.id},`memoryEntries.deleted`,`memoryEntries.deleteFail`)}async function Ni(){if(await G(t(`memoryEntries.compactConfirm`,{count:fi.length,threshold:10}))&&!pi){Ai(!0);try{let e=await K(`POST`,`/api/memory/manage`,{action:`compact`});if(!e||e.success!==!0)throw Error(e&&e.error||`unknown`);U(t(`memoryEntries.compactDone`,{facts:e.removedFacts??0,summaries:e.removedSummaries??0}),`info`),await Oi()}catch(e){r.warn(`[MemoryEntries] compact failed:`,e.message),U(t(`memoryEntries.compactFail`,{error:e.message}),`error`)}finally{Ai(!1)}}}function Pi(e){let n=document.getElementById(`memoryEntryEditModal`);n&&n.remove();let r=document.createElement(`div`);r.className=`modal-overlay`,r.id=`memoryEntryEditModal`,r.innerHTML=`
|
|
728
|
+
<div class="modal-content" style="max-width: 560px;">
|
|
729
|
+
<div class="modal-header">
|
|
730
|
+
<h3>${q(t(`memoryEntries.editTitle`))}</h3>
|
|
731
|
+
</div>
|
|
732
|
+
<div class="modal-body">
|
|
733
|
+
<div class="form-group">
|
|
734
|
+
<label>${q(t(`memoryEntries.typeLabel`))}</label>
|
|
735
|
+
<input type="text" value="${q(xi(e.type))}${e.category?` · ${q(e.category)}`:``}" readonly style="background:#f5f5f5;color:#666;">
|
|
736
|
+
</div>
|
|
737
|
+
<div class="form-group">
|
|
738
|
+
<label>${q(t(`memoryEntries.contentLabel`))}</label>
|
|
739
|
+
<textarea id="memoryEntryEditContent" rows="5">${q(e.content||``)}</textarea>
|
|
740
|
+
</div>
|
|
741
|
+
<div class="form-group">
|
|
742
|
+
<label>${q(t(`memoryEntries.importanceLabel`))}</label>
|
|
743
|
+
<input type="number" id="memoryEntryEditImportance" min="1" max="10" value="${Number(e.importance)||5}">
|
|
744
|
+
</div>
|
|
745
|
+
<div class="form-group">
|
|
746
|
+
<label>${q(t(`memoryEntries.tagsLabel`))}</label>
|
|
747
|
+
<input type="text" id="memoryEntryEditTags" value="${q((e.tags||[]).join(`, `))}" placeholder="${q(t(`memoryEntries.tagsPlaceholder`))}">
|
|
748
|
+
</div>
|
|
749
|
+
</div>
|
|
750
|
+
<div class="modal-actions">
|
|
751
|
+
<button class="btn btn-cancel" id="memoryEntryEditCancel">${q(t(`memoryEntries.cancelBtn`))}</button>
|
|
752
|
+
<button class="btn btn-primary" id="memoryEntryEditSave" style="width:auto;">${q(t(`memoryEntries.saveBtn`))}</button>
|
|
753
|
+
</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){U(t(`memoryEntries.contentEmpty`),`error`);return}let a={action:`update`,memoryId:e.id,type:e.type,content:n,tags:Si(r.querySelector(`#memoryEntryEditTags`).value)},o=Number(r.querySelector(`#memoryEntryEditImportance`).value);Number.isFinite(o)&&(a.importance=o),await ji(a,`memoryEntries.saved`,`memoryEntries.saveFail`)&&i()})}function Fi(){Di(),Ei(),mi&&wi(mi)}function Ii(){ui||(ui=!0,Z(`memoryEntriesRefreshBtn`)?.addEventListener(`click`,()=>ki()),Z(`memoryEntriesSearch`)?.addEventListener(`input`,()=>Ei()),Z(`memoryEntriesTypeFilter`)?.addEventListener(`change`,()=>Ei()),Z(`memoryEntriesSort`)?.addEventListener(`change`,()=>Ei()),Z(`memoryEntriesList`)?.addEventListener(`click`,e=>{let t=e.target.closest(`.memory-entry-item`);if(!t)return;let n=di.find(e=>String(e.id)===t.dataset.id);if(!n)return;let r=e.target.closest(`[data-act]`);if(r){r.dataset.act===`edit`?Pi(n):r.dataset.act===`delete`&&Mi(n);return}e.target.closest(`.memory-entry-content`)&&t.classList.toggle(`expanded`)}),Z(`memoryEntriesCandidates`)?.addEventListener(`click`,e=>{e.target.closest(`.memory-entries-compact-btn`)&&Ni()}),s(()=>Fi()))}var Li=!1,Ri={connected:!0,ragAvailable:!0},zi=!1,Bi=!1,Vi=!1,Q=e=>document.getElementById(e);function Hi(){return document.querySelector(`input[name="memoryEmbeddingMode"]:checked`)?.value||`openai-compat`}var Ui=()=>Hi()===`local`;function Wi(){let e=Ui()?`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=Ui()?``:`none`)}function Gi(){let e={enabled:Q(`memoryEnabled`)?.checked===!0,mode:Hi()};if(Ui())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 Ki(){let e=Q(`memoryEnabledLabel`);e&&(e.textContent=Q(`memoryEnabled`)?.checked===!0?t(`memoryPanel.enabled`):t(`memoryPanel.disabled`))}function qi(){let e=Q(`memoryEnabled`);e&&(e.disabled=zi||Bi)}function Ji(e){Q(`memoryEnabled`).checked=e.enabled===!0,Ki();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||``,Wi()}function Yi(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
|
+
<div class="memory-status-row">
|
|
756
|
+
<span>${q(t(`memoryPanel.statusIndexed`,{indexed:e.indexed,total:e.total}))}</span>
|
|
757
|
+
<span class="memory-status-badge ${e.stale?`stale`:`fresh`}">${q(e.stale?t(`memoryPanel.statusStale`):t(`memoryPanel.statusFresh`))}</span>
|
|
758
|
+
</div>
|
|
759
|
+
<div class="memory-status-keys">
|
|
760
|
+
<span>${q(t(`memoryPanel.statusStored`))}: <code>${q(e.storedModelKey||`—`)}</code></span>
|
|
761
|
+
<span>${q(t(`memoryPanel.statusCurrent`))}: <code>${q(e.currentModelKey)}</code></span>
|
|
762
|
+
<span>${q(t(`memoryPanel.statusTier`))}: <code>${q(e.tier)}</code></span>
|
|
763
|
+
</div>
|
|
764
|
+
${e.stale?`<div class="memory-status-hint">${q(t(`memoryPanel.staleHint`))}</div>`:``}`}}function Xi(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
|
+
<div class="memory-status-row">
|
|
766
|
+
<span class="memory-status-badge fail">${q(r)}</span>
|
|
767
|
+
</div>
|
|
768
|
+
<div class="memory-status-keys"><span>${q(t(`memoryPanel.statusDetail`))}: <code>${q(i)}</code></span></div>`}function Zi(){let e=Q(`memoryStatus`);e&&(e.innerHTML=`<span class="memory-status-muted">${q(t(`memoryPanel.statusOffline`))}</span>`)}function Qi(e){Q(`memoryReindexBtn`).disabled=e,Q(`memoryTestBtn`).disabled=e||Ui(),Q(`memoryApiKeyClearBtn`).disabled=e}async function $i(){if(Ui())return;Qi(!0);let e=Q(`memoryTestResult`);e.textContent=t(`memoryPanel.testRunning`);try{let n=await K(`POST`,`/api/memory/test-embedding`,Gi());if(!n||n.success!==!0)throw Error(n?.error||`unknown`);e.textContent=t(`memoryPanel.testOk`,{model:Gi().modelName,dims:n.dimensions});let r=Q(`memoryDimsInput`);r.value=String(n.dimensions),U(t(`memoryPanel.testOk`,{model:Gi().modelName,dims:n.dimensions}),`info`)}catch(n){e.textContent=t(`memoryPanel.testFail`,{error:n.message}),U(t(`memoryPanel.testFail`,{error:n.message}),`error`)}finally{Qi(!1)}}async function ea(){if(Vi)return{ok:!1,reason:`notLoaded`};Qi(!0);try{let e=await K(`POST`,`/api/memory/embedding-config`,Gi());if(!e||e.success!==!0)throw Error(e?.error||`unknown`);return Q(`memoryApiKeyInput`).value=``,await aa(),{ok:!0}}catch(e){return{ok:!1,reason:`error`,error:e.message}}finally{Qi(!1)}}async function ta(){let e=await un();if(!e||!e.connected){U(t(`memoryPanel.saveSkippedOffline`),`info`);return}let n=await ea();n.ok||(n.reason===`notLoaded`?U(t(`memoryPanel.configNotLoaded`),`error`):U(t(`memoryPanel.saveFail`,{error:n.error}),`error`))}async function na(){if(!await G(t(`memoryPanel.reindexConfirm`)))return;Qi(!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,U(t(`memoryPanel.reindexDone`,{indexed:n.indexed,total:n.total}),`info`)}await aa()}catch(n){e.textContent=t(`memoryPanel.reindexFail`,{error:n.message}),U(t(`memoryPanel.reindexFail`,{error:n.message}),`error`)}finally{Qi(!1)}}async function ra(){if(await G(t(`memoryPanel.apiKeyClearConfirm`))){Qi(!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`,U(t(`memoryPanel.apiKeyCleared`),`info`)}catch(e){U(t(`memoryPanel.apiKeyClearFail`,{error:e.message}),`error`)}finally{Qi(!1)}}}async function ia(){try{let e=await K(`GET`,`/api/memory/vector-status`);e&&e.success===!0?Yi(e):Xi(e)}catch(e){r.warn(`[MemoryPanel] status load failed:`,e.message),Xi(e)}}async function aa(){let e=(async()=>{Vi=!0;try{let e=await K(`GET`,`/api/memory/embedding-config`);e&&e.success===!0&&e.config&&(Ji(e.config),Vi=!1)}catch(e){r.warn(`[MemoryPanel] config load failed:`,e.message),U(t(`memoryPanel.statusFail`)+` — `+e.message,`error`)}})(),n=ia();await Promise.all([e,n])}function oa(e){let n=Q(`memoryGate`),r=Q(`memoryMain`),i=document.querySelector(`.memory-scope-hint`),a=!e.connected||Hi()===`local`&&!e.ragAvailable;if(zi=a,qi(),[`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
|
+
<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:#555;">
|
|
771
|
+
<span style="font-size:22px;">${s}</span><span>${q(c)}</span>
|
|
707
772
|
</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 ri(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 ii=1;function ai(){let e=document.getElementById(`saveBar`);if(!e)return;let t=()=>{let t=e.getBoundingClientRect().bottom>=window.innerHeight-ii;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 $=[];function oi(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)}function si(){let e=window.location.hash.replace(`#`,``);[`basic`,`toolbar`,`react`,`reflection`,`chat`,`agent`,`toolbox`,`knowledge`].includes(e)&&oi(e)}document.addEventListener(`DOMContentLoaded`,async function(){await n(),i(),s(()=>{i(),lt().then(e=>{$=e,ut($)})});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(){oi(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=`▼`))})}),si(),window.addEventListener(`hashchange`,si),chrome.storage.local.get([`optionsInitialTab`],e=>{e.optionsInitialTab&&(oi(e.optionsInitialTab),chrome.storage.local.remove(`optionsInitialTab`))}),chrome.runtime.onMessage.addListener(e=>{e.type===`SWITCH_TAB`&&e.tab&&oi(e.tab)}),await h(),nt(),zt(),$=await lt(),ut($);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`,rt),ai();let f=document.getElementById(`modelInput`),p=document.getElementById(`modelDropdown`);f.addEventListener(`click`,function(e){e.stopPropagation(),p.classList.contains(`show`)||(Oe(p,``),Pe(R),f.select()),p.classList.toggle(`show`)}),f.addEventListener(`input`,function(){L(),p.classList.add(`show`),Oe(p,this.value)}),f.addEventListener(`blur`,function(){f.value=R,Pe(R)}),p.addEventListener(`click`,function(e){if(e.target.classList.contains(`delete-model-btn`)){e.stopPropagation();let t=e.target.closest(`.model-option`).dataset.value;ke(t);return}let t=e.target.closest(`.ctx-set-btn`);if(t){e.stopPropagation();let n=e.target.closest(`.model-option`);n&&ve(t,n,{onPreview:e=>{Ie(n,e),Fe(`modelInput`,`modelSelectedCtxBadge`,`modelDropdown`)},onCommit:e=>Le(n,e),onReset:()=>Le(n,0)});return}let n=e.target.closest(`.model-option`);if(n){e.stopPropagation(),L();let t=n.dataset.value;be(t),f.value=t,Pe(t),p.classList.remove(`show`)}}),document.addEventListener(`click`,function(e){!p.contains(e.target)&&e.target!==f&&!ye(e.target)&&p.classList.remove(`show`)});let m=document.getElementById(`addModelToggleBtn`),g=document.getElementById(`addModelForm`),_=document.getElementById(`addModelName`),v=document.getElementById(`addModelContextWindow`),y=document.getElementById(`confirmAddModelBtn`),ee=document.getElementById(`cancelAddModelBtn`);m&&g&&(m.addEventListener(`click`,function(){let e=g.style.display!==`none`;g.style.display=e?`none`:``,m.textContent=t(e?`settings.addModel`:`settings.collapse`),e||(_.value=``,v.value=``,_.focus())}),ee.addEventListener(`click`,function(){g.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}Te(e,n),f.value=e,be(e),Pe(e),chrome.storage.local.set({modelName:e}),g.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 te=document.getElementById(`enableImageInput`),b=document.getElementById(`imageModelGroup`),ne=document.getElementById(`imageApiGroup`),re=document.getElementById(`imageApiKeyGroup`);te&&b&&te.addEventListener(`change`,function(){b.style.display=this.checked?``:`none`,ne&&(ne.style.display=this.checked?``:`none`),re&&(re.style.display=this.checked?``:`none`),chrome.storage.local.set({enableImageInput:this.checked})});let x=document.getElementById(`imageModelInput`),S=document.getElementById(`imageModelDropdown`);x&&S&&(x.addEventListener(`click`,function(e){e.stopPropagation(),S.classList.contains(`show`)||(Oe(S,``),Ue(xe),x.select()),S.classList.toggle(`show`)}),x.addEventListener(`input`,function(){L(),S.classList.add(`show`),Oe(S,this.value)}),x.addEventListener(`blur`,function(){x.value=xe,Ue(xe)}),S.addEventListener(`click`,function(e){if(e.target.classList.contains(`delete-model-btn`)){e.stopPropagation();let t=e.target.closest(`.model-option`).dataset.value;ze(t);return}let t=e.target.closest(`.ctx-set-btn`);if(t){e.stopPropagation();let n=e.target.closest(`.model-option`);n&&ve(t,n,{onPreview:e=>{Ie(n,e),Fe(`imageModelInput`,`imageModelSelectedCtxBadge`,`imageModelDropdown`)},onCommit:e=>Ve(n,e),onReset:()=>Ve(n,0)});return}let n=e.target.closest(`.model-option`);if(n){e.stopPropagation(),L();let t=n.dataset.value;Se(t),x.value=t,Ue(t),S.classList.remove(`show`)}}),document.addEventListener(`click`,function(e){!S.contains(e.target)&&e.target!==x&&!ye(e.target)&&S.classList.remove(`show`)}));let C=document.getElementById(`addImageModelToggleBtn`),ie=document.getElementById(`addImageModelForm`),w=document.getElementById(`addImageModelName`),ae=document.getElementById(`addImageModelContextWindow`),T=document.getElementById(`confirmAddImageModelBtn`),E=document.getElementById(`cancelAddImageModelBtn`);C&&ie&&(C.addEventListener(`click`,function(){let e=ie.style.display!==`none`;ie.style.display=e?`none`:``,C.textContent=t(e?`settings.addModel`:`settings.collapse`),e||(w.value=``,ae.value=``,w.focus())}),E.addEventListener(`click`,function(){ie.style.display=`none`,C.textContent=t(`settings.addModel`),w.value=``,ae.value=``}),T.addEventListener(`click`,function(){let e=w.value.trim(),n=parseInt(ae.value)||0;if(!e){U(`❌ `+t(`settings.modelNameRequired`),`error`);return}Re(e,n),x.value=e,Se(e),Ue(e),chrome.storage.local.set({imageModelName:e}),ie.style.display=`none`,C.textContent=t(`settings.addModel`),w.value=``,ae.value=``,U(`✅ `+t(`settings.imageModelAdded`),`success`)}),w.addEventListener(`keydown`,function(e){e.key===`Enter`&&T.click()}),ae.addEventListener(`keydown`,function(e){e.key===`Enter`&&T.click()}));async function oe({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 st({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 se=``,D=null;function O(e,t){let n=(e||``).trim(),r=(t||``).trim();if(!n||!r)return;let i=`${n}|${r}`;i!==se&&(clearTimeout(D),D=setTimeout(()=>{se=i;let e=document.getElementById(`fetchModelsBtn`);e&&e.disabled||oe({apiBaseEl:document.getElementById(`apiBase`),apiKeyEl:document.getElementById(`apiKey`),dropdownId:`modelDropdown`,addFn:Te,btn:null,silent:!0})},500))}let ce=document.getElementById(`fetchModelsBtn`);ce&&ce.addEventListener(`click`,()=>{oe({apiBaseEl:document.getElementById(`apiBase`),apiKeyEl:document.getElementById(`apiKey`),dropdownId:`modelDropdown`,addFn:Te,btn:ce,silent:!1})});let ue=document.getElementById(`fetchImageModelsBtn`);ue&&ue.addEventListener(`click`,()=>{oe({apiBaseEl:document.getElementById(`imageApiBase`),apiKeyEl:document.getElementById(`imageApiKey`),dropdownId:`imageModelDropdown`,addFn:Re,btn:ue,silent:!1})});let k=document.getElementById(`apiBase`),A=document.getElementById(`apiBaseDropdown`);k&&A&&(k.addEventListener(`click`,function(e){e.stopPropagation(),A.querySelectorAll(`.model-option`).forEach(e=>{e.style.display=``}),A.classList.toggle(`show`),Ye(k.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;Ke(t);return}let n=e.target.closest(`.model-option`);if(n){e.stopPropagation();let r=n.dataset.value;k.value=r,Ye(r),A.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){!A.contains(e.target)&&e.target!==k&&A.classList.remove(`show`)}),k.addEventListener(`blur`,function(){let e=this.value.trim();e&&(chrome.storage.local.set({apiBase:e}),Ge(e),Ye(e))}),k.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 de=document.getElementById(`addApiBaseToggleBtn`),fe=document.getElementById(`addApiBaseForm`),j=document.getElementById(`addApiBaseUrl`),M=document.getElementById(`addApiBaseLabel`),pe=document.getElementById(`confirmAddApiBaseBtn`),me=document.getElementById(`cancelAddApiBaseBtn`);de&&fe&&(de.addEventListener(`click`,function(){let e=fe.style.display!==`none`;fe.style.display=e?`none`:``,de.textContent=t(e?`settings.addAddress`:`settings.collapse`),e||(j.value=``,M.value=``,j.focus())}),me.addEventListener(`click`,function(){fe.style.display=`none`,de.textContent=t(`settings.addAddress`),j.value=``,M.value=``}),pe.addEventListener(`click`,function(){let e=j.value.trim(),n=M.value.trim();if(!e){U(`❌ `+t(`settings.apiBaseRequired`),`error`);return}try{new URL(e)}catch{U(`❌ `+t(`settings.urlInvalid`),`error`);return}Ge(e,n),k.value=e,Ye(e),chrome.storage.local.set({apiBase:e}),fe.style.display=`none`,de.textContent=t(`settings.addAddress`),j.value=``,M.value=``,U(`✅ `+t(`settings.apiBaseAdded`),`success`)}),j.addEventListener(`keydown`,function(e){e.key===`Enter`&&pe.click()}),M.addEventListener(`keydown`,function(e){e.key===`Enter`&&pe.click()}));let N=document.getElementById(`imageApiBase`),P=document.getElementById(`imageApiBaseDropdown`);N&&P&&(N.addEventListener(`click`,function(e){e.stopPropagation(),P.querySelectorAll(`.model-option`).forEach(e=>{e.style.display=``}),P.classList.toggle(`show`),tt(N.value.trim())}),P.addEventListener(`click`,function(e){if(e.target.classList.contains(`delete-model-btn`)){e.stopPropagation();let t=e.target.closest(`.model-option`).dataset.value;Qe(t);return}let n=e.target.closest(`.model-option`);if(n){e.stopPropagation();let r=n.dataset.value;N.value=r,tt(r),P.classList.remove(`show`),chrome.storage.local.set({imageApiBase:r}),U(`✅ `+t(`settings.imageApiBaseSwitched`),`info`)}}),document.addEventListener(`click`,function(e){!P.contains(e.target)&&e.target!==N&&P.classList.remove(`show`)}),N.addEventListener(`blur`,function(){let e=this.value.trim();e&&(chrome.storage.local.set({imageApiBase:e}),Ze(e),tt(e))}),N.addEventListener(`input`,function(){let e=this.value.trim().toLowerCase();P.classList.add(`show`);let t=P.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 F=document.getElementById(`addImageApiBaseToggleBtn`),he=document.getElementById(`addImageApiBaseForm`),I=document.getElementById(`addImageApiBaseUrl`),ge=document.getElementById(`addImageApiBaseLabel`),_e=document.getElementById(`confirmAddImageApiBaseBtn`),Ce=document.getElementById(`cancelAddImageApiBaseBtn`);F&&he&&(F.addEventListener(`click`,function(){let e=he.style.display!==`none`;he.style.display=e?`none`:``,F.textContent=t(e?`settings.addAddress`:`settings.collapse`),e||(I.value=``,ge.value=``,I.focus())}),Ce.addEventListener(`click`,function(){he.style.display=`none`,F.textContent=t(`settings.addAddress`),I.value=``,ge.value=``}),_e.addEventListener(`click`,function(){let e=I.value.trim(),n=ge.value.trim();if(!e){U(`❌ `+t(`settings.apiBaseRequired`),`error`);return}try{new URL(e)}catch{U(`❌ `+t(`settings.urlInvalid`),`error`);return}Ze(e,n),N.value=e,tt(e),chrome.storage.local.set({imageApiBase:e}),he.style.display=`none`,F.textContent=t(`settings.addAddress`),I.value=``,ge.value=``,U(`✅ `+t(`settings.imageApiBaseAdded`),`success`)}),I.addEventListener(`keydown`,function(e){e.key===`Enter`&&_e.click()}),ge.addEventListener(`keydown`,function(e){e.key===`Enter`&&_e.click()}));let z=document.getElementById(`imageApiKey`),B=document.getElementById(`toggleImageApiKeyBtn`);if(z&&z.addEventListener(`blur`,function(){chrome.storage.local.set({imageApiKey:this.value.trim()})}),z&&B){let e=B.querySelector(`.icon-eye-open`),t=B.querySelector(`.icon-eye-closed`);B.addEventListener(`click`,function(){z.type===`password`?(z.type=`text`,e.style.display=`none`,t.style.display=`block`):(z.type=`password`,e.style.display=`block`,t.style.display=`none`)})}let we=document.getElementById(`toggleToken`),Ee=document.getElementById(`apiKey`),De=we.querySelector(`.icon-eye-open`),Ae=we.querySelector(`.icon-eye-closed`);we.addEventListener(`click`,function(){Ee.type===`password`?(Ee.type=`text`,De.style.display=`none`,Ae.style.display=`block`):(Ee.type=`password`,De.style.display=`block`,Ae.style.display=`none`)});let je=document.getElementById(`resetSystemPromptBtn`);je&&je.addEventListener(`click`,function(){document.getElementById(`systemPrompt`).value=le()});let Me=document.getElementById(`toolbarIconOnly`);Me&&Me.addEventListener(`change`,function(){ft()});let Ne=document.getElementById(`enableSelectionToolbar`),Be=document.getElementById(`toolbarConfig`),He=document.getElementById(`toolbarToggleLabel`);function V(){let e=Ne&&Ne.checked;Be&&(e?Be.classList.remove(`disabled`):Be.classList.add(`disabled`)),He&&(He.textContent=t(e?`common.enabled`:`common.disabled`))}Ne&&Ne.addEventListener(`change`,function(){V(),ft()}),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`:$=pt($,r,-1),ci();break;case`moveDown`:$=pt($,r,1),ci();break;case`edit`:ht($,r);break;case`delete`:$=mt($,r),ci()}}),document.getElementById(`addCustomToolBtn`).addEventListener(`click`,function(){ht($,-1)}),document.getElementById(`domainAddBtn`).addEventListener(`click`,function(){let e=document.getElementById(`domainAddInput`);bt(e.value,t=>{t.error?U(`❌ `+t.error,`error`):e.value=``})}),document.getElementById(`domainAddInput`).addEventListener(`keydown`,function(e){e.key===`Enter`&&bt(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&&xt(t.dataset.domain)}),vt(),chrome.storage.onChanged.addListener((e,t)=>{t===`local`&&e.blockedDomains&&vt()}),document.getElementById(`toolEditCancel`).addEventListener(`click`,function(){gt()}),document.getElementById(`toolEditClose`).addEventListener(`click`,function(){gt()}),document.getElementById(`toolEditSave`).addEventListener(`click`,function(){let e=_t($);if(e.error){U(`❌ `+e.error,`error`);return}$=e.tools,ci()});let We=document.getElementById(`reflectionEnabled`),qe=document.getElementById(`reflectionConfig`),Je=document.getElementById(`reflectionToggleLabel`);function H(){if(!qe)return;let e=We&&We.checked;e?qe.classList.remove(`disabled`):qe.classList.add(`disabled`),Je&&(Je.textContent=t(e?`common.enabled`:`common.disabled`))}function Xe(e,t){let n=document.getElementById(e),r=document.getElementById(t);!n||!r||(r.checked?n.classList.remove(`disabled`):n.classList.add(`disabled`))}We&&(We.addEventListener(`change`,function(){H();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})})}),H());function $e(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 et=document.getElementById(`postReflectionEnabled`);et&&et.addEventListener(`change`,function(){Xe(`postReflectionSection`,`postReflectionEnabled`),$e(`postReflection`,this.checked)});let it=document.getElementById(`subtaskReflectionEnabled`);it&&it.addEventListener(`change`,function(){Xe(`subtaskReflectionSection`,`subtaskReflectionEnabled`),$e(`subtaskReflection`,this.checked)}),H(),Xe(`postReflectionSection`,`postReflectionEnabled`),Xe(`subtaskReflectionSection`,`subtaskReflectionEnabled`);let W=document.getElementById(`streamEnabled`),at=document.getElementById(`streamEnabledLabel`);function ot(){let e=document.getElementById(`streamExpandToolsWrap`);e&&(e.style.display=W&&W.checked?`block`:`none`)}W&&at&&(W.addEventListener(`change`,function(){at&&(at.textContent=W.checked?t(`common.enabled`):t(`common.disabled`)),chrome.storage.local.set({streamEnabled:W.checked}),ot()}),at&&(at.textContent=W.checked?t(`common.enabled`):t(`common.disabled`)),ot());let ct=document.getElementById(`streamExpandTools`),dt=document.getElementById(`streamExpandToolsLabel`);ct&&dt&&(ct.addEventListener(`change`,function(){dt.textContent=this.checked?t(`common.enabled`):t(`common.disabled`),chrome.storage.local.set({streamExpandTools:this.checked})}),dt.textContent=ct.checked?t(`common.enabled`):t(`common.disabled`));let G=document.getElementById(`toolConfirmationEnabled`),yt=document.getElementById(`toolConfirmationEnabledLabel`);G&&yt&&(G.addEventListener(`change`,function(){yt.textContent=this.checked?t(`common.enabled`):t(`common.disabled`),chrome.storage.local.set({toolConfirmationEnabled:this.checked})}),yt.textContent=G.checked?t(`common.enabled`):t(`common.disabled`));let St=document.getElementById(`enableExecutionLog`),Ct=document.getElementById(`enableExecutionLogLabel`);St&&Ct&&(St.addEventListener(`change`,function(){Ct.textContent=this.checked?t(`common.enabled`):t(`common.disabled`),chrome.storage.local.set({enableExecutionLog:this.checked})}),Ct.textContent=St.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 Tt=document.getElementById(`completionConfettiEnabled`);Tt&&Tt.addEventListener(`change`,function(){chrome.storage.local.set({completionConfettiEnabled:this.checked})});let Et=document.getElementById(`completionNotificationEnabled`);Et&&Et.addEventListener(`change`,function(){chrome.storage.local.set({completionNotificationEnabled:this.checked})});let Ot=document.getElementById(`scheduledNotificationEnabled`);Ot&&Ot.addEventListener(`change`,function(){chrome.storage.local.set({scheduledNotificationEnabled:this.checked})});let kt=document.getElementById(`interactionNotificationEnabled`);kt&&kt.addEventListener(`change`,function(){chrome.storage.local.set({interactionNotificationEnabled:this.checked})});let At=document.getElementById(`showMessageTimestamp`);At&&At.addEventListener(`change`,function(){chrome.storage.local.set({showMessageTimestamp:this.checked})}),li(),document.getElementById(`exportConfigBtn`).addEventListener(`click`,Dt),document.getElementById(`importConfigBtn`).addEventListener(`click`,jt),document.getElementById(`importConfigFile`).addEventListener(`change`,function(e){e.target.files&&e.target.files.length>0&&Nt(e.target.files[0])}),Ft(),$n(),document.querySelector(`[data-tab="toolbox"]`)?.addEventListener(`click`,()=>{X()}),Ar(),document.querySelector(`[data-tab="knowledge"]`)?.addEventListener(`click`,()=>{jr()})});function ci(){chrome.storage.local.set({toolbarTools:$},()=>{ut($),ft()})}function li(){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 h(){let e=document.getElementById(`agentDetailArea`);e&&f.nextSibling!==e&&f.parentNode.insertBefore(e,f.nextSibling)}function g(){let e=document.getElementById(`agentDetailArea`);if(!e)return;let t=p.querySelector(`.paired-agent-item.active`);t&&t!==e.parentNode?t.appendChild(e):t||h()}async function _(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 v(){h();let e=await chrome.storage.local.get([`pairedAgents`,`activeAgentId`]),n=e.pairedAgents||[],r=e.activeAgentId;if(y=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`),`
|
|
773
|
+
<div style="margin-top:8px; line-height:1.7; color:#888; font-size:13px;">${q(l)}</div>
|
|
774
|
+
<button class="toolbox-add-btn" data-goto-tab="${d}" style="width:auto; margin-top:14px; padding:8px 18px; border-style:solid; color:#667eea; border-color:#667eea;">${q(u)}</button>
|
|
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`),`
|
|
709
776
|
<div class="paired-agent-item${n?` active`:``}${i?` disabled`:``}" data-agent-id="${e.id}">
|
|
710
777
|
<span class="paired-agent-dot ${a}" title="${o}"></span>
|
|
711
|
-
<span class="paired-agent-name" data-agent-id="${e.id}" data-original="${
|
|
712
|
-
<span class="paired-agent-url">${
|
|
778
|
+
<span class="paired-agent-name" data-agent-id="${e.id}" data-original="${O(e.name)}" title="${t(`agentConfig.clickToEditName`)}">${O(e.name)}</span>
|
|
779
|
+
<span class="paired-agent-url">${O(e.url)}</span>
|
|
713
780
|
<span class="paired-agent-status-text ${s}">${o}</span>
|
|
714
781
|
<div class="paired-agent-actions">
|
|
715
782
|
${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>`}
|
|
716
783
|
${i?``:`<button class="paired-agent-btn disable-btn" data-action="disable" data-id="${e.id}">${t(`agentConfig.disable`)}</button>`}
|
|
717
784
|
<button class="paired-agent-btn delete-btn" data-action="delete" data-id="${e.id}">${t(`common.delete`)}</button>
|
|
718
785
|
</div>
|
|
719
|
-
</div>`}).join(``),te(n),g(),n.forEach(e=>{e.disabled||_(e.url).then(t=>{ee(e.id,t)})})}let y=null;function ee(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&&y!==null&&y!==n&&chrome.runtime.sendMessage({type:`AGENT_STATUS_CHANGE`,connected:n,status:t(n?`agentConfig.online`:`agentConfig.offline`),agentId:e}).catch(()=>{}),o&&(y=n)}function te(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 b(r):n===`deactivate`?await ue(r):n===`disable`?await re(r):n===`enable`?await x(r):n===`delete`&&await ne(r)})})}async function b(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 S(r.url,r.token),chrome.runtime.sendMessage({type:`AGENT_CONNECTION_CHANGED`,connected:!0,agentId:n}).catch(()=>{}),U(t(`agentConfig.connectedTo`,{name:r.name}),`success`),await v(),X().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||!await tn(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 v(),await C(),o!==n.activeAgentId&&X().catch(()=>{})}async function re(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 v(),await C(),n.activeAgentId===e&&X().catch(()=>{})}async function x(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 v())}async function S(e,n){O(`checking`,t(`agentConfig.fetchingAgentInfo`));try{let r=await fetch(`${e}/api/status`,{cache:`no-cache`});if(!r.ok){O(`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=ce(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}`),O(`connected`,t.join(` | `),e)}else O(`disconnected`,t(`agentConfig.tokenExpired`))}catch{O(`disconnected`,t(`agentConfig.tokenExpired`))}}catch{O(`disconnected`,t(`agentConfig.cannotConnectAgent`))}}async function C(){let n=await chrome.storage.local.get([`pairedAgents`,`activeAgentId`]),r=n.pairedAgents||[],i=n.activeAgentId;if(!i||r.length===0){O(`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 S(a.url,a.token))}function ie(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 w(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 ae(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 T(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 oe(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=${D(String(e.pid))}`:``,a=E(e.duration);return[`<code>${D(r)}</code>`,i,D(a)].filter(Boolean).join(` · `)}).join(`<br>`)}function se(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">${D(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">${D(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">${D(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">${D(e.hostname)}</span></div>`),e.shell&&n.push(`<div class="detail-row"><span class="detail-label">Shell</span><span class="detail-value">${D(e.shell)}</span></div>`),e.homeDir&&n.push(`<div class="detail-row"><span class="detail-label">${t(`agentConfig.detailHomeDir`)}</span><span class="detail-value">${D(e.homeDir)}</span></div>`),e.nodeVersion&&n.push(`<div class="detail-row"><span class="detail-label">Node.js</span><span class="detail-value">${D(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">${oe(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">${ae(r.uptimeSeconds)}</span></div>`),n.push(`<div class="detail-row"><span class="detail-label">${t(`agentConfig.detailCpuUser`)}</span><span class="detail-value">${T(r.cpuUser)}</span></div>`),n.push(`<div class="detail-row"><span class="detail-label">${t(`agentConfig.detailCpuSystem`)}</span><span class="detail-value">${T(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">${w(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">${ie(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">${ie(e.fileMaxSize)}</span></div>`),e.allowedPaths&&e.allowedPaths.length>0){let r=e.allowedPaths.map(e=>`<code>${D(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 D(e){let t=document.createElement(`div`);return t.textContent=e,t.innerHTML}function O(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})),se(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 ce(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 le(){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}O(`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),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=ce(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}`),O(`connected`,r.join(` | `),e)}}catch{}await v(),chrome.runtime.sendMessage({type:`AGENT_CONNECTION_CHANGED`,connected:!0,agentId:o}).catch(()=>{})}else O(`disconnected`,t(`agentConfig.pairFailed`,{error:e.error||t(`agentConfig.unknownError`)})),U(e.error||t(`agentConfig.pairFailedShort`),`error`)}catch(e){O(`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}),O(`disconnected`,t(`agentConfig.notConnectedSelect`)),U(t(`agentConfig.disconnectedToast`),`info`),await v(),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`,le),n.addEventListener(`keydown`,e=>{e.key===`Enter`&&le()}),(async()=>{await v(),await C()})(),chrome.runtime.sendMessage({type:`OPTIONS_PAGE_OPEN`}).catch(()=>{}),chrome.runtime.onMessage.addListener(function(e,t,n){e.type===`AGENT_STATUS_CHANGE`&&(async()=>{await v(),await C(),X().catch(()=>{})})()}),window.addEventListener(`beforeunload`,()=>{chrome.runtime.sendMessage({type:`OPTIONS_PAGE_CLOSED`}).catch(()=>{})})}
|
|
720
|
-
//# sourceMappingURL=options-
|
|
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
|