ai-helper-agent 2.0.0 → 2.2.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 +28 -5
- package/README.zh-CN.md +28 -5
- package/bin/agent.js +150 -0
- package/dist/assets/{agent-store-BFaBECYz.js → agent-store-DOyMdB_7.js} +2 -2
- package/dist/assets/{agent-store-BFaBECYz.js.map → agent-store-DOyMdB_7.js.map} +1 -1
- package/dist/assets/background.js +86 -87
- package/dist/assets/background.js.map +1 -1
- package/dist/assets/content.js +84 -80
- package/dist/assets/{i18n-CohqPkkN.js → i18n-MmYITlVj.js} +9 -7
- package/dist/assets/i18n-MmYITlVj.js.map +1 -0
- package/dist/assets/model-profiles-CV_sUuPf.js +25 -0
- package/dist/assets/model-profiles-CV_sUuPf.js.map +1 -0
- package/dist/assets/options-Df_1Dtn8.css +1 -0
- package/dist/assets/options.js +78 -63
- package/dist/assets/options.js.map +1 -1
- package/dist/assets/page-snapshot-renderer-CE53ibi-.js +4 -0
- package/dist/assets/page-snapshot-renderer-CE53ibi-.js.map +1 -0
- package/dist/assets/session-store-B0ZPGm7d.js +77 -0
- package/dist/assets/session-store-B0ZPGm7d.js.map +1 -0
- package/dist/assets/side_panel.css +1 -1
- package/dist/assets/side_panel.js +478 -439
- package/dist/assets/side_panel.js.map +1 -1
- package/dist/icons/badges/version.svg +4 -4
- package/dist/manifest.json +6 -3
- package/dist/offscreen/offscreen.js +10 -8
- package/dist/options.html +3 -12
- package/dist/side_panel.html +120 -32
- package/package.json +1 -1
- package/src/install-mode.js +128 -0
- package/src/locales/cli.json +24 -0
- package/src/rag/install.js +4 -0
- package/src/server.js +3 -1
- package/dist/assets/i18n-CohqPkkN.js.map +0 -1
- package/dist/assets/model-profiles-BS2LIjxf.js +0 -2
- package/dist/assets/model-profiles-BS2LIjxf.js.map +0 -1
- package/dist/assets/options-CE9-fjJV.css +0 -1
- package/dist/assets/session-store-DwXNnVF5.js +0 -100
- package/dist/assets/session-store-DwXNnVF5.js.map +0 -1
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-MmYITlVj.js";import{D as l,N as u,X as d,Y as f,_ as p,a as m,c as h,d as g,g as _,h as v,i as y,m as ee,n as te,o as b,p as ne,q as re,r as x,s as S,t as C,u as ie,v as w}from"./model-profiles-CV_sUuPf.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,22 @@ 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-Coh
|
|
|
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 w=[`deepseek-v4-pro`,`deepseek-v4-flash`],T=[`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`],E=u,D=[{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}],ie={"ai-search":`optionsConst.aiSearch`,explain:`optionsConst.explain`,translate:`optionsConst.translate`,summary:`optionsConst.summary`,copy:`optionsConst.copy`};function ae(e){let n=ie[e];return n?t(n):void 0}var oe={"ai-search":`selToolbar.sysPromptAisearch`,explain:`selToolbar.sysPromptExplain`,translate:`selToolbar.sysPromptTranslate`,summary:`selToolbar.sysPromptSummary`,copy:`selToolbar.sysPromptCopy`};function O(e){let n=oe[e];return n?t(n):void 0}function k(){return t(`optionsConst.defaultSystemPrompt`)}var se={maxInputHistory:20,maxHistoryMessages:50,...l},A=`deepseek-v4-pro`;function ce(e){A=e}var le=``;function ue(e){le=e}function de(e){let t=document.createElement(`span`);t.className=`model-option-left`;let n=[];for(let t of[...e.childNodes])t.nodeType===Node.TEXT_NODE&&n.push(t);n.forEach(e=>{t.appendChild(e)}),e.insertBefore(t,e.firstChild)}function fe(e,n){let r=document.getElementById(`modelDropdown`),i=r.querySelector(`.model-option[data-value="${e}"]`);if(i){if(n&&n>0){i.dataset.contextWindow=n,i.dataset.isCustom=`true`;let e=i.querySelector(`.model-option-left`);e||=(de(i),i.querySelector(`.model-option-left`));let r=i.querySelector(`.model-option-right`);if(!r){r=document.createElement(`span`),r.className=`model-option-right`;let e=i.querySelector(`:scope > .model-ctx-badge`);e&&r.appendChild(e);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)}let a=r.querySelector(`.model-ctx-badge`);if(a)a.textContent=M(n);else{let e=document.createElement(`span`);e.className=`model-ctx-badge`,e.textContent=M(n),r.insertBefore(e,r.firstChild)}P()}return}j(r,pe(e,n||0),e),P()}function pe(e,n=0){let r=document.createElement(`div`);r.className=`model-option`,r.dataset.value=e,(!w.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`);if(a.className=`model-option-right`,n&&n>0){let e=document.createElement(`span`);e.className=`model-ctx-badge`,e.textContent=M(n),a.appendChild(e)}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),r}function j(e,t,n){let r=[...e.querySelectorAll(`.model-option`)].find(e=>_(e.dataset.value,n)>0);r?e.insertBefore(t,r):e.appendChild(t)}function me(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 he(e){let t=document.getElementById(`modelDropdown`),n=t.querySelector(`.model-option[data-value="${e}"]`);if(n&&n.remove(),A===e){let e=t.querySelector(`.model-option`),n=e?e.dataset.value:``;ce(n);let r=document.getElementById(`modelInput`);r&&(r.value=n),ve(n)}P()}function M(e){return e>=1e6?Math.round(e/1e6*10)/10+`M`:e>=1e3?Math.round(e/1e3)+`K`:String(e)}function N(){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 P(){let e=N();chrome.storage.local.set({customModels:e},()=>{r.debug(`[Options] customModel list saved:`,e),d(e)})}function ge(e){chrome.storage.local.get([`customModels`],t=>{_e(y(t.customModels)),typeof e==`function`&&e()})}function _e(e,t){let n=document.getElementById(`modelDropdown`);if(!n)return;n.innerHTML=``;let r=[...e||[]].sort((e,t)=>_(e?.name,t?.name));for(let e of r)n.appendChild(pe(e.name,e.contextWindow||0));let i=t===void 0?A:t;n.querySelectorAll(`.model-option`).forEach(e=>{e.classList.toggle(`selected`,e.dataset.value===i)})}function ve(e){document.querySelectorAll(`.model-option`).forEach(t=>{t.dataset.value===e?t.classList.add(`selected`):t.classList.remove(`selected`)}),ye(`modelInput`,`modelSelectedCtxBadge`,`modelDropdown`)}function ye(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=M(e),i.style.display=``):i.style.display=`none`}else i.style.display=`none`}function be(e,n){let r=document.getElementById(`imageModelDropdown`);if(!r)return;let i=r.querySelector(`.model-option[data-value="${e}"]`);if(i){if(n&&n>0){i.dataset.contextWindow=n;let e=i.querySelector(`.model-option-left`);e||=(de(i),i.querySelector(`.model-option-left`));let t=i.querySelector(`.model-option-right`);if(!t){t=document.createElement(`span`),t.className=`model-option-right`;let e=i.querySelector(`:scope > .model-ctx-badge`);e&&t.appendChild(e);let n=i.querySelector(`:scope > .delete-model-btn`);n&&t.appendChild(n),i.appendChild(t)}let r=t.querySelector(`.model-ctx-badge`);if(r)r.textContent=M(n);else{let e=document.createElement(`span`);e.className=`model-ctx-badge`,e.textContent=M(n),t.insertBefore(e,t.firstChild)}}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`);if(s.className=`model-option-right`,n&&n>0){let e=document.createElement(`span`);e.className=`model-ctx-badge`,e.textContent=M(n),s.appendChild(e)}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),j(r,a,e),Se()}function xe(e){let t=document.getElementById(`imageModelDropdown`);if(!t)return;let n=t.querySelector(`.model-option[data-value="${e}"]`);if(n&&n.remove(),le===e){let e=t.querySelector(`.model-option`),n=e?e.dataset.value:``;ue(n);let r=document.getElementById(`imageModelInput`);r&&(r.value=n),Ce(n)}Se()}function Se(){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 F(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;i.innerHTML=``;let s=e=>typeof e==`string`?e:e&&e.name||``;[...a].sort((e,t)=>_(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`);if(c.className=`model-option-right`,r&&r>0){let e=document.createElement(`span`);e.className=`model-ctx-badge`,e.textContent=M(r),c.appendChild(e)}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),i.appendChild(a)}),o&&(Se(),r.debug(`[Options] image recognitionmodelauto-migratedisnewformat`)),typeof e==`function`&&e()})}function Ce(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`)}),ye(`imageModelInput`,`imageModelSelectedCtxBadge`,`imageModelDropdown`))}var I=[];function L(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 we(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)}R();return}T.includes(e)&&I.includes(e)&&(I=I.filter(t=>t!==e));let i=L(e,t,!T.includes(e));n.appendChild(i),R()}function Te(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)&&!I.includes(e)&&I.push(e);let r=document.getElementById(`apiBase`);r&&r.value.trim()===e&&(r.value=``),R()}function R(){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:I},()=>{r.debug(`[Options] API Base URL column table saved:`,t,`deletedpreset:`,I)})}function z(e){chrome.storage.local.get([`customApiBases`,`deletedPresetApiBases`],t=>{let n=document.getElementById(`apiBaseDropdown`);if(!n){typeof e==`function`&&e();return}I=t.deletedPresetApiBases||[];let r=t.customApiBases||[];n.innerHTML=``,T.forEach(e=>{if(!I.includes(e)){let t=L(e,null,!1);n.appendChild(t)}}),r.forEach(e=>{if(typeof e==`string`){if(!T.includes(e)){let t=L(e,null,!0);n.appendChild(t)}}else if(e&&e.url){let t=L(e.url,e.label||null,!0);n.appendChild(t)}}),typeof e==`function`&&e()})}function Ee(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 B=[];function De(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 Oe(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)}Ae();return}T.includes(e)&&B.includes(e)&&(B=B.filter(t=>t!==e));let i=De(e,t,!T.includes(e));n.appendChild(i),Ae()}function ke(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)&&!B.includes(e)&&B.push(e);let r=document.getElementById(`imageApiBase`);r&&r.value.trim()===e&&(r.value=``),Ae()}function Ae(){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:B},()=>{r.debug(`[Options] image API Base URL column table saved:`,t)})}function je(e){chrome.storage.local.get([`customImageApiBases`,`deletedPresetImageApiBases`],t=>{let n=document.getElementById(`imageApiBaseDropdown`);if(!n){typeof e==`function`&&e();return}B=t.deletedPresetImageApiBases||[];let r=t.customImageApiBases||[];n.innerHTML=``,T.forEach(e=>{if(!B.includes(e)){let t=De(e,null,!1);n.appendChild(t)}}),r.forEach(e=>{if(typeof e==`string`){if(!T.includes(e)){let t=De(e,null,!0);n.appendChild(t)}}else if(e&&e.url){let t=De(e.url,e.label||null,!0);n.appendChild(t)}}),typeof e==`function`&&e()})}function Me(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 Ne(){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&&(ce(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){ue(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?se.enableExecutionLog:e.enableExecutionLog,document.getElementById(`enableExecutionLog`).dispatchEvent(new Event(`change`));let c=e.reflectionConfig||v;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`),d=document.getElementById(`streamExpandToolsWrap`);l&&(l.checked=e.streamExpandTools===!0),u&&(u.textContent=l?.checked?t(`common.enabled`):t(`common.disabled`)),d&&(d.style.display=e.streamEnabled===void 0||e.streamEnabled?`block`:`none`);function f(){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 p=document.getElementById(`completionSoundEnabled`),m=document.getElementById(`completionConfettiEnabled`);p&&(p.checked=e.completionSoundEnabled!==!1),m&&(m.checked=e.completionConfettiEnabled!==!1);let h=document.getElementById(`completionNotificationEnabled`),g=document.getElementById(`scheduledNotificationEnabled`),_=document.getElementById(`interactionNotificationEnabled`);h&&(h.checked=e.completionNotificationEnabled!==!1),g&&(g.checked=e.scheduledNotificationEnabled!==!1),_&&(_.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})})),ge(()=>{e.modelName&&ve(e.modelName),f()}),F(()=>{e.imageModelName&&Ce(e.imageModelName)}),z(()=>{e.apiBase&&Ee(e.apiBase)}),je(()=>{e.imageApiBase&&Me(e.imageApiBase)})})}function Pe(){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,d=document.getElementById(`streamExpandTools`)?.checked===!0,f=document.getElementById(`completionSoundEnabled`)?.checked!==!1,p=document.getElementById(`completionConfettiEnabled`)?.checked!==!1,m=document.getElementById(`completionNotificationEnabled`)?.checked!==!1,h=document.getElementById(`scheduledNotificationEnabled`)?.checked!==!1,g=document.getElementById(`interactionNotificationEnabled`)?.checked!==!1,_=document.getElementById(`showMessageTimestamp`)?.checked!==!1,y=document.getElementById(`enableImageInput`)?.checked||!1,ee=le||``,te=document.getElementById(`imageApiBase`)?.value.trim()||``,b=document.getElementById(`imageApiKey`)?.value.trim()||``,ne={enabled:document.getElementById(`reflectionEnabled`).checked,postReflection:{...v.postReflection,enabled:document.getElementById(`postReflectionEnabled`).checked},toolReflection:{...v.toolReflection,enabled:document.getElementById(`toolReflectionEnabled`).checked},subtaskReflection:{...v.subtaskReflection,enabled:document.getElementById(`subtaskReflectionEnabled`).checked}};if(i<10||i>1e3){V(`❌ ${t(`settings.maxIterationsRangeError`)}`,`error`);return}if(a<6e4||a>6e5){V(`❌ ${t(`settings.apiTimeoutRangeError`)}`,`error`);return}if(o<6e4||o>72e5){V(`❌ ${t(`settings.loopTimeoutRangeError`)}`,`error`);return}if(s<6e4||s>18e5){V(`❌ ${t(`settings.toolTimeoutRangeError`)}`,`error`);return}if(e||=`https://api.deepseek.com`,!n){V(`❌ ${t(`settings.apiKeyEmpty`)}`,`error`);return}chrome.storage.local.set({apiBase:e,apiKey:n,modelName:A||`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:d,completionSoundEnabled:f,completionConfettiEnabled:p,completionNotificationEnabled:m,scheduledNotificationEnabled:h,interactionNotificationEnabled:g,showMessageTimestamp:_,sidePanelScope:document.querySelector(`input[name="sidePanelScope"]:checked`)?.value||`global`,autoGroupTabs:document.getElementById(`autoGroupTabs`)?.checked!==!1},async function(){if(chrome.runtime.lastError)V(`❌ ${t(`settings.saveFailed`,{message:chrome.runtime.lastError.message})}`,`error`);else{C({apiBase:e,apiKey:n,modelName:A||`deepseek-v4-pro`,models:N()}),V(`✅ ${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 V(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 Fe(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 H=class extends Error{constructor(e,{status:t,reason:n}={}){super(e),this.name=`FetchModelsError`,this.status=t,this.reason=n}};function Ie(e){return`${String(e).trim().replace(/\/+$/,``)}/models`}function Le(e){return/anthropic\.com/i.test(String(e||``))}async function Re({apiBase:e,apiKey:t,timeoutMs:n=15e3}={}){let r=(e||``).trim(),i=(t||``).trim();if(!r||!i)throw new H(`missing apiBase or apiKey`,{reason:`invalid-config`});let a={Authorization:`Bearer ${i}`};Le(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(Ie(r),{method:`GET`,headers:a,signal:o.signal})}catch(e){throw clearTimeout(s),e&&e.name===`AbortError`?new H(`request timeout`,{reason:`timeout`}):new H(e&&e.message||`network error`,{reason:`network`})}if(clearTimeout(s),!c.ok)throw new H(`HTTP ${c.status}`,{status:c.status,reason:`http`});let l;try{l=await c.json()}catch{throw new H(`invalid JSON`,{reason:`parse`})}let u=Fe(l);if(!u.length)throw new H(`no models parsed`,{reason:`parse`});return u}var ze=-1;function Be(){return new Promise(e=>{chrome.storage.local.get([`toolbarTools`,`toolbarIconOnly`,`enableSelectionToolbar`],t=>{let n=t.toolbarTools&&t.toolbarTools.length>0?t.toolbarTools:[...D],r=t.toolbarIconOnly!==void 0&&t.toolbarIconOnly,i=t.enableSelectionToolbar===void 0||t.enableSelectionToolbar,a=new Map(D.map(e=>[e.id,e])),o=n.map(e=>{if(e.builtin&&a.has(e.id)){let t=ae(e.id),n=O(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 Ve(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&&ae(e.id)||e.name,o=i?`<span class="tool-badge builtin">${t(`toolbar.builtinBadge`)}</span>`:`<span class="tool-badge custom">${t(`toolbar.customBadge`)}</span>`,s=e.systemPrompt?`<div class="tool-prompt-preview" title="${U(e.systemPrompt)}">${U(e.systemPrompt)}</div>`:``,c=n===0,l=n===r.length-1,u=``;return i||(u+=`<button class="tool-action-btn" data-action="edit" data-index="${n}">${t(`common.edit`)}</button>`,u+=`<button class="tool-action-btn danger" data-action="delete" data-index="${n}">${t(`common.delete`)}</button>`),`
|
|
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`],T=[`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`],E=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}],se={"ai-search":`optionsConst.aiSearch`,explain:`optionsConst.explain`,translate:`optionsConst.translate`,summary:`optionsConst.summary`,copy:`optionsConst.copy`};function D(e){let n=se[e];return n?t(n):void 0}var O={"ai-search":`selToolbar.sysPromptAisearch`,explain:`selToolbar.sysPromptExplain`,translate:`selToolbar.sysPromptTranslate`,summary:`selToolbar.sysPromptSummary`,copy:`selToolbar.sysPromptCopy`};function ce(e){let n=O[e];return n?t(n):void 0}function le(){return t(`optionsConst.defaultSystemPrompt`)}var ue={maxInputHistory:20,maxHistoryMessages:50,...re},k=[1e3,2e3,4e3,8e3,16e3,32e3,64e3,128e3,2e5,256e3,512e3,1e6],A=k.length-1;function de(e){let t=Number(e)||0,n=0,r=1/0;for(let e=0;e<k.length;e++){let i=Math.abs(k[e]-t);i<r&&(r=i,n=e)}return n}function fe(e){return k[Math.min(Math.max(Math.round(Number(e)||0),0),A)]}var j=null,M=null,pe=null,me=null,N=null,P=[],F=null;function he(){j=document.createElement(`div`),j.className=`ctx-popover`,j.setAttribute(`role`,`dialog`),j.setAttribute(`aria-label`,t(`settings.ctxSliderIconTitle`)),j.innerHTML=`
|
|
14
|
+
<div class="ctx-popover-title-row">
|
|
15
|
+
<span class="ctx-popover-title"></span>
|
|
16
|
+
<button type="button" class="ctx-popover-auto-btn"></button>
|
|
17
|
+
</div>
|
|
18
|
+
<div class="ctx-popover-value-row">
|
|
19
|
+
<span class="ctx-popover-value"></span>
|
|
20
|
+
<span class="ctx-popover-auto-tag"></span>
|
|
21
|
+
</div>
|
|
22
|
+
<input type="range" class="ctx-popover-slider" min="0" max="${A}" step="1">
|
|
23
|
+
<div class="ctx-popover-scale" aria-hidden="true"></div>
|
|
24
|
+
<div class="ctx-popover-scale-labels" aria-hidden="true">
|
|
25
|
+
<span class="ctx-popover-scale-start"></span>
|
|
26
|
+
<span class="ctx-popover-scale-end"></span>
|
|
27
|
+
</div>
|
|
28
|
+
`,M=j.querySelector(`.ctx-popover-slider`),pe=j.querySelector(`.ctx-popover-value`),me=j.querySelector(`.ctx-popover-auto-tag`),N=j.querySelector(`.ctx-popover-auto-btn`);let e=j.querySelector(`.ctx-popover-scale`);for(let t=0;t<k.length;t++){let t=document.createElement(`span`);t.className=`ctx-popover-scale-dot`,e.appendChild(t)}P=[...e.children],j.querySelector(`.ctx-popover-scale-start`).textContent=l(k[0]),j.querySelector(`.ctx-popover-scale-end`).textContent=l(k[A]),N.textContent=t(`settings.ctxSliderResetAuto`),N.title=t(`settings.ctxSliderAutoTitle`),me.textContent=t(`settings.ctxSliderAuto`),M.addEventListener(`pointerdown`,()=>{if(!F)return;let e=parseInt(F.optionEl.dataset.contextWindow,10)||0;F.drag={originTokens:e,originIndex:de(e||u(F.optionEl.dataset.value)),moved:!1}}),M.addEventListener(`input`,()=>{if(!F)return;F.drag&&(F.drag.moved=!0);let e=fe(M.value);I(e,!1),F.callbacks.onPreview?.(e)}),M.addEventListener(`change`,()=>{F&&F.callbacks.onCommit?.(fe(M.value))}),N.addEventListener(`click`,()=>{F&&(F.callbacks.onReset?.(),I(u(F.optionEl.dataset.value),!0))})}function I(e,t){let n=de(e);M.value=String(n),pe.textContent=l(e),pe.classList.toggle(`is-auto`,t),me.style.display=t?``:`none`,N.style.display=t?`none`:``,P.forEach((e,t)=>e.classList.toggle(`is-active`,t===n));let r=(n/A*100).toFixed(1)+`%`;M.style.setProperty(`--ctx-fill`,r)}function ge(e){!e||!e.moved||!F||(F.callbacks.onPreview?.(e.originTokens),e.originTokens>0?I(e.originTokens,!1):I(u(F.optionEl.dataset.value),!0))}function _e(){let e=F.anchorBtn.getBoundingClientRect(),t=j.getBoundingClientRect(),n=e.right-t.width;n=Math.max(8,Math.min(n,window.innerWidth-t.width-8));let r=e.bottom+6;if(r+t.height>window.innerHeight-8){let n=e.top-6-t.height;r=n>=8?n:Math.max(8,window.innerHeight-t.height-8)}j.style.left=`${Math.round(n)}px`,j.style.top=`${Math.round(r)}px`}function ve(e,t,n={}){if(!e||!t)return;if(F&&F.anchorBtn===e){L();return}L();let r=parseInt(t.dataset.contextWindow,10)||0;he(),F={anchorBtn:e,optionEl:t,callbacks:n},j.querySelector(`.ctx-popover-title`).textContent=t.dataset.value||``,r>0?I(r,!1):I(u(t.dataset.value),!0),document.body.appendChild(j),_e(),M.focus({preventScroll:!0}),F.onDocClick=t=>{j.contains(t.target)||e.contains(t.target)||L()},F.onKeyDown=e=>{e.key===`Escape`&&L()},F.onScroll=()=>L(),F.onResize=()=>L(),F.onDocPointerUp=()=>{if(!F?.drag)return;let e=F.drag;if(F.drag=null,!e.moved)return;let t=Number(M.value);t===e.originIndex&&F.callbacks.onCommit?.(fe(t))},F.onDocPointerCancel=()=>{if(!F?.drag)return;let e=F.drag;F.drag=null,ge(e)},document.addEventListener(`click`,F.onDocClick,!0),document.addEventListener(`keydown`,F.onKeyDown),document.addEventListener(`scroll`,F.onScroll,!0),document.addEventListener(`pointerup`,F.onDocPointerUp,!0),document.addEventListener(`pointercancel`,F.onDocPointerCancel,!0),window.addEventListener(`resize`,F.onResize)}function L(){if(!F)return;let e=F;ge(e.drag),F=null,document.removeEventListener(`click`,e.onDocClick,!0),document.removeEventListener(`keydown`,e.onKeyDown),document.removeEventListener(`scroll`,e.onScroll,!0),document.removeEventListener(`pointerup`,e.onDocPointerUp,!0),document.removeEventListener(`pointercancel`,e.onDocPointerCancel,!0),window.removeEventListener(`resize`,e.onResize),j?.remove(),j=null,M=null,pe=null,me=null,N=null,P=[]}function ye(e){return!!(j&&e&&j.contains(e))}var R=`deepseek-v4-pro`;function be(e){R=e}var xe=``;function Se(e){xe=e}var Ce=`<svg width="14" height="14" viewBox="0 0 14 14" aria-hidden="true"><g stroke="currentColor" stroke-width="1.4" stroke-linecap="round" fill="none"><path d="M1.2 4h3.1M9.7 4h3.1M1.2 10h4.6M11.2 10h1.6"/><circle cx="7" cy="4" r="1.6"/><circle cx="8.5" cy="10" r="1.6"/></g></svg>`;function z(){let e=document.createElement(`button`);return e.type=`button`,e.className=`ctx-set-btn`,e.title=t(`settings.ctxSliderIconTitle`),e.setAttribute(`aria-label`,t(`settings.ctxSliderIconTitle`)),e.innerHTML=Ce,e}function B(e,n){let r=e.querySelector(`.model-option-right`);if(!r)return;let i=Number(n)||0,a=r.querySelector(`.model-ctx-badge`);a||(a=document.createElement(`span`),a.className=`model-ctx-badge`,r.insertBefore(a,r.firstChild)),i>0?(a.classList.remove(`is-auto`),a.textContent=l(i),a.removeAttribute(`title`)):(a.classList.add(`is-auto`),a.textContent=l(u(e.dataset.value)),a.title=t(`settings.ctxBadgeAutoTip`))}function we(e){let t=document.createElement(`span`);t.className=`model-option-left`;let n=[];for(let t of[...e.childNodes])t.nodeType===Node.TEXT_NODE&&n.push(t);n.forEach(e=>{t.appendChild(e)}),e.insertBefore(t,e.firstChild)}function Te(e,n){let r=document.getElementById(`modelDropdown`),i=r.querySelector(`.model-option[data-value="${e}"]`);if(i){if(n&&n>0){i.dataset.contextWindow=n,i.dataset.isCustom=`true`;let e=i.querySelector(`.model-option-left`);e||=(we(i),i.querySelector(`.model-option-left`));let r=i.querySelector(`.model-option-right`);if(!r){r=document.createElement(`span`),r.className=`model-option-right`;let e=i.querySelector(`:scope > .model-ctx-badge`);e&&r.appendChild(e),r.appendChild(z());let n=i.querySelector(`:scope > .delete-model-btn`);n||(n=document.createElement(`button`),n.type=`button`,n.className=`delete-model-btn`,n.title=t(`settings.deleteModel`),n.innerHTML=`×`),n.style.display=`inline-block`,r.appendChild(n),i.appendChild(r)}else if(!r.querySelector(`.ctx-set-btn`)){let e=r.querySelector(`.delete-model-btn`);e?r.insertBefore(z(),e):r.appendChild(z())}B(i,n),je()}return}De(r,Ee(e,n||0),e),je()}function Ee(e,n=0){let r=document.createElement(`div`);r.className=`model-option`,r.dataset.value=e,(!ae.includes(e)||n&&n>0)&&(r.dataset.isCustom=`true`),n&&n>0&&(r.dataset.contextWindow=n);let i=document.createElement(`span`);i.className=`model-option-left`,i.textContent=e,r.appendChild(i);let a=document.createElement(`span`);a.className=`model-option-right`,a.appendChild(z());let o=document.createElement(`button`);return o.type=`button`,o.className=`delete-model-btn`,o.title=t(`settings.deleteModel`),o.innerHTML=`×`,o.style.display=`inline-block`,a.appendChild(o),r.appendChild(a),B(r,n||0),r}function De(e,t,n){let r=[...e.querySelectorAll(`.model-option`)].find(e=>y(e.dataset.value,n)>0);r?e.insertBefore(t,r):e.appendChild(t)}function Oe(e,n){if(!e)return;let r=String(n||``).trim().toLowerCase(),i=0;e.querySelectorAll(`.model-option`).forEach(e=>{let t=!r||e.textContent.toLowerCase().includes(r);e.style.display=t?``:`none`,t&&(i+=1)});let a=e.querySelector(`.model-dropdown-empty`);r&&i===0?(a||(a=document.createElement(`div`),a.className=`model-dropdown-empty`,e.appendChild(a)),a.textContent=t(`settings.noMatch`)):a&&a.remove()}function ke(e){L();let t=document.getElementById(`modelDropdown`),n=t.querySelector(`.model-option[data-value="${e}"]`);if(n&&n.remove(),R===e){let e=t.querySelector(`.model-option`),n=e?e.dataset.value:``;be(n);let r=document.getElementById(`modelInput`);r&&(r.value=n),Pe(n)}je()}function Ae(){let e=document.getElementById(`modelDropdown`),t=[];return e?.querySelectorAll(`.model-option`).forEach(e=>{t.push({name:e.dataset.value,contextWindow:parseInt(e.dataset.contextWindow)||0})}),t}function je(){let e=Ae();chrome.storage.local.set({customModels:e},()=>{r.debug(`[Options] customModel list saved:`,e),p(e)})}function Me(e){chrome.storage.local.get([`customModels`],t=>{Ne(ee(t.customModels)),typeof e==`function`&&e()})}function Ne(e,t){let n=document.getElementById(`modelDropdown`);if(!n)return;L(),n.innerHTML=``;let r=[...e||[]].sort((e,t)=>y(e?.name,t?.name));for(let e of r)n.appendChild(Ee(e.name,e.contextWindow||0));let i=t===void 0?R:t;n.querySelectorAll(`.model-option`).forEach(e=>{e.classList.toggle(`selected`,e.dataset.value===i)})}function Pe(e){document.querySelectorAll(`.model-option`).forEach(t=>{t.dataset.value===e?t.classList.add(`selected`):t.classList.remove(`selected`)}),Fe(`modelInput`,`modelSelectedCtxBadge`,`modelDropdown`)}function Fe(e,t,n){let r=document.getElementById(e),i=document.getElementById(t),a=document.getElementById(n);if(!i||!a)return;if(r&&!r.value){i.style.display=`none`;return}let o=a.querySelector(`.model-option.selected`)||(r?a.querySelector(`.model-option[data-value="${r.value}"]`):null);if(o){let e=parseInt(o.dataset.contextWindow);e>0?(i.textContent=l(e),i.style.display=``):i.style.display=`none`}else i.style.display=`none`}function Ie(e,t){if(!e||!e.querySelector(`.model-option-right`))return;let n=Number(t)||0,r=ae.includes(e.dataset.value);n>0?(e.dataset.contextWindow=String(n),r&&(e.dataset.isCustom=`true`)):(delete e.dataset.contextWindow,r&&delete e.dataset.isCustom),B(e,n)}function Le(e,t){Ie(e,t),je(),Fe(`modelInput`,`modelSelectedCtxBadge`,`modelDropdown`)}function Re(e,n){let r=document.getElementById(`imageModelDropdown`);if(!r)return;let i=r.querySelector(`.model-option[data-value="${e}"]`);if(i){if(n&&n>0){i.dataset.contextWindow=n;let e=i.querySelector(`.model-option-left`);e||=(we(i),i.querySelector(`.model-option-left`));let t=i.querySelector(`.model-option-right`);if(!t){t=document.createElement(`span`),t.className=`model-option-right`;let e=i.querySelector(`:scope > .model-ctx-badge`);e&&t.appendChild(e),t.appendChild(z());let n=i.querySelector(`:scope > .delete-model-btn`);n&&t.appendChild(n),i.appendChild(t)}else if(!t.querySelector(`.ctx-set-btn`)){let e=t.querySelector(`.delete-model-btn`);e?t.insertBefore(z(),e):t.appendChild(z())}B(i,n),Be()}return}let a=document.createElement(`div`);a.className=`model-option`,a.dataset.value=e,n&&n>0&&(a.dataset.contextWindow=n);let o=document.createElement(`span`);o.className=`model-option-left`,o.textContent=e,a.appendChild(o);let s=document.createElement(`span`);s.className=`model-option-right`,s.appendChild(z());let c=document.createElement(`button`);c.type=`button`,c.className=`delete-model-btn`,c.title=t(`settings.deleteModel`),c.innerHTML=`×`,c.style.display=`inline-block`,s.appendChild(c),a.appendChild(s),B(a,n||0),De(r,a,e),Be()}function ze(e){L();let t=document.getElementById(`imageModelDropdown`);if(!t)return;let n=t.querySelector(`.model-option[data-value="${e}"]`);if(n&&n.remove(),xe===e){let e=t.querySelector(`.model-option`),n=e?e.dataset.value:``;Se(n);let r=document.getElementById(`imageModelInput`);r&&(r.value=n),Ue(n)}Be()}function Be(){let e=document.getElementById(`imageModelDropdown`);if(!e)return;let t=[];e.querySelectorAll(`.model-option`).forEach(e=>{t.push({name:e.dataset.value,contextWindow:parseInt(e.dataset.contextWindow)||0})}),chrome.storage.local.set({imageModels:t},()=>{r.debug(`[Options] image recognitionmodel saved:`,t)})}function Ve(e,t){Ie(e,t),Be(),Fe(`imageModelInput`,`imageModelSelectedCtxBadge`,`imageModelDropdown`)}function He(e){chrome.storage.local.get([`imageModels`],n=>{let i=document.getElementById(`imageModelDropdown`);if(!i){typeof e==`function`&&e();return}let a=n.imageModels||[],o=!1;L(),i.innerHTML=``;let s=e=>typeof e==`string`?e:e&&e.name||``;[...a].sort((e,t)=>y(s(e),s(t))).forEach(e=>{let n,r=0;if(typeof e==`string`)n=e,o=!0;else if(e&&typeof e==`object`&&e.name)n=e.name,r=e.contextWindow||0;else return;let a=document.createElement(`div`);a.className=`model-option`,a.dataset.value=n,r&&r>0&&(a.dataset.contextWindow=r);let s=document.createElement(`span`);s.className=`model-option-left`,s.textContent=n,a.appendChild(s);let c=document.createElement(`span`);c.className=`model-option-right`,c.appendChild(z());let l=document.createElement(`button`);l.type=`button`,l.className=`delete-model-btn`,l.title=t(`settings.deleteModel`),l.innerHTML=`×`,l.style.display=`inline-block`,c.appendChild(l),a.appendChild(c),B(a,r||0),i.appendChild(a)}),o&&(Be(),r.debug(`[Options] image recognitionmodelauto-migratedisnewformat`)),typeof e==`function`&&e()})}function Ue(e){let t=document.getElementById(`imageModelDropdown`);t&&(t.querySelectorAll(`.model-option`).forEach(t=>{t.dataset.value===e?t.classList.add(`selected`):t.classList.remove(`selected`)}),Fe(`imageModelInput`,`imageModelSelectedCtxBadge`,`imageModelDropdown`))}var V=[];function We(e,n,r){let i=document.createElement(`div`);i.className=`model-option`,i.dataset.value=e,n&&(i.dataset.label=n),r&&(i.dataset.isCustom=`true`);let a=document.createElement(`span`);a.className=`model-option-left`,a.textContent=n||e,i.appendChild(a);let o=document.createElement(`span`);if(o.className=`model-option-right`,n){let t=document.createElement(`span`);t.className=`api-base-url-hint`,t.textContent=e.length>50?e.substring(0,47)+`...`:e,o.appendChild(t)}let s=document.createElement(`button`);return s.type=`button`,s.className=`delete-model-btn`,s.title=t(`settings.deleteApiBase`),s.innerHTML=`×`,s.style.display=`inline-block`,o.appendChild(s),i.appendChild(o),i}function Ge(e,t){let n=document.getElementById(`apiBaseDropdown`);if(!n)return;let r=n.querySelector(`.model-option[data-value="${CSS.escape(e)}"]`);if(r){if(t){r.dataset.label=t;let e=r.querySelector(`.model-option-left`);e&&(e.textContent=t)}qe();return}T.includes(e)&&V.includes(e)&&(V=V.filter(t=>t!==e));let i=We(e,t,!T.includes(e));n.appendChild(i),qe()}function Ke(e){let t=document.getElementById(`apiBaseDropdown`);if(!t)return;let n=t.querySelector(`.model-option[data-value="${CSS.escape(e)}"]`);n&&n.remove(),T.includes(e)&&!V.includes(e)&&V.push(e);let r=document.getElementById(`apiBase`);r&&r.value.trim()===e&&(r.value=``),qe()}function qe(){let e=document.getElementById(`apiBaseDropdown`);if(!e)return;let t=[];e.querySelectorAll(`.model-option[data-is-custom="true"]`).forEach(e=>{t.push({url:e.dataset.value,label:e.dataset.label||``})}),chrome.storage.local.set({customApiBases:t,deletedPresetApiBases:V},()=>{r.debug(`[Options] API Base URL column table saved:`,t,`deletedpreset:`,V)})}function Je(e){chrome.storage.local.get([`customApiBases`,`deletedPresetApiBases`],t=>{let n=document.getElementById(`apiBaseDropdown`);if(!n){typeof e==`function`&&e();return}V=t.deletedPresetApiBases||[];let r=t.customApiBases||[];n.innerHTML=``,T.forEach(e=>{if(!V.includes(e)){let t=We(e,null,!1);n.appendChild(t)}}),r.forEach(e=>{if(typeof e==`string`){if(!T.includes(e)){let t=We(e,null,!0);n.appendChild(t)}}else if(e&&e.url){let t=We(e.url,e.label||null,!0);n.appendChild(t)}}),typeof e==`function`&&e()})}function Ye(e){let t=document.getElementById(`apiBaseDropdown`);t&&t.querySelectorAll(`.model-option`).forEach(t=>{t.dataset.value===e?t.classList.add(`selected`):t.classList.remove(`selected`)})}var H=[];function Xe(e,n,r){let i=document.createElement(`div`);i.className=`model-option`,i.dataset.value=e,n&&(i.dataset.label=n),r&&(i.dataset.isCustom=`true`);let a=document.createElement(`span`);a.className=`model-option-left`,a.textContent=n||e,i.appendChild(a);let o=document.createElement(`span`);if(o.className=`model-option-right`,n){let t=document.createElement(`span`);t.className=`api-base-url-hint`,t.textContent=e.length>50?e.substring(0,47)+`...`:e,o.appendChild(t)}let s=document.createElement(`button`);return s.type=`button`,s.className=`delete-model-btn`,s.title=t(`settings.deleteApiBase`),s.innerHTML=`×`,s.style.display=`inline-block`,o.appendChild(s),i.appendChild(o),i}function Ze(e,t){let n=document.getElementById(`imageApiBaseDropdown`);if(!n)return;let r=n.querySelector(`.model-option[data-value="${CSS.escape(e)}"]`);if(r){if(t){r.dataset.label=t;let e=r.querySelector(`.model-option-left`);e&&(e.textContent=t)}$e();return}T.includes(e)&&H.includes(e)&&(H=H.filter(t=>t!==e));let i=Xe(e,t,!T.includes(e));n.appendChild(i),$e()}function Qe(e){let t=document.getElementById(`imageApiBaseDropdown`);if(!t)return;let n=t.querySelector(`.model-option[data-value="${CSS.escape(e)}"]`);n&&n.remove(),T.includes(e)&&!H.includes(e)&&H.push(e);let r=document.getElementById(`imageApiBase`);r&&r.value.trim()===e&&(r.value=``),$e()}function $e(){let e=document.getElementById(`imageApiBaseDropdown`);if(!e)return;let t=[];e.querySelectorAll(`.model-option[data-is-custom="true"]`).forEach(e=>{t.push({url:e.dataset.value,label:e.dataset.label||``})}),chrome.storage.local.set({customImageApiBases:t,deletedPresetImageApiBases:H},()=>{r.debug(`[Options] image API Base URL column table saved:`,t)})}function et(e){chrome.storage.local.get([`customImageApiBases`,`deletedPresetImageApiBases`],t=>{let n=document.getElementById(`imageApiBaseDropdown`);if(!n){typeof e==`function`&&e();return}H=t.deletedPresetImageApiBases||[];let r=t.customImageApiBases||[];n.innerHTML=``,T.forEach(e=>{if(!H.includes(e)){let t=Xe(e,null,!1);n.appendChild(t)}}),r.forEach(e=>{if(typeof e==`string`){if(!T.includes(e)){let t=Xe(e,null,!0);n.appendChild(t)}}else if(e&&e.url){let t=Xe(e.url,e.label||null,!0);n.appendChild(t)}}),typeof e==`function`&&e()})}function tt(e){let t=document.getElementById(`imageApiBaseDropdown`);t&&t.querySelectorAll(`.model-option`).forEach(t=>{t.dataset.value===e?t.classList.add(`selected`):t.classList.remove(`selected`)})}function nt(){chrome.storage.local.get(`apiBase.apiKey.modelName.customModels.systemPrompt.enableImageInput.imageModelName.imageModels.imageApiBase.imageApiKey.enableFileInput.reactMaxIterations.reactApiTimeout.reactLoopTimeout.reactToolTimeout.preselectMinToolCount.toolConfirmationEnabled.enableExecutionLog.reflectionConfig.streamEnabled.streamExpandTools.completionSoundEnabled.completionConfettiEnabled.completionNotificationEnabled.scheduledNotificationEnabled.interactionNotificationEnabled.showMessageTimestamp.sidePanelScope.autoGroupTabs`.split(`.`),function(e){e.apiBase&&(document.getElementById(`apiBase`).value=e.apiBase),e.apiKey&&(document.getElementById(`apiKey`).value=e.apiKey),e.modelName&&(be(e.modelName),document.getElementById(`modelInput`).value=e.modelName),e.systemPrompt&&(document.getElementById(`systemPrompt`).value=e.systemPrompt);let n=document.getElementById(`enableImageInput`),r=document.getElementById(`imageModelGroup`),i=document.getElementById(`imageApiGroup`),a=document.getElementById(`imageApiKeyGroup`);if(n&&r&&(n.checked=e.enableImageInput||!1,r.style.display=n.checked?``:`none`,i&&(i.style.display=n.checked?``:`none`),a&&(a.style.display=n.checked?``:`none`)),e.imageModelName){Se(e.imageModelName);let t=document.getElementById(`imageModelInput`);t&&(t.value=e.imageModelName)}e.imageApiBase&&(document.getElementById(`imageApiBase`).value=e.imageApiBase),e.imageApiKey&&(document.getElementById(`imageApiKey`).value=e.imageApiKey),document.getElementById(`reactMaxIterations`).value=e.reactMaxIterations||E.maxIterations,document.getElementById(`reactApiTimeout`).value=Math.round((e.reactApiTimeout||E.apiTimeout)/6e4),document.getElementById(`reactLoopTimeout`).value=Math.round((e.reactLoopTimeout||E.loopTimeout)/6e4),document.getElementById(`reactToolTimeout`).value=Math.round((e.reactToolTimeout||E.toolTimeout)/6e4);let o=document.getElementById(`enableToolPreselect`);o&&(o.checked=e.enableToolPreselect===void 0?E.enableToolPreselect:e.enableToolPreselect,o.dispatchEvent(new Event(`change`)));let s=document.getElementById(`preselectMinToolCount`);s&&(s.value=e.preselectMinToolCount===void 0?E.preselectMinToolCount:e.preselectMinToolCount),document.getElementById(`toolConfirmationEnabled`).checked=e.toolConfirmationEnabled===void 0?E.toolConfirmationEnabled:e.toolConfirmationEnabled,document.getElementById(`toolConfirmationEnabled`).dispatchEvent(new Event(`change`)),document.getElementById(`enableExecutionLog`).checked=e.enableExecutionLog===void 0?ue.enableExecutionLog:e.enableExecutionLog,document.getElementById(`enableExecutionLog`).dispatchEvent(new Event(`change`));let c=e.reflectionConfig||d;document.getElementById(`reflectionEnabled`).checked=c.enabled!==!1,document.getElementById(`postReflectionEnabled`).checked=c.postReflection?.enabled!==!1,document.getElementById(`subtaskReflectionEnabled`).checked=c.subtaskReflection?.enabled===!0,document.getElementById(`streamEnabled`).checked=e.streamEnabled===void 0||e.streamEnabled;let l=document.getElementById(`streamExpandTools`),u=document.getElementById(`streamExpandToolsLabel`),f=document.getElementById(`streamExpandToolsWrap`);l&&(l.checked=e.streamExpandTools===!0),u&&(u.textContent=l?.checked?t(`common.enabled`):t(`common.disabled`)),f&&(f.style.display=e.streamEnabled===void 0||e.streamEnabled?`block`:`none`);function p(){let e=document.getElementById(`reflectionConfig`),t=document.getElementById(`reflectionEnabled`);e&&(!t||!t.checked?e.classList.add(`disabled`):e.classList.remove(`disabled`));function n(e,t){let n=document.getElementById(e),r=document.getElementById(t);n&&r&&(r.checked?n.classList.remove(`disabled`):n.classList.add(`disabled`))}n(`postReflectionSection`,`postReflectionEnabled`),n(`subtaskReflectionSection`,`subtaskReflectionEnabled`)}let m=document.getElementById(`completionSoundEnabled`),h=document.getElementById(`completionConfettiEnabled`);m&&(m.checked=e.completionSoundEnabled!==!1),h&&(h.checked=e.completionConfettiEnabled!==!1);let g=document.getElementById(`completionNotificationEnabled`),_=document.getElementById(`scheduledNotificationEnabled`),v=document.getElementById(`interactionNotificationEnabled`);g&&(g.checked=e.completionNotificationEnabled!==!1),_&&(_.checked=e.scheduledNotificationEnabled!==!1),v&&(v.checked=e.interactionNotificationEnabled!==!1);let y=document.getElementById(`showMessageTimestamp`);y&&(y.checked=e.showMessageTimestamp!==!1);let ee=e.sidePanelScope===`tab-specific`?`tab-specific`:`global`,te=document.querySelectorAll(`input[name="sidePanelScope"]`);te.forEach(e=>{e.checked=e.value===ee}),te.forEach(e=>{e.dataset.scopeListenerBound||(e.dataset.scopeListenerBound=`1`,e.addEventListener(`change`,()=>{e.checked&&(chrome.storage.local.set({sidePanelScope:e.value}),ne())}))});let b=document.getElementById(`autoGroupTabs`);b&&(b.checked=e.autoGroupTabs!==!1);function ne(){if(!b)return;let e=document.querySelector(`input[name="sidePanelScope"]:checked`)?.value||`global`;b.disabled=e!==`tab-specific`}ne(),b&&!b.dataset.groupListenerBound&&(b.dataset.groupListenerBound=`1`,b.addEventListener(`change`,()=>{chrome.storage.local.set({autoGroupTabs:b.checked})})),Me(()=>{e.modelName&&Pe(e.modelName),p()}),He(()=>{e.imageModelName&&Ue(e.imageModelName)}),Je(()=>{e.apiBase&&Ye(e.apiBase)}),et(()=>{e.imageApiBase&&tt(e.imageApiBase)})})}function rt(){let e=document.getElementById(`apiBase`).value.trim(),n=document.getElementById(`apiKey`).value.trim(),r=document.getElementById(`systemPrompt`).value.trim(),i=parseInt(document.getElementById(`reactMaxIterations`).value)||E.maxIterations,a=(parseInt(document.getElementById(`reactApiTimeout`).value)||5)*6e4,o=(parseInt(document.getElementById(`reactLoopTimeout`).value)||5)*6e4,s=(parseInt(document.getElementById(`reactToolTimeout`).value)||5)*6e4,c=document.getElementById(`toolConfirmationEnabled`).checked,l=document.getElementById(`enableExecutionLog`).checked,u=document.getElementById(`streamEnabled`)?.checked!==!1,f=document.getElementById(`streamExpandTools`)?.checked===!0,p=document.getElementById(`completionSoundEnabled`)?.checked!==!1,m=document.getElementById(`completionConfettiEnabled`)?.checked!==!1,h=document.getElementById(`completionNotificationEnabled`)?.checked!==!1,g=document.getElementById(`scheduledNotificationEnabled`)?.checked!==!1,_=document.getElementById(`interactionNotificationEnabled`)?.checked!==!1,v=document.getElementById(`showMessageTimestamp`)?.checked!==!1,y=document.getElementById(`enableImageInput`)?.checked||!1,ee=xe||``,te=document.getElementById(`imageApiBase`)?.value.trim()||``,b=document.getElementById(`imageApiKey`)?.value.trim()||``,ne={enabled:document.getElementById(`reflectionEnabled`).checked,postReflection:{...d.postReflection,enabled:document.getElementById(`postReflectionEnabled`).checked},subtaskReflection:{...d.subtaskReflection,enabled:document.getElementById(`subtaskReflectionEnabled`).checked}};if(i<10||i>1e3){U(`❌ ${t(`settings.maxIterationsRangeError`)}`,`error`);return}if(a<6e4||a>6e5){U(`❌ ${t(`settings.apiTimeoutRangeError`)}`,`error`);return}if(o<6e4||o>72e5){U(`❌ ${t(`settings.loopTimeoutRangeError`)}`,`error`);return}if(s<6e4||s>18e5){U(`❌ ${t(`settings.toolTimeoutRangeError`)}`,`error`);return}if(e||=`https://api.deepseek.com`,!n){U(`❌ ${t(`settings.apiKeyEmpty`)}`,`error`);return}chrome.storage.local.set({apiBase:e,apiKey:n,modelName:R||`deepseek-v4-pro`,systemPrompt:r,reactMaxIterations:i,reactApiTimeout:a,reactLoopTimeout:o,reactToolTimeout:s,toolConfirmationEnabled:c,enableExecutionLog:l,enableImageInput:y,imageModelName:ee,imageApiBase:te,imageApiKey:b,reflectionConfig:ne,streamEnabled:u,streamExpandTools:f,completionSoundEnabled:p,completionConfettiEnabled:m,completionNotificationEnabled:h,scheduledNotificationEnabled:g,interactionNotificationEnabled:_,showMessageTimestamp:v,sidePanelScope:document.querySelector(`input[name="sidePanelScope"]:checked`)?.value||`global`,autoGroupTabs:document.getElementById(`autoGroupTabs`)?.checked!==!1},async function(){if(chrome.runtime.lastError)U(`❌ ${t(`settings.saveFailed`,{message:chrome.runtime.lastError.message})}`,`error`);else{w({apiBase:e,apiKey:n,modelName:R||`deepseek-v4-pro`,models:Ae()}),U(`✅ ${t(`settings.saveSuccess`)}`,`success`);let r=document.getElementById(`status`);r.style.display=`none`;let i=document.getElementById(`saveBtn`);i&&(i.classList.add(`saved`),setTimeout(()=>i.classList.remove(`saved`),1500));let a=await chrome.storage.local.get([`pairedAgents`,`activeAgentId`]),o=null,s=(a.pairedAgents||[]).find(e=>e.id===a.activeAgentId);if(s){o={url:s.url,connected:!0,name:s.name};try{let e=await fetch(`${s.url}/api/status/detail`,{headers:{Authorization:`Bearer ${s.token}`}});if(e.ok){let t=await e.json();o.workdir=t.workdir}}catch{}}}})}function U(e,t=`info`,n=3e3){let r=document.getElementById(`toastContainer`);if(!r)return;let i=document.createElement(`div`);i.className=`toast ${t}`,i.textContent=e,r.appendChild(i),requestAnimationFrame(()=>{i.classList.add(`toast-show`)}),setTimeout(()=>{i.classList.remove(`toast-show`),setTimeout(()=>{i.parentNode&&i.parentNode.removeChild(i)},300)},n)}function it(e){if(!e||typeof e!=`object`)return[];let t=Array.isArray(e.data)?e.data:Array.isArray(e.models)?e.models:null;if(!t)return[];let n=new Set,r=[];for(let e of t){let t=``;if(typeof e==`string`)t=e;else if(e&&typeof e==`object`){let n=e.id||e.name||e.model;typeof n==`string`&&(t=n)}t=(t||``).trim(),!(!t||n.has(t))&&(n.add(t),r.push(t))}return r}var W=class extends Error{constructor(e,{status:t,reason:n}={}){super(e),this.name=`FetchModelsError`,this.status=t,this.reason=n}};function at(e){return`${String(e).trim().replace(/\/+$/,``)}/models`}function ot(e){return/anthropic\.com/i.test(String(e||``))}async function st({apiBase:e,apiKey:t,timeoutMs:n=15e3}={}){let r=(e||``).trim(),i=(t||``).trim();if(!r||!i)throw new W(`missing apiBase or apiKey`,{reason:`invalid-config`});let a={Authorization:`Bearer ${i}`};ot(r)&&(a[`x-api-key`]=i,a[`anthropic-version`]=`2023-06-01`);let o=new AbortController,s=setTimeout(()=>o.abort(),n),c;try{c=await fetch(at(r),{method:`GET`,headers:a,signal:o.signal})}catch(e){throw clearTimeout(s),e&&e.name===`AbortError`?new W(`request timeout`,{reason:`timeout`}):new W(e&&e.message||`network error`,{reason:`network`})}if(clearTimeout(s),!c.ok)throw new W(`HTTP ${c.status}`,{status:c.status,reason:`http`});let l;try{l=await c.json()}catch{throw new W(`invalid JSON`,{reason:`parse`})}let u=it(l);if(!u.length)throw new W(`no models parsed`,{reason:`parse`});return u}var ct=-1;function lt(){return new Promise(e=>{chrome.storage.local.get([`toolbarTools`,`toolbarIconOnly`,`enableSelectionToolbar`],t=>{let n=t.toolbarTools&&t.toolbarTools.length>0?t.toolbarTools:[...oe],r=t.toolbarIconOnly!==void 0&&t.toolbarIconOnly,i=t.enableSelectionToolbar===void 0||t.enableSelectionToolbar,a=new Map(oe.map(e=>[e.id,e])),o=n.map(e=>{if(e.builtin&&a.has(e.id)){let t=D(e.id),n=ce(e.id);return{...e,systemPrompt:n||a.get(e.id).systemPrompt,name:t||e.name}}return e}),s=document.getElementById(`toolbarIconOnly`);s&&(s.checked=r);let c=document.getElementById(`enableSelectionToolbar`);c&&(c.checked=i),e(o)})})}function ut(e){let n=document.getElementById(`toolbarToolsList`);if(!n)return;let r=[...e].filter(e=>e.id!==`ai-search`&&e.id!==`copy`).sort((e,t)=>e.order-t.order);n.innerHTML=r.map((e,n)=>{let i=e.builtin,a=i&&D(e.id)||e.name,o=i?`<span class="tool-badge builtin">${t(`toolbar.builtinBadge`)}</span>`:`<span class="tool-badge custom">${t(`toolbar.customBadge`)}</span>`,s=e.systemPrompt?`<div class="tool-prompt-preview" title="${G(e.systemPrompt)}">${G(e.systemPrompt)}</div>`:``,c=n===0,l=n===r.length-1,u=``;return i||(u+=`<button class="tool-action-btn" data-action="edit" data-index="${n}">${t(`common.edit`)}</button>`,u+=`<button class="tool-action-btn danger" data-action="delete" data-index="${n}">${t(`common.delete`)}</button>`),`
|
|
14
29
|
<div class="tool-item" data-tool-id="${e.id}" draggable="true" data-sorted-index="${n}">
|
|
15
30
|
<div class="tool-drag-handle" title="${t(`toolbar.dragSort`)}">⋮⋮</div>
|
|
16
31
|
<div class="tool-order-btns">
|
|
@@ -18,21 +33,21 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
18
33
|
<button class="tool-order-btn" data-action="moveDown" data-index="${n}" ${l?`disabled`:``} title="${t(`toolbar.moveDown`)}">▼</button>
|
|
19
34
|
</div>
|
|
20
35
|
<div class="tool-info">
|
|
21
|
-
<div class="tool-name">${
|
|
36
|
+
<div class="tool-name">${G(a)}${o}</div>
|
|
22
37
|
${s}
|
|
23
38
|
</div>
|
|
24
39
|
<div class="tool-actions">
|
|
25
40
|
${u}
|
|
26
41
|
</div>
|
|
27
42
|
</div>
|
|
28
|
-
`}).join(``),
|
|
43
|
+
`}).join(``),dt()}function dt(){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},()=>{ut(s)})}),e.classList.remove(`drag-over`))})})}function ft(){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 pt(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 mt(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 ht(e,n=-1){ct=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 gt(){document.getElementById(`toolEditModal`).style.display=`none`,ct=-1}function _t(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(ct>=0){let e=i.filter(e=>e.id!==`ai-search`&&e.id!==`copy`)[ct];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 gt(),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 G(e){let t=document.createElement(`div`);return t.textContent=e,t.innerHTML}function vt(){chrome.storage.local.get([`blockedDomains`],e=>{yt(e.blockedDomains||[])})}function yt(e){let n=document.getElementById(`domainBlocklistList`);n&&(n.innerHTML=e.length===0?`<div class="domain-blocklist-empty">${t(`toolbar.noBlockedDomains`)}</div>`:e.map(e=>`
|
|
29
44
|
<div class="domain-blocklist-item">
|
|
30
|
-
<span class="domain-blocklist-item-name" title="${
|
|
31
|
-
<button class="domain-blocklist-item-remove" data-domain="${
|
|
45
|
+
<span class="domain-blocklist-item-name" title="${G(e)}">${G(e)}</span>
|
|
46
|
+
<button class="domain-blocklist-item-remove" data-domain="${G(e)}" title="${t(`toolbar.unblock`)}">
|
|
32
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>
|
|
33
48
|
</button>
|
|
34
49
|
</div>
|
|
35
|
-
`).join(``))}function Ze(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},()=>{Xe(i),n&&n({})})})}function Qe(e){chrome.storage.local.get([`blockedDomains`],t=>{let n=(t.blockedDomains||[]).filter(t=>t!==e);chrome.storage.local.set({blockedDomains:n},()=>{Xe(n)})})}var $e=`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`];async function tt(e){let t=e?[...$e,...et]:$e;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=h(i.modelProfiles)),n(i)})})}async function nt(){let e=document.getElementById(`exportIncludeSecrets`)?.checked||!1;try{let n=await tt(e),r={version:1,app:`ai-helper`,exportedAt:new Date().toISOString(),includeSecrets:e,config:n},i=new Date,a=`ai-helper-config-${i.getFullYear()+String(i.getMonth()+1).padStart(2,`0`)+String(i.getDate()).padStart(2,`0`)+`-`+String(i.getHours()).padStart(2,`0`)+String(i.getMinutes()).padStart(2,`0`)+String(i.getSeconds()).padStart(2,`0`)}.json`,o=JSON.stringify(r,null,2),s=new Blob([o],{type:`application/json;charset=utf-8;`}),c=URL.createObjectURL(s),l=document.createElement(`a`);l.href=c,l.download=a,document.body.appendChild(l),l.click(),document.body.removeChild(l),URL.revokeObjectURL(c),it(),W(t(`configDialog.exportSuccess`),`success`)}catch(e){r.error(`[Options] exportconfiguration failed:`,e),W(t(`configDialog.exportFailed`,{error:e.message}),`error`)}}function rt(){let e=document.getElementById(`exportConfigModal`);e&&(e.style.display=`flex`)}function it(){let e=document.getElementById(`exportConfigModal`);e&&(e.style.display=`none`)}function at(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 ot(){let e=document.getElementById(`importConfigModal`);e&&(e.style.display=`none`)}function st(){let e=document.getElementById(`importConfigFile`);e&&(e.value=``,e.click())}function ct(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(!$e.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=ct(r);if(!i.valid){W(t(`configDialog.importFailed`,{error:i.error}),`error`);return}at(r)}catch(e){r.error(`[Options] import fileparse failed:`,e),W(t(`configDialog.importParseFailed`),`error`)}}async function ut(){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 m();r.modelProfiles=b(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=y(n.models))}if(await new Promise(e=>{chrome.storage.local.set(r,e)}),await p(),!Array.isArray(r.modelProfiles)){let e=await chrome.storage.local.get([`apiBase`,`apiKey`,`modelName`,`customModels`]);await C({apiBase:e.apiBase||`https://api.deepseek.com`,apiKey:e.apiKey||``,modelName:e.modelName||`deepseek-v4-pro`,models:y(e.customModels)})}ot(),W(t(`configDialog.importedCount`,{count:Object.keys(r).length}),`success`),setTimeout(()=>{Ne(()=>{Be().then(()=>{typeof updateToolbarUI==`function`&&updateToolbarUI()}),Ye()})},300)}catch(e){r.error(`[Options] importconfiguration failed:`,e),W(t(`configDialog.importFailed`,{error:e.message}),`error`)}}function dt(){let e=document.getElementById(`exportConfigCloseBtn`),t=document.getElementById(`exportConfigCancelBtn`),n=document.getElementById(`exportConfigOkBtn`),r=document.getElementById(`exportConfigModal`);e&&e.addEventListener(`click`,it),t&&t.addEventListener(`click`,it),n&&n.addEventListener(`click`,nt),r&&r.addEventListener(`click`,e=>{e.target===r&&it()});let i=document.getElementById(`importConfigCloseBtn`),a=document.getElementById(`importConfigCancelBtn`),o=document.getElementById(`importConfigOkBtn`),s=document.getElementById(`importConfigModal`);i&&i.addEventListener(`click`,ot),a&&a.addEventListener(`click`,ot),o&&o.addEventListener(`click`,ut),s&&s.addEventListener(`click`,e=>{e.target===s&&ot()})}function W(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 ft=null,pt=null;async function mt(){gt(),_t(),s(()=>{G()}),await G()}async function G(){let e=await m(),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=S(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:``,ht(r)}function ht(e){let n=document.getElementById(`profileScopeHint`);n&&(n.textContent=e?t(`settings.profileScopeHint`,{name:e.name}):``)}function gt(){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`),vt(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`,bt),document.getElementById(`profileRenameBtn`)?.addEventListener(`click`,xt),document.getElementById(`profileDeleteBtn`)?.addEventListener(`click`,St),Tt())}function _t(){chrome.storage.onChanged.addListener(async(e,t)=>{if(t===`local`&&(e.modelProfiles&&G(),e.activeProfileId)){let e=await m(),t=e.profiles.find(t=>t.id===e.activeProfileId);t&&wt(t),G()}})}async function vt(e){if(e===(await m()).activeProfileId)return;let n=await ne(e);n&&(wt(n),await G(),V(`✅ ${t(`settings.profileSwitched`,{name:n.name})}`,`success`))}async function yt(){let e=re(Ct())||``,n=await Et({mode:`name`,title:t(`settings.profileNameTitle`),defaultValue:e});if(!n)return;let r=await f({name:n,apiBase:x,apiKey:``,modelName:ee,models:[]},{activate:!0});wt(r),await G(),V(`✅ ${t(`settings.profileCreated`,{name:r.name})}`,`success`)}async function bt(){let e=await m(),n=e.profiles.find(t=>t.id===e.activeProfileId)||e.profiles[0];if(!n)return;let r=await Et({mode:`name`,title:t(`settings.saveAsProfile`),defaultValue:`${n.name} ${t(`settings.profileCopySuffix`)}`});if(!r)return;let i=document.getElementById(`modelInput`),a=await f({name:r,apiBase:Ct(),apiKey:document.getElementById(`apiKey`)?.value.trim()||``,modelName:i?.value||A||`deepseek-v4-pro`,models:N()},{activate:!0});wt(a),await G(),V(`✅ ${t(`settings.profileCreated`,{name:a.name})}`,`success`)}async function xt(){let e=await m(),n=e.profiles.find(t=>t.id===e.activeProfileId)||e.profiles[0];if(!n)return;let r=await Et({mode:`name`,title:t(`settings.renameProfile`),defaultValue:n.name});!r||r===n.name||(await g(n.id,r),await G(),V(`✅ ${t(`settings.profileRenamed`,{name:r})}`,`success`))}async function St(){let e=await m(),n=e.profiles.find(t=>t.id===e.activeProfileId)||e.profiles[0];if(!n)return;if(e.profiles.length<=1){V(`⚠️ ${t(`settings.atLeastOneProfile`)}`,`error`);return}if(!await Et({mode:`confirm`,title:t(`settings.deleteProfile`),message:t(`settings.deleteProfileConfirm`,{name:n.name})}))return;let r=await te(n.id);if(!r.deleted){V(`⚠️ ${t(`settings.atLeastOneProfile`)}`,`error`);return}r.nextActive&&wt(r.nextActive),await G(),V(`🗑️ ${t(`settings.profileDeleted`,{name:n.name})}`,`success`)}function Ct(){return document.getElementById(`apiBase`)?.value.trim()||`https://api.deepseek.com`}function wt(e){let t=e.apiBase||`https://api.deepseek.com`,n=e.modelName||`deepseek-v4-pro`,r=document.getElementById(`apiBase`);r&&(r.value=t),Ee(t);let i=document.getElementById(`apiKey`);i&&(i.value=e.apiKey||``),ce(n);let a=document.getElementById(`modelInput`);a&&(a.value=n),_e(e.models||[],n),ye(`modelInput`,`modelSelectedCtxBadge`,`modelDropdown`)}function Tt(){let e=document.getElementById(`profileModal`);!e||e.dataset.bound||(e.dataset.bound=`1`,document.getElementById(`profileModalOkBtn`)?.addEventListener(`click`,Dt),document.getElementById(`profileModalCancelBtn`)?.addEventListener(`click`,()=>K(null)),document.getElementById(`profileModalCloseBtn`)?.addEventListener(`click`,()=>K(null)),e.addEventListener(`click`,t=>{t.target===e&&K(null)}),document.getElementById(`profileNameInput`)?.addEventListener(`keydown`,e=>{e.key===`Enter`&&Dt(),e.key===`Escape`&&K(null)}))}function Et({mode:e,title:t,message:n=``,defaultValue:r=``}){let i=document.getElementById(`profileModal`);if(!i)return Promise.resolve(null);ft=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=>{pt=e})}function Dt(){if(pt){if(ft===`name`){let e=document.getElementById(`profileNameInput`).value.trim();if(!e){V(`❌ ${t(`settings.profileNameRequired`)}`,`error`);return}K(e)}else K(!0)}}function K(e){let t=document.getElementById(`profileModal`);t&&(t.style.display=`none`),ft=null;let n=pt;pt=null,n&&n(e)}var q={agentBaseUrl:null,agentToken:null,agentConnected:!1,agentName:null,agentId:null,cachedMcpServers:[],cachedSkills:[],editingMcpId:null,refreshCallback:null};async function Ot(){typeof q.refreshCallback==`function`&&await q.refreshCallback()}function kt(e,n=t(`customConfirm.defaultTitle`)){return new Promise(r=>{let i=document.createElement(`div`);i.className=`modal-overlay`,i.innerHTML=`
|
|
50
|
+
`).join(``))}function bt(e,n){if(e=e.trim().toLowerCase(),!e){n&&n({error:t(`toolbar.domainEmpty`)});return}if(!e.includes(`.`)){n&&n({error:t(`toolbar.domainInvalid`)});return}chrome.storage.local.get([`blockedDomains`],r=>{let i=r.blockedDomains||[];if(i.includes(e)){n&&n({error:t(`toolbar.domainExists`)});return}i.push(e),chrome.storage.local.set({blockedDomains:i},()=>{yt(i),n&&n({})})})}function xt(e){chrome.storage.local.get([`blockedDomains`],t=>{let n=(t.blockedDomains||[]).filter(t=>t!==e);chrome.storage.local.set({blockedDomains:n},()=>{yt(n)})})}var St=`apiBase.modelName.customModels.systemPrompt.enableImageInput.imageModelName.imageModels.imageApiBase.reactMaxIterations.reactApiTimeout.reactLoopTimeout.reactToolTimeout.enableToolPreselect.toolConfirmationEnabled.reflectionConfig.enableExecutionLog.toolbarTools.toolbarIconOnly.enableSelectionToolbar.blockedDomains.streamEnabled.streamExpandTools.completionSoundEnabled.completionConfettiEnabled.completionNotificationEnabled.scheduledNotificationEnabled.interactionNotificationEnabled.showMessageTimestamp.sidePanelScope.autoGroupTabs.customAgents.activeAgentId.activeAssistantId.temperature.topP.selectedTempIndex.customPrompts.pairedAgents.agentStreamEnabled.enableTools.isolateChat.enableSelectionQuery.deletedPresetModels.modelProfiles.activeProfileId.mcpEnabled.skillsEnabled.ragEnabled`.split(`.`),Ct=[`apiKey`,`imageApiKey`,`agentToken`];function wt(e){let t=e&&e.reflectionConfig;if(t&&typeof t==`object`&&`toolReflection`in t){let n={...t};delete n.toolReflection,e.reflectionConfig=n}}async function Tt(e){let t=e?[...St,...Ct]:St;return new Promise(n=>{chrome.storage.local.get(null,r=>{let i={};for(let e of t)r[e]!==void 0&&(i[e]=r[e]);for(let e of Object.keys(r))(e.startsWith(`agentEnabledTools_`)||e.startsWith(`agentMcpClosedServers_`))&&(i[e]=r[e]);!e&&i.pairedAgents&&(i.pairedAgents=i.pairedAgents.map(e=>({...e,token:``}))),!e&&Array.isArray(i.modelProfiles)&&(i.modelProfiles=_(i.modelProfiles)),wt(i),n(i)})})}async function Et(){let e=document.getElementById(`exportIncludeSecrets`)?.checked||!1;try{let n=await Tt(e),r={version:1,app:`ai-helper`,exportedAt:new Date().toISOString(),includeSecrets:e,config:n},i=new Date,a=`ai-helper-config-${i.getFullYear()+String(i.getMonth()+1).padStart(2,`0`)+String(i.getDate()).padStart(2,`0`)+`-`+String(i.getHours()).padStart(2,`0`)+String(i.getMinutes()).padStart(2,`0`)+String(i.getSeconds()).padStart(2,`0`)}.json`,o=JSON.stringify(r,null,2),s=new Blob([o],{type:`application/json;charset=utf-8;`}),c=URL.createObjectURL(s),l=document.createElement(`a`);l.href=c,l.download=a,document.body.appendChild(l),l.click(),document.body.removeChild(l),URL.revokeObjectURL(c),Ot(),It(t(`configDialog.exportSuccess`),`success`)}catch(e){r.error(`[Options] exportconfiguration failed:`,e),It(t(`configDialog.exportFailed`,{error:e.message}),`error`)}}function Dt(){let e=document.getElementById(`exportConfigModal`);e&&(e.style.display=`flex`)}function Ot(){let e=document.getElementById(`exportConfigModal`);e&&(e.style.display=`none`)}function kt(e){let n=e.config||e,r=Object.keys(n).length,i=e.exportedAt?new Date(e.exportedAt).toLocaleString(o()===`zh`?`zh-CN`:`en-US`):t(`configDialog.unknownTime`),a=document.getElementById(`importSummary`);a&&(a.textContent=t(`configDialog.importSummary`,{time:i,count:r}));let s=document.getElementById(`importConfigModal`);s&&(s.dataset.importData=JSON.stringify(e),s.style.display=`flex`)}function At(){let e=document.getElementById(`importConfigModal`);e&&(e.style.display=`none`)}function jt(){let e=document.getElementById(`importConfigFile`);e&&(e.value=``,e.click())}function Mt(e){if(!e||typeof e!=`object`)return{valid:!1,error:t(`configDialog.invalidFileFormat`)};let n;if(e.version&&e.config&&typeof e.config==`object`)n=e.config;else if(e.apiBase||e.modelName!==void 0)n=e;else return{valid:!1,error:t(`configDialog.unrecognizedFormat`)};for(let e of Object.keys(n))if(!St.includes(e)&&!Ct.includes(e)&&!e.startsWith(`agentEnabledTools_`)&&!e.startsWith(`agentMcpClosedServers_`))return{valid:!1,error:t(`configDialog.unknownConfigKey`,{key:e})};return{valid:!0}}async function Nt(e){try{let n=await e.text(),r=JSON.parse(n),i=Mt(r);if(!i.valid){It(t(`configDialog.importFailed`,{error:i.error}),`error`);return}kt(r)}catch(e){r.error(`[Options] import fileparse failed:`,e),It(t(`configDialog.importParseFailed`),`error`)}}async function Pt(){let e=document.getElementById(`importConfigModal`);if(!e)return;let n=e.dataset.importData;if(n)try{let e=JSON.parse(n),r=e.config||e;if(wt(r),(document.getElementById(`importStrategyReplace`)?.checked?`replace`:`merge`)==`merge`&&Array.isArray(r.modelProfiles)){let e=await g();r.modelProfiles=ne(e.profiles,r.modelProfiles);let t=r.activeProfileId;r.activeProfileId=r.modelProfiles.some(e=>e.id===t)?t:e.activeProfileId;let n=r.modelProfiles.find(e=>e.id===r.activeProfileId)||r.modelProfiles[0];n&&(r.apiBase=n.apiBase||`https://api.deepseek.com`,r.apiKey=n.apiKey||``,r.modelName=n.modelName||`deepseek-v4-pro`,r.customModels=ee(n.models))}if(await new Promise(e=>{chrome.storage.local.set(r,e)}),await h(),!Array.isArray(r.modelProfiles)){let e=await chrome.storage.local.get([`apiBase`,`apiKey`,`modelName`,`customModels`]);await w({apiBase:e.apiBase||`https://api.deepseek.com`,apiKey:e.apiKey||``,modelName:e.modelName||`deepseek-v4-pro`,models:ee(e.customModels)})}At(),It(t(`configDialog.importedCount`,{count:Object.keys(r).length}),`success`),setTimeout(()=>{nt(()=>{lt().then(()=>{typeof updateToolbarUI==`function`&&updateToolbarUI()}),vt()})},300)}catch(e){r.error(`[Options] importconfiguration failed:`,e),It(t(`configDialog.importFailed`,{error:e.message}),`error`)}}function Ft(){let e=document.getElementById(`exportConfigCloseBtn`),t=document.getElementById(`exportConfigCancelBtn`),n=document.getElementById(`exportConfigOkBtn`),r=document.getElementById(`exportConfigModal`);e&&e.addEventListener(`click`,Ot),t&&t.addEventListener(`click`,Ot),n&&n.addEventListener(`click`,Et),r&&r.addEventListener(`click`,e=>{e.target===r&&Ot()});let i=document.getElementById(`importConfigCloseBtn`),a=document.getElementById(`importConfigCancelBtn`),o=document.getElementById(`importConfigOkBtn`),s=document.getElementById(`importConfigModal`);i&&i.addEventListener(`click`,At),a&&a.addEventListener(`click`,At),o&&o.addEventListener(`click`,Pt),s&&s.addEventListener(`click`,e=>{e.target===s&&At()})}function It(e,t=`info`){let n=document.getElementById(`toastContainer`);if(!n)return;let r=document.createElement(`div`);r.className=`toast ${t}`,r.textContent=e,n.appendChild(r),requestAnimationFrame(()=>r.classList.add(`toast-show`)),setTimeout(()=>{r.classList.remove(`toast-show`),setTimeout(()=>{r.parentNode&&r.parentNode.removeChild(r)},300)},3e3)}var Lt=null,Rt=null;async function zt(){Vt(),Ht(),s(()=>{K()}),await K()}async function K(){let e=await g(),t=document.getElementById(`profileDropdown`),n=document.getElementById(`profileInput`);if(!t||!n)return;let r=e.profiles.find(t=>t.id===e.activeProfileId)||e.profiles[0];t.innerHTML=``;for(let n of e.profiles){let e=document.createElement(`div`);e.className=`profile-option`,e.dataset.value=n.id,r&&n.id===r.id&&e.classList.add(`selected`);let i=document.createElement(`span`);i.className=`profile-option-left`,i.textContent=n.name,e.appendChild(i);let a=ie(n.apiBase);if(a){let t=document.createElement(`span`);t.className=`profile-option-right`,t.textContent=a,e.appendChild(t)}t.appendChild(e)}n.value=r?r.name:``,Bt(r)}function Bt(e){let n=document.getElementById(`profileScopeHint`);n&&(n.textContent=e?t(`settings.profileScopeHint`,{name:e.name}):``)}function Vt(){let e=document.getElementById(`profileInput`),t=document.getElementById(`profileDropdown`);!e||!t||(e.addEventListener(`click`,e=>{e.stopPropagation(),t.classList.toggle(`show`)}),t.addEventListener(`click`,e=>{let n=e.target.closest(`.profile-option`);n&&(e.stopPropagation(),t.classList.remove(`show`),Ut(n.dataset.value))}),document.addEventListener(`click`,n=>{!t.contains(n.target)&&n.target!==e&&t.classList.remove(`show`)}),document.getElementById(`profileNewBtn`)?.addEventListener(`click`,Wt),document.getElementById(`profileDupBtn`)?.addEventListener(`click`,Gt),document.getElementById(`profileRenameBtn`)?.addEventListener(`click`,Kt),document.getElementById(`profileDeleteBtn`)?.addEventListener(`click`,qt),Xt())}function Ht(){chrome.storage.onChanged.addListener(async(e,t)=>{if(t===`local`&&(e.modelProfiles&&K(),e.activeProfileId)){let e=await g(),t=e.profiles.find(t=>t.id===e.activeProfileId);t&&Yt(t),K()}})}async function Ut(e){if(e===(await g()).activeProfileId)return;let n=await x(e);n&&(Yt(n),await K(),U(`✅ ${t(`settings.profileSwitched`,{name:n.name})}`,`success`))}async function Wt(){let e=S(Jt())||``,n=await Zt({mode:`name`,title:t(`settings.profileNameTitle`),defaultValue:e});if(!n)return;let r=await m({name:n,apiBase:C,apiKey:``,modelName:te,models:[]},{activate:!0});Yt(r),await K(),U(`✅ ${t(`settings.profileCreated`,{name:r.name})}`,`success`)}async function Gt(){let e=await g(),n=e.profiles.find(t=>t.id===e.activeProfileId)||e.profiles[0];if(!n)return;let r=await Zt({mode:`name`,title:t(`settings.saveAsProfile`),defaultValue:`${n.name} ${t(`settings.profileCopySuffix`)}`});if(!r)return;let i=document.getElementById(`modelInput`),a=await m({name:r,apiBase:Jt(),apiKey:document.getElementById(`apiKey`)?.value.trim()||``,modelName:i?.value||R||`deepseek-v4-pro`,models:Ae()},{activate:!0});Yt(a),await K(),U(`✅ ${t(`settings.profileCreated`,{name:a.name})}`,`success`)}async function Kt(){let e=await g(),n=e.profiles.find(t=>t.id===e.activeProfileId)||e.profiles[0];if(!n)return;let r=await Zt({mode:`name`,title:t(`settings.renameProfile`),defaultValue:n.name});!r||r===n.name||(await v(n.id,r),await K(),U(`✅ ${t(`settings.profileRenamed`,{name:r})}`,`success`))}async function qt(){let e=await g(),n=e.profiles.find(t=>t.id===e.activeProfileId)||e.profiles[0];if(!n)return;if(e.profiles.length<=1){U(`⚠️ ${t(`settings.atLeastOneProfile`)}`,`error`);return}if(!await Zt({mode:`confirm`,title:t(`settings.deleteProfile`),message:t(`settings.deleteProfileConfirm`,{name:n.name})}))return;let r=await b(n.id);if(!r.deleted){U(`⚠️ ${t(`settings.atLeastOneProfile`)}`,`error`);return}r.nextActive&&Yt(r.nextActive),await K(),U(`🗑️ ${t(`settings.profileDeleted`,{name:n.name})}`,`success`)}function Jt(){return document.getElementById(`apiBase`)?.value.trim()||`https://api.deepseek.com`}function Yt(e){let t=e.apiBase||`https://api.deepseek.com`,n=e.modelName||`deepseek-v4-pro`,r=document.getElementById(`apiBase`);r&&(r.value=t),Ye(t);let i=document.getElementById(`apiKey`);i&&(i.value=e.apiKey||``),be(n);let a=document.getElementById(`modelInput`);a&&(a.value=n),Ne(e.models||[],n),Fe(`modelInput`,`modelSelectedCtxBadge`,`modelDropdown`)}function Xt(){let e=document.getElementById(`profileModal`);!e||e.dataset.bound||(e.dataset.bound=`1`,document.getElementById(`profileModalOkBtn`)?.addEventListener(`click`,Qt),document.getElementById(`profileModalCancelBtn`)?.addEventListener(`click`,()=>$t(null)),document.getElementById(`profileModalCloseBtn`)?.addEventListener(`click`,()=>$t(null)),e.addEventListener(`click`,t=>{t.target===e&&$t(null)}),document.getElementById(`profileNameInput`)?.addEventListener(`keydown`,e=>{e.key===`Enter`&&Qt(),e.key===`Escape`&&$t(null)}))}function Zt({mode:e,title:t,message:n=``,defaultValue:r=``}){let i=document.getElementById(`profileModal`);if(!i)return Promise.resolve(null);Lt=e,document.getElementById(`profileModalTitle`).textContent=t;let a=document.getElementById(`profileModalMessage`);a.textContent=n,a.style.display=n?``:`none`;let o=document.getElementById(`profileNameInput`);return o.value=r,o.style.display=e===`name`?``:`none`,i.style.display=`flex`,e===`name`&&setTimeout(()=>o.focus(),50),new Promise(e=>{Rt=e})}function Qt(){if(Rt){if(Lt===`name`){let e=document.getElementById(`profileNameInput`).value.trim();if(!e){U(`❌ ${t(`settings.profileNameRequired`)}`,`error`);return}$t(e)}else $t(!0)}}function $t(e){let t=document.getElementById(`profileModal`);t&&(t.style.display=`none`),Lt=null;let n=Rt;Rt=null,n&&n(e)}var q={agentBaseUrl:null,agentToken:null,agentConnected:!1,agentName:null,agentId:null,cachedMcpServers:[],cachedSkills:[],editingMcpId:null,refreshCallback:null};async function en(){typeof q.refreshCallback==`function`&&await q.refreshCallback()}function tn(e,n=t(`customConfirm.defaultTitle`)){return new Promise(r=>{let i=document.createElement(`div`);i.className=`modal-overlay`,i.innerHTML=`
|
|
36
51
|
<div class="modal-content" style="max-width: 400px;">
|
|
37
52
|
<div class="modal-header">
|
|
38
53
|
<h3>${Y(n)}</h3>
|
|
@@ -45,7 +60,7 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
45
60
|
<button class="btn btn-primary" id="confirmOkBtn" style="width: auto;">${t(`common.ok`)}</button>
|
|
46
61
|
</div>
|
|
47
62
|
</div>
|
|
48
|
-
`,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 nn(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=`
|
|
49
64
|
<div class="modal-header">
|
|
50
65
|
<h3>${t(`toolbox.viewSkillTitle`,{name:e})}</h3>
|
|
51
66
|
<button class="modal-close-btn">✕</button>
|
|
@@ -78,7 +93,7 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
78
93
|
<div class="modal-actions">
|
|
79
94
|
<button class="btn btn-cancel">${t(`common.close`)}</button>
|
|
80
95
|
</div>
|
|
81
|
-
`,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 rn(){let e=await chrome.storage.local.get([`pairedAgents`,`activeAgentId`]),t=(e.pairedAgents||[]).find(t=>t.id===e.activeAgentId);return q.agentBaseUrl=t?.url||null,q.agentToken=t?.token||null,q.agentConnected=!!t,q.agentName=t?.name||null,q.agentId=t?.id||null,{url:q.agentBaseUrl,token:q.agentToken,connected:q.agentConnected,agentName:q.agentName,agentId:q.agentId}}async function J(e,t,n=null){let r={method:e,headers:{"Content-Type":`application/json`,Authorization:`Bearer ${q.agentToken}`}};return n&&(r.body=JSON.stringify(n)),(await fetch(`${q.agentBaseUrl}${t}`,r)).json()}function Y(e){return e?String(e).replace(/&/g,`&`).replace(/</g,`<`).replace(/>/g,`>`).replace(/"/g,`"`).replace(/'/g,`'`):``}var an=``,on=`all`;async function sn(){if(await rn(),!q.agentConnected)return{servers:[]};try{return await J(`GET`,`/api/mcp/servers`)}catch{return{servers:[]}}}function cn(e){let n=document.getElementById(`mcpServerList`);if(!n)return;if(q.cachedMcpServers=e||[],!q.agentConnected){n.innerHTML=`
|
|
82
97
|
<div class="toolbox-empty">
|
|
83
98
|
<div class="toolbox-empty-icon">🔌</div>
|
|
84
99
|
<div class="toolbox-empty-title">${t(`toolbox.emptyAgentNotConnectedTitle`)}</div>
|
|
@@ -88,7 +103,7 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
88
103
|
<div class="toolbox-empty-icon">📦</div>
|
|
89
104
|
<div class="toolbox-empty-title">${t(`toolbox.emptyNoMcpTitle`)}</div>
|
|
90
105
|
<div class="toolbox-empty-desc">${t(`toolbox.emptyNoMcpDesc`)}</div>
|
|
91
|
-
</div>`;return}let r=e.filter(e=>{if(
|
|
106
|
+
</div>`;return}let r=e.filter(e=>{if(on===`enabled`&&e.enabled===!1||on===`disabled`&&e.enabled!==!1)return!1;if(an){let t=an.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=`
|
|
92
107
|
<div class="toolbox-empty">
|
|
93
108
|
<div class="toolbox-empty-icon">🔍</div>
|
|
94
109
|
<div class="toolbox-empty-title">${t(`toolbox.noMatchResult`)}</div>
|
|
@@ -99,19 +114,19 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
99
114
|
<input type="text" id="mcpEditId" value="${Y(e.id)}" placeholder="${t(`toolbox.mcpIdPlaceholder`)}" class="toolbox-input">
|
|
100
115
|
<input type="text" id="mcpEditName" value="${Y(e.name||``)}" placeholder="${t(`toolbox.mcpNamePlaceholder`)}" class="toolbox-input">
|
|
101
116
|
</div>
|
|
102
|
-
${
|
|
103
|
-
${
|
|
117
|
+
${hn(`mcpEdit`,n)}
|
|
118
|
+
${gn(`mcpEdit`,n,e.url||``,e.command||``,(e.args||[]).join(` `))}
|
|
104
119
|
<div class="mcp-env-section" id="mcpEditEnvSection" style="display:${n===`stdio`?``:`none`};">
|
|
105
120
|
<div class="mcp-env-header">
|
|
106
121
|
<span class="mcp-env-title">${t(`toolbox.mcpEnvVars`)}</span>
|
|
107
122
|
<span class="mcp-env-hint">${t(`toolbox.mcpEnvVarsHint`)}</span>
|
|
108
123
|
</div>
|
|
109
124
|
<div class="mcp-env-rows" id="mcpEditEnvRows">
|
|
110
|
-
${
|
|
125
|
+
${ln(e.env||{})}
|
|
111
126
|
</div>
|
|
112
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>
|
|
113
128
|
</div>
|
|
114
|
-
${
|
|
129
|
+
${pn(`mcpEdit`,e.headers||{},n)}
|
|
115
130
|
<div class="mcp-add-form-actions">
|
|
116
131
|
<button class="toolbox-btn toolbox-btn-cancel" data-mcp-id="${Y(e.id)}" data-action="cancel-edit">${t(`common.cancel`)}</button>
|
|
117
132
|
<button class="toolbox-btn toolbox-btn-primary" data-mcp-id="${Y(e.id)}" data-action="save-edit">${t(`common.save`)}</button>
|
|
@@ -134,9 +149,9 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
134
149
|
</div>
|
|
135
150
|
<div class="mcp-card-body${e.enabled===!1?` disabled`:``}">
|
|
136
151
|
<div class="mcp-server-command">
|
|
137
|
-
<code>${Y(
|
|
152
|
+
<code>${Y(_n(e))}</code>
|
|
138
153
|
</div>
|
|
139
|
-
${
|
|
154
|
+
${vn(e)}
|
|
140
155
|
${e.tools&&e.tools.length>0?`
|
|
141
156
|
<div class="mcp-tools-section">
|
|
142
157
|
<button class="mcp-tools-toggle" data-mcp-id="${Y(e.id)}" data-action="toggle-tools">
|
|
@@ -157,7 +172,7 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
157
172
|
<button class="toolbox-btn toolbox-btn-danger" data-mcp-id="${Y(e.id)}" data-action="delete">${t(`common.delete`)}</button>
|
|
158
173
|
</div>
|
|
159
174
|
</div>
|
|
160
|
-
</div>`}).join(``)}function
|
|
175
|
+
</div>`}).join(``)}function ln(e={}){let n=Object.entries(e);return n.length===0&&n.push([``,``]),n.map(([e,n])=>`
|
|
161
176
|
<div class="mcp-env-row">
|
|
162
177
|
<input type="text" class="mcp-env-key toolbox-input" placeholder="${t(`toolbox.mcpVarNamePlaceholder`)}" value="${Y(e)}" style="flex: 1;">
|
|
163
178
|
<div class="mcp-env-value-wrap token-input-wrapper" style="flex: 2;">
|
|
@@ -175,7 +190,7 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
175
190
|
</div>
|
|
176
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>
|
|
177
192
|
</div>
|
|
178
|
-
`).join(``)}function
|
|
193
|
+
`).join(``)}function un(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 dn(e={}){let n=Object.entries(e);return n.length===0&&n.push([``,``]),n.map(([e,n])=>`
|
|
179
194
|
<div class="mcp-env-row">
|
|
180
195
|
<input type="text" class="mcp-env-key toolbox-input" placeholder="${t(`toolbox.mcpHeaderNamePlaceholder`)}" value="${Y(e)}" style="flex: 1;">
|
|
181
196
|
<div class="mcp-env-value-wrap token-input-wrapper" style="flex: 2;">
|
|
@@ -193,17 +208,17 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
193
208
|
</div>
|
|
194
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>
|
|
195
210
|
</div>
|
|
196
|
-
`).join(``)}function
|
|
211
|
+
`).join(``)}function fn(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 pn(e,n={},r=`stdio`){return`
|
|
197
212
|
<div class="mcp-env-section" id="${e}HeadersSection" style="display:${r===`sse`||r===`streamableHttp`||r===`websocket`?``:`none`};">
|
|
198
213
|
<div class="mcp-env-header">
|
|
199
214
|
<span class="mcp-env-title">${t(`toolbox.mcpHeaders`)}</span>
|
|
200
215
|
<span class="mcp-env-hint">${t(`toolbox.mcpHeadersHint`)}</span>
|
|
201
216
|
</div>
|
|
202
217
|
<div class="mcp-env-rows" id="${e}HeaderRows">
|
|
203
|
-
${
|
|
218
|
+
${dn(n)}
|
|
204
219
|
</div>
|
|
205
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>
|
|
206
|
-
</div>`}function
|
|
221
|
+
</div>`}function mn(e){let n=e.target.closest(`[data-action]`);if(!n)return!1;let r=n.dataset.action;if(r===`toggle-env-eye`){let e=n.closest(`.mcp-env-value-wrap`),t=e?.querySelector(`.mcp-env-value`),r=e?.querySelector(`.icon-eye-open`),i=e?.querySelector(`.icon-eye-closed`);return t&&(t.type===`password`?(t.type=`text`,r&&(r.style.display=`none`),i&&(i.style.display=`block`)):(t.type=`password`,r&&(r.style.display=`block`),i&&(i.style.display=`none`))),!0}if(r===`remove-env-row`)return n.closest(`.mcp-env-row`)?.remove(),!0;if(r===`add-env-row`){let e=n.dataset.target,r=e?document.getElementById(e):null;if(r){let e=document.createElement(`div`);e.className=`mcp-env-row`,e.innerHTML=`
|
|
207
222
|
<input type="text" class="mcp-env-key toolbox-input" placeholder="${t(`toolbox.mcpVarNamePlaceholder`)}" style="flex: 1;">
|
|
208
223
|
<div class="mcp-env-value-wrap token-input-wrapper" style="flex: 2;">
|
|
209
224
|
<input type="password" class="mcp-env-value token-input" placeholder="${t(`toolbox.mcpVarValuePlaceholder`)}">
|
|
@@ -219,7 +234,7 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
219
234
|
</button>
|
|
220
235
|
</div>
|
|
221
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>
|
|
222
|
-
`,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 hn(e,n=`stdio`){return`
|
|
223
238
|
<div class="mcp-transport-group" id="${e}TransportGroup" data-prefix="${e}">
|
|
224
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=>`
|
|
225
240
|
<button type="button"
|
|
@@ -229,37 +244,37 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
229
244
|
data-prefix="${e}"
|
|
230
245
|
title="${t.title}">${t.label}</button>
|
|
231
246
|
`).join(``)}
|
|
232
|
-
</div>`}function
|
|
247
|
+
</div>`}function gn(e,n=`stdio`,r=``,i=``,a=``){let o=n===`sse`||n===`streamableHttp`||n===`websocket`;return`
|
|
233
248
|
<div class="mcp-add-form-row" id="${e}StdioRow" style="display:${o?`none`:`flex`};">
|
|
234
249
|
<input type="text" id="${e}Command" value="${Y(i)}" placeholder="${t(`toolbox.mcpCommandPlaceholder`)}" class="toolbox-input" style="flex: 2;">
|
|
235
250
|
<input type="text" id="${e}Args" value="${Y(a)}" placeholder="${t(`toolbox.mcpArgsPlaceholder`)}" class="toolbox-input" style="flex: 3;">
|
|
236
251
|
</div>
|
|
237
252
|
<div class="mcp-add-form-row" id="${e}UrlRow" style="display:${o?`flex`:`none`};">
|
|
238
253
|
<input type="text" id="${e}Url" value="${Y(r)}" placeholder="http://localhost:3000/mcp" class="toolbox-input" style="flex: 1;">
|
|
239
|
-
</div>`}function
|
|
254
|
+
</div>`}function _n(e){let t=e.transport||`stdio`;return t===`stdio`||!t?`${e.command||``} ${(e.args||[]).join(` `)}`:e.url||``}function vn(e){let n=Object.keys(e.headers||{}).length;return n>0?`<div class="mcp-server-meta">${t(`toolbox.mcpCustomHeadersCount`,{count:n})}</div>`:``}function yn(e){return document.querySelector(`#${e}TransportGroup .mcp-transport-btn.active`)?.dataset.value||`stdio`}function bn(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 xn(){let e=document.getElementById(`mcpAddForm`);e&&(e.innerHTML=`
|
|
240
255
|
<div class="mcp-add-form">
|
|
241
256
|
<div class="mcp-add-form-row">
|
|
242
257
|
<input type="text" id="mcpAddId" placeholder="${t(`toolbox.mcpIdPlaceholderUnique`)}" class="toolbox-input">
|
|
243
258
|
<input type="text" id="mcpAddName" placeholder="${t(`toolbox.mcpNamePlaceholder`)}" class="toolbox-input">
|
|
244
259
|
</div>
|
|
245
|
-
${
|
|
246
|
-
${
|
|
260
|
+
${hn(`mcpAdd`)}
|
|
261
|
+
${gn(`mcpAdd`)}
|
|
247
262
|
<div class="mcp-env-section" id="mcpAddEnvSection">
|
|
248
263
|
<div class="mcp-env-header">
|
|
249
264
|
<span class="mcp-env-title">${t(`toolbox.mcpEnvVars`)}</span>
|
|
250
265
|
<span class="mcp-env-hint">${t(`toolbox.mcpEnvVarsHint`)}</span>
|
|
251
266
|
</div>
|
|
252
267
|
<div class="mcp-env-rows" id="mcpAddEnvRows">
|
|
253
|
-
${
|
|
268
|
+
${ln()}
|
|
254
269
|
</div>
|
|
255
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>
|
|
256
271
|
</div>
|
|
257
|
-
${
|
|
272
|
+
${pn(`mcpAdd`,{},`stdio`)}
|
|
258
273
|
<div class="mcp-add-form-actions">
|
|
259
274
|
<button class="toolbox-btn toolbox-btn-cancel" id="mcpAddCancel">${t(`common.cancel`)}</button>
|
|
260
275
|
<button class="toolbox-btn toolbox-btn-primary" id="mcpAddConfirm">${t(`common.add`)}</button>
|
|
261
276
|
</div>
|
|
262
|
-
</div>`)}function
|
|
277
|
+
</div>`)}function Sn(){let e=document.getElementById(`mcpAddForm`);e&&(e.innerHTML=``)}async function Cn(e){try{let n=await J(`POST`,`/api/mcp/servers`,e);if(n.success)return!0;throw Error(n.error||t(`toolbox.mcpAddFailedShort`))}catch(e){throw e}}async function wn(e){try{let n=await J(`DELETE`,`/api/mcp/servers`,{id:e});if(n.success)return!0;throw Error(n.error||t(`toolbox.mcpDeleteFailedShort`))}catch(e){throw e}}async function Tn(e){let n=await J(`POST`,`/api/mcp/servers/connect`,{id:e});if(n.success)return n;throw Error(n.error||t(`toolbox.mcpConnectFailedShort`))}async function En(e){let n=await J(`POST`,`/api/mcp/servers/disconnect`,{id:e});if(n.success)return!0;throw Error(n.error||t(`toolbox.mcpDisconnectFailedShort`))}async function Dn(e,n){let r=await J(`PUT`,`/api/mcp/servers/toggle`,{id:e,enabled:n});if(r.success)return!0;throw Error(r.error||t(`toolbox.mcpOperationFailedShort`))}function On(){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(()=>{an=e.value.trim(),cn(q.cachedMcpServers)},200)})}let n=document.getElementById(`mcpSearchClear`);n&&n.addEventListener(`click`,()=>{e.value=``,an=``,cn(q.cachedMcpServers),e.focus()}),t.forEach(e=>{e.addEventListener(`click`,()=>{t.forEach(e=>e.classList.remove(`active`)),e.classList.add(`active`),on=e.dataset.filter,cn(q.cachedMcpServers)})})}var kn=``,An=`all`;async function jn(){if(await rn(),!q.agentConnected)return{skills:[]};try{return await J(`GET`,`/api/skill/list`)}catch{return{skills:[]}}}function Mn(e){let n=document.getElementById(`skillList`);if(!n)return;if(q.cachedSkills=e||[],!q.agentConnected){n.innerHTML=`
|
|
263
278
|
<div class="toolbox-empty">
|
|
264
279
|
<div class="toolbox-empty-icon">🔌</div>
|
|
265
280
|
<div class="toolbox-empty-title">${t(`toolbox.emptyAgentNotConnectedTitle`)}</div>
|
|
@@ -269,7 +284,7 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
269
284
|
<div class="toolbox-empty-icon">🧩</div>
|
|
270
285
|
<div class="toolbox-empty-title">${t(`toolbox.emptyNoSkillTitle`)}</div>
|
|
271
286
|
<div class="toolbox-empty-desc">${t(`toolbox.emptyNoSkillDesc`)}</div>
|
|
272
|
-
</div>`;return}let r=e.filter(e=>{if(
|
|
287
|
+
</div>`;return}let r=e.filter(e=>{if(An===`enabled`&&e.enabled===!1||An===`disabled`&&e.enabled!==!1)return!1;if(kn){let t=kn.toLowerCase();if(![e.name,e.description].filter(Boolean).join(` `).toLowerCase().includes(t))return!1}return!0});if(r.length===0){n.innerHTML=`
|
|
273
288
|
<div class="toolbox-empty">
|
|
274
289
|
<div class="toolbox-empty-icon">🔍</div>
|
|
275
290
|
<div class="toolbox-empty-title">${t(`toolbox.noMatchResult`)}</div>
|
|
@@ -290,7 +305,7 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
290
305
|
${n.truncated&&e.enabled!==!1?`<button class="skill-expand-btn" data-skill-name="${Y(e.name)}" data-target="desc" data-full="${encodeURIComponent(e.description||``)}">${t(`toolbox.expand`)}</button>`:``}
|
|
291
306
|
${r?`
|
|
292
307
|
<div class="skill-card-params">
|
|
293
|
-
${
|
|
308
|
+
${Nn(e.parameters)}
|
|
294
309
|
</div>`:``}
|
|
295
310
|
<div class="skill-card-actions">
|
|
296
311
|
${e.enabled===!1?``:`<button class="toolbox-btn toolbox-btn-primary" data-skill-name="${Y(e.name)}" data-action="run-skill">${t(`toolbox.run`)}</button>`}
|
|
@@ -326,7 +341,7 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
326
341
|
</div>
|
|
327
342
|
</div>
|
|
328
343
|
</div>
|
|
329
|
-
`}).join(``)),n.innerHTML=o}function
|
|
344
|
+
`}).join(``)),n.innerHTML=o}function Nn(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="${Y(t.description||``)}">${Y(e)}${r?`*`:``}</span>`}).join(``)}async function Pn(e){let n=await J(`POST`,`/api/skill/import`,e);if(n.success)return!0;throw Error(n.error||t(`toolbox.skillImportFailedShort`))}async function Fn(e){let n=await J(`DELETE`,`/api/skill/delete`,{name:e});if(n.success)return!0;throw Error(n.error||t(`toolbox.skillDeleteFailedShort`))}async function In(e){let n=await J(`POST`,`/api/skill/toggle`,{name:e});if(n.success)return n.enabled!==!1;throw Error(n.error||t(`toolbox.skillOperationFailedShort`))}async function Ln(e,t={}){return await J(`POST`,`/api/skill/run`,{name:e,params:t})}function Rn(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 zn(e,n){return new Promise(r=>{let i=document.createElement(`div`);i.className=`modal-overlay`;let a=n.required.map(([e,n])=>`
|
|
330
345
|
<div class="form-group">
|
|
331
346
|
<label for="skill-param-${e}">${Y(n.description||e)} <span class="param-required">${t(`toolbox.required`)}</span></label>
|
|
332
347
|
<input type="text" id="skill-param-${e}" class="form-input"
|
|
@@ -355,7 +370,7 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
355
370
|
<button class="btn btn-primary" id="skillParamsSubmit">${t(`toolbox.run`)}</button>
|
|
356
371
|
</div>
|
|
357
372
|
</div>
|
|
358
|
-
`,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 Bn(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`
|
|
359
374
|
<div class="skill-run-step ${h}">
|
|
360
375
|
<div class="step-header">
|
|
361
376
|
<span class="step-status-icon">${m}</span>
|
|
@@ -378,7 +393,7 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
378
393
|
<button class="btn btn-primary modal-close-btn">${t(`common.close`)}</button>
|
|
379
394
|
</div>
|
|
380
395
|
</div>
|
|
381
|
-
`,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 Vn(){return await J(`POST`,`/api/skill/reload`)}async function Hn(e){return await J(`GET`,`/api/skill/markdown?name=${encodeURIComponent(e)}`)}function Un(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=`
|
|
382
397
|
<div class="modal-header">
|
|
383
398
|
<h3>${t(i?`toolbox.editAgentSkill`:`toolbox.newAgentSkill`)}</h3>
|
|
384
399
|
<button class="modal-close-btn">✕</button>
|
|
@@ -412,7 +427,7 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
412
427
|
<button class="btn btn-cancel" id="cancelAgentSkillBtn">${t(`common.cancel`)}</button>
|
|
413
428
|
<button class="btn btn-primary" id="saveAgentSkillBtn" style="width: auto;">${t(`common.save`)}</button>
|
|
414
429
|
</div>
|
|
415
|
-
`,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 U(t(`toolbox.skillNameRequired`),`error`);if(!c)return U(t(`toolbox.skillMarkdownRequired`),`error`);try{let n=await J(`POST`,`/api/skill/save-markdown`,{name:e,description:r,version:o,markdown:c,enabled:l});n.success?(U(t(`toolbox.agentSkillSaved`,{name:e}),`success`),s(),en()):U(n.error||t(`toolbox.saveFailedShort`),`error`)}catch(e){U(t(`toolbox.saveFailed`,{error:e.message}),`error`)}})}function Wn(){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=`
|
|
416
431
|
<div class="modal-header">
|
|
417
432
|
<h3>${t(`toolbox.importSkillTitle`)}</h3>
|
|
418
433
|
<button class="modal-close-btn">×</button>
|
|
@@ -480,14 +495,14 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
480
495
|
<button class="btn btn-cancel" id="cancelImportBtn">${t(`common.cancel`)}</button>
|
|
481
496
|
<button class="btn btn-primary" id="confirmImportBtn" style="width: auto;">${t(`toolbox.importBtn`)}</button>
|
|
482
497
|
</div>
|
|
483
|
-
`,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 V(t(`toolbox.selectJsonFile`),`warning`);let r=await e.text(),i=JSON.parse(r);await cn(i),V(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 V(t(`toolbox.skillNameRequired`),`warning`);if(!i)return V(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)V(t(`toolbox.agentSkillCreated`,{name:e}),`success`);else return V(a.error||t(`toolbox.createFailedShort`),`error`)}else if(e===`zip`){let e=n.querySelector(`#skillZipFile`).files[0];if(!e)return V(t(`toolbox.selectZipFile`),`warning`);if(e.size>52428800)return V(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)V(t(`toolbox.agentSkillImported`,{name:r.skill?.name||`unknown`}),`success`);else return V(r.error||t(`toolbox.skillImportFailedShort`),`error`)}else if(e===`url`){let e=n.querySelector(`#skillUrl`).value.trim();if(!e)return V(t(`toolbox.urlRequired`),`warning`);let r=await J(`POST`,`/api/skill/import-url`,{url:e});if(r.success)V(t(`toolbox.agentSkillImported`,{name:r.skill?.name||`unknown`}),`success`);else return V(r.error||t(`toolbox.skillImportFailedShort`),`error`)}i(),Ot()}catch(e){V(t(`toolbox.importFailed`,{error:e.message}),`error`)}})}function yn(){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(()=>{nn=e.value.trim(),on(q.cachedSkills||[])},200)})}let n=document.getElementById(`skillSearchClear`);n&&n.addEventListener(`click`,()=>{e.value=``,nn=``,on(q.cachedSkills||[]),e.focus()}),t.forEach(e=>{e.addEventListener(`click`,()=>{t.forEach(e=>e.classList.remove(`active`)),e.classList.add(`active`),rn=e.dataset.filter,on(q.cachedSkills||[])})})}q.refreshCallback=X;function bn(){try{chrome.runtime.sendMessage({type:`RELOAD_MCP_TOOLS`},e=>{e?.success&&r.debug(`[Toolbox] Background re loaded ${e.count} MCP tool`)})}catch{}}function xn(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 Sn(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([Pt(),an()]),r=e.servers||[],i=n.skills||[];Ft(r),on(i),xn(r),Sn(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 Cn(e){q.cachedMcpServers.find(t=>t.id===e)&&(q.editingMcpId=e,document.getElementById(`mcpServerList`)&&Ft(q.cachedMcpServers))}function wn(){q.editingMcpId=null,Ft(q.cachedMcpServers)}async function Tn(){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=Kt(`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:Lt(document.getElementById(`mcpEditEnvRows`)),headers:zt(document.getElementById(`mcpEditHeaderRows`)),enabled:q.cachedMcpServers.find(e=>e.id===q.editingMcpId)?.enabled!==!1};try{if(await Xt(p),q.cachedMcpServers.find(e=>e.id===q.editingMcpId)?.connected){Z(t(`toolbox.mcpReconnecting`),`info`),await $t(q.editingMcpId),await new Promise(e=>setTimeout(e,500));let e=await Qt(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,bn(),await X()}catch(e){Z(t(`toolbox.mcpUpdateFailed`,{error:e.message}),`error`)}}function En(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 Dn(){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),En(`mcp`,r),En(`skill`,i)}),e&&e.addEventListener(`change`,()=>{let n=e.checked;chrome.storage.local.set({mcpEnabled:n}),En(`mcp`,n),Z(t(n?`toolbox.mcpServiceEnabled`:`toolbox.mcpServiceDisabled`),`info`)}),n&&n.addEventListener(`change`,()=>{let e=n.checked;chrome.storage.local.set({skillsEnabled:e}),En(`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()?Yt():Jt()});let a=document.getElementById(`mcpAddForm`);a&&a.addEventListener(`click`,async e=>{if(e.target.dataset.action===`transport-change`){qt(e.target);return}if(!Vt(e)&&(e.target.id===`mcpAddCancel`&&Yt(),e.target.id===`mcpAddConfirm`)){let e=document.getElementById(`mcpAddId`)?.value.trim(),n=document.getElementById(`mcpAddName`)?.value.trim(),r=Kt(`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?Lt(c):{},headers:l?zt(l):{},enabled:!0};try{await Xt(u),Z(t(`toolbox.mcpAddSuccess`),`success`),Yt(),bn(),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`){qt(e.target);return}if(Vt(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 Qt(i),Z(t(`toolbox.mcpConnectSuccess`),`success`),bn(),await X();else if(r===`disconnect`)await $t(i),Z(t(`toolbox.mcpDisconnectSuccess`),`success`),bn(),await X();else if(r===`toggle`){let e=n.checked;await en(i,e),Z(t(e?`toolbox.mcpEnabledToast`:`toolbox.mcpDisabledToast`),`success`),bn(),await X()}else if(r===`delete`){if(!await kt(t(`toolbox.mcpConfirmDelete`),t(`toolbox.deleteConfirmTitle`)))return;await Zt(i),Z(t(`toolbox.deleteSuccess`),`success`),bn(),await X()}else if(r===`edit`)Cn(i);else if(r===`cancel-edit`)wn();else if(r===`save-edit`)await Tn();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 kt(t(`toolbox.skillConfirmDelete`,{name:a}),t(`toolbox.deleteConfirmTitle`)))return;await ln(a),Z(t(`toolbox.deleteSuccess`),`success`),await X()}else if(i===`toggle-skill`)Z(await un(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=fn(e.skill);if(n.hasRequired){let r=await pn(a,n);if(r===null)return;Z(t(`toolbox.skillRunning`,{name:a}),`info`),mn(a,e,await dn(a,r))}else Z(t(`toolbox.skillRunning`,{name:a}),`info`),mn(a,e,await dn(a))}else if(i===`edit-agent-skill`)try{let e=await gn(a);e.success?_n(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 gn(a);e.success?At(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`,()=>vn());let l=document.getElementById(`reloadSkillsBtn`);l&&l.addEventListener(`click`,async()=>{try{let e=await hn();Z(t(`toolbox.skillsReloaded`,{count:e.count||0}),`success`),await X()}catch(e){Z(t(`toolbox.skillsReloadFailed`,{error:e.message}),`error`)}}),tn(),yn(),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 On=2e3,kn=[`vectra`,`@huggingface/transformers`,`pdf-parse`,`mammoth`,`officeparser`,`cheerio`],An=null,jn=null;function Mn(e){jn=e}async function Nn(){if(await jt(),!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 Pn(){try{return await J(`GET`,`/api/rag/install/status`)}catch(e){return r.warn(`[RAG] Failed to fetch install status:`,e.message),null}}function Fn(){try{chrome.runtime.sendMessage({type:`RELOAD_RAG_TOOLS`},e=>{e?.success&&r.debug(`[Toolbox] Background re loaded ${e.count} RAG tool`)})}catch{}}function In(e){if(!e)return!0;let t=parseInt(String(e).replace(/^v/i,``),10);return!Number.isFinite(t)||t>=22}function Ln(e,t,n,r=``){return`
|
|
498
|
+
`,n.appendChild(r),document.body.appendChild(n);let i=()=>n.remove();n.querySelector(`.modal-close-btn`).addEventListener(`click`,i),n.querySelector(`#cancelImportBtn`).addEventListener(`click`,i),n.querySelectorAll(`.import-tab`).forEach(e=>{e.addEventListener(`click`,()=>{n.querySelectorAll(`.import-tab`).forEach(e=>e.classList.remove(`active`)),e.classList.add(`active`),n.querySelectorAll(`.import-panel`).forEach(e=>e.classList.remove(`active`)),n.querySelector(`[data-panel="${e.dataset.tab}"]`).classList.add(`active`)})});let a=(e,t)=>{let r=n.querySelector(e),i=n.querySelector(t);!r||!i||(r.addEventListener(`click`,()=>i.click()),r.addEventListener(`dragover`,e=>{e.preventDefault(),r.style.borderColor=`#667eea`,r.style.background=`#f5f7ff`}),r.addEventListener(`dragleave`,()=>{r.style.borderColor=`#d0d5dd`,r.style.background=`#fafbfc`}),r.addEventListener(`drop`,e=>{e.preventDefault(),r.style.borderColor=`#d0d5dd`,r.style.background=`#fafbfc`;let t=e.dataTransfer.files;t.length>0&&(i.files=t,o(r,t[0].name))}),i.addEventListener(`change`,()=>{i.files&&i.files[0]&&o(r,i.files[0].name)}))},o=(e,t)=>{e.classList.add(`has-file`);let n=e.querySelector(`.file-name`);n&&n.remove();let r=document.createElement(`span`);r.className=`file-name`,r.textContent=`✓ ${t}`,e.appendChild(r)};a(`#jsonDropZone`,`#skillJsonFile`),a(`#zipDropZone`,`#skillZipFile`),n.querySelector(`#confirmImportBtn`).addEventListener(`click`,async()=>{let e=n.querySelector(`.import-tab.active`)?.dataset.tab;try{if(e===`json`){let e=n.querySelector(`#skillJsonFile`).files[0];if(!e)return U(t(`toolbox.selectJsonFile`),`warning`);let r=await e.text(),i=JSON.parse(r);await Pn(i),U(t(`toolbox.workflowSkillImported`,{name:i.name}),`success`)}else if(e===`markdown`){let e=n.querySelector(`#quickAgentName`).value.trim(),r=n.querySelector(`#quickAgentDesc`).value.trim(),i=n.querySelector(`#quickAgentMarkdown`).value.trim();if(!e)return U(t(`toolbox.skillNameRequired`),`warning`);if(!i)return U(t(`toolbox.skillMarkdownRequired`),`warning`);let a=await J(`POST`,`/api/skill/save-markdown`,{name:e,description:r,version:`1.0`,markdown:i});if(a.success)U(t(`toolbox.agentSkillCreated`,{name:e}),`success`);else return U(a.error||t(`toolbox.createFailedShort`),`error`)}else if(e===`zip`){let e=n.querySelector(`#skillZipFile`).files[0];if(!e)return U(t(`toolbox.selectZipFile`),`warning`);if(e.size>52428800)return U(t(`toolbox.fileTooLarge`),`warning`);let r=await J(`POST`,`/api/skill/import-zip`,{zipData:await new Promise((n,r)=>{let i=new FileReader;i.onload=()=>n(i.result.split(`,`)[1]),i.onerror=()=>r(Error(t(`toolbox.fileReadFailed`))),i.readAsDataURL(e)})});if(r.success)U(t(`toolbox.agentSkillImported`,{name:r.skill?.name||`unknown`}),`success`);else return U(r.error||t(`toolbox.skillImportFailedShort`),`error`)}else if(e===`url`){let e=n.querySelector(`#skillUrl`).value.trim();if(!e)return U(t(`toolbox.urlRequired`),`warning`);let r=await J(`POST`,`/api/skill/import-url`,{url:e});if(r.success)U(t(`toolbox.agentSkillImported`,{name:r.skill?.name||`unknown`}),`success`);else return U(r.error||t(`toolbox.skillImportFailedShort`),`error`)}i(),en()}catch(e){U(t(`toolbox.importFailed`,{error:e.message}),`error`)}})}function Gn(){let e=document.getElementById(`skillSearchInput`),t=document.querySelectorAll(`.toolbox-filter-tab[data-target="skill"]`);if(e){let t=null;e.addEventListener(`input`,()=>{clearTimeout(t),t=setTimeout(()=>{kn=e.value.trim(),Mn(q.cachedSkills||[])},200)})}let n=document.getElementById(`skillSearchClear`);n&&n.addEventListener(`click`,()=>{e.value=``,kn=``,Mn(q.cachedSkills||[]),e.focus()}),t.forEach(e=>{e.addEventListener(`click`,()=>{t.forEach(e=>e.classList.remove(`active`)),e.classList.add(`active`),An=e.dataset.filter,Mn(q.cachedSkills||[])})})}q.refreshCallback=X;function Kn(){try{chrome.runtime.sendMessage({type:`RELOAD_MCP_TOOLS`},e=>{e?.success&&r.debug(`[Toolbox] Background re loaded ${e.count} MCP tool`)})}catch{}}function qn(e){let n=document.getElementById(`mcpSection`);if(!n)return;let r=n.querySelector(`.toolbox-tool-count`);if(!r){r=document.createElement(`span`),r.className=`toolbox-tool-count`;let e=n.querySelector(`.toolbox-section-title`);e&&e.insertAdjacentElement(`afterend`,r)}let i=e.filter(e=>e.enabled!==!1).length,a=e.length;a===0?r.style.display=`none`:(r.textContent=t(`toolbox.enabledCountTotal`,{enabled:i,total:a}),r.style.display=``)}function Jn(e){let n=document.getElementById(`skillSection`);if(!n)return;let r=n.querySelector(`.toolbox-tool-count`);if(!r){r=document.createElement(`span`),r.className=`toolbox-tool-count`;let e=n.querySelector(`.toolbox-section-title`);e&&e.insertAdjacentElement(`afterend`,r)}let i=e.filter(e=>e.enabled!==!1).length,a=e.length;a===0?r.style.display=`none`:(r.textContent=t(`toolbox.enabledCountTotal`,{enabled:i,total:a}),r.style.display=``)}async function X(){let[e,n]=await Promise.all([sn(),jn()]),r=e.servers||[],i=n.skills||[];cn(r),Mn(i),qn(r),Jn(i);let a=document.getElementById(`toolboxAgentStatus`);if(a){if(q.agentConnected){let e=q.agentName||t(`toolbox.unknownAgent`);a.innerHTML=`<span class="toolbox-status-dot connected"></span> ${t(`toolbox.currentAgentSupports`,{name:Y(e)})}`,a.className=`toolbox-agent-status connected`}else a.innerHTML=`<span class="toolbox-status-dot disconnected"></span> ${t(`toolbox.agentNotConnectedHint`)}`,a.className=`toolbox-agent-status disconnected`}let o=!q.agentConnected,s=document.getElementById(`addMcpServerBtn`),c=document.getElementById(`importSkillBtn`),l=document.getElementById(`reloadSkillsBtn`);s&&(s.disabled=o),c&&(c.disabled=o),l&&(l.disabled=o)}function Yn(e){q.cachedMcpServers.find(t=>t.id===e)&&(q.editingMcpId=e,document.getElementById(`mcpServerList`)&&cn(q.cachedMcpServers))}function Xn(){q.editingMcpId=null,cn(q.cachedMcpServers)}async function Zn(){let e=document.getElementById(`mcpEditId`),n=document.getElementById(`mcpEditName`),r=document.getElementById(`mcpEditCommand`),i=document.getElementById(`mcpEditArgs`),a=document.getElementById(`mcpEditUrl`),o=e?.value.trim(),s=n?.value.trim(),c=yn(`mcpEdit`),l=r?.value.trim(),u=i?.value.trim(),d=a?.value.trim(),f=c===`sse`||c===`streamableHttp`||c===`websocket`;if(!o){Z(t(`toolbox.mcpIdRequired`),`warning`);return}if(f){if(!d){Z(t(`toolbox.mcpUrlRequired`),`warning`);return}}else if(!l){Z(t(`toolbox.mcpCommandRequired`),`warning`);return}let p={id:o,name:s||o,transport:c,command:l,args:u?u.split(/\s+/):[],url:d,env:un(document.getElementById(`mcpEditEnvRows`)),headers:fn(document.getElementById(`mcpEditHeaderRows`)),enabled:q.cachedMcpServers.find(e=>e.id===q.editingMcpId)?.enabled!==!1};try{if(await Cn(p),q.cachedMcpServers.find(e=>e.id===q.editingMcpId)?.connected){Z(t(`toolbox.mcpReconnecting`),`info`),await En(q.editingMcpId),await new Promise(e=>setTimeout(e,500));let e=await Tn(o);if(e.success)Z(t(`toolbox.mcpUpdateReconnected`,{count:e.toolCount||0}),`success`);else{let n=e.error||t(`toolbox.mcpUnknownError`);Z(t(`toolbox.mcpUpdatedReconnectFailed`,{error:n}),`warning`)}}else Z(t(`toolbox.mcpUpdateSuccess`),`success`);q.editingMcpId=null,Kn(),await X()}catch(e){Z(t(`toolbox.mcpUpdateFailed`,{error:e.message}),`error`)}}function Qn(e,n){let r={mcp:[`mcpToggleLabel`,`mcpSection`],skill:[`skillToggleLabel`,`skillSection`]},[i,a]=r[e]||r.mcp,o=document.getElementById(i),s=document.getElementById(a);o&&(o.textContent=t(n?`common.enabled`:`common.disabled`),o.style.color=n?`#666`:`#999`),s&&(n?s.classList.remove(`disabled-section`):s.classList.add(`disabled-section`))}function $n(){let e=document.getElementById(`mcpGlobalToggle`),n=document.getElementById(`skillGlobalToggle`);document.getElementById(`mcpToggleLabel`),document.getElementById(`skillToggleLabel`),document.getElementById(`mcpSection`),document.getElementById(`skillSection`),chrome.storage.local.get([`mcpEnabled`,`skillsEnabled`],t=>{let r=t.mcpEnabled===!0,i=t.skillsEnabled!==!1;e&&(e.checked=r),n&&(n.checked=i),Qn(`mcp`,r),Qn(`skill`,i)}),e&&e.addEventListener(`change`,()=>{let n=e.checked;chrome.storage.local.set({mcpEnabled:n}),Qn(`mcp`,n),Z(t(n?`toolbox.mcpServiceEnabled`:`toolbox.mcpServiceDisabled`),`info`)}),n&&n.addEventListener(`change`,()=>{let e=n.checked;chrome.storage.local.set({skillsEnabled:e}),Qn(`skill`,e),Z(t(e?`toolbox.skillServiceEnabled`:`toolbox.skillServiceDisabled`),`info`)});let i=document.getElementById(`addMcpServerBtn`);i&&i.addEventListener(`click`,()=>{let e=document.getElementById(`mcpAddForm`);e&&e.innerHTML.trim()?Sn():xn()});let a=document.getElementById(`mcpAddForm`);a&&a.addEventListener(`click`,async e=>{if(e.target.dataset.action===`transport-change`){bn(e.target);return}if(!mn(e)&&(e.target.id===`mcpAddCancel`&&Sn(),e.target.id===`mcpAddConfirm`)){let e=document.getElementById(`mcpAddId`)?.value.trim(),n=document.getElementById(`mcpAddName`)?.value.trim(),r=yn(`mcpAdd`),i=document.getElementById(`mcpAddCommand`)?.value.trim(),a=document.getElementById(`mcpAddArgs`)?.value.trim(),o=document.getElementById(`mcpAddUrl`)?.value.trim(),s=r===`sse`||r===`streamableHttp`||r===`websocket`;if(!e){Z(t(`toolbox.mcpIdRequired`),`warning`);return}if(s){if(!o){Z(t(`toolbox.mcpUrlRequired`),`warning`);return}}else if(!i){Z(t(`toolbox.mcpCommandRequired`),`warning`);return}let c=document.getElementById(`mcpAddEnvRows`),l=document.getElementById(`mcpAddHeaderRows`),u={id:e,name:n||e,transport:r,command:i,args:a?a.split(/\s+/):[],url:o,env:c?un(c):{},headers:l?fn(l):{},enabled:!0};try{await Cn(u),Z(t(`toolbox.mcpAddSuccess`),`success`),Sn(),Kn(),await X()}catch(e){Z(t(`toolbox.mcpAddFailed`,{error:e.message}),`error`)}}});let o=document.getElementById(`mcpServerList`);o&&o.addEventListener(`click`,async e=>{if(e.target.dataset.action===`transport-change`){bn(e.target);return}if(mn(e))return;let n=e.target.closest(`button, input`);if(!n)return;let r=n.dataset.action,i=n.dataset.mcpId;if(!(!r||!i))try{if(r===`connect`)Z(t(`toolbox.mcpConnecting`),`info`),await Tn(i),Z(t(`toolbox.mcpConnectSuccess`),`success`),Kn(),await X();else if(r===`disconnect`)await En(i),Z(t(`toolbox.mcpDisconnectSuccess`),`success`),Kn(),await X();else if(r===`toggle`){let e=n.checked;await Dn(i,e),Z(t(e?`toolbox.mcpEnabledToast`:`toolbox.mcpDisabledToast`),`success`),Kn(),await X()}else if(r===`delete`){if(!await tn(t(`toolbox.mcpConfirmDelete`),t(`toolbox.deleteConfirmTitle`)))return;await wn(i),Z(t(`toolbox.deleteSuccess`),`success`),Kn(),await X()}else if(r===`edit`)Yn(i);else if(r===`cancel-edit`)Xn();else if(r===`save-edit`)await Zn();else if(r===`toggle-tools`){let e=document.getElementById(`mcp-tools-${i}`),r=n;if(e){let n=e.style.display===`none`;e.style.display=n?`block`:`none`,r.innerHTML=n?`▼ ${t(`toolbox.collapseTools`,{count:e.children.length})}`:`▶ ${t(`toolbox.viewTools`,{count:e.children.length})}`}}}catch(e){Z(t(`toolbox.operationFailed`,{error:e.message}),`error`)}});let s=document.getElementById(`skillList`);s&&s.addEventListener(`click`,async e=>{let n=e.target.closest(`button`);if(!n)return;let i=n.dataset.action,a=n.dataset.skillName;if(n.classList.contains(`skill-expand-btn`)){let e=n.dataset.target;if(e===`desc`){let e=n.previousElementSibling;e&&e.classList.contains(`skill-card-desc`)&&(e.textContent=decodeURIComponent(n.dataset.full||``),n.remove())}else if(e===`resources`)try{let e=JSON.parse(decodeURIComponent(n.dataset.full||`[]`)),r=n.parentElement;r&&r.classList.contains(`skill-card-params`)&&(r.innerHTML=e.map(e=>`<span class="skill-param-tag" title="${t(`toolbox.sizeBytes`,{size:e.size})}">📄 ${Y(e.name)}</span>`).join(``))}catch(e){r.error(`Failed to expand resources:`,e)}return}if(!(!i||!a))try{if(i===`delete-skill`){if(!await tn(t(`toolbox.skillConfirmDelete`,{name:a}),t(`toolbox.deleteConfirmTitle`)))return;await Fn(a),Z(t(`toolbox.deleteSuccess`),`success`),await X()}else if(i===`toggle-skill`)Z(await In(a)?t(`toolbox.skillEnabledToast`,{name:a}):t(`toolbox.skillDisabledToast`,{name:a}),`success`),await X();else if(i===`run-skill`){let e=await J(`GET`,`/api/skill/detail?name=${encodeURIComponent(a)}`);if(!e?.success||!e.skill){Z(t(`toolbox.skillInfoFailed`,{error:e?.error||t(`agentConfig.unknownError`)}),`error`);return}let n=Rn(e.skill);if(n.hasRequired){let r=await zn(a,n);if(r===null)return;Z(t(`toolbox.skillRunning`,{name:a}),`info`),Bn(a,e,await Ln(a,r))}else Z(t(`toolbox.skillRunning`,{name:a}),`info`),Bn(a,e,await Ln(a))}else if(i===`edit-agent-skill`)try{let e=await Hn(a);e.success?Un(a,e):Z(e.error||t(`toolbox.skillContentFailed`),`error`)}catch(e){Z(t(`toolbox.skillGetFailed`,{error:e.message}),`error`)}else if(i===`view-agent-skill`)try{let e=await Hn(a);e.success?nn(a,e):Z(e.error||t(`toolbox.skillContentFailed`),`error`)}catch(e){Z(t(`toolbox.skillGetFailed`,{error:e.message}),`error`)}}catch(e){Z(t(`toolbox.operationFailed`,{error:e.message}),`error`)}});let c=document.getElementById(`importSkillBtn`);c&&c.addEventListener(`click`,()=>Wn());let l=document.getElementById(`reloadSkillsBtn`);l&&l.addEventListener(`click`,async()=>{try{let e=await Vn();Z(t(`toolbox.skillsReloaded`,{count:e.count||0}),`success`),await X()}catch(e){Z(t(`toolbox.skillsReloadFailed`,{error:e.message}),`error`)}}),On(),Gn(),X()}function Z(e,t=`info`){let n=document.getElementById(`toastContainer`);if(!n)return;let r=document.createElement(`div`);r.className=`toast ${t}`,r.textContent=e,n.appendChild(r),requestAnimationFrame(()=>r.classList.add(`toast-show`)),setTimeout(()=>{r.classList.remove(`toast-show`),setTimeout(()=>r.remove(),300)},2500)}var er=2e3,tr=[`vectra`,`@huggingface/transformers`,`pdf-parse`,`mammoth`,`officeparser`,`cheerio`],nr=null,rr=null;function ir(e){rr=e}async function ar(){if(await rn(),!q.agentConnected)return{connected:!1,ragAvailable:!1,nodeVersion:null};try{let e=await J(`GET`,`/api/status`);return{connected:!0,ragAvailable:e.ragAvailable===!0,nodeVersion:e.nodeVersion||null}}catch(e){return r.warn(`[RAG] Failed to fetch agent status:`,e.message),{connected:!0,ragAvailable:!1,nodeVersion:null,unreachable:!0}}}async function or(){try{return await J(`GET`,`/api/rag/install/status`)}catch(e){return r.warn(`[RAG] Failed to fetch install status:`,e.message),null}}function sr(){try{chrome.runtime.sendMessage({type:`RELOAD_RAG_TOOLS`},e=>{e?.success&&r.debug(`[Toolbox] Background re loaded ${e.count} RAG tool`)})}catch{}}function cr(e){if(!e)return!0;let t=parseInt(String(e).replace(/^v/i,``),10);return!Number.isFinite(t)||t>=22}function lr(e,t,n,r=``){return`
|
|
484
499
|
<div class="toolbox-empty" style="text-align:left; padding:20px 16px;">
|
|
485
500
|
<div class="toolbox-empty-title" style="display:flex; align-items:center; gap:8px; font-size:14px;">
|
|
486
501
|
<span style="font-size:20px;">${e}</span><span>${t}</span>
|
|
487
502
|
</div>
|
|
488
503
|
<div class="toolbox-empty-desc" style="margin-top:6px; line-height:1.6;">${n}</div>
|
|
489
504
|
${r}
|
|
490
|
-
</div>`}function
|
|
505
|
+
</div>`}function ur(e){let n=e&&Array.isArray(e.packages)&&e.packages.length>0?e.packages:tr,r=`npm install ${n.join(` `)}`,i=e&&e.done&&!e.success,a=i&&Array.isArray(e.logTail)&&e.logTail.length>0?Y(e.logTail.join(`
|
|
491
506
|
`)):``,o=i?`
|
|
492
507
|
<div style="margin-top:12px; padding:10px 12px; background:#fdf1f0; border:1px solid #f2c9c4; border-radius:6px;">
|
|
493
508
|
<div style="color:#c0392b; font-weight:600; font-size:12px; margin-bottom:6px;">⚠️ ${Y(e.error||t(`toolbox.ragInstallFailedToast`))}</div>
|
|
@@ -510,33 +525,33 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
510
525
|
<div style="margin-top:16px; display:flex; gap:10px;">
|
|
511
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>
|
|
512
527
|
<button class="toolbox-add-btn" id="ragRedetectBtn" style="width:auto; flex:none; margin:0; padding:8px 18px;">${t(`toolbox.ragRedetectBtn`)}</button>
|
|
513
|
-
</div>`;return
|
|
514
|
-
`)):``,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 lr(`📦`,t(`toolbox.ragStatusNotInstalledTitle`),t(`toolbox.ragStatusNotInstalledDesc`),c)}function dr(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?Y(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 lr(`⏳`,r,t(`toolbox.ragInstallTip`),a)}function fr(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=lr(`🔌`,t(`toolbox.ragStatusAgentOffTitle`),t(`toolbox.ragStatusAgentOffDesc`));return}if(o){n.innerHTML=lr(`⚠️`,t(`toolbox.ragStatusUnreachableTitle`),t(`toolbox.ragStatusUnreachableDesc`));return}if(s&&s.running){n.innerHTML=dr(s);return}if(i){n.innerHTML=lr(`✅`,t(`toolbox.ragStatusReadyTitle`),t(`toolbox.ragStatusReadyDesc`));return}if(!cr(a)){n.innerHTML=lr(`⚠️`,t(`toolbox.ragStatusNodeLowTitle`),t(`toolbox.ragStatusNodeLowDesc`,{version:Y(a||`?`)}));return}n.innerHTML=ur(s)}function pr(){nr&&=(clearTimeout(nr),null)}function mr(){pr();let e=async()=>{let n=await or();if(n&&n.running){fr({connected:!0,ragAvailable:!1,nodeVersion:null,install:n}),nr=setTimeout(e,er);return}pr();let r=await ar();r.connected&&!r.ragAvailable&&(r.install=n),fr(r),n&&n.done&&(U(n.success?t(`toolbox.ragInstallSuccess`):t(`toolbox.ragInstallFailedToast`),n.success?`success`:`error`),n.success&&(sr(),await rr?.()))};nr=setTimeout(e,er)}async function hr(){let e=document.getElementById(`ragInstallBtn`);e&&(e.disabled=!0,e.textContent=t(`toolbox.ragInstallBtnBusy`));try{let n=await J(`POST`,`/api/rag/install`);if(!n||!n.started){U(n&&n.error?n.error:t(`toolbox.ragInstallFailedToast`),`error`);let r=await or();if(r&&r.running){mr();return}e&&(e.disabled=!1,e.textContent=t(`toolbox.ragInstallBtn`));return}U(t(`toolbox.ragInstallStarted`),`info`),mr()}catch(n){U(`${t(`toolbox.ragInstallFailedToast`)}: ${n.message}`,`error`),e&&(e.disabled=!1,e.textContent=t(`toolbox.ragInstallBtn`))}}async function gr(){let e=document.getElementById(`ragRedetectBtn`);e&&(e.disabled=!0);try{let e=await J(`POST`,`/api/rag/detect`);e&&e.success?e.available?(U(t(`toolbox.ragRedetectReady`),`success`),sr(),await rr?.()):e.error?U(t(`toolbox.ragRedetectStillMissingDetail`,{error:e.error}),`error`):U(t(`toolbox.ragRedetectStillMissing`),`info`):U(t(`toolbox.ragRedetectFailed`,{error:e&&e.error||`unknown`}),`error`)}catch(e){U(t(`toolbox.ragRedetectFailed`,{error:e.message}),`error`)}await vr()}async function _r(){let e=document.getElementById(`ragInstallCmd`),n=e?e.textContent:`npm install ${tr.join(` `)}`;try{await navigator.clipboard.writeText(n),U(t(`toolbox.ragCopied`),`success`)}catch(e){r.warn(`[RAG] Clipboard write failed:`,e.message),U(t(`toolbox.ragCopyFailed`),`error`)}}async function vr(){let e=await ar();if(!e.connected||e.ragAvailable||e.unreachable){e.ragAvailable&&sr(),fr(e),pr();return}e.install=await or(),fr(e),e.install&&e.install.running?mr():pr()}function yr(){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 hr():t.id===`ragRedetectBtn`?await gr():t.id===`ragCopyCmdBtn`&&await _r())}))}var br=52428800,xr=400,Sr=80,Cr=5,wr=.3,Tr=`.txt,.md,.markdown,.pdf,.docx,.doc,.xlsx,.xls,.csv,.pptx,.html,.htm,.json,.rtf,.odt,.odp,.ods,.epub`,Er=[],Dr=``,Or=`all`,kr=!1;function Ar(){if(kr)return;kr=!0;let e=document.getElementById(`knowledgeList`);e&&e.addEventListener(`click`,zr);let t=document.getElementById(`kbSearchInput`);if(t){let e=null;t.addEventListener(`input`,()=>{clearTimeout(e),e=setTimeout(()=>{Dr=t.value.trim(),Ir(Er)},200)});let n=document.getElementById(`kbSearchClear`);n&&n.addEventListener(`click`,()=>{t.value=``,Dr=``,Ir(Er),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`),Or=e.dataset.filter,Ir(Er)})});let r=document.getElementById(`createKbBtn`);r&&r.addEventListener(`click`,()=>Jr());let i=document.getElementById(`ragGlobalToggle`);i&&(chrome.storage.local.get(`ragEnabled`,e=>{let t=e.ragEnabled===!0;i.checked=t,Mr(t)}),i.addEventListener(`change`,()=>Nr(i.checked))),ir(()=>jr());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"]`)&&Nr(!0)}),jr()}async function jr(){let e=document.getElementById(`knowledgeGate`),t=document.getElementById(`knowledgeMain`);if(!e||!t)return;let n=await ar(),{ragEnabled:r}=await chrome.storage.local.get(`ragEnabled`),i=document.getElementById(`createKbBtn`);if(!n.connected){Pr(`agentOff`),i&&(i.disabled=!0);return}if(r!==!0){Pr(`ragOff`),i&&(i.disabled=!0);return}if(!n.ragAvailable){Pr(`ragUnavailable`),i&&(i.disabled=!0),yr(),await vr();return}i&&(i.disabled=!1),e.style.display=`none`,t.style.display=``,await Q()}function Mr(e){let n=document.getElementById(`ragToggleLabel`);n&&(n.textContent=t(e?`common.enabled`:`common.disabled`),n.style.color=e?`#666`:`#999`)}async function Nr(e){await chrome.storage.local.set({ragEnabled:e});let n=document.getElementById(`ragGlobalToggle`);n&&(n.checked=e),Mr(e),U(t(e?`toolbox.ragServiceEnabled`:`toolbox.ragServiceDisabled`),`info`),await jr()}function Pr(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">${Fr()}</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;">${Y(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;">${Y(i.btn)}</button>`;n.innerHTML=`
|
|
515
530
|
<div class="toolbox-empty" style="text-align:left; padding:24px 20px;">
|
|
516
531
|
<div style="display:flex; align-items:center; gap:10px; font-size:15px; font-weight:600; color:#555;">
|
|
517
532
|
<span style="font-size:22px;">${i.icon}</span><span>${Y(i.title)}</span>
|
|
518
533
|
</div>
|
|
519
534
|
<div style="margin-top:8px; line-height:1.7; color:#888; font-size:13px;">${Y(i.desc)}</div>
|
|
520
535
|
${a}
|
|
521
|
-
</div>`}async function Q(){let e=document.getElementById(`knowledgeList`);if(e){e.innerHTML=
|
|
536
|
+
</div>`}async function Q(){let e=document.getElementById(`knowledgeList`);if(e){e.innerHTML=Fr();try{let e=await J(`GET`,`/api/rag/collections`);if(!e||e.success!==!0)throw Error(e?.error||`unknown error`);Er=e.collections||[],Ir(Er)}catch(n){r.warn(`[Knowledge] Failed to load collections:`,n.message),Rr([]),e.innerHTML=`
|
|
522
537
|
<div class="toolbox-empty" style="grid-column:1/-1;">
|
|
523
538
|
<div class="toolbox-empty-icon">⚠️</div>
|
|
524
539
|
<div class="toolbox-empty-title">${Y(t(`knowledge.loadFailed`,{error:n.message}))}</div>
|
|
525
540
|
<button class="toolbox-add-btn" id="kbRetryBtn" style="width:auto; margin-top:12px; padding:8px 18px;">${Y(t(`knowledge.retry`))}</button>
|
|
526
|
-
</div>`}}}function
|
|
541
|
+
</div>`}}}function Fr(){return`
|
|
527
542
|
<div class="toolbox-empty" style="grid-column:1/-1;">
|
|
528
543
|
<div class="toolbox-empty-icon">⏳</div>
|
|
529
544
|
<div class="toolbox-empty-title">${Y(t(`toolbox.loading`))}</div>
|
|
530
|
-
</div>`}function
|
|
545
|
+
</div>`}function Ir(e){let n=document.getElementById(`knowledgeList`);if(!n)return;if(e.length===0){Rr(e),n.innerHTML=`
|
|
531
546
|
<div class="toolbox-empty" style="grid-column:1/-1; padding:50px 20px;">
|
|
532
547
|
<div class="toolbox-empty-icon">📚</div>
|
|
533
548
|
<div class="toolbox-empty-title">${Y(t(`knowledge.emptyTitle`))}</div>
|
|
534
549
|
<div class="toolbox-empty-desc">${Y(t(`knowledge.emptyDesc`))}</div>
|
|
535
|
-
</div>`;return}let r=e.filter(e=>
|
|
550
|
+
</div>`;return}let r=e.filter(e=>Or===`enabled`&&e.enabled===!1||Or===`disabled`&&e.enabled!==!1?!1:!Dr||[e.name,e.description].filter(Boolean).join(` `).toLowerCase().includes(Dr.toLowerCase()));if(Rr(e),r.length===0){n.innerHTML=`
|
|
536
551
|
<div class="toolbox-empty" style="grid-column:1/-1; padding:50px 20px;">
|
|
537
552
|
<div class="toolbox-empty-icon">🔍</div>
|
|
538
553
|
<div class="toolbox-empty-title">${Y(t(`toolbox.noMatchResult`))}</div>
|
|
539
|
-
</div>`;return}n.innerHTML=r.map(
|
|
554
|
+
</div>`;return}n.innerHTML=r.map(Lr).join(``)}function Lr(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`
|
|
540
555
|
<div class="kb-card${n?` kb-card-disabled`:``}" data-kb-id="${Y(e.id)}">
|
|
541
556
|
<div class="kb-card-title">
|
|
542
557
|
<span>📚</span>
|
|
@@ -554,7 +569,7 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
554
569
|
<button class="kb-action-btn" type="button" data-action="toggle">${Y(t(n?`knowledge.actionEnable`:`knowledge.actionDisable`))}</button>
|
|
555
570
|
<button class="kb-action-btn kb-action-danger" type="button" data-action="delete">${Y(t(`knowledge.actionDelete`))}</button>
|
|
556
571
|
</div>
|
|
557
|
-
</div>`}function
|
|
572
|
+
</div>`}function Rr(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 zr(e){if(e.target.closest(`#kbRetryBtn`)){await Q();return}let t=e.target.closest(`.kb-action-btn`);if(!t)return;let n=t.closest(`[data-kb-id]`),r=Er.find(e=>e.id===n?.dataset.kbId);if(!r)return;let i=t.dataset.action;i===`ingest`?Xr(r):i===`edit`?qr(r):i===`search`?ei(r):i===`docs`?Qr(r):i===`toggle`?await Vr(r):i===`delete`&&await Br(r)}async function Br(e){if(await tn(t(`knowledge.deleteConfirm`,{name:e.name,docs:e.documentCount||0,chunks:e.chunkCount||0}),t(`knowledge.deleteConfirmTitle`)))try{let n=await J(`DELETE`,`/api/rag/collections/${encodeURIComponent(e.id)}`);if(!n||n.success!==!0)throw Error(n?.error||`unknown error`);U(t(`knowledge.deleteSuccess`),`success`),await Q()}catch(e){U(t(`knowledge.opFailed`,{error:e.message}),`error`)}}async function Vr(e){try{let n=await J(`POST`,`/api/rag/collections/${encodeURIComponent(e.id)}/toggle`);if(!n||n.success!==!0)throw Error(n?.error||`unknown error`);U(n.enabled===!1?t(`knowledge.disableSuccess`,{name:e.name}):t(`knowledge.enableSuccess`,{name:e.name}),`success`),await Q()}catch(e){U(t(`knowledge.opFailed`,{error:e.message}),`error`)}}function Hr(e={}){let n=e.mode===`openai-compat`;return`
|
|
558
573
|
<div class="form-group">
|
|
559
574
|
<label>${Y(t(`knowledge.vectorSectionTitle`))}</label>
|
|
560
575
|
<div class="kb-radio-row">
|
|
@@ -590,7 +605,7 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
590
605
|
</div>
|
|
591
606
|
</div>
|
|
592
607
|
</div>
|
|
593
|
-
</div>`}function
|
|
608
|
+
</div>`}function Ur(e,n=null){let r=e.querySelector(`#kbVecRemoteFields`),i=e.querySelector(`#kbVecHint`),a=()=>{let n=e.querySelector(`input[name="kbVecMode"]:checked`)?.value===`openai-compat`;r&&(r.style.display=n?``:`none`),i&&(i.textContent=t(n?`knowledge.vectorModeRemoteHint`:`knowledge.vectorModeLocalHint`))};e.querySelectorAll(`input[name="kbVecMode"]`).forEach(e=>e.addEventListener(`change`,a)),a();let o=e.querySelector(`#kbVecTestBtn`);if(!o)return;let s=e.querySelector(`#kbVecTestResult`),c=e.querySelector(`#kbVecDims`);o.addEventListener(`click`,async()=>{let r=e.querySelector(`#kbVecEndpoint`).value.trim(),i=e.querySelector(`#kbVecModel`).value.trim();if(!r){U(t(`knowledge.vectorEndpointRequired`),`warning`);return}if(!i){U(t(`knowledge.vectorModelRequired`),`warning`);return}let a=e.querySelector(`#kbVecApiKey`).value.trim(),l=parseInt(c?.value.trim()||``,10);o.disabled=!0;let u=o.textContent;o.textContent=t(`knowledge.vectorTesting`),s&&(s.textContent=``,s.style.color=``);try{let e=await J(`POST`,`/api/rag/test-embedding`,{mode:`openai-compat`,endpoint:r,apiKey:a,modelName:i,...n?{collectionId:n}:{},...Number.isFinite(l)&&l>0?{dimensions:l}:{}});if(!e||e.success!==!0)throw Error(e?.error||`unknown error`);if(s&&(s.textContent=`✓ ${t(`knowledge.vectorTestOk`,{model:e.model,dims:e.dimensions})}`,s.style.color=`#38a169`),c&&e.dimensions){let n=c.value.trim();c.value=String(e.dimensions),n!==String(e.dimensions)&&U(t(`knowledge.vectorDimsFilled`,{dims:e.dimensions}),`info`)}}catch(e){s&&(s.textContent=`✕ ${t(`knowledge.vectorTestFailed`,{error:e.message})}`,s.style.color=`#c0392b`)}finally{o.disabled=!1,o.textContent=u||t(`knowledge.vectorTestBtn`)}})}function Wr(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 Gr(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 Kr(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 J(`GET`,`/api/rag/collections/${encodeURIComponent(e)}/ingest/status`))?.progress;n&&n.done&&(clearInterval(i),t(n))}catch{}},1e3)})}function qr(e){let n=ni({title:t(`knowledge.editTitle`),bodyHtml:`
|
|
594
609
|
<div class="form-group">
|
|
595
610
|
<label>${Y(t(`knowledge.nameLabel`))}</label>
|
|
596
611
|
<input type="text" id="kbEditName" maxlength="100" placeholder="${Y(t(`knowledge.namePlaceholder`))}" value="${Y(e.name||``)}">
|
|
@@ -599,7 +614,7 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
599
614
|
<label>${Y(t(`knowledge.descLabel`))}</label>
|
|
600
615
|
<input type="text" id="kbEditDesc" maxlength="500" placeholder="${Y(t(`knowledge.descPlaceholder`))}" value="${Y(e.description||``)}">
|
|
601
616
|
</div>
|
|
602
|
-
${
|
|
617
|
+
${Hr(e.embeddingConfig||{})}`,confirmText:t(`knowledge.editConfirm`),closeOnOverlay:!1,onConfirm:async({close:r,setBusy:i})=>{let{overlay:a}=n,o=a.querySelector(`#kbEditName`).value.trim(),s=a.querySelector(`#kbEditDesc`).value.trim();if(!o){U(t(`knowledge.nameRequired`),`warning`);return}let c=Wr(a);if(c.mode===`openai-compat`){if(!c.endpoint){U(t(`knowledge.vectorEndpointRequired`),`warning`);return}if(!c.modelName){U(t(`knowledge.vectorModelRequired`),`warning`);return}}if(!(Gr(e.embeddingConfig||{},c)&&!await tn(t(`knowledge.rebuildConfirm`),t(`knowledge.rebuildConfirmTitle`)))){i(!0,t(`knowledge.saving`));try{let n=await J(`PUT`,`/api/rag/collections/${encodeURIComponent(e.id)}`,{name:o,description:s,embeddingConfig:c});if(!n||n.success!==!0)throw Error(n?.error||`unknown error`);r(),n.collection?.rebuilding?(U(t(`knowledge.rebuildStarted`),`info`),await Q(),Kr(e.id).then(e=>{e.phase===`error`?U(t(`knowledge.rebuildFailed`,{error:e.error||`unknown error`}),`error`):U(t(`knowledge.rebuildDone`),`success`),Q()}).catch(e=>{U(t(`knowledge.rebuildFailed`,{error:e.message}),`error`),Q()})):(U(t(`knowledge.editSuccess`),`success`),await Q())}catch(e){i(!1,t(`knowledge.editConfirm`)),U(t(`knowledge.opFailed`,{error:e.message}),`error`)}}}});Ur(n.overlay,e.id);let r=n.overlay.querySelector(`#kbEditName`);r?.focus(),r?.select()}function Jr(){let e=ni({title:t(`knowledge.createTitle`),bodyHtml:`
|
|
603
618
|
<div class="form-group">
|
|
604
619
|
<label>${Y(t(`knowledge.nameLabel`))}</label>
|
|
605
620
|
<input type="text" id="kbCreateName" maxlength="100" placeholder="${Y(t(`knowledge.namePlaceholder`))}">
|
|
@@ -608,7 +623,7 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
608
623
|
<label>${Y(t(`knowledge.descLabel`))}</label>
|
|
609
624
|
<input type="text" id="kbCreateDesc" maxlength="500" placeholder="${Y(t(`knowledge.descPlaceholder`))}">
|
|
610
625
|
</div>
|
|
611
|
-
${
|
|
626
|
+
${Hr({})}`,confirmText:t(`knowledge.createConfirm`),closeOnOverlay:!1,onConfirm:async({close:n,setBusy:r})=>{let{overlay:i}=e,a=i.querySelector(`#kbCreateName`).value.trim(),o=i.querySelector(`#kbCreateDesc`).value.trim();if(!a){U(t(`knowledge.nameRequired`),`warning`);return}let s=Wr(i);if(s.mode===`openai-compat`){if(!s.endpoint){U(t(`knowledge.vectorEndpointRequired`),`warning`);return}if(!s.modelName){U(t(`knowledge.vectorModelRequired`),`warning`);return}}r(!0,t(`knowledge.creating`));try{let e=await J(`POST`,`/api/rag/collections`,{name:a,description:o,embeddingConfig:s});if(!e||e.success!==!0)throw Error(e?.error||`unknown error`);n(),U(t(`knowledge.createSuccess`,{name:e.collection?.name||a}),`success`),await Q()}catch(e){r(!1,t(`knowledge.createConfirm`)),U(t(`knowledge.opFailed`,{error:e.message}),`error`)}}});Ur(e.overlay),e.overlay.querySelector(`#kbCreateName`)?.focus()}function Yr(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 Xr(e){let n=`
|
|
612
627
|
<div class="import-tabs" id="kbIngestTabs">
|
|
613
628
|
<button type="button" class="import-tab active" data-tab="file">${Y(t(`knowledge.tabFile`))}</button>
|
|
614
629
|
<button type="button" class="import-tab" data-tab="text">${Y(t(`knowledge.tabText`))}</button>
|
|
@@ -621,7 +636,7 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
621
636
|
<div style="margin-top:6px; font-size:12px; color:#999;">${Y(t(`knowledge.dropSupported`))}</div>
|
|
622
637
|
<div id="kbSelectedFile" style="display:none; margin-top:8px; color:#38a169; font-weight:500; font-size:13px;"></div>
|
|
623
638
|
</div>
|
|
624
|
-
<input type="file" id="kbFileInput" style="display:none" accept="${
|
|
639
|
+
<input type="file" id="kbFileInput" style="display:none" accept="${Tr}">
|
|
625
640
|
</div>
|
|
626
641
|
<div class="import-panel" data-panel="text">
|
|
627
642
|
<div class="form-group">
|
|
@@ -642,20 +657,20 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
642
657
|
<div class="kb-chunk-row">
|
|
643
658
|
<span class="kb-chunk-title">${Y(t(`knowledge.chunkSettingsTitle`))}</span>
|
|
644
659
|
<label class="kb-chunk-inline">${Y(t(`knowledge.chunkSizeLabel`))}
|
|
645
|
-
<input type="number" id="kbChunkSize" min="100" max="2000" step="50" value="${
|
|
660
|
+
<input type="number" id="kbChunkSize" min="100" max="2000" step="50" value="${xr}">
|
|
646
661
|
</label>
|
|
647
662
|
<label class="kb-chunk-inline">${Y(t(`knowledge.chunkOverlapLabel`))}
|
|
648
|
-
<input type="number" id="kbChunkOverlap" min="0" max="500" step="10" value="${
|
|
663
|
+
<input type="number" id="kbChunkOverlap" min="0" max="500" step="10" value="${Sr}">
|
|
649
664
|
</label>
|
|
650
665
|
</div>
|
|
651
|
-
<div id="kbIngestStatus" class="kb-status" style="display:none;">⏳ ${Y(t(`knowledge.ingesting`))}</div>`,r=null,i=
|
|
666
|
+
<div id="kbIngestStatus" class="kb-status" style="display:none;">⏳ ${Y(t(`knowledge.ingesting`))}</div>`,r=null,i=ni({title:t(`knowledge.ingestTitle`,{name:e.name}),bodyHtml:n,confirmText:t(`knowledge.ingestConfirm`),onConfirm:async({close:n,setBusy:a})=>{let{overlay:o}=i,s=o.querySelector(`.import-tab.active`)?.dataset.tab||`file`,c=null;if(s===`file`){if(!r){U(t(`knowledge.fileRequired`),`warning`);return}let e=await Zr(r);c={type:`file`,fileName:r.name,contentBase64:e}}else if(s===`text`){let e=o.querySelector(`#kbIngestText`).value,n=o.querySelector(`#kbIngestName`).value.trim();if(!e.trim()){U(t(`knowledge.contentRequired`),`warning`);return}c={type:`text`,content:e,name:n||void 0}}else{let e=o.querySelector(`#kbIngestUrl`).value.trim();if(!e){U(t(`knowledge.urlRequired`),`warning`);return}c={type:`url`,url:e}}let l=parseInt(o.querySelector(`#kbChunkSize`).value,10),u=parseInt(o.querySelector(`#kbChunkOverlap`).value,10);c.chunkConfig={...Number.isFinite(l)&&l>=100&&l<=2e3?{chunkSize:l}:{},...Number.isFinite(u)&&u>=0&&u<=500?{overlap:u}:{}};let d=o.querySelector(`#kbIngestStatus`);d&&(d.style.display=``,d.textContent=`⏳ ${t(`knowledge.ingesting`)}`),a(!0);let f=setInterval(async()=>{try{let t=await J(`GET`,`/api/rag/collections/${encodeURIComponent(e.id)}/ingest/status`);d&&t&&t.success&&t.progress&&(d.textContent=Yr(t.progress))}catch{}},800);try{let r=await J(`POST`,`/api/rag/collections/${encodeURIComponent(e.id)}/ingest`,c);if(!r||r.success!==!0)throw Error(r?.error||`unknown error`);n(),U(t(`knowledge.ingestSuccess`,{name:r.name,chunks:r.chunkCount}),`success`),await Q()}catch(e){d&&(d.style.display=`none`),a(!1),U(t(`knowledge.ingestFailed`,{error:e.message}),`error`)}finally{clearInterval(f)}}}),{overlay:a}=i;a.querySelector(`#kbIngestTabs`).addEventListener(`click`,e=>{let t=e.target.closest(`.import-tab`);t&&(a.querySelectorAll(`.import-tab`).forEach(e=>e.classList.toggle(`active`,e===t)),a.querySelectorAll(`.import-panel`).forEach(e=>{e.classList.toggle(`active`,e.dataset.panel===t.dataset.tab)}))});let o=a.querySelector(`#kbDropzone`),s=a.querySelector(`#kbFileInput`),c=a.querySelector(`#kbSelectedFile`),l=e=>{if(e){if(e.size>br){U(t(`knowledge.fileTooLarge`),`warning`);return}r=e,o.classList.add(`has-file`),c.style.display=``,c.textContent=t(`knowledge.selectedFile`,{name:e.name})}};o.addEventListener(`click`,()=>s.click()),s.addEventListener(`change`,()=>l(s.files?.[0])),o.addEventListener(`dragover`,e=>e.preventDefault()),o.addEventListener(`drop`,e=>{e.preventDefault(),l(e.dataTransfer?.files?.[0])})}function Zr(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 Qr(e){let n=ni({title:t(`knowledge.docsTitle`,{name:e.name}),bodyHtml:`<div id="kbDocsBody">${Fr()}</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 tn(t(`knowledge.docDeleteConfirm`,{name:s}),t(`knowledge.docDeleteConfirmTitle`)))try{let r=await J(`DELETE`,`/api/rag/collections/${encodeURIComponent(e.id)}/documents/${encodeURIComponent(o)}`);if(!r||r.success!==!0)throw Error(r?.error||`unknown error`);U(t(`knowledge.docDeleteSuccess`),`success`),await $r(n,e),Q()}catch(e){U(t(`knowledge.opFailed`,{error:e.message}),`error`)}}),$r(n,e)}async function $r(e,n){e.innerHTML=Fr();try{let r=await J(`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;">${Y(t(`knowledge.docsEmpty`))}</div>`;return}e.innerHTML=`<div class="kb-doc-list">${i.map(e=>`
|
|
652
667
|
<div class="kb-doc-row" data-doc-id="${Y(e.id)}">
|
|
653
668
|
<div class="kb-doc-info">
|
|
654
669
|
<div class="kb-doc-name" title="${Y(e.name)}">${Y(e.name)}</div>
|
|
655
|
-
<div class="kb-doc-meta">${Y(t(`knowledge.docChunkCount`,{count:e.chunkCount}))} · ${Y(
|
|
670
|
+
<div class="kb-doc-meta">${Y(t(`knowledge.docChunkCount`,{count:e.chunkCount}))} · ${Y(ri(e.createdAt))}</div>
|
|
656
671
|
</div>
|
|
657
672
|
<button class="kb-doc-del" type="button" data-doc-delete title="${Y(t(`knowledge.actionDelete`))}">✕</button>
|
|
658
|
-
</div>`).join(``)}</div>`}catch(n){e.innerHTML=`<div class="kb-status" style="color:#c0392b;">${Y(t(`knowledge.loadFailed`,{error:n.message}))}</div>`}}function
|
|
673
|
+
</div>`).join(``)}</div>`}catch(n){e.innerHTML=`<div class="kb-status" style="color:#c0392b;">${Y(t(`knowledge.loadFailed`,{error:n.message}))}</div>`}}function ei(e){let n=`
|
|
659
674
|
<div class="kb-search-scope">${Y(t(`knowledge.searchScope`,{name:e.name}))}</div>
|
|
660
675
|
<div class="kb-search-bar">
|
|
661
676
|
<input type="text" id="kbSearchQuery" placeholder="${Y(t(`knowledge.searchQueryPlaceholder`))}">
|
|
@@ -663,13 +678,13 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
663
678
|
</div>
|
|
664
679
|
<div class="kb-search-opts">
|
|
665
680
|
<label class="kb-chunk-inline">${Y(t(`knowledge.searchTopKLabel`))}
|
|
666
|
-
<input type="number" id="kbSearchTopK" min="1" max="20" value="${
|
|
681
|
+
<input type="number" id="kbSearchTopK" min="1" max="20" value="${Cr}">
|
|
667
682
|
</label>
|
|
668
683
|
<label class="kb-chunk-inline">${Y(t(`knowledge.searchThresholdLabel`))}
|
|
669
|
-
<input type="number" id="kbSearchThreshold" min="0" max="1" step="0.05" value="${
|
|
684
|
+
<input type="number" id="kbSearchThreshold" min="0" max="1" step="0.05" value="${wr}">
|
|
670
685
|
</label>
|
|
671
686
|
</div>
|
|
672
|
-
<div id="kbSearchResults"></div>`,{overlay:r}=
|
|
687
|
+
<div id="kbSearchResults"></div>`,{overlay:r}=ni({title:t(`knowledge.searchTitle`),bodyHtml:n,confirmText:null,cancelText:t(`common.close`),wide:!0}),i=r.querySelector(`#kbSearchQuery`),a=r.querySelector(`#kbSearchBtn`),o=r.querySelector(`#kbSearchResults`),s=async()=>{let n=i.value.trim();if(!n){U(t(`knowledge.contentRequired`),`warning`);return}let s=parseInt(r.querySelector(`#kbSearchTopK`).value,10),c=parseFloat(r.querySelector(`#kbSearchThreshold`).value);a.disabled=!0,a.textContent=t(`knowledge.searching`),o.innerHTML=`<div class="kb-status">⏳ ${Y(t(`knowledge.searching`))}</div>`;try{let t=await J(`POST`,`/api/rag/collections/${encodeURIComponent(e.id)}/search`,{query:n,topK:Number.isFinite(s)&&s>0?s:Cr,threshold:Number.isFinite(c)?c:wr});if(!t||t.success!==!0)throw Error(t?.error||`unknown error`);ti(o,t)}catch(e){o.innerHTML=`<div class="kb-status" style="color:#c0392b;">${Y(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 ti(e,n){let r=n.results||[];if(r.length===0){e.innerHTML=`<div class="kb-status" style="color:#999;">${Y(t(`knowledge.searchNoHits`))}</div>`;return}e.innerHTML=`
|
|
673
688
|
${n.fallback?`<div class="kb-fallback-hint">⚠️ ${Y(t(`knowledge.searchFallbackHint`))}</div>`:``}
|
|
674
689
|
<div class="kb-hit-count">${Y(t(`knowledge.searchHitCount`,{count:r.length}))}</div>
|
|
675
690
|
<div class="kb-hit-list">${r.map(e=>`
|
|
@@ -679,7 +694,7 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
679
694
|
<span class="kb-hit-doc" title="${Y(e.metadata?.documentName||``)}">${Y(e.metadata?.documentName||``)}</span>
|
|
680
695
|
</div>
|
|
681
696
|
<div class="kb-hit-text">${Y(e.content||``)}</div>
|
|
682
|
-
</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
|
|
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 ni({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=`
|
|
683
698
|
<div class="modal-content kb-modal${s?` kb-modal-wide`:``}">
|
|
684
699
|
<div class="modal-header">
|
|
685
700
|
<h3>${Y(e)}</h3>
|
|
@@ -690,16 +705,16 @@ Precise technical terminology, runnable code examples, Markdown format, actionab
|
|
|
690
705
|
<button class="btn btn-cancel" type="button" data-modal-cancel>${Y(a||t(`common.cancel`))}</button>
|
|
691
706
|
${i?`<button class="btn btn-primary" type="button" data-modal-confirm>${Y(i)}</button>`:``}
|
|
692
707
|
</div>
|
|
693
|
-
</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 jr(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 Mr=1;function Nr(){let e=document.getElementById(`saveBar`);if(!e)return;let t=()=>{let t=e.getBoundingClientRect().bottom>=window.innerHeight-Mr;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 Pr(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 Fr(){let e=window.location.hash.replace(`#`,``);[`basic`,`toolbar`,`react`,`reflection`,`chat`,`agent`,`toolbox`,`knowledge`].includes(e)&&Pr(e)}document.addEventListener(`DOMContentLoaded`,async function(){await n(),i(),s(()=>{i(),Be().then(e=>{$=e,Ve($)})});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(),V(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(){Pr(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=`▼`))})}),Fr(),window.addEventListener(`hashchange`,Fr),chrome.storage.local.get([`optionsInitialTab`],e=>{e.optionsInitialTab&&(Pr(e.optionsInitialTab),chrome.storage.local.remove(`optionsInitialTab`))}),chrome.runtime.onMessage.addListener(e=>{e.type===`SWITCH_TAB`&&e.tab&&Pr(e.tab)}),await p(),Ne(),mt(),$=await Be(),Ve($);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`,Pe),Nr();let f=document.getElementById(`modelInput`),m=document.getElementById(`modelDropdown`);f.addEventListener(`click`,function(e){e.stopPropagation(),m.classList.contains(`show`)||(me(m,``),ve(A),f.select()),m.classList.toggle(`show`)}),f.addEventListener(`input`,function(){m.classList.add(`show`),me(m,this.value)}),f.addEventListener(`blur`,function(){f.value=A,ve(A)}),m.addEventListener(`click`,function(e){if(e.target.classList.contains(`delete-model-btn`)){e.stopPropagation();let t=e.target.closest(`.model-option`).dataset.value;he(t);return}let t=e.target.closest(`.model-option`);if(t){e.stopPropagation();let n=t.dataset.value;ce(n),f.value=n,ve(n),m.classList.remove(`show`)}}),document.addEventListener(`click`,function(e){!m.contains(e.target)&&e.target!==f&&m.classList.remove(`show`)});let h=document.getElementById(`addModelToggleBtn`),g=document.getElementById(`addModelForm`),_=document.getElementById(`addModelName`),v=document.getElementById(`addModelContextWindow`),y=document.getElementById(`confirmAddModelBtn`),ee=document.getElementById(`cancelAddModelBtn`);h&&g&&(h.addEventListener(`click`,function(){let e=g.style.display!==`none`;g.style.display=e?`none`:``,h.textContent=t(e?`settings.addModel`:`settings.collapse`),e||(_.value=``,v.value=``,_.focus())}),ee.addEventListener(`click`,function(){g.style.display=`none`,h.textContent=t(`settings.addModel`),_.value=``,v.value=``}),y.addEventListener(`click`,function(){let e=_.value.trim(),n=parseInt(v.value)||0;if(!e){V(`❌ `+t(`settings.modelNameRequired`),`error`);return}fe(e,n),f.value=e,ce(e),ve(e),chrome.storage.local.set({modelName:e}),g.style.display=`none`,h.textContent=t(`settings.addModel`),_.value=``,v.value=``,V(`✅ `+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`)||(me(S,``),Ce(le),x.select()),S.classList.toggle(`show`)}),x.addEventListener(`input`,function(){S.classList.add(`show`),me(S,this.value)}),x.addEventListener(`blur`,function(){x.value=le,Ce(le)}),S.addEventListener(`click`,function(e){if(e.target.classList.contains(`delete-model-btn`)){e.stopPropagation();let t=e.target.closest(`.model-option`).dataset.value;xe(t);return}let t=e.target.closest(`.model-option`);if(t){e.stopPropagation();let n=t.dataset.value;ue(n),x.value=n,Ce(n),S.classList.remove(`show`)}}),document.addEventListener(`click`,function(e){!S.contains(e.target)&&e.target!==x&&S.classList.remove(`show`)}));let C=document.getElementById(`addImageModelToggleBtn`),w=document.getElementById(`addImageModelForm`),T=document.getElementById(`addImageModelName`),E=document.getElementById(`addImageModelContextWindow`),D=document.getElementById(`confirmAddImageModelBtn`),ie=document.getElementById(`cancelAddImageModelBtn`);C&&w&&(C.addEventListener(`click`,function(){let e=w.style.display!==`none`;w.style.display=e?`none`:``,C.textContent=t(e?`settings.addModel`:`settings.collapse`),e||(T.value=``,E.value=``,T.focus())}),ie.addEventListener(`click`,function(){w.style.display=`none`,C.textContent=t(`settings.addModel`),T.value=``,E.value=``}),D.addEventListener(`click`,function(){let e=T.value.trim(),n=parseInt(E.value)||0;if(!e){V(`❌ `+t(`settings.modelNameRequired`),`error`);return}be(e,n),x.value=e,ue(e),Ce(e),chrome.storage.local.set({imageModelName:e}),w.style.display=`none`,C.textContent=t(`settings.addModel`),T.value=``,E.value=``,V(`✅ `+t(`settings.imageModelAdded`),`success`)}),T.addEventListener(`keydown`,function(e){e.key===`Enter`&&D.click()}),E.addEventListener(`keydown`,function(e){e.key===`Enter`&&D.click()}));async function ae({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||V(`⚠️ `+t(`settings.fetchModelsNeedConfig`),`error`);return}let l=a?a.textContent:``;a&&(a.disabled=!0,a.textContent=t(`settings.fetchModelsLoading`));try{let e=await Re({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||V(t(`settings.fetchModelsSuccess`,{total:e.length,added:n}),`success`)}catch(e){o||(e&&(e.status===401||e.status===403)?V(t(`settings.fetchModelsAuthFailed`),`error`):e&&e.reason===`parse`?V(t(`settings.fetchModelsEmpty`),`info`):V(t(`settings.fetchModelsFailed`),`error`))}finally{a&&(a.disabled=!1,a.textContent=l||t(`settings.fetchModels`))}}let oe=``,O=null;function se(e,t){let n=(e||``).trim(),r=(t||``).trim();if(!n||!r)return;let i=`${n}|${r}`;i!==oe&&(clearTimeout(O),O=setTimeout(()=>{oe=i;let e=document.getElementById(`fetchModelsBtn`);e&&e.disabled||ae({apiBaseEl:document.getElementById(`apiBase`),apiKeyEl:document.getElementById(`apiKey`),dropdownId:`modelDropdown`,addFn:fe,btn:null,silent:!0})},500))}let de=document.getElementById(`fetchModelsBtn`);de&&de.addEventListener(`click`,()=>{ae({apiBaseEl:document.getElementById(`apiBase`),apiKeyEl:document.getElementById(`apiKey`),dropdownId:`modelDropdown`,addFn:fe,btn:de,silent:!1})});let pe=document.getElementById(`fetchImageModelsBtn`);pe&&pe.addEventListener(`click`,()=>{ae({apiBaseEl:document.getElementById(`imageApiBase`),apiKeyEl:document.getElementById(`imageApiKey`),dropdownId:`imageModelDropdown`,addFn:be,btn:pe,silent:!1})});let j=document.getElementById(`apiBase`),M=document.getElementById(`apiBaseDropdown`);j&&M&&(j.addEventListener(`click`,function(e){e.stopPropagation(),M.querySelectorAll(`.model-option`).forEach(e=>{e.style.display=``}),M.classList.toggle(`show`),Ee(j.value.trim())}),M.addEventListener(`click`,function(e){if(e.target.classList.contains(`delete-model-btn`)){e.stopPropagation();let t=e.target.closest(`.model-option`).dataset.value;Te(t);return}let n=e.target.closest(`.model-option`);if(n){e.stopPropagation();let r=n.dataset.value;j.value=r,Ee(r),M.classList.remove(`show`),chrome.storage.local.set({apiBase:r}),V(`✅ `+t(`settings.apiBaseSwitched`),`info`),se(r,(document.getElementById(`apiKey`)?.value||``).trim())}}),document.addEventListener(`click`,function(e){!M.contains(e.target)&&e.target!==j&&M.classList.remove(`show`)}),j.addEventListener(`blur`,function(){let e=this.value.trim();e&&(chrome.storage.local.set({apiBase:e}),we(e),Ee(e))}),j.addEventListener(`input`,function(){let e=this.value.trim().toLowerCase();M.classList.add(`show`);let t=M.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 N=document.getElementById(`addApiBaseToggleBtn`),P=document.getElementById(`addApiBaseForm`),ge=document.getElementById(`addApiBaseUrl`),_e=document.getElementById(`addApiBaseLabel`),ye=document.getElementById(`confirmAddApiBaseBtn`),Se=document.getElementById(`cancelAddApiBaseBtn`);N&&P&&(N.addEventListener(`click`,function(){let e=P.style.display!==`none`;P.style.display=e?`none`:``,N.textContent=t(e?`settings.addAddress`:`settings.collapse`),e||(ge.value=``,_e.value=``,ge.focus())}),Se.addEventListener(`click`,function(){P.style.display=`none`,N.textContent=t(`settings.addAddress`),ge.value=``,_e.value=``}),ye.addEventListener(`click`,function(){let e=ge.value.trim(),n=_e.value.trim();if(!e){V(`❌ `+t(`settings.apiBaseRequired`),`error`);return}try{new URL(e)}catch{V(`❌ `+t(`settings.urlInvalid`),`error`);return}we(e,n),j.value=e,Ee(e),chrome.storage.local.set({apiBase:e}),P.style.display=`none`,N.textContent=t(`settings.addAddress`),ge.value=``,_e.value=``,V(`✅ `+t(`settings.apiBaseAdded`),`success`)}),ge.addEventListener(`keydown`,function(e){e.key===`Enter`&&ye.click()}),_e.addEventListener(`keydown`,function(e){e.key===`Enter`&&ye.click()}));let F=document.getElementById(`imageApiBase`),I=document.getElementById(`imageApiBaseDropdown`);F&&I&&(F.addEventListener(`click`,function(e){e.stopPropagation(),I.querySelectorAll(`.model-option`).forEach(e=>{e.style.display=``}),I.classList.toggle(`show`),Me(F.value.trim())}),I.addEventListener(`click`,function(e){if(e.target.classList.contains(`delete-model-btn`)){e.stopPropagation();let t=e.target.closest(`.model-option`).dataset.value;ke(t);return}let n=e.target.closest(`.model-option`);if(n){e.stopPropagation();let r=n.dataset.value;F.value=r,Me(r),I.classList.remove(`show`),chrome.storage.local.set({imageApiBase:r}),V(`✅ `+t(`settings.imageApiBaseSwitched`),`info`)}}),document.addEventListener(`click`,function(e){!I.contains(e.target)&&e.target!==F&&I.classList.remove(`show`)}),F.addEventListener(`blur`,function(){let e=this.value.trim();e&&(chrome.storage.local.set({imageApiBase:e}),Oe(e),Me(e))}),F.addEventListener(`input`,function(){let e=this.value.trim().toLowerCase();I.classList.add(`show`);let t=I.querySelectorAll(`.model-option`),n=!1;t.forEach(t=>{let r=(t.dataset.value||``).toLowerCase(),i=(t.dataset.label||``).toLowerCase();!e||r.includes(e)||i.includes(e)?(t.style.display=``,n=!0):t.style.display=`none`}),!n&&e&&t.forEach(e=>{e.style.display=``})}));let L=document.getElementById(`addImageApiBaseToggleBtn`),R=document.getElementById(`addImageApiBaseForm`),z=document.getElementById(`addImageApiBaseUrl`),B=document.getElementById(`addImageApiBaseLabel`),De=document.getElementById(`confirmAddImageApiBaseBtn`),Ae=document.getElementById(`cancelAddImageApiBaseBtn`);L&&R&&(L.addEventListener(`click`,function(){let e=R.style.display!==`none`;R.style.display=e?`none`:``,L.textContent=t(e?`settings.addAddress`:`settings.collapse`),e||(z.value=``,B.value=``,z.focus())}),Ae.addEventListener(`click`,function(){R.style.display=`none`,L.textContent=t(`settings.addAddress`),z.value=``,B.value=``}),De.addEventListener(`click`,function(){let e=z.value.trim(),n=B.value.trim();if(!e){V(`❌ `+t(`settings.apiBaseRequired`),`error`);return}try{new URL(e)}catch{V(`❌ `+t(`settings.urlInvalid`),`error`);return}Oe(e,n),F.value=e,Me(e),chrome.storage.local.set({imageApiBase:e}),R.style.display=`none`,L.textContent=t(`settings.addAddress`),z.value=``,B.value=``,V(`✅ `+t(`settings.imageApiBaseAdded`),`success`)}),z.addEventListener(`keydown`,function(e){e.key===`Enter`&&De.click()}),B.addEventListener(`keydown`,function(e){e.key===`Enter`&&De.click()}));let je=document.getElementById(`imageApiKey`),Fe=document.getElementById(`toggleImageApiKeyBtn`);if(je&&je.addEventListener(`blur`,function(){chrome.storage.local.set({imageApiKey:this.value.trim()})}),je&&Fe){let e=Fe.querySelector(`.icon-eye-open`),t=Fe.querySelector(`.icon-eye-closed`);Fe.addEventListener(`click`,function(){je.type===`password`?(je.type=`text`,e.style.display=`none`,t.style.display=`block`):(je.type=`password`,e.style.display=`block`,t.style.display=`none`)})}let H=document.getElementById(`toggleToken`),Ie=document.getElementById(`apiKey`),Le=H.querySelector(`.icon-eye-open`),ze=H.querySelector(`.icon-eye-closed`);H.addEventListener(`click`,function(){Ie.type===`password`?(Ie.type=`text`,Le.style.display=`none`,ze.style.display=`block`):(Ie.type=`password`,Le.style.display=`block`,ze.style.display=`none`)});let He=document.getElementById(`resetSystemPromptBtn`);He&&He.addEventListener(`click`,function(){document.getElementById(`systemPrompt`).value=k()});let U=document.getElementById(`toolbarIconOnly`);U&&U.addEventListener(`change`,function(){Ue()});let Xe=document.getElementById(`enableSelectionToolbar`),$e=document.getElementById(`toolbarConfig`),et=document.getElementById(`toolbarToggleLabel`);function tt(){let e=Xe&&Xe.checked;$e&&(e?$e.classList.remove(`disabled`):$e.classList.add(`disabled`)),et&&(et.textContent=t(e?`common.enabled`:`common.disabled`))}Xe&&Xe.addEventListener(`change`,function(){tt(),Ue()}),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`:$=We($,r,-1),Ir();break;case`moveDown`:$=We($,r,1),Ir();break;case`edit`:Ke($,r);break;case`delete`:$=Ge($,r),Ir()}}),document.getElementById(`addCustomToolBtn`).addEventListener(`click`,function(){Ke($,-1)}),document.getElementById(`domainAddBtn`).addEventListener(`click`,function(){let e=document.getElementById(`domainAddInput`);Ze(e.value,t=>{t.error?V(`❌ `+t.error,`error`):e.value=``})}),document.getElementById(`domainAddInput`).addEventListener(`keydown`,function(e){e.key===`Enter`&&Ze(this.value,e=>{e.error?V(`❌ `+e.error,`error`):this.value=``})}),document.getElementById(`domainBlocklistList`).addEventListener(`click`,function(e){let t=e.target.closest(`.domain-blocklist-item-remove`);t&&Qe(t.dataset.domain)}),Ye(),chrome.storage.onChanged.addListener((e,t)=>{t===`local`&&e.blockedDomains&&Ye()}),document.getElementById(`toolEditCancel`).addEventListener(`click`,function(){qe()}),document.getElementById(`toolEditClose`).addEventListener(`click`,function(){qe()}),document.getElementById(`toolEditSave`).addEventListener(`click`,function(){let e=Je($);if(e.error){V(`❌ `+e.error,`error`);return}$=e.tools,Ir()});let nt=document.getElementById(`reflectionEnabled`),it=document.getElementById(`reflectionConfig`),at=document.getElementById(`reflectionToggleLabel`);function ot(){if(!it)return;let e=nt&&nt.checked;e?it.classList.remove(`disabled`):it.classList.add(`disabled`),at&&(at.textContent=t(e?`common.enabled`:`common.disabled`))}function ct(e,t){let n=document.getElementById(e),r=document.getElementById(t);!n||!r||(r.checked?n.classList.remove(`disabled`):n.classList.add(`disabled`))}nt&&(nt.addEventListener(`change`,function(){ot();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})})}),ot());function ut(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 W=document.getElementById(`postReflectionEnabled`);W&&W.addEventListener(`change`,function(){ct(`postReflectionSection`,`postReflectionEnabled`),ut(`postReflection`,this.checked)});let ft=document.getElementById(`toolReflectionEnabled`);ft&&ft.addEventListener(`change`,function(){ct(`toolReflectionSection`,`toolReflectionEnabled`),ut(`toolReflection`,this.checked)});let pt=document.getElementById(`subtaskReflectionEnabled`);pt&&pt.addEventListener(`change`,function(){ct(`subtaskReflectionSection`,`subtaskReflectionEnabled`),ut(`subtaskReflection`,this.checked)}),ot(),ct(`postReflectionSection`,`postReflectionEnabled`),ct(`toolReflectionSection`,`toolReflectionEnabled`),ct(`subtaskReflectionSection`,`subtaskReflectionEnabled`);let G=document.getElementById(`streamEnabled`),ht=document.getElementById(`streamEnabledLabel`);function gt(){let e=document.getElementById(`streamExpandToolsWrap`);e&&(e.style.display=G&&G.checked?`block`:`none`)}G&&ht&&(G.addEventListener(`change`,function(){ht&&(ht.textContent=G.checked?t(`common.enabled`):t(`common.disabled`)),chrome.storage.local.set({streamEnabled:G.checked}),gt()}),ht&&(ht.textContent=G.checked?t(`common.enabled`):t(`common.disabled`)),gt());let _t=document.getElementById(`streamExpandTools`),vt=document.getElementById(`streamExpandToolsLabel`);_t&&vt&&(_t.addEventListener(`change`,function(){vt.textContent=this.checked?t(`common.enabled`):t(`common.disabled`),chrome.storage.local.set({streamExpandTools:this.checked})}),vt.textContent=_t.checked?t(`common.enabled`):t(`common.disabled`));let yt=document.getElementById(`toolConfirmationEnabled`),bt=document.getElementById(`toolConfirmationEnabledLabel`);yt&&bt&&(yt.addEventListener(`change`,function(){bt.textContent=this.checked?t(`common.enabled`):t(`common.disabled`),chrome.storage.local.set({toolConfirmationEnabled:this.checked})}),bt.textContent=yt.checked?t(`common.enabled`):t(`common.disabled`));let xt=document.getElementById(`enableExecutionLog`),St=document.getElementById(`enableExecutionLogLabel`);xt&&St&&(xt.addEventListener(`change`,function(){St.textContent=this.checked?t(`common.enabled`):t(`common.disabled`),chrome.storage.local.set({enableExecutionLog:this.checked})}),St.textContent=xt.checked?t(`common.enabled`):t(`common.disabled`));let Ct=document.getElementById(`completionSoundEnabled`);Ct&&Ct.addEventListener(`change`,function(){chrome.storage.local.set({completionSoundEnabled:this.checked})});let wt=document.getElementById(`completionConfettiEnabled`);wt&&wt.addEventListener(`change`,function(){chrome.storage.local.set({completionConfettiEnabled:this.checked})});let Tt=document.getElementById(`completionNotificationEnabled`);Tt&&Tt.addEventListener(`change`,function(){chrome.storage.local.set({completionNotificationEnabled:this.checked})});let Et=document.getElementById(`scheduledNotificationEnabled`);Et&&Et.addEventListener(`change`,function(){chrome.storage.local.set({scheduledNotificationEnabled:this.checked})});let Dt=document.getElementById(`interactionNotificationEnabled`);Dt&&Dt.addEventListener(`change`,function(){chrome.storage.local.set({interactionNotificationEnabled:this.checked})});let K=document.getElementById(`showMessageTimestamp`);K&&K.addEventListener(`change`,function(){chrome.storage.local.set({showMessageTimestamp:this.checked})}),Lr(),document.getElementById(`exportConfigBtn`).addEventListener(`click`,rt),document.getElementById(`importConfigBtn`).addEventListener(`click`,st),document.getElementById(`importConfigFile`).addEventListener(`change`,function(e){e.target.files&&e.target.files.length>0&<(e.target.files[0])}),dt(),Dn(),document.querySelector(`[data-tab="toolbox"]`)?.addEventListener(`click`,()=>{X()}),ir(),document.querySelector(`[data-tab="knowledge"]`)?.addEventListener(`click`,()=>{ar()})});function Ir(){chrome.storage.local.set({toolbarTools:$},()=>{Ve($),Ue()})}function Lr(){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 ri(e){if(!e)return``;let t=new Date(e);if(Number.isNaN(t.getTime()))return String(e);let n=e=>String(e).padStart(2,`0`);return`${t.getFullYear()}-${n(t.getMonth()+1)}-${n(t.getDate())} ${n(t.getHours())}:${n(t.getMinutes())}`}var ii=1;function ai(){let e=document.getElementById(`saveBar`);if(!e)return;let t=()=>{let t=e.getBoundingClientRect().bottom>=window.innerHeight-ii;e.classList.toggle(`floating`,t)};window.addEventListener(`scroll`,t,{passive:!0}),window.addEventListener(`resize`,t),typeof ResizeObserver<`u`&&new ResizeObserver(t).observe(document.body),t()}var $=[];function oi(e){document.querySelectorAll(`.tab-nav-btn`).forEach(e=>e.classList.remove(`active`)),document.querySelectorAll(`.tab-panel`).forEach(e=>e.classList.remove(`active`));let t=document.querySelector(`.tab-nav-btn[data-tab="${e}"]`),n=document.querySelector(`.tab-panel[data-tab="${e}"]`);t&&t.classList.add(`active`),n&&n.classList.add(`active`),window.location.hash!==`#`+e&&history.replaceState(null,``,`#`+e)}function si(){let e=window.location.hash.replace(`#`,``);[`basic`,`toolbar`,`react`,`reflection`,`chat`,`agent`,`toolbox`,`knowledge`].includes(e)&&oi(e)}document.addEventListener(`DOMContentLoaded`,async function(){await n(),i(),s(()=>{i(),lt().then(e=>{$=e,ut($)})});let e=document.getElementById(`languageInput`),r=document.getElementById(`languageDropdown`);e&&r&&((t=>{r.innerHTML=``,c.forEach(({code:e,label:n})=>{let i=document.createElement(`div`);i.className=`model-option`+(e===t?` selected`:``),i.dataset.value=e,i.textContent=n,r.appendChild(i)});let n=c.find(e=>e.code===t);e.value=n?n.label:``})(o()),e.addEventListener(`click`,e=>{e.stopPropagation(),r.classList.toggle(`show`)}),r.addEventListener(`click`,n=>{let o=n.target.closest(`.model-option`);if(!o)return;n.stopPropagation();let s=o.dataset.value;r.querySelectorAll(`.model-option`).forEach(e=>e.classList.remove(`selected`)),o.classList.add(`selected`),e.value=o.textContent,r.classList.remove(`show`),a(s),i(),U(t(`settings.languageChanged`),`success`)}),document.addEventListener(`click`,t=>{!r.contains(t.target)&&t.target!==e&&r.classList.remove(`show`)})),document.querySelectorAll(`.tab-nav-btn`).forEach(e=>{e.addEventListener(`click`,function(){oi(this.dataset.tab)})}),document.querySelectorAll(`.info-box, .warning-box`).forEach(e=>{let t=e.querySelector(`h3`);if(!t||e.classList.contains(`collapsible`))return;e.classList.add(`collapsible`,`collapsed`),t.classList.add(`collapsible-header`);let n=document.createElement(`span`);n.className=`collapsible-arrow`,n.textContent=`▶`,t.appendChild(n);let r=document.createElement(`div`);for(r.className=`collapsible-body`,r.style.display=`none`;t.nextSibling;)r.appendChild(t.nextSibling);e.appendChild(r)}),document.querySelectorAll(`.collapsible .collapsible-header`).forEach(e=>{let t=e.closest(`.collapsible`),n=t?.querySelector(`.collapsible-body`),r=e.querySelector(`.collapsible-arrow`);!t||!n||e.addEventListener(`click`,()=>{t.classList.contains(`open`)?(t.classList.remove(`open`),t.classList.add(`collapsed`),n.style.display=`none`,r&&(r.textContent=`▶`)):(t.classList.add(`open`),t.classList.remove(`collapsed`),n.style.display=``,r&&(r.textContent=`▼`))})}),si(),window.addEventListener(`hashchange`,si),chrome.storage.local.get([`optionsInitialTab`],e=>{e.optionsInitialTab&&(oi(e.optionsInitialTab),chrome.storage.local.remove(`optionsInitialTab`))}),chrome.runtime.onMessage.addListener(e=>{e.type===`SWITCH_TAB`&&e.tab&&oi(e.tab)}),await h(),nt(),zt(),$=await lt(),ut($);let l=document.getElementById(`enableSelectionToolbar`),u=document.getElementById(`toolbarConfig`),d=document.getElementById(`toolbarToggleLabel`);u&&l&&(l.checked?u.classList.remove(`disabled`):u.classList.add(`disabled`),d&&(d.textContent=l.checked?t(`common.enabled`):t(`common.disabled`))),document.getElementById(`saveBtn`).addEventListener(`click`,rt),ai();let f=document.getElementById(`modelInput`),p=document.getElementById(`modelDropdown`);f.addEventListener(`click`,function(e){e.stopPropagation(),p.classList.contains(`show`)||(Oe(p,``),Pe(R),f.select()),p.classList.toggle(`show`)}),f.addEventListener(`input`,function(){L(),p.classList.add(`show`),Oe(p,this.value)}),f.addEventListener(`blur`,function(){f.value=R,Pe(R)}),p.addEventListener(`click`,function(e){if(e.target.classList.contains(`delete-model-btn`)){e.stopPropagation();let t=e.target.closest(`.model-option`).dataset.value;ke(t);return}let t=e.target.closest(`.ctx-set-btn`);if(t){e.stopPropagation();let n=e.target.closest(`.model-option`);n&&ve(t,n,{onPreview:e=>{Ie(n,e),Fe(`modelInput`,`modelSelectedCtxBadge`,`modelDropdown`)},onCommit:e=>Le(n,e),onReset:()=>Le(n,0)});return}let n=e.target.closest(`.model-option`);if(n){e.stopPropagation(),L();let t=n.dataset.value;be(t),f.value=t,Pe(t),p.classList.remove(`show`)}}),document.addEventListener(`click`,function(e){!p.contains(e.target)&&e.target!==f&&!ye(e.target)&&p.classList.remove(`show`)});let m=document.getElementById(`addModelToggleBtn`),g=document.getElementById(`addModelForm`),_=document.getElementById(`addModelName`),v=document.getElementById(`addModelContextWindow`),y=document.getElementById(`confirmAddModelBtn`),ee=document.getElementById(`cancelAddModelBtn`);m&&g&&(m.addEventListener(`click`,function(){let e=g.style.display!==`none`;g.style.display=e?`none`:``,m.textContent=t(e?`settings.addModel`:`settings.collapse`),e||(_.value=``,v.value=``,_.focus())}),ee.addEventListener(`click`,function(){g.style.display=`none`,m.textContent=t(`settings.addModel`),_.value=``,v.value=``}),y.addEventListener(`click`,function(){let e=_.value.trim(),n=parseInt(v.value)||0;if(!e){U(`❌ `+t(`settings.modelNameRequired`),`error`);return}Te(e,n),f.value=e,be(e),Pe(e),chrome.storage.local.set({modelName:e}),g.style.display=`none`,m.textContent=t(`settings.addModel`),_.value=``,v.value=``,U(`✅ `+t(`settings.modelAdded`),`success`)}),_.addEventListener(`keydown`,function(e){e.key===`Enter`&&y.click()}),v.addEventListener(`keydown`,function(e){e.key===`Enter`&&y.click()}));let te=document.getElementById(`enableImageInput`),b=document.getElementById(`imageModelGroup`),ne=document.getElementById(`imageApiGroup`),re=document.getElementById(`imageApiKeyGroup`);te&&b&&te.addEventListener(`change`,function(){b.style.display=this.checked?``:`none`,ne&&(ne.style.display=this.checked?``:`none`),re&&(re.style.display=this.checked?``:`none`),chrome.storage.local.set({enableImageInput:this.checked})});let x=document.getElementById(`imageModelInput`),S=document.getElementById(`imageModelDropdown`);x&&S&&(x.addEventListener(`click`,function(e){e.stopPropagation(),S.classList.contains(`show`)||(Oe(S,``),Ue(xe),x.select()),S.classList.toggle(`show`)}),x.addEventListener(`input`,function(){L(),S.classList.add(`show`),Oe(S,this.value)}),x.addEventListener(`blur`,function(){x.value=xe,Ue(xe)}),S.addEventListener(`click`,function(e){if(e.target.classList.contains(`delete-model-btn`)){e.stopPropagation();let t=e.target.closest(`.model-option`).dataset.value;ze(t);return}let t=e.target.closest(`.ctx-set-btn`);if(t){e.stopPropagation();let n=e.target.closest(`.model-option`);n&&ve(t,n,{onPreview:e=>{Ie(n,e),Fe(`imageModelInput`,`imageModelSelectedCtxBadge`,`imageModelDropdown`)},onCommit:e=>Ve(n,e),onReset:()=>Ve(n,0)});return}let n=e.target.closest(`.model-option`);if(n){e.stopPropagation(),L();let t=n.dataset.value;Se(t),x.value=t,Ue(t),S.classList.remove(`show`)}}),document.addEventListener(`click`,function(e){!S.contains(e.target)&&e.target!==x&&!ye(e.target)&&S.classList.remove(`show`)}));let C=document.getElementById(`addImageModelToggleBtn`),ie=document.getElementById(`addImageModelForm`),w=document.getElementById(`addImageModelName`),ae=document.getElementById(`addImageModelContextWindow`),T=document.getElementById(`confirmAddImageModelBtn`),E=document.getElementById(`cancelAddImageModelBtn`);C&&ie&&(C.addEventListener(`click`,function(){let e=ie.style.display!==`none`;ie.style.display=e?`none`:``,C.textContent=t(e?`settings.addModel`:`settings.collapse`),e||(w.value=``,ae.value=``,w.focus())}),E.addEventListener(`click`,function(){ie.style.display=`none`,C.textContent=t(`settings.addModel`),w.value=``,ae.value=``}),T.addEventListener(`click`,function(){let e=w.value.trim(),n=parseInt(ae.value)||0;if(!e){U(`❌ `+t(`settings.modelNameRequired`),`error`);return}Re(e,n),x.value=e,Se(e),Ue(e),chrome.storage.local.set({imageModelName:e}),ie.style.display=`none`,C.textContent=t(`settings.addModel`),w.value=``,ae.value=``,U(`✅ `+t(`settings.imageModelAdded`),`success`)}),w.addEventListener(`keydown`,function(e){e.key===`Enter`&&T.click()}),ae.addEventListener(`keydown`,function(e){e.key===`Enter`&&T.click()}));async function oe({apiBaseEl:e,apiKeyEl:n,dropdownId:r,addFn:i,btn:a,silent:o}){let s=(e?.value||``).trim(),c=(n?.value||``).trim();if(!s||!c){o||U(`⚠️ `+t(`settings.fetchModelsNeedConfig`),`error`);return}let l=a?a.textContent:``;a&&(a.disabled=!0,a.textContent=t(`settings.fetchModelsLoading`));try{let e=await st({apiBase:s,apiKey:c}),n=0,a=document.getElementById(r);for(let t of e)a&&a.querySelector(`.model-option[data-value="${CSS.escape(t)}"]`)||(i(t,0),n++);o||U(t(`settings.fetchModelsSuccess`,{total:e.length,added:n}),`success`)}catch(e){o||(e&&(e.status===401||e.status===403)?U(t(`settings.fetchModelsAuthFailed`),`error`):e&&e.reason===`parse`?U(t(`settings.fetchModelsEmpty`),`info`):U(t(`settings.fetchModelsFailed`),`error`))}finally{a&&(a.disabled=!1,a.textContent=l||t(`settings.fetchModels`))}}let se=``,D=null;function O(e,t){let n=(e||``).trim(),r=(t||``).trim();if(!n||!r)return;let i=`${n}|${r}`;i!==se&&(clearTimeout(D),D=setTimeout(()=>{se=i;let e=document.getElementById(`fetchModelsBtn`);e&&e.disabled||oe({apiBaseEl:document.getElementById(`apiBase`),apiKeyEl:document.getElementById(`apiKey`),dropdownId:`modelDropdown`,addFn:Te,btn:null,silent:!0})},500))}let ce=document.getElementById(`fetchModelsBtn`);ce&&ce.addEventListener(`click`,()=>{oe({apiBaseEl:document.getElementById(`apiBase`),apiKeyEl:document.getElementById(`apiKey`),dropdownId:`modelDropdown`,addFn:Te,btn:ce,silent:!1})});let ue=document.getElementById(`fetchImageModelsBtn`);ue&&ue.addEventListener(`click`,()=>{oe({apiBaseEl:document.getElementById(`imageApiBase`),apiKeyEl:document.getElementById(`imageApiKey`),dropdownId:`imageModelDropdown`,addFn:Re,btn:ue,silent:!1})});let k=document.getElementById(`apiBase`),A=document.getElementById(`apiBaseDropdown`);k&&A&&(k.addEventListener(`click`,function(e){e.stopPropagation(),A.querySelectorAll(`.model-option`).forEach(e=>{e.style.display=``}),A.classList.toggle(`show`),Ye(k.value.trim())}),A.addEventListener(`click`,function(e){if(e.target.classList.contains(`delete-model-btn`)){e.stopPropagation();let t=e.target.closest(`.model-option`).dataset.value;Ke(t);return}let n=e.target.closest(`.model-option`);if(n){e.stopPropagation();let r=n.dataset.value;k.value=r,Ye(r),A.classList.remove(`show`),chrome.storage.local.set({apiBase:r}),U(`✅ `+t(`settings.apiBaseSwitched`),`info`),O(r,(document.getElementById(`apiKey`)?.value||``).trim())}}),document.addEventListener(`click`,function(e){!A.contains(e.target)&&e.target!==k&&A.classList.remove(`show`)}),k.addEventListener(`blur`,function(){let e=this.value.trim();e&&(chrome.storage.local.set({apiBase:e}),Ge(e),Ye(e))}),k.addEventListener(`input`,function(){let e=this.value.trim().toLowerCase();A.classList.add(`show`);let t=A.querySelectorAll(`.model-option`),n=!1;t.forEach(t=>{let r=(t.dataset.value||``).toLowerCase(),i=(t.dataset.label||``).toLowerCase();!e||r.includes(e)||i.includes(e)?(t.style.display=``,n=!0):t.style.display=`none`}),!n&&e&&t.forEach(e=>{e.style.display=``})}));let de=document.getElementById(`addApiBaseToggleBtn`),fe=document.getElementById(`addApiBaseForm`),j=document.getElementById(`addApiBaseUrl`),M=document.getElementById(`addApiBaseLabel`),pe=document.getElementById(`confirmAddApiBaseBtn`),me=document.getElementById(`cancelAddApiBaseBtn`);de&&fe&&(de.addEventListener(`click`,function(){let e=fe.style.display!==`none`;fe.style.display=e?`none`:``,de.textContent=t(e?`settings.addAddress`:`settings.collapse`),e||(j.value=``,M.value=``,j.focus())}),me.addEventListener(`click`,function(){fe.style.display=`none`,de.textContent=t(`settings.addAddress`),j.value=``,M.value=``}),pe.addEventListener(`click`,function(){let e=j.value.trim(),n=M.value.trim();if(!e){U(`❌ `+t(`settings.apiBaseRequired`),`error`);return}try{new URL(e)}catch{U(`❌ `+t(`settings.urlInvalid`),`error`);return}Ge(e,n),k.value=e,Ye(e),chrome.storage.local.set({apiBase:e}),fe.style.display=`none`,de.textContent=t(`settings.addAddress`),j.value=``,M.value=``,U(`✅ `+t(`settings.apiBaseAdded`),`success`)}),j.addEventListener(`keydown`,function(e){e.key===`Enter`&&pe.click()}),M.addEventListener(`keydown`,function(e){e.key===`Enter`&&pe.click()}));let N=document.getElementById(`imageApiBase`),P=document.getElementById(`imageApiBaseDropdown`);N&&P&&(N.addEventListener(`click`,function(e){e.stopPropagation(),P.querySelectorAll(`.model-option`).forEach(e=>{e.style.display=``}),P.classList.toggle(`show`),tt(N.value.trim())}),P.addEventListener(`click`,function(e){if(e.target.classList.contains(`delete-model-btn`)){e.stopPropagation();let t=e.target.closest(`.model-option`).dataset.value;Qe(t);return}let n=e.target.closest(`.model-option`);if(n){e.stopPropagation();let r=n.dataset.value;N.value=r,tt(r),P.classList.remove(`show`),chrome.storage.local.set({imageApiBase:r}),U(`✅ `+t(`settings.imageApiBaseSwitched`),`info`)}}),document.addEventListener(`click`,function(e){!P.contains(e.target)&&e.target!==N&&P.classList.remove(`show`)}),N.addEventListener(`blur`,function(){let e=this.value.trim();e&&(chrome.storage.local.set({imageApiBase:e}),Ze(e),tt(e))}),N.addEventListener(`input`,function(){let e=this.value.trim().toLowerCase();P.classList.add(`show`);let t=P.querySelectorAll(`.model-option`),n=!1;t.forEach(t=>{let r=(t.dataset.value||``).toLowerCase(),i=(t.dataset.label||``).toLowerCase();!e||r.includes(e)||i.includes(e)?(t.style.display=``,n=!0):t.style.display=`none`}),!n&&e&&t.forEach(e=>{e.style.display=``})}));let F=document.getElementById(`addImageApiBaseToggleBtn`),he=document.getElementById(`addImageApiBaseForm`),I=document.getElementById(`addImageApiBaseUrl`),ge=document.getElementById(`addImageApiBaseLabel`),_e=document.getElementById(`confirmAddImageApiBaseBtn`),Ce=document.getElementById(`cancelAddImageApiBaseBtn`);F&&he&&(F.addEventListener(`click`,function(){let e=he.style.display!==`none`;he.style.display=e?`none`:``,F.textContent=t(e?`settings.addAddress`:`settings.collapse`),e||(I.value=``,ge.value=``,I.focus())}),Ce.addEventListener(`click`,function(){he.style.display=`none`,F.textContent=t(`settings.addAddress`),I.value=``,ge.value=``}),_e.addEventListener(`click`,function(){let e=I.value.trim(),n=ge.value.trim();if(!e){U(`❌ `+t(`settings.apiBaseRequired`),`error`);return}try{new URL(e)}catch{U(`❌ `+t(`settings.urlInvalid`),`error`);return}Ze(e,n),N.value=e,tt(e),chrome.storage.local.set({imageApiBase:e}),he.style.display=`none`,F.textContent=t(`settings.addAddress`),I.value=``,ge.value=``,U(`✅ `+t(`settings.imageApiBaseAdded`),`success`)}),I.addEventListener(`keydown`,function(e){e.key===`Enter`&&_e.click()}),ge.addEventListener(`keydown`,function(e){e.key===`Enter`&&_e.click()}));let z=document.getElementById(`imageApiKey`),B=document.getElementById(`toggleImageApiKeyBtn`);if(z&&z.addEventListener(`blur`,function(){chrome.storage.local.set({imageApiKey:this.value.trim()})}),z&&B){let e=B.querySelector(`.icon-eye-open`),t=B.querySelector(`.icon-eye-closed`);B.addEventListener(`click`,function(){z.type===`password`?(z.type=`text`,e.style.display=`none`,t.style.display=`block`):(z.type=`password`,e.style.display=`block`,t.style.display=`none`)})}let we=document.getElementById(`toggleToken`),Ee=document.getElementById(`apiKey`),De=we.querySelector(`.icon-eye-open`),Ae=we.querySelector(`.icon-eye-closed`);we.addEventListener(`click`,function(){Ee.type===`password`?(Ee.type=`text`,De.style.display=`none`,Ae.style.display=`block`):(Ee.type=`password`,De.style.display=`block`,Ae.style.display=`none`)});let je=document.getElementById(`resetSystemPromptBtn`);je&&je.addEventListener(`click`,function(){document.getElementById(`systemPrompt`).value=le()});let Me=document.getElementById(`toolbarIconOnly`);Me&&Me.addEventListener(`change`,function(){ft()});let Ne=document.getElementById(`enableSelectionToolbar`),Be=document.getElementById(`toolbarConfig`),He=document.getElementById(`toolbarToggleLabel`);function V(){let e=Ne&&Ne.checked;Be&&(e?Be.classList.remove(`disabled`):Be.classList.add(`disabled`)),He&&(He.textContent=t(e?`common.enabled`:`common.disabled`))}Ne&&Ne.addEventListener(`change`,function(){V(),ft()}),document.getElementById(`toolbarToolsList`).addEventListener(`click`,function(e){let t=e.target.closest(`[data-action]`);if(!t)return;let n=t.dataset.action,r=parseInt(t.dataset.index);switch(n){case`moveUp`:$=pt($,r,-1),ci();break;case`moveDown`:$=pt($,r,1),ci();break;case`edit`:ht($,r);break;case`delete`:$=mt($,r),ci()}}),document.getElementById(`addCustomToolBtn`).addEventListener(`click`,function(){ht($,-1)}),document.getElementById(`domainAddBtn`).addEventListener(`click`,function(){let e=document.getElementById(`domainAddInput`);bt(e.value,t=>{t.error?U(`❌ `+t.error,`error`):e.value=``})}),document.getElementById(`domainAddInput`).addEventListener(`keydown`,function(e){e.key===`Enter`&&bt(this.value,e=>{e.error?U(`❌ `+e.error,`error`):this.value=``})}),document.getElementById(`domainBlocklistList`).addEventListener(`click`,function(e){let t=e.target.closest(`.domain-blocklist-item-remove`);t&&xt(t.dataset.domain)}),vt(),chrome.storage.onChanged.addListener((e,t)=>{t===`local`&&e.blockedDomains&&vt()}),document.getElementById(`toolEditCancel`).addEventListener(`click`,function(){gt()}),document.getElementById(`toolEditClose`).addEventListener(`click`,function(){gt()}),document.getElementById(`toolEditSave`).addEventListener(`click`,function(){let e=_t($);if(e.error){U(`❌ `+e.error,`error`);return}$=e.tools,ci()});let We=document.getElementById(`reflectionEnabled`),qe=document.getElementById(`reflectionConfig`),Je=document.getElementById(`reflectionToggleLabel`);function H(){if(!qe)return;let e=We&&We.checked;e?qe.classList.remove(`disabled`):qe.classList.add(`disabled`),Je&&(Je.textContent=t(e?`common.enabled`:`common.disabled`))}function Xe(e,t){let n=document.getElementById(e),r=document.getElementById(t);!n||!r||(r.checked?n.classList.remove(`disabled`):n.classList.add(`disabled`))}We&&(We.addEventListener(`change`,function(){H();let e=this.checked;chrome.storage.local.get([`reflectionConfig`],t=>{let n=t.reflectionConfig||{postReflection:{},subtaskReflection:{}};n.enabled=e,chrome.storage.local.set({reflectionConfig:n})})}),H());function $e(e,t){chrome.storage.local.get([`reflectionConfig`],n=>{let r=n.reflectionConfig||{postReflection:{},subtaskReflection:{}};r[e]||(r[e]={}),r[e].enabled=t,chrome.storage.local.set({reflectionConfig:r})})}let et=document.getElementById(`postReflectionEnabled`);et&&et.addEventListener(`change`,function(){Xe(`postReflectionSection`,`postReflectionEnabled`),$e(`postReflection`,this.checked)});let it=document.getElementById(`subtaskReflectionEnabled`);it&&it.addEventListener(`change`,function(){Xe(`subtaskReflectionSection`,`subtaskReflectionEnabled`),$e(`subtaskReflection`,this.checked)}),H(),Xe(`postReflectionSection`,`postReflectionEnabled`),Xe(`subtaskReflectionSection`,`subtaskReflectionEnabled`);let W=document.getElementById(`streamEnabled`),at=document.getElementById(`streamEnabledLabel`);function ot(){let e=document.getElementById(`streamExpandToolsWrap`);e&&(e.style.display=W&&W.checked?`block`:`none`)}W&&at&&(W.addEventListener(`change`,function(){at&&(at.textContent=W.checked?t(`common.enabled`):t(`common.disabled`)),chrome.storage.local.set({streamEnabled:W.checked}),ot()}),at&&(at.textContent=W.checked?t(`common.enabled`):t(`common.disabled`)),ot());let ct=document.getElementById(`streamExpandTools`),dt=document.getElementById(`streamExpandToolsLabel`);ct&&dt&&(ct.addEventListener(`change`,function(){dt.textContent=this.checked?t(`common.enabled`):t(`common.disabled`),chrome.storage.local.set({streamExpandTools:this.checked})}),dt.textContent=ct.checked?t(`common.enabled`):t(`common.disabled`));let G=document.getElementById(`toolConfirmationEnabled`),yt=document.getElementById(`toolConfirmationEnabledLabel`);G&&yt&&(G.addEventListener(`change`,function(){yt.textContent=this.checked?t(`common.enabled`):t(`common.disabled`),chrome.storage.local.set({toolConfirmationEnabled:this.checked})}),yt.textContent=G.checked?t(`common.enabled`):t(`common.disabled`));let St=document.getElementById(`enableExecutionLog`),Ct=document.getElementById(`enableExecutionLogLabel`);St&&Ct&&(St.addEventListener(`change`,function(){Ct.textContent=this.checked?t(`common.enabled`):t(`common.disabled`),chrome.storage.local.set({enableExecutionLog:this.checked})}),Ct.textContent=St.checked?t(`common.enabled`):t(`common.disabled`));let wt=document.getElementById(`completionSoundEnabled`);wt&&wt.addEventListener(`change`,function(){chrome.storage.local.set({completionSoundEnabled:this.checked})});let Tt=document.getElementById(`completionConfettiEnabled`);Tt&&Tt.addEventListener(`change`,function(){chrome.storage.local.set({completionConfettiEnabled:this.checked})});let Et=document.getElementById(`completionNotificationEnabled`);Et&&Et.addEventListener(`change`,function(){chrome.storage.local.set({completionNotificationEnabled:this.checked})});let Ot=document.getElementById(`scheduledNotificationEnabled`);Ot&&Ot.addEventListener(`change`,function(){chrome.storage.local.set({scheduledNotificationEnabled:this.checked})});let kt=document.getElementById(`interactionNotificationEnabled`);kt&&kt.addEventListener(`change`,function(){chrome.storage.local.set({interactionNotificationEnabled:this.checked})});let At=document.getElementById(`showMessageTimestamp`);At&&At.addEventListener(`change`,function(){chrome.storage.local.set({showMessageTimestamp:this.checked})}),li(),document.getElementById(`exportConfigBtn`).addEventListener(`click`,Dt),document.getElementById(`importConfigBtn`).addEventListener(`click`,jt),document.getElementById(`importConfigFile`).addEventListener(`change`,function(e){e.target.files&&e.target.files.length>0&&Nt(e.target.files[0])}),Ft(),$n(),document.querySelector(`[data-tab="toolbox"]`)?.addEventListener(`click`,()=>{X()}),Ar(),document.querySelector(`[data-tab="knowledge"]`)?.addEventListener(`click`,()=>{jr()})});function ci(){chrome.storage.local.set({toolbarTools:$},()=>{ut($),ft()})}function li(){let e=document.getElementById(`agentUrl`),n=document.getElementById(`agentPairCode`),r=document.getElementById(`agentName`),i=document.getElementById(`agentConnectBtn`);document.getElementById(`agentStatusDot`);let a=document.getElementById(`agentStatusText`),o=document.getElementById(`agentStatus`),s=document.getElementById(`pairCodeGroup`),c=document.getElementById(`agentInfo`),l=document.getElementById(`agentWorkdir`),u=document.getElementById(`agentDetailToggle`),d=document.getElementById(`agentDetailPanel`),f=document.getElementById(`pairedAgentsSection`),p=document.getElementById(`pairedAgentsList`),m=document.getElementById(`addAgentTitle`);if(!e||!i)return;function h(){let e=document.getElementById(`agentDetailArea`);e&&f.nextSibling!==e&&f.parentNode.insertBefore(e,f.nextSibling)}function g(){let e=document.getElementById(`agentDetailArea`);if(!e)return;let t=p.querySelector(`.paired-agent-item.active`);t&&t!==e.parentNode?t.appendChild(e):t||h()}async function _(e){try{let t=new AbortController,n=setTimeout(()=>t.abort(),2e3),r=await fetch(`${e}/api/status`,{signal:t.signal,cache:`no-cache`});return clearTimeout(n),r.ok}catch{return!1}}async function v(){h();let e=await chrome.storage.local.get([`pairedAgents`,`activeAgentId`]),n=e.pairedAgents||[],r=e.activeAgentId;if(y=null,n.length===0){f.style.display=`none`,m.textContent=t(`agentConfig.addAgentTitle`);return}f.style.display=``,m.textContent=t(`agentConfig.addAnotherAgent`),p.innerHTML=n.map(e=>{let n=e.id===r,i=!!e.disabled,a,o,s;return i?(a=n?`active-disabled`:`disabled`,o=t(`common.disabled`),s=`disabled`):n?(a=`active-checking`,o=t(`agentConfig.connected`),s=`connected`):(a=`checking`,o=t(`agentConfig.checking`),s=`checking`),`
|
|
694
709
|
<div class="paired-agent-item${n?` active`:``}${i?` disabled`:``}" data-agent-id="${e.id}">
|
|
695
710
|
<span class="paired-agent-dot ${a}" title="${o}"></span>
|
|
696
|
-
<span class="paired-agent-name" data-agent-id="${e.id}" data-original="${
|
|
697
|
-
<span class="paired-agent-url">${
|
|
711
|
+
<span class="paired-agent-name" data-agent-id="${e.id}" data-original="${D(e.name)}" title="${t(`agentConfig.clickToEditName`)}">${D(e.name)}</span>
|
|
712
|
+
<span class="paired-agent-url">${D(e.url)}</span>
|
|
698
713
|
<span class="paired-agent-status-text ${s}">${o}</span>
|
|
699
714
|
<div class="paired-agent-actions">
|
|
700
715
|
${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>`}
|
|
701
716
|
${i?``:`<button class="paired-agent-btn disable-btn" data-action="disable" data-id="${e.id}">${t(`agentConfig.disable`)}</button>`}
|
|
702
717
|
<button class="paired-agent-btn delete-btn" data-action="delete" data-id="${e.id}">${t(`common.delete`)}</button>
|
|
703
718
|
</div>
|
|
704
|
-
</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 ce(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(()=>{}),V(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 kt(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(()=>{}),V(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}),V(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}),V(t(`agentConfig.agentEnabledToast`,{name:n[r].name}),`success`),await v())}async function S(e,n){k(`checking`,t(`agentConfig.fetchingAgentInfo`));try{let r=await fetch(`${e}/api/status`,{cache:`no-cache`});if(!r.ok){k(`disconnected`,t(`agentConfig.agentUnreachable`));return}let i=await r.json();try{let r=await fetch(`${e}/api/status/detail`,{cache:`no-cache`,headers:{Authorization:`Bearer ${n}`}});if(r.ok){let e=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}`),k(`connected`,t.join(` | `),e)}else k(`disconnected`,t(`agentConfig.tokenExpired`))}catch{k(`disconnected`,t(`agentConfig.tokenExpired`))}}catch{k(`disconnected`,t(`agentConfig.cannotConnectAgent`))}}async function C(){let n=await chrome.storage.local.get([`pairedAgents`,`activeAgentId`]),r=n.pairedAgents||[],i=n.activeAgentId;if(!i||r.length===0){k(`disconnected`,r.length>0?t(`agentConfig.notConnectedSelect`):t(`agentConfig.notConnectedAdd`));return}let a=r.find(e=>e.id===i);a&&(e.value=a.url,await S(a.url,a.token))}function w(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 T(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 E(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 D(e){return e==null||e<0?`-`:e<1e3?e+`μs`:e<1e6?(e/1e3).toFixed(1)+`ms`:(e/1e6).toFixed(2)+`s`}function ie(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 ae(e){return!Array.isArray(e)||e.length===0?t(`agentConfig.idle`):e.map(e=>{let n=(e.command||``).replace(/\s+/g,` `).trim(),r=n.length>48?n.slice(0,48)+`…`:n||t(`agentConfig.unknownCommand`),i=e.pid?`pid=${O(String(e.pid))}`:``,a=ie(e.duration);return[`<code>${O(r)}</code>`,i,O(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">${O(e.version)}</span></div>`),e.platformName){let r=e.arch?` (${e.arch})`:``;n.push(`<div class="detail-row"><span class="detail-label">${t(`agentConfig.detailSystem`)}</span><span class="detail-value">${O(e.platformName)}${r}</span></div>`)}else if(e.platform){let r=e.arch?` (${e.arch})`:``;n.push(`<div class="detail-row"><span class="detail-label">${t(`agentConfig.detailSystem`)}</span><span class="detail-value">${O(e.platform)}${r}</span></div>`)}if(e.hostname&&n.push(`<div class="detail-row"><span class="detail-label">${t(`agentConfig.detailHostname`)}</span><span class="detail-value">${O(e.hostname)}</span></div>`),e.shell&&n.push(`<div class="detail-row"><span class="detail-label">Shell</span><span class="detail-value">${O(e.shell)}</span></div>`),e.homeDir&&n.push(`<div class="detail-row"><span class="detail-label">${t(`agentConfig.detailHomeDir`)}</span><span class="detail-value">${O(e.homeDir)}</span></div>`),e.nodeVersion&&n.push(`<div class="detail-row"><span class="detail-label">Node.js</span><span class="detail-value">${O(e.nodeVersion)}</span></div>`),e.runningProcesses!=null){let r=Array.isArray(e.runningProcesses)?e.runningProcesses.length:0,i=r>0?t(`agentConfig.detailRunningProcessesCount`,{count:r}):t(`agentConfig.detailRunningProcesses`);n.push(`<div class="detail-row"><span class="detail-label">${i}</span><span class="detail-value">${ae(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">${E(r.uptimeSeconds)}</span></div>`),n.push(`<div class="detail-row"><span class="detail-label">${t(`agentConfig.detailCpuUser`)}</span><span class="detail-value">${D(r.cpuUser)}</span></div>`),n.push(`<div class="detail-row"><span class="detail-label">${t(`agentConfig.detailCpuSystem`)}</span><span class="detail-value">${D(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">${T(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">${w(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">${w(e.fileMaxSize)}</span></div>`),e.allowedPaths&&e.allowedPaths.length>0){let r=e.allowedPaths.map(e=>`<code>${O(e)}</code>`).join(`<br>`);n.push(`<div class="detail-row"><span class="detail-label">${t(`agentConfig.detailAllowedPaths`)}</span><span class="detail-value">${r}</span></div>`)}e.pairCodeTTL!=null&&n.push(`<div class="detail-row"><span class="detail-label">${t(`agentConfig.detailPairCodeTTL`)}</span><span class="detail-value">${e.pairCodeTTL}s</span></div>`),d.innerHTML=n.join(``),u.style.display=`block`}function O(e){let t=document.createElement(`div`);return t.textContent=e,t.innerHTML}function k(e,n,r){o.className=`agent-status `+e,a.textContent=n,s.style.display=``,e===`connected`?(o.className=`agent-status connected`,r&&(c.style.display=``,r.workdir&&(l.innerHTML=t(`agentConfig.detailWorkdir`,{dir:r.workdir})),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 A(){let a=e.value.trim()||`http://127.0.0.1:18910`,o=n.value.trim();if(!o||o.length!==6){V(t(`agentConfig.pairCodeRequired`),`warning`);return}k(`checking`,t(`agentConfig.pairing`)),i.disabled=!0,i.textContent=t(`agentConfig.pairingBtn`);try{let e=await(await fetch(`${a}/api/pair`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({code:o,extensionId:chrome.runtime.id})})).json();if(e.success&&e.token){let i=r?.value.trim()||null;if(!i){try{let[t,n]=await Promise.all([fetch(`${a}/api/status`),fetch(`${a}/api/status/detail`,{headers:{Authorization:`Bearer ${e.token}`}})]),r=t.ok?await t.json():{},o=n.ok?await n.json():{},s=[];o.platformName?s.push(o.platformName):r.platformName&&s.push(r.platformName),o.arch?s.push(o.arch):r.arch&&s.push(r.arch),i=s.length>0?s.join(` `):new URL(a).hostname}catch{i=new URL(a).hostname}i||=t(`agentConfig.unnamedAgent`)}let o=`pa_${Date.now().toString(36)}_${Math.random().toString(36).slice(2,8)}`,s={id:o,name:i,url:a,token:e.token,pairedAt:new Date().toISOString()},c=(await chrome.storage.local.get(`pairedAgents`)).pairedAgents||[];c.push(s),await chrome.storage.local.set({pairedAgents:c,activeAgentId:o}),n.value=``,r&&(r.value=``),V(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}`),k(`connected`,r.join(` | `),e)}}catch{}await v(),chrome.runtime.sendMessage({type:`AGENT_CONNECTION_CHANGED`,connected:!0,agentId:o}).catch(()=>{})}else k(`disconnected`,t(`agentConfig.pairFailed`,{error:e.error||t(`agentConfig.unknownError`)})),V(e.error||t(`agentConfig.pairFailedShort`),`error`)}catch(e){k(`disconnected`,t(`agentConfig.connectFailed`)),V(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}),k(`disconnected`,t(`agentConfig.notConnectedSelect`)),V(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`,A),n.addEventListener(`keydown`,e=>{e.key===`Enter`&&A()}),(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(()=>{})})}
|
|
705
|
-
//# sourceMappingURL=options-
|
|
719
|
+
</div>`}).join(``),te(n),g(),n.forEach(e=>{e.disabled||_(e.url).then(t=>{ee(e.id,t)})})}let y=null;function ee(e,n){let r=p.querySelector(`[data-agent-id="${e}"]`);if(!r)return;let i=r.querySelector(`.paired-agent-dot`),a=r.querySelector(`.paired-agent-status-text`),o=r.classList.contains(`active`),s=o?n?`active-online`:`active-offline`:n?`online`:`offline`,c=t(o?n?`agentConfig.connected`:`agentConfig.notConnected`:n?`agentConfig.online`:`agentConfig.offline`);i&&(i.className=`paired-agent-dot ${s}`,i.title=`${o?t(`agentConfig.currentInUse`):``}${c}`),a&&(a.className=`paired-agent-status-text ${n?`online`:`offline`}`,a.textContent=c),o&&y!==null&&y!==n&&chrome.runtime.sendMessage({type:`AGENT_STATUS_CHANGE`,connected:n,status:t(n?`agentConfig.online`:`agentConfig.offline`),agentId:e}).catch(()=>{}),o&&(y=n)}function te(e){p.querySelectorAll(`.paired-agent-name`).forEach(e=>{e.addEventListener(`click`,()=>{if(e.querySelector(`input`))return;let t=e.dataset.agentId,n=e.dataset.original,r=document.createElement(`input`);r.type=`text`,r.value=n,r.className=`paired-agent-name-input`,r.style.cssText=`flex:1;font-size:14px;font-weight:500;border:1px solid #667eea;border-radius:4px;padding:2px 6px;outline:none;color:#2d3748;`,e.innerHTML=``,e.appendChild(r),r.focus(),r.select(),r.addEventListener(`blur`,async()=>{let i=r.value.trim()||n;r.remove(),e.textContent=i,e.dataset.original=i;let a=(await chrome.storage.local.get([`pairedAgents`,`activeAgentId`])).pairedAgents||[],o=a.findIndex(e=>e.id===t);o!==-1&&(a[o].name=i,await chrome.storage.local.set({pairedAgents:a}))}),r.addEventListener(`keydown`,e=>{e.key===`Enter`&&r.blur(),e.key===`Escape`&&(r.value=n,r.blur())})})}),p.querySelectorAll(`.paired-agent-btn`).forEach(e=>{e.addEventListener(`click`,async t=>{t.stopPropagation();let n=e.dataset.action,r=e.dataset.id;n===`switch`?await b(r):n===`deactivate`?await ue(r):n===`disable`?await re(r):n===`enable`?await x(r):n===`delete`&&await ne(r)})})}async function b(n){let r=((await chrome.storage.local.get(`pairedAgents`)).pairedAgents||[]).find(e=>e.id===n);r&&(await chrome.storage.local.set({activeAgentId:n}),e.value=r.url,await S(r.url,r.token),chrome.runtime.sendMessage({type:`AGENT_CONNECTION_CHANGED`,connected:!0,agentId:n}).catch(()=>{}),U(t(`agentConfig.connectedTo`,{name:r.name}),`success`),await v(),X().catch(()=>{}))}async function ne(e){let n=await chrome.storage.local.get([`pairedAgents`,`activeAgentId`]),r=n.pairedAgents||[],i=r.find(t=>t.id===e);if(!i||!await tn(t(`agentConfig.confirmDeleteAgent`,{name:i.name,url:i.url}),t(`agentConfig.deleteAgentTitle`)))return;let a=r.filter(t=>t.id!==e),o=n.activeAgentId;n.activeAgentId===e&&(o=a.length>0?a[0].id:null),await chrome.storage.local.set({pairedAgents:a,activeAgentId:o}),o&&o!==n.activeAgentId?(a.find(e=>e.id===o),chrome.runtime.sendMessage({type:`AGENT_CONNECTION_CHANGED`,connected:!0,agentId:o}).catch(()=>{})):o||chrome.runtime.sendMessage({type:`AGENT_CONNECTION_CHANGED`,connected:!1}).catch(()=>{}),U(t(`agentConfig.agentDeleted`,{name:i.name}),`info`),await v(),await C(),o!==n.activeAgentId&&X().catch(()=>{})}async function re(e){let n=await chrome.storage.local.get([`pairedAgents`,`activeAgentId`]),r=n.pairedAgents||[],i=r.find(t=>t.id===e);if(!i)return;if(n.activeAgentId===e){let t=r.find(t=>t.id!==e&&!t.disabled);t?(await chrome.storage.local.set({activeAgentId:t.id}),chrome.runtime.sendMessage({type:`AGENT_CONNECTION_CHANGED`,connected:!0,agentId:t.id}).catch(()=>{})):(await chrome.storage.local.set({activeAgentId:null}),chrome.runtime.sendMessage({type:`AGENT_CONNECTION_CHANGED`,connected:!1}).catch(()=>{}))}let a=r.findIndex(t=>t.id===e);r[a].disabled=!0,await chrome.storage.local.set({pairedAgents:r}),U(t(`agentConfig.agentDisabledToast`,{name:i.name}),`info`),await v(),await C(),n.activeAgentId===e&&X().catch(()=>{})}async function x(e){let n=(await chrome.storage.local.get([`pairedAgents`,`activeAgentId`])).pairedAgents||[],r=n.findIndex(t=>t.id===e);r!==-1&&(n[r].disabled=!1,await chrome.storage.local.set({pairedAgents:n}),U(t(`agentConfig.agentEnabledToast`,{name:n[r].name}),`success`),await v())}async function S(e,n){O(`checking`,t(`agentConfig.fetchingAgentInfo`));try{let r=await fetch(`${e}/api/status`,{cache:`no-cache`});if(!r.ok){O(`disconnected`,t(`agentConfig.agentUnreachable`));return}let i=await r.json();try{let r=await fetch(`${e}/api/status/detail`,{cache:`no-cache`,headers:{Authorization:`Bearer ${n}`}});if(r.ok){let e=ce(i,await r.json()),t=[`Agent v${e.version}`];e.platformName&&e.arch&&t.push(`${e.platformName} ${e.arch}`),e.nodeVersion&&t.push(`Node ${e.nodeVersion}`),O(`connected`,t.join(` | `),e)}else O(`disconnected`,t(`agentConfig.tokenExpired`))}catch{O(`disconnected`,t(`agentConfig.tokenExpired`))}}catch{O(`disconnected`,t(`agentConfig.cannotConnectAgent`))}}async function C(){let n=await chrome.storage.local.get([`pairedAgents`,`activeAgentId`]),r=n.pairedAgents||[],i=n.activeAgentId;if(!i||r.length===0){O(`disconnected`,r.length>0?t(`agentConfig.notConnectedSelect`):t(`agentConfig.notConnectedAdd`));return}let a=r.find(e=>e.id===i);a&&(e.value=a.url,await S(a.url,a.token))}function ie(e){if(e==null||e===0)return t(`agentConfig.unlimited`);let n=[`B`,`KB`,`MB`,`GB`],r=0,i=e;for(;i>=1024&&r<n.length-1;)i/=1024,r++;return Math.round(i*10)/10+` `+n[r]}function w(e){return e==null||e===0?t(`agentConfig.unlimited`):e<1e3?e+`ms`:e<6e4?(e/1e3).toFixed(0)+`s`:(e/6e4).toFixed(1)+` min`}function ae(e){if(e==null||e<0)return`-`;if(e<60)return e+`s`;if(e<3600)return Math.floor(e/60)+`min `+e%60+`s`;if(e<86400){let t=Math.floor(e/3600),n=Math.floor(e%3600/60);return t+`h `+n+`min`}let t=Math.floor(e/86400),n=Math.floor(e%86400/3600);return t+`d `+n+`h`}function T(e){return e==null||e<0?`-`:e<1e3?e+`μs`:e<1e6?(e/1e3).toFixed(1)+`ms`:(e/1e6).toFixed(2)+`s`}function E(e){return e==null||e<0?`-`:e<1e3?e+`ms`:e<6e4?(e/1e3).toFixed(1)+`s`:e<36e5?(e/6e4).toFixed(1)+`min`:(e/36e5).toFixed(2)+`h`}function oe(e){return!Array.isArray(e)||e.length===0?t(`agentConfig.idle`):e.map(e=>{let n=(e.command||``).replace(/\s+/g,` `).trim(),r=n.length>48?n.slice(0,48)+`…`:n||t(`agentConfig.unknownCommand`),i=e.pid?`pid=${D(String(e.pid))}`:``,a=E(e.duration);return[`<code>${D(r)}</code>`,i,D(a)].filter(Boolean).join(` · `)}).join(`<br>`)}function se(e){if(!d)return;let n=[];if(e.version&&n.push(`<div class="detail-row"><span class="detail-label">${t(`agentConfig.detailVersion`)}</span><span class="detail-value">${D(e.version)}</span></div>`),e.platformName){let r=e.arch?` (${e.arch})`:``;n.push(`<div class="detail-row"><span class="detail-label">${t(`agentConfig.detailSystem`)}</span><span class="detail-value">${D(e.platformName)}${r}</span></div>`)}else if(e.platform){let r=e.arch?` (${e.arch})`:``;n.push(`<div class="detail-row"><span class="detail-label">${t(`agentConfig.detailSystem`)}</span><span class="detail-value">${D(e.platform)}${r}</span></div>`)}if(e.hostname&&n.push(`<div class="detail-row"><span class="detail-label">${t(`agentConfig.detailHostname`)}</span><span class="detail-value">${D(e.hostname)}</span></div>`),e.shell&&n.push(`<div class="detail-row"><span class="detail-label">Shell</span><span class="detail-value">${D(e.shell)}</span></div>`),e.homeDir&&n.push(`<div class="detail-row"><span class="detail-label">${t(`agentConfig.detailHomeDir`)}</span><span class="detail-value">${D(e.homeDir)}</span></div>`),e.nodeVersion&&n.push(`<div class="detail-row"><span class="detail-label">Node.js</span><span class="detail-value">${D(e.nodeVersion)}</span></div>`),e.runningProcesses!=null){let r=Array.isArray(e.runningProcesses)?e.runningProcesses.length:0,i=r>0?t(`agentConfig.detailRunningProcessesCount`,{count:r}):t(`agentConfig.detailRunningProcesses`);n.push(`<div class="detail-row"><span class="detail-label">${i}</span><span class="detail-value">${oe(e.runningProcesses)}</span></div>`)}if(e.resourceUsage){let r=e.resourceUsage;n.push(`<div class="detail-row"><span class="detail-label">${t(`agentConfig.detailMemoryUsage`)}</span><span class="detail-value">${t(`agentConfig.detailMemoryDetail`,{used:r.memoryUsedMB,total:r.memoryTotalMB,rss:r.memoryRssMB})}</span></div>`),n.push(`<div class="detail-row"><span class="detail-label">${t(`agentConfig.detailUptime`)}</span><span class="detail-value">${ae(r.uptimeSeconds)}</span></div>`),n.push(`<div class="detail-row"><span class="detail-label">${t(`agentConfig.detailCpuUser`)}</span><span class="detail-value">${T(r.cpuUser)}</span></div>`),n.push(`<div class="detail-row"><span class="detail-label">${t(`agentConfig.detailCpuSystem`)}</span><span class="detail-value">${T(r.cpuSystem)}</span></div>`)}if(e.commandTimeout!=null&&n.push(`<div class="detail-row"><span class="detail-label">${t(`agentConfig.detailCommandTimeout`)}</span><span class="detail-value">${w(e.commandTimeout)}</span></div>`),e.uploadMaxSize!=null&&n.push(`<div class="detail-row"><span class="detail-label">${t(`agentConfig.detailUploadMaxSize`)}</span><span class="detail-value">${ie(e.uploadMaxSize)}</span></div>`),e.fileMaxSize!=null&&n.push(`<div class="detail-row"><span class="detail-label">${t(`agentConfig.detailFileMaxSize`)}</span><span class="detail-value">${ie(e.fileMaxSize)}</span></div>`),e.allowedPaths&&e.allowedPaths.length>0){let r=e.allowedPaths.map(e=>`<code>${D(e)}</code>`).join(`<br>`);n.push(`<div class="detail-row"><span class="detail-label">${t(`agentConfig.detailAllowedPaths`)}</span><span class="detail-value">${r}</span></div>`)}e.pairCodeTTL!=null&&n.push(`<div class="detail-row"><span class="detail-label">${t(`agentConfig.detailPairCodeTTL`)}</span><span class="detail-value">${e.pairCodeTTL}s</span></div>`),d.innerHTML=n.join(``),u.style.display=`block`}function D(e){let t=document.createElement(`div`);return t.textContent=e,t.innerHTML}function O(e,n,r){o.className=`agent-status `+e,a.textContent=n,s.style.display=``,e===`connected`?(o.className=`agent-status connected`,r&&(c.style.display=``,r.workdir&&(l.innerHTML=t(`agentConfig.detailWorkdir`,{dir:r.workdir})),se(r))):e===`checking`?o.className=`agent-status checking`:(c.style.display=`none`,o.className=`agent-status disconnected`,u&&(u.style.display=`none`),d&&(d.innerHTML=``))}function ce(e,t){return{version:t?.version||e?.version,platformName:t?.platformName||e?.platformName,platform:t?.platform||e?.platform,arch:t?.arch||e?.arch,hostname:t?.hostname||e?.hostname,shell:t?.shell||e?.shell,homeDir:t?.homeDir||e?.homeDir,nodeVersion:t?.nodeVersion||e?.nodeVersion,searchTools:t?.searchTools||e?.searchTools,runningProcesses:t?.runningProcesses??e?.runningProcesses,workdir:t?.workdir||e?.workdir||``,allowedPaths:t?.allowedPaths||e?.allowedPaths||[],commandTimeout:t?.commandTimeout||e?.commandTimeout,fileMaxSize:t?.fileMaxSize||e?.fileMaxSize,uploadMaxSize:t?.uploadMaxSize??e?.uploadMaxSize,pairCodeTTL:t?.pairCodeTTL||e?.pairCodeTTL,resourceUsage:t?.resourceUsage||null}}async function le(){let a=e.value.trim()||`http://127.0.0.1:18910`,o=n.value.trim();if(!o||o.length!==6){U(t(`agentConfig.pairCodeRequired`),`warning`);return}O(`checking`,t(`agentConfig.pairing`)),i.disabled=!0,i.textContent=t(`agentConfig.pairingBtn`);try{let e=await(await fetch(`${a}/api/pair`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({code:o,extensionId:chrome.runtime.id})})).json();if(e.success&&e.token){let i=r?.value.trim()||null;if(!i){try{let[t,n]=await Promise.all([fetch(`${a}/api/status`),fetch(`${a}/api/status/detail`,{headers:{Authorization:`Bearer ${e.token}`}})]),r=t.ok?await t.json():{},o=n.ok?await n.json():{},s=[];o.platformName?s.push(o.platformName):r.platformName&&s.push(r.platformName),o.arch?s.push(o.arch):r.arch&&s.push(r.arch),i=s.length>0?s.join(` `):new URL(a).hostname}catch{i=new URL(a).hostname}i||=t(`agentConfig.unnamedAgent`)}let o=`pa_${Date.now().toString(36)}_${Math.random().toString(36).slice(2,8)}`,s={id:o,name:i,url:a,token:e.token,pairedAt:new Date().toISOString()},c=(await chrome.storage.local.get(`pairedAgents`)).pairedAgents||[];c.push(s),await chrome.storage.local.set({pairedAgents:c,activeAgentId:o}),n.value=``,r&&(r.value=``),U(t(`agentConfig.pairSuccess`,{name:i}),`success`);try{let[t,n]=await Promise.all([fetch(`${a}/api/status`),fetch(`${a}/api/status/detail`,{headers:{Authorization:`Bearer ${e.token}`}})]);if(t.ok&&n.ok){let e=ce(await t.json(),await n.json()),r=[`Agent v${e.version}`];e.platformName&&e.arch&&r.push(`${e.platformName} ${e.arch}`),e.nodeVersion&&r.push(`Node ${e.nodeVersion}`),O(`connected`,r.join(` | `),e)}}catch{}await v(),chrome.runtime.sendMessage({type:`AGENT_CONNECTION_CHANGED`,connected:!0,agentId:o}).catch(()=>{})}else O(`disconnected`,t(`agentConfig.pairFailed`,{error:e.error||t(`agentConfig.unknownError`)})),U(e.error||t(`agentConfig.pairFailedShort`),`error`)}catch(e){O(`disconnected`,t(`agentConfig.connectFailed`)),U(t(`agentConfig.cannotConnectAgentMsg`,{error:e.message}),`error`)}finally{i.disabled=!1,i.textContent=t(`agentConfig.connect`)}}async function ue(e){(await chrome.storage.local.get([`pairedAgents`,`activeAgentId`])).activeAgentId===e&&(await chrome.storage.local.set({activeAgentId:null}),O(`disconnected`,t(`agentConfig.notConnectedSelect`)),U(t(`agentConfig.disconnectedToast`),`info`),await v(),chrome.runtime.sendMessage({type:`AGENT_CONNECTION_CHANGED`,connected:!1}).catch(()=>{}))}u&&d&&u.addEventListener(`click`,()=>{let e=getComputedStyle(d).display!==`none`;d.style.display=e?`none`:`block`,u.textContent=t(e?`agentConfig.detailToggle`:`agentConfig.detailToggleOpen`),u.classList.toggle(`open`,!e)}),i.addEventListener(`click`,le),n.addEventListener(`keydown`,e=>{e.key===`Enter`&&le()}),(async()=>{await v(),await C()})(),chrome.runtime.sendMessage({type:`OPTIONS_PAGE_OPEN`}).catch(()=>{}),chrome.runtime.onMessage.addListener(function(e,t,n){e.type===`AGENT_STATUS_CHANGE`&&(async()=>{await v(),await C(),X().catch(()=>{})})()}),window.addEventListener(`beforeunload`,()=>{chrome.runtime.sendMessage({type:`OPTIONS_PAGE_CLOSED`}).catch(()=>{})})}
|
|
720
|
+
//# sourceMappingURL=options-ByETRXPZ.js.map
|