ai-helper-agent 2.1.0 → 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +114 -2
- package/README.zh-CN.md +114 -2
- package/bin/agent.js +150 -0
- package/dist/assets/{agent-store-C4hZkQT5.js → agent-store-qLZ_Nmmz.js} +2 -2
- package/dist/assets/{agent-store-C4hZkQT5.js.map → agent-store-qLZ_Nmmz.js.map} +1 -1
- package/dist/assets/background.js +106 -113
- package/dist/assets/background.js.map +1 -1
- package/dist/assets/content.js +82 -80
- package/dist/assets/{i18n-CAh-vB_T.js → i18n-sOTxZemV.js} +7 -7
- package/dist/assets/i18n-sOTxZemV.js.map +1 -0
- package/dist/assets/model-profiles-DcTdflVP.js +25 -0
- package/dist/assets/model-profiles-DcTdflVP.js.map +1 -0
- package/dist/assets/options-B6ca-cwx.css +1 -0
- package/dist/assets/options.js +218 -197
- package/dist/assets/options.js.map +1 -1
- package/dist/assets/page-snapshot-renderer-C-4bo-cW.js +4 -0
- package/dist/assets/page-snapshot-renderer-C-4bo-cW.js.map +1 -0
- package/dist/assets/{session-store-uZ_LNasH.js → session-store-U8WKrdGX.js} +4 -4
- package/dist/assets/session-store-U8WKrdGX.js.map +1 -0
- package/dist/assets/side_panel.css +1 -1
- package/dist/assets/side_panel.js +344 -304
- package/dist/assets/side_panel.js.map +1 -1
- package/dist/assets/version-DzUoXKcK.js +2 -0
- package/dist/assets/version-DzUoXKcK.js.map +1 -0
- package/dist/manifest.json +7 -4
- package/dist/offscreen/offscreen.js +7 -7
- package/dist/options.html +111 -12
- package/dist/side_panel.html +29 -6
- package/package.json +1 -1
- package/src/config.js +72 -24
- package/src/crypto-lite.js +31 -0
- package/src/install-mode.js +128 -0
- package/src/locales/cli.json +24 -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/install.js +4 -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 +9 -1
- package/dist/assets/i18n-CAh-vB_T.js.map +0 -1
- package/dist/assets/model-profiles-CGxULM3O.js +0 -25
- package/dist/assets/model-profiles-CGxULM3O.js.map +0 -1
- package/dist/assets/options-Df_1Dtn8.css +0 -1
- package/dist/assets/session-store-uZ_LNasH.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-sOTxZemV.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 S,n as C,o as ee,p as w,r as T,s as te,t as E,u as D,v as ne,x as re}from"./model-profiles-DcTdflVP.js";import{t as ie}from"./version-DzUoXKcK.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-CAh
|
|
|
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 ae=[`deepseek-v4-pro`,`deepseek-v4-flash`],
|
|
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 ae=[`deepseek-v4-pro`,`deepseek-v4-flash`],O=[`https://api.deepseek.com`,`https://api.hunyuan.cloud.tencent.com/v1`,`https://dashscope.aliyuncs.com/compatible-mode/v1`,`https://qianfan.baidubce.com/v2`,`https://ark.cn-beijing.volces.com/api/v3`,`https://open.bigmodel.cn/api/paas/v4`,`https://api.moonshot.cn/v1`,`https://api.stepfun.com/v1`,`https://api.minimaxi.com/v1`,`https://spark-api-open.xf-yun.com/v1`,`https://api.baichuan-ai.com/v1`,`https://api.siliconflow.cn/v1`,`https://api.openai.com/v1`,`https://api.anthropic.com/v1`,`https://generativelanguage.googleapis.com/v1beta/openai`,`https://openrouter.ai/api/v1`,`https://api.groq.com/openai/v1`,`https://api.mistral.ai/v1`],k=f,oe=[{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}],A={"ai-search":`optionsConst.aiSearch`,explain:`optionsConst.explain`,translate:`optionsConst.translate`,summary:`optionsConst.summary`,copy:`optionsConst.copy`};function j(e){let n=A[e];return n?t(n):void 0}var se={"ai-search":`selToolbar.sysPromptAisearch`,explain:`selToolbar.sysPromptExplain`,translate:`selToolbar.sysPromptTranslate`,summary:`selToolbar.sysPromptSummary`,copy:`selToolbar.sysPromptCopy`};function M(e){let n=se[e];return n?t(n):void 0}function ce(){return t(`optionsConst.defaultSystemPrompt`)}var N={maxInputHistory:20,maxHistoryMessages:50,...d},P=[1e3,2e3,4e3,8e3,16e3,32e3,64e3,128e3,2e5,256e3,512e3,1e6],le=P.length-1;function ue(e){let t=Number(e)||0,n=0,r=1/0;for(let e=0;e<P.length;e++){let i=Math.abs(P[e]-t);i<r&&(r=i,n=e)}return n}function de(e){return P[Math.min(Math.max(Math.round(Number(e)||0),0),le)]}var F=null,I=null,L=null,R=null,z=null,fe=[],B=null;function pe(){F=document.createElement(`div`),F.className=`ctx-popover`,F.setAttribute(`role`,`dialog`),F.setAttribute(`aria-label`,t(`settings.ctxSliderIconTitle`)),F.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="${le}" 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 U(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 Xe(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)}Qe();return}T.includes(e)&&H.includes(e)&&(H=H.filter(t=>t!==e));let i=U(e,t,!T.includes(e));n.appendChild(i),Qe()}function Ze(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=``),Qe()}function Qe(){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 $e(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=U(e,null,!1);n.appendChild(t)}}),r.forEach(e=>{if(typeof e==`string`){if(!T.includes(e)){let t=U(e,null,!0);n.appendChild(t)}}else if(e&&e.url){let t=U(e.url,e.label||null,!0);n.appendChild(t)}}),typeof e==`function`&&e()})}function et(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 tt(){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(`toolReflectionEnabled`).checked=c.toolReflection?.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(`toolReflectionSection`,`toolReflectionEnabled`),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)}),$e(()=>{e.imageApiBase&&et(e.imageApiBase)})})}function nt(){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},toolReflection:{...d.toolReflection,enabled:document.getElementById(`toolReflectionEnabled`).checked},subtaskReflection:{...d.subtaskReflection,enabled:document.getElementById(`subtaskReflectionEnabled`).checked}};if(i<10||i>1e3){W(`❌ ${t(`settings.maxIterationsRangeError`)}`,`error`);return}if(a<6e4||a>6e5){W(`❌ ${t(`settings.apiTimeoutRangeError`)}`,`error`);return}if(o<6e4||o>72e5){W(`❌ ${t(`settings.loopTimeoutRangeError`)}`,`error`);return}if(s<6e4||s>18e5){W(`❌ ${t(`settings.toolTimeoutRangeError`)}`,`error`);return}if(e||=`https://api.deepseek.com`,!n){W(`❌ ${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)W(`❌ ${t(`settings.saveFailed`,{message:chrome.runtime.lastError.message})}`,`error`);else{w({apiBase:e,apiKey:n,modelName:R||`deepseek-v4-pro`,models:Ae()}),W(`✅ ${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 W(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 rt(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 it=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 it(`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 it(`request timeout`,{reason:`timeout`}):new it(e&&e.message||`network error`,{reason:`network`})}if(clearTimeout(s),!c.ok)throw new it(`HTTP ${c.status}`,{status:c.status,reason:`http`});let l;try{l=await c.json()}catch{throw new it(`invalid JSON`,{reason:`parse`})}let u=rt(l);if(!u.length)throw new it(`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
|
+
`,I=F.querySelector(`.ctx-popover-slider`),L=F.querySelector(`.ctx-popover-value`),R=F.querySelector(`.ctx-popover-auto-tag`),z=F.querySelector(`.ctx-popover-auto-btn`);let e=F.querySelector(`.ctx-popover-scale`);for(let t=0;t<P.length;t++){let t=document.createElement(`span`);t.className=`ctx-popover-scale-dot`,e.appendChild(t)}fe=[...e.children],F.querySelector(`.ctx-popover-scale-start`).textContent=x(P[0]),F.querySelector(`.ctx-popover-scale-end`).textContent=x(P[le]),z.textContent=t(`settings.ctxSliderResetAuto`),z.title=t(`settings.ctxSliderAutoTitle`),R.textContent=t(`settings.ctxSliderAuto`),I.addEventListener(`pointerdown`,()=>{if(!B)return;let e=parseInt(B.optionEl.dataset.contextWindow,10)||0;B.drag={originTokens:e,originIndex:ue(e||l(B.optionEl.dataset.value)),moved:!1}}),I.addEventListener(`input`,()=>{if(!B)return;B.drag&&(B.drag.moved=!0);let e=de(I.value);me(e,!1),B.callbacks.onPreview?.(e)}),I.addEventListener(`change`,()=>{B&&B.callbacks.onCommit?.(de(I.value))}),z.addEventListener(`click`,()=>{B&&(B.callbacks.onReset?.(),me(l(B.optionEl.dataset.value),!0))})}function me(e,t){let n=ue(e);I.value=String(n),L.textContent=x(e),L.classList.toggle(`is-auto`,t),R.style.display=t?``:`none`,z.style.display=t?`none`:``,fe.forEach((e,t)=>e.classList.toggle(`is-active`,t===n));let r=(n/le*100).toFixed(1)+`%`;I.style.setProperty(`--ctx-fill`,r)}function he(e){!e||!e.moved||!B||(B.callbacks.onPreview?.(e.originTokens),e.originTokens>0?me(e.originTokens,!1):me(l(B.optionEl.dataset.value),!0))}function ge(){let e=B.anchorBtn.getBoundingClientRect(),t=F.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)}F.style.left=`${Math.round(n)}px`,F.style.top=`${Math.round(r)}px`}function _e(e,t,n={}){if(!e||!t)return;if(B&&B.anchorBtn===e){V();return}V();let r=parseInt(t.dataset.contextWindow,10)||0;pe(),B={anchorBtn:e,optionEl:t,callbacks:n},F.querySelector(`.ctx-popover-title`).textContent=t.dataset.value||``,r>0?me(r,!1):me(l(t.dataset.value),!0),document.body.appendChild(F),ge(),I.focus({preventScroll:!0}),B.onDocClick=t=>{F.contains(t.target)||e.contains(t.target)||V()},B.onKeyDown=e=>{e.key===`Escape`&&V()},B.onScroll=()=>V(),B.onResize=()=>V(),B.onDocPointerUp=()=>{if(!B?.drag)return;let e=B.drag;if(B.drag=null,!e.moved)return;let t=Number(I.value);t===e.originIndex&&B.callbacks.onCommit?.(de(t))},B.onDocPointerCancel=()=>{if(!B?.drag)return;let e=B.drag;B.drag=null,he(e)},document.addEventListener(`click`,B.onDocClick,!0),document.addEventListener(`keydown`,B.onKeyDown),document.addEventListener(`scroll`,B.onScroll,!0),document.addEventListener(`pointerup`,B.onDocPointerUp,!0),document.addEventListener(`pointercancel`,B.onDocPointerCancel,!0),window.addEventListener(`resize`,B.onResize)}function V(){if(!B)return;let e=B;he(e.drag),B=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),F?.remove(),F=null,I=null,L=null,R=null,z=null,fe=[]}function ve(e){return!!(F&&e&&F.contains(e))}var ye=`deepseek-v4-pro`;function be(e){ye=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 H(){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 we(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 Te(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 Ee(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||=(Te(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(H());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(H(),e):r.appendChild(H())}we(i,n),Me()}return}Oe(r,De(e,n||0),e),Me()}function De(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(H());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),we(r,n||0),r}function Oe(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 ke(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 Ae(e){V();let t=document.getElementById(`modelDropdown`),n=t.querySelector(`.model-option[data-value="${e}"]`);if(n&&n.remove(),ye===e){let e=t.querySelector(`.model-option`),n=e?e.dataset.value:``;be(n);let r=document.getElementById(`modelInput`);r&&(r.value=n),Fe(n)}Me()}function je(){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 Me(){let e=je();chrome.storage.local.set({customModels:e},()=>{r.debug(`[Options] customModel list saved:`,e),p(e)})}function Ne(e){chrome.storage.local.get([`customModels`],t=>{Pe(S(t.customModels)),typeof e==`function`&&e()})}function Pe(e,t){let n=document.getElementById(`modelDropdown`);if(!n)return;V(),n.innerHTML=``;let r=[...e||[]].sort((e,t)=>b(e?.name,t?.name));for(let e of r)n.appendChild(De(e.name,e.contextWindow||0));let i=t===void 0?ye:t;n.querySelectorAll(`.model-option`).forEach(e=>{e.classList.toggle(`selected`,e.dataset.value===i)})}function Fe(e){document.querySelectorAll(`.model-option`).forEach(t=>{t.dataset.value===e?t.classList.add(`selected`):t.classList.remove(`selected`)}),Ie(`modelInput`,`modelSelectedCtxBadge`,`modelDropdown`)}function Ie(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 Le(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),we(e,n)}function Re(e,t){Le(e,t),Me(),Ie(`modelInput`,`modelSelectedCtxBadge`,`modelDropdown`)}function ze(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||=(Te(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(H());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(H(),e):t.appendChild(H())}we(i,n),Ve()}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(H());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),we(a,n||0),Oe(r,a,e),Ve()}function Be(e){V();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),We(n)}Ve()}function Ve(){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 He(e,t){Le(e,t),Ve(),Ie(`imageModelInput`,`imageModelSelectedCtxBadge`,`imageModelDropdown`)}function Ue(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;V(),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(H());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),we(a,r||0),i.appendChild(a)}),o&&(Ve(),r.debug(`[Options] image recognitionmodelauto-migratedisnewformat`)),typeof e==`function`&&e()})}function We(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`)}),Ie(`imageModelInput`,`imageModelSelectedCtxBadge`,`imageModelDropdown`))}var U=[];function Ge(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 Ke(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)}Je();return}O.includes(e)&&U.includes(e)&&(U=U.filter(t=>t!==e));let i=Ge(e,t,!O.includes(e));n.appendChild(i),Je()}function qe(e){let t=document.getElementById(`apiBaseDropdown`);if(!t)return;let n=t.querySelector(`.model-option[data-value="${CSS.escape(e)}"]`);n&&n.remove(),O.includes(e)&&!U.includes(e)&&U.push(e);let r=document.getElementById(`apiBase`);r&&r.value.trim()===e&&(r.value=``),Je()}function Je(){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:U},()=>{r.debug(`[Options] API Base URL column table saved:`,t,`deletedpreset:`,U)})}function Ye(e){chrome.storage.local.get([`customApiBases`,`deletedPresetApiBases`],t=>{let n=document.getElementById(`apiBaseDropdown`);if(!n){typeof e==`function`&&e();return}U=t.deletedPresetApiBases||[];let r=t.customApiBases||[];n.innerHTML=``,O.forEach(e=>{if(!U.includes(e)){let t=Ge(e,null,!1);n.appendChild(t)}}),r.forEach(e=>{if(typeof e==`string`){if(!O.includes(e)){let t=Ge(e,null,!0);n.appendChild(t)}}else if(e&&e.url){let t=Ge(e.url,e.label||null,!0);n.appendChild(t)}}),typeof e==`function`&&e()})}function Xe(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 W=[];function Ze(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 Qe(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)}et();return}O.includes(e)&&W.includes(e)&&(W=W.filter(t=>t!==e));let i=Ze(e,t,!O.includes(e));n.appendChild(i),et()}function $e(e){let t=document.getElementById(`imageApiBaseDropdown`);if(!t)return;let n=t.querySelector(`.model-option[data-value="${CSS.escape(e)}"]`);n&&n.remove(),O.includes(e)&&!W.includes(e)&&W.push(e);let r=document.getElementById(`imageApiBase`);r&&r.value.trim()===e&&(r.value=``),et()}function et(){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:W},()=>{r.debug(`[Options] image API Base URL column table saved:`,t)})}function tt(e){chrome.storage.local.get([`customImageApiBases`,`deletedPresetImageApiBases`],t=>{let n=document.getElementById(`imageApiBaseDropdown`);if(!n){typeof e==`function`&&e();return}W=t.deletedPresetImageApiBases||[];let r=t.customImageApiBases||[];n.innerHTML=``,O.forEach(e=>{if(!W.includes(e)){let t=Ze(e,null,!1);n.appendChild(t)}}),r.forEach(e=>{if(typeof e==`string`){if(!O.includes(e)){let t=Ze(e,null,!0);n.appendChild(t)}}else if(e&&e.url){let t=Ze(e.url,e.label||null,!0);n.appendChild(t)}}),typeof e==`function`&&e()})}function nt(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 rt(){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&&(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=h(e.imageApiKey)),document.getElementById(`reactMaxIterations`).value=e.reactMaxIterations||k.maxIterations,document.getElementById(`reactApiTimeout`).value=Math.round((e.reactApiTimeout||k.apiTimeout)/6e4),document.getElementById(`reactLoopTimeout`).value=Math.round((e.reactLoopTimeout||k.loopTimeout)/6e4),document.getElementById(`reactToolTimeout`).value=Math.round((e.reactToolTimeout||k.toolTimeout)/6e4);let o=document.getElementById(`enableToolPreselect`);o&&(o.checked=e.enableToolPreselect===void 0?k.enableToolPreselect:e.enableToolPreselect,o.dispatchEvent(new Event(`change`)));let s=document.getElementById(`preselectMinToolCount`);s&&(s.value=e.preselectMinToolCount===void 0?k.preselectMinToolCount:e.preselectMinToolCount),document.getElementById(`toolConfirmationEnabled`).checked=e.toolConfirmationEnabled===void 0?k.toolConfirmationEnabled:e.toolConfirmationEnabled,document.getElementById(`toolConfirmationEnabled`).dispatchEvent(new Event(`change`)),document.getElementById(`enableExecutionLog`).checked=e.enableExecutionLog===void 0?N.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`,S=document.querySelectorAll(`input[name="sidePanelScope"]`);S.forEach(e=>{e.checked=e.value===x}),S.forEach(e=>{e.dataset.scopeListenerBound||(e.dataset.scopeListenerBound=`1`,e.addEventListener(`change`,()=>{e.checked&&(chrome.storage.local.set({sidePanelScope:e.value}),ee())}))});let C=document.getElementById(`autoGroupTabs`);C&&(C.checked=e.autoGroupTabs!==!1);function ee(){if(!C)return;let e=document.querySelector(`input[name="sidePanelScope"]:checked`)?.value||`global`;C.disabled=e!==`tab-specific`}ee(),C&&!C.dataset.groupListenerBound&&(C.dataset.groupListenerBound=`1`,C.addEventListener(`change`,()=>{chrome.storage.local.set({autoGroupTabs:C.checked})})),Ne(()=>{e.modelName&&Fe(e.modelName),p()}),Ue(()=>{e.imageModelName&&We(e.imageModelName)}),Ye(()=>{e.apiBase&&Xe(e.apiBase)}),tt(()=>{e.imageApiBase&&nt(e.imageApiBase)})})}function it(){let e=document.getElementById(`apiBase`).value.trim(),n=document.getElementById(`apiKey`).value.trim(),r=document.getElementById(`systemPrompt`).value.trim(),i=parseInt(document.getElementById(`reactMaxIterations`).value)||k.maxIterations,a=(parseInt(document.getElementById(`reactApiTimeout`).value)||5)*6e4,o=(parseInt(document.getElementById(`reactLoopTimeout`).value)||5)*6e4,s=(parseInt(document.getElementById(`reactToolTimeout`).value)||5)*6e4,c=document.getElementById(`toolConfirmationEnabled`).checked,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=xe||``,x=document.getElementById(`imageApiBase`)?.value.trim()||``,S=document.getElementById(`imageApiKey`)?.value.trim()||``,C={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){G(`❌ ${t(`settings.maxIterationsRangeError`)}`,`error`);return}if(a<6e4||a>6e5){G(`❌ ${t(`settings.apiTimeoutRangeError`)}`,`error`);return}if(o<6e4||o>72e5){G(`❌ ${t(`settings.loopTimeoutRangeError`)}`,`error`);return}if(s<6e4||s>18e5){G(`❌ ${t(`settings.toolTimeoutRangeError`)}`,`error`);return}if(e||=`https://api.deepseek.com`,!n){G(`❌ ${t(`settings.apiKeyEmpty`)}`,`error`);return}chrome.storage.local.set({apiBase:e,apiKey:re(n),modelName:ye||`deepseek-v4-pro`,systemPrompt:r,reactMaxIterations:i,reactApiTimeout:a,reactLoopTimeout:o,reactToolTimeout:s,toolConfirmationEnabled:c,enableExecutionLog:l,enableImageInput:y,imageModelName:b,imageApiBase:x,imageApiKey:re(S),reflectionConfig:C,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)G(`❌ ${t(`settings.saveFailed`,{message:chrome.runtime.lastError.message})}`,`error`);else{ne({apiBase:e,apiKey:n,modelName:ye||`deepseek-v4-pro`,models:je()}),G(`✅ ${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 G(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 at(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 ot=class extends Error{constructor(e,{status:t,reason:n}={}){super(e),this.name=`FetchModelsError`,this.status=t,this.reason=n}};function st(e){return`${String(e).trim().replace(/\/+$/,``)}/models`}function ct(e){return/anthropic\.com/i.test(String(e||``))}async function lt({apiBase:e,apiKey:t,timeoutMs:n=15e3}={}){let r=(e||``).trim(),i=(t||``).trim();if(!r||!i)throw new ot(`missing apiBase or apiKey`,{reason:`invalid-config`});let a={Authorization:`Bearer ${i}`};ct(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(st(r),{method:`GET`,headers:a,signal:o.signal})}catch(e){throw clearTimeout(s),e&&e.name===`AbortError`?new ot(`request timeout`,{reason:`timeout`}):new ot(e&&e.message||`network error`,{reason:`network`})}if(clearTimeout(s),!c.ok)throw new ot(`HTTP ${c.status}`,{status:c.status,reason:`http`});let l;try{l=await c.json()}catch{throw new ot(`invalid JSON`,{reason:`parse`})}let u=at(l);if(!u.length)throw new ot(`no models parsed`,{reason:`parse`});return u}var ut=-1;function dt(){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=j(e.id),n=M(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 ft(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&&j(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="${bt(e.systemPrompt)}">${bt(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">${bt(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(``),pt()}function pt(){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:[...oe],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},()=>{ft(s)})}),e.classList.remove(`drag-over`))})})}function mt(){let e=document.getElementById(`toolbarIconOnly`)?.checked||!1,t=document.getElementById(`enableSelectionToolbar`)?.checked!==!1;chrome.storage.local.get([`toolbarTools`],n=>{let i=n.toolbarTools||[...oe];chrome.storage.local.set({toolbarTools:i,toolbarIconOnly:e,enableSelectionToolbar:t},()=>{r.debug(`[Options] toolbarconfiguration saved`)})})}function ht(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 gt(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 _t(e,n=-1){ut=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 vt(){document.getElementById(`toolEditModal`).style.display=`none`,ut=-1}function yt(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(ut>=0){let e=i.filter(e=>e.id!==`ai-search`&&e.id!==`copy`)[ut];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 vt(),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 bt(e){let t=document.createElement(`div`);return t.textContent=e,t.innerHTML}function xt(){chrome.storage.local.get([`blockedDomains`],e=>{St(e.blockedDomains||[])})}function St(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="${bt(e)}">${bt(e)}</span>
|
|
46
|
+
<button class="domain-blocklist-item-remove" data-domain="${bt(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`];async function wt(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)),n(i)})})}async function Tt(){let e=document.getElementById(`exportIncludeSecrets`)?.checked||!1;try{let n=await wt(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),Dt(),Ft(t(`configDialog.exportSuccess`),`success`)}catch(e){r.error(`[Options] exportconfiguration failed:`,e),Ft(t(`configDialog.exportFailed`,{error:e.message}),`error`)}}function Et(){let e=document.getElementById(`exportConfigModal`);e&&(e.style.display=`flex`)}function Dt(){let e=document.getElementById(`exportConfigModal`);e&&(e.style.display=`none`)}function Ot(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 kt(){let e=document.getElementById(`importConfigModal`);e&&(e.style.display=`none`)}function At(){let e=document.getElementById(`importConfigFile`);e&&(e.value=``,e.click())}function jt(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 Mt(e){try{let n=await e.text(),r=JSON.parse(n),i=jt(r);if(!i.valid){Ft(t(`configDialog.importFailed`,{error:i.error}),`error`);return}Ot(r)}catch(e){r.error(`[Options] import fileparse failed:`,e),Ft(t(`configDialog.importParseFailed`),`error`)}}async function Nt(){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((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)})}kt(),Ft(t(`configDialog.importedCount`,{count:Object.keys(r).length}),`success`),setTimeout(()=>{tt(()=>{lt().then(()=>{typeof updateToolbarUI==`function`&&updateToolbarUI()}),vt()})},300)}catch(e){r.error(`[Options] importconfiguration failed:`,e),Ft(t(`configDialog.importFailed`,{error:e.message}),`error`)}}function Pt(){let e=document.getElementById(`exportConfigCloseBtn`),t=document.getElementById(`exportConfigCancelBtn`),n=document.getElementById(`exportConfigOkBtn`),r=document.getElementById(`exportConfigModal`);e&&e.addEventListener(`click`,Dt),t&&t.addEventListener(`click`,Dt),n&&n.addEventListener(`click`,Tt),r&&r.addEventListener(`click`,e=>{e.target===r&&Dt()});let i=document.getElementById(`importConfigCloseBtn`),a=document.getElementById(`importConfigCancelBtn`),o=document.getElementById(`importConfigOkBtn`),s=document.getElementById(`importConfigModal`);i&&i.addEventListener(`click`,kt),a&&a.addEventListener(`click`,kt),o&&o.addEventListener(`click`,Nt),s&&s.addEventListener(`click`,e=>{e.target===s&&kt()})}function Ft(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 It=null,Lt=null;async function Rt(){Bt(),Vt(),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:``,zt(r)}function zt(e){let n=document.getElementById(`profileScopeHint`);n&&(n.textContent=e?t(`settings.profileScopeHint`,{name:e.name}):``)}function Bt(){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`),Ht(n.dataset.value))}),document.addEventListener(`click`,n=>{!t.contains(n.target)&&n.target!==e&&t.classList.remove(`show`)}),document.getElementById(`profileNewBtn`)?.addEventListener(`click`,Ut),document.getElementById(`profileDupBtn`)?.addEventListener(`click`,Wt),document.getElementById(`profileRenameBtn`)?.addEventListener(`click`,Gt),document.getElementById(`profileDeleteBtn`)?.addEventListener(`click`,Kt),Yt())}function Vt(){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&&Jt(t),K()}})}async function Ht(e){if(e===(await g()).activeProfileId)return;let n=await x(e);n&&(Jt(n),await K(),W(`✅ ${t(`settings.profileSwitched`,{name:n.name})}`,`success`))}async function Ut(){let e=S(qt())||``,n=await Xt({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});Jt(r),await K(),W(`✅ ${t(`settings.profileCreated`,{name:r.name})}`,`success`)}async function Wt(){let e=await g(),n=e.profiles.find(t=>t.id===e.activeProfileId)||e.profiles[0];if(!n)return;let r=await Xt({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:qt(),apiKey:document.getElementById(`apiKey`)?.value.trim()||``,modelName:i?.value||R||`deepseek-v4-pro`,models:Ae()},{activate:!0});Jt(a),await K(),W(`✅ ${t(`settings.profileCreated`,{name:a.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 Xt({mode:`name`,title:t(`settings.renameProfile`),defaultValue:n.name});!r||r===n.name||(await v(n.id,r),await K(),W(`✅ ${t(`settings.profileRenamed`,{name:r})}`,`success`))}async function Kt(){let e=await g(),n=e.profiles.find(t=>t.id===e.activeProfileId)||e.profiles[0];if(!n)return;if(e.profiles.length<=1){W(`⚠️ ${t(`settings.atLeastOneProfile`)}`,`error`);return}if(!await Xt({mode:`confirm`,title:t(`settings.deleteProfile`),message:t(`settings.deleteProfileConfirm`,{name:n.name})}))return;let r=await b(n.id);if(!r.deleted){W(`⚠️ ${t(`settings.atLeastOneProfile`)}`,`error`);return}r.nextActive&&Jt(r.nextActive),await K(),W(`🗑️ ${t(`settings.profileDeleted`,{name:n.name})}`,`success`)}function qt(){return document.getElementById(`apiBase`)?.value.trim()||`https://api.deepseek.com`}function Jt(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 Yt(){let e=document.getElementById(`profileModal`);!e||e.dataset.bound||(e.dataset.bound=`1`,document.getElementById(`profileModalOkBtn`)?.addEventListener(`click`,Zt),document.getElementById(`profileModalCancelBtn`)?.addEventListener(`click`,()=>Qt(null)),document.getElementById(`profileModalCloseBtn`)?.addEventListener(`click`,()=>Qt(null)),e.addEventListener(`click`,t=>{t.target===e&&Qt(null)}),document.getElementById(`profileNameInput`)?.addEventListener(`keydown`,e=>{e.key===`Enter`&&Zt(),e.key===`Escape`&&Qt(null)}))}function Xt({mode:e,title:t,message:n=``,defaultValue:r=``}){let i=document.getElementById(`profileModal`);if(!i)return Promise.resolve(null);It=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=>{Lt=e})}function Zt(){if(Lt){if(It===`name`){let e=document.getElementById(`profileNameInput`).value.trim();if(!e){W(`❌ ${t(`settings.profileNameRequired`)}`,`error`);return}Qt(e)}else Qt(!0)}}function Qt(e){let t=document.getElementById(`profileModal`);t&&(t.style.display=`none`),It=null;let n=Lt;Lt=null,n&&n(e)}var q={agentBaseUrl:null,agentToken:null,agentConnected:!1,agentName:null,agentId:null,cachedMcpServers:[],cachedSkills:[],editingMcpId:null,refreshCallback:null};async function $t(){typeof q.refreshCallback==`function`&&await q.refreshCallback()}function en(e,n=t(`customConfirm.defaultTitle`)){return new Promise(r=>{let i=document.createElement(`div`);i.className=`modal-overlay`,i.innerHTML=`
|
|
50
|
+
`).join(``))}function Ct(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},()=>{St(i),n&&n({})})})}function wt(e){chrome.storage.local.get([`blockedDomains`],t=>{let n=(t.blockedDomains||[]).filter(t=>t!==e);chrome.storage.local.set({blockedDomains:n},()=>{St(n)})})}var Tt=`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(`.`),Et=[`apiKey`,`imageApiKey`,`agentToken`];function Dt(e){for(let t of[`apiKey`,`imageApiKey`])e[t]&&(e[t]=re(h(e[t])));Array.isArray(e.modelProfiles)&&(e.modelProfiles=e.modelProfiles.map(e=>e.apiKey?{...e,apiKey:re(h(e.apiKey))}:e)),Array.isArray(e.pairedAgents)&&(e.pairedAgents=e.pairedAgents.map(e=>e.token?{...e,token:re(h(e.token))}:e))}function Ot(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 kt(e){let t=e?[...Tt,...Et]:Tt;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)),Ot(i),n(i)})})}async function At(){let e=document.getElementById(`exportIncludeSecrets`)?.checked||!1;try{let n=await kt(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),Mt(),Bt(t(`configDialog.exportSuccess`),`success`)}catch(e){r.error(`[Options] exportconfiguration failed:`,e),Bt(t(`configDialog.exportFailed`,{error:e.message}),`error`)}}function jt(){let e=document.getElementById(`exportConfigModal`);e&&(e.style.display=`flex`)}function Mt(){let e=document.getElementById(`exportConfigModal`);e&&(e.style.display=`none`)}function Nt(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 Pt(){let e=document.getElementById(`importConfigModal`);e&&(e.style.display=`none`)}function Ft(){let e=document.getElementById(`importConfigFile`);e&&(e.value=``,e.click())}function It(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(!Tt.includes(e)&&!Et.includes(e)&&!e.startsWith(`agentEnabledTools_`)&&!e.startsWith(`agentMcpClosedServers_`))return{valid:!1,error:t(`configDialog.unknownConfigKey`,{key:e})};return{valid:!0}}async function Lt(e){try{let n=await e.text(),r=JSON.parse(n),i=It(r);if(!i.valid){Bt(t(`configDialog.importFailed`,{error:i.error}),`error`);return}Nt(r)}catch(e){r.error(`[Options] import fileparse failed:`,e),Bt(t(`configDialog.importParseFailed`),`error`)}}async function Rt(){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(Ot(r),(document.getElementById(`importStrategyReplace`)?.checked?`replace`:`merge`)==`merge`&&Array.isArray(r.modelProfiles)){let e=await _();r.modelProfiles=w(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=S(n.models))}if(Dt(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 ne({apiBase:e.apiBase||`https://api.deepseek.com`,apiKey:h(e.apiKey)||``,modelName:e.modelName||`deepseek-v4-pro`,models:S(e.customModels)})}Pt(),Bt(t(`configDialog.importedCount`,{count:Object.keys(r).length}),`success`),setTimeout(()=>{rt(()=>{dt().then(()=>{typeof updateToolbarUI==`function`&&updateToolbarUI()}),xt()})},300)}catch(e){r.error(`[Options] importconfiguration failed:`,e),Bt(t(`configDialog.importFailed`,{error:e.message}),`error`)}}function zt(){let e=document.getElementById(`exportConfigCloseBtn`),t=document.getElementById(`exportConfigCancelBtn`),n=document.getElementById(`exportConfigOkBtn`),r=document.getElementById(`exportConfigModal`);e&&e.addEventListener(`click`,Mt),t&&t.addEventListener(`click`,Mt),n&&n.addEventListener(`click`,At),r&&r.addEventListener(`click`,e=>{e.target===r&&Mt()});let i=document.getElementById(`importConfigCloseBtn`),a=document.getElementById(`importConfigCancelBtn`),o=document.getElementById(`importConfigOkBtn`),s=document.getElementById(`importConfigModal`);i&&i.addEventListener(`click`,Pt),a&&a.addEventListener(`click`,Pt),o&&o.addEventListener(`click`,Rt),s&&s.addEventListener(`click`,e=>{e.target===s&&Pt()})}function Bt(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 Vt=null,Ht=null;async function Ut(){Kt(),qt(),s(()=>{Wt()}),await Wt()}async function Wt(){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=D(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:``,Gt(r)}function Gt(e){let n=document.getElementById(`profileScopeHint`);n&&(n.textContent=e?t(`settings.profileScopeHint`,{name:e.name}):``)}function Kt(){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`),Jt(n.dataset.value))}),document.addEventListener(`click`,n=>{!t.contains(n.target)&&n.target!==e&&t.classList.remove(`show`)}),document.getElementById(`profileNewBtn`)?.addEventListener(`click`,Yt),document.getElementById(`profileDupBtn`)?.addEventListener(`click`,Xt),document.getElementById(`profileRenameBtn`)?.addEventListener(`click`,Zt),document.getElementById(`profileDeleteBtn`)?.addEventListener(`click`,Qt),tn())}function qt(){chrome.storage.onChanged.addListener(async(e,t)=>{if(t===`local`&&(e.modelProfiles&&Wt(),e.activeProfileId)){let e=await _(),t=e.profiles.find(t=>t.id===e.activeProfileId);t&&en(t),Wt()}})}async function Jt(e){if(e===(await _()).activeProfileId)return;let n=await T(e);n&&(en(n),await Wt(),G(`✅ ${t(`settings.profileSwitched`,{name:n.name})}`,`success`))}async function Yt(){let e=te($t())||``,n=await nn({mode:`name`,title:t(`settings.profileNameTitle`),defaultValue:e});if(!n)return;let r=await m({name:n,apiBase:E,apiKey:``,modelName:C,models:[]},{activate:!0});en(r),await Wt(),G(`✅ ${t(`settings.profileCreated`,{name:r.name})}`,`success`)}async function Xt(){let e=await _(),n=e.profiles.find(t=>t.id===e.activeProfileId)||e.profiles[0];if(!n)return;let r=await nn({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:$t(),apiKey:document.getElementById(`apiKey`)?.value.trim()||``,modelName:i?.value||ye||`deepseek-v4-pro`,models:je()},{activate:!0});en(a),await Wt(),G(`✅ ${t(`settings.profileCreated`,{name:a.name})}`,`success`)}async function Zt(){let e=await _(),n=e.profiles.find(t=>t.id===e.activeProfileId)||e.profiles[0];if(!n)return;let r=await nn({mode:`name`,title:t(`settings.renameProfile`),defaultValue:n.name});!r||r===n.name||(await y(n.id,r),await Wt(),G(`✅ ${t(`settings.profileRenamed`,{name:r})}`,`success`))}async function Qt(){let e=await _(),n=e.profiles.find(t=>t.id===e.activeProfileId)||e.profiles[0];if(!n)return;if(e.profiles.length<=1){G(`⚠️ ${t(`settings.atLeastOneProfile`)}`,`error`);return}if(!await nn({mode:`confirm`,title:t(`settings.deleteProfile`),message:t(`settings.deleteProfileConfirm`,{name:n.name})}))return;let r=await ee(n.id);if(!r.deleted){G(`⚠️ ${t(`settings.atLeastOneProfile`)}`,`error`);return}r.nextActive&&en(r.nextActive),await Wt(),G(`🗑️ ${t(`settings.profileDeleted`,{name:n.name})}`,`success`)}function $t(){return document.getElementById(`apiBase`)?.value.trim()||`https://api.deepseek.com`}function en(e){let t=e.apiBase||`https://api.deepseek.com`,n=e.modelName||`deepseek-v4-pro`,r=document.getElementById(`apiBase`);r&&(r.value=t),Xe(t);let i=document.getElementById(`apiKey`);i&&(i.value=e.apiKey||``),be(n);let a=document.getElementById(`modelInput`);a&&(a.value=n),Pe(e.models||[],n),Ie(`modelInput`,`modelSelectedCtxBadge`,`modelDropdown`)}function tn(){let e=document.getElementById(`profileModal`);!e||e.dataset.bound||(e.dataset.bound=`1`,document.getElementById(`profileModalOkBtn`)?.addEventListener(`click`,rn),document.getElementById(`profileModalCancelBtn`)?.addEventListener(`click`,()=>an(null)),document.getElementById(`profileModalCloseBtn`)?.addEventListener(`click`,()=>an(null)),e.addEventListener(`click`,t=>{t.target===e&&an(null)}),document.getElementById(`profileNameInput`)?.addEventListener(`keydown`,e=>{e.key===`Enter`&&rn(),e.key===`Escape`&&an(null)}))}function nn({mode:e,title:t,message:n=``,defaultValue:r=``}){let i=document.getElementById(`profileModal`);if(!i)return Promise.resolve(null);Vt=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=>{Ht=e})}function rn(){if(Ht){if(Vt===`name`){let e=document.getElementById(`profileNameInput`).value.trim();if(!e){G(`❌ ${t(`settings.profileNameRequired`)}`,`error`);return}an(e)}else an(!0)}}function an(e){let t=document.getElementById(`profileModal`);t&&(t.style.display=`none`),Vt=null;let n=Ht;Ht=null,n&&n(e)}var K={agentBaseUrl:null,agentToken:null,agentConnected:!1,agentName:null,agentId:null,cachedMcpServers:[],cachedSkills:[],editingMcpId:null,refreshCallback:null};async function on(){typeof K.refreshCallback==`function`&&await K.refreshCallback()}function sn(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>${J(n)}</h3>
|
|
54
54
|
</div>
|
|
55
55
|
<div class="modal-body">
|
|
56
|
-
<p>${
|
|
56
|
+
<p>${J(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 cn(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="${J(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="${J(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="${J(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;">${J(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">📄 ${J(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 ln(){let e=await chrome.storage.local.get([`pairedAgents`,`activeAgentId`]),t=(e.pairedAgents||[]).find(t=>t.id===e.activeAgentId);return K.agentBaseUrl=t?.url||null,K.agentToken=t?.token||null,K.agentConnected=!!t,K.agentName=t?.name||null,K.agentId=t?.id||null,{url:K.agentBaseUrl,token:K.agentToken,connected:K.agentConnected,agentName:K.agentName,agentId:K.agentId}}async function q(e,t,n=null){let r={method:e,headers:{"Content-Type":`application/json`,Authorization:`Bearer ${K.agentToken}`}};n&&(r.body=JSON.stringify(n));let i=await fetch(`${K.agentBaseUrl}${t}`,r),a=await i.json();return a&&typeof a==`object`&&!Array.isArray(a)&&(a.httpStatus=i.status),a}function J(e){return e?String(e).replace(/&/g,`&`).replace(/</g,`<`).replace(/>/g,`>`).replace(/"/g,`"`).replace(/'/g,`'`):``}var un=``,dn=`all`;async function fn(){if(await ln(),!K.agentConnected)return{servers:[]};try{return await q(`GET`,`/api/mcp/servers`)}catch{return{servers:[]}}}function pn(e){let n=document.getElementById(`mcpServerList`);if(!n)return;if(K.cachedMcpServers=e||[],!K.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(dn===`enabled`&&e.enabled===!1||dn===`disabled`&&e.enabled!==!1)return!1;if(un){let t=un.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===K.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="${J(e.id)}" placeholder="${t(`toolbox.mcpIdPlaceholder`)}" class="toolbox-input">
|
|
115
|
+
<input type="text" id="mcpEditName" value="${J(e.name||``)}" placeholder="${t(`toolbox.mcpNamePlaceholder`)}" class="toolbox-input">
|
|
116
116
|
</div>
|
|
117
|
-
${
|
|
118
|
-
${
|
|
117
|
+
${bn(`mcpEdit`,n)}
|
|
118
|
+
${xn(`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
|
+
${mn(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
|
+
${vn(`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="${J(e.id)}" data-action="cancel-edit">${t(`common.cancel`)}</button>
|
|
132
|
+
<button class="toolbox-btn toolbox-btn-primary" data-mcp-id="${J(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">${J(e.name||e.id)}</span>
|
|
141
|
+
<span class="mcp-server-badge">${J(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="${J(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>${J(Sn(e))}</code>
|
|
153
153
|
</div>
|
|
154
|
-
${
|
|
154
|
+
${Cn(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="${J(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-${J(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">${J(e.name)}</div>
|
|
164
|
+
<div class="mcp-tool-desc">${J(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="${J(e.id)}" data-action="disconnect">${t(`toolbox.mcpDisconnectBtn`)}</button>`:`<button class="toolbox-btn toolbox-btn-primary" data-mcp-id="${J(e.id)}" data-action="connect">${t(`toolbox.mcpConnectBtn`)}</button>`}
|
|
171
|
+
<button class="toolbox-btn toolbox-btn-edit" data-mcp-id="${J(e.id)}" data-action="edit">${t(`common.edit`)}</button>
|
|
172
|
+
<button class="toolbox-btn toolbox-btn-danger" data-mcp-id="${J(e.id)}" data-action="delete">${t(`common.delete`)}</button>
|
|
173
173
|
</div>
|
|
174
174
|
</div>
|
|
175
|
-
</div>`}).join(``)}function
|
|
175
|
+
</div>`}).join(``)}function mn(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="${J(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="${J(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 hn(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 gn(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="${J(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="${J(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 _n(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 vn(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
|
+
${gn(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 yn(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 bn(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 xn(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="${J(i)}" placeholder="${t(`toolbox.mcpCommandPlaceholder`)}" class="toolbox-input" style="flex: 2;">
|
|
250
|
+
<input type="text" id="${e}Args" value="${J(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="${J(r)}" placeholder="http://localhost:3000/mcp" class="toolbox-input" style="flex: 1;">
|
|
254
|
+
</div>`}function Sn(e){let t=e.transport||`stdio`;return t===`stdio`||!t?`${e.command||``} ${(e.args||[]).join(` `)}`:e.url||``}function Cn(e){let n=Object.keys(e.headers||{}).length;return n>0?`<div class="mcp-server-meta">${t(`toolbox.mcpCustomHeadersCount`,{count:n})}</div>`:``}function wn(e){return document.querySelector(`#${e}TransportGroup .mcp-transport-btn.active`)?.dataset.value||`stdio`}function Tn(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 En(){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
|
+
${bn(`mcpAdd`)}
|
|
261
|
+
${xn(`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
|
+
${mn()}
|
|
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
|
+
${vn(`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 Dn(){let e=document.getElementById(`mcpAddForm`);e&&(e.innerHTML=``)}async function On(e){try{let n=await q(`POST`,`/api/mcp/servers`,e);if(n.success)return!0;throw Error(n.error||t(`toolbox.mcpAddFailedShort`))}catch(e){throw e}}async function kn(e){try{let n=await q(`DELETE`,`/api/mcp/servers`,{id:e});if(n.success)return!0;throw Error(n.error||t(`toolbox.mcpDeleteFailedShort`))}catch(e){throw e}}async function An(e){let n=await q(`POST`,`/api/mcp/servers/connect`,{id:e});if(n.success)return n;throw Error(n.error||t(`toolbox.mcpConnectFailedShort`))}async function jn(e){let n=await q(`POST`,`/api/mcp/servers/disconnect`,{id:e});if(n.success)return!0;throw Error(n.error||t(`toolbox.mcpDisconnectFailedShort`))}async function Mn(e,n){let r=await q(`PUT`,`/api/mcp/servers/toggle`,{id:e,enabled:n});if(r.success)return!0;throw Error(r.error||t(`toolbox.mcpOperationFailedShort`))}function Nn(){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(()=>{un=e.value.trim(),pn(K.cachedMcpServers)},200)})}let n=document.getElementById(`mcpSearchClear`);n&&n.addEventListener(`click`,()=>{e.value=``,un=``,pn(K.cachedMcpServers),e.focus()}),t.forEach(e=>{e.addEventListener(`click`,()=>{t.forEach(e=>e.classList.remove(`active`)),e.classList.add(`active`),dn=e.dataset.filter,pn(K.cachedMcpServers)})})}var Pn=``,Fn=`all`;async function In(){if(await ln(),!K.agentConnected)return{skills:[]};try{return await q(`GET`,`/api/skill/list`)}catch{return{skills:[]}}}function Ln(e){let n=document.getElementById(`skillList`);if(!n)return;if(K.cachedSkills=e||[],!K.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(Fn===`enabled`&&e.enabled===!1||Fn===`disabled`&&e.enabled!==!1)return!1;if(Pn){let t=Pn.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">${J(e.name)}</span>
|
|
297
|
+
<span class="skill-card-version">v${J(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">${J(n.content)}</div>
|
|
305
|
+
${n.truncated&&e.enabled!==!1?`<button class="skill-expand-btn" data-skill-name="${J(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
|
+
${Rn(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="${J(e.name)}" data-action="run-skill">${t(`toolbox.run`)}</button>`}
|
|
312
|
+
<button class="toolbox-btn toolbox-btn-secondary" data-skill-name="${J(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="${J(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">${J(e.name)}</span>
|
|
323
|
+
<span class="skill-card-version">v${J(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">${J(a.content)}</div>
|
|
332
|
+
${a.truncated&&e.enabled!==!1?`<button class="skill-expand-btn" data-skill-name="${J(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})}">📄 ${J(e.name)}</span>`).join(``):e.resources.slice(0,5).map(e=>`<span class="skill-param-tag" title="${t(`toolbox.sizeBytes`,{size:e.size})}">📄 ${J(e.name)}</span>`).join(``)+`<button class="skill-expand-btn skill-expand-resources" data-skill-name="${J(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="${J(e.name)}" data-action="edit-agent-skill">${t(`toolbox.editSkillMd`)}</button>`:`<button class="toolbox-btn toolbox-btn-secondary" data-skill-name="${J(e.name)}" data-action="view-agent-skill">${t(`toolbox.viewDetails`)}</button>`}
|
|
339
|
+
<button class="toolbox-btn toolbox-btn-secondary" data-skill-name="${J(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="${J(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 Rn(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="${J(t.description||``)}">${J(e)}${r?`*`:``}</span>`}).join(``)}async function zn(e){let n=await q(`POST`,`/api/skill/import`,e);if(n.success)return!0;throw Error(n.error||t(`toolbox.skillImportFailedShort`))}async function Bn(e){let n=await q(`DELETE`,`/api/skill/delete`,{name:e});if(n.success)return!0;throw Error(n.error||t(`toolbox.skillDeleteFailedShort`))}async function Vn(e){let n=await q(`POST`,`/api/skill/toggle`,{name:e});if(n.success)return n.enabled!==!1;throw Error(n.error||t(`toolbox.skillOperationFailedShort`))}async function Hn(e,t={}){return await q(`POST`,`/api/skill/run`,{name:e,params:t})}function Un(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 Wn(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}">${J(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="${J(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}">${J(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="${J(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 Gn(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">${J(a)}</span>
|
|
378
|
+
${c?`<span class="step-tool-tag">${J(c)}</span>`:``}
|
|
379
379
|
</div>
|
|
380
|
-
<pre class="step-output">${
|
|
380
|
+
<pre class="step-output">${J(_)}</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">${J(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 Kn(){return await q(`POST`,`/api/skill/reload`)}async function qn(e){return await q(`GET`,`/api/skill/markdown?name=${encodeURIComponent(e)}`)}function Jn(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="${J(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="${J(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="${J(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`)}">${J(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">📄 ${J(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
|
|
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 G(t(`toolbox.skillNameRequired`),`error`);if(!c)return G(t(`toolbox.skillMarkdownRequired`),`error`);try{let n=await q(`POST`,`/api/skill/save-markdown`,{name:e,description:r,version:o,markdown:c,enabled:l});n.success?(G(t(`toolbox.agentSkillSaved`,{name:e}),`success`),s(),on()):G(n.error||t(`toolbox.saveFailedShort`),`error`)}catch(e){G(t(`toolbox.saveFailed`,{error:e.message}),`error`)}})}function Yn(){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 W(t(`toolbox.selectJsonFile`),`warning`);let r=await e.text(),i=JSON.parse(r);await Nn(i),W(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 W(t(`toolbox.skillNameRequired`),`warning`);if(!i)return W(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)W(t(`toolbox.agentSkillCreated`,{name:e}),`success`);else return W(a.error||t(`toolbox.createFailedShort`),`error`)}else if(e===`zip`){let e=n.querySelector(`#skillZipFile`).files[0];if(!e)return W(t(`toolbox.selectZipFile`),`warning`);if(e.size>52428800)return W(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)W(t(`toolbox.agentSkillImported`,{name:r.skill?.name||`unknown`}),`success`);else return W(r.error||t(`toolbox.skillImportFailedShort`),`error`)}else if(e===`url`){let e=n.querySelector(`#skillUrl`).value.trim();if(!e)return W(t(`toolbox.urlRequired`),`warning`);let r=await J(`POST`,`/api/skill/import-url`,{url:e});if(r.success)W(t(`toolbox.agentSkillImported`,{name:r.skill?.name||`unknown`}),`success`);else return W(r.error||t(`toolbox.skillImportFailedShort`),`error`)}i(),$t()}catch(e){W(t(`toolbox.importFailed`,{error:e.message}),`error`)}})}function Wn(){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(()=>{On=e.value.trim(),jn(q.cachedSkills||[])},200)})}let n=document.getElementById(`skillSearchClear`);n&&n.addEventListener(`click`,()=>{e.value=``,On=``,jn(q.cachedSkills||[]),e.focus()}),t.forEach(e=>{e.addEventListener(`click`,()=>{t.forEach(e=>e.classList.remove(`active`)),e.classList.add(`active`),kn=e.dataset.filter,jn(q.cachedSkills||[])})})}q.refreshCallback=X;function Gn(){try{chrome.runtime.sendMessage({type:`RELOAD_MCP_TOOLS`},e=>{e?.success&&r.debug(`[Toolbox] Background re loaded ${e.count} MCP tool`)})}catch{}}function Kn(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 qn(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([on(),An()]),r=e.servers||[],i=n.skills||[];sn(r),jn(i),Kn(r),qn(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 Jn(e){q.cachedMcpServers.find(t=>t.id===e)&&(q.editingMcpId=e,document.getElementById(`mcpServerList`)&&sn(q.cachedMcpServers))}function Yn(){q.editingMcpId=null,sn(q.cachedMcpServers)}async function Xn(){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=vn(`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:ln(document.getElementById(`mcpEditEnvRows`)),headers:dn(document.getElementById(`mcpEditHeaderRows`)),enabled:q.cachedMcpServers.find(e=>e.id===q.editingMcpId)?.enabled!==!1};try{if(await Sn(p),q.cachedMcpServers.find(e=>e.id===q.editingMcpId)?.connected){Z(t(`toolbox.mcpReconnecting`),`info`),await Tn(q.editingMcpId),await new Promise(e=>setTimeout(e,500));let e=await wn(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,Gn(),await X()}catch(e){Z(t(`toolbox.mcpUpdateFailed`,{error:e.message}),`error`)}}function Zn(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 Qn(){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),Zn(`mcp`,r),Zn(`skill`,i)}),e&&e.addEventListener(`change`,()=>{let n=e.checked;chrome.storage.local.set({mcpEnabled:n}),Zn(`mcp`,n),Z(t(n?`toolbox.mcpServiceEnabled`:`toolbox.mcpServiceDisabled`),`info`)}),n&&n.addEventListener(`change`,()=>{let e=n.checked;chrome.storage.local.set({skillsEnabled:e}),Zn(`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()?xn():bn()});let a=document.getElementById(`mcpAddForm`);a&&a.addEventListener(`click`,async e=>{if(e.target.dataset.action===`transport-change`){yn(e.target);return}if(!pn(e)&&(e.target.id===`mcpAddCancel`&&xn(),e.target.id===`mcpAddConfirm`)){let e=document.getElementById(`mcpAddId`)?.value.trim(),n=document.getElementById(`mcpAddName`)?.value.trim(),r=vn(`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?ln(c):{},headers:l?dn(l):{},enabled:!0};try{await Sn(u),Z(t(`toolbox.mcpAddSuccess`),`success`),xn(),Gn(),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`){yn(e.target);return}if(pn(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 wn(i),Z(t(`toolbox.mcpConnectSuccess`),`success`),Gn(),await X();else if(r===`disconnect`)await Tn(i),Z(t(`toolbox.mcpDisconnectSuccess`),`success`),Gn(),await X();else if(r===`toggle`){let e=n.checked;await En(i,e),Z(t(e?`toolbox.mcpEnabledToast`:`toolbox.mcpDisabledToast`),`success`),Gn(),await X()}else if(r===`delete`){if(!await en(t(`toolbox.mcpConfirmDelete`),t(`toolbox.deleteConfirmTitle`)))return;await Cn(i),Z(t(`toolbox.deleteSuccess`),`success`),Gn(),await X()}else if(r===`edit`)Jn(i);else if(r===`cancel-edit`)Yn();else if(r===`save-edit`)await Xn();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 en(t(`toolbox.skillConfirmDelete`,{name:a}),t(`toolbox.deleteConfirmTitle`)))return;await Pn(a),Z(t(`toolbox.deleteSuccess`),`success`),await X()}else if(i===`toggle-skill`)Z(await Fn(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=Ln(e.skill);if(n.hasRequired){let r=await Rn(a,n);if(r===null)return;Z(t(`toolbox.skillRunning`,{name:a}),`info`),zn(a,e,await In(a,r))}else Z(t(`toolbox.skillRunning`,{name:a}),`info`),zn(a,e,await In(a))}else if(i===`edit-agent-skill`)try{let e=await Vn(a);e.success?Hn(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 Vn(a);e.success?tn(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`,()=>Un());let l=document.getElementById(`reloadSkillsBtn`);l&&l.addEventListener(`click`,async()=>{try{let e=await Bn();Z(t(`toolbox.skillsReloaded`,{count:e.count||0}),`success`),await X()}catch(e){Z(t(`toolbox.skillsReloadFailed`,{error:e.message}),`error`)}}),Dn(),Wn(),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 $n=2e3,er=[`vectra`,`@huggingface/transformers`,`pdf-parse`,`mammoth`,`officeparser`,`cheerio`],tr=null,nr=null;function rr(e){nr=e}async function ir(){if(await nn(),!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 ar(){try{return await J(`GET`,`/api/rag/install/status`)}catch(e){return r.warn(`[RAG] Failed to fetch install status:`,e.message),null}}function or(){try{chrome.runtime.sendMessage({type:`RELOAD_RAG_TOOLS`},e=>{e?.success&&r.debug(`[Toolbox] Background re loaded ${e.count} RAG tool`)})}catch{}}function sr(e){if(!e)return!0;let t=parseInt(String(e).replace(/^v/i,``),10);return!Number.isFinite(t)||t>=22}function cr(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 G(t(`toolbox.selectJsonFile`),`warning`);let r=await e.text(),i=JSON.parse(r);await zn(i),G(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 G(t(`toolbox.skillNameRequired`),`warning`);if(!i)return G(t(`toolbox.skillMarkdownRequired`),`warning`);let a=await q(`POST`,`/api/skill/save-markdown`,{name:e,description:r,version:`1.0`,markdown:i});if(a.success)G(t(`toolbox.agentSkillCreated`,{name:e}),`success`);else return G(a.error||t(`toolbox.createFailedShort`),`error`)}else if(e===`zip`){let e=n.querySelector(`#skillZipFile`).files[0];if(!e)return G(t(`toolbox.selectZipFile`),`warning`);if(e.size>52428800)return G(t(`toolbox.fileTooLarge`),`warning`);let r=await q(`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)G(t(`toolbox.agentSkillImported`,{name:r.skill?.name||`unknown`}),`success`);else return G(r.error||t(`toolbox.skillImportFailedShort`),`error`)}else if(e===`url`){let e=n.querySelector(`#skillUrl`).value.trim();if(!e)return G(t(`toolbox.urlRequired`),`warning`);let r=await q(`POST`,`/api/skill/import-url`,{url:e});if(r.success)G(t(`toolbox.agentSkillImported`,{name:r.skill?.name||`unknown`}),`success`);else return G(r.error||t(`toolbox.skillImportFailedShort`),`error`)}i(),on()}catch(e){G(t(`toolbox.importFailed`,{error:e.message}),`error`)}})}function Xn(){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(()=>{Pn=e.value.trim(),Ln(K.cachedSkills||[])},200)})}let n=document.getElementById(`skillSearchClear`);n&&n.addEventListener(`click`,()=>{e.value=``,Pn=``,Ln(K.cachedSkills||[]),e.focus()}),t.forEach(e=>{e.addEventListener(`click`,()=>{t.forEach(e=>e.classList.remove(`active`)),e.classList.add(`active`),Fn=e.dataset.filter,Ln(K.cachedSkills||[])})})}K.refreshCallback=Y;function Zn(){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 $n(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 Y(){let[e,n]=await Promise.all([fn(),In()]),r=e.servers||[],i=n.skills||[];pn(r),Ln(i),Qn(r),$n(i);let a=document.getElementById(`toolboxAgentStatus`);if(a){if(K.agentConnected){let e=K.agentName||t(`toolbox.unknownAgent`);a.innerHTML=`<span class="toolbox-status-dot connected"></span> ${t(`toolbox.currentAgentSupports`,{name:J(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=!K.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 er(e){K.cachedMcpServers.find(t=>t.id===e)&&(K.editingMcpId=e,document.getElementById(`mcpServerList`)&&pn(K.cachedMcpServers))}function tr(){K.editingMcpId=null,pn(K.cachedMcpServers)}async function nr(){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=wn(`mcpEdit`),l=r?.value.trim(),u=i?.value.trim(),d=a?.value.trim(),f=c===`sse`||c===`streamableHttp`||c===`websocket`;if(!o){X(t(`toolbox.mcpIdRequired`),`warning`);return}if(f){if(!d){X(t(`toolbox.mcpUrlRequired`),`warning`);return}}else if(!l){X(t(`toolbox.mcpCommandRequired`),`warning`);return}let p={id:o,name:s||o,transport:c,command:l,args:u?u.split(/\s+/):[],url:d,env:hn(document.getElementById(`mcpEditEnvRows`)),headers:_n(document.getElementById(`mcpEditHeaderRows`)),enabled:K.cachedMcpServers.find(e=>e.id===K.editingMcpId)?.enabled!==!1};try{if(await On(p),K.cachedMcpServers.find(e=>e.id===K.editingMcpId)?.connected){X(t(`toolbox.mcpReconnecting`),`info`),await jn(K.editingMcpId),await new Promise(e=>setTimeout(e,500));let e=await An(o);if(e.success)X(t(`toolbox.mcpUpdateReconnected`,{count:e.toolCount||0}),`success`);else{let n=e.error||t(`toolbox.mcpUnknownError`);X(t(`toolbox.mcpUpdatedReconnectFailed`,{error:n}),`warning`)}}else X(t(`toolbox.mcpUpdateSuccess`),`success`);K.editingMcpId=null,Zn(),await Y()}catch(e){X(t(`toolbox.mcpUpdateFailed`,{error:e.message}),`error`)}}function rr(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 ir(){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),rr(`mcp`,r),rr(`skill`,i)}),e&&e.addEventListener(`change`,()=>{let n=e.checked;chrome.storage.local.set({mcpEnabled:n}),rr(`mcp`,n),X(t(n?`toolbox.mcpServiceEnabled`:`toolbox.mcpServiceDisabled`),`info`)}),n&&n.addEventListener(`change`,()=>{let e=n.checked;chrome.storage.local.set({skillsEnabled:e}),rr(`skill`,e),X(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()?Dn():En()});let a=document.getElementById(`mcpAddForm`);a&&a.addEventListener(`click`,async e=>{if(e.target.dataset.action===`transport-change`){Tn(e.target);return}if(!yn(e)&&(e.target.id===`mcpAddCancel`&&Dn(),e.target.id===`mcpAddConfirm`)){let e=document.getElementById(`mcpAddId`)?.value.trim(),n=document.getElementById(`mcpAddName`)?.value.trim(),r=wn(`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){X(t(`toolbox.mcpIdRequired`),`warning`);return}if(s){if(!o){X(t(`toolbox.mcpUrlRequired`),`warning`);return}}else if(!i){X(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?hn(c):{},headers:l?_n(l):{},enabled:!0};try{await On(u),X(t(`toolbox.mcpAddSuccess`),`success`),Dn(),Zn(),await Y()}catch(e){X(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`){Tn(e.target);return}if(yn(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`)X(t(`toolbox.mcpConnecting`),`info`),await An(i),X(t(`toolbox.mcpConnectSuccess`),`success`),Zn(),await Y();else if(r===`disconnect`)await jn(i),X(t(`toolbox.mcpDisconnectSuccess`),`success`),Zn(),await Y();else if(r===`toggle`){let e=n.checked;await Mn(i,e),X(t(e?`toolbox.mcpEnabledToast`:`toolbox.mcpDisabledToast`),`success`),Zn(),await Y()}else if(r===`delete`){if(!await sn(t(`toolbox.mcpConfirmDelete`),t(`toolbox.deleteConfirmTitle`)))return;await kn(i),X(t(`toolbox.deleteSuccess`),`success`),Zn(),await Y()}else if(r===`edit`)er(i);else if(r===`cancel-edit`)tr();else if(r===`save-edit`)await nr();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){X(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})}">📄 ${J(e.name)}</span>`).join(``))}catch(e){r.error(`Failed to expand resources:`,e)}return}if(!(!i||!a))try{if(i===`delete-skill`){if(!await sn(t(`toolbox.skillConfirmDelete`,{name:a}),t(`toolbox.deleteConfirmTitle`)))return;await Bn(a),X(t(`toolbox.deleteSuccess`),`success`),await Y()}else if(i===`toggle-skill`)X(await Vn(a)?t(`toolbox.skillEnabledToast`,{name:a}):t(`toolbox.skillDisabledToast`,{name:a}),`success`),await Y();else if(i===`run-skill`){let e=await q(`GET`,`/api/skill/detail?name=${encodeURIComponent(a)}`);if(!e?.success||!e.skill){X(t(`toolbox.skillInfoFailed`,{error:e?.error||t(`agentConfig.unknownError`)}),`error`);return}let n=Un(e.skill);if(n.hasRequired){let r=await Wn(a,n);if(r===null)return;X(t(`toolbox.skillRunning`,{name:a}),`info`),Gn(a,e,await Hn(a,r))}else X(t(`toolbox.skillRunning`,{name:a}),`info`),Gn(a,e,await Hn(a))}else if(i===`edit-agent-skill`)try{let e=await qn(a);e.success?Jn(a,e):X(e.error||t(`toolbox.skillContentFailed`),`error`)}catch(e){X(t(`toolbox.skillGetFailed`,{error:e.message}),`error`)}else if(i===`view-agent-skill`)try{let e=await qn(a);e.success?cn(a,e):X(e.error||t(`toolbox.skillContentFailed`),`error`)}catch(e){X(t(`toolbox.skillGetFailed`,{error:e.message}),`error`)}}catch(e){X(t(`toolbox.operationFailed`,{error:e.message}),`error`)}});let c=document.getElementById(`importSkillBtn`);c&&c.addEventListener(`click`,()=>Yn());let l=document.getElementById(`reloadSkillsBtn`);l&&l.addEventListener(`click`,async()=>{try{let e=await Kn();X(t(`toolbox.skillsReloaded`,{count:e.count||0}),`success`),await Y()}catch(e){X(t(`toolbox.skillsReloadFailed`,{error:e.message}),`error`)}}),Nn(),Xn(),Y()}function X(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 ar=2e3,or=[`vectra`,`@huggingface/transformers`,`pdf-parse`,`mammoth`,`officeparser`,`cheerio`],sr=null,cr=null;function lr(e){cr=e}async function ur(){if(await ln(),!K.agentConnected)return{connected:!1,ragAvailable:!1,nodeVersion:null};try{let e=await q(`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 dr(){try{return await q(`GET`,`/api/rag/install/status`)}catch(e){return r.warn(`[RAG] Failed to fetch install status:`,e.message),null}}function fr(){try{chrome.runtime.sendMessage({type:`RELOAD_RAG_TOOLS`},e=>{e?.success&&r.debug(`[Toolbox] Background re loaded ${e.count} RAG tool`)})}catch{}}function pr(e){if(!e)return!0;let t=parseInt(String(e).replace(/^v/i,``),10);return!Number.isFinite(t)||t>=22}function mr(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 hr(e){let n=e&&Array.isArray(e.packages)&&e.packages.length>0?e.packages:or,r=`npm install ${n.join(` `)}`,i=e&&e.done&&!e.success,a=i&&Array.isArray(e.logTail)&&e.logTail.length>0?J(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;">⚠️ ${J(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;">${J(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;">${J(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,217 @@ 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 mr(`📦`,t(`toolbox.ragStatusNotInstalledTitle`),t(`toolbox.ragStatusNotInstalledDesc`),c)}function gr(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?J(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 mr(`⏳`,r,t(`toolbox.ragInstallTip`),a)}function _r(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=mr(`🔌`,t(`toolbox.ragStatusAgentOffTitle`),t(`toolbox.ragStatusAgentOffDesc`));return}if(o){n.innerHTML=mr(`⚠️`,t(`toolbox.ragStatusUnreachableTitle`),t(`toolbox.ragStatusUnreachableDesc`));return}if(s&&s.running){n.innerHTML=gr(s);return}if(i){n.innerHTML=mr(`✅`,t(`toolbox.ragStatusReadyTitle`),t(`toolbox.ragStatusReadyDesc`));return}if(!pr(a)){n.innerHTML=mr(`⚠️`,t(`toolbox.ragStatusNodeLowTitle`),t(`toolbox.ragStatusNodeLowDesc`,{version:J(a||`?`)}));return}n.innerHTML=hr(s)}function vr(){sr&&=(clearTimeout(sr),null)}function yr(){vr();let e=async()=>{let n=await dr();if(n&&n.running){_r({connected:!0,ragAvailable:!1,nodeVersion:null,install:n}),sr=setTimeout(e,ar);return}vr();let r=await ur();r.connected&&!r.ragAvailable&&(r.install=n),_r(r),n&&n.done&&(G(n.success?t(`toolbox.ragInstallSuccess`):t(`toolbox.ragInstallFailedToast`),n.success?`success`:`error`),n.success&&(fr(),await cr?.()))};sr=setTimeout(e,ar)}async function br(){let e=document.getElementById(`ragInstallBtn`);e&&(e.disabled=!0,e.textContent=t(`toolbox.ragInstallBtnBusy`));try{let n=await q(`POST`,`/api/rag/install`);if(!n||!n.started){G(n&&n.error?n.error:t(`toolbox.ragInstallFailedToast`),`error`);let r=await dr();if(r&&r.running){yr();return}e&&(e.disabled=!1,e.textContent=t(`toolbox.ragInstallBtn`));return}G(t(`toolbox.ragInstallStarted`),`info`),yr()}catch(n){G(`${t(`toolbox.ragInstallFailedToast`)}: ${n.message}`,`error`),e&&(e.disabled=!1,e.textContent=t(`toolbox.ragInstallBtn`))}}async function xr(){let e=document.getElementById(`ragRedetectBtn`);e&&(e.disabled=!0);try{let e=await q(`POST`,`/api/rag/detect`);e&&e.success?e.available?(G(t(`toolbox.ragRedetectReady`),`success`),fr(),await cr?.()):e.error?G(t(`toolbox.ragRedetectStillMissingDetail`,{error:e.error}),`error`):G(t(`toolbox.ragRedetectStillMissing`),`info`):G(t(`toolbox.ragRedetectFailed`,{error:e&&e.error||`unknown`}),`error`)}catch(e){G(t(`toolbox.ragRedetectFailed`,{error:e.message}),`error`)}await Cr()}async function Sr(){let e=document.getElementById(`ragInstallCmd`),n=e?e.textContent:`npm install ${or.join(` `)}`;try{await navigator.clipboard.writeText(n),G(t(`toolbox.ragCopied`),`success`)}catch(e){r.warn(`[RAG] Clipboard write failed:`,e.message),G(t(`toolbox.ragCopyFailed`),`error`)}}async function Cr(){let e=await ur();if(!e.connected||e.ragAvailable||e.unreachable){e.ragAvailable&&fr(),_r(e),vr();return}e.install=await dr(),_r(e),e.install&&e.install.running?yr():vr()}function wr(){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 br():t.id===`ragRedetectBtn`?await xr():t.id===`ragCopyCmdBtn`&&await Sr())}))}var Tr=52428800,Er=400,Dr=80,Or=5,kr=.3,Ar=`.txt,.md,.markdown,.pdf,.docx,.doc,.xlsx,.xls,.csv,.pptx,.html,.htm,.json,.rtf,.odt,.odp,.ods,.epub`,jr=[],Mr=``,Nr=`all`,Pr=!1;function Fr(){if(Pr)return;Pr=!0;let e=document.getElementById(`knowledgeList`);e&&e.addEventListener(`click`,Wr);let t=document.getElementById(`kbSearchInput`);if(t){let e=null;t.addEventListener(`input`,()=>{clearTimeout(e),e=setTimeout(()=>{Mr=t.value.trim(),Vr(jr)},200)});let n=document.getElementById(`kbSearchClear`);n&&n.addEventListener(`click`,()=>{t.value=``,Mr=``,Vr(jr),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`),Nr=e.dataset.filter,Vr(jr)})});let r=document.getElementById(`createKbBtn`);r&&r.addEventListener(`click`,()=>$r());let i=document.getElementById(`ragGlobalToggle`);i&&(chrome.storage.local.get(`ragEnabled`,e=>{let t=e.ragEnabled===!0;i.checked=t,Lr(t)}),i.addEventListener(`change`,()=>Rr(i.checked))),lr(()=>Ir());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"]`)&&Rr(!0)}),Ir()}async function Ir(){let e=document.getElementById(`knowledgeGate`),t=document.getElementById(`knowledgeMain`);if(!e||!t)return;let n=await ur(),{ragEnabled:r}=await chrome.storage.local.get(`ragEnabled`),i=document.getElementById(`createKbBtn`);if(!n.connected){zr(`agentOff`),i&&(i.disabled=!0);return}if(r!==!0){zr(`ragOff`),i&&(i.disabled=!0);return}if(!n.ragAvailable){zr(`ragUnavailable`),i&&(i.disabled=!0),wr(),await Cr();return}i&&(i.disabled=!1),e.style.display=`none`,t.style.display=``,await Z()}function Lr(e){let n=document.getElementById(`ragToggleLabel`);n&&(n.textContent=t(e?`common.enabled`:`common.disabled`),n.style.color=e?`#666`:`#999`)}async function Rr(e){await chrome.storage.local.set({ragEnabled:e});let n=document.getElementById(`ragGlobalToggle`);n&&(n.checked=e),Lr(e),G(t(e?`toolbox.ragServiceEnabled`:`toolbox.ragServiceDisabled`),`info`),await Ir()}function zr(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">${Br()}</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;">${J(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;">${J(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>${J(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;">${J(i.desc)}</div>
|
|
535
535
|
${a}
|
|
536
|
-
</div>`}async function
|
|
536
|
+
</div>`}async function Z(){let e=document.getElementById(`knowledgeList`);if(e){e.innerHTML=Br();try{let e=await q(`GET`,`/api/rag/collections`);if(!e||e.success!==!0)throw Error(e?.error||`unknown error`);jr=e.collections||[],Vr(jr)}catch(n){r.warn(`[Knowledge] Failed to load collections:`,n.message),Ur([]),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">${J(t(`knowledge.loadFailed`,{error:n.message}))}</div>
|
|
540
|
+
<button class="toolbox-add-btn" id="kbRetryBtn" style="width:auto; margin-top:12px; padding:8px 18px;">${J(t(`knowledge.retry`))}</button>
|
|
541
|
+
</div>`}}}function Br(){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">${J(t(`toolbox.loading`))}</div>
|
|
545
|
+
</div>`}function Vr(e){let n=document.getElementById(`knowledgeList`);if(!n)return;if(e.length===0){Ur(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">${J(t(`knowledge.emptyTitle`))}</div>
|
|
549
|
+
<div class="toolbox-empty-desc">${J(t(`knowledge.emptyDesc`))}</div>
|
|
550
|
+
</div>`;return}let r=e.filter(e=>Nr===`enabled`&&e.enabled===!1||Nr===`disabled`&&e.enabled!==!1?!1:!Mr||[e.name,e.description].filter(Boolean).join(` `).toLowerCase().includes(Mr.toLowerCase()));if(Ur(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">${J(t(`toolbox.noMatchResult`))}</div>
|
|
554
|
+
</div>`;return}n.innerHTML=r.map(Hr).join(``)}function Hr(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="${J(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="${J(e.name)}">${J(e.name)}</span>
|
|
559
|
+
${n?`<span class="kb-card-badge badge-disabled">${J(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="${J(e.description)}">${J(e.description)}</div>`:``}
|
|
562
|
+
<div class="kb-card-meta">${J(t(`knowledge.statsSummary`,{docs:e.documentCount||0,chunks:e.chunkCount||0}))}</div>
|
|
563
|
+
<div class="kb-card-model">${J(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">${J(t(`knowledge.actionEdit`))}</button>
|
|
566
|
+
<button class="kb-action-btn" type="button" data-action="ingest">${J(t(`knowledge.actionIngest`))}</button>
|
|
567
|
+
<button class="kb-action-btn" type="button" data-action="search">${J(t(`knowledge.actionSearch`))}</button>
|
|
568
|
+
<button class="kb-action-btn" type="button" data-action="docs">${J(t(`knowledge.actionDocs`))}</button>
|
|
569
|
+
<button class="kb-action-btn" type="button" data-action="toggle">${J(t(n?`knowledge.actionEnable`:`knowledge.actionDisable`))}</button>
|
|
570
|
+
<button class="kb-action-btn kb-action-danger" type="button" data-action="delete">${J(t(`knowledge.actionDelete`))}</button>
|
|
571
|
+
</div>
|
|
572
|
+
</div>`}function Ur(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 Wr(e){if(e.target.closest(`#kbRetryBtn`)){await Z();return}let t=e.target.closest(`.kb-action-btn`);if(!t)return;let n=t.closest(`[data-kb-id]`),r=jr.find(e=>e.id===n?.dataset.kbId);if(!r)return;let i=t.dataset.action;i===`ingest`?ti(r):i===`edit`?Qr(r):i===`search`?ai(r):i===`docs`?ri(r):i===`toggle`?await Kr(r):i===`delete`&&await Gr(r)}async function Gr(e){if(await sn(t(`knowledge.deleteConfirm`,{name:e.name,docs:e.documentCount||0,chunks:e.chunkCount||0}),t(`knowledge.deleteConfirmTitle`)))try{let n=await q(`DELETE`,`/api/rag/collections/${encodeURIComponent(e.id)}`);if(!n||n.success!==!0)throw Error(n?.error||`unknown error`);G(t(`knowledge.deleteSuccess`),`success`),await Z()}catch(e){G(t(`knowledge.opFailed`,{error:e.message}),`error`)}}async function Kr(e){try{let n=await q(`POST`,`/api/rag/collections/${encodeURIComponent(e.id)}/toggle`);if(!n||n.success!==!0)throw Error(n?.error||`unknown error`);G(n.enabled===!1?t(`knowledge.disableSuccess`,{name:e.name}):t(`knowledge.enableSuccess`,{name:e.name}),`success`),await Z()}catch(e){G(t(`knowledge.opFailed`,{error:e.message}),`error`)}}function qr(e={}){let n=e.mode===`openai-compat`;return`
|
|
573
573
|
<div class="form-group">
|
|
574
|
-
<label>${
|
|
574
|
+
<label>${J(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
|
+
${J(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
|
+
${J(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">${J(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>${J(t(`knowledge.vectorEndpointLabel`))}</label>
|
|
589
|
+
<input type="text" id="kbVecEndpoint" placeholder="${J(t(`knowledge.vectorEndpointPlaceholder`))}" value="${J(e.endpoint||``)}">
|
|
590
590
|
</div>
|
|
591
591
|
<div class="form-group">
|
|
592
|
-
<label>${
|
|
593
|
-
<input type="password" id="kbVecApiKey" value="" placeholder="${
|
|
592
|
+
<label>${J(t(`knowledge.vectorApiKeyLabel`))}</label>
|
|
593
|
+
<input type="password" id="kbVecApiKey" value="" placeholder="${J(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>${J(t(`knowledge.vectorModelLabel`))}</label>
|
|
597
|
+
<input type="text" id="kbVecModel" placeholder="${J(t(`knowledge.vectorModelPlaceholder`))}" value="${J(n&&e.modelName||``)}">
|
|
598
598
|
</div>
|
|
599
599
|
<div class="form-group" style="margin-bottom:0;">
|
|
600
|
-
<label>${
|
|
600
|
+
<label>${J(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="${J(t(`knowledge.vectorDimsPlaceholder`))}" value="${n&&e.dimensions?J(String(e.dimensions)):``}">
|
|
603
|
+
<button class="kb-action-btn" type="button" id="kbVecTestBtn">${J(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 Jr(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){G(t(`knowledge.vectorEndpointRequired`),`warning`);return}if(!i){G(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 q(`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)&&G(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 Yr(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 Xr(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 Zr(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 q(`GET`,`/api/rag/collections/${encodeURIComponent(e)}/ingest/status`))?.progress;n&&n.done&&(clearInterval(i),t(n))}catch{}},1e3)})}function Qr(e){let n=si({title:t(`knowledge.editTitle`),bodyHtml:`
|
|
609
609
|
<div class="form-group">
|
|
610
|
-
<label>${
|
|
611
|
-
<input type="text" id="kbEditName" maxlength="100" placeholder="${
|
|
610
|
+
<label>${J(t(`knowledge.nameLabel`))}</label>
|
|
611
|
+
<input type="text" id="kbEditName" maxlength="100" placeholder="${J(t(`knowledge.namePlaceholder`))}" value="${J(e.name||``)}">
|
|
612
612
|
</div>
|
|
613
613
|
<div class="form-group">
|
|
614
|
-
<label>${
|
|
615
|
-
<input type="text" id="kbEditDesc" maxlength="500" placeholder="${
|
|
614
|
+
<label>${J(t(`knowledge.descLabel`))}</label>
|
|
615
|
+
<input type="text" id="kbEditDesc" maxlength="500" placeholder="${J(t(`knowledge.descPlaceholder`))}" value="${J(e.description||``)}">
|
|
616
616
|
</div>
|
|
617
|
-
${
|
|
617
|
+
${qr(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){G(t(`knowledge.nameRequired`),`warning`);return}let c=Yr(a);if(c.mode===`openai-compat`){if(!c.endpoint){G(t(`knowledge.vectorEndpointRequired`),`warning`);return}if(!c.modelName){G(t(`knowledge.vectorModelRequired`),`warning`);return}}if(!(Xr(e.embeddingConfig||{},c)&&!await sn(t(`knowledge.rebuildConfirm`),t(`knowledge.rebuildConfirmTitle`)))){i(!0,t(`knowledge.saving`));try{let n=await q(`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?(G(t(`knowledge.rebuildStarted`),`info`),await Z(),Zr(e.id).then(e=>{e.phase===`error`?G(t(`knowledge.rebuildFailed`,{error:e.error||`unknown error`}),`error`):G(t(`knowledge.rebuildDone`),`success`),Z()}).catch(e=>{G(t(`knowledge.rebuildFailed`,{error:e.message}),`error`),Z()})):(G(t(`knowledge.editSuccess`),`success`),await Z())}catch(e){i(!1,t(`knowledge.editConfirm`)),G(t(`knowledge.opFailed`,{error:e.message}),`error`)}}}});Jr(n.overlay,e.id);let r=n.overlay.querySelector(`#kbEditName`);r?.focus(),r?.select()}function $r(){let e=si({title:t(`knowledge.createTitle`),bodyHtml:`
|
|
618
618
|
<div class="form-group">
|
|
619
|
-
<label>${
|
|
620
|
-
<input type="text" id="kbCreateName" maxlength="100" placeholder="${
|
|
619
|
+
<label>${J(t(`knowledge.nameLabel`))}</label>
|
|
620
|
+
<input type="text" id="kbCreateName" maxlength="100" placeholder="${J(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>${J(t(`knowledge.descLabel`))}</label>
|
|
624
|
+
<input type="text" id="kbCreateDesc" maxlength="500" placeholder="${J(t(`knowledge.descPlaceholder`))}">
|
|
625
625
|
</div>
|
|
626
|
-
${
|
|
626
|
+
${qr({})}`,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){G(t(`knowledge.nameRequired`),`warning`);return}let s=Yr(i);if(s.mode===`openai-compat`){if(!s.endpoint){G(t(`knowledge.vectorEndpointRequired`),`warning`);return}if(!s.modelName){G(t(`knowledge.vectorModelRequired`),`warning`);return}}r(!0,t(`knowledge.creating`));try{let e=await q(`POST`,`/api/rag/collections`,{name:a,description:o,embeddingConfig:s});if(!e||e.success!==!0)throw Error(e?.error||`unknown error`);n(),G(t(`knowledge.createSuccess`,{name:e.collection?.name||a}),`success`),await Z()}catch(e){r(!1,t(`knowledge.createConfirm`)),G(t(`knowledge.opFailed`,{error:e.message}),`error`)}}});Jr(e.overlay),e.overlay.querySelector(`#kbCreateName`)?.focus()}function ei(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 ti(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">${J(t(`knowledge.tabFile`))}</button>
|
|
629
|
+
<button type="button" class="import-tab" data-tab="text">${J(t(`knowledge.tabText`))}</button>
|
|
630
|
+
<button type="button" class="import-tab" data-tab="url">${J(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;">${J(t(`knowledge.dropHint`))}</div>
|
|
636
|
+
<div style="margin-top:6px; font-size:12px; color:#999;">${J(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="${Ar}">
|
|
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>${J(t(`knowledge.textNameLabel`))}</label>
|
|
644
|
+
<input type="text" id="kbIngestName" maxlength="100" placeholder="${J(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>${J(t(`knowledge.textContentLabel`))}</label>
|
|
648
|
+
<textarea id="kbIngestText" rows="8" placeholder="${J(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>${J(t(`knowledge.urlLabel`))}</label>
|
|
654
|
+
<input type="url" id="kbIngestUrl" placeholder="${J(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">${J(t(`knowledge.chunkSettingsTitle`))}</span>
|
|
659
|
+
<label class="kb-chunk-inline">${J(t(`knowledge.chunkSizeLabel`))}
|
|
660
|
+
<input type="number" id="kbChunkSize" min="100" max="2000" step="50" value="${Er}">
|
|
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">${J(t(`knowledge.chunkOverlapLabel`))}
|
|
663
|
+
<input type="number" id="kbChunkOverlap" min="0" max="500" step="10" value="${Dr}">
|
|
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;">⏳ ${J(t(`knowledge.ingesting`))}</div>`,r=null,i=si({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){G(t(`knowledge.fileRequired`),`warning`);return}let e=await ni(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()){G(t(`knowledge.contentRequired`),`warning`);return}c={type:`text`,content:e,name:n||void 0}}else{let e=o.querySelector(`#kbIngestUrl`).value.trim();if(!e){G(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 q(`GET`,`/api/rag/collections/${encodeURIComponent(e.id)}/ingest/status`);d&&t&&t.success&&t.progress&&(d.textContent=ei(t.progress))}catch{}},800);try{let r=await q(`POST`,`/api/rag/collections/${encodeURIComponent(e.id)}/ingest`,c);if(!r||r.success!==!0)throw Error(r?.error||`unknown error`);n(),G(t(`knowledge.ingestSuccess`,{name:r.name,chunks:r.chunkCount}),`success`),await Z()}catch(e){d&&(d.style.display=`none`),a(!1),G(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>Tr){G(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 ni(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 ri(e){let n=si({title:t(`knowledge.docsTitle`,{name:e.name}),bodyHtml:`<div id="kbDocsBody">${Br()}</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 sn(t(`knowledge.docDeleteConfirm`,{name:s}),t(`knowledge.docDeleteConfirmTitle`)))try{let r=await q(`DELETE`,`/api/rag/collections/${encodeURIComponent(e.id)}/documents/${encodeURIComponent(o)}`);if(!r||r.success!==!0)throw Error(r?.error||`unknown error`);G(t(`knowledge.docDeleteSuccess`),`success`),await ii(n,e),Z()}catch(e){G(t(`knowledge.opFailed`,{error:e.message}),`error`)}}),ii(n,e)}async function ii(e,n){e.innerHTML=Br();try{let r=await q(`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;">${J(t(`knowledge.docsEmpty`))}</div>`;return}e.innerHTML=`<div class="kb-doc-list">${i.map(e=>`
|
|
667
|
+
<div class="kb-doc-row" data-doc-id="${J(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="${J(e.name)}">${J(e.name)}</div>
|
|
670
|
+
<div class="kb-doc-meta">${J(t(`knowledge.docChunkCount`,{count:e.chunkCount}))} · ${J(ci(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="${J(t(`knowledge.actionDelete`))}">✕</button>
|
|
673
|
+
</div>`).join(``)}</div>`}catch(n){e.innerHTML=`<div class="kb-status" style="color:#c0392b;">${J(t(`knowledge.loadFailed`,{error:n.message}))}</div>`}}function ai(e){let n=`
|
|
674
|
+
<div class="kb-search-scope">${J(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="${J(t(`knowledge.searchQueryPlaceholder`))}">
|
|
677
|
+
<button class="btn btn-primary" type="button" id="kbSearchBtn" style="width:auto; padding:8px 20px; flex:none;">${J(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">${J(t(`knowledge.searchTopKLabel`))}
|
|
681
|
+
<input type="number" id="kbSearchTopK" min="1" max="20" value="${Or}">
|
|
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">${J(t(`knowledge.searchThresholdLabel`))}
|
|
684
|
+
<input type="number" id="kbSearchThreshold" min="0" max="1" step="0.05" value="${kr}">
|
|
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}=si({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){G(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">⏳ ${J(t(`knowledge.searching`))}</div>`;try{let t=await q(`POST`,`/api/rag/collections/${encodeURIComponent(e.id)}/search`,{query:n,topK:Number.isFinite(s)&&s>0?s:Or,threshold:Number.isFinite(c)?c:kr});if(!t||t.success!==!0)throw Error(t?.error||`unknown error`);oi(o,t)}catch(e){o.innerHTML=`<div class="kb-status" style="color:#c0392b;">${J(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 oi(e,n){let r=n.results||[];if(r.length===0){e.innerHTML=`<div class="kb-status" style="color:#999;">${J(t(`knowledge.searchNoHits`))}</div>`;return}e.innerHTML=`
|
|
688
|
+
${n.fallback?`<div class="kb-fallback-hint">⚠️ ${J(t(`knowledge.searchFallbackHint`))}</div>`:``}
|
|
689
|
+
<div class="kb-hit-count">${J(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">${J((e.score??0).toFixed(3))}</span>
|
|
694
|
+
<span class="kb-hit-doc" title="${J(e.metadata?.documentName||``)}">${J(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">${J(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 si({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>${J(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>${J(a||t(`common.cancel`))}</button>
|
|
706
|
+
${i?`<button class="btn btn-primary" type="button" data-modal-confirm>${J(i)}</button>`:``}
|
|
707
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 ni(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 ri=1;function ii(){let e=document.getElementById(`saveBar`);if(!e)return;let t=()=>{let t=e.getBoundingClientRect().bottom>=window.innerHeight-ri;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 ai(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 oi(){let e=window.location.hash.replace(`#`,``);[`basic`,`toolbar`,`react`,`reflection`,`chat`,`agent`,`toolbox`,`knowledge`].includes(e)&&ai(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(),W(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(){ai(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=`▼`))})}),oi(),window.addEventListener(`hashchange`,oi),chrome.storage.local.get([`optionsInitialTab`],e=>{e.optionsInitialTab&&(ai(e.optionsInitialTab),chrome.storage.local.remove(`optionsInitialTab`))}),chrome.runtime.onMessage.addListener(e=>{e.type===`SWITCH_TAB`&&e.tab&&ai(e.tab)}),await h(),tt(),Rt(),$=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`,nt),ii();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){W(`❌ `+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=``,W(`✅ `+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){W(`❌ `+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=``,W(`✅ `+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||W(`⚠️ `+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||W(t(`settings.fetchModelsSuccess`,{total:e.length,added:n}),`success`)}catch(e){o||(e&&(e.status===401||e.status===403)?W(t(`settings.fetchModelsAuthFailed`),`error`):e&&e.reason===`parse`?W(t(`settings.fetchModelsEmpty`),`info`):W(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}),W(`✅ `+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){W(`❌ `+t(`settings.apiBaseRequired`),`error`);return}try{new URL(e)}catch{W(`❌ `+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=``,W(`✅ `+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`),et(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;Ze(t);return}let n=e.target.closest(`.model-option`);if(n){e.stopPropagation();let r=n.dataset.value;N.value=r,et(r),P.classList.remove(`show`),chrome.storage.local.set({imageApiBase:r}),W(`✅ `+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}),Xe(e),et(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){W(`❌ `+t(`settings.apiBaseRequired`),`error`);return}try{new URL(e)}catch{W(`❌ `+t(`settings.urlInvalid`),`error`);return}Xe(e,n),N.value=e,et(e),chrome.storage.local.set({imageApiBase:e}),he.style.display=`none`,F.textContent=t(`settings.addAddress`),I.value=``,ge.value=``,W(`✅ `+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),si();break;case`moveDown`:$=pt($,r,1),si();break;case`edit`:ht($,r);break;case`delete`:$=mt($,r),si()}}),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?W(`❌ `+t.error,`error`):e.value=``})}),document.getElementById(`domainAddInput`).addEventListener(`keydown`,function(e){e.key===`Enter`&&bt(this.value,e=>{e.error?W(`❌ `+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){W(`❌ `+e.error,`error`);return}$=e.tools,si()});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 U(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:{},toolReflection:{},subtaskReflection:{}};n.enabled=e,chrome.storage.local.set({reflectionConfig:n})})}),H());function Qe(e,t){chrome.storage.local.get([`reflectionConfig`],n=>{let r=n.reflectionConfig||{postReflection:{},toolReflection:{},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(){U(`postReflectionSection`,`postReflectionEnabled`),Qe(`postReflection`,this.checked)});let rt=document.getElementById(`toolReflectionEnabled`);rt&&rt.addEventListener(`change`,function(){U(`toolReflectionSection`,`toolReflectionEnabled`),Qe(`toolReflection`,this.checked)});let it=document.getElementById(`subtaskReflectionEnabled`);it&&it.addEventListener(`change`,function(){U(`subtaskReflectionSection`,`subtaskReflectionEnabled`),Qe(`subtaskReflection`,this.checked)}),H(),U(`postReflectionSection`,`postReflectionEnabled`),U(`toolReflectionSection`,`toolReflectionEnabled`),U(`subtaskReflectionSection`,`subtaskReflectionEnabled`);let at=document.getElementById(`streamEnabled`),ot=document.getElementById(`streamEnabledLabel`);function ct(){let e=document.getElementById(`streamExpandToolsWrap`);e&&(e.style.display=at&&at.checked?`block`:`none`)}at&&ot&&(at.addEventListener(`change`,function(){ot&&(ot.textContent=at.checked?t(`common.enabled`):t(`common.disabled`)),chrome.storage.local.set({streamEnabled:at.checked}),ct()}),ot&&(ot.textContent=at.checked?t(`common.enabled`):t(`common.disabled`)),ct());let dt=document.getElementById(`streamExpandTools`),G=document.getElementById(`streamExpandToolsLabel`);dt&&G&&(dt.addEventListener(`change`,function(){G.textContent=this.checked?t(`common.enabled`):t(`common.disabled`),chrome.storage.local.set({streamExpandTools:this.checked})}),G.textContent=dt.checked?t(`common.enabled`):t(`common.disabled`));let yt=document.getElementById(`toolConfirmationEnabled`),St=document.getElementById(`toolConfirmationEnabledLabel`);yt&&St&&(yt.addEventListener(`change`,function(){St.textContent=this.checked?t(`common.enabled`):t(`common.disabled`),chrome.storage.local.set({toolConfirmationEnabled:this.checked})}),St.textContent=yt.checked?t(`common.enabled`):t(`common.disabled`));let Ct=document.getElementById(`enableExecutionLog`),wt=document.getElementById(`enableExecutionLogLabel`);Ct&&wt&&(Ct.addEventListener(`change`,function(){wt.textContent=this.checked?t(`common.enabled`):t(`common.disabled`),chrome.storage.local.set({enableExecutionLog:this.checked})}),wt.textContent=Ct.checked?t(`common.enabled`):t(`common.disabled`));let Tt=document.getElementById(`completionSoundEnabled`);Tt&&Tt.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 jt=document.getElementById(`interactionNotificationEnabled`);jt&&jt.addEventListener(`change`,function(){chrome.storage.local.set({interactionNotificationEnabled:this.checked})});let Nt=document.getElementById(`showMessageTimestamp`);Nt&&Nt.addEventListener(`change`,function(){chrome.storage.local.set({showMessageTimestamp:this.checked})}),ci(),document.getElementById(`exportConfigBtn`).addEventListener(`click`,Et),document.getElementById(`importConfigBtn`).addEventListener(`click`,At),document.getElementById(`importConfigFile`).addEventListener(`change`,function(e){e.target.files&&e.target.files.length>0&&Mt(e.target.files[0])}),Pt(),Qn(),document.querySelector(`[data-tab="toolbox"]`)?.addEventListener(`click`,()=>{X()}),kr(),document.querySelector(`[data-tab="knowledge"]`)?.addEventListener(`click`,()=>{Ar()})});function si(){chrome.storage.local.set({toolbarTools:$},()=>{ut($),ft()})}function ci(){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`),`
|
|
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 ci(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 li=!1,ui={connected:!0,ragAvailable:!0},di=!1,fi=!1,pi=!1,Q=e=>document.getElementById(e);function mi(){return document.querySelector(`input[name="memoryEmbeddingMode"]:checked`)?.value||`openai-compat`}var hi=()=>mi()===`local`;function gi(){let e=hi()?`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=hi()?``:`none`)}function _i(){let e={enabled:Q(`memoryEnabled`)?.checked===!0,mode:mi()};if(hi())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 vi(){let e=Q(`memoryEnabledLabel`);e&&(e.textContent=Q(`memoryEnabled`)?.checked===!0?t(`memoryPanel.enabled`):t(`memoryPanel.disabled`))}function yi(){let e=Q(`memoryEnabled`);e&&(e.disabled=di||fi)}function bi(e){Q(`memoryEnabled`).checked=e.enabled===!0,vi();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||``,gi()}function xi(e){let n=Q(`memoryStatus`);if(n){if(!e){n.innerHTML=`<span class="memory-status-muted">${J(t(`memoryPanel.statusLoading`))}</span>`;return}n.innerHTML=`
|
|
709
|
+
<div class="memory-status-row">
|
|
710
|
+
<span>${J(t(`memoryPanel.statusIndexed`,{indexed:e.indexed,total:e.total}))}</span>
|
|
711
|
+
<span class="memory-status-badge ${e.stale?`stale`:`fresh`}">${J(e.stale?t(`memoryPanel.statusStale`):t(`memoryPanel.statusFresh`))}</span>
|
|
712
|
+
</div>
|
|
713
|
+
<div class="memory-status-keys">
|
|
714
|
+
<span>${J(t(`memoryPanel.statusStored`))}: <code>${J(e.storedModelKey||`—`)}</code></span>
|
|
715
|
+
<span>${J(t(`memoryPanel.statusCurrent`))}: <code>${J(e.currentModelKey)}</code></span>
|
|
716
|
+
<span>${J(t(`memoryPanel.statusTier`))}: <code>${J(e.tier)}</code></span>
|
|
717
|
+
</div>
|
|
718
|
+
${e.stale?`<div class="memory-status-hint">${J(t(`memoryPanel.staleHint`))}</div>`:``}`}}function Si(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=`
|
|
719
|
+
<div class="memory-status-row">
|
|
720
|
+
<span class="memory-status-badge fail">${J(r)}</span>
|
|
721
|
+
</div>
|
|
722
|
+
<div class="memory-status-keys"><span>${J(t(`memoryPanel.statusDetail`))}: <code>${J(i)}</code></span></div>`}function Ci(){let e=Q(`memoryStatus`);e&&(e.innerHTML=`<span class="memory-status-muted">${J(t(`memoryPanel.statusOffline`))}</span>`)}function wi(e){Q(`memoryReindexBtn`).disabled=e,Q(`memoryTestBtn`).disabled=e||hi(),Q(`memoryApiKeyClearBtn`).disabled=e}async function Ti(){if(hi())return;wi(!0);let e=Q(`memoryTestResult`);e.textContent=t(`memoryPanel.testRunning`);try{let n=await q(`POST`,`/api/memory/test-embedding`,_i());if(!n||n.success!==!0)throw Error(n?.error||`unknown`);e.textContent=t(`memoryPanel.testOk`,{model:_i().modelName,dims:n.dimensions});let r=Q(`memoryDimsInput`);r.value=String(n.dimensions),G(t(`memoryPanel.testOk`,{model:_i().modelName,dims:n.dimensions}),`info`)}catch(n){e.textContent=t(`memoryPanel.testFail`,{error:n.message}),G(t(`memoryPanel.testFail`,{error:n.message}),`error`)}finally{wi(!1)}}async function Ei(){if(pi)return{ok:!1,reason:`notLoaded`};wi(!0);try{let e=await q(`POST`,`/api/memory/embedding-config`,_i());if(!e||e.success!==!0)throw Error(e?.error||`unknown`);return Q(`memoryApiKeyInput`).value=``,await ji(),{ok:!0}}catch(e){return{ok:!1,reason:`error`,error:e.message}}finally{wi(!1)}}async function Di(){let e=await ln();if(!e||!e.connected){G(t(`memoryPanel.saveSkippedOffline`),`info`);return}let n=await Ei();n.ok||(n.reason===`notLoaded`?G(t(`memoryPanel.configNotLoaded`),`error`):G(t(`memoryPanel.saveFail`,{error:n.error}),`error`))}async function Oi(){if(!await sn(t(`memoryPanel.reindexConfirm`)))return;wi(!0);let e=Q(`memoryResult`);e.style.display=``,e.textContent=t(`memoryPanel.reindexRunning`);try{let n=await q(`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,G(t(`memoryPanel.reindexDone`,{indexed:n.indexed,total:n.total}),`info`)}await ji()}catch(n){e.textContent=t(`memoryPanel.reindexFail`,{error:n.message}),G(t(`memoryPanel.reindexFail`,{error:n.message}),`error`)}finally{wi(!1)}}async function ki(){if(await sn(t(`memoryPanel.apiKeyClearConfirm`))){wi(!0);try{let e=await q(`POST`,`/api/memory/embedding-config`,{clearApiKey:!0});if(!e||e.success!==!0)throw Error(e?.error||`unknown`);Q(`memoryApiKeyClearBtn`).style.display=`none`,G(t(`memoryPanel.apiKeyCleared`),`info`)}catch(e){G(t(`memoryPanel.apiKeyClearFail`,{error:e.message}),`error`)}finally{wi(!1)}}}async function Ai(){try{let e=await q(`GET`,`/api/memory/vector-status`);e&&e.success===!0?xi(e):Si(e)}catch(e){r.warn(`[MemoryPanel] status load failed:`,e.message),Si(e)}}async function ji(){let e=(async()=>{pi=!0;try{let e=await q(`GET`,`/api/memory/embedding-config`);e&&e.success===!0&&e.config&&(bi(e.config),pi=!1)}catch(e){r.warn(`[MemoryPanel] config load failed:`,e.message),G(t(`memoryPanel.statusFail`)+` — `+e.message,`error`)}})(),n=Ai();await Promise.all([e,n])}function Mi(e){let n=Q(`memoryGate`),r=Q(`memoryMain`),i=document.querySelector(`.memory-scope-hint`),a=!e.connected||mi()===`local`&&!e.ragAvailable;if(di=a,yi(),[`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=`
|
|
723
|
+
<div class="toolbox-empty" style="text-align:left; padding:24px 20px;">
|
|
724
|
+
<div style="display:flex; align-items:center; gap:10px; font-size:15px; font-weight:600; color:#555;">
|
|
725
|
+
<span style="font-size:22px;">${s}</span><span>${J(c)}</span>
|
|
726
|
+
</div>
|
|
727
|
+
<div style="margin-top:8px; line-height:1.7; color:#888; font-size:13px;">${J(l)}</div>
|
|
728
|
+
<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;">${J(u)}</button>
|
|
729
|
+
</div>`}async function Ni(){let e=Q(`memoryEnabled`),n=e.checked===!0;fi=!0,yi();try{let e=await q(`POST`,`/api/memory/embedding-config`,{enabled:n});if(!e||e.success!==!0)throw Error(e?.error||`unknown`);G(t(n?`memoryPanel.toggleOnSaved`:`memoryPanel.toggleOffSaved`),`info`),await Ai()}catch(i){r.warn(`[MemoryPanel] toggle persist failed:`,i.message),e.checked=!n,G(t(`memoryPanel.toggleFail`,{error:i.message}),`error`)}finally{fi=!1,yi(),vi()}}function Pi(){li||(li=!0,Q(`memoryTestBtn`)?.addEventListener(`click`,Ti),Q(`memoryReindexBtn`)?.addEventListener(`click`,Oi),Q(`memoryApiKeyClearBtn`)?.addEventListener(`click`,ki),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`,()=>{gi(),Mi(ui)})}),Q(`memoryEnabled`)?.addEventListener(`change`,()=>{vi(),Ni()}))}async function Fi(){let e=await ur();if(ui=e,Mi(e),!e.connected){Ci();return}await ji()}var Ii=1;function Li(){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 Ri=`https://raw.githubusercontent.com/xiweicheng/ai-helper/main`;function zi(){return ie&&ie.version?ie.version:`latest`}function Bi(e){return`curl -fsSL ${Ri}/install.sh | AGENT_VERSION=${e} bash`}function Vi(e){return`[Net.ServicePointManager]::SecurityProtocol=[Net.SecurityProtocolType]::Tls12; $env:AGENT_VERSION='${e}'; irm ${Ri}/install.ps1 | iex`}function Hi(){let e=navigator.platform||``,t=navigator.userAgent||``;return/^win/i.test(e)||/\bwindows\b/i.test(t)}async function Ui(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 Wi(){let e=zi(),n=document.getElementById(`agentInstallTitle`);n&&(n.textContent=t(`agentConfig.installGuideTitle`,{version:e}));let r=document.getElementById(`installCmdUnix`),i=document.getElementById(`installCmdWin`);r&&(r.textContent=Bi(e)),i&&(i.textContent=Vi(e))}function Gi(e=G){if(!document.getElementById(`agentInstallGuide`))return;Wi(),s(Wi);let t=document.getElementById(`installCmdUnix`),n=document.getElementById(`installCmdWin`);document.getElementById(`copyInstallUnix`)?.addEventListener(`click`,()=>Ui(t?.textContent,e)),document.getElementById(`copyInstallWin`)?.addEventListener(`click`,()=>Ui(n?.textContent,e)),document.getElementById(`copyInstallAuto`)?.addEventListener(`click`,()=>{Ui(Hi()?n?.textContent:t?.textContent,e)})}var $=[],Ki={},qi={};function Ji(){return document.querySelector(`.tab-panel.active`)?.dataset.tab||null}async function Yi(){it();let e=qi[Ji()];if(e)try{await e()}catch(e){r.warn(`[Options] tab agent save failed:`,e.message)}}function Xi(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),Ki[e]?.()}function Zi(){let e=window.location.hash.replace(`#`,``);[`basic`,`toolbar`,`react`,`reflection`,`chat`,`agent`,`toolbox`,`knowledge`,`memory`].includes(e)&&Xi(e)}document.addEventListener(`DOMContentLoaded`,async function(){await n(),i(),s(()=>{i(),dt().then(e=>{$=e,ft($)})});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(),G(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(){Xi(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=`▼`))})}),Gi(),Ki.memory=Fi,qi.memory=Di,Ki.toolbox=()=>{Y().catch(()=>{})},Ki.knowledge=()=>{Ir().catch(()=>{})},Zi(),window.addEventListener(`hashchange`,Zi),chrome.storage.local.get([`optionsInitialTab`],e=>{e.optionsInitialTab&&(Xi(e.optionsInitialTab),chrome.storage.local.remove(`optionsInitialTab`))}),chrome.runtime.onMessage.addListener(e=>{e.type===`SWITCH_TAB`&&e.tab&&Xi(e.tab)}),await g(),rt(),Ut(),$=await dt(),ft($);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`,Yi),Li();let f=document.getElementById(`modelInput`),p=document.getElementById(`modelDropdown`);f.addEventListener(`click`,function(e){e.stopPropagation(),p.classList.contains(`show`)||(ke(p,``),Fe(ye),f.select()),p.classList.toggle(`show`)}),f.addEventListener(`input`,function(){V(),p.classList.add(`show`),ke(p,this.value)}),f.addEventListener(`blur`,function(){f.value=ye,Fe(ye)}),p.addEventListener(`click`,function(e){if(e.target.classList.contains(`delete-model-btn`)){e.stopPropagation();let t=e.target.closest(`.model-option`).dataset.value;Ae(t);return}let t=e.target.closest(`.ctx-set-btn`);if(t){e.stopPropagation();let n=e.target.closest(`.model-option`);n&&_e(t,n,{onPreview:e=>{Le(n,e),Ie(`modelInput`,`modelSelectedCtxBadge`,`modelDropdown`)},onCommit:e=>Re(n,e),onReset:()=>Re(n,0)});return}let n=e.target.closest(`.model-option`);if(n){e.stopPropagation(),V();let t=n.dataset.value;be(t),f.value=t,Fe(t),p.classList.remove(`show`)}}),document.addEventListener(`click`,function(e){!p.contains(e.target)&&e.target!==f&&!ve(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){G(`❌ `+t(`settings.modelNameRequired`),`error`);return}Ee(e,n),f.value=e,be(e),Fe(e),chrome.storage.local.set({modelName:e}),h.style.display=`none`,m.textContent=t(`settings.addModel`),_.value=``,v.value=``,G(`✅ `+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`),S=document.getElementById(`imageModelGroup`),C=document.getElementById(`imageApiGroup`),ee=document.getElementById(`imageApiKeyGroup`);x&&S&&x.addEventListener(`change`,function(){S.style.display=this.checked?``:`none`,C&&(C.style.display=this.checked?``:`none`),ee&&(ee.style.display=this.checked?``:`none`),chrome.storage.local.set({enableImageInput:this.checked})});let w=document.getElementById(`imageModelInput`),T=document.getElementById(`imageModelDropdown`);w&&T&&(w.addEventListener(`click`,function(e){e.stopPropagation(),T.classList.contains(`show`)||(ke(T,``),We(xe),w.select()),T.classList.toggle(`show`)}),w.addEventListener(`input`,function(){V(),T.classList.add(`show`),ke(T,this.value)}),w.addEventListener(`blur`,function(){w.value=xe,We(xe)}),T.addEventListener(`click`,function(e){if(e.target.classList.contains(`delete-model-btn`)){e.stopPropagation();let t=e.target.closest(`.model-option`).dataset.value;Be(t);return}let t=e.target.closest(`.ctx-set-btn`);if(t){e.stopPropagation();let n=e.target.closest(`.model-option`);n&&_e(t,n,{onPreview:e=>{Le(n,e),Ie(`imageModelInput`,`imageModelSelectedCtxBadge`,`imageModelDropdown`)},onCommit:e=>He(n,e),onReset:()=>He(n,0)});return}let n=e.target.closest(`.model-option`);if(n){e.stopPropagation(),V();let t=n.dataset.value;Se(t),w.value=t,We(t),T.classList.remove(`show`)}}),document.addEventListener(`click`,function(e){!T.contains(e.target)&&e.target!==w&&!ve(e.target)&&T.classList.remove(`show`)}));let te=document.getElementById(`addImageModelToggleBtn`),E=document.getElementById(`addImageModelForm`),D=document.getElementById(`addImageModelName`),ne=document.getElementById(`addImageModelContextWindow`),ie=document.getElementById(`confirmAddImageModelBtn`),ae=document.getElementById(`cancelAddImageModelBtn`);te&&E&&(te.addEventListener(`click`,function(){let e=E.style.display!==`none`;E.style.display=e?`none`:``,te.textContent=t(e?`settings.addModel`:`settings.collapse`),e||(D.value=``,ne.value=``,D.focus())}),ae.addEventListener(`click`,function(){E.style.display=`none`,te.textContent=t(`settings.addModel`),D.value=``,ne.value=``}),ie.addEventListener(`click`,function(){let e=D.value.trim(),n=parseInt(ne.value)||0;if(!e){G(`❌ `+t(`settings.modelNameRequired`),`error`);return}ze(e,n),w.value=e,Se(e),We(e),chrome.storage.local.set({imageModelName:e}),E.style.display=`none`,te.textContent=t(`settings.addModel`),D.value=``,ne.value=``,G(`✅ `+t(`settings.imageModelAdded`),`success`)}),D.addEventListener(`keydown`,function(e){e.key===`Enter`&&ie.click()}),ne.addEventListener(`keydown`,function(e){e.key===`Enter`&&ie.click()}));async function O({apiBaseEl:e,apiKeyEl:n,dropdownId:r,addFn:i,btn:a,silent:o}){let s=(e?.value||``).trim(),c=(n?.value||``).trim();if(!s||!c){o||G(`⚠️ `+t(`settings.fetchModelsNeedConfig`),`error`);return}let l=a?a.textContent:``;a&&(a.disabled=!0,a.textContent=t(`settings.fetchModelsLoading`));try{let e=await lt({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||G(t(`settings.fetchModelsSuccess`,{total:e.length,added:n}),`success`)}catch(e){o||(e&&(e.status===401||e.status===403)?G(t(`settings.fetchModelsAuthFailed`),`error`):e&&e.reason===`parse`?G(t(`settings.fetchModelsEmpty`),`info`):G(t(`settings.fetchModelsFailed`),`error`))}finally{a&&(a.disabled=!1,a.textContent=l||t(`settings.fetchModels`))}}let k=``,oe=null;function A(e,t){let n=(e||``).trim(),r=(t||``).trim();if(!n||!r)return;let i=`${n}|${r}`;i!==k&&(clearTimeout(oe),oe=setTimeout(()=>{k=i;let e=document.getElementById(`fetchModelsBtn`);e&&e.disabled||O({apiBaseEl:document.getElementById(`apiBase`),apiKeyEl:document.getElementById(`apiKey`),dropdownId:`modelDropdown`,addFn:Ee,btn:null,silent:!0})},500))}let j=document.getElementById(`fetchModelsBtn`);j&&j.addEventListener(`click`,()=>{O({apiBaseEl:document.getElementById(`apiBase`),apiKeyEl:document.getElementById(`apiKey`),dropdownId:`modelDropdown`,addFn:Ee,btn:j,silent:!1})});let se=document.getElementById(`fetchImageModelsBtn`);se&&se.addEventListener(`click`,()=>{O({apiBaseEl:document.getElementById(`imageApiBase`),apiKeyEl:document.getElementById(`imageApiKey`),dropdownId:`imageModelDropdown`,addFn:ze,btn:se,silent:!1})});let M=document.getElementById(`apiBase`),N=document.getElementById(`apiBaseDropdown`);M&&N&&(M.addEventListener(`click`,function(e){e.stopPropagation(),N.querySelectorAll(`.model-option`).forEach(e=>{e.style.display=``}),N.classList.toggle(`show`),Xe(M.value.trim())}),N.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;M.value=r,Xe(r),N.classList.remove(`show`),chrome.storage.local.set({apiBase:r}),G(`✅ `+t(`settings.apiBaseSwitched`),`info`),A(r,(document.getElementById(`apiKey`)?.value||``).trim())}}),document.addEventListener(`click`,function(e){!N.contains(e.target)&&e.target!==M&&N.classList.remove(`show`)}),M.addEventListener(`blur`,function(){let e=this.value.trim();e&&(chrome.storage.local.set({apiBase:e}),Ke(e),Xe(e))}),M.addEventListener(`input`,function(){let e=this.value.trim().toLowerCase();N.classList.add(`show`);let t=N.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 P=document.getElementById(`addApiBaseToggleBtn`),le=document.getElementById(`addApiBaseForm`),ue=document.getElementById(`addApiBaseUrl`),de=document.getElementById(`addApiBaseLabel`),F=document.getElementById(`confirmAddApiBaseBtn`),I=document.getElementById(`cancelAddApiBaseBtn`);P&&le&&(P.addEventListener(`click`,function(){let e=le.style.display!==`none`;le.style.display=e?`none`:``,P.textContent=t(e?`settings.addAddress`:`settings.collapse`),e||(ue.value=``,de.value=``,ue.focus())}),I.addEventListener(`click`,function(){le.style.display=`none`,P.textContent=t(`settings.addAddress`),ue.value=``,de.value=``}),F.addEventListener(`click`,function(){let e=ue.value.trim(),n=de.value.trim();if(!e){G(`❌ `+t(`settings.apiBaseRequired`),`error`);return}try{new URL(e)}catch{G(`❌ `+t(`settings.urlInvalid`),`error`);return}Ke(e,n),M.value=e,Xe(e),chrome.storage.local.set({apiBase:e}),le.style.display=`none`,P.textContent=t(`settings.addAddress`),ue.value=``,de.value=``,G(`✅ `+t(`settings.apiBaseAdded`),`success`)}),ue.addEventListener(`keydown`,function(e){e.key===`Enter`&&F.click()}),de.addEventListener(`keydown`,function(e){e.key===`Enter`&&F.click()}));let L=document.getElementById(`imageApiBase`),R=document.getElementById(`imageApiBaseDropdown`);L&&R&&(L.addEventListener(`click`,function(e){e.stopPropagation(),R.querySelectorAll(`.model-option`).forEach(e=>{e.style.display=``}),R.classList.toggle(`show`),nt(L.value.trim())}),R.addEventListener(`click`,function(e){if(e.target.classList.contains(`delete-model-btn`)){e.stopPropagation();let t=e.target.closest(`.model-option`).dataset.value;$e(t);return}let n=e.target.closest(`.model-option`);if(n){e.stopPropagation();let r=n.dataset.value;L.value=r,nt(r),R.classList.remove(`show`),chrome.storage.local.set({imageApiBase:r}),G(`✅ `+t(`settings.imageApiBaseSwitched`),`info`)}}),document.addEventListener(`click`,function(e){!R.contains(e.target)&&e.target!==L&&R.classList.remove(`show`)}),L.addEventListener(`blur`,function(){let e=this.value.trim();e&&(chrome.storage.local.set({imageApiBase:e}),Qe(e),nt(e))}),L.addEventListener(`input`,function(){let e=this.value.trim().toLowerCase();R.classList.add(`show`);let t=R.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 z=document.getElementById(`addImageApiBaseToggleBtn`),fe=document.getElementById(`addImageApiBaseForm`),B=document.getElementById(`addImageApiBaseUrl`),pe=document.getElementById(`addImageApiBaseLabel`),me=document.getElementById(`confirmAddImageApiBaseBtn`),he=document.getElementById(`cancelAddImageApiBaseBtn`);z&&fe&&(z.addEventListener(`click`,function(){let e=fe.style.display!==`none`;fe.style.display=e?`none`:``,z.textContent=t(e?`settings.addAddress`:`settings.collapse`),e||(B.value=``,pe.value=``,B.focus())}),he.addEventListener(`click`,function(){fe.style.display=`none`,z.textContent=t(`settings.addAddress`),B.value=``,pe.value=``}),me.addEventListener(`click`,function(){let e=B.value.trim(),n=pe.value.trim();if(!e){G(`❌ `+t(`settings.apiBaseRequired`),`error`);return}try{new URL(e)}catch{G(`❌ `+t(`settings.urlInvalid`),`error`);return}Qe(e,n),L.value=e,nt(e),chrome.storage.local.set({imageApiBase:e}),fe.style.display=`none`,z.textContent=t(`settings.addAddress`),B.value=``,pe.value=``,G(`✅ `+t(`settings.imageApiBaseAdded`),`success`)}),B.addEventListener(`keydown`,function(e){e.key===`Enter`&&me.click()}),pe.addEventListener(`keydown`,function(e){e.key===`Enter`&&me.click()}));let ge=document.getElementById(`imageApiKey`),Ce=document.getElementById(`toggleImageApiKeyBtn`);if(ge&&ge.addEventListener(`blur`,function(){chrome.storage.local.set({imageApiKey:re(this.value.trim())})}),ge&&Ce){let e=Ce.querySelector(`.icon-eye-open`),t=Ce.querySelector(`.icon-eye-closed`);Ce.addEventListener(`click`,function(){ge.type===`password`?(ge.type=`text`,e.style.display=`none`,t.style.display=`block`):(ge.type=`password`,e.style.display=`block`,t.style.display=`none`)})}let H=document.getElementById(`toggleToken`),we=document.getElementById(`apiKey`),Te=H.querySelector(`.icon-eye-open`),De=H.querySelector(`.icon-eye-closed`);H.addEventListener(`click`,function(){we.type===`password`?(we.type=`text`,Te.style.display=`none`,De.style.display=`block`):(we.type=`password`,Te.style.display=`block`,De.style.display=`none`)});let Oe=document.getElementById(`resetSystemPromptBtn`);Oe&&Oe.addEventListener(`click`,function(){document.getElementById(`systemPrompt`).value=ce()});let je=document.getElementById(`toolbarIconOnly`);je&&je.addEventListener(`change`,function(){mt()});let Me=document.getElementById(`enableSelectionToolbar`),Ne=document.getElementById(`toolbarConfig`),Pe=document.getElementById(`toolbarToggleLabel`);function Ve(){let e=Me&&Me.checked;Ne&&(e?Ne.classList.remove(`disabled`):Ne.classList.add(`disabled`)),Pe&&(Pe.textContent=t(e?`common.enabled`:`common.disabled`))}Me&&Me.addEventListener(`change`,function(){Ve(),mt()}),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`:$=ht($,r,-1),Qi();break;case`moveDown`:$=ht($,r,1),Qi();break;case`edit`:_t($,r);break;case`delete`:$=gt($,r),Qi()}}),document.getElementById(`addCustomToolBtn`).addEventListener(`click`,function(){_t($,-1)}),document.getElementById(`domainAddBtn`).addEventListener(`click`,function(){let e=document.getElementById(`domainAddInput`);Ct(e.value,t=>{t.error?G(`❌ `+t.error,`error`):e.value=``})}),document.getElementById(`domainAddInput`).addEventListener(`keydown`,function(e){e.key===`Enter`&&Ct(this.value,e=>{e.error?G(`❌ `+e.error,`error`):this.value=``})}),document.getElementById(`domainBlocklistList`).addEventListener(`click`,function(e){let t=e.target.closest(`.domain-blocklist-item-remove`);t&&wt(t.dataset.domain)}),xt(),chrome.storage.onChanged.addListener((e,t)=>{t===`local`&&e.blockedDomains&&xt()}),document.getElementById(`toolEditCancel`).addEventListener(`click`,function(){vt()}),document.getElementById(`toolEditClose`).addEventListener(`click`,function(){vt()}),document.getElementById(`toolEditSave`).addEventListener(`click`,function(){let e=yt($);if(e.error){G(`❌ `+e.error,`error`);return}$=e.tools,Qi()});let Ue=document.getElementById(`reflectionEnabled`),U=document.getElementById(`reflectionConfig`),Ge=document.getElementById(`reflectionToggleLabel`);function Je(){if(!U)return;let e=Ue&&Ue.checked;e?U.classList.remove(`disabled`):U.classList.add(`disabled`),Ge&&(Ge.textContent=t(e?`common.enabled`:`common.disabled`))}function Ye(e,t){let n=document.getElementById(e),r=document.getElementById(t);!n||!r||(r.checked?n.classList.remove(`disabled`):n.classList.add(`disabled`))}Ue&&(Ue.addEventListener(`change`,function(){Je();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})})}),Je());function W(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 Ze=document.getElementById(`postReflectionEnabled`);Ze&&Ze.addEventListener(`change`,function(){Ye(`postReflectionSection`,`postReflectionEnabled`),W(`postReflection`,this.checked)});let et=document.getElementById(`subtaskReflectionEnabled`);et&&et.addEventListener(`change`,function(){Ye(`subtaskReflectionSection`,`subtaskReflectionEnabled`),W(`subtaskReflection`,this.checked)}),Je(),Ye(`postReflectionSection`,`postReflectionEnabled`),Ye(`subtaskReflectionSection`,`subtaskReflectionEnabled`);let tt=document.getElementById(`streamEnabled`),it=document.getElementById(`streamEnabledLabel`);function at(){let e=document.getElementById(`streamExpandToolsWrap`);e&&(e.style.display=tt&&tt.checked?`block`:`none`)}tt&&it&&(tt.addEventListener(`change`,function(){it&&(it.textContent=tt.checked?t(`common.enabled`):t(`common.disabled`)),chrome.storage.local.set({streamEnabled:tt.checked}),at()}),it&&(it.textContent=tt.checked?t(`common.enabled`):t(`common.disabled`)),at());let ot=document.getElementById(`streamExpandTools`),st=document.getElementById(`streamExpandToolsLabel`);ot&&st&&(ot.addEventListener(`change`,function(){st.textContent=this.checked?t(`common.enabled`):t(`common.disabled`),chrome.storage.local.set({streamExpandTools:this.checked})}),st.textContent=ot.checked?t(`common.enabled`):t(`common.disabled`));let ct=document.getElementById(`toolConfirmationEnabled`),ut=document.getElementById(`toolConfirmationEnabledLabel`);ct&&ut&&(ct.addEventListener(`change`,function(){ut.textContent=this.checked?t(`common.enabled`):t(`common.disabled`),chrome.storage.local.set({toolConfirmationEnabled:this.checked})}),ut.textContent=ct.checked?t(`common.enabled`):t(`common.disabled`));let pt=document.getElementById(`enableExecutionLog`),bt=document.getElementById(`enableExecutionLogLabel`);pt&&bt&&(pt.addEventListener(`change`,function(){bt.textContent=this.checked?t(`common.enabled`):t(`common.disabled`),chrome.storage.local.set({enableExecutionLog:this.checked})}),bt.textContent=pt.checked?t(`common.enabled`):t(`common.disabled`));let St=document.getElementById(`completionSoundEnabled`);St&&St.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 Dt=document.getElementById(`scheduledNotificationEnabled`);Dt&&Dt.addEventListener(`change`,function(){chrome.storage.local.set({scheduledNotificationEnabled:this.checked})});let Ot=document.getElementById(`interactionNotificationEnabled`);Ot&&Ot.addEventListener(`change`,function(){chrome.storage.local.set({interactionNotificationEnabled:this.checked})});let kt=document.getElementById(`showMessageTimestamp`);kt&&kt.addEventListener(`change`,function(){chrome.storage.local.set({showMessageTimestamp:this.checked})}),$i(),document.getElementById(`exportConfigBtn`).addEventListener(`click`,jt),document.getElementById(`importConfigBtn`).addEventListener(`click`,Ft),document.getElementById(`importConfigFile`).addEventListener(`change`,function(e){e.target.files&&e.target.files.length>0&&Lt(e.target.files[0])}),zt(),ir(),Fr(),Pi()});function Qi(){chrome.storage.local.set({toolbarTools:$},()=>{ft($),mt()})}function $i(){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
730
|
<div class="paired-agent-item${n?` active`:``}${i?` disabled`:``}" data-agent-id="${e.id}">
|
|
710
731
|
<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">${
|
|
732
|
+
<span class="paired-agent-name" data-agent-id="${e.id}" data-original="${A(e.name)}" title="${t(`agentConfig.clickToEditName`)}">${A(e.name)}</span>
|
|
733
|
+
<span class="paired-agent-url">${A(e.url)}</span>
|
|
713
734
|
<span class="paired-agent-status-text ${s}">${o}</span>
|
|
714
735
|
<div class="paired-agent-actions">
|
|
715
736
|
${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
737
|
${i?``:`<button class="paired-agent-btn disable-btn" data-action="disable" data-id="${e.id}">${t(`agentConfig.disable`)}</button>`}
|
|
717
738
|
<button class="paired-agent-btn delete-btn" data-action="delete" data-id="${e.id}">${t(`common.delete`)}</button>
|
|
718
739
|
</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(()=>{}),W(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 en(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(()=>{}),W(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}),W(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}),W(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){W(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=``),W(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`)})),W(e.error||t(`agentConfig.pairFailedShort`),`error`)}catch(e){O(`disconnected`,t(`agentConfig.connectFailed`)),W(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`)),W(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-
|
|
740
|
+
</div>`}).join(``),S(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 S(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 C(r):n===`deactivate`?await ce(r):n===`disable`?await w(r):n===`enable`?await T(r):n===`delete`&&await ee(r)})})}async function C(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 te(r.url,h(r.token)),chrome.runtime.sendMessage({type:`AGENT_CONNECTION_CHANGED`,connected:!0,agentId:n}).catch(()=>{}),G(t(`agentConfig.connectedTo`,{name:r.name}),`success`),await y(),Y().catch(()=>{}))}async function ee(e){let n=await chrome.storage.local.get([`pairedAgents`,`activeAgentId`]),r=n.pairedAgents||[],i=r.find(t=>t.id===e);if(!i||!await sn(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(()=>{}),G(t(`agentConfig.agentDeleted`,{name:i.name}),`info`),await y(),await E(),o!==n.activeAgentId&&Y().catch(()=>{})}async function w(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}),G(t(`agentConfig.agentDisabledToast`,{name:i.name}),`info`),await y(),await E(),n.activeAgentId===e&&Y().catch(()=>{})}async function T(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}),G(t(`agentConfig.agentEnabledToast`,{name:n[r].name}),`success`),await y())}async function te(e,n){j(`checking`,t(`agentConfig.fetchingAgentInfo`));try{let r=await fetch(`${e}/api/status`,{cache:`no-cache`});if(!r.ok){j(`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=se(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}`),j(`connected`,t.join(` | `),e)}else j(`disconnected`,t(`agentConfig.tokenExpired`))}catch{j(`disconnected`,t(`agentConfig.tokenExpired`))}}catch{j(`disconnected`,t(`agentConfig.cannotConnectAgent`))}}async function E(){let n=await chrome.storage.local.get([`pairedAgents`,`activeAgentId`]),r=n.pairedAgents||[],i=n.activeAgentId;if(!i||r.length===0){j(`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 te(a.url,h(a.token)))}function D(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 ne(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 ie(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 ae(e){return e==null||e<0?`-`:e<1e3?e+`μs`:e<1e6?(e/1e3).toFixed(1)+`ms`:(e/1e6).toFixed(2)+`s`}function O(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 k(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=${A(String(e.pid))}`:``,a=O(e.duration);return[`<code>${A(r)}</code>`,i,A(a)].filter(Boolean).join(` · `)}).join(`<br>`)}function oe(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">${A(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">${A(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">${A(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">${A(e.hostname)}</span></div>`),e.shell&&n.push(`<div class="detail-row"><span class="detail-label">Shell</span><span class="detail-value">${A(e.shell)}</span></div>`),e.homeDir&&n.push(`<div class="detail-row"><span class="detail-label">${t(`agentConfig.detailHomeDir`)}</span><span class="detail-value">${A(e.homeDir)}</span></div>`),e.nodeVersion&&n.push(`<div class="detail-row"><span class="detail-label">Node.js</span><span class="detail-value">${A(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">${k(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">${ie(r.uptimeSeconds)}</span></div>`),n.push(`<div class="detail-row"><span class="detail-label">${t(`agentConfig.detailCpuUser`)}</span><span class="detail-value">${ae(r.cpuUser)}</span></div>`),n.push(`<div class="detail-row"><span class="detail-label">${t(`agentConfig.detailCpuSystem`)}</span><span class="detail-value">${ae(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">${ne(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">${D(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">${D(e.fileMaxSize)}</span></div>`),e.allowedPaths&&e.allowedPaths.length>0){let r=e.allowedPaths.map(e=>`<code>${A(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 A(e){let t=document.createElement(`div`);return t.textContent=e,t.innerHTML}function j(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})),oe(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 se(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 M(){let a=e.value.trim()||`http://127.0.0.1:18910`,o=n.value.trim();if(!o||o.length!==6){G(t(`agentConfig.pairCodeRequired`),`warning`);return}j(`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:re(s.token)}),await chrome.storage.local.set({pairedAgents:c,activeAgentId:o}),n.value=``,r&&(r.value=``),G(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=se(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}`),j(`connected`,r.join(` | `),e)}}catch{}await y(),chrome.runtime.sendMessage({type:`AGENT_CONNECTION_CHANGED`,connected:!0,agentId:o}).catch(()=>{})}else j(`disconnected`,t(`agentConfig.pairFailed`,{error:e.error||t(`agentConfig.unknownError`)})),G(e.error||t(`agentConfig.pairFailedShort`),`error`)}catch(e){j(`disconnected`,t(`agentConfig.connectFailed`)),G(t(`agentConfig.cannotConnectAgentMsg`,{error:e.message}),`error`)}finally{i.disabled=!1,i.textContent=t(`agentConfig.connect`)}}async function ce(e){(await chrome.storage.local.get([`pairedAgents`,`activeAgentId`])).activeAgentId===e&&(await chrome.storage.local.set({activeAgentId:null}),j(`disconnected`,t(`agentConfig.notConnectedSelect`)),G(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`,M),n.addEventListener(`keydown`,e=>{e.key===`Enter`&&M()}),(async()=>{await y(),await E()})(),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 E(),Y().catch(()=>{})})()}),window.addEventListener(`beforeunload`,()=>{chrome.runtime.sendMessage({type:`OPTIONS_PAGE_CLOSED`}).catch(()=>{})})}
|
|
741
|
+
//# sourceMappingURL=options-DY3JyOL8.js.map
|