ai-helper-agent 1.17.6 → 2.0.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.
@@ -1,7 +1,7 @@
1
- import{a as e,c as t,i as n,l as r,r as i}from"./i18n-vcpxJd-2.js";import{a,d as o,f as s,h as c,i as l,l as u,m as d,p as f,s as p,t as m,u as h}from"./constants-C6-BtNIC.js";import{$ as g,A as _,B as v,E as y,F as b,G as x,H as S,I as C,J as w,K as T,M as E,N as D,R as ee,T as O,V as k,Z as A,at as te,ct as ne,dt as re,et as ie,ft as ae,g as j,it as M,k as N,lt as oe,mt as se,nt as ce,ot as le,pt as ue,q as de,r as fe,t as P,tt as pe,ut as me,z as F}from"./session-store-iGooqz5j.js";var he=new Map,ge=new Map,_e=new Map,ve=new Map,ye=new Map;function be(e){e&&ve.set(e,0)}function xe(e){if(e){let t=(ve.get(e)||0)+1;return ve.set(e,t),t}return 0}function Se(e){return e&&ve.get(e)||0}function Ce(e){if(typeof e==`number`){ye.set(e,!0),r.debug(`[Background] ReAct loop cancelled,tabId:`,e);return}if(e===null){he.clear(),ye.clear();for(let[e,t]of ge)t.abort(),r.debug(`[Background] cancelledsession fetch requested ,sessionId:`,e);ge.clear(),_e.clear(),r.debug(`[Background] all has session ReAct loop cancelled`)}else{he.set(e,!0);let t=ge.get(e);t&&(t.abort(),r.debug(`[Background] cancelledsession fetch requested ,sessionId:`,e)),r.debug(`[Background] ReAct loop cancelled,sessionId:`,e)}}function we(e){if(typeof e==`number`){ye.delete(e);return}e!=null&&(he.delete(e),ge.delete(e),r.debug(`[Background] sessioncancelstatereset,sessionId:`,e))}function Te(e,t=!0){if(t){let t=ge.get(e);t&&t.abort()}let n=new AbortController;return ge.set(e,n),n}function I(e){if(e==null)return!1;if(typeof e==`number`)return ye.get(e)===!0;if(he.get(e)===!0)return!0;for(let t of he.keys())if(e.startsWith(t+`_`))return!0;return!1}function Ee(e){e!==null&&ye.delete(e)}function De(e){Ee(e)}var Oe=new Map;function ke(e,t){e&&t!=null&&Oe.set(e,t)}function L(e){return e?Oe.get(e):null}var Ae=new Map;function je(e,t){e&&t&&Ae.set(e,t)}function Me(e){return e&&Ae.get(e)||null}function Ne(e){return e?Ae.has(e):!1}function Pe(e,t){e&&(t&&Ae.get(e)!==t||Ae.delete(e))}function Fe(e){if(!e)return null;let t=new AbortController;return _e.set(e,t),t}function Ie(e){if(!e)return!1;let t=_e.get(e);return t&&!t.signal.aborted?(t.abort(),_e.delete(e),!0):!1}function Le(e){e&&_e.delete(e)}function R(){return new Promise(e=>{chrome.storage.local.get([`apiBase`,`apiKey`,`modelName`,`enabledTools`,`temperature`,`topP`,`reactMaxIterations`,`reactApiTimeout`,`reactLoopTimeout`,`reactToolTimeout`,`enableToolPreselect`,`toolConfirmationEnabled`,`reflectionConfig`,`streamEnabled`,`streamChunkDelay`,`agentStreamEnabled`],t=>{e({apiBase:t.apiBase||`https://api.deepseek.com`,apiKey:t.apiKey||``,modelName:t.modelName||`deepseek-v4-pro`,temperature:t.temperature===void 0?void 0:t.temperature,topP:t.topP===void 0?void 0:t.topP,enabledTools:t.enabledTools||[`page_content`,`query_elements`,`clipboard`],reactConfig:{maxIterations:t.reactMaxIterations||u.maxIterations,apiTimeout:t.reactApiTimeout||u.apiTimeout,loopTimeout:t.reactLoopTimeout||u.loopTimeout,toolTimeout:t.reactToolTimeout||u.toolTimeout,clarifyTimeout:u.clarifyTimeout,apiRetryCount:u.apiRetryCount,apiRetryBaseDelay:u.apiRetryBaseDelay,enableToolPreselect:t.enableToolPreselect===void 0?u.enableToolPreselect:t.enableToolPreselect,preselectMinToolCount:u.preselectMinToolCount,toolConfirmationEnabled:t.toolConfirmationEnabled===void 0?u.toolConfirmationEnabled:t.toolConfirmationEnabled,reflection:t.reflectionConfig||h},streamConfig:{streamEnabled:t.streamEnabled===void 0?o.streamEnabled:t.streamEnabled,streamChunkDelay:t.streamChunkDelay===void 0?o.streamChunkDelay:t.streamChunkDelay,agentStreamEnabled:t.agentStreamEnabled===void 0?o.agentStreamEnabled:t.agentStreamEnabled}})})})}function Re(){return new Promise(e=>{chrome.storage.local.get([`chatMaxMemoryMessages`,`enableExecutionLog`,`customModels`,`streamExpandTools`,`showMessageTimestamp`],t=>{e({maxMemoryMessages:t.chatMaxMemoryMessages===void 0?p.maxMemoryMessages:t.chatMaxMemoryMessages,enableExecutionLog:t.enableExecutionLog===void 0?p.enableExecutionLog:t.enableExecutionLog,customModelMap:ne(t.customModels||[]),streamExpandTools:t.streamExpandTools===!0,showMessageTimestamp:t.showMessageTimestamp!==!1})})})}e(`zh`,{agentClient:{pairingFailed:`配对失败`,cannotConnectAgent:`无法连接到 Agent: {error}`,agentNotPaired:`Agent 未配对,请先在设置中完成配对`,proxyNotConnected:`代理服务未连接,请确认代理服务已启动`,requestTimeout:`请求超时 ({timeout}ms)`,agentRequestFailed:`Agent 请求失败: {error}`,agentNotPairedShort:`Agent 未配对`,uploadTimeout:`文件上传超时 (60s)`,uploadFailed:`文件上传失败: {error}`,skillPromptFailed:`获取技能提示词失败`}}),e(`en`,{agentClient:{pairingFailed:`Pairing failed`,cannotConnectAgent:`Cannot connect to Agent: {error}`,agentNotPaired:`Agent not paired, please complete pairing in settings first`,proxyNotConnected:`Proxy service not connected, please confirm the proxy service is running`,requestTimeout:`Request timeout ({timeout}ms)`,agentRequestFailed:`Agent request failed: {error}`,agentNotPairedShort:`Agent not paired`,uploadTimeout:`File upload timeout (60s)`,uploadFailed:`File upload failed: {error}`,skillPromptFailed:`Failed to get skill prompt`}});var z=new Map;function ze(e,t){z.get(e)!==t&&r.debug(`[AgentClient] agentreachable toggle change:`,e,t?`reachable`:`unreachable`),z.set(e,t)}function Be(e){return z.get(e)??null}function B(){return`pa_${Date.now().toString(36)}_${Math.random().toString(36).slice(2,8)}`}async function Ve(){try{let e=await chrome.storage.local.get([`agentUrl`,`agentToken`,`agentPlatform`,`pairedAgents`]);if(e.pairedAgents&&e.pairedAgents.length>0)return!1;if(e.agentUrl&&e.agentToken){let t=e.agentPlatform||{},n=t.platformName?`${t.platformName} ${t.arch||``}`.trim():`默认代理`,i=B(),a=[{id:i,name:n,url:e.agentUrl,token:e.agentToken,pairedAt:new Date().toISOString()}];return await chrome.storage.local.set({pairedAgents:a,activeAgentId:i}),await chrome.storage.local.remove([`agentUrl`,`agentToken`,`agentPlatform`]),r.debug(`[AgentClient] from old formatmigrate agentconfiguration:`,n),!0}}catch(e){r.warn(`[AgentClient] old format migration failed:`,e.message)}return!1}async function He(){let e=await chrome.storage.local.get([`pairedAgents`,`activeAgentId`]),t=e.pairedAgents||[],n=e.activeAgentId;if(!n||t.length===0)return{url:null,token:null,connected:!1,agentId:null};let r=t.find(e=>e.id===n);if(!r){let e=t[0];return await chrome.storage.local.set({activeAgentId:e.id}),{url:e.url,token:e.token,connected:!0,agentId:e.id}}return{url:r.url,token:r.token,connected:!0,agentId:r.id}}async function Ue(){return(await chrome.storage.local.get(`pairedAgents`)).pairedAgents||[]}async function We(){let e=await chrome.storage.local.get([`pairedAgents`,`activeAgentId`]),t=e.pairedAgents||[];return!e.activeAgentId||t.length===0?null:t.find(t=>t.id===e.activeAgentId)||t[0]||null}async function Ge(e){return(await Ue()).find(t=>t.id===e)?(await chrome.storage.local.set({activeAgentId:e}),z.delete(e),chrome.runtime.sendMessage({type:`AGENT_CONNECTION_CHANGED`,connected:!0,agentId:e}).catch(()=>{}),r.debug(`[AgentClient] switched to agent:`,e),!0):(r.warn(`[AgentClient] switch failed,agent not found:`,e),!1)}async function V(e,n={},r=`POST`,a=6e4){let o=await He();if(!o.connected)return{success:!1,error:t(`agentClient.agentNotPaired`)};if(o.agentId&&z.get(o.agentId)===!1)return{success:!1,error:t(`agentClient.proxyNotConnected`)};let s=new AbortController,c=setTimeout(()=>s.abort(),a);try{let t={method:r,headers:{"Content-Type":`application/json`,Authorization:`Bearer ${o.token}`,"Accept-Language":i()},signal:s.signal};r!==`GET`&&r!==`HEAD`&&(t.body=JSON.stringify(n));let a=await fetch(`${o.url}${e}`,t);clearTimeout(c);let l=await a.json();return l&&typeof l==`object`&&(l.httpStatus=a.status),l}catch(e){return clearTimeout(c),e.name===`AbortError`?{success:!1,error:t(`agentClient.requestTimeout`,{timeout:a})}:{success:!1,error:t(`agentClient.agentRequestFailed`,{error:e.message})}}}async function Ke(e,n=3e4){let r=await He();if(!r.connected)return{success:!1,error:t(`agentClient.agentNotPairedShort`)};if(r.agentId&&z.get(r.agentId)===!1)return{success:!1,error:t(`agentClient.proxyNotConnected`)};let a=new AbortController,o=setTimeout(()=>a.abort(),n);try{let t=await fetch(`${r.url}${e}`,{method:`GET`,headers:{Authorization:`Bearer ${r.token}`,"Accept-Language":i()},signal:a.signal});return clearTimeout(o),await t.json()}catch(e){return clearTimeout(o),e.name===`AbortError`?{success:!1,error:t(`agentClient.requestTimeout`,{timeout:n})}:{success:!1,error:t(`agentClient.agentRequestFailed`,{error:e.message})}}}async function qe(e){return V(`/api/fs/read`,{path:e})}async function Je(e){let t=await V(`/api/fs/stat`,{path:e});return t.success?{success:!0,exists:!0,info:t.info}:t.httpStatus===404?{success:!0,exists:!1}:{success:!1}}async function Ye(e,t){return V(`/api/fs/write`,{path:e,content:t})}async function Xe(e){return V(`/api/browser/open`,{path:e})}async function Ze(e){return V(`/api/fs/list`,{path:e})}async function Qe(e){return V(`/api/fs/delete`,{path:e})}async function $e(e){return V(`/api/fs/download`,{path:e},`POST`,12e4)}async function et(e,t=`*`,n=!0,r=200){return V(`/api/fs/search_files`,{path:e,pattern:t,recursive:n,maxResults:r})}async function tt(e,t,n=null,r=!1,i=!0,a=100,o=2){return V(`/api/fs/search_content`,{path:e,pattern:t,filePattern:n,caseSensitive:r,recursive:i,maxResults:a,contextLines:o})}async function nt(e,t,n=!1){return V(`/api/exec`,{command:e,cwd:t,force:n})}async function rt(e,t,n=!1,r=6e5){return V(`/api/exec`,{command:e,cwd:t,wait:!0,force:n},`POST`,r)}async function it(e){return V(`/api/exec/stop`,{execId:e})}async function at(e,n,i,a,o){let s=await He();if(!s.connected)return a&&a(Error(t(`agentClient.agentNotPairedShort`))),null;if(s.agentId&&z.get(s.agentId)===!1)return a&&a(Error(t(`agentClient.proxyNotConnected`))),null;let c=e;if(s.url)try{let t=new URL(s.url),n=/^ws[s]?:\/\/(0\.0\.0\.0|127\.0\.0\.1|localhost):/;if(n.test(e)){let r=t.protocol===`https:`?`wss:`:`ws:`;c=e.replace(n,`${r}//${t.hostname}:`)}}catch{c=e.replace(`0.0.0.0`,`127.0.0.1`)}let l=c.includes(`?`)?`&`:`?`,u=`${c}${l}token=${encodeURIComponent(s.token)}`;return new Promise((e,t)=>{let o=new WebSocket(u),s=!1;o.onopen=()=>{s||(s=!0,r.debug(`[AgentClient] WebSocket connected:`,c,`(with token)`),e(o))},o.onmessage=e=>{try{let t=JSON.parse(e.data);n&&n(t)}catch{n&&n({type:`raw`,data:e.data})}},o.onclose=()=>{r.debug(`[AgentClient] WebSocket closed`),i&&i()},o.onerror=e=>{if(s)return;s=!0;let n=e instanceof Error?e:Error(`WebSocket 连接失败`);r.error(`[AgentClient] WebSocket error:`,n.message||e),a&&a(n),t(n)}})}async function ot(e){return Ke(e?`/api/mcp/tools?serverId=${encodeURIComponent(e)}`:`/api/mcp/tools`)}async function st(e,t,n){return V(`/api/mcp/call`,{serverId:e,toolName:t,args:n})}async function ct(){return Ke(`/api/mcp/servers`)}async function lt(){return Ke(`/api/rag/collections`)}async function ut(e){return V(`/api/rag/search`,e,`POST`,18e4)}async function dt(e,t){return V(`/api/rag/collections/${encodeURIComponent(e)}/ingest`,t,`POST`,6e5)}async function ft(){return Ke(`/api/skill/list`)}async function pt(e,t){return V(`/api/skill/run`,{name:e,params:t})}var mt=null,ht=null;function gt(){mt=null,ht=null}async function _t(){return mt&&Date.now()-mt.loadedAt<6e4?mt.agentNames:ht?(await ht,mt.agentNames):(ht=(async()=>{try{let e=await Ke(`/api/skill/list`),t=e?.success&&e.skills||[];mt={agentNames:new Set(t.filter(e=>e.type===`agent`).map(e=>e.name)),loadedAt:Date.now()}}catch{}finally{ht=null}})(),await ht,mt?.agentNames||new Set)}async function vt(){return Ke(`/api/skill/agent-prompts`)}async function yt(e){if(!e||e.length===0)return{success:!0,prompts:``};try{let t=await _t(),n=e.filter(e=>t.has(e));return n.length===0?{success:!0,prompts:``}:{success:!0,prompts:(await Promise.all(n.map(e=>bt(e).catch(()=>null)))).filter(e=>e&&e.success&&e.prompt).map(e=>e.prompt).join(`
1
+ import{a as e,c as t,i as n,l as r,r as i}from"./i18n-CohqPkkN.js";import{A as a,C as o,E as s,M as c,N as l,O as u,P as d,b as f,f as p,j as m,k as h,l as g,w as _}from"./model-profiles-BS2LIjxf.js";import{$ as v,A as y,B as b,E as x,F as S,G as C,H as w,I as T,J as E,K as D,M as ee,N as O,R as k,T as A,V as j,Z as te,at as ne,ct as M,dt as N,et as re,ft as ie,g as ae,it as oe,k as se,lt as ce,mt as le,nt as ue,ot as de,pt as fe,q as P,r as pe,t as F,tt as me,ut as he,z as ge}from"./session-store-DwXNnVF5.js";var _e=new Map,ve=new Map,ye=new Map,be=new Map,xe=new Map;function Se(e){e&&be.set(e,0)}function Ce(e){if(e){let t=(be.get(e)||0)+1;return be.set(e,t),t}return 0}function we(e){return e&&be.get(e)||0}function Te(e){if(typeof e==`number`){xe.set(e,!0),r.debug(`[Background] ReAct loop cancelled,tabId:`,e);return}if(e===null){_e.clear(),xe.clear();for(let[e,t]of ve)t.abort(),r.debug(`[Background] cancelledsession fetch requested ,sessionId:`,e);ve.clear(),ye.clear(),r.debug(`[Background] all has session ReAct loop cancelled`)}else{_e.set(e,!0);let t=ve.get(e);t&&(t.abort(),r.debug(`[Background] cancelledsession fetch requested ,sessionId:`,e)),r.debug(`[Background] ReAct loop cancelled,sessionId:`,e)}}function Ee(e){if(typeof e==`number`){xe.delete(e);return}e!=null&&(_e.delete(e),ve.delete(e),r.debug(`[Background] sessioncancelstatereset,sessionId:`,e))}function De(e,t=!0){if(t){let t=ve.get(e);t&&t.abort()}let n=new AbortController;return ve.set(e,n),n}function I(e){if(e==null)return!1;if(typeof e==`number`)return xe.get(e)===!0;if(_e.get(e)===!0)return!0;for(let t of _e.keys())if(e.startsWith(t+`_`))return!0;return!1}function Oe(e){e!==null&&xe.delete(e)}function ke(e){Oe(e)}var L=new Map;function Ae(e,t){e&&t!=null&&L.set(e,t)}function je(e){return e?L.get(e):null}var R=new Map;function Me(e,t){e&&t&&R.set(e,t)}function Ne(e){return e&&R.get(e)||null}function Pe(e){return e?R.has(e):!1}var Fe=new Map;function Ie(e,t){e&&(t&&typeof t.windowId==`number`?Fe.set(e,{windowId:t.windowId,hostTabId:typeof t.hostTabId==`number`?t.hostTabId:null}):Fe.set(e,null))}function Le(e){return e&&Fe.get(e)||null}function Re(e,t){e&&(t&&R.get(e)!==t||(R.delete(e),Fe.delete(e)))}function ze(e){if(!e)return null;let t=new AbortController;return ye.set(e,t),t}function Be(e){if(!e)return!1;let t=ye.get(e);return t&&!t.signal.aborted?(t.abort(),ye.delete(e),!0):!1}function z(e){e&&ye.delete(e)}function B(){return new Promise(e=>{chrome.storage.local.get([`apiBase`,`apiKey`,`modelName`,`enabledTools`,`temperature`,`topP`,`reactMaxIterations`,`reactApiTimeout`,`reactLoopTimeout`,`reactToolTimeout`,`enableToolPreselect`,`toolConfirmationEnabled`,`reflectionConfig`,`streamEnabled`,`streamChunkDelay`,`agentStreamEnabled`],t=>{e({apiBase:t.apiBase||`https://api.deepseek.com`,apiKey:t.apiKey||``,modelName:t.modelName||`deepseek-v4-pro`,temperature:t.temperature===void 0?void 0:t.temperature,topP:t.topP===void 0?void 0:t.topP,enabledTools:t.enabledTools||[`page_content`,`query_elements`,`clipboard`],reactConfig:{maxIterations:t.reactMaxIterations||u.maxIterations,apiTimeout:t.reactApiTimeout||u.apiTimeout,loopTimeout:t.reactLoopTimeout||u.loopTimeout,toolTimeout:t.reactToolTimeout||u.toolTimeout,clarifyTimeout:u.clarifyTimeout,apiRetryCount:u.apiRetryCount,apiRetryBaseDelay:u.apiRetryBaseDelay,enableToolPreselect:t.enableToolPreselect===void 0?u.enableToolPreselect:t.enableToolPreselect,preselectMinToolCount:u.preselectMinToolCount,toolConfirmationEnabled:t.toolConfirmationEnabled===void 0?u.toolConfirmationEnabled:t.toolConfirmationEnabled,reflection:t.reflectionConfig||h},streamConfig:{streamEnabled:t.streamEnabled===void 0?a.streamEnabled:t.streamEnabled,streamChunkDelay:t.streamChunkDelay===void 0?a.streamChunkDelay:t.streamChunkDelay,agentStreamEnabled:t.agentStreamEnabled===void 0?a.agentStreamEnabled:t.agentStreamEnabled}})})})}function Ve(){return new Promise(e=>{chrome.storage.local.get([`chatMaxMemoryMessages`,`enableExecutionLog`,`customModels`,`streamExpandTools`,`showMessageTimestamp`],t=>{e({maxMemoryMessages:t.chatMaxMemoryMessages===void 0?s.maxMemoryMessages:t.chatMaxMemoryMessages,enableExecutionLog:t.enableExecutionLog===void 0?s.enableExecutionLog:t.enableExecutionLog,customModelMap:M(t.customModels||[]),streamExpandTools:t.streamExpandTools===!0,showMessageTimestamp:t.showMessageTimestamp!==!1})})})}e(`zh`,{agentClient:{pairingFailed:`配对失败`,cannotConnectAgent:`无法连接到 Agent: {error}`,agentNotPaired:`Agent 未配对,请先在设置中完成配对`,proxyNotConnected:`代理服务未连接,请确认代理服务已启动`,requestTimeout:`请求超时 ({timeout}ms)`,agentRequestFailed:`Agent 请求失败: {error}`,agentNotPairedShort:`Agent 未配对`,uploadTimeout:`文件上传超时 (60s)`,uploadFailed:`文件上传失败: {error}`,skillPromptFailed:`获取技能提示词失败`}}),e(`en`,{agentClient:{pairingFailed:`Pairing failed`,cannotConnectAgent:`Cannot connect to Agent: {error}`,agentNotPaired:`Agent not paired, please complete pairing in settings first`,proxyNotConnected:`Proxy service not connected, please confirm the proxy service is running`,requestTimeout:`Request timeout ({timeout}ms)`,agentRequestFailed:`Agent request failed: {error}`,agentNotPairedShort:`Agent not paired`,uploadTimeout:`File upload timeout (60s)`,uploadFailed:`File upload failed: {error}`,skillPromptFailed:`Failed to get skill prompt`}});var He=new Map;function Ue(e,t){He.get(e)!==t&&r.debug(`[AgentClient] agentreachable toggle change:`,e,t?`reachable`:`unreachable`),He.set(e,t)}function We(e){return He.get(e)??null}function Ge(){return`pa_${Date.now().toString(36)}_${Math.random().toString(36).slice(2,8)}`}async function Ke(){try{let e=await chrome.storage.local.get([`agentUrl`,`agentToken`,`agentPlatform`,`pairedAgents`]);if(e.pairedAgents&&e.pairedAgents.length>0)return!1;if(e.agentUrl&&e.agentToken){let t=e.agentPlatform||{},n=t.platformName?`${t.platformName} ${t.arch||``}`.trim():`默认代理`,i=Ge(),a=[{id:i,name:n,url:e.agentUrl,token:e.agentToken,pairedAt:new Date().toISOString()}];return await chrome.storage.local.set({pairedAgents:a,activeAgentId:i}),await chrome.storage.local.remove([`agentUrl`,`agentToken`,`agentPlatform`]),r.debug(`[AgentClient] from old formatmigrate agentconfiguration:`,n),!0}}catch(e){r.warn(`[AgentClient] old format migration failed:`,e.message)}return!1}async function qe(){let e=await chrome.storage.local.get([`pairedAgents`,`activeAgentId`]),t=e.pairedAgents||[],n=e.activeAgentId;if(!n||t.length===0)return{url:null,token:null,connected:!1,agentId:null};let r=t.find(e=>e.id===n);if(!r){let e=t[0];return await chrome.storage.local.set({activeAgentId:e.id}),{url:e.url,token:e.token,connected:!0,agentId:e.id}}return{url:r.url,token:r.token,connected:!0,agentId:r.id}}async function Je(){return(await chrome.storage.local.get(`pairedAgents`)).pairedAgents||[]}async function Ye(){let e=await chrome.storage.local.get([`pairedAgents`,`activeAgentId`]),t=e.pairedAgents||[];return!e.activeAgentId||t.length===0?null:t.find(t=>t.id===e.activeAgentId)||t[0]||null}async function Xe(e){return(await Je()).find(t=>t.id===e)?(await chrome.storage.local.set({activeAgentId:e}),He.delete(e),chrome.runtime.sendMessage({type:`AGENT_CONNECTION_CHANGED`,connected:!0,agentId:e}).catch(()=>{}),r.debug(`[AgentClient] switched to agent:`,e),!0):(r.warn(`[AgentClient] switch failed,agent not found:`,e),!1)}async function V(e,n={},r=`POST`,a=6e4){let o=await qe();if(!o.connected)return{success:!1,error:t(`agentClient.agentNotPaired`)};if(o.agentId&&He.get(o.agentId)===!1)return{success:!1,error:t(`agentClient.proxyNotConnected`)};let s=new AbortController,c=setTimeout(()=>s.abort(),a);try{let t={method:r,headers:{"Content-Type":`application/json`,Authorization:`Bearer ${o.token}`,"Accept-Language":i()},signal:s.signal};r!==`GET`&&r!==`HEAD`&&(t.body=JSON.stringify(n));let a=await fetch(`${o.url}${e}`,t);clearTimeout(c);let l=await a.json();return l&&typeof l==`object`&&(l.httpStatus=a.status),l}catch(e){return clearTimeout(c),e.name===`AbortError`?{success:!1,error:t(`agentClient.requestTimeout`,{timeout:a})}:{success:!1,error:t(`agentClient.agentRequestFailed`,{error:e.message})}}}async function Ze(e,n=3e4){let r=await qe();if(!r.connected)return{success:!1,error:t(`agentClient.agentNotPairedShort`)};if(r.agentId&&He.get(r.agentId)===!1)return{success:!1,error:t(`agentClient.proxyNotConnected`)};let a=new AbortController,o=setTimeout(()=>a.abort(),n);try{let t=await fetch(`${r.url}${e}`,{method:`GET`,headers:{Authorization:`Bearer ${r.token}`,"Accept-Language":i()},signal:a.signal});return clearTimeout(o),await t.json()}catch(e){return clearTimeout(o),e.name===`AbortError`?{success:!1,error:t(`agentClient.requestTimeout`,{timeout:n})}:{success:!1,error:t(`agentClient.agentRequestFailed`,{error:e.message})}}}async function Qe(e){return V(`/api/fs/read`,{path:e})}async function $e(e){let t=await V(`/api/fs/stat`,{path:e});return t.success?{success:!0,exists:!0,info:t.info}:t.httpStatus===404?{success:!0,exists:!1}:{success:!1}}async function et(e,t){return V(`/api/fs/write`,{path:e,content:t})}async function tt(e){return V(`/api/browser/open`,{path:e})}async function nt(e){return V(`/api/fs/list`,{path:e})}async function rt(e){return V(`/api/fs/delete`,{path:e})}async function it(e){return V(`/api/fs/download`,{path:e},`POST`,12e4)}async function at(e,t=`*`,n=!0,r=200){return V(`/api/fs/search_files`,{path:e,pattern:t,recursive:n,maxResults:r})}async function ot(e,t,n=null,r=!1,i=!0,a=100,o=2){return V(`/api/fs/search_content`,{path:e,pattern:t,filePattern:n,caseSensitive:r,recursive:i,maxResults:a,contextLines:o})}async function st(e,t,n=!1){return V(`/api/exec`,{command:e,cwd:t,force:n})}async function ct(e,t,n=!1,r=6e5){return V(`/api/exec`,{command:e,cwd:t,wait:!0,force:n},`POST`,r)}async function lt(e){return V(`/api/exec/stop`,{execId:e})}async function ut(e,n,i,a,o){let s=await qe();if(!s.connected)return a&&a(Error(t(`agentClient.agentNotPairedShort`))),null;if(s.agentId&&He.get(s.agentId)===!1)return a&&a(Error(t(`agentClient.proxyNotConnected`))),null;let c=e;if(s.url)try{let t=new URL(s.url),n=/^ws[s]?:\/\/(0\.0\.0\.0|127\.0\.0\.1|localhost):/;if(n.test(e)){let r=t.protocol===`https:`?`wss:`:`ws:`;c=e.replace(n,`${r}//${t.hostname}:`)}}catch{c=e.replace(`0.0.0.0`,`127.0.0.1`)}let l=c.includes(`?`)?`&`:`?`,u=`${c}${l}token=${encodeURIComponent(s.token)}`;return new Promise((e,t)=>{let o=new WebSocket(u),s=!1;o.onopen=()=>{s||(s=!0,r.debug(`[AgentClient] WebSocket connected:`,c,`(with token)`),e(o))},o.onmessage=e=>{try{let t=JSON.parse(e.data);n&&n(t)}catch{n&&n({type:`raw`,data:e.data})}},o.onclose=()=>{r.debug(`[AgentClient] WebSocket closed`),i&&i()},o.onerror=e=>{if(s)return;s=!0;let n=e instanceof Error?e:Error(`WebSocket 连接失败`);r.error(`[AgentClient] WebSocket error:`,n.message||e),a&&a(n),t(n)}})}async function dt(e){return Ze(e?`/api/mcp/tools?serverId=${encodeURIComponent(e)}`:`/api/mcp/tools`)}async function ft(e,t,n){return V(`/api/mcp/call`,{serverId:e,toolName:t,args:n})}async function pt(){return Ze(`/api/mcp/servers`)}async function mt(){return Ze(`/api/rag/collections`)}async function ht(e){return V(`/api/rag/search`,e,`POST`,18e4)}async function gt(e,t){return V(`/api/rag/collections/${encodeURIComponent(e)}/ingest`,t,`POST`,6e5)}async function _t(){return Ze(`/api/skill/list`)}async function vt(e,t){return V(`/api/skill/run`,{name:e,params:t})}var yt=null,bt=null;function xt(){yt=null,bt=null}async function St(){return yt&&Date.now()-yt.loadedAt<6e4?yt.agentNames:bt?(await bt,yt.agentNames):(bt=(async()=>{try{let e=await Ze(`/api/skill/list`),t=e?.success&&e.skills||[];yt={agentNames:new Set(t.filter(e=>e.type===`agent`).map(e=>e.name)),loadedAt:Date.now()}}catch{}finally{bt=null}})(),await bt,yt?.agentNames||new Set)}async function Ct(){return Ze(`/api/skill/agent-prompts`)}async function wt(e){if(!e||e.length===0)return{success:!0,prompts:``};try{let t=await St(),n=e.filter(e=>t.has(e));return n.length===0?{success:!0,prompts:``}:{success:!0,prompts:(await Promise.all(n.map(e=>Tt(e).catch(()=>null)))).filter(e=>e&&e.success&&e.prompt).map(e=>e.prompt).join(`
2
2
 
3
- `)}}catch{return{success:!1,prompts:``,error:t(`agentClient.skillPromptFailed`)}}}async function bt(e){return Ke(`/api/skill/agent-prompt?name=${encodeURIComponent(e)}`)}async function xt(){try{return await V(`/api/agent/restart`,{},`POST`,1e4)}catch(e){return{success:!1,error:e.message}}}async function St(){try{return await V(`/api/agent/update`,{},`POST`,12e4)}catch(e){return{success:!1,error:e.message}}}async function Ct(){try{return await V(`/api/shutdown`,{},`POST`,1e4)}catch(e){return{success:!1,error:e.message}}}async function wt(e={}){return V(`/api/logs/query`,{category:e.category||null,limit:Math.min(e.limit||200,500)})}async function Tt(){return Ke(`/api/trash/list`)}async function Et(e){return V(`/api/trash/restore`,{trashId:e})}async function Dt(){let e=await He();if(!e.url)return!1;try{let t=new URL(e.url).hostname;return t===`localhost`||t===`127.0.0.1`||t===`[::1]`}catch{return!1}}var Ot=12e4;function kt(e){return Array.isArray(e)?e.filter(e=>e&&typeof e==`object`).map(e=>({...e,id:e.id||`tc_fb_${crypto.randomUUID().slice(0,8)}`})):[]}var At=class{constructor(e,t,n={}){this.sessionId=e,this.callId=n.callId||null,this.config=t,this.fullContent=``,this.reasoningContent=``,this.usage=null,this.toolCalls=[],this.isStreaming=!1,this.lastSendTime=0,this._pendingChunk=``,this._streamStarted=!!n.preStarted,this._streamDone=!1,this._sendFn=n.sendFn||(e=>chrome.runtime.sendMessage(e).catch(()=>{})),this._typePrefix=n.typePrefix||``}feedLine(e){if(!e||e.startsWith(`:`))return{type:`ignore`};let t=null;if(e.startsWith(`data:`)&&(t=e.substring(5).replace(/^\s+/,``)),t===null)return{type:`ignore`};if(t===`[DONE]`)return{type:`done`};let n;try{n=JSON.parse(t)}catch{return{type:`ignore`}}n.usage&&(this.usage=n.usage);let i=n.choices?.[0];if(!i)return{type:`ignore`};let a=i.delta||{},o=i.finish_reason;if(a.reasoning_content&&(this.reasoningContent+=a.reasoning_content),a.content&&(this.fullContent+=a.content),a.tool_calls)for(let e of a.tool_calls){let t=e.index||0;if(this.toolCalls[t]||(this.toolCalls[t]={id:e.id||``,type:`function`,function:{name:``,arguments:``}}),e.id&&(this.toolCalls[t].id=e.id),e.function?.name&&(this.toolCalls[t].function.name+=e.function.name),e.function?.arguments){let n=typeof e.function.arguments==`string`?e.function.arguments:JSON.stringify(e.function.arguments);this.toolCalls[t].function.arguments+=n}}return o===`stop`?a.content?{type:`content`,content:a.content}:{type:`done`}:o===`length`?a.content?{type:`content`,content:a.content}:{type:`done`,truncated:!0}:o===`tool_calls`?(r.debug(`[StreamController] tool_calls complete: ${this.toolCalls.length} call with `,this.toolCalls.map(e=>({name:e.function?.name,argsLen:e.function?.arguments?.length}))),{type:`tool_calls`}):a.content?{type:`content`,content:a.content}:a.tool_calls?{type:`accumulating`}:{type:`ignore`}}sendStart(){this._streamStarted||(this._streamStarted=!0,this.isStreaming=!0,this._sendFn({type:this._typePrefix+`STREAM_START`,sessionId:this.sessionId,callId:this.callId}))}sendChunk(e){this._pendingChunk+=e;let t=Date.now(),n=this.config.streamChunkDelay||0;t-this.lastSendTime<n||this._flushChunk()}_flushChunk(){this._pendingChunk&&(this.sendStart(),this._sendFn({type:this._typePrefix+`STREAM_CHUNK`,sessionId:this.sessionId,callId:this.callId,delta:this._pendingChunk}),this._pendingChunk=``,this.lastSendTime=Date.now())}finish(){this._flushChunk(),this.isStreaming=!1;let e=kt(this.toolCalls);this._sendFn({type:this._typePrefix+`STREAM_DONE`,sessionId:this.sessionId,callId:this.callId,finalContent:this.fullContent,reasoningContent:this.reasoningContent||null,usage:this.usage,toolCalls:e.length>0?e:null})}sendToolCallNotification(){this._flushChunk(),this._sendFn({type:this._typePrefix+`STREAM_TOOL_CALL`,sessionId:this.sessionId,callId:this.callId,toolCalls:this.toolCalls,thinkingContent:this.fullContent})}reset(){this._flushChunk(),this.fullContent=``,this.reasoningContent=``,this.usage=null,this._streamDone=!1,this.toolCalls=[],this._pendingChunk=``,this._streamStarted=!1,this.isStreaming=!1}getResult(){let e=kt(this.toolCalls);return{content:this.fullContent,reasoningContent:this.reasoningContent||null,usage:this.usage,toolCalls:e.length>0?e:null}}};async function jt(e,t,n,i=Ot){let a=new TextDecoder,o=``;t.sendStart();let s=null,c=()=>{s&&=(clearTimeout(s),null)},l=()=>new Promise((e,t)=>{s=setTimeout(()=>{let e=Error(`Stream idle timeout: no SSE data received for ${i}ms`);e.name=`StreamIdleTimeout`,e.idleMs=i,t(e)},i)});try{for(;;){let r,i=()=>{};try{let t=[e.read(),l()];n&&t.push(new Promise((e,t)=>{if(n.aborted){t(new DOMException(`Aborted`,`AbortError`));return}let r=()=>{t(new DOMException(`Aborted`,`AbortError`))};n.addEventListener(`abort`,r,{once:!0}),i=()=>n.removeEventListener(`abort`,r)})),r=await Promise.race(t)}finally{c(),i()}let{done:s,value:u}=r;if(s)break;o+=a.decode(u,{stream:!1});let d=o.split(`
4
- `);o=d.pop()||``;for(let e of d){let n=t.feedLine(e.trim());if(n.type===`content`)t.sendChunk(n.content);else if(n.type===`tool_calls`){let e=kt(t.toolCalls);return t.toolCalls=e,t._flushChunk(),(!t.config||t.config.streamEnabled!==!1)&&t._sendFn({type:t._typePrefix+`STREAM_TOOL_CALL`,sessionId:t.sessionId,callId:t.callId,toolCalls:e,thinkingContent:t.fullContent}).catch(()=>{}),{status:`tool_calls`,...t.getResult()}}else n.type===`done`&&(t._streamDone=!0)}}if(o.trim()){let e=t.feedLine(o.trim());if(e.type===`content`)t.sendChunk(e.content);else if(e.type===`tool_calls`)return{status:`tool_calls`,...t.getResult()}}return t.finish(),{status:`done`,...t.getResult()}}catch(n){if(c(),n.name===`AbortError`)throw r.debug(`[StreamController] streamingread was already cancel`),n;if(n.name===`StreamIdleTimeout`){r.warn(`[StreamController] streamingread idle timeout (${n.idleMs}ms no data),cancel reader`);try{await e.cancel()}catch{}throw t.finish(),n}throw r.error(`[StreamController] streamingread error:`,n.message),t.finish(),n}}function Mt(e,t,n,r,i){chrome.runtime.sendMessage({type:`AGENT_STREAM`,sessionId:e,execId:t,toolCallId:n,streamType:r,data:i}).catch(()=>{})}function H(e,t,n,r){chrome.runtime.sendMessage({type:`AGENT_STREAM_DONE`,sessionId:e,execId:t,toolCallId:n,exitCode:r}).catch(()=>{})}e(`zh`,{preselector:{nodeName:`工具预筛选`,reasonFewTools:`工具数量少`,reasonExtractFailed:`无法提取用户问题`,reasonApiFailed:`API 请求失败: {status}`,reasonEmptyResult:`模型返回空数组`,reasonNoMatch:`筛选结果无匹配`}}),e(`en`,{preselector:{nodeName:`Tool Pre-filter`,reasonFewTools:`Too few tools`,reasonExtractFailed:`Unable to extract user question`,reasonApiFailed:`API request failed: {status}`,reasonEmptyResult:`Model returned empty array`,reasonNoMatch:`No matching results after filtering`}});function Nt(e,t=2e3){let n=pe(e);return n.length>t?n.substring(0,t)+`...`:n}function Pt(e){let t=e.filter(e=>e.role===`user`);return t.length===0?``:Nt(t[t.length-1].content)}function Ft(e){let t=e.filter(e=>e.role===`user`||e.role===`assistant`);if(t.length===0)return[];let n=t.map((e,t)=>({m:e,i:t})).filter(e=>e.m.role===`user`).pop()?.i;return n===void 0?[]:t.slice(0,n).slice(-4).map(e=>({role:e.role,content:Nt(e.content,1e3)}))}function It(e){return`You are an intelligent assistant. Based on the user's question, determine whether tools are needed to complete the task.
3
+ `)}}catch{return{success:!1,prompts:``,error:t(`agentClient.skillPromptFailed`)}}}async function Tt(e){return Ze(`/api/skill/agent-prompt?name=${encodeURIComponent(e)}`)}async function Et(){try{return await V(`/api/agent/restart`,{},`POST`,1e4)}catch(e){return{success:!1,error:e.message}}}async function Dt(){try{return await V(`/api/agent/update`,{},`POST`,12e4)}catch(e){return{success:!1,error:e.message}}}async function Ot(){try{return await V(`/api/shutdown`,{},`POST`,1e4)}catch(e){return{success:!1,error:e.message}}}async function kt(e={}){return V(`/api/logs/query`,{category:e.category||null,limit:Math.min(e.limit||200,500)})}async function At(){return Ze(`/api/trash/list`)}async function jt(e){return V(`/api/trash/restore`,{trashId:e})}async function Mt(){let e=await qe();if(!e.url)return!1;try{let t=new URL(e.url).hostname;return t===`localhost`||t===`127.0.0.1`||t===`[::1]`}catch{return!1}}var Nt=12e4;function Pt(e){return Array.isArray(e)?e.filter(e=>e&&typeof e==`object`).map(e=>({...e,id:e.id||`tc_fb_${crypto.randomUUID().slice(0,8)}`})):[]}var Ft=class{constructor(e,t,n={}){this.sessionId=e,this.callId=n.callId||null,this.config=t,this.fullContent=``,this.reasoningContent=``,this.usage=null,this.toolCalls=[],this.isStreaming=!1,this.lastSendTime=0,this._pendingChunk=``,this._streamStarted=!!n.preStarted,this._streamDone=!1,this._sendFn=n.sendFn||(e=>chrome.runtime.sendMessage(e).catch(()=>{})),this._typePrefix=n.typePrefix||``}feedLine(e){if(!e||e.startsWith(`:`))return{type:`ignore`};let t=null;if(e.startsWith(`data:`)&&(t=e.substring(5).replace(/^\s+/,``)),t===null)return{type:`ignore`};if(t===`[DONE]`)return{type:`done`};let n;try{n=JSON.parse(t)}catch{return{type:`ignore`}}n.usage&&(this.usage=n.usage);let i=n.choices?.[0];if(!i)return{type:`ignore`};let a=i.delta||{},o=i.finish_reason;if(a.reasoning_content&&(this.reasoningContent+=a.reasoning_content),a.content&&(this.fullContent+=a.content),a.tool_calls)for(let e of a.tool_calls){let t=e.index||0;if(this.toolCalls[t]||(this.toolCalls[t]={id:e.id||``,type:`function`,function:{name:``,arguments:``}}),e.id&&(this.toolCalls[t].id=e.id),e.function?.name&&(this.toolCalls[t].function.name+=e.function.name),e.function?.arguments){let n=typeof e.function.arguments==`string`?e.function.arguments:JSON.stringify(e.function.arguments);this.toolCalls[t].function.arguments+=n}}return o===`stop`?a.content?{type:`content`,content:a.content}:{type:`done`}:o===`length`?a.content?{type:`content`,content:a.content}:{type:`done`,truncated:!0}:o===`tool_calls`?(r.debug(`[StreamController] tool_calls complete: ${this.toolCalls.length} call with `,this.toolCalls.map(e=>({name:e.function?.name,argsLen:e.function?.arguments?.length}))),{type:`tool_calls`}):a.content?{type:`content`,content:a.content}:a.tool_calls?{type:`accumulating`}:{type:`ignore`}}sendStart(){this._streamStarted||(this._streamStarted=!0,this.isStreaming=!0,this._sendFn({type:this._typePrefix+`STREAM_START`,sessionId:this.sessionId,callId:this.callId}))}sendChunk(e){this._pendingChunk+=e;let t=Date.now(),n=this.config.streamChunkDelay||0;t-this.lastSendTime<n||this._flushChunk()}_flushChunk(){this._pendingChunk&&(this.sendStart(),this._sendFn({type:this._typePrefix+`STREAM_CHUNK`,sessionId:this.sessionId,callId:this.callId,delta:this._pendingChunk}),this._pendingChunk=``,this.lastSendTime=Date.now())}finish(){this._flushChunk(),this.isStreaming=!1;let e=Pt(this.toolCalls);this._sendFn({type:this._typePrefix+`STREAM_DONE`,sessionId:this.sessionId,callId:this.callId,finalContent:this.fullContent,reasoningContent:this.reasoningContent||null,usage:this.usage,toolCalls:e.length>0?e:null})}sendToolCallNotification(){this._flushChunk(),this._sendFn({type:this._typePrefix+`STREAM_TOOL_CALL`,sessionId:this.sessionId,callId:this.callId,toolCalls:this.toolCalls,thinkingContent:this.fullContent})}reset(){this._flushChunk(),this.fullContent=``,this.reasoningContent=``,this.usage=null,this._streamDone=!1,this.toolCalls=[],this._pendingChunk=``,this._streamStarted=!1,this.isStreaming=!1}getResult(){let e=Pt(this.toolCalls);return{content:this.fullContent,reasoningContent:this.reasoningContent||null,usage:this.usage,toolCalls:e.length>0?e:null}}};async function It(e,t,n,i=Nt){let a=new TextDecoder,o=``;t.sendStart();let s=null,c=()=>{s&&=(clearTimeout(s),null)},l=()=>new Promise((e,t)=>{s=setTimeout(()=>{let e=Error(`Stream idle timeout: no SSE data received for ${i}ms`);e.name=`StreamIdleTimeout`,e.idleMs=i,t(e)},i)});try{for(;;){let r,i=()=>{};try{let t=[e.read(),l()];n&&t.push(new Promise((e,t)=>{if(n.aborted){t(new DOMException(`Aborted`,`AbortError`));return}let r=()=>{t(new DOMException(`Aborted`,`AbortError`))};n.addEventListener(`abort`,r,{once:!0}),i=()=>n.removeEventListener(`abort`,r)})),r=await Promise.race(t)}finally{c(),i()}let{done:s,value:u}=r;if(s)break;o+=a.decode(u,{stream:!1});let d=o.split(`
4
+ `);o=d.pop()||``;for(let e of d){let n=t.feedLine(e.trim());if(n.type===`content`)t.sendChunk(n.content);else if(n.type===`tool_calls`){let e=Pt(t.toolCalls);return t.toolCalls=e,t._flushChunk(),(!t.config||t.config.streamEnabled!==!1)&&t._sendFn({type:t._typePrefix+`STREAM_TOOL_CALL`,sessionId:t.sessionId,callId:t.callId,toolCalls:e,thinkingContent:t.fullContent}).catch(()=>{}),{status:`tool_calls`,...t.getResult()}}else n.type===`done`&&(t._streamDone=!0)}}if(o.trim()){let e=t.feedLine(o.trim());if(e.type===`content`)t.sendChunk(e.content);else if(e.type===`tool_calls`)return{status:`tool_calls`,...t.getResult()}}return t.finish(),{status:`done`,...t.getResult()}}catch(n){if(c(),n.name===`AbortError`)throw r.debug(`[StreamController] streamingread was already cancel`),n;if(n.name===`StreamIdleTimeout`){r.warn(`[StreamController] streamingread idle timeout (${n.idleMs}ms no data),cancel reader`);try{await e.cancel()}catch{}throw t.finish(),n}throw r.error(`[StreamController] streamingread error:`,n.message),t.finish(),n}}function Lt(e,t,n,r,i){chrome.runtime.sendMessage({type:`AGENT_STREAM`,sessionId:e,execId:t,toolCallId:n,streamType:r,data:i}).catch(()=>{})}function Rt(e,t,n,r){chrome.runtime.sendMessage({type:`AGENT_STREAM_DONE`,sessionId:e,execId:t,toolCallId:n,exitCode:r}).catch(()=>{})}e(`zh`,{preselector:{nodeName:`工具预筛选`,reasonFewTools:`工具数量少`,reasonExtractFailed:`无法提取用户问题`,reasonApiFailed:`API 请求失败: {status}`,reasonEmptyResult:`模型返回空数组`,reasonNoMatch:`筛选结果无匹配`}}),e(`en`,{preselector:{nodeName:`Tool Pre-filter`,reasonFewTools:`Too few tools`,reasonExtractFailed:`Unable to extract user question`,reasonApiFailed:`API request failed: {status}`,reasonEmptyResult:`Model returned empty array`,reasonNoMatch:`No matching results after filtering`}});function zt(e,t=2e3){let n=me(e);return n.length>t?n.substring(0,t)+`...`:n}function Bt(e){let t=e.filter(e=>e.role===`user`);return t.length===0?``:zt(t[t.length-1].content)}function Vt(e){let t=e.filter(e=>e.role===`user`||e.role===`assistant`);if(t.length===0)return[];let n=t.map((e,t)=>({m:e,i:t})).filter(e=>e.m.role===`user`).pop()?.i;return n===void 0?[]:t.slice(0,n).slice(-4).map(e=>({role:e.role,content:zt(e.content,1e3)}))}function Ht(e){return`You are an intelligent assistant. Based on the user's question, determine whether tools are needed to complete the task.
5
5
 
6
6
  Rules:
7
7
  1. If the question is very simple and you can answer directly (e.g., greetings, general knowledge, simple calculations), provide the answer directly.
@@ -13,13 +13,13 @@ ${e.map(e=>{let t=e.function.parameters?.properties,n=t?Object.keys(t).slice(0,3
13
13
 
14
14
  Output in JSON format:
15
15
  - For direct answers: {"type": "answer", "data": "your answer text"}
16
- - When tools are needed: {"type": "tools", "data": ["tool_name_1", "tool_name_2"]}`}function Lt(e){if(!e||typeof e!=`string`)return null;let t=e.trim();try{let e=JSON.parse(t);if(e&&typeof e==`object`&&e.type&&`data`in e){if(e.type===`answer`&&typeof e.data==`string`)return{type:`answer`,content:e.data};if(e.type===`tools`&&Array.isArray(e.data))return{type:`tools`,tools:e.data}}}catch{}let n=Rt(t);return n?{type:`tools`,tools:n}:null}function Rt(e){if(!e||typeof e!=`string`)return null;let t=e.match(/```(?:json)?\s*\n?([\s\S]*?)\n?\s*```/);if(t){let e=zt(t[1].trim());if(e)return r.debug(`[ToolPreselector] from code blockmentionedfetch JSON successful`),e}let n=e.indexOf(`[`);if(n!==-1){let t=0,i=-1;for(let r=n;r<e.length;r++)if(e[r]===`[`&&t++,e[r]===`]`&&(t--,t===0)){i=r;break}if(i!==-1){let t=zt(e.substring(n,i+1));if(t)return r.debug(`[ToolPreselector] from textmentionedfetch JSON group successful`),t}}let i=e.match(/\[[\s\S]*?\]/g);if(i)for(let e of i){let t=zt(e);if(t)return r.debug(`[ToolPreselector] via regexmentionedfetch JSON group successful`),t}return null}function zt(e){if(!e||typeof e!=`string`)return null;let t=e.trim();try{let e=JSON.parse(t);if(Array.isArray(e))return e}catch{}try{let e=t.replace(/,\s*\]/g,`]`),n=JSON.parse(e);if(Array.isArray(n))return n}catch{}try{let e=t.replace(/\[([\s\S]*)\]/g,(e,t)=>`[${t.split(`,`).map(e=>{let t=e.trim();return t.startsWith(`"`)&&t.endsWith(`"`)||t.startsWith(`'`)&&t.endsWith(`'`)?t:`"${t}"`}).join(`, `)}]`),n=JSON.parse(e);if(Array.isArray(n))return n}catch{}return null}async function Bt(e,n,i,a={},o=1,s=null){let c=i.length,l=crypto.randomUUID(),u=new Date().toISOString(),d=(e,n={})=>({id:l,iteration:0,timestamp:u,nodeType:`preselect`,nodeName:t(`preselector.nodeName`),...n,status:e}),f=await R(),p=f.reactConfig?.preselectMinToolCount??3;if(c<=p)return r.debug(`[ToolPreselector] tool count count ${c} <= ${p},skip pre-filter`),{type:`tools`,tools:i,executionLog:[d(`success`,{action:{name:`skip`,params:{reason:t(`preselector.reasonFewTools`),toolCount:c}},duration:1})]};let m=Pt(e);if(!m)return r.warn(`[ToolPreselector] cannot extractuseraskquestion,using alltool`),{type:`tools`,tools:i,executionLog:[d(`failed`,{error:t(`preselector.reasonExtractFailed`)})]};let h=Ft(e),g=It(i);r.debug(`[ToolPreselector] start pre-filter,full count tool: ${c} ,with historymessage: ${h.length} `);let _=Date.now();try{let e=f,a=`${e.apiBase}/chat/completions`,o=[{role:`system`,content:g},...h,{role:`user`,content:`User question: ${m}`}],l={model:n||e.modelName,messages:o,stream:!1,temperature:.1,max_tokens:Math.min(4096,Math.max(1024,c*30)),response_format:{type:`json_object`}},u=await aa(a,{method:`POST`,headers:{Authorization:`Bearer ${e.apiKey}`,"Content-Type":`application/json`},body:JSON.stringify(l)},e.reactConfig.apiTimeout,e.reactConfig.apiRetryCount,e.reactConfig.apiRetryBaseDelay),p=Date.now()-_;if(!u.ok)return r.warn(`[ToolPreselector] API request failed,using alltool`),{type:`tools`,tools:i,executionLog:[d(`failed`,{error:t(`preselector.reasonApiFailed`,{status:u.status}),duration:p})]};let v=((await u.json()).choices?.[0]?.message?.content||``).trim();r.debug(`[ToolPreselector] largemodelreturn:`,v);let y=Lt(v);if(y){if(y.type===`answer`)return r.debug(`[ToolPreselector] modeldirect answer (newformat),no secondarycall with `),{type:`answer`,content:y.content,executionLog:[d(`success`,{thought:y.content,duration:p})]};let e=y.tools;if(e.length===0)return r.warn(`[ToolPreselector] returned empty toolgroup,using alltool`),{type:`tools`,tools:i,executionLog:[d(`success`,{action:{name:`all_tools`,params:{reason:t(`preselector.reasonEmptyResult`)}},duration:p})]};let n=new Set(e.map(e=>String(e).toLowerCase())),a=i.filter(e=>n.has(e.function.name.toLowerCase()));if(m.includes(`proto_`)){for(let e of[`preview_ui`])if(!a.some(t=>t.function.name===e)){let t=i.find(t=>t.function.name===e);t&&(a.push(t),r.debug(`[ToolPreselector] fallback appendprototypetool: ${e}`))}}if(Array.isArray(s)&&s.length>0){let e=new Set(s);for(let t of i)e.has(t.function.name)&&!a.some(e=>e.function.name===t.function.name)&&(a.push(t),r.debug(`[ToolPreselector] 强制保留工具: ${t.function.name}`))}return a.length===0?(r.warn(`[ToolPreselector] filter after toolempty,using alltool`),{type:`tools`,tools:i,executionLog:[d(`success`,{action:{name:`all_tools`,params:{reason:t(`preselector.reasonNoMatch`)}},duration:p})]}):(r.debug(`[ToolPreselector] pre-filter complete: ${c} → ${a.length} tool`,a.map(e=>e.function.name)),{type:`tools`,tools:a,executionLog:[d(`success`,{action:{name:`preselect`,params:{selected:a.map(e=>e.function.name)}},apiRequest:{model:l.model,messageCount:o.length,toolCount:c},apiResponse:{toolCountAfter:a.length},duration:p})]})}return r.debug(`[ToolPreselector] modeldirect answer,no secondarycall with `),{type:`answer`,content:v,executionLog:[d(`success`,{thought:v,duration:p})]}}catch(e){let t=Date.now()-_;return r.warn(`[ToolPreselector] pre-filter exception,using alltool:`,e.message),{type:`tools`,tools:i,executionLog:[d(`failed`,{error:e.message,duration:t})]}}}async function Vt({sessionId:e,model:t,usage:n,callType:i}){if(!n||!n.prompt_tokens&&!n.total_tokens)return;let a=le(t);try{await O({sessionId:e||`unknown`,model:t||`unknown`,promptTokens:n.prompt_tokens||0,completionTokens:n.completion_tokens||0,totalTokens:n.total_tokens||(n.prompt_tokens||0)+(n.completion_tokens||0),contextWindow:a,callType:i||`unknown`})}catch(e){r.warn(`[TokenRecorder] record token stats failed:`,e.message)}}var Ht=200,Ut=500,Wt=150;function Gt(e){if(!e||typeof e!=`object`||Object.keys(e).length===0)return``;let t=Object.keys(e);if(t.length===0)return``;let n=[`path`,`query`,`url`,`command`,`name`,`pattern`,`filePath`,`content`],r=t.filter(e=>n.includes(e)).slice(0,2);if(r.length===0){let n=t.find(t=>e[t]!=null&&e[t]!==``);if(!n)return``;r.push(n)}return r.map(t=>`${t}=${(typeof e[t]==`string`?e[t]:JSON.stringify(e[t])).substring(0,Wt)}`).join(`, `)}async function Kt(e,t,n,i={}){if(!e||e.length<2)return r.debug(`[ContextSummarizer] round timesmessage not sufficient,skip summary`),null;let a=e.find(e=>e.role===`assistant`&&e.tool_calls);if(!a)return r.debug(`[ContextSummarizer] not found assistant(tool_calls),skip summary`),null;let o=`Summarize the execution of the following tool calls in one sentence, extracting key findings:
16
+ - When tools are needed: {"type": "tools", "data": ["tool_name_1", "tool_name_2"]}`}function Ut(e){if(!e||typeof e!=`string`)return null;let t=e.trim();try{let e=JSON.parse(t);if(e&&typeof e==`object`&&e.type&&`data`in e){if(e.type===`answer`&&typeof e.data==`string`)return{type:`answer`,content:e.data};if(e.type===`tools`&&Array.isArray(e.data))return{type:`tools`,tools:e.data}}}catch{}let n=Wt(t);return n?{type:`tools`,tools:n}:null}function Wt(e){if(!e||typeof e!=`string`)return null;let t=e.match(/```(?:json)?\s*\n?([\s\S]*?)\n?\s*```/);if(t){let e=Gt(t[1].trim());if(e)return r.debug(`[ToolPreselector] from code blockmentionedfetch JSON successful`),e}let n=e.indexOf(`[`);if(n!==-1){let t=0,i=-1;for(let r=n;r<e.length;r++)if(e[r]===`[`&&t++,e[r]===`]`&&(t--,t===0)){i=r;break}if(i!==-1){let t=Gt(e.substring(n,i+1));if(t)return r.debug(`[ToolPreselector] from textmentionedfetch JSON group successful`),t}}let i=e.match(/\[[\s\S]*?\]/g);if(i)for(let e of i){let t=Gt(e);if(t)return r.debug(`[ToolPreselector] via regexmentionedfetch JSON group successful`),t}return null}function Gt(e){if(!e||typeof e!=`string`)return null;let t=e.trim();try{let e=JSON.parse(t);if(Array.isArray(e))return e}catch{}try{let e=t.replace(/,\s*\]/g,`]`),n=JSON.parse(e);if(Array.isArray(n))return n}catch{}try{let e=t.replace(/\[([\s\S]*)\]/g,(e,t)=>`[${t.split(`,`).map(e=>{let t=e.trim();return t.startsWith(`"`)&&t.endsWith(`"`)||t.startsWith(`'`)&&t.endsWith(`'`)?t:`"${t}"`}).join(`, `)}]`),n=JSON.parse(e);if(Array.isArray(n))return n}catch{}return null}async function Kt(e,n,i,a={},o=1,s=null){let c=i.length,l=crypto.randomUUID(),u=new Date().toISOString(),d=(e,n={})=>({id:l,iteration:0,timestamp:u,nodeType:`preselect`,nodeName:t(`preselector.nodeName`),...n,status:e}),f=await B(),p=f.reactConfig?.preselectMinToolCount??3;if(c<=p)return r.debug(`[ToolPreselector] tool count count ${c} <= ${p},skip pre-filter`),{type:`tools`,tools:i,executionLog:[d(`success`,{action:{name:`skip`,params:{reason:t(`preselector.reasonFewTools`),toolCount:c}},duration:1})]};let m=Bt(e);if(!m)return r.warn(`[ToolPreselector] cannot extractuseraskquestion,using alltool`),{type:`tools`,tools:i,executionLog:[d(`failed`,{error:t(`preselector.reasonExtractFailed`)})]};let h=Vt(e),g=Ht(i);r.debug(`[ToolPreselector] start pre-filter,full count tool: ${c} ,with historymessage: ${h.length} `);let _=Date.now();try{let e=f,a=`${e.apiBase}/chat/completions`,o=[{role:`system`,content:g},...h,{role:`user`,content:`User question: ${m}`}],l={model:n||e.modelName,messages:o,stream:!1,temperature:.1,max_tokens:Math.min(4096,Math.max(1024,c*30)),response_format:{type:`json_object`}},u=await Ta(a,{method:`POST`,headers:{Authorization:`Bearer ${e.apiKey}`,"Content-Type":`application/json`},body:JSON.stringify(l)},e.reactConfig.apiTimeout,e.reactConfig.apiRetryCount,e.reactConfig.apiRetryBaseDelay),p=Date.now()-_;if(!u.ok)return r.warn(`[ToolPreselector] API request failed,using alltool`),{type:`tools`,tools:i,executionLog:[d(`failed`,{error:t(`preselector.reasonApiFailed`,{status:u.status}),duration:p})]};let v=((await u.json()).choices?.[0]?.message?.content||``).trim();r.debug(`[ToolPreselector] largemodelreturn:`,v);let y=Ut(v);if(y){if(y.type===`answer`)return r.debug(`[ToolPreselector] modeldirect answer (newformat),no secondarycall with `),{type:`answer`,content:y.content,executionLog:[d(`success`,{thought:y.content,duration:p})]};let e=y.tools;if(e.length===0)return r.warn(`[ToolPreselector] returned empty toolgroup,using alltool`),{type:`tools`,tools:i,executionLog:[d(`success`,{action:{name:`all_tools`,params:{reason:t(`preselector.reasonEmptyResult`)}},duration:p})]};let n=new Set(e.map(e=>String(e).toLowerCase())),a=i.filter(e=>n.has(e.function.name.toLowerCase()));if(m.includes(`proto_`)){for(let e of[`preview_ui`])if(!a.some(t=>t.function.name===e)){let t=i.find(t=>t.function.name===e);t&&(a.push(t),r.debug(`[ToolPreselector] fallback appendprototypetool: ${e}`))}}if(Array.isArray(s)&&s.length>0){let e=new Set(s);for(let t of i)e.has(t.function.name)&&!a.some(e=>e.function.name===t.function.name)&&(a.push(t),r.debug(`[ToolPreselector] 强制保留工具: ${t.function.name}`))}return a.length===0?(r.warn(`[ToolPreselector] filter after toolempty,using alltool`),{type:`tools`,tools:i,executionLog:[d(`success`,{action:{name:`all_tools`,params:{reason:t(`preselector.reasonNoMatch`)}},duration:p})]}):(r.debug(`[ToolPreselector] pre-filter complete: ${c} → ${a.length} tool`,a.map(e=>e.function.name)),{type:`tools`,tools:a,executionLog:[d(`success`,{action:{name:`preselect`,params:{selected:a.map(e=>e.function.name)}},apiRequest:{model:l.model,messageCount:o.length,toolCount:c},apiResponse:{toolCountAfter:a.length},duration:p})]})}return r.debug(`[ToolPreselector] modeldirect answer,no secondarycall with `),{type:`answer`,content:v,executionLog:[d(`success`,{thought:v,duration:p})]}}catch(e){let t=Date.now()-_;return r.warn(`[ToolPreselector] pre-filter exception,using alltool:`,e.message),{type:`tools`,tools:i,executionLog:[d(`failed`,{error:e.message,duration:t})]}}}async function qt({sessionId:e,model:t,usage:n,callType:i}){if(!n||!n.prompt_tokens&&!n.total_tokens)return;let a=de(t);try{await A({sessionId:e||`unknown`,model:t||`unknown`,promptTokens:n.prompt_tokens||0,completionTokens:n.completion_tokens||0,totalTokens:n.total_tokens||(n.prompt_tokens||0)+(n.completion_tokens||0),contextWindow:a,callType:i||`unknown`})}catch(e){r.warn(`[TokenRecorder] record token stats failed:`,e.message)}}e(`zh`,{notify:{feedbackSuccessTitle:`任务已完成`,feedbackFailTitle:`任务失败`,feedbackSuccessMsg:`「{name}」已完成,点击查看结果`,feedbackFailMsg:`「{name}」执行失败:{error}`,unknownError:`未知错误`,defaultName:`AI 助手`,confirmTitle:`需要你的确认`,confirmMsg:`敏感操作「{tool}」等待你确认,请打开侧边栏处理`,clarifyTitle:`AI 需要你的澄清`,clarifyMsg:`AI 在等待你的回答:{question}`}}),e(`en`,{notify:{feedbackSuccessTitle:`Task completed`,feedbackFailTitle:`Task failed`,feedbackSuccessMsg:`"{name}" completed. Click to view the result`,feedbackFailMsg:`"{name}" failed: {error}`,unknownError:`Unknown error`,defaultName:`AI Assistant`,confirmTitle:`Confirmation needed`,confirmMsg:`Sensitive action "{tool}" is waiting for your confirmation. Open the side panel to proceed`,clarifyTitle:`AI needs your clarification`,clarifyMsg:`AI is waiting for your answer: {question}`}});var Jt=`aih|`,Yt=160,Xt=120,Zt=null,Qt=null;function $t({isPanelVisible:e,revealPanel:t}={}){typeof e==`function`&&(Zt=e),typeof t==`function`&&(Qt=t);try{chrome.notifications?.onClicked?.addListener?.(e=>{if(!(typeof e!=`string`||!e.startsWith(Jt))){nn(e);try{Qt?.()}catch(e){r.debug(`[Notifier] reveal panel failed:`,e?.message)}}})}catch(e){r.debug(`[Notifier] register onClicked failed:`,e?.message)}}function en(e){return new Promise(t=>{try{chrome.storage?.local?.get?.(e,n=>{t(n?.[e]!==!1)})}catch{t(!0)}})}function tn(e,t){let n=!1,i=()=>{if(!n){n=!0;try{(chrome.notifications?.create?.(e,t))?.catch?.(()=>{})}catch(e){r.debug(`[Notifier] create notification failed:`,e?.message)}}};try{let t=chrome.notifications?.clear;if(typeof t!=`function`){i();return}t.call(chrome.notifications,e,()=>{chrome.runtime?.lastError&&r.debug(`[Notifier] clear before create, no existing notification:`,chrome.runtime.lastError.message),i()})}catch(e){r.debug(`[Notifier] clear before create failed:`,e?.message),i()}}function nn(e){try{(chrome.notifications?.clear?.(e))?.catch?.(()=>{})}catch(e){r.debug(`[Notifier] clear notification failed:`,e?.message)}}function rn(e,t){let n=String(e??``).replace(/\s+/g,` `).trim();return n?n.length>t?n.slice(0,t-1)+`…`:n:``}function an(){try{return chrome.runtime?.getURL?.(`icons/icon128.png`)||`icons/icon128.png`}catch{return`icons/icon128.png`}}async function on({success:e,sessionId:n=null,name:i=``,error:a=``,source:o=`chat`,panelSnapshot:s=null}={}){try{if(!await en(o===`scheduled`?`scheduledNotificationEnabled`:`completionNotificationEnabled`)||o===`chat`&&n&&Zt&&Zt(n,s))return;let r=i;if(!r&&n)try{r=(await j(n))?.title||``}catch{}r||=t(`notify.defaultName`);let c=!!e;tn(`aih|feedback|`+(c?`ok`:`fail`)+`|`+(n||`global`),{type:`basic`,iconUrl:an(),title:t(c?`notify.feedbackSuccessTitle`:`notify.feedbackFailTitle`),message:c?t(`notify.feedbackSuccessMsg`,{name:r}):t(`notify.feedbackFailMsg`,{name:r,error:rn(a||t(`notify.unknownError`),Yt)}),silent:!0,requireInteraction:!c})}catch(e){r.debug(`[Notifier] notify task feedback failed:`,e?.message||e)}}async function sn({kind:e=`confirm`,sessionId:n=null,detail:i=``}={}){try{if(!await en(`interactionNotificationEnabled`)||n&&Zt&&Zt(n))return;let r=e!==`clarify`;tn(`aih|interaction|`+(r?`confirm`:`clarify`)+`|`+(n||`global`),{type:`basic`,iconUrl:an(),title:t(r?`notify.confirmTitle`:`notify.clarifyTitle`),message:r?t(`notify.confirmMsg`,{tool:rn(i,Xt)}):t(`notify.clarifyMsg`,{question:rn(i,Xt)}),requireInteraction:!0})}catch(e){r.debug(`[Notifier] notify interaction required failed:`,e?.message||e)}}function cn(e){let t=e||`global`;nn(`aih|interaction|confirm|`+t),nn(`aih|interaction|clarify|`+t)}var ln=200,un=500,dn=150;function fn(e){if(!e||typeof e!=`object`||Object.keys(e).length===0)return``;let t=Object.keys(e);if(t.length===0)return``;let n=[`path`,`query`,`url`,`command`,`name`,`pattern`,`filePath`,`content`],r=t.filter(e=>n.includes(e)).slice(0,2);if(r.length===0){let n=t.find(t=>e[t]!=null&&e[t]!==``);if(!n)return``;r.push(n)}return r.map(t=>`${t}=${(typeof e[t]==`string`?e[t]:JSON.stringify(e[t])).substring(0,dn)}`).join(`, `)}async function pn(e,t,n,i={}){if(!e||e.length<2)return r.debug(`[ContextSummarizer] round timesmessage not sufficient,skip summary`),null;let a=e.find(e=>e.role===`assistant`&&e.tool_calls);if(!a)return r.debug(`[ContextSummarizer] not found assistant(tool_calls),skip summary`),null;let o=`Summarize the execution of the following tool calls in one sentence, extracting key findings:
17
17
 
18
- ${a.tool_calls.map((t,n)=>{let r=t.function?.name||t.name||`unknown`,i=Gt(typeof t.function?.arguments==`string`?(()=>{try{return JSON.parse(t.function.arguments)}catch{return{}}})():t.function?.arguments||{}),o=e.find(e=>e.role===`tool`&&e.tool_call_id===(t.id||a.tool_calls[n]?.id)),s=(o?typeof o.content==`string`?o.content:JSON.stringify(o.content):`(no return)`).substring(0,Ut);return`Tool: ${r}${i?` (${i})`:``}\nResult: ${s}`}).join(`
18
+ ${a.tool_calls.map((t,n)=>{let r=t.function?.name||t.name||`unknown`,i=fn(typeof t.function?.arguments==`string`?(()=>{try{return JSON.parse(t.function.arguments)}catch{return{}}})():t.function?.arguments||{}),o=e.find(e=>e.role===`tool`&&e.tool_call_id===(t.id||a.tool_calls[n]?.id)),s=(o?typeof o.content==`string`?o.content:JSON.stringify(o.content):`(no return)`).substring(0,un);return`Tool: ${r}${i?` (${i})`:``}\nResult: ${s}`}).join(`
19
19
 
20
20
  `)}
21
21
 
22
- Output requirements: Summarize in one sentence what this round of operations did and what key information was found. No more than 150 characters.`;try{let e=await aa(`${t.apiBase}/chat/completions`,{method:`POST`,headers:{Authorization:`Bearer ${t.apiKey}`,"Content-Type":`application/json`},body:JSON.stringify({model:n||t.modelName,messages:[{role:`user`,content:o}],stream:!1,max_tokens:Ht,temperature:.1}),signal:i.signal},i.timeout||15e3,1,500);if(!e.ok)return r.warn(`[ContextSummarizer] API request failed: ${e.status}`),null;let a=((await e.json()).choices?.[0]?.message?.content||``).trim();return a?(r.debug(`[ContextSummarizer] summary complete: ${a.substring(0,100)}`),a):(r.warn(`[ContextSummarizer] summary returnedempty`),null)}catch(e){return r.warn(`[ContextSummarizer] summary requestexception:`,e.message),null}}e(`zh`,{reflection:{qualityAssessment:`质量评估`,qualityAssessmentScore:`质量评估: {score}/10 ({decision})`,decisionPassed:`通过`,decisionRevised:`已修订`,decisionNeedsImprovement:`需改进`,postNodeName:`质量评估 {round}/{maxRounds}`,subtaskNodeName:`子任务反思: {name}`,lowScoreRevised:`⚠️ 原答案评分过低,已由反思修订`,retrySuggestion:`建议:重新执行任务,基于反思问题调整工具选择和执行策略`}}),e(`en`,{reflection:{qualityAssessment:`Quality Assessment`,qualityAssessmentScore:`Quality Assessment: {score}/10 ({decision})`,decisionPassed:`Passed`,decisionRevised:`Revised`,decisionNeedsImprovement:`Needs Improvement`,postNodeName:`Quality Assessment {round}/{maxRounds}`,subtaskNodeName:`Subtask Reflection: {name}`,lowScoreRevised:`⚠️ Original score too low, revised by reflection`,retrySuggestion:`Suggestion: Re-execute the task, adjust tool selection and execution strategy based on reflection issues`}});function qt(e,t){return!t&&!!(e.some(e=>e.nodeType===`tool_exec`&&e.action?.name===`plan_task`&&e.status===`success`)||e.some(e=>e.nodeType===`tool_exec`&&e.status===`failed`)||e.filter(e=>e.nodeType===`tool_exec`).length>=2)}function Jt(e,t,n){let r=0;return(t.includes(`"success":false`)||t.includes(`error`)||t.includes(`失败`))&&(r+=10),n>=2&&(r+=n*5),[`fill_form`,`interact_element`,`download_file`,`manage_cookies`,`clear_data`].includes(e)&&(r+=3),(!t||t.trim()===``||t===`{}`)&&(r+=2),r}function Yt(e,t,n){if(!n?.enabled||!n?.toolReflection?.enabled)return!1;let r=n.toolReflection;return!!(r.triggerOnConsecutiveFails&&t>=r.triggerOnConsecutiveFails||r.triggerOnError&&(e.includes(`"success":false`)||e.includes(`error`)||e.includes(`失败`))||r.triggerOnEmpty&&(!e||e.trim()===``||e===`{}`)||r.triggerOnOversized&&e.length>r.oversizeThreshold)}function Xt(e,t,n,r=1){let i=e.filter(e=>e.role===`user`),a=i.length>0?pe(i[i.length-1].content):`unknown`,o=n.filter(e=>e.nodeType===`api_call`).length,s=n.filter(e=>e.nodeType===`tool_exec`),c=s.map(e=>{let t=e.action?.params||{},n=Object.keys(t).length>0?`params: ${JSON.stringify(t)}`:``,r=e.observation?`result summary: ${String(e.observation).substring(0,200)}`:``;return` ${e.status===`success`?`✅`:`❌`} ${e.action?.name||e.nodeName} ${n} ${r}`.trim()}).join(`
22
+ Output requirements: Summarize in one sentence what this round of operations did and what key information was found. No more than 150 characters.`;try{let e=await Ta(`${t.apiBase}/chat/completions`,{method:`POST`,headers:{Authorization:`Bearer ${t.apiKey}`,"Content-Type":`application/json`},body:JSON.stringify({model:n||t.modelName,messages:[{role:`user`,content:o}],stream:!1,max_tokens:ln,temperature:.1}),signal:i.signal},i.timeout||15e3,1,500);if(!e.ok)return r.warn(`[ContextSummarizer] API request failed: ${e.status}`),null;let a=((await e.json()).choices?.[0]?.message?.content||``).trim();return a?(r.debug(`[ContextSummarizer] summary complete: ${a.substring(0,100)}`),a):(r.warn(`[ContextSummarizer] summary returnedempty`),null)}catch(e){return r.warn(`[ContextSummarizer] summary requestexception:`,e.message),null}}e(`zh`,{reflection:{qualityAssessment:`质量评估`,qualityAssessmentScore:`质量评估: {score}/10 ({decision})`,decisionPassed:`通过`,decisionRevised:`已修订`,decisionNeedsImprovement:`需改进`,postNodeName:`质量评估 {round}/{maxRounds}`,subtaskNodeName:`子任务反思: {name}`,lowScoreRevised:`⚠️ 原答案评分过低,已由反思修订`,retrySuggestion:`建议:重新执行任务,基于反思问题调整工具选择和执行策略`}}),e(`en`,{reflection:{qualityAssessment:`Quality Assessment`,qualityAssessmentScore:`Quality Assessment: {score}/10 ({decision})`,decisionPassed:`Passed`,decisionRevised:`Revised`,decisionNeedsImprovement:`Needs Improvement`,postNodeName:`Quality Assessment {round}/{maxRounds}`,subtaskNodeName:`Subtask Reflection: {name}`,lowScoreRevised:`⚠️ Original score too low, revised by reflection`,retrySuggestion:`Suggestion: Re-execute the task, adjust tool selection and execution strategy based on reflection issues`}});function mn(e,t){return!t&&!!(e.some(e=>e.nodeType===`tool_exec`&&e.action?.name===`plan_task`&&e.status===`success`)||e.some(e=>e.nodeType===`tool_exec`&&e.status===`failed`)||e.filter(e=>e.nodeType===`tool_exec`).length>=2)}function hn(e,t,n){let r=0;return(t.includes(`"success":false`)||t.includes(`error`)||t.includes(`失败`))&&(r+=10),n>=2&&(r+=n*5),[`fill_form`,`interact_element`,`download_file`,`manage_cookies`,`clear_data`].includes(e)&&(r+=3),(!t||t.trim()===``||t===`{}`)&&(r+=2),r}function gn(e,t,n){if(!n?.enabled||!n?.toolReflection?.enabled)return!1;let r=n.toolReflection;return!!(r.triggerOnConsecutiveFails&&t>=r.triggerOnConsecutiveFails||r.triggerOnError&&(e.includes(`"success":false`)||e.includes(`error`)||e.includes(`失败`))||r.triggerOnEmpty&&(!e||e.trim()===``||e===`{}`)||r.triggerOnOversized&&e.length>r.oversizeThreshold)}function _n(e,t,n,r=1){let i=e.filter(e=>e.role===`user`),a=i.length>0?me(i[i.length-1].content):`unknown`,o=n.filter(e=>e.nodeType===`api_call`).length,s=n.filter(e=>e.nodeType===`tool_exec`),c=s.map(e=>{let t=e.action?.params||{},n=Object.keys(t).length>0?`params: ${JSON.stringify(t)}`:``,r=e.observation?`result summary: ${String(e.observation).substring(0,200)}`:``;return` ${e.status===`success`?`✅`:`❌`} ${e.action?.name||e.nodeName} ${n} ${r}`.trim()}).join(`
23
23
  `);s.length>0&&s.map(e=>`${e.action?.name||e.nodeName} (${e.status})`).join(`, `);let l=n.filter(e=>e.nodeType===`tool_exec`&&e.action?.name===`plan_task`),u=l.length>0?`, ${l[0].subtaskCount||0} subtasks decomposed`:``,d=n.filter(e=>e.nodeType===`reflection`&&e.reflectionType===`tool`),f=d.length>0?d.map(e=>` ${e.useful?`✅useful`:`⚠️invalid`} - ${e.nodeName}: ${e.reasoning||``} ${e.suggestion?`(suggestion: ${e.suggestion})`:``}`).join(`
24
24
  `):`none`,p=`API calls: ${o}${u}.`,m=t.length>3e3?t.substring(0,3e3)+`...`:t;return`Please strictly evaluate the quality of the following AI assistant's answer to the user's question${r>1?` (this is round ${r} of evaluation; the revised answer from the previous round is shown in "Final Answer" below)`:``}.
25
25
 
@@ -58,7 +58,7 @@ Please output in strict JSON format (do not include markdown code block markers)
58
58
  "issues": ["specific issue 1", "specific issue 2"],
59
59
  "suggestions": ["specific improvement suggestion 1", "specific improvement suggestion 2"],
60
60
  "refinedAnswer": "If the answer has obvious flaws, output the complete revised answer (must be complete, not just the modified parts); otherwise set to null"
61
- }`}function Zt(e){let t={overallScore:7,dimensions:{},issues:[],suggestions:[],refinedAnswer:null};if(!e)return t;try{let t=JSON.parse(e.trim());return{overallScore:typeof t.overallScore==`number`?t.overallScore:7,dimensions:t.dimensions||{},issues:Array.isArray(t.issues)?t.issues:[],suggestions:Array.isArray(t.suggestions)?t.suggestions:[],refinedAnswer:typeof t.refinedAnswer==`string`?t.refinedAnswer:null}}catch{let t=e.match(/```(?:json)?\s*\n?([\s\S]*?)\n?\s*```/);if(t)try{let e=JSON.parse(t[1].trim());return{overallScore:typeof e.overallScore==`number`?e.overallScore:7,dimensions:e.dimensions||{},issues:Array.isArray(e.issues)?e.issues:[],suggestions:Array.isArray(e.suggestions)?e.suggestions:[],refinedAnswer:typeof e.refinedAnswer==`string`?e.refinedAnswer:null}}catch{}}return r.warn(`[Background] cannot parsereflection result,using default value`),t}async function Qt(e,n,i,a,o,s,c,l,u,d,f,p=0,m=null){let h=s.postReflection;if(!s?.enabled||!h?.enabled||h.maxRounds<1)return{content:n,reflectionLog:[],status:`skipped`,overallScore:null,wasRevised:!1};let g=[],_=Math.min(Math.max(1,h.maxRounds),10-p),v=Date.now(),y=n,b=null,x=`passed`,S=!1;l(t(`reflection.qualityAssessment`),`processing`);try{let n=`${o.apiBase}/chat/completions`,s=h.model||a||o.modelName;for(let r=1;r<=_;r++){p++;let a=Date.now(),c=crypto.randomUUID(),l=Xt(e,y,i,r),d=await aa(n,{method:`POST`,headers:{Authorization:`Bearer ${o.apiKey}`,"Content-Type":`application/json`},body:JSON.stringify({model:s,messages:[{role:`system`,content:`You are a strict quality evaluator. Output the evaluation result in JSON format; do not include markdown code block markers.`},{role:`user`,content:l}],stream:!1,temperature:h.temperature,max_tokens:h.maxTokens,response_format:{type:`json_object`}}),signal:m},3e4,1,1e3);if(!d.ok)throw Error(`Reflection API error: ${d.status}`);let v=await d.json(),C=v.choices?.[0]?.message?.content||``,w=Zt(C),T=Date.now()-a;b=w.overallScore;let E,D=y;if(w.overallScore>=h.qualityThreshold?(E=`passed`,D=w.refinedAnswer||y,w.refinedAnswer&&w.refinedAnswer!==y&&(S=!0)):w.overallScore>=h.refineThreshold?(E=`revised`,w.refinedAnswer&&(D=w.refinedAnswer,S=!0)):w.refinedAnswer?(E=`revised`,D=w.refinedAnswer,S=!0,w.issues=w.issues||[],w.issues.some(e=>e.includes(`反思修订`))||w.issues.unshift(t(`reflection.lowScoreRevised`))):(E=`needs_improvement`,w.suggestions=w.suggestions||[],w.suggestions.some(e=>e.includes(`重新执行`)||e.includes(`retry`))||w.suggestions.push(t(`reflection.retrySuggestion`))),x=E,t(E===`passed`?`reflection.decisionPassed`:E===`revised`?`reflection.decisionRevised`:`reflection.decisionNeedsImprovement`),g.push({id:c,iteration:u?.value||0,timestamp:new Date().toISOString(),status:`success`,nodeType:`reflection`,nodeName:t(`reflection.postNodeName`,{round:r,maxRounds:_}),reflectionType:`post`,round:r,overallScore:w.overallScore,dimensions:w.dimensions,issues:w.issues,suggestions:w.suggestions,prompt:l,rawContent:C,apiRequest:{model:s,messageCount:2,temperature:h.temperature,maxTokens:h.maxTokens},apiResponse:{tokenUsage:v.usage||null},action:{decision:E,refinedAnswer:w.refinedAnswer&&w.refinedAnswer!==y?w.refinedAnswer:null},duration:T}),v.usage&&Vt({sessionId:f,model:s,usage:v.usage,callType:`reflection`}).catch(()=>{}),E===`passed`){y=D;break}y=D}let c=Date.now()-v,d=g[g.length-1],C=b??d?.overallScore,w=x||d?.action?.decision||`passed`,T=t(w===`passed`?`reflection.decisionPassed`:w===`revised`?`reflection.decisionRevised`:`reflection.decisionNeedsImprovement`);return l(t(`reflection.qualityAssessmentScore`,{score:C,decision:T}),`success`),r.debug(`[Background] reflection complete: score ${C}/10, decision: ${T}, revise: ${S}, total time: ${c}ms`),{content:y,reflectionLog:g,status:w,overallScore:C,wasRevised:S}}catch(e){if(e.name===`AbortError`)throw e;r.warn(`[Background] reflection API call with failed:`,e.message);let i=Date.now()-v;return g.push({id:crypto.randomUUID(),iteration:u?.value||0,timestamp:new Date().toISOString(),status:`failed`,nodeType:`reflection`,nodeName:t(`reflection.qualityAssessment`),reflectionType:`post`,error:e.message,duration:i}),{content:n,reflectionLog:g,status:`reflection_failed`,overallScore:null,wasRevised:!1}}}async function $t(e,t,n,i,a,o,s,c,l,u=null){if(!o?.enabled)return null;let d=o.toolReflection;if(!d?.enabled||s.filter(e=>e.nodeType===`reflection`&&e.reflectionType===`tool`&&e.iteration===c).length>=d.maxPerIteration)return null;let f=`You are executing a browser automation task. The tool "${e}" was just called with parameters ${JSON.stringify(n)}.
61
+ }`}function vn(e){let t={overallScore:7,dimensions:{},issues:[],suggestions:[],refinedAnswer:null};if(!e)return t;try{let t=JSON.parse(e.trim());return{overallScore:typeof t.overallScore==`number`?t.overallScore:7,dimensions:t.dimensions||{},issues:Array.isArray(t.issues)?t.issues:[],suggestions:Array.isArray(t.suggestions)?t.suggestions:[],refinedAnswer:typeof t.refinedAnswer==`string`?t.refinedAnswer:null}}catch{let t=e.match(/```(?:json)?\s*\n?([\s\S]*?)\n?\s*```/);if(t)try{let e=JSON.parse(t[1].trim());return{overallScore:typeof e.overallScore==`number`?e.overallScore:7,dimensions:e.dimensions||{},issues:Array.isArray(e.issues)?e.issues:[],suggestions:Array.isArray(e.suggestions)?e.suggestions:[],refinedAnswer:typeof e.refinedAnswer==`string`?e.refinedAnswer:null}}catch{}}return r.warn(`[Background] cannot parsereflection result,using default value`),t}async function yn(e,n,i,a,o,s,c,l,u,d,f,p=0,m=null){let h=s.postReflection;if(!s?.enabled||!h?.enabled||h.maxRounds<1)return{content:n,reflectionLog:[],status:`skipped`,overallScore:null,wasRevised:!1};let g=[],_=Math.min(Math.max(1,h.maxRounds),10-p),v=Date.now(),y=n,b=null,x=`passed`,S=!1;l(t(`reflection.qualityAssessment`),`processing`);try{let n=`${o.apiBase}/chat/completions`,s=h.model||a||o.modelName;for(let r=1;r<=_;r++){p++;let a=Date.now(),c=crypto.randomUUID(),l=_n(e,y,i,r),d=await Ta(n,{method:`POST`,headers:{Authorization:`Bearer ${o.apiKey}`,"Content-Type":`application/json`},body:JSON.stringify({model:s,messages:[{role:`system`,content:`You are a strict quality evaluator. Output the evaluation result in JSON format; do not include markdown code block markers.`},{role:`user`,content:l}],stream:!1,temperature:h.temperature,max_tokens:h.maxTokens,response_format:{type:`json_object`}}),signal:m},3e4,1,1e3);if(!d.ok)throw Error(`Reflection API error: ${d.status}`);let v=await d.json(),C=v.choices?.[0]?.message?.content||``,w=vn(C),T=Date.now()-a;b=w.overallScore;let E,D=y;if(w.overallScore>=h.qualityThreshold?(E=`passed`,D=w.refinedAnswer||y,w.refinedAnswer&&w.refinedAnswer!==y&&(S=!0)):w.overallScore>=h.refineThreshold?(E=`revised`,w.refinedAnswer&&(D=w.refinedAnswer,S=!0)):w.refinedAnswer?(E=`revised`,D=w.refinedAnswer,S=!0,w.issues=w.issues||[],w.issues.some(e=>e.includes(`反思修订`))||w.issues.unshift(t(`reflection.lowScoreRevised`))):(E=`needs_improvement`,w.suggestions=w.suggestions||[],w.suggestions.some(e=>e.includes(`重新执行`)||e.includes(`retry`))||w.suggestions.push(t(`reflection.retrySuggestion`))),x=E,t(E===`passed`?`reflection.decisionPassed`:E===`revised`?`reflection.decisionRevised`:`reflection.decisionNeedsImprovement`),g.push({id:c,iteration:u?.value||0,timestamp:new Date().toISOString(),status:`success`,nodeType:`reflection`,nodeName:t(`reflection.postNodeName`,{round:r,maxRounds:_}),reflectionType:`post`,round:r,overallScore:w.overallScore,dimensions:w.dimensions,issues:w.issues,suggestions:w.suggestions,prompt:l,rawContent:C,apiRequest:{model:s,messageCount:2,temperature:h.temperature,maxTokens:h.maxTokens},apiResponse:{tokenUsage:v.usage||null},action:{decision:E,refinedAnswer:w.refinedAnswer&&w.refinedAnswer!==y?w.refinedAnswer:null},duration:T}),v.usage&&qt({sessionId:f,model:s,usage:v.usage,callType:`reflection`}).catch(()=>{}),E===`passed`){y=D;break}y=D}let c=Date.now()-v,d=g[g.length-1],C=b??d?.overallScore,w=x||d?.action?.decision||`passed`,T=t(w===`passed`?`reflection.decisionPassed`:w===`revised`?`reflection.decisionRevised`:`reflection.decisionNeedsImprovement`);return l(t(`reflection.qualityAssessmentScore`,{score:C,decision:T}),`success`),r.debug(`[Background] reflection complete: score ${C}/10, decision: ${T}, revise: ${S}, total time: ${c}ms`),{content:y,reflectionLog:g,status:w,overallScore:C,wasRevised:S}}catch(e){if(e.name===`AbortError`)throw e;r.warn(`[Background] reflection API call with failed:`,e.message);let i=Date.now()-v;return g.push({id:crypto.randomUUID(),iteration:u?.value||0,timestamp:new Date().toISOString(),status:`failed`,nodeType:`reflection`,nodeName:t(`reflection.qualityAssessment`),reflectionType:`post`,error:e.message,duration:i}),{content:n,reflectionLog:g,status:`reflection_failed`,overallScore:null,wasRevised:!1}}}async function bn(e,t,n,i,a,o,s,c,l,u=null){if(!o?.enabled)return null;let d=o.toolReflection;if(!d?.enabled||s.filter(e=>e.nodeType===`reflection`&&e.reflectionType===`tool`&&e.iteration===c).length>=d.maxPerIteration)return null;let f=`You are executing a browser automation task. The tool "${e}" was just called with parameters ${JSON.stringify(n)}.
62
62
 
63
63
  Tool returned result (truncated):
64
64
  ${t.substring(0,2e3)}
@@ -72,7 +72,7 @@ Output in JSON format (do not include markdown code blocks):
72
72
  "suggestion": null
73
73
  }
74
74
 
75
- If the result is not helpful, set useful to false and provide a suggestion.`;try{let e=await aa(`${i.apiBase}/chat/completions`,{method:`POST`,headers:{Authorization:`Bearer ${i.apiKey}`,"Content-Type":`application/json`},body:JSON.stringify({model:a||i.modelName,messages:[{role:`system`,content:`You are a tool execution result evaluator. Output only JSON.`},{role:`user`,content:f}],stream:!1,temperature:.1,max_tokens:512,response_format:{type:`json_object`}}),signal:u},15e3,1,1e3);if(!e.ok)return null;let t=await e.json();t.usage&&Vt({sessionId:l||`unknown`,model:a||i.modelName,usage:t.usage,callType:`tool_reflection`}).catch(()=>{});let n=t.choices?.[0]?.message?.content||``;try{let e=JSON.parse(n.trim());return{useful:e.useful!==!1,reasoning:e.reasoning||``,suggestion:e.suggestion||null}}catch{let e=n.match(/\{[\s\S]*\}/);if(e){let t=JSON.parse(e[0]);return{useful:t.useful!==!1,reasoning:t.reasoning||``,suggestion:t.suggestion||null}}}return null}catch(e){if(e.name===`AbortError`)throw e;return r.warn(`[Background] toolreflection call failed:`,e.message),null}}async function en(e,n,i,a,o,s,c,l,u,d,f=null){let p=Date.now(),m=[],h=s.dimensions||[`completeness`,`relevance`],g={completeness:`whether the task is fully completed`,relevance:`whether the result is relevant to the task goal`,accuracy:`whether the result is accurate without errors`,efficiency:`whether the execution process is efficient`},_=h.map(e=>`- ${e}: ${g[e]||e}`).join(`
75
+ If the result is not helpful, set useful to false and provide a suggestion.`;try{let e=await Ta(`${i.apiBase}/chat/completions`,{method:`POST`,headers:{Authorization:`Bearer ${i.apiKey}`,"Content-Type":`application/json`},body:JSON.stringify({model:a||i.modelName,messages:[{role:`system`,content:`You are a tool execution result evaluator. Output only JSON.`},{role:`user`,content:f}],stream:!1,temperature:.1,max_tokens:512,response_format:{type:`json_object`}}),signal:u},15e3,1,1e3);if(!e.ok)return null;let t=await e.json();t.usage&&qt({sessionId:l||`unknown`,model:a||i.modelName,usage:t.usage,callType:`tool_reflection`}).catch(()=>{});let n=t.choices?.[0]?.message?.content||``;try{let e=JSON.parse(n.trim());return{useful:e.useful!==!1,reasoning:e.reasoning||``,suggestion:e.suggestion||null}}catch{let e=n.match(/\{[\s\S]*\}/);if(e){let t=JSON.parse(e[0]);return{useful:t.useful!==!1,reasoning:t.reasoning||``,suggestion:t.suggestion||null}}}return null}catch(e){if(e.name===`AbortError`)throw e;return r.warn(`[Background] toolreflection call failed:`,e.message),null}}async function xn(e,n,i,a,o,s,c,l,u,d,f=null){let p=Date.now(),m=[],h=s.dimensions||[`completeness`,`relevance`],g={completeness:`whether the task is fully completed`,relevance:`whether the result is relevant to the task goal`,accuracy:`whether the result is accurate without errors`,efficiency:`whether the execution process is efficient`},_=h.map(e=>`- ${e}: ${g[e]||e}`).join(`
76
76
  `),v=`You are evaluating the execution result of a subtask.
77
77
 
78
78
  Subtask name: ${l}
@@ -93,9 +93,9 @@ Output the evaluation result in JSON format (do not include markdown code blocks
93
93
  "issues": ["discovered issue 1", "discovered issue 2"],
94
94
  "suggestions": ["improvement suggestion 1"],
95
95
  "refinedAnswer": null // if revision is needed, provide the revised answer here
96
- }`;try{let e=`${o.apiBase}/chat/completions`,i=s.model||a||o.modelName,c=await aa(e,{method:`POST`,headers:{Authorization:`Bearer ${o.apiKey}`,"Content-Type":`application/json`},body:JSON.stringify({model:i,messages:[{role:`system`,content:`You are a strict quality evaluator. Output the evaluation result in JSON format; do not include markdown code block markers.`},{role:`user`,content:v}],stream:!1,temperature:s.temperature||.3,max_tokens:s.maxTokens||1024}),signal:f},3e4,1,1e3);if(!c.ok)throw Error(`Subtask reflection API error: ${c.status}`);let u=await c.json(),h=u.choices?.[0]?.message?.content||``,g=Zt(h),_=Date.now()-p;return m.push({id:crypto.randomUUID(),iteration:0,timestamp:new Date().toISOString(),status:`success`,nodeType:`reflection`,nodeName:t(`reflection.subtaskNodeName`,{name:l}),reflectionType:`subtask`,overallScore:g.overallScore,dimensions:g.dimensions,issues:g.issues,suggestions:g.suggestions,prompt:v,rawContent:h,apiRequest:{model:i,messageCount:2,temperature:s.temperature||.3,maxTokens:s.maxTokens||1024},apiResponse:{tokenUsage:u.usage||null},duration:_}),r.debug(`[Background] subtask reflectioncomplete: ${l}, score: ${g.overallScore}/10, elapsed: ${_}ms`),u.usage&&Vt({sessionId:d,model:i,usage:u.usage,callType:`subtask_reflection`}).catch(()=>{}),{score:g.overallScore,refinedContent:g.refinedAnswer&&g.refinedAnswer!==n?g.refinedAnswer:null,reflectionLog:m}}catch(e){if(e.name===`AbortError`)throw e;r.warn(`[Background] subtask reflection failed:`,e.message);let n=Date.now()-p;return m.push({id:crypto.randomUUID(),iteration:0,timestamp:new Date().toISOString(),status:`failed`,nodeType:`reflection`,nodeName:t(`reflection.subtaskNodeName`,{name:l}),reflectionType:`subtask`,error:e.message,duration:n}),{score:null,refinedContent:null,reflectionLog:m}}}e(`zh`,{reactLoop:{apiCallNode:`API调用 (第{count}次{subtask})`,apiCallSubtask:`, 子任务第{iteration}次`,preparing:`准备开始执行...`,toolExec:`工具执行:{name}`,toolExecStart:`执行工具: {name}`,taskPlanDone:`任务规划完成`,executionDone:`执行完成`,userDenied:`用户拒绝了此操作`,subtaskRolledBack:`子任务 {name} (已回滚)`,subtaskRollbackFailed:`子任务 {name} (回滚失败)`,subtaskCount:`已拆解为 {count} 个子任务`,toolReflection:`工具反思: {name}`,subtaskNode:`子任务 {index}: {name}`,subtaskCompleted:`子任务 {index}: {name} (完成)`,subtaskFailed:`子任务 {index}: {name} (失败)`,userCancelled:`用户取消`,skippedAfterPlanTask:`已跳过(plan_task 已拆分子任务,本轮其他工具调用不再执行)`,toolError:`错误: {message}`,loopTimeout:`ReAct 循环总超时 ({timeout}ms,不含澄清等待时间)`,apiInvalidJson:`API 响应不是有效的 JSON (HTTP {status}): {error}。响应前100字符: {preview}`,infiniteLoopDetected:`连续{count}次执行完全相同的工具调用(入参和返参均相同),疑似陷入死循环,已自动终止。请更换策略或缩小任务范围后重试。`,maxIterationsExceeded:`ReAct 循环超过最大迭代次数 ({maxIterations})`,toolTimeout:`工具执行超时 ({timeout}ms): {tool}`,toolAborted:`工具执行已被用户终止: {tool}`,jsonParseFailed:`JSON 解析失败 (HTTP {status}): {error}。响应前100字符: {preview}`,streamIdleTimeout:`流式响应空闲超时({seconds} 秒未收到任何数据),已自动中断。可能是网络或服务提供商暂时不稳定,请重试。`}}),e(`en`,{reactLoop:{apiCallNode:`API Call (#{count}{subtask})`,apiCallSubtask:`, Subtask #{iteration}`,preparing:`Preparing to execute...`,toolExec:`Tool Exec:{name}`,toolExecStart:`Executing: {name}`,taskPlanDone:`Task planning completed`,executionDone:`Execution completed`,userDenied:`User denied this operation`,subtaskRolledBack:`Subtask {name} (rolled back)`,subtaskRollbackFailed:`Subtask {name} (rollback failed)`,subtaskCount:`Broken down into {count} subtasks`,toolReflection:`Tool Reflection: {name}`,subtaskNode:`Subtask {index}: {name}`,subtaskCompleted:`Subtask {index}: {name} (completed)`,subtaskFailed:`Subtask {index}: {name} (failed)`,skippedAfterPlanTask:`Skipped (plan_task has decomposed subtasks, other tool calls in this round are no longer executed)`,toolError:`Error: {message}`,loopTimeout:`ReAct loop total timeout ({timeout}ms, excluding clarification wait time)`,apiInvalidJson:`API response is not valid JSON (HTTP {status}): {error}. First 100 chars: {preview}`,infiniteLoopDetected:`Executed the exact same tool call {count} times in a row (both inputs and outputs identical), likely stuck in an infinite loop. Automatically terminated. Please change strategy or narrow the task scope and retry.`,maxIterationsExceeded:`ReAct loop exceeded maximum iterations ({maxIterations})`,toolTimeout:`Tool execution timed out ({timeout}ms): {tool}`,toolAborted:`Tool execution was aborted by user: {tool}`,jsonParseFailed:`JSON parse failed (HTTP {status}): {error}. First 100 chars: {preview}`,streamIdleTimeout:`Stream idle timeout (no data received for {seconds}s), automatically interrupted. This may be caused by an unstable network or provider, please retry.`}});var tn=new Set,nn=new Set,rn={manage_cookies:`sensitiveTool.manage_cookies`,clear_data:`sensitiveTool.clear_data`,download_file:`sensitiveTool.download_file`,manage_tab:`sensitiveTool.manage_tab`,agent_file:`sensitiveTool.agent_file`,debug_page:`sensitiveTool.debug_page`};async function an(e,n,i,a){let o=rn[e],s=o?t(o):e,c=3e5;r.debug(`[Background] requesting user confirmation for tool operation: ${e}`,n);let l=``;if(e===`manage_tab`&&n.action===`close`&&n.tabId!==void 0)try{let e=await chrome.tabs.get(parseInt(n.tabId,10));l=t(`sensitiveTool.tabInfo`,{title:e.title||t(`sensitiveTool.untitled`),url:e.url||t(`sensitiveTool.unknownUrl`)})}catch(e){l=t(`sensitiveTool.tabInfoError`,{error:e.message})}return e===`debug_page`&&n.action===`attach`&&(l=t(`sensitiveTool.debuggerAttachHint`)),new Promise(i=>{let o=t=>{t.type===`TOOL_CONFIRMATION_RESPONSE`&&t.toolCallId===e&&(chrome.runtime.onMessage.removeListener(o),clearTimeout(u),r.debug(`[Background] userconfirmresult: ${e} = ${t.confirmed}, scope: ${t.scope}`),t.confirmed&&t.scope===`loop`&&(nn.add(a),r.debug(`[Background] session ${a} set as current taskallow`)),i(t.confirmed))};chrome.runtime.onMessage.addListener(o);let u=setTimeout(()=>{chrome.runtime.onMessage.removeListener(o),r.debug(`[Background] confirmtimeout,defaultdeny: ${e}`),i(!1)},c),d={type:`SHOW_CONFIRM_DIALOG`,data:{toolName:e,toolLabel:s,args:n,toolCallId:e,sessionId:a,timeout:c,message:l?t(`dialog.confirmAction`,{name:s})+l:void 0}},f=!1,p=a?Me(a):null;if(p)try{p.postMessage(d),f=!0}catch(e){r.debug(`[Background] confirm port postMessage failed, fallback to broadcast:`,e?.message)}f||chrome.runtime.sendMessage(d).catch(e=>{r.debug(`[Background] sendconfirm dialogmessage failed:`,e.message),chrome.runtime.onMessage.removeListener(o),clearTimeout(u),i(!0)})})}function on(e,t){let n=Error(e);return n.executionLog=t,n}var sn=1e3;function cn(e,t,n=sn){if(!e||e.length<=n)return 0;let i=e.length-n,a=0;for(let n=0;n<e.length&&a<i;n++)e[n].status!==`processing`&&(t&&t.delete(e[n].id),e.splice(n,1),a++,n--);return a>0&&r.debug(`[Background] executionLog memory trimmed: removed ${a} terminal old entries, remaining ${e.length}`),a}async function ln(e,t){if(e)try{if(await T({sessionId:e,...t})){r.debug(`[Background] checkpoint saved (sessionId=${e}, iteration=${t.iteration}, reason=${t.interruptedReason})`);try{let t=await F(e);t?r.debug(`[Background] checkpoint write verifypassed,message=${t.currentMessages?.length||0}`):r.error(`[Background] ⚠️ checkpoint write returned successfulbut read-back empty!sessionId=${e}, possibly is DB store does not exist or transaction not committed`)}catch(e){r.error(`[Background] checkpoint read-backverify failed:`,e.message)}}else r.error(`[Background] checkpoint save returned false (sessionId=${e}, iteration=${t.iteration}), possibly is reactCheckpoints store not found,DB upgrade blocked`)}catch(e){r.error(`[Background] save checkpoint failed:`,e.message,e.stack)}}async function un(e){if(e)try{await N(e),r.debug(`[Background] checkpoint cleaned (sessionId=${e})`)}catch(e){r.warn(`[Background] cleanup checkpoint failed:`,e.message)}}function dn(e){if(!e||e.length===0)return e;let t=[],n=0;for(;n<e.length;){let i=e[n];if(i.role===`tool`){let t=n>0?e[n-1]:null;if(!t||t.role!==`assistant`||!t.tool_calls){r.warn(`[Background] cleanupIncompleteMessagePairs: skip orphaned tool message (index=`+n+`)`),n++;continue}}if(i.role===`assistant`&&i.tool_calls&&i.tool_calls.length>0){let a=n+1<e.length?e[n+1]:null;if(!a||a.role!==`tool`){r.warn(`[Background] cleanupIncompleteMessagePairs: orphaned assistant(tool_calls),clear tool_calls (index=`+n+`)`),t.push({...i,tool_calls:void 0}),n++;continue}}t.push(i),n++}return t.length!==e.length&&r.debug(`[Background] cleanupIncompleteMessagePairs: cleanup complete,message:`,e.length,`→`,t.length),t}async function fn(e,t=``,n=null){if(!e)return null;let i=await F(e);if(!i){r.warn(`[Background] not found sessionId=${e} checkpoint, no way to restore`);try{let e=await b();e.length===0?r.warn(`[Background] IndexedDB contains no checkpoint record (may never have been saved successful)`):(r.warn(`[Background] current IndexedDB checkpoint column table:`,e.map(e=>({sessionId:e.sessionId,iteration:e.iteration,updatedAt:new Date(e.updatedAt).toISOString(),reason:e.interruptedReason}))),`${e.length}${e.map(e=>e.sessionId).join(`, `)}`)}catch(e){r.error(`[Background] read checkpoint column table failed:`,e),`${e.message}`}return null}r.debug(`[Background] from checkpoint restore ReAct loop: sessionId=${e}, iteration=${i.iteration}, messages=${i.currentMessages?.length}, userGuidance=${t?` has `:` no `}, resumeCallId=${n}`);let a=JSON.parse(JSON.stringify(i.currentMessages||[]));if(a=dn(a),t&&t.trim()){let e={role:`user`,content:`[Task Resume Notice] The task was previously interrupted during execution and is now resuming from the checkpoint.\n\nAdditional user instructions: ${t.trim()}\n\nPlease continue completing the task based on the previous tool call results, taking the above instructions into account. Do not repeat already completed steps.`};a.push(e),r.debug(`[Background] injected user additionaldescription,messagetotal:`,a.length)}else a.push({role:`user`,content:`[Task Resume Notice] The task was previously interrupted during execution and is now resuming from the checkpoint. Please continue completing the task based on the previous tool call results. Do not repeat already completed steps.`}),r.debug(`[Background] injected defaultrestoreprompt,messagetotal:`,a.length);let o=await pn(a,i.model,await Mi(null,null,null,ui(e)),i.tabId,i.apiParams||{},e,null,null,i.globalIteration||{value:i.iteration||0},i.executionLog||[],n||i.callId||null);return await un(e),o}async function pn(e,n,i,o,c={},u=null,d=null,f=null,p={value:0},m=[],h=null){u&&tn.add(u);let _=0,v=0,y=[...e],b=new Map,x=null,S=0,C=null,w=null,T=e=>{if(w===null){let t=ie(typeof y[0]?.content==`string`?y[0].content:JSON.stringify(y[0]?.content||``)),n=ie(JSON.stringify(i.map(e=>{let{id:t,...n}=e;return n}))),a=le(e,0,pe.customModelMap);w=a-t-n-4096-2e3,w<1e3&&(r.warn(`[Background] ReAct Token budget too low: ${w},using minimumbudget 1000`),w=1e3),r.debug(`[Background] ReAct Token budget: ${w} tokens (model: ${e}, actualsystem promptword: ${t}, actual tooldefinition: ${n}, context window: ${a})`)}return w},E=6e3,D=5e4,ee=async()=>{let e=T(n||`default`),t=M(g(y));if(t<=e)return;let i=y.length,a=t,o=y[0]?.role===`system`?[y[0]]:[],s=o.length?[...y.slice(1)]:[...y],c=e=>{let t=e.map(e=>({...e,content:me(e.content)}));return M(g(t))};for(let i=0;i<3&&(t=c([...o,...s]),!(t<=e));i++){let e=-1,t=-1;for(let n=0;n<s.length;n++)if(s[n].role===`assistant`&&Array.isArray(s[n].tool_calls)&&s[n].tool_calls.length>0){for(e=n,t=n+1;t<s.length&&s[t].role===`tool`;)t++;break}if(e===-1)break;let l=s.slice(e,t);r.debug(`[Background] attemptsummarystep ${i+1} round (message ${e}-${t-1})`);let u=await Kt(l,P,n,{signal:fe,timeout:15e3});if(!u){r.debug(`[Background] summary failed,downgraded to weight-based trimming`);break}let d=(C?.match(/Round \d+:/g)?.length||0)+1;C=(C||``)+`Round ${d}: ${u}\n`;let f=s.findIndex(e=>e.role===`user`),p={role:`user`,content:`[History Summary] The following is a summary of previous steps:\n${C.trim()}`,_isSummary:!0},m=s.findIndex(e=>e._isSummary);if(m>=0){s.splice(m,1);let e=s.findIndex(e=>e.role===`user`);s.splice(e+1,0,p)}else s.splice(f+1,0,p);let h=s.findIndex(e=>e===l[0]);h>=0&&s.splice(h,l.length);let g=c([...o,...s]);r.debug(`[Background] summary complete: ${a} → ${g} tokens (${l.length} → 1summary)`)}if(t=c([...o,...s]),t>e){r.debug(`[Background] still exceeding after summary (${t} > ${e}),enablefallbacktrimming`);let n=e=>e._reflection?3:e.role===`tool`?2:1;for(;s.length>0&&!(c([...o,...s])<=e);){let e=-1,t=0;for(let r=0;r<s.length;r++){let i=n(s[r]);if(i>t&&(t=i,e=r),t>=3)break}(e<0||t===0)&&(e=0);let r=s.splice(e,1)[0];if(r?.role===`assistant`&&r.tool_calls)for(;s.length>0&&s[e]?.role===`tool`;)s.splice(e,1);else if(r?.role===`tool`)for(let t=e-1;t>=0&&s[t]?.role===`assistant`&&s[t]?.tool_calls;t--){let e=s[t+1];(!e||e.role!==`tool`)&&delete s[t].tool_calls}}}y=[...o,...s];let l=c(y);r.debug(`[Background] ReAct Token trimming: ${a} → ${l} tokens (${i} → ${y.length} )`)},O=[...m],k=null,ne=0,j=1500;async function N(e=``,t=!1){if(d){r.debug(`[Background] saveCheckpointNow skip (subtask): reason=${e}`);return}if(!u){r.warn(`[Background] saveCheckpointNow skip (sessionId empty)`);return}let i=Date.now();if(!t&&i-ne<j){r.debug(`[Background] saveCheckpointNow throttlestreamskip: reason=${e}, since last save ${i-ne}ms < ${j}ms`);return}ne=i,cn(O,ke),r.debug(`[Background] saveCheckpointNow start saving: sessionId=${u}, reason=${e}, force=${t}, iteration=${_}, messages=${y.length}, callId=${h}`),await ln(u,{currentMessages:y.map(e=>{let t={...e};return typeof t.content==`function`&&(t.content=String(t.content)),t}),executionLog:[...O],iteration:_,globalIteration:{value:p?.value||_},subtaskPlan:k,currentSubtaskIndex:null,totalReflectionRounds:v,model:n||P?.modelName,apiParams:c,taskContext:null,tabId:o,callId:h,interruptedReason:e||`in_progress`})}we(u||o),De(o);let de=u?Te(u,!d):null,fe=de?.signal,P=await R(),pe=await Re();c&&c.imageApiBase&&(P.apiBase=c.imageApiBase),c&&c.imageApiKey&&(P.apiKey=c.imageApiKey);let F=P.reactConfig,he=F.maxIterations,ge=F.apiTimeout,_e=F.loopTimeout,ve=F.toolTimeout,ye=F.clarifyTimeout,be=d&&(d.subtaskId||d.type===`subagent`),Ce=be?{...P.streamConfig,streamEnabled:!1}:P.streamConfig;r.debug(`[Background] reactLoop configuration:`,F),r.debug(`[Background] reactLoop received tool column table:`,i.map(e=>e.function.name),`count:`,i.length),r.debug(`[Background] reactLoop tasktext:`,d?`subtask ${d.subtaskId||` no `} (${d.subtaskName||`maintask`})`:` no `);let Ee=0,Oe=``,ke=new Map;function L(e,t){try{cn(O,ke);let n=Date.now();if(typeof f==`function`&&f([...O]),e===Oe&&n-Ee<200)return;Ee=n,Oe=e;let i=[];for(let e of O){let t=ke.get(e.id);(!t||t.status!==e.status||t.nodeName!==e.nodeName)&&(i.push(e),ke.set(e.id,{status:e.status,nodeName:e.nodeName}))}let a={type:`EXECUTION_STATUS_UPDATE`,nodeName:e,status:t,callId:h,executionLog:i};u&&(a.sessionId=u),chrome.runtime.sendMessage(a).catch(e=>{r.debug(`[Background] sendexecution statusupdate failed:`,e.message)})}catch(e){r.debug(`[Background] sendexecution statusupdate exception:`,e.message)}}let Ae=Date.now(),je=0,Me=null,Ne=!1;L(t(`reactLoop.preparing`),`processing`),await N(`initial`,!0);function Pe(){Ne||(Me=Date.now(),Ne=!0,r.debug(`[Background] overall looptimeoutpaused`))}function Fe(){let e=Date.now()-Ae;return _e+je-e}function Ie(){if(Ne&&Me!==null){let e=Date.now()-Me;je+=e,Me=null,Ne=!1,r.debug(`[Background] overall looptimeoutrestored,pause duration:`,Math.round(e/1e3),`s,remaining time:`,Math.round(Fe()/1e3),`s`)}}we(u||o);try{for(;_<he;){if(I(o)||u&&I(u))throw on(t(`bg.reactCancelled`),O);let e=Date.now()-Ae,f=_e+je;if(e>f)throw on(t(`reactLoop.loopTimeout`,{timeout:_e}),O);_++,xe(u);let m=f-e;r.debug(`[Background] ReAct loopstep ${_} times,remaining time: ${Math.round(m/1e3)}s (paused: ${Math.round(je/1e3)}s)`);let C,ne=Date.now(),j=ce(y);for(let e=0;e<j.length-1;e++)j[e]={...j[e],content:me(j[e].content)};let he=crypto.randomUUID(),we=Se(u),Te=i.some(e=>e.function?.name===`plan_task`),Ee=i;Te&&r.debug(`[Background] current iterationcontains plan_task,using Agent limittool into task decomposition,tool count :`,Ee.length);let De=g(j),Oe=M(De),Me=le(n||P.modelName,0,pe.customModelMap),Ne=ie(JSON.stringify(Ee.map(e=>{let{id:t,...n}=e;return n}))),Fe=M(Ne),Le=Oe+Fe+4096,Re=De+Ne,z=A(Le,Me);if(z.level!==`safe`&&(r.warn(`[Background] context pressure: ${z.level} (${Math.round(z.ratio*100)}% used, message: ${Oe}, tool: ${Fe}, estimated total: ${Le}/${Me} tokens)`),z.level===`critical`||Le>Me*.85)){let e=T(n||`default`),t=Math.floor(e*.75);r.warn(`[Background] context pressure too high,maindynamictrimmingmessage: current ${Oe} tokens → target budget ${t}`);let i=re(y,Math.max(t,2e3));if(i.trimmedCount>0){y=i.messages,j=ce(y);for(let e=0;e<j.length-1;e++)j[e]={...j[e],content:me(j[e].content)};r.warn(`[Background] maindynamictrimmingcomplete: ${i.trimmedCount} messageremove,remaining ${y.length} , ${g(j)} tokens`)}}O.push({id:he,iteration:_,globalIteration:we,timestamp:new Date().toISOString(),status:`processing`,nodeType:`api_call`,nodeName:t(`reactLoop.apiCallNode`,{count:we,subtask:d?t(`reactLoop.apiCallSubtask`,{iteration:_}):``}),apiRequest:{messageCount:j.length,toolCount:Ee.length}}),L(t(`reactLoop.apiCallNode`,{count:we,subtask:d?t(`reactLoop.apiCallSubtask`,{iteration:_}):``}),`processing`);let ze;try{let e=`${P.apiBase}/chat/completions`;r.debug(`[Background] API requesttool count count :`,Ee.length);let i={model:n||P.modelName,messages:oe(j),tools:Ee.map(e=>{let{id:t,...n}=e;return n}),stream:Ce.streamEnabled!==!1};i.stream&&(i.stream_options={include_usage:!0}),r.debug(`[Background] API requestbody stream mode:`,i.stream,`tool count count :`,i.tools.length,`messagecount:`,i.messages.length,`model:`,i.model),c.temperature!==void 0&&(i.temperature=c.temperature),c.top_p!==void 0&&(i.top_p=c.top_p);let a=ge*(F.apiRetryCount+1)+3e4,o=Math.max(ge,Math.min(a,m));ze=setTimeout(()=>{r.warn(`[Background] ⚠️ API call outertimeoutprotection triggered (${Math.round(o/1e3)}s),force abort`),de?.abort()},o),Ce.streamEnabled!==!1&&(chrome.runtime.sendMessage({type:`STREAM_START`,sessionId:u,callId:h}).catch(()=>{}),r.debug(`[Background] STREAM_START sent (API call with before )`));let s=await aa(e,{method:`POST`,headers:{Authorization:`Bearer ${P.apiKey}`,"Content-Type":`application/json`},body:JSON.stringify(i),signal:fe},ge,F.apiRetryCount,F.apiRetryBaseDelay,(e,t,n)=>{r.warn(`[Background] API retry (${e}/${F.apiRetryCount}) scheduled in ${n}ms:`,t.message),chrome.runtime.sendMessage({type:`API_RETRYING`,sessionId:u,callId:h,attempt:e,maxRetries:F.apiRetryCount,delay:n}).catch(()=>{})});if(clearTimeout(ze),!s.ok){let e=await s.text();throw r.error(`[Background] API response error:`,s.status,e),Error(`HTTP error! status: ${s.status}, message: ${e.substring(0,500)}`)}if(Ce.streamEnabled!==!1&&s.body){r.debug(`[Background] enteringstreamingmode,streamEnabled:`,Ce.streamEnabled);let e=new At(u,Ce,{callId:h,preStarted:!0}),t=await jt(s.body.getReader(),e,fe);r.debug(`[Background] streaming API responsecomplete,content length:`,t.content.length,`tool_calls:`,t.toolCalls?.length,`usage:`,t.usage);let n=t.toolCalls?t.toolCalls.map(e=>({...e,id:e.id||`tc_fb_${crypto.randomUUID().slice(0,8)}`})):null;C={choices:[{message:{role:`assistant`,content:t.content||``,reasoning_content:t.reasoningContent,...n?{tool_calls:n}:{}},finish_reason:t.status===`tool_calls`?`tool_calls`:t.truncated?`length`:`stop`}],usage:t.usage}}else{let e=await s.text();r.debug(`[Background] API responsestate:`,s.status,`originaltext length:`,e.length,`preview:`,e.substring(0,200));try{C=JSON.parse(e)}catch(n){throw r.error(`[Background] JSON parse failed:`,n),r.error(`[Background] originalresponse:`,e),Error(t(`reactLoop.apiInvalidJson`,{status:s.status,error:n.message,preview:e.substring(0,100)}))}let n=C.choices?.[0]?.message?.tool_calls;if(n&&n.length>0){let e=n.map(e=>({...e,id:e.id||`tc_fb_${crypto.randomUUID().slice(0,8)}`}));C.choices[0].message.tool_calls=e}}}catch(e){clearTimeout(ze);let i=e.name===`AbortError`,a=e.name===`StreamIdleTimeout`;i?r.debug(`[Background] API call with by usercancel`):a?r.warn(`[Background] API stream idle timeout:`,e.message):r.error(`[Background] API call with failed:`,e.message||e);let o=i?t(`bg.requestCancelled`):a?t(`reactLoop.streamIdleTimeout`,{seconds:Math.round((e.idleMs||12e4)/1e3)}):e.message,s=O.findIndex(e=>e.id===he);throw s!==-1&&(O[s]={...O[s],duration:Date.now()-ne,status:i?`cancelled`:`failed`,apiRequest:{...O[s].apiRequest,model:n||P.modelName,temperature:c.temperature,top_p:c.top_p,messageCount:j.length,toolCount:Ee.length},error:i?t(`reactLoop.userCancelled`):o}),on(o,O)}let Be=Date.now()-ne,B=C.choices?.[0]?.message;C.choices?.[0]?.finish_reason===`length`&&r.warn(`[Background] API response reason token limit truncated (finish_reason: length),contentmay be incomplete`);let Ve=O.findIndex(e=>e.id===he);if(Ve!==-1&&(O[Ve]={...O[Ve],duration:Be,status:`success`,thought:B?.content||``,action:B?.tool_calls?.length>0?{name:B.tool_calls[0].function?.name||B.tool_calls[0].name,params:(()=>{try{return JSON.parse(B.tool_calls[0].function?.arguments||`{}`)}catch{return{}}})()}:null,apiRequest:{...O[Ve].apiRequest,model:n||P.modelName,temperature:c.temperature,top_p:c.top_p,messageCount:j.length,toolCount:Ee.length},apiResponse:{finishReason:C.choices?.[0]?.finish_reason,tokenUsage:C.usage}}),C.usage&&(Vt({sessionId:u,model:n||P.modelName,usage:C.usage,callType:`react_loop`}).catch(()=>{}),Re>0&&C.usage.prompt_tokens>0)){se(Re,C.usage.prompt_tokens);let e=te();e.active&&r.debug(`[Background] Tokencalibration activated: factor=${e.factor.toFixed(3)}, samples=${e.samples}`)}if(L(t(`reactLoop.apiCallNode`,{count:we,subtask:d?t(`reactLoop.apiCallSubtask`,{iteration:_}):``}),`success`),B?.tool_calls&&B.tool_calls.length>0){r.debug(`[Background] recei to tool call:`,B.tool_calls);let e=JSON.stringify(B.tool_calls.map(e=>({name:e.function?.name||e.name,args:typeof e.function?.arguments==`string`?(()=>{try{return JSON.parse(e.function.arguments)}catch{return e.function.arguments}})():e.function?.arguments||{}})));r.debug(`[Background] this roundtool callinput fingerprint:`,e.substring(0,200)),y.push(B),await ee();let d=[],f=F.reflection;async function m(e,o,u,m,g,_,v,y,x){if(I(o)||_&&I(_))throw on(t(`bg.reactCancelled`),y);let S=e.function?.name||e.name,C=Date.now(),T=e.function?.arguments;r.debug(`[Background] executeSingleToolCall recei to tool call:`,JSON.stringify({name:S,argsType:typeof T,argsRaw:typeof T==`string`?T.substring(0,200):JSON.stringify(T).substring(0,200),id:e.id}));let O=(()=>{if(!T)return{};if(typeof T==`object`)return T;try{return JSON.parse(T||`{}`)}catch{return{}}})(),A=e.id||`tc_fallback_${crypto.randomUUID()}`,te=a.has(S),ne=l[S]?.includes(O.action);if((te||ne)&&F.toolConfirmationEnabled){if(_&&nn.has(_))r.debug(`[Background] session ${_} got currenttaskallow,skip confirm: ${S}`);else{Pe(),chrome.runtime.sendMessage({type:`TOOL_CONFIRM_START`,..._?{sessionId:_}:{}}).catch(e=>{r.debug(`[Background] send TOOL_CONFIRM_START message failed:`,e.message)});let n;try{n=await an(S,O,o,_)}finally{Ie(),chrome.runtime.sendMessage({type:`TOOL_CONFIRM_END`,..._?{sessionId:_}:{}}).catch(e=>{r.debug(`[Background] send TOOL_CONFIRM_END message failed:`,e.message)})}if(!n){let n=crypto.randomUUID();return y.push({id:n,iteration:v,timestamp:new Date().toISOString(),status:`cancelled`,nodeType:`tool_exec`,nodeName:t(`reactLoop.toolExec`,{name:S}),action:{name:S,params:O},error:t(`reactLoop.userDenied`)}),L(t(`reactLoop.toolExec`,{name:S}),`cancelled`),x.push({role:`tool`,content:`The user declined this operation.`,tool_call_id:A}),await ee(),{toolCall:e,result:{success:!1,content:`The user declined this operation.`,error:`user_denied`},toolResultStr:`The user declined this operation.`,toolLogEntry:{id:n,iteration:v,timestamp:new Date().toISOString(),status:`cancelled`,nodeType:`tool_exec`,nodeName:t(`reactLoop.toolExec`,{name:S}),action:{name:S,params:O},error:t(`reactLoop.userDenied`)}}}}}let re=`${S}:${JSON.stringify(O)}`;if(b.has(re)){let e=b.get(re);if(Date.now()-e.timestamp<6e4){if(s.has(S))return{...e,fromCache:!0};b.clear()}else b.delete(re)}s.has(S)||b.clear(),await new Promise(e=>setTimeout(e,0));let j=crypto.randomUUID();y.push({id:j,iteration:v,timestamp:new Date().toISOString(),status:`processing`,nodeType:`tool_exec`,nodeName:t(`reactLoop.toolExecStart`,{name:S})}),L(t(`reactLoop.toolExecStart`,{name:S}),`processing`),S===`clarify_question`&&(Pe(),chrome.runtime.sendMessage({type:`CLARIFY_START`,..._?{sessionId:_}:{}}).catch(e=>{r.debug(`[Background] send CLARIFY_START message failed:`,e.message)}));let M;try{if(M=await vn(e,o,u,m,g,_),S===`clarify_question`){Ie(),chrome.runtime.sendMessage({type:`CLARIFY_END`,..._?{sessionId:_}:{}}).catch(e=>{r.debug(`[Background] send CLARIFY_END message failed:`,e.message)}),r.debug(`[Background] clarification complete,re-filteringtool...`);try{let e=ui(_),t=await Mi(null,null,null,e),a=await R(),o=a.reactConfig.enableToolPreselect,s=a.reactConfig.preselectMinToolCount||3;if(o&&t.length>s){let a=await Bt(x,n,t,c,1,si(e));a.type===`tools`&&(i=a.tools,w=null,r.debug(`[Background] clarification after toolre-filtercomplete:`,i.map(e=>e.function.name))),a.executionLog&&y.push(...a.executionLog)}else o||r.debug(`[Background] toolpre-filterclosed,after clarification, notre-filter`)}catch(e){r.warn(`[Background] clarification after toolre-filter failed, continue withcurrenttoolset:`,e.message)}}let a;a=typeof M==`string`?M:M&&typeof M==`object`&&`content`in M?M.content??JSON.stringify(M):JSON.stringify(M);let l=M&&M.success!==!1,T=ie(a),te=!1,ne=a;if(T>E){let e=ue(a,E);r.debug(`[Background] tool ${S} result truncated: ${T} → ${ie(e)} tokens`),te=!0,ne=e,a=e}be||chrome.runtime.sendMessage({type:`STREAM_TOOL_RESULT`,sessionId:_,result:{toolCallId:A,toolName:S,success:l,content:l?ne:M?.error||ne,truncated:te,duration:Date.now()-C}}).catch(()=>{});let N=y.filter(e=>e.nodeType===`tool_exec`&&e.iteration===v).sort((e,t)=>y.indexOf(e)-y.indexOf(t)),oe=0;for(let e=N.length-1;e>=0&&N[e].status===`failed`;e--)oe++;if(y.filter(e=>e.nodeType===`reflection`&&e.reflectionType===`tool`).length<(f?.toolReflection?.maxPerIteration||2)&&Yt(a,oe,f)&&d.push({toolName:S,toolResultStr:a,toolCallParams:O,toolCallId:A,priority:Jt(S,a,oe)}),S===`plan_task`&&M&&M.success&&M.data){k=M.data,r.debug(`[Background] received taskplanresult:`,JSON.stringify(k));let e=JSON.stringify({success:!0,message:`Task planning complete. Decomposed into ${k.subtasks.length} subtasks.`,data:k});x.push({role:`tool`,content:e,tool_call_id:A}),await ee();let a=y.findIndex(e=>e.id===j);a!==-1&&(y[a]={...y[a],duration:Date.now()-C,status:`success`,nodeName:t(`reactLoop.taskPlanDone`),action:{name:S,params:O},observation:t(`reactLoop.subtaskCount`,{count:k.subtasks.length}),subtaskCount:k.subtasks.length,strategy:k.strategy}),L(t(`reactLoop.taskPlanDone`),`success`);let l=B.tool_calls.findIndex(e=>e.id===A);if(l!==-1&&l<B.tool_calls.length-1){for(let e=l+1;e<B.tool_calls.length;e++){let n=B.tool_calls[e],i=n.function?.name||n.name||`unknown`,a=n.id||`tc_fallback_${crypto.randomUUID()}`;r.debug(`[Background] resend skiptool STREAM_TOOL_RESULT:`,i,`id:`,a),x.push({role:`tool`,content:JSON.stringify({success:!1,message:`Skipped: plan_task has decomposed subtasks; other tool calls in this round will not be executed.`}),tool_call_id:a}),be||chrome.runtime.sendMessage({type:`STREAM_TOOL_RESULT`,sessionId:_,result:{toolCallId:a,toolName:i,success:!1,content:t(`reactLoop.skippedAfterPlanTask`),truncated:!1,duration:0}}).catch(()=>{})}await ee()}let u=await hn(k,n,i,o,c,_,y,p,F.reflection,P,ke,h,fe);if(I(o)||_&&I(_))throw on(t(`bg.reactCancelled`),y);let d=3e3,f=u.map((e,t)=>{let n=typeof e.result==`string`?e.result:JSON.stringify(e.result),r=ie(n)>d?ae(n,d):n;return`Subtask ${t+1}: ${e.subtaskName}\nResult: ${r}`}).join(`
96
+ }`;try{let e=`${o.apiBase}/chat/completions`,i=s.model||a||o.modelName,c=await Ta(e,{method:`POST`,headers:{Authorization:`Bearer ${o.apiKey}`,"Content-Type":`application/json`},body:JSON.stringify({model:i,messages:[{role:`system`,content:`You are a strict quality evaluator. Output the evaluation result in JSON format; do not include markdown code block markers.`},{role:`user`,content:v}],stream:!1,temperature:s.temperature||.3,max_tokens:s.maxTokens||1024}),signal:f},3e4,1,1e3);if(!c.ok)throw Error(`Subtask reflection API error: ${c.status}`);let u=await c.json(),h=u.choices?.[0]?.message?.content||``,g=vn(h),_=Date.now()-p;return m.push({id:crypto.randomUUID(),iteration:0,timestamp:new Date().toISOString(),status:`success`,nodeType:`reflection`,nodeName:t(`reflection.subtaskNodeName`,{name:l}),reflectionType:`subtask`,overallScore:g.overallScore,dimensions:g.dimensions,issues:g.issues,suggestions:g.suggestions,prompt:v,rawContent:h,apiRequest:{model:i,messageCount:2,temperature:s.temperature||.3,maxTokens:s.maxTokens||1024},apiResponse:{tokenUsage:u.usage||null},duration:_}),r.debug(`[Background] subtask reflectioncomplete: ${l}, score: ${g.overallScore}/10, elapsed: ${_}ms`),u.usage&&qt({sessionId:d,model:i,usage:u.usage,callType:`subtask_reflection`}).catch(()=>{}),{score:g.overallScore,refinedContent:g.refinedAnswer&&g.refinedAnswer!==n?g.refinedAnswer:null,reflectionLog:m}}catch(e){if(e.name===`AbortError`)throw e;r.warn(`[Background] subtask reflection failed:`,e.message);let n=Date.now()-p;return m.push({id:crypto.randomUUID(),iteration:0,timestamp:new Date().toISOString(),status:`failed`,nodeType:`reflection`,nodeName:t(`reflection.subtaskNodeName`,{name:l}),reflectionType:`subtask`,error:e.message,duration:n}),{score:null,refinedContent:null,reflectionLog:m}}}e(`zh`,{reactLoop:{apiCallNode:`API调用 (第{count}次{subtask})`,apiCallSubtask:`, 子任务第{iteration}次`,preparing:`准备开始执行...`,toolExec:`工具执行:{name}`,toolExecStart:`执行工具: {name}`,taskPlanDone:`任务规划完成`,executionDone:`执行完成`,userDenied:`用户拒绝了此操作`,subtaskRolledBack:`子任务 {name} (已回滚)`,subtaskRollbackFailed:`子任务 {name} (回滚失败)`,subtaskCount:`已拆解为 {count} 个子任务`,toolReflection:`工具反思: {name}`,subtaskNode:`子任务 {index}: {name}`,subtaskCompleted:`子任务 {index}: {name} (完成)`,subtaskFailed:`子任务 {index}: {name} (失败)`,userCancelled:`用户取消`,skippedAfterPlanTask:`已跳过(plan_task 已拆分子任务,本轮其他工具调用不再执行)`,toolError:`错误: {message}`,loopTimeout:`ReAct 循环总超时 ({timeout}ms,不含澄清等待时间)`,apiInvalidJson:`API 响应不是有效的 JSON (HTTP {status}): {error}。响应前100字符: {preview}`,infiniteLoopDetected:`连续{count}次执行完全相同的工具调用(入参和返参均相同),疑似陷入死循环,已自动终止。请更换策略或缩小任务范围后重试。`,maxIterationsExceeded:`ReAct 循环超过最大迭代次数 ({maxIterations})`,toolTimeout:`工具执行超时 ({timeout}ms): {tool}`,toolAborted:`工具执行已被用户终止: {tool}`,jsonParseFailed:`JSON 解析失败 (HTTP {status}): {error}。响应前100字符: {preview}`,streamIdleTimeout:`流式响应空闲超时({seconds} 秒未收到任何数据),已自动中断。可能是网络或服务提供商暂时不稳定,请重试。`}}),e(`en`,{reactLoop:{apiCallNode:`API Call (#{count}{subtask})`,apiCallSubtask:`, Subtask #{iteration}`,preparing:`Preparing to execute...`,toolExec:`Tool Exec:{name}`,toolExecStart:`Executing: {name}`,taskPlanDone:`Task planning completed`,executionDone:`Execution completed`,userDenied:`User denied this operation`,subtaskRolledBack:`Subtask {name} (rolled back)`,subtaskRollbackFailed:`Subtask {name} (rollback failed)`,subtaskCount:`Broken down into {count} subtasks`,toolReflection:`Tool Reflection: {name}`,subtaskNode:`Subtask {index}: {name}`,subtaskCompleted:`Subtask {index}: {name} (completed)`,subtaskFailed:`Subtask {index}: {name} (failed)`,skippedAfterPlanTask:`Skipped (plan_task has decomposed subtasks, other tool calls in this round are no longer executed)`,toolError:`Error: {message}`,loopTimeout:`ReAct loop total timeout ({timeout}ms, excluding clarification wait time)`,apiInvalidJson:`API response is not valid JSON (HTTP {status}): {error}. First 100 chars: {preview}`,infiniteLoopDetected:`Executed the exact same tool call {count} times in a row (both inputs and outputs identical), likely stuck in an infinite loop. Automatically terminated. Please change strategy or narrow the task scope and retry.`,maxIterationsExceeded:`ReAct loop exceeded maximum iterations ({maxIterations})`,toolTimeout:`Tool execution timed out ({timeout}ms): {tool}`,toolAborted:`Tool execution was aborted by user: {tool}`,jsonParseFailed:`JSON parse failed (HTTP {status}): {error}. First 100 chars: {preview}`,streamIdleTimeout:`Stream idle timeout (no data received for {seconds}s), automatically interrupted. This may be caused by an unstable network or provider, please retry.`}});var Sn=new Set,Cn=new Set,wn={manage_cookies:`sensitiveTool.manage_cookies`,clear_data:`sensitiveTool.clear_data`,download_file:`sensitiveTool.download_file`,manage_tab:`sensitiveTool.manage_tab`,agent_file:`sensitiveTool.agent_file`,debug_page:`sensitiveTool.debug_page`};async function Tn(e,n,i,a){let o=wn[e],s=o?t(o):e,c=3e5;r.debug(`[Background] requesting user confirmation for tool operation: ${e}`,n);let l=``;if(e===`manage_tab`&&n.action===`close`&&n.tabId!==void 0)try{let e=await chrome.tabs.get(parseInt(n.tabId,10));l=t(`sensitiveTool.tabInfo`,{title:e.title||t(`sensitiveTool.untitled`),url:e.url||t(`sensitiveTool.unknownUrl`)})}catch(e){l=t(`sensitiveTool.tabInfoError`,{error:e.message})}return e===`debug_page`&&n.action===`attach`&&(l=t(`sensitiveTool.debuggerAttachHint`)),new Promise(i=>{let o=t=>{t.type===`TOOL_CONFIRMATION_RESPONSE`&&t.toolCallId===e&&(chrome.runtime.onMessage.removeListener(o),clearTimeout(u),cn(a),r.debug(`[Background] userconfirmresult: ${e} = ${t.confirmed}, scope: ${t.scope}`),t.confirmed&&t.scope===`loop`&&(Cn.add(a),r.debug(`[Background] session ${a} set as current taskallow`)),i(t.confirmed))};chrome.runtime.onMessage.addListener(o);let u=setTimeout(()=>{chrome.runtime.onMessage.removeListener(o),cn(a),r.debug(`[Background] confirmtimeout,defaultdeny: ${e}`),i(!1)},c),d={type:`SHOW_CONFIRM_DIALOG`,data:{toolName:e,toolLabel:s,args:n,toolCallId:e,sessionId:a,timeout:c,message:l?t(`dialog.confirmAction`,{name:s})+l:void 0}},f=!1,p=a?Ne(a):null;if(p)try{p.postMessage(d),f=!0}catch(e){r.debug(`[Background] confirm port postMessage failed, fallback to broadcast:`,e?.message)}f?sn({kind:`confirm`,sessionId:a,detail:s}).catch(()=>{}):chrome.runtime.sendMessage(d).then(()=>{sn({kind:`confirm`,sessionId:a,detail:s}).catch(()=>{})}).catch(e=>{r.debug(`[Background] sendconfirm dialogmessage failed:`,e.message),chrome.runtime.onMessage.removeListener(o),clearTimeout(u),i(!0)})})}function En(e,t){let n=Error(e);return n.executionLog=t,n}var Dn=1e3;function On(e,t,n=Dn){if(!e||e.length<=n)return 0;let i=e.length-n,a=0;for(let n=0;n<e.length&&a<i;n++)e[n].status!==`processing`&&(t&&t.delete(e[n].id),e.splice(n,1),a++,n--);return a>0&&r.debug(`[Background] executionLog memory trimmed: removed ${a} terminal old entries, remaining ${e.length}`),a}async function kn(e,t){if(e)try{if(await D({sessionId:e,...t})){r.debug(`[Background] checkpoint saved (sessionId=${e}, iteration=${t.iteration}, reason=${t.interruptedReason})`);try{let t=await ge(e);t?r.debug(`[Background] checkpoint write verifypassed,message=${t.currentMessages?.length||0}`):r.error(`[Background] ⚠️ checkpoint write returned successfulbut read-back empty!sessionId=${e}, possibly is DB store does not exist or transaction not committed`)}catch(e){r.error(`[Background] checkpoint read-backverify failed:`,e.message)}}else r.error(`[Background] checkpoint save returned false (sessionId=${e}, iteration=${t.iteration}), possibly is reactCheckpoints store not found,DB upgrade blocked`)}catch(e){r.error(`[Background] save checkpoint failed:`,e.message,e.stack)}}async function An(e){if(e)try{await se(e),r.debug(`[Background] checkpoint cleaned (sessionId=${e})`)}catch(e){r.warn(`[Background] cleanup checkpoint failed:`,e.message)}}function jn(e){if(!e||e.length===0)return e;let t=[],n=0;for(;n<e.length;){let i=e[n];if(i.role===`tool`){let t=n>0?e[n-1]:null;if(!t||t.role!==`assistant`||!t.tool_calls){r.warn(`[Background] cleanupIncompleteMessagePairs: skip orphaned tool message (index=`+n+`)`),n++;continue}}if(i.role===`assistant`&&i.tool_calls&&i.tool_calls.length>0){let a=n+1<e.length?e[n+1]:null;if(!a||a.role!==`tool`){r.warn(`[Background] cleanupIncompleteMessagePairs: orphaned assistant(tool_calls),clear tool_calls (index=`+n+`)`),t.push({...i,tool_calls:void 0}),n++;continue}}t.push(i),n++}return t.length!==e.length&&r.debug(`[Background] cleanupIncompleteMessagePairs: cleanup complete,message:`,e.length,`→`,t.length),t}async function Mn(e,t=``,n=null){if(!e)return null;let i=await ge(e);if(!i){r.warn(`[Background] not found sessionId=${e} checkpoint, no way to restore`);try{let e=await S();e.length===0?r.warn(`[Background] IndexedDB contains no checkpoint record (may never have been saved successful)`):(r.warn(`[Background] current IndexedDB checkpoint column table:`,e.map(e=>({sessionId:e.sessionId,iteration:e.iteration,updatedAt:new Date(e.updatedAt).toISOString(),reason:e.interruptedReason}))),`${e.length}${e.map(e=>e.sessionId).join(`, `)}`)}catch(e){r.error(`[Background] read checkpoint column table failed:`,e),`${e.message}`}return null}r.debug(`[Background] from checkpoint restore ReAct loop: sessionId=${e}, iteration=${i.iteration}, messages=${i.currentMessages?.length}, userGuidance=${t?` has `:` no `}, resumeCallId=${n}`);let a=JSON.parse(JSON.stringify(i.currentMessages||[]));if(a=jn(a),t&&t.trim()){let e={role:`user`,content:`[Task Resume Notice] The task was previously interrupted during execution and is now resuming from the checkpoint.\n\nAdditional user instructions: ${t.trim()}\n\nPlease continue completing the task based on the previous tool call results, taking the above instructions into account. Do not repeat already completed steps.`};a.push(e),r.debug(`[Background] injected user additionaldescription,messagetotal:`,a.length)}else a.push({role:`user`,content:`[Task Resume Notice] The task was previously interrupted during execution and is now resuming from the checkpoint. Please continue completing the task based on the previous tool call results. Do not repeat already completed steps.`}),r.debug(`[Background] injected defaultrestoreprompt,messagetotal:`,a.length);let o=await Nn(a,i.model,await Qi(null,null,null,Ai(e)),i.tabId,i.apiParams||{},e,null,null,i.globalIteration||{value:i.iteration||0},i.executionLog||[],n||i.callId||null);return await An(e),o}async function Nn(e,n,i,a,s={},c=null,l=null,u=null,d={value:0},f=[],p=null){c&&Sn.add(c);let h=0,g=0,y=[...e],b=new Map,x=null,S=0,C=null,w=null,T=e=>{if(w===null){let t=re(typeof y[0]?.content==`string`?y[0].content:JSON.stringify(y[0]?.content||``)),n=re(JSON.stringify(i.map(e=>{let{id:t,...n}=e;return n}))),a=de(e,0,pe.customModelMap);w=a-t-n-4096-2e3,w<1e3&&(r.warn(`[Background] ReAct Token budget too low: ${w},using minimumbudget 1000`),w=1e3),r.debug(`[Background] ReAct Token budget: ${w} tokens (model: ${e}, actualsystem promptword: ${t}, actual tooldefinition: ${n}, context window: ${a})`)}return w},E=6e3,D=5e4,ee=async()=>{let e=T(n||`default`),t=oe(v(y));if(t<=e)return;let i=y.length,a=t,o=y[0]?.role===`system`?[y[0]]:[],s=o.length?[...y.slice(1)]:[...y],c=e=>{let t=e.map(e=>({...e,content:he(e.content)}));return oe(v(t))};for(let i=0;i<3&&(t=c([...o,...s]),!(t<=e));i++){let e=-1,t=-1;for(let n=0;n<s.length;n++)if(s[n].role===`assistant`&&Array.isArray(s[n].tool_calls)&&s[n].tool_calls.length>0){for(e=n,t=n+1;t<s.length&&s[t].role===`tool`;)t++;break}if(e===-1)break;let l=s.slice(e,t);r.debug(`[Background] attemptsummarystep ${i+1} round (message ${e}-${t-1})`);let u=await pn(l,P,n,{signal:se,timeout:15e3});if(!u){r.debug(`[Background] summary failed,downgraded to weight-based trimming`);break}let d=(C?.match(/Round \d+:/g)?.length||0)+1;C=(C||``)+`Round ${d}: ${u}\n`;let f=s.findIndex(e=>e.role===`user`),p={role:`user`,content:`[History Summary] The following is a summary of previous steps:\n${C.trim()}`,_isSummary:!0},m=s.findIndex(e=>e._isSummary);if(m>=0){s.splice(m,1);let e=s.findIndex(e=>e.role===`user`);s.splice(e+1,0,p)}else s.splice(f+1,0,p);let h=s.findIndex(e=>e===l[0]);h>=0&&s.splice(h,l.length);let g=c([...o,...s]);r.debug(`[Background] summary complete: ${a} → ${g} tokens (${l.length} → 1summary)`)}if(t=c([...o,...s]),t>e){r.debug(`[Background] still exceeding after summary (${t} > ${e}),enablefallbacktrimming`);let n=e=>e._reflection?3:e.role===`tool`?2:1;for(;s.length>0&&!(c([...o,...s])<=e);){let e=-1,t=0;for(let r=0;r<s.length;r++){let i=n(s[r]);if(i>t&&(t=i,e=r),t>=3)break}(e<0||t===0)&&(e=0);let r=s.splice(e,1)[0];if(r?.role===`assistant`&&r.tool_calls)for(;s.length>0&&s[e]?.role===`tool`;)s.splice(e,1);else if(r?.role===`tool`)for(let t=e-1;t>=0&&s[t]?.role===`assistant`&&s[t]?.tool_calls;t--){let e=s[t+1];(!e||e.role!==`tool`)&&delete s[t].tool_calls}}}y=[...o,...s];let l=c(y);r.debug(`[Background] ReAct Token trimming: ${a} → ${l} tokens (${i} → ${y.length} )`)},O=[...f],k=null,A=0,j=1500;async function M(e=``,t=!1){if(l){r.debug(`[Background] saveCheckpointNow skip (subtask): reason=${e}`);return}if(!c){r.warn(`[Background] saveCheckpointNow skip (sessionId empty)`);return}let i=Date.now();if(!t&&i-A<j){r.debug(`[Background] saveCheckpointNow throttlestreamskip: reason=${e}, since last save ${i-A}ms < ${j}ms`);return}A=i,On(O,Oe),r.debug(`[Background] saveCheckpointNow start saving: sessionId=${c}, reason=${e}, force=${t}, iteration=${h}, messages=${y.length}, callId=${p}`),await kn(c,{currentMessages:y.map(e=>{let t={...e};return typeof t.content==`function`&&(t.content=String(t.content)),t}),executionLog:[...O],iteration:h,globalIteration:{value:d?.value||h},subtaskPlan:k,currentSubtaskIndex:null,totalReflectionRounds:g,model:n||P?.modelName,apiParams:s,taskContext:null,tabId:a,callId:p,interruptedReason:e||`in_progress`})}Ee(c||a),ke(a);let ae=c?De(c,!l):null,se=ae?.signal,P=await B(),pe=await Ve();s&&s.imageApiBase&&(P.apiBase=s.imageApiBase),s&&s.imageApiKey&&(P.apiKey=s.imageApiKey);let F=P.reactConfig,me=F.maxIterations,ge=F.apiTimeout,_e=F.loopTimeout,ve=F.toolTimeout,ye=F.clarifyTimeout,be=l&&(l.subtaskId||l.type===`subagent`),xe=be?{...P.streamConfig,streamEnabled:!1}:P.streamConfig;r.debug(`[Background] reactLoop configuration:`,F),r.debug(`[Background] reactLoop received tool column table:`,i.map(e=>e.function.name),`count:`,i.length),r.debug(`[Background] reactLoop tasktext:`,l?`subtask ${l.subtaskId||` no `} (${l.subtaskName||`maintask`})`:` no `);let Se=0,Te=``,Oe=new Map;function L(e,t){try{On(O,Oe);let n=Date.now();if(typeof u==`function`&&u([...O]),e===Te&&n-Se<200)return;Se=n,Te=e;let i=[];for(let e of O){let t=Oe.get(e.id);(!t||t.status!==e.status||t.nodeName!==e.nodeName)&&(i.push(e),Oe.set(e.id,{status:e.status,nodeName:e.nodeName}))}let a={type:`EXECUTION_STATUS_UPDATE`,nodeName:e,status:t,callId:p,executionLog:i};c&&(a.sessionId=c),chrome.runtime.sendMessage(a).catch(e=>{r.debug(`[Background] sendexecution statusupdate failed:`,e.message)})}catch(e){r.debug(`[Background] sendexecution statusupdate exception:`,e.message)}}let Ae=Date.now(),je=0,R=null,Me=!1;L(t(`reactLoop.preparing`),`processing`),await M(`initial`,!0);function Ne(){Me||(R=Date.now(),Me=!0,r.debug(`[Background] overall looptimeoutpaused`))}function Pe(){let e=Date.now()-Ae;return _e+je-e}function Fe(){if(Me&&R!==null){let e=Date.now()-R;je+=e,R=null,Me=!1,r.debug(`[Background] overall looptimeoutrestored,pause duration:`,Math.round(e/1e3),`s,remaining time:`,Math.round(Pe()/1e3),`s`)}}Ee(c||a);try{for(;h<me;){if(I(a)||c&&I(c))throw En(t(`bg.reactCancelled`),O);let e=Date.now()-Ae,u=_e+je;if(e>u)throw En(t(`reactLoop.loopTimeout`,{timeout:_e}),O);h++,Ce(c);let f=u-e;r.debug(`[Background] ReAct loopstep ${h} times,remaining time: ${Math.round(f/1e3)}s (paused: ${Math.round(je/1e3)}s)`);let C,A=Date.now(),j=ue(y);for(let e=0;e<j.length-1;e++)j[e]={...j[e],content:he(j[e].content)};let me=crypto.randomUUID(),Se=we(c),Te=i.some(e=>e.function?.name===`plan_task`),Ee=i;Te&&r.debug(`[Background] current iterationcontains plan_task,using Agent limittool into task decomposition,tool count :`,Ee.length);let De=v(j),ke=oe(De),R=de(n||P.modelName,0,pe.customModelMap),Me=re(JSON.stringify(Ee.map(e=>{let{id:t,...n}=e;return n}))),Pe=oe(Me),Ie=ke+Pe+4096,Le=De+Me,Re=te(Ie,R);if(Re.level!==`safe`&&(r.warn(`[Background] context pressure: ${Re.level} (${Math.round(Re.ratio*100)}% used, message: ${ke}, tool: ${Pe}, estimated total: ${Ie}/${R} tokens)`),Re.level===`critical`||Ie>R*.85)){let e=T(n||`default`),t=Math.floor(e*.75);r.warn(`[Background] context pressure too high,maindynamictrimmingmessage: current ${ke} tokens → target budget ${t}`);let i=N(y,Math.max(t,2e3));if(i.trimmedCount>0){y=i.messages,j=ue(y);for(let e=0;e<j.length-1;e++)j[e]={...j[e],content:he(j[e].content)};r.warn(`[Background] maindynamictrimmingcomplete: ${i.trimmedCount} messageremove,remaining ${y.length} , ${v(j)} tokens`)}}O.push({id:me,iteration:h,globalIteration:Se,timestamp:new Date().toISOString(),status:`processing`,nodeType:`api_call`,nodeName:t(`reactLoop.apiCallNode`,{count:Se,subtask:l?t(`reactLoop.apiCallSubtask`,{iteration:h}):``}),apiRequest:{messageCount:j.length,toolCount:Ee.length}}),L(t(`reactLoop.apiCallNode`,{count:Se,subtask:l?t(`reactLoop.apiCallSubtask`,{iteration:h}):``}),`processing`);let ze;try{let e=`${P.apiBase}/chat/completions`;r.debug(`[Background] API requesttool count count :`,Ee.length);let i={model:n||P.modelName,messages:ce(j),tools:Ee.map(e=>{let{id:t,...n}=e;return n}),stream:xe.streamEnabled!==!1};i.stream&&(i.stream_options={include_usage:!0}),r.debug(`[Background] API requestbody stream mode:`,i.stream,`tool count count :`,i.tools.length,`messagecount:`,i.messages.length,`model:`,i.model),s.temperature!==void 0&&(i.temperature=s.temperature),s.top_p!==void 0&&(i.top_p=s.top_p);let a=ge*(F.apiRetryCount+1)+3e4,o=Math.max(ge,Math.min(a,f));ze=setTimeout(()=>{r.warn(`[Background] ⚠️ API call outertimeoutprotection triggered (${Math.round(o/1e3)}s),force abort`),ae?.abort()},o),xe.streamEnabled!==!1&&(chrome.runtime.sendMessage({type:`STREAM_START`,sessionId:c,callId:p}).catch(()=>{}),r.debug(`[Background] STREAM_START sent (API call with before )`));let l=await Ta(e,{method:`POST`,headers:{Authorization:`Bearer ${P.apiKey}`,"Content-Type":`application/json`},body:JSON.stringify(i),signal:se},ge,F.apiRetryCount,F.apiRetryBaseDelay,(e,t,n)=>{r.warn(`[Background] API retry (${e}/${F.apiRetryCount}) scheduled in ${n}ms:`,t.message),chrome.runtime.sendMessage({type:`API_RETRYING`,sessionId:c,callId:p,attempt:e,maxRetries:F.apiRetryCount,delay:n}).catch(()=>{})});if(clearTimeout(ze),!l.ok){let e=await l.text();throw r.error(`[Background] API response error:`,l.status,e),Error(`HTTP error! status: ${l.status}, message: ${e.substring(0,500)}`)}if(xe.streamEnabled!==!1&&l.body){r.debug(`[Background] enteringstreamingmode,streamEnabled:`,xe.streamEnabled);let e=new Ft(c,xe,{callId:p,preStarted:!0}),t=await It(l.body.getReader(),e,se);r.debug(`[Background] streaming API responsecomplete,content length:`,t.content.length,`tool_calls:`,t.toolCalls?.length,`usage:`,t.usage);let n=t.toolCalls?t.toolCalls.map(e=>({...e,id:e.id||`tc_fb_${crypto.randomUUID().slice(0,8)}`})):null;C={choices:[{message:{role:`assistant`,content:t.content||``,reasoning_content:t.reasoningContent,...n?{tool_calls:n}:{}},finish_reason:t.status===`tool_calls`?`tool_calls`:t.truncated?`length`:`stop`}],usage:t.usage}}else{let e=await l.text();r.debug(`[Background] API responsestate:`,l.status,`originaltext length:`,e.length,`preview:`,e.substring(0,200));try{C=JSON.parse(e)}catch(n){throw r.error(`[Background] JSON parse failed:`,n),r.error(`[Background] originalresponse:`,e),Error(t(`reactLoop.apiInvalidJson`,{status:l.status,error:n.message,preview:e.substring(0,100)}))}let n=C.choices?.[0]?.message?.tool_calls;if(n&&n.length>0){let e=n.map(e=>({...e,id:e.id||`tc_fb_${crypto.randomUUID().slice(0,8)}`}));C.choices[0].message.tool_calls=e}}}catch(e){clearTimeout(ze);let i=e.name===`AbortError`,a=e.name===`StreamIdleTimeout`;i?r.debug(`[Background] API call with by usercancel`):a?r.warn(`[Background] API stream idle timeout:`,e.message):r.error(`[Background] API call with failed:`,e.message||e);let o=i?t(`bg.requestCancelled`):a?t(`reactLoop.streamIdleTimeout`,{seconds:Math.round((e.idleMs||12e4)/1e3)}):e.message,c=O.findIndex(e=>e.id===me);throw c!==-1&&(O[c]={...O[c],duration:Date.now()-A,status:i?`cancelled`:`failed`,apiRequest:{...O[c].apiRequest,model:n||P.modelName,temperature:s.temperature,top_p:s.top_p,messageCount:j.length,toolCount:Ee.length},error:i?t(`reactLoop.userCancelled`):o}),En(o,O)}let Be=Date.now()-A,z=C.choices?.[0]?.message;C.choices?.[0]?.finish_reason===`length`&&r.warn(`[Background] API response reason token limit truncated (finish_reason: length),contentmay be incomplete`);let Ve=O.findIndex(e=>e.id===me);if(Ve!==-1&&(O[Ve]={...O[Ve],duration:Be,status:`success`,thought:z?.content||``,action:z?.tool_calls?.length>0?{name:z.tool_calls[0].function?.name||z.tool_calls[0].name,params:(()=>{try{return JSON.parse(z.tool_calls[0].function?.arguments||`{}`)}catch{return{}}})()}:null,apiRequest:{...O[Ve].apiRequest,model:n||P.modelName,temperature:s.temperature,top_p:s.top_p,messageCount:j.length,toolCount:Ee.length},apiResponse:{finishReason:C.choices?.[0]?.finish_reason,tokenUsage:C.usage}}),C.usage&&(qt({sessionId:c,model:n||P.modelName,usage:C.usage,callType:`react_loop`}).catch(()=>{}),Le>0&&C.usage.prompt_tokens>0)){le(Le,C.usage.prompt_tokens);let e=ne();e.active&&r.debug(`[Background] Tokencalibration activated: factor=${e.factor.toFixed(3)}, samples=${e.samples}`)}if(L(t(`reactLoop.apiCallNode`,{count:Se,subtask:l?t(`reactLoop.apiCallSubtask`,{iteration:h}):``}),`success`),z?.tool_calls&&z.tool_calls.length>0){r.debug(`[Background] recei to tool call:`,z.tool_calls);let e=JSON.stringify(z.tool_calls.map(e=>({name:e.function?.name||e.name,args:typeof e.function?.arguments==`string`?(()=>{try{return JSON.parse(e.function.arguments)}catch{return e.function.arguments}})():e.function?.arguments||{}})));r.debug(`[Background] this roundtool callinput fingerprint:`,e.substring(0,200)),y.push(z),await ee();let l=[],u=F.reflection;async function f(e,a,c,f,h,g,v,y,x){if(I(a)||g&&I(g))throw En(t(`bg.reactCancelled`),y);let S=e.function?.name||e.name,C=Date.now(),T=e.function?.arguments;r.debug(`[Background] executeSingleToolCall recei to tool call:`,JSON.stringify({name:S,argsType:typeof T,argsRaw:typeof T==`string`?T.substring(0,200):JSON.stringify(T).substring(0,200),id:e.id}));let O=(()=>{if(!T)return{};if(typeof T==`object`)return T;try{return JSON.parse(T||`{}`)}catch{return{}}})(),A=e.id||`tc_fallback_${crypto.randomUUID()}`,j=_.has(S),te=o[S]?.includes(O.action);if((j||te)&&F.toolConfirmationEnabled){if(g&&Cn.has(g))r.debug(`[Background] session ${g} got currenttaskallow,skip confirm: ${S}`);else{Ne(),chrome.runtime.sendMessage({type:`TOOL_CONFIRM_START`,...g?{sessionId:g}:{}}).catch(e=>{r.debug(`[Background] send TOOL_CONFIRM_START message failed:`,e.message)});let n;try{n=await Tn(S,O,a,g)}finally{Fe(),chrome.runtime.sendMessage({type:`TOOL_CONFIRM_END`,...g?{sessionId:g}:{}}).catch(e=>{r.debug(`[Background] send TOOL_CONFIRM_END message failed:`,e.message)})}if(!n){let n=crypto.randomUUID();return y.push({id:n,iteration:v,timestamp:new Date().toISOString(),status:`cancelled`,nodeType:`tool_exec`,nodeName:t(`reactLoop.toolExec`,{name:S}),action:{name:S,params:O},error:t(`reactLoop.userDenied`)}),L(t(`reactLoop.toolExec`,{name:S}),`cancelled`),x.push({role:`tool`,content:`The user declined this operation.`,tool_call_id:A}),await ee(),{toolCall:e,result:{success:!1,content:`The user declined this operation.`,error:`user_denied`},toolResultStr:`The user declined this operation.`,toolLogEntry:{id:n,iteration:v,timestamp:new Date().toISOString(),status:`cancelled`,nodeType:`tool_exec`,nodeName:t(`reactLoop.toolExec`,{name:S}),action:{name:S,params:O},error:t(`reactLoop.userDenied`)}}}}}let ne=`${S}:${JSON.stringify(O)}`;if(b.has(ne)){let e=b.get(ne);if(Date.now()-e.timestamp<6e4){if(m.has(S))return{...e,fromCache:!0};b.clear()}else b.delete(ne)}m.has(S)||b.clear(),await new Promise(e=>setTimeout(e,0));let M=crypto.randomUUID();y.push({id:M,iteration:v,timestamp:new Date().toISOString(),status:`processing`,nodeType:`tool_exec`,nodeName:t(`reactLoop.toolExecStart`,{name:S})}),L(t(`reactLoop.toolExecStart`,{name:S}),`processing`),S===`clarify_question`&&(Ne(),chrome.runtime.sendMessage({type:`CLARIFY_START`,...g?{sessionId:g}:{}}).catch(e=>{r.debug(`[Background] send CLARIFY_START message failed:`,e.message)}));let N;try{if(N=await Rn(e,a,c,f,h,g),S===`clarify_question`){Fe(),chrome.runtime.sendMessage({type:`CLARIFY_END`,...g?{sessionId:g}:{}}).catch(e=>{r.debug(`[Background] send CLARIFY_END message failed:`,e.message)}),r.debug(`[Background] clarification complete,re-filteringtool...`);try{let e=Ai(g),t=await Qi(null,null,null,e),a=await B(),o=a.reactConfig.enableToolPreselect,c=a.reactConfig.preselectMinToolCount||3;if(o&&t.length>c){let a=await Kt(x,n,t,s,1,Di(e));a.type===`tools`&&(i=a.tools,w=null,r.debug(`[Background] clarification after toolre-filtercomplete:`,i.map(e=>e.function.name))),a.executionLog&&y.push(...a.executionLog)}else o||r.debug(`[Background] toolpre-filterclosed,after clarification, notre-filter`)}catch(e){r.warn(`[Background] clarification after toolre-filter failed, continue withcurrenttoolset:`,e.message)}}let o;o=typeof N==`string`?N:N&&typeof N==`object`&&`content`in N?N.content??JSON.stringify(N):JSON.stringify(N);let _=N&&N.success!==!1,T=re(o),j=!1,te=o;if(T>E){let e=fe(o,E);r.debug(`[Background] tool ${S} result truncated: ${T} → ${re(e)} tokens`),j=!0,te=e,o=e}be||chrome.runtime.sendMessage({type:`STREAM_TOOL_RESULT`,sessionId:g,result:{toolCallId:A,toolName:S,success:_,content:_?te:N?.error||te,truncated:j,duration:Date.now()-C}}).catch(()=>{});let ae=y.filter(e=>e.nodeType===`tool_exec`&&e.iteration===v).sort((e,t)=>y.indexOf(e)-y.indexOf(t)),oe=0;for(let e=ae.length-1;e>=0&&ae[e].status===`failed`;e--)oe++;if(y.filter(e=>e.nodeType===`reflection`&&e.reflectionType===`tool`).length<(u?.toolReflection?.maxPerIteration||2)&&gn(o,oe,u)&&l.push({toolName:S,toolResultStr:o,toolCallParams:O,toolCallId:A,priority:hn(S,o,oe)}),S===`plan_task`&&N&&N.success&&N.data){k=N.data,r.debug(`[Background] received taskplanresult:`,JSON.stringify(k));let e=JSON.stringify({success:!0,message:`Task planning complete. Decomposed into ${k.subtasks.length} subtasks.`,data:k});x.push({role:`tool`,content:e,tool_call_id:A}),await ee();let o=y.findIndex(e=>e.id===M);o!==-1&&(y[o]={...y[o],duration:Date.now()-C,status:`success`,nodeName:t(`reactLoop.taskPlanDone`),action:{name:S,params:O},observation:t(`reactLoop.subtaskCount`,{count:k.subtasks.length}),subtaskCount:k.subtasks.length,strategy:k.strategy}),L(t(`reactLoop.taskPlanDone`),`success`);let c=z.tool_calls.findIndex(e=>e.id===A);if(c!==-1&&c<z.tool_calls.length-1){for(let e=c+1;e<z.tool_calls.length;e++){let n=z.tool_calls[e],i=n.function?.name||n.name||`unknown`,a=n.id||`tc_fallback_${crypto.randomUUID()}`;r.debug(`[Background] resend skiptool STREAM_TOOL_RESULT:`,i,`id:`,a),x.push({role:`tool`,content:JSON.stringify({success:!1,message:`Skipped: plan_task has decomposed subtasks; other tool calls in this round will not be executed.`}),tool_call_id:a}),be||chrome.runtime.sendMessage({type:`STREAM_TOOL_RESULT`,sessionId:g,result:{toolCallId:a,toolName:i,success:!1,content:t(`reactLoop.skippedAfterPlanTask`),truncated:!1,duration:0}}).catch(()=>{})}await ee()}let l=await Fn(k,n,i,a,s,g,y,d,F.reflection,P,Oe,p,se);if(I(a)||g&&I(g))throw En(t(`bg.reactCancelled`),y);let u=3e3,f=l.map((e,t)=>{let n=typeof e.result==`string`?e.result:JSON.stringify(e.result),r=re(n)>u?ie(n,u):n;return`Subtask ${t+1}: ${e.subtaskName}\nResult: ${r}`}).join(`
97
97
 
98
- `);if(x.push({role:`user`,content:`[System Context] The following are the execution results of the decomposed subtasks. Please summarize them and continue with the main task:\n\n${f}`}),await ee(),s.has(S)){if(b.size>=30){let e=b.keys().next().value;b.delete(e)}b.set(re,{planTaskHandled:!0,toolName:S,toolCallId:A,timestamp:Date.now()})}return{planTaskHandled:!0}}x.push({role:`tool`,content:a,tool_call_id:A,subtaskId:null,subtaskName:k?.subtasks[null]?.name||null}),await ee(),r.debug(`[Background] toolexec result length:`,a.length,`content preview:`,a.substring(0,200));let se=y.findIndex(e=>e.id===j);if(se!==-1){let e={...y[se],duration:Date.now()-C,status:l?`success`:`failed`,nodeName:t(`reactLoop.toolExec`,{name:S}),action:{name:S,params:O},observation:l?a.length>D?a.substring(0,D)+`...`:a:void 0,prototypeId:M?.prototypeId||null};!l&&M?.error&&(e.error=M.error),y[se]=e}if(s.has(S)){if(b.size>=30){let e=b.keys().next().value;b.delete(e)}b.set(re,{planTaskHandled:!1,toolResultStr:a,toolName:S,toolCallId:A,toolResult:M,timestamp:Date.now()})}return{planTaskHandled:!1,toolResultStr:a,toolName:S,toolCallId:A,toolResult:M}}catch(e){r.warn(`[Background] toolexecution failed (ReAct loop continue):`,e.message),S===`clarify_question`&&(Ie(),chrome.runtime.sendMessage({type:`CLARIFY_END`,..._?{sessionId:_}:{}}).catch(e=>{r.debug(`[Background] send CLARIFY_END message failed:`,e.message)}));let n=JSON.stringify({success:!1,error:e.message||`Tool execution error`});x.push({role:`tool`,content:n,tool_call_id:A,subtaskId:null,subtaskName:k?.subtasks[null]?.name||null}),await ee();let i=y.findIndex(e=>e.id===j);return i!==-1&&(y[i]={...y[i],duration:Date.now()-C,status:`failed`,nodeName:t(`reactLoop.toolExec`,{name:S}),action:{name:S,params:O},error:e.message}),r.warn(`[Background] tool ${S} execution failed,ReAct loop continue:`,e.message),L(t(`reactLoop.toolExec`,{name:S}),`failed`),be||chrome.runtime.sendMessage({type:`STREAM_TOOL_RESULT`,sessionId:_,result:{toolCallId:A,toolName:S,success:!1,content:t(`reactLoop.toolError`,{message:e.message}),truncated:!1,duration:Date.now()-C}}).catch(()=>{}),{error:e.message,toolName:S,toolCallId:A,toolResult:{success:!1,error:e.message},toolResultStr:JSON.stringify({success:!1,error:e.message})}}}async function g(){if(d.length===0)return;if(v>=10){r.warn(`[Background] reflectiontotal roundsreached limit,skip toolreflection`);return}d.sort((e,t)=>t.priority-e.priority);let e=f?.toolReflection?.maxPerIteration||2;for(let i of d.slice(0,e)){if(v>=10)break;v++;let e=await $t(i.toolName,i.toolResultStr,i.toolCallParams,P,n,f,O,_,u,fe);if(e){let n={id:crypto.randomUUID(),iteration:_,timestamp:new Date().toISOString(),status:e.useful?`success`:`failed`,nodeType:`reflection`,nodeName:t(`reactLoop.toolReflection`,{name:i.toolName}),reflectionType:`tool`,useful:e.useful,reasoning:e.reasoning,suggestion:e.suggestion};if(O.push(n),r.debug(`[Background] toolreflection: ${i.toolName} - ${e.useful?` has with `:`invalid`} - ${e.reasoning}`),!e.useful&&e.suggestion){let t=`\n\n[Reflection Notice] The result returned by tool "${i.toolName}" was assessed as unhelpful (${e.reasoning}). Suggestion: ${e.suggestion}. Please consider adjusting your strategy in subsequent steps.`;for(let e=y.length-1;e>=0;e--)if(y[e].role===`tool`&&y[e].tool_call_id===i.toolCallId){y[e]={...y[e],content:y[e].content+t};break}}}}}if(B.tool_calls.every(e=>s.has(e.function?.name||e.name))&&B.tool_calls.length>1){r.debug(`[Background] parallel exectool call:`,B.tool_calls.map(e=>e.function?.name||e.name));let e=y.length,t=B.tool_calls.map(e=>m(e,o,ve,_e,ye,u,_,O,y).catch(e=>({error:e.message}))),n=await Promise.all(t),i=y.splice(e),a=new Map(B.tool_calls.map((e,t)=>[e.id,t])),s=i.filter(e=>e.role===`tool`),c=i.filter(e=>e.role!==`tool`);s.sort((e,t)=>(a.get(e.tool_call_id)??999)-(a.get(t.tool_call_id)??999)),y.push(...c,...s);let l=!1;for(let e=0;e<B.tool_calls.length;e++){let t=n[e];t.error&&r.warn(`[Background] parallel toolsexecution failed: ${B.tool_calls[e].function?.name||B.tool_calls[e].name} - ${t.error}`),t.planTaskHandled&&(l=!0)}if(await g(),l){await N(`plan_task_completed`);continue}}else{let e=!1;for(let t=0;t<B.tool_calls.length;t++){let n=B.tool_calls[t];if((await m(n,o,ve,_e,ye,u,_,O,y)).planTaskHandled){e=!0,await g();break}}if(await g(),e){await N(`plan_task_completed`);continue}}let C=[];for(let e=y.length-1;e>=0;e--){let t=y[e];if(t.role===`tool`)C.unshift(t.content);else if(t.role===`assistant`&&t.tool_calls)break}let T=JSON.stringify(B.tool_calls.map((e,t)=>({name:e.function?.name||e.name,args:typeof e.function?.arguments==`string`?(()=>{try{return JSON.parse(e.function.arguments)}catch{return e.function.arguments}})():e.function?.arguments||{},result:C[t]||``})));if(T===x){S++;let e=B.tool_calls.map(e=>e.function?.name||e.name).join(`, `);if(r.warn(`[Background] detected infiniteloop:input and outputidentical (${S} consecutive repeats): ${e}`),S>=8)throw on(t(`reactLoop.infiniteLoopDetected`,{count:S}),O);if(S>=5){let e={role:`user`,content:`[System Notice] You have called the exact same tool with the same parameters ${S} times in a row and received identical results, which indicates the current strategy is making no progress. Please switch to a different strategy or tool immediately and do not repeat this operation. If the current tool cannot obtain the required data, try alternative approaches, or directly provide a conclusion based on the information already available.`};y.push(e),r.debug(`[Background] inject infinite loopwarningmessage`)}}else x=T,S=1;await N(`tools_completed`);continue}let He=B?.content||``,Ue=B?.reasoning_content||null;r.debug(`[Background] ReAct loop complete,finalcontent length:`,He.length),await N(`final_answer`),await un(u);let We=F.reflection;if(We?.enabled&&We?.postReflection?.enabled&&qt(O,d)){r.debug(`[Background] triggered post-reflection...`);let e=await Qt(y,He,O,n,P,We,o,L,p,d,u,v,fe);return e.reflectionLog&&e.reflectionLog.length>0&&O.push(...e.reflectionLog),L(t(`reactLoop.executionDone`),`success`),{content:e.content,executionLog:O,reflectionScore:e.overallScore,wasRevised:e.wasRevised,reasoningContent:Ue}}return L(t(`reactLoop.executionDone`),`success`),{content:He,executionLog:O,reasoningContent:Ue}}let e=Error(t(`reactLoop.maxIterationsExceeded`,{maxIterations:he}));throw e.executionLog=O,e}catch(e){throw await N(e.name===`AbortError`||e.message===`请求已被用户取消`||e.message===`ReAct 循环已被用户取消`?`user_cancelled`:`error`,!0),e}finally{u&&(tn.delete(u),nn.delete(u))}}var mn={DEFAULT_FAILURE_STRATEGY:`continue`,DEFAULT_MAX_RETRIES:1,DEFAULT_MAX_PARALLEL:3};async function hn(e,n,i,a,o,s,c,l={value:0},u=null,d=null,f=new Map,p=null,m=null){let{subtasks:h=[],strategy:g=`sequential`,taskDescription:_,failureStrategy:v=mn.DEFAULT_FAILURE_STRATEGY,maxRetries:y=mn.DEFAULT_MAX_RETRIES,maxParallel:b=mn.DEFAULT_MAX_PARALLEL}=e,x=[],S=[];function C(e,t,n,r={}){cn(c,f);let i=[];for(let e of n){let t=f.get(e.id);(!t||t.status!==e.status||t.nodeName!==e.nodeName)&&(i.push(e),f.set(e.id,{status:e.status,nodeName:e.nodeName}))}if(i.length===0)return;let a={type:`EXECUTION_STATUS_UPDATE`,nodeName:e,status:t,executionLog:i,...s?{sessionId:s}:{},...p?{callId:p}:{},...r};r.subtaskTotal!=null&&(a.subtaskTotal=r.subtaskTotal,a.subtaskIndex=r.subtaskIndex,a.subtaskName=r.subtaskName),chrome.runtime.sendMessage(a).catch(e=>{})}r.debug(`[Background] start executing subtask,strategy:`,g,`failedstrategy:`,v,`maxretry:`,y,`count:`,h.length);let w=g===`dependency`?gn(h):h,T=await _n(w,i);async function E(){r.debug(`[Background] start rollback completed subtask`);for(let e=S.length-1;e>=0;e--){let{subtask:n,result:i}=S[e];if(typeof n.rollback==`function`)try{r.debug(`[Background] rollback subtask: ${n.name}`),await n.rollback(i),c.push({id:crypto.randomUUID(),iteration:0,timestamp:new Date().toISOString(),status:`rolledback`,nodeType:`subtask`,nodeName:t(`reactLoop.subtaskRolledBack`,{name:n.name}),subtaskId:n.id,subtaskName:n.name}),C(t(`reactLoop.subtaskRolledBack`,{name:n.name}),`rolledback`,c)}catch(e){r.error(`[Background] rollback failed:`,e.message),c.push({id:crypto.randomUUID(),iteration:0,timestamp:new Date().toISOString(),status:`rollback_failed`,nodeType:`subtask`,nodeName:t(`reactLoop.subtaskRollbackFailed`,{name:n.name}),subtaskId:n.id,subtaskName:n.name,error:e.message})}}}async function D(e,i,f){let p=crypto.randomUUID(),h=`subtask_group_${f}`,g=s?`${s}_subtask_${f}`:null;c.push({id:p,iteration:0,timestamp:new Date().toISOString(),status:`processing`,nodeType:`subtask`,nodeName:t(`reactLoop.subtaskNode`,{index:f+1,name:e.name}),subtaskId:e.id,subtaskName:e.name,subtaskIndex:f,taskGroup:h,taskGroupIndex:f+1,taskGroupName:e.name,isSubtask:!0}),C(t(`reactLoop.subtaskNode`,{index:f+1,name:e.name}),`processing`,c,{taskGroup:h,subtaskIndex:f,subtaskTotal:w.length,subtaskName:e.name});for(let v=0;v<=y;v++){if(I(a)||s&&I(s))throw r.debug(`[Background] subtaskretryby usercancel`),on(t(`bg.reactCancelled`),c);try{r.debug(`[Background] execute subtask ${f+1}/${w.length}: ${e.name} (attempt ${v+1}/${y+1})`);let b=[{role:`system`,content:`You are executing a subtask. Focus on completing this task and do not ask the user any questions.\n\nTask context: ${_}\n\nCurrent subtask: ${e.description}\n\nYou may use all available tools to complete the task. Choose the appropriate tools based on the actual situation.`},{role:`user`,content:e.description}],x=await pn(b,n,i,a,o,g,{subtaskId:e.id,subtaskName:e.name},n=>{let r=[...c];n.forEach(t=>{r.push({...t,subtaskId:e.id,subtaskName:e.name,subtaskIndex:f,taskGroup:h,taskGroupIndex:f+1,taskGroupName:e.name,isSubtask:!0})}),C(t(`reactLoop.subtaskNode`,{index:f+1,name:e.name}),`processing`,r,{taskGroup:h,subtaskIndex:f,subtaskTotal:w.length,subtaskName:e.name})},l);x.executionLog&&x.executionLog.length>0&&x.executionLog.forEach(t=>{c.push({...t,subtaskId:e.id,subtaskName:e.name,subtaskIndex:f,taskGroup:h,taskGroupIndex:f+1,taskGroupName:e.name,isSubtask:!0})});let T=c.findIndex(e=>e.id===p);T!==-1&&(c[T]={...c[T],status:`success`,duration:Date.now()-new Date(c[T].timestamp).getTime(),result:x.content.substring(0,200)+(x.content.length>200?`...`:``)}),C(t(`reactLoop.subtaskCompleted`,{index:f+1,name:e.name}),`success`,c,{taskGroup:h,subtaskIndex:f,subtaskTotal:w.length,subtaskName:e.name}),S.push({subtask:e,result:x});let E=x.content,D=null;if(u?.enabled&&u?.subtaskReflection?.enabled){let t=u.subtaskReflection,i=e.complexity===`complex`||x.content.length>500||x.executionLog&&x.executionLog.length>3;if((!t.onlyForComplexSubtasks||i)&&t.maxRounds>0){r.debug(`[Background] subtask ${e.name} trigger reflection,complexity: ${i?`repmisc`:`normal`}`);let o=await en(b,x.content,x.executionLog||[],n,d,t,a,e.name,c,s,m);o.refinedContent&&(E=o.refinedContent,r.debug(`[Background] subtask ${e.name} after reflectionrevise`)),D=o.score,o.reflectionLog&&o.reflectionLog.forEach(t=>{c.push({...t,subtaskId:e.id,subtaskName:e.name,subtaskIndex:f,taskGroup:h,taskGroupIndex:f+1,taskGroupName:e.name,isSubtask:!0})})}}return{success:!0,subtaskId:e.id,subtaskName:e.name,result:E,executionLog:x.executionLog||[],retryCount:v,reflectionScore:D}}catch(n){if(n.name===`AbortError`)throw n;if(r.warn(`[Background] subtask ${e.name} attempt ${v+1} failed:`,n.message),v>=y){n.executionLog&&n.executionLog.length>0&&n.executionLog.forEach(t=>{c.push({...t,subtaskId:e.id,subtaskName:e.name,subtaskIndex:f,taskGroup:h,taskGroupIndex:f+1,taskGroupName:e.name,isSubtask:!0})});let r=c.findIndex(e=>e.id===p);return r!==-1&&(c[r]={...c[r],status:`failed`,duration:Date.now()-new Date(c[r].timestamp).getTime(),error:n.message,retryCount:v+1}),C(t(`reactLoop.subtaskFailed`,{index:f+1,name:e.name}),`failed`,c,{taskGroup:h,subtaskIndex:f,subtaskTotal:w.length,subtaskName:e.name}),{success:!1,subtaskId:e.id,subtaskName:e.name,result:n.message,executionLog:n.executionLog||[],retryCount:v+1,error:n}}await new Promise(e=>setTimeout(e,1e3*2**v))}}}if(g===`sequential`||g===`dependency`)for(let e=0;e<w.length;e++){if(I(a)||s&&I(s))return r.debug(`[Background] subtaskexec by usercancel`),x;let t=w[e],n=await D(t,T[t.id]||[],e);if(x.push(n),!n.success&&(r.debug(`[Background] subtask ${t.name} failed,failedstrategy: ${v}`),v===`stop`))return r.debug(`[Background] execute rollback`),await E(),x;if(I(a)||s&&I(s))return r.debug(`[Background] subtaskexec by usercancel`),x}else if(g===`parallel`){r.debug(`[Background] parallel executing subtask,max concurrency:`,b);let e=[],t=new Map;for(let n=0;n<w.length;n++){if(I(a)||s&&I(s))return r.debug(`[Background] subtaskparallel execby usercancel`),x;if(e.length>=b){let t=await Promise.race(e),n=e.indexOf(t);n>-1&&e.splice(n,1)}let i=w[n],o=D(i,T[i.id]||[],n).then(e=>(t.set(i.id,e),e));e.push(o)}await Promise.all(e);let n=!1;w.forEach(e=>{let r=t.get(e.id);r&&(x.push(r),r.success||(n=!0))}),n&&v===`stop`&&(r.debug(`[Background] parallel execoccurred failed,execute rollback`),await E())}else return r.warn(`[Background] not knownexec strategy: ${g},downgraded to sequentialexec `),hn({...e,strategy:`sequential`},n,i,a,o,s,c,l,u,d,f,p,m);return x}function gn(e){let t=[],n=new Set,r=new Set;function i(a){if(r.has(a.id))throw Error(`检测到子任务依赖循环`);n.has(a.id)||(r.add(a.id),(a.dependencies||[]).forEach(t=>{let n=e.find(e=>e.id===t);n&&i(n)}),r.delete(a.id),n.add(a.id),t.push(a))}return e.forEach(e=>{n.has(e.id)||i(e)}),t}async function _n(e,t=null){let n=t||await Mi(),i=await R().then(e=>e.reactConfig||{}),a=i.enableToolPreselect===!0,o=i.preselectMinToolCount||10,s={},c=[`plan_task`],l=n.filter(e=>!c.includes(e.id));if(l.length<=o)return r.debug(`[Background] subtasktoolfilter:tool count ${l.length} <= ${o},full count inherit (excluded plan_task)`),e.forEach(e=>{s[e.id]=[...l]}),s;let u=[`clarify_question`];return e.forEach(e=>{if(a&&Array.isArray(e.requiredTools)&&e.requiredTools.length>0){let t=l.filter(t=>e.requiredTools.includes(t.id)),n=l.filter(e=>u.includes(e.id));s[e.id]=[...t,...n],r.debug(`[Background] subtask ${e.name} filter tools: ${t.length}/${l.length} (pre-filter mode)`)}else s[e.id]=[...l],r.debug(`[Background] subtask ${e.name} inherit parent task ${l.length} tool (excluded plan_task)`)}),s}async function vn(e,n,i,a,o,s=null){let l=e.function?.name||e.name;if(l===`clarify_question`)return r.debug(`[Background] clarificationtooldirectly execute, no outertimeout (overall looptimeoutpaused)`),Qi(e,n,s);let u=c[l],d=u?Math.min(u,i):i;r.debug(`[Background] tool ${l} usingtimeout: ${d}ms${u?` (custom: ${u}ms, globallimit: ${i}ms)`:``}`);let f=Fe(s);return new Promise((r,i)=>{let a=setTimeout(()=>{i(Error(t(`reactLoop.toolTimeout`,{timeout:d,tool:l})))},d),o=()=>{clearTimeout(a),i(Error(t(`reactLoop.toolAborted`,{tool:l})))};f&&!f.signal.aborted&&f.signal.addEventListener(`abort`,o,{once:!0}),Qi(e,n,s).then(e=>{clearTimeout(a),f&&(f.signal.removeEventListener(`abort`,o),Le(s)),r(e)}).catch(e=>{clearTimeout(a),f&&(f.signal.removeEventListener(`abort`,o),Le(s)),i(e)})})}function yn(e,n,i={},a=null,o={},s=null){return R().then(c=>{i.imageApiBase&&(c.apiBase=i.imageApiBase),i.imageApiKey&&(c.apiKey=i.imageApiKey);let l=(a?Te(a):null)?.signal,u=`${c.apiBase}/chat/completions`,d=ce(e),f=c.streamConfig?.streamEnabled!==!1;r.debug(`[Background] send API request to :`,u,`streaming:`,f);let p={model:n||c.modelName,messages:oe(d),stream:f};return f&&(p.stream_options={include_usage:!0}),i.temperature!==void 0&&(p.temperature=i.temperature),i.top_p!==void 0&&(p.top_p=i.top_p),f&&a&&(chrome.runtime.sendMessage({type:`STREAM_START`,sessionId:a,callId:s}).catch(()=>{}),r.debug(`[Background] STREAM_START sent (API call with before )`)),aa(u,{method:`POST`,headers:{Authorization:`Bearer ${c.apiKey}`,"Content-Type":`application/json`},body:JSON.stringify(p),signal:l},c.reactConfig.apiTimeout,c.reactConfig.apiRetryCount,c.reactConfig.apiRetryBaseDelay,(e,t,n)=>{r.warn(`[Background] API retry (${e}/${c.reactConfig.apiRetryCount}) scheduled in ${n}ms:`,t.message),a&&chrome.runtime.sendMessage({type:`API_RETRYING`,sessionId:a,callId:s,attempt:e,maxRetries:c.reactConfig.apiRetryCount,delay:n}).catch(()=>{})}).then(async e=>{if(!e.ok){let t=await e.text();throw r.error(`[Background] API response error:`,e.status,t),Error(`HTTP error! status: ${e.status}, message: ${t.substring(0,500)}`)}if(f&&e.body){let t=new At(a,c.streamConfig,{...o,callId:s,preStarted:!0}),n=await jt(e.body.getReader(),t,l);return r.debug(`[Background] streaming API responsecomplete,content length:`,n.content.length,`usage:`,n.usage),{content:n.content,usage:n.usage,reasoningContent:n.reasoningContent}}let n=await e.text();r.debug(`[Background] non-streaming API responsestate:`,e.status,`text length:`,n.length,`preview:`,n.substring(0,200));try{let e=JSON.parse(n);return r.debug(`[Background] API response:`,JSON.stringify(e).substring(0,200)),{content:e.choices?.[0]?.message?.content||``,usage:e.usage||null}}catch(i){throw r.error(`[Background] JSON parse failed,originalresponse:`,n.substring(0,500)),Error(t(`reactLoop.jsonParseFailed`,{status:e.status,error:i.message,preview:n.substring(0,100)}))}}).catch(e=>{throw e.name===`AbortError`?r.debug(`[Background] API call with by usercancel`):r.error(`[Background] API call with failed:`,e.message||e),e})})}e(`zh`,{agentDispatcher:{depthLimitReached:`子代理嵌套层级已达上限(最多 {max} 层,当前 {current} 层)。请直接使用你自己的工具完成任务,不要再派发给其他子代理。`}}),e(`en`,{agentDispatcher:{depthLimitReached:`Sub-agent nesting depth limit reached (max {max}, current {current}). Please complete the task directly using your own tools instead of dispatching to another sub-agent.`}});var bn=2,xn=new Map;async function Sn(e){return j.find(t=>t.id===e)||((await chrome.storage.local.get([`customAgents`])).customAgents||[]).find(t=>t.id===e)||null}async function Cn(e,t){let n=e.systemPrompt||``;n.trim()||(n=`You are an AI assistant. Please complete the following task.`);try{let t=``;e.skillIds!=null&&Array.isArray(e.skillIds)&&e.skillIds.length>0?t=(await yt(e.skillIds)).prompts||``:e.skillIds??(t=(await vt()).prompts||``),t&&(n+=`
98
+ `);if(x.push({role:`user`,content:`[System Context] The following are the execution results of the decomposed subtasks. Please summarize them and continue with the main task:\n\n${f}`}),await ee(),m.has(S)){if(b.size>=30){let e=b.keys().next().value;b.delete(e)}b.set(ne,{planTaskHandled:!0,toolName:S,toolCallId:A,timestamp:Date.now()})}return{planTaskHandled:!0}}x.push({role:`tool`,content:o,tool_call_id:A,subtaskId:null,subtaskName:k?.subtasks[null]?.name||null}),await ee(),r.debug(`[Background] toolexec result length:`,o.length,`content preview:`,o.substring(0,200));let ce=y.findIndex(e=>e.id===M);if(ce!==-1){let e={...y[ce],duration:Date.now()-C,status:_?`success`:`failed`,nodeName:t(`reactLoop.toolExec`,{name:S}),action:{name:S,params:O},observation:_?o.length>D?o.substring(0,D)+`...`:o:void 0,prototypeId:N?.prototypeId||null};!_&&N?.error&&(e.error=N.error),y[ce]=e}if(m.has(S)){if(b.size>=30){let e=b.keys().next().value;b.delete(e)}b.set(ne,{planTaskHandled:!1,toolResultStr:o,toolName:S,toolCallId:A,toolResult:N,timestamp:Date.now()})}return{planTaskHandled:!1,toolResultStr:o,toolName:S,toolCallId:A,toolResult:N}}catch(e){r.warn(`[Background] toolexecution failed (ReAct loop continue):`,e.message),S===`clarify_question`&&(Fe(),chrome.runtime.sendMessage({type:`CLARIFY_END`,...g?{sessionId:g}:{}}).catch(e=>{r.debug(`[Background] send CLARIFY_END message failed:`,e.message)}));let n=JSON.stringify({success:!1,error:e.message||`Tool execution error`});x.push({role:`tool`,content:n,tool_call_id:A,subtaskId:null,subtaskName:k?.subtasks[null]?.name||null}),await ee();let i=y.findIndex(e=>e.id===M);return i!==-1&&(y[i]={...y[i],duration:Date.now()-C,status:`failed`,nodeName:t(`reactLoop.toolExec`,{name:S}),action:{name:S,params:O},error:e.message}),r.warn(`[Background] tool ${S} execution failed,ReAct loop continue:`,e.message),L(t(`reactLoop.toolExec`,{name:S}),`failed`),be||chrome.runtime.sendMessage({type:`STREAM_TOOL_RESULT`,sessionId:g,result:{toolCallId:A,toolName:S,success:!1,content:t(`reactLoop.toolError`,{message:e.message}),truncated:!1,duration:Date.now()-C}}).catch(()=>{}),{error:e.message,toolName:S,toolCallId:A,toolResult:{success:!1,error:e.message},toolResultStr:JSON.stringify({success:!1,error:e.message})}}}async function v(){if(l.length===0)return;if(g>=10){r.warn(`[Background] reflectiontotal roundsreached limit,skip toolreflection`);return}l.sort((e,t)=>t.priority-e.priority);let e=u?.toolReflection?.maxPerIteration||2;for(let i of l.slice(0,e)){if(g>=10)break;g++;let e=await bn(i.toolName,i.toolResultStr,i.toolCallParams,P,n,u,O,h,c,se);if(e){let n={id:crypto.randomUUID(),iteration:h,timestamp:new Date().toISOString(),status:e.useful?`success`:`failed`,nodeType:`reflection`,nodeName:t(`reactLoop.toolReflection`,{name:i.toolName}),reflectionType:`tool`,useful:e.useful,reasoning:e.reasoning,suggestion:e.suggestion};if(O.push(n),r.debug(`[Background] toolreflection: ${i.toolName} - ${e.useful?` has with `:`invalid`} - ${e.reasoning}`),!e.useful&&e.suggestion){let t=`\n\n[Reflection Notice] The result returned by tool "${i.toolName}" was assessed as unhelpful (${e.reasoning}). Suggestion: ${e.suggestion}. Please consider adjusting your strategy in subsequent steps.`;for(let e=y.length-1;e>=0;e--)if(y[e].role===`tool`&&y[e].tool_call_id===i.toolCallId){y[e]={...y[e],content:y[e].content+t};break}}}}}if(z.tool_calls.every(e=>m.has(e.function?.name||e.name))&&z.tool_calls.length>1){r.debug(`[Background] parallel exectool call:`,z.tool_calls.map(e=>e.function?.name||e.name));let e=y.length,t=z.tool_calls.map(e=>f(e,a,ve,_e,ye,c,h,O,y).catch(e=>({error:e.message}))),n=await Promise.all(t),i=y.splice(e),o=new Map(z.tool_calls.map((e,t)=>[e.id,t])),s=i.filter(e=>e.role===`tool`),l=i.filter(e=>e.role!==`tool`);s.sort((e,t)=>(o.get(e.tool_call_id)??999)-(o.get(t.tool_call_id)??999)),y.push(...l,...s);let u=!1;for(let e=0;e<z.tool_calls.length;e++){let t=n[e];t.error&&r.warn(`[Background] parallel toolsexecution failed: ${z.tool_calls[e].function?.name||z.tool_calls[e].name} - ${t.error}`),t.planTaskHandled&&(u=!0)}if(await v(),u){await M(`plan_task_completed`);continue}}else{let e=!1;for(let t=0;t<z.tool_calls.length;t++){let n=z.tool_calls[t];if((await f(n,a,ve,_e,ye,c,h,O,y)).planTaskHandled){e=!0,await v();break}}if(await v(),e){await M(`plan_task_completed`);continue}}let C=[];for(let e=y.length-1;e>=0;e--){let t=y[e];if(t.role===`tool`)C.unshift(t.content);else if(t.role===`assistant`&&t.tool_calls)break}let T=JSON.stringify(z.tool_calls.map((e,t)=>({name:e.function?.name||e.name,args:typeof e.function?.arguments==`string`?(()=>{try{return JSON.parse(e.function.arguments)}catch{return e.function.arguments}})():e.function?.arguments||{},result:C[t]||``})));if(T===x){S++;let e=z.tool_calls.map(e=>e.function?.name||e.name).join(`, `);if(r.warn(`[Background] detected infiniteloop:input and outputidentical (${S} consecutive repeats): ${e}`),S>=8)throw En(t(`reactLoop.infiniteLoopDetected`,{count:S}),O);if(S>=5){let e={role:`user`,content:`[System Notice] You have called the exact same tool with the same parameters ${S} times in a row and received identical results, which indicates the current strategy is making no progress. Please switch to a different strategy or tool immediately and do not repeat this operation. If the current tool cannot obtain the required data, try alternative approaches, or directly provide a conclusion based on the information already available.`};y.push(e),r.debug(`[Background] inject infinite loopwarningmessage`)}}else x=T,S=1;await M(`tools_completed`);continue}let He=z?.content||``,Ue=z?.reasoning_content||null;r.debug(`[Background] ReAct loop complete,finalcontent length:`,He.length),await M(`final_answer`),await An(c);let We=F.reflection;if(We?.enabled&&We?.postReflection?.enabled&&mn(O,l)){r.debug(`[Background] triggered post-reflection...`);let e=await yn(y,He,O,n,P,We,a,L,d,l,c,g,se);return e.reflectionLog&&e.reflectionLog.length>0&&O.push(...e.reflectionLog),L(t(`reactLoop.executionDone`),`success`),{content:e.content,executionLog:O,reflectionScore:e.overallScore,wasRevised:e.wasRevised,reasoningContent:Ue}}return L(t(`reactLoop.executionDone`),`success`),{content:He,executionLog:O,reasoningContent:Ue}}let e=Error(t(`reactLoop.maxIterationsExceeded`,{maxIterations:me}));throw e.executionLog=O,e}catch(e){throw await M(e.name===`AbortError`||e.message===`请求已被用户取消`||e.message===`ReAct 循环已被用户取消`?`user_cancelled`:`error`,!0),e}finally{c&&(Sn.delete(c),Cn.delete(c))}}var Pn={DEFAULT_FAILURE_STRATEGY:`continue`,DEFAULT_MAX_RETRIES:1,DEFAULT_MAX_PARALLEL:3};async function Fn(e,n,i,a,o,s,c,l={value:0},u=null,d=null,f=new Map,p=null,m=null){let{subtasks:h=[],strategy:g=`sequential`,taskDescription:_,failureStrategy:v=Pn.DEFAULT_FAILURE_STRATEGY,maxRetries:y=Pn.DEFAULT_MAX_RETRIES,maxParallel:b=Pn.DEFAULT_MAX_PARALLEL}=e,x=[],S=[];function C(e,t,n,r={}){On(c,f);let i=[];for(let e of n){let t=f.get(e.id);(!t||t.status!==e.status||t.nodeName!==e.nodeName)&&(i.push(e),f.set(e.id,{status:e.status,nodeName:e.nodeName}))}if(i.length===0)return;let a={type:`EXECUTION_STATUS_UPDATE`,nodeName:e,status:t,executionLog:i,...s?{sessionId:s}:{},...p?{callId:p}:{},...r};r.subtaskTotal!=null&&(a.subtaskTotal=r.subtaskTotal,a.subtaskIndex=r.subtaskIndex,a.subtaskName=r.subtaskName),chrome.runtime.sendMessage(a).catch(e=>{})}r.debug(`[Background] start executing subtask,strategy:`,g,`failedstrategy:`,v,`maxretry:`,y,`count:`,h.length);let w=g===`dependency`?In(h):h,T=await Ln(w,i);async function E(){r.debug(`[Background] start rollback completed subtask`);for(let e=S.length-1;e>=0;e--){let{subtask:n,result:i}=S[e];if(typeof n.rollback==`function`)try{r.debug(`[Background] rollback subtask: ${n.name}`),await n.rollback(i),c.push({id:crypto.randomUUID(),iteration:0,timestamp:new Date().toISOString(),status:`rolledback`,nodeType:`subtask`,nodeName:t(`reactLoop.subtaskRolledBack`,{name:n.name}),subtaskId:n.id,subtaskName:n.name}),C(t(`reactLoop.subtaskRolledBack`,{name:n.name}),`rolledback`,c)}catch(e){r.error(`[Background] rollback failed:`,e.message),c.push({id:crypto.randomUUID(),iteration:0,timestamp:new Date().toISOString(),status:`rollback_failed`,nodeType:`subtask`,nodeName:t(`reactLoop.subtaskRollbackFailed`,{name:n.name}),subtaskId:n.id,subtaskName:n.name,error:e.message})}}}async function D(e,i,f){let p=crypto.randomUUID(),h=`subtask_group_${f}`,g=s?`${s}_subtask_${f}`:null;c.push({id:p,iteration:0,timestamp:new Date().toISOString(),status:`processing`,nodeType:`subtask`,nodeName:t(`reactLoop.subtaskNode`,{index:f+1,name:e.name}),subtaskId:e.id,subtaskName:e.name,subtaskIndex:f,taskGroup:h,taskGroupIndex:f+1,taskGroupName:e.name,isSubtask:!0}),C(t(`reactLoop.subtaskNode`,{index:f+1,name:e.name}),`processing`,c,{taskGroup:h,subtaskIndex:f,subtaskTotal:w.length,subtaskName:e.name});for(let v=0;v<=y;v++){if(I(a)||s&&I(s))throw r.debug(`[Background] subtaskretryby usercancel`),En(t(`bg.reactCancelled`),c);try{r.debug(`[Background] execute subtask ${f+1}/${w.length}: ${e.name} (attempt ${v+1}/${y+1})`);let b=[{role:`system`,content:`You are executing a subtask. Focus on completing this task and do not ask the user any questions.\n\nTask context: ${_}\n\nCurrent subtask: ${e.description}\n\nYou may use all available tools to complete the task. Choose the appropriate tools based on the actual situation.`},{role:`user`,content:e.description}],x=await Nn(b,n,i,a,o,g,{subtaskId:e.id,subtaskName:e.name},n=>{let r=[...c];n.forEach(t=>{r.push({...t,subtaskId:e.id,subtaskName:e.name,subtaskIndex:f,taskGroup:h,taskGroupIndex:f+1,taskGroupName:e.name,isSubtask:!0})}),C(t(`reactLoop.subtaskNode`,{index:f+1,name:e.name}),`processing`,r,{taskGroup:h,subtaskIndex:f,subtaskTotal:w.length,subtaskName:e.name})},l);x.executionLog&&x.executionLog.length>0&&x.executionLog.forEach(t=>{c.push({...t,subtaskId:e.id,subtaskName:e.name,subtaskIndex:f,taskGroup:h,taskGroupIndex:f+1,taskGroupName:e.name,isSubtask:!0})});let T=c.findIndex(e=>e.id===p);T!==-1&&(c[T]={...c[T],status:`success`,duration:Date.now()-new Date(c[T].timestamp).getTime(),result:x.content.substring(0,200)+(x.content.length>200?`...`:``)}),C(t(`reactLoop.subtaskCompleted`,{index:f+1,name:e.name}),`success`,c,{taskGroup:h,subtaskIndex:f,subtaskTotal:w.length,subtaskName:e.name}),S.push({subtask:e,result:x});let E=x.content,D=null;if(u?.enabled&&u?.subtaskReflection?.enabled){let t=u.subtaskReflection,i=e.complexity===`complex`||x.content.length>500||x.executionLog&&x.executionLog.length>3;if((!t.onlyForComplexSubtasks||i)&&t.maxRounds>0){r.debug(`[Background] subtask ${e.name} trigger reflection,complexity: ${i?`repmisc`:`normal`}`);let o=await xn(b,x.content,x.executionLog||[],n,d,t,a,e.name,c,s,m);o.refinedContent&&(E=o.refinedContent,r.debug(`[Background] subtask ${e.name} after reflectionrevise`)),D=o.score,o.reflectionLog&&o.reflectionLog.forEach(t=>{c.push({...t,subtaskId:e.id,subtaskName:e.name,subtaskIndex:f,taskGroup:h,taskGroupIndex:f+1,taskGroupName:e.name,isSubtask:!0})})}}return{success:!0,subtaskId:e.id,subtaskName:e.name,result:E,executionLog:x.executionLog||[],retryCount:v,reflectionScore:D}}catch(n){if(n.name===`AbortError`)throw n;if(r.warn(`[Background] subtask ${e.name} attempt ${v+1} failed:`,n.message),v>=y){n.executionLog&&n.executionLog.length>0&&n.executionLog.forEach(t=>{c.push({...t,subtaskId:e.id,subtaskName:e.name,subtaskIndex:f,taskGroup:h,taskGroupIndex:f+1,taskGroupName:e.name,isSubtask:!0})});let r=c.findIndex(e=>e.id===p);return r!==-1&&(c[r]={...c[r],status:`failed`,duration:Date.now()-new Date(c[r].timestamp).getTime(),error:n.message,retryCount:v+1}),C(t(`reactLoop.subtaskFailed`,{index:f+1,name:e.name}),`failed`,c,{taskGroup:h,subtaskIndex:f,subtaskTotal:w.length,subtaskName:e.name}),{success:!1,subtaskId:e.id,subtaskName:e.name,result:n.message,executionLog:n.executionLog||[],retryCount:v+1,error:n}}await new Promise(e=>setTimeout(e,1e3*2**v))}}}if(g===`sequential`||g===`dependency`)for(let e=0;e<w.length;e++){if(I(a)||s&&I(s))return r.debug(`[Background] subtaskexec by usercancel`),x;let t=w[e],n=await D(t,T[t.id]||[],e);if(x.push(n),!n.success&&(r.debug(`[Background] subtask ${t.name} failed,failedstrategy: ${v}`),v===`stop`))return r.debug(`[Background] execute rollback`),await E(),x;if(I(a)||s&&I(s))return r.debug(`[Background] subtaskexec by usercancel`),x}else if(g===`parallel`){r.debug(`[Background] parallel executing subtask,max concurrency:`,b);let e=[],t=new Map;for(let n=0;n<w.length;n++){if(I(a)||s&&I(s))return r.debug(`[Background] subtaskparallel execby usercancel`),x;if(e.length>=b){let t=await Promise.race(e),n=e.indexOf(t);n>-1&&e.splice(n,1)}let i=w[n],o=D(i,T[i.id]||[],n).then(e=>(t.set(i.id,e),e));e.push(o)}await Promise.all(e);let n=!1;w.forEach(e=>{let r=t.get(e.id);r&&(x.push(r),r.success||(n=!0))}),n&&v===`stop`&&(r.debug(`[Background] parallel execoccurred failed,execute rollback`),await E())}else return r.warn(`[Background] not knownexec strategy: ${g},downgraded to sequentialexec `),Fn({...e,strategy:`sequential`},n,i,a,o,s,c,l,u,d,f,p,m);return x}function In(e){let t=[],n=new Set,r=new Set;function i(a){if(r.has(a.id))throw Error(`检测到子任务依赖循环`);n.has(a.id)||(r.add(a.id),(a.dependencies||[]).forEach(t=>{let n=e.find(e=>e.id===t);n&&i(n)}),r.delete(a.id),n.add(a.id),t.push(a))}return e.forEach(e=>{n.has(e.id)||i(e)}),t}async function Ln(e,t=null){let n=t||await Qi(),i=await B().then(e=>e.reactConfig||{}),a=i.enableToolPreselect===!0,o=i.preselectMinToolCount||10,s={},c=[`plan_task`],l=n.filter(e=>!c.includes(e.id));if(l.length<=o)return r.debug(`[Background] subtasktoolfilter:tool count ${l.length} <= ${o},full count inherit (excluded plan_task)`),e.forEach(e=>{s[e.id]=[...l]}),s;let u=[`clarify_question`];return e.forEach(e=>{if(a&&Array.isArray(e.requiredTools)&&e.requiredTools.length>0){let t=l.filter(t=>e.requiredTools.includes(t.id)),n=l.filter(e=>u.includes(e.id));s[e.id]=[...t,...n],r.debug(`[Background] subtask ${e.name} filter tools: ${t.length}/${l.length} (pre-filter mode)`)}else s[e.id]=[...l],r.debug(`[Background] subtask ${e.name} inherit parent task ${l.length} tool (excluded plan_task)`)}),s}async function Rn(e,n,i,a,o,s=null){let c=e.function?.name||e.name;if(c===`clarify_question`)return r.debug(`[Background] clarificationtooldirectly execute, no outertimeout (overall looptimeoutpaused)`),va(e,n,s);let l=d[c],u=l?Math.min(l,i):i;r.debug(`[Background] tool ${c} usingtimeout: ${u}ms${l?` (custom: ${l}ms, globallimit: ${i}ms)`:``}`);let f=ze(s);return new Promise((r,i)=>{let a=setTimeout(()=>{i(Error(t(`reactLoop.toolTimeout`,{timeout:u,tool:c})))},u),o=()=>{clearTimeout(a),i(Error(t(`reactLoop.toolAborted`,{tool:c})))};f&&!f.signal.aborted&&f.signal.addEventListener(`abort`,o,{once:!0}),va(e,n,s).then(e=>{clearTimeout(a),f&&(f.signal.removeEventListener(`abort`,o),z(s)),r(e)}).catch(e=>{clearTimeout(a),f&&(f.signal.removeEventListener(`abort`,o),z(s)),i(e)})})}function zn(e,n,i={},a=null,o={},s=null){return B().then(c=>{i.imageApiBase&&(c.apiBase=i.imageApiBase),i.imageApiKey&&(c.apiKey=i.imageApiKey);let l=(a?De(a):null)?.signal,u=`${c.apiBase}/chat/completions`,d=ue(e),f=c.streamConfig?.streamEnabled!==!1;r.debug(`[Background] send API request to :`,u,`streaming:`,f);let p={model:n||c.modelName,messages:ce(d),stream:f};return f&&(p.stream_options={include_usage:!0}),i.temperature!==void 0&&(p.temperature=i.temperature),i.top_p!==void 0&&(p.top_p=i.top_p),f&&a&&(chrome.runtime.sendMessage({type:`STREAM_START`,sessionId:a,callId:s}).catch(()=>{}),r.debug(`[Background] STREAM_START sent (API call with before )`)),Ta(u,{method:`POST`,headers:{Authorization:`Bearer ${c.apiKey}`,"Content-Type":`application/json`},body:JSON.stringify(p),signal:l},c.reactConfig.apiTimeout,c.reactConfig.apiRetryCount,c.reactConfig.apiRetryBaseDelay,(e,t,n)=>{r.warn(`[Background] API retry (${e}/${c.reactConfig.apiRetryCount}) scheduled in ${n}ms:`,t.message),a&&chrome.runtime.sendMessage({type:`API_RETRYING`,sessionId:a,callId:s,attempt:e,maxRetries:c.reactConfig.apiRetryCount,delay:n}).catch(()=>{})}).then(async e=>{if(!e.ok){let t=await e.text();throw r.error(`[Background] API response error:`,e.status,t),Error(`HTTP error! status: ${e.status}, message: ${t.substring(0,500)}`)}if(f&&e.body){let t=new Ft(a,c.streamConfig,{...o,callId:s,preStarted:!0}),n=await It(e.body.getReader(),t,l);return r.debug(`[Background] streaming API responsecomplete,content length:`,n.content.length,`usage:`,n.usage),{content:n.content,usage:n.usage,reasoningContent:n.reasoningContent}}let n=await e.text();r.debug(`[Background] non-streaming API responsestate:`,e.status,`text length:`,n.length,`preview:`,n.substring(0,200));try{let e=JSON.parse(n);return r.debug(`[Background] API response:`,JSON.stringify(e).substring(0,200)),{content:e.choices?.[0]?.message?.content||``,usage:e.usage||null}}catch(i){throw r.error(`[Background] JSON parse failed,originalresponse:`,n.substring(0,500)),Error(t(`reactLoop.jsonParseFailed`,{status:e.status,error:i.message,preview:n.substring(0,100)}))}}).catch(e=>{throw e.name===`AbortError`?r.debug(`[Background] API call with by usercancel`):r.error(`[Background] API call with failed:`,e.message||e),e})})}e(`zh`,{agentDispatcher:{depthLimitReached:`子代理嵌套层级已达上限(最多 {max} 层,当前 {current} 层)。请直接使用你自己的工具完成任务,不要再派发给其他子代理。`}}),e(`en`,{agentDispatcher:{depthLimitReached:`Sub-agent nesting depth limit reached (max {max}, current {current}). Please complete the task directly using your own tools instead of dispatching to another sub-agent.`}});var Bn=2,Vn=new Map;async function Hn(e){return ae.find(t=>t.id===e)||((await chrome.storage.local.get([`customAgents`])).customAgents||[]).find(t=>t.id===e)||null}async function Un(e,t){let n=e.systemPrompt||``;n.trim()||(n=`You are an AI assistant. Please complete the following task.`);try{let t=``;e.skillIds!=null&&Array.isArray(e.skillIds)&&e.skillIds.length>0?t=(await wt(e.skillIds)).prompts||``:e.skillIds??(t=(await Ct()).prompts||``),t&&(n+=`
99
99
 
100
100
  `+t)}catch{}return`${n}
101
101
 
@@ -106,13 +106,13 @@ ${t}
106
106
  - You are a sub-agent; only complete the task assigned to you
107
107
  - Use your available tools to complete the task efficiently
108
108
  - Return the result directly after completion; no extra confirmation is needed
109
- - Current time: ${new Date().toLocaleString(`zh-CN`)}`}async function wn(e,n,i){let a=xn.get(i)??0;if(a>=bn)return r.warn(`[AgentDispatcher] dispatch depth limit reached: depth=${a}, max=${bn}, sessionId=${i}`),{success:!1,error:t(`agentDispatcher.depthLimitReached`,{max:bn,current:a}),tool_call_id:n};let o=e.subAgentId||e.agent_id||e.sub_agent_id,s=e.task;if(!o||!s)return{success:!1,error:`Missing parameters: subAgentId/sub_agent_id and task are both required`,tool_call_id:n};r.debug(`[AgentDispatcher] dispatchsub Agent:`,o,`task:`,s.substring(0,100));let c=await Sn(o);if(!c)return{success:!1,error:`Sub-agent not found: ${o}`,tool_call_id:n};r.debug(`[AgentDispatcher] sub Agent:`,c.name);let l=await Mi(c.toolIds,c.id,c.skillIds,null,c.mcpExcludedServerIds??null);r.debug(`[AgentDispatcher] sub Agent tool count :`,l.length);let u=[{role:`system`,content:await Cn(c,s)}],d=await R(),f=i?`${i}_sub_${o}`:`sub_${o}`;xn.set(f,a+1);let p={temperature:c.temperature!==null&&c.temperature!==void 0?c.temperature:d.temperature===void 0?.2:d.temperature,top_p:c.topP!==null&&c.topP!==void 0?c.topP:d.topP===void 0?1:d.topP},m=c.model||d.modelName||`deepseek-v4-pro`;try{let e;if(l.length>0){r.debug(`[AgentDispatcher] sub Agent using ReAct mode,tool count :`,l.length,`subSessionId:`,f);let t=await pn(u,m,l,null,p,f,{type:`subagent`,agentId:o},null,{value:0});e=t.content===void 0?t:t.content}else{r.debug(`[AgentDispatcher] sub Agent using non-streamingmode ( no tool), subSessionId:`,f);let t=await yn(u,m,p,f);e=t.content===void 0?t:t.content}let t=4e3,i=typeof e==`string`&&e.length>t?e.substring(0,t)+`
109
+ - Current time: ${new Date().toLocaleString(`zh-CN`)}`}async function Wn(e,n,i){let a=Vn.get(i)??0;if(a>=Bn)return r.warn(`[AgentDispatcher] dispatch depth limit reached: depth=${a}, max=${Bn}, sessionId=${i}`),{success:!1,error:t(`agentDispatcher.depthLimitReached`,{max:Bn,current:a}),tool_call_id:n};let o=e.subAgentId||e.agent_id||e.sub_agent_id,s=e.task;if(!o||!s)return{success:!1,error:`Missing parameters: subAgentId/sub_agent_id and task are both required`,tool_call_id:n};r.debug(`[AgentDispatcher] dispatchsub Agent:`,o,`task:`,s.substring(0,100));let c=await Hn(o);if(!c)return{success:!1,error:`Sub-agent not found: ${o}`,tool_call_id:n};r.debug(`[AgentDispatcher] sub Agent:`,c.name);let l=await Qi(c.toolIds,c.id,c.skillIds,null,c.mcpExcludedServerIds??null);r.debug(`[AgentDispatcher] sub Agent tool count :`,l.length);let u=[{role:`system`,content:await Un(c,s)}],d=await B(),f=i?`${i}_sub_${o}`:`sub_${o}`;Vn.set(f,a+1);let p={temperature:c.temperature!==null&&c.temperature!==void 0?c.temperature:d.temperature===void 0?.2:d.temperature,top_p:c.topP!==null&&c.topP!==void 0?c.topP:d.topP===void 0?1:d.topP},m=c.model||d.modelName||`deepseek-v4-pro`;try{let e;if(l.length>0){r.debug(`[AgentDispatcher] sub Agent using ReAct mode,tool count :`,l.length,`subSessionId:`,f);let t=await Nn(u,m,l,null,p,f,{type:`subagent`,agentId:o},null,{value:0});e=t.content===void 0?t:t.content}else{r.debug(`[AgentDispatcher] sub Agent using non-streamingmode ( no tool), subSessionId:`,f);let t=await zn(u,m,p,f);e=t.content===void 0?t:t.content}let t=4e3,i=typeof e==`string`&&e.length>t?e.substring(0,t)+`
110
110
 
111
- ... (result truncated)`:e;return r.debug(`[AgentDispatcher] sub Agent execution complete:`,c.name,`result length:`,typeof i==`string`?i.length:`N/A`),{success:!0,content:`## Sub-agent [${c.name}] Execution Result\n\n${i}`,tool_call_id:n}}catch(e){return r.error(`[AgentDispatcher] sub Agent execution failed:`,e),{success:!1,error:`Sub-agent [${c.name}] execution failed: ${e.message||e}`,tool_call_id:n}}finally{xn.delete(f)}}function Tn(e,t){let n=`screenshot_${new Date().toISOString().replace(/[:.]/g,`-`).slice(0,19)}.${t===`png`?`png`:`jpg`}`;chrome.downloads.download({url:e,filename:`Downloads/`+n,saveAs:!1},e=>{chrome.runtime.lastError?r.error(`[Background] download failed:`,chrome.runtime.lastError.message):r.debug(`[Background] screenshottriggerdownload,ID:`,e,`filename:`,n)})}e(`zh`,{toolHelpers:{operationFailed:`操作失败: {error}`,unknownResultFormat:`未知结果格式`,cannotAccessTab:`无法访问该标签页: {message}`,cannotUseOnSystemPage:`无法在系统页面使用工具: {url}`,contentScriptNotFound:`无法找到 content script 文件`,injectContentScriptFailed:`注入 Content Script 失败: {message}`}}),e(`en`,{toolHelpers:{operationFailed:`Operation failed: {error}`,unknownResultFormat:`Unknown result format`,cannotAccessTab:`Cannot access this tab: {message}`,cannotUseOnSystemPage:`Cannot use tools on system pages: {url}`,contentScriptNotFound:`Cannot find content script file`,injectContentScriptFailed:`Failed to inject Content Script: {message}`}});function En(e){if(!e||typeof e!=`string`)return e;let t=!1,n=!1,r=[];for(let i=0;i<e.length;i++){let a=e[i];if(n){n=!1;continue}if(a===`\\`&&t){n=!0;continue}if(a===`"`&&!n){t=!t;continue}if(!t){if(a===`{`||a===`[`||a===`(`)r.push(a);else if(a===`}`||a===`]`||a===`)`){let e=a===`}`?`{`:a===`]`?`[`:`(`;r.length>0&&r[r.length-1]===e&&r.pop()}}}let i=e;t&&(i+=`"`),i=i.replace(/,\s*$/,``);let a={"{":`}`,"[":`]`,"(":`)`};for(;r.length>0;){let e=r.pop();i+=a[e]}return i}function Dn(e){if(!e||typeof e!=`string`)return e;let t=[],n=!1,r=!1,i=[],a=0;for(;a<e.length;){let o=e[a];if(r){t.push(o),r=!1,a++;continue}if(o===`\\`&&n){t.push(o),r=!0,a++;continue}if(o===`"`&&i.length>0&&i[i.length-1]===`[`){let t=e.substring(a).match(/^"[^"]+"\s*:\s*(true|false|null|-?\d+(?:\.\d+)?|"[^"]*")/);if(t){for(a+=t[0].length;a<e.length&&`
111
+ ... (result truncated)`:e;return r.debug(`[AgentDispatcher] sub Agent execution complete:`,c.name,`result length:`,typeof i==`string`?i.length:`N/A`),{success:!0,content:`## Sub-agent [${c.name}] Execution Result\n\n${i}`,tool_call_id:n}}catch(e){return r.error(`[AgentDispatcher] sub Agent execution failed:`,e),{success:!1,error:`Sub-agent [${c.name}] execution failed: ${e.message||e}`,tool_call_id:n}}finally{Vn.delete(f)}}function Gn(e,t){let n=`screenshot_${new Date().toISOString().replace(/[:.]/g,`-`).slice(0,19)}.${t===`png`?`png`:`jpg`}`;chrome.downloads.download({url:e,filename:`Downloads/`+n,saveAs:!1},e=>{chrome.runtime.lastError?r.error(`[Background] download failed:`,chrome.runtime.lastError.message):r.debug(`[Background] screenshottriggerdownload,ID:`,e,`filename:`,n)})}e(`zh`,{toolHelpers:{operationFailed:`操作失败: {error}`,unknownResultFormat:`未知结果格式`,cannotAccessTab:`无法访问该标签页: {message}`,cannotUseOnSystemPage:`无法在系统页面使用工具: {url}`,contentScriptNotFound:`无法找到 content script 文件`,injectContentScriptFailed:`注入 Content Script 失败: {message}`}}),e(`en`,{toolHelpers:{operationFailed:`Operation failed: {error}`,unknownResultFormat:`Unknown result format`,cannotAccessTab:`Cannot access this tab: {message}`,cannotUseOnSystemPage:`Cannot use tools on system pages: {url}`,contentScriptNotFound:`Cannot find content script file`,injectContentScriptFailed:`Failed to inject Content Script: {message}`}});function Kn(e){if(!e||typeof e!=`string`)return e;let t=!1,n=!1,r=[];for(let i=0;i<e.length;i++){let a=e[i];if(n){n=!1;continue}if(a===`\\`&&t){n=!0;continue}if(a===`"`&&!n){t=!t;continue}if(!t){if(a===`{`||a===`[`||a===`(`)r.push(a);else if(a===`}`||a===`]`||a===`)`){let e=a===`}`?`{`:a===`]`?`[`:`(`;r.length>0&&r[r.length-1]===e&&r.pop()}}}let i=e;t&&(i+=`"`),i=i.replace(/,\s*$/,``);let a={"{":`}`,"[":`]`,"(":`)`};for(;r.length>0;){let e=r.pop();i+=a[e]}return i}function qn(e){if(!e||typeof e!=`string`)return e;let t=[],n=!1,r=!1,i=[],a=0;for(;a<e.length;){let o=e[a];if(r){t.push(o),r=!1,a++;continue}if(o===`\\`&&n){t.push(o),r=!0,a++;continue}if(o===`"`&&i.length>0&&i[i.length-1]===`[`){let t=e.substring(a).match(/^"[^"]+"\s*:\s*(true|false|null|-?\d+(?:\.\d+)?|"[^"]*")/);if(t){for(a+=t[0].length;a<e.length&&`
112
112
  \r`.includes(e[a]);)a++;for(a<e.length&&e[a]===`,`&&a++;a<e.length&&`
113
- \r`.includes(e[a]);)a++;continue}}if(o===`"`){n=!n,t.push(o),a++;continue}if(n){t.push(o),a++;continue}if(o===`{`||o===`[`){i.push(o),t.push(o),a++;continue}if(o===`}`||o===`]`){i.length>0&&i.pop(),t.push(o),a++;continue}t.push(o),a++}let o=t.join(``);return o=o.replace(/,\s*,/g,`,`),o=o.replace(/,\s*([}\]])/g,`$1`),o=o.replace(/\[\s*,/g,`[`),o=o.replace(/,\s*\]/g,`]`),o}function On(e){let t=e;for(let e=0;e<4;e++){let e;try{return JSON.parse(t),t}catch(n){let r=/position\s+(\d+)/.exec(n.message);if(!r)return t;e=Number(r[1])}let n=Math.max(0,e-40),r=t.slice(n,e+2),i=/(?<!\\)\\"(?=\s*(?:[,}\]]|"(?:[^"\\]|\\.)*"\s*:))/g,a=-1,o;for(;(o=i.exec(r))!==null;)a=o.index;if(a<0)return t;let s=n+a;t=t.slice(0,s)+`"`+t.slice(s+2)}return t}function kn(e){if(e&&typeof e==`object`)return e;if(!e||typeof e!=`string`)return null;let t=e.trim();if(!t)return null;try{return JSON.parse(t)}catch{r.warn(`[Background] tool parameterdirectparse failed,attemptrepair...`)}if(t.length>102400)return r.warn(`[Background] tool parameteroverlong (`+t.length+` chars),skip regexrepair`),null;let n=t;n=On(n);try{let e=JSON.parse(n);return r.debug(`[Background] tool parameterposition-guidedrepair successful:`,e),e}catch{}n=n.replace(/,\s*([}\]])/g,`$1`),n=n.replace(/"([^"]+)":\s*([^",\{\}\[\]]+?)(\s*[,}\]])/g,(e,t,n,r)=>{let i=n.trim();return/^(true|false|null|-?\d+(\.\d+)?)$/.test(i)?e:`"${t}": "${i.replace(/"/g,`\\"`)}"${r}`});let i,a=0;do i=n,a++,n=n.replace(/"([^"]+)":\s*([^",\{\}\[\]]+?)(\s*[,}\]])/g,(e,t,n,r)=>{let i=n.trim();return/^(true|false|null|-?\d+(\.\d+)?)$/.test(i)?e:`"${t}": "${i.replace(/"/g,`\\"`)}"${r}`});while(n!==i&&a<10);if(a>=10&&n!==i)return r.warn(`[Background] tool parameterrepair iterationreach to limit (10 times),stop repair`),null;n=n.replace(/"([^"]+)":\s*"([^"]*)(")([^"]*)"/g,(e,t,n,r,i)=>`"${t}": "${n}\\"${i}"`),n=En(n),n=Dn(n);try{let e=JSON.parse(n);return r.debug(`[Background] tool parameterrepairparse successful:`,e),e}catch(e){return r.error(`[Background] tool parameterrepairparse also failed:`,e,`after repaircharsstring:`,n.substring(0,200)),null}}function U(e,t,n={}){return{success:e,content:t,...n}}function An(){return new Promise(e=>{chrome.tabs.query({active:!0,currentWindow:!0},t=>{e(t&&t.length>0?t[0].id:null)})})}e(`zh`,{toolMemory:{missingAction:`缺少 action 参数`,missingType:`缺少 type 参数`,missingContent:`缺少 content 参数`,readFailed:`读取记忆文件失败: {error}`,writeFailed:`写入记忆文件失败: {error}`,parseFailed:`记忆文件解析失败: {error}`,updatedDuplicate:`已更新已有记忆: {id}(内容相同,已合并)`,added:`已添加记忆: {id} ({type}){warning}`,nearLimitWarning:`
113
+ \r`.includes(e[a]);)a++;continue}}if(o===`"`){n=!n,t.push(o),a++;continue}if(n){t.push(o),a++;continue}if(o===`{`||o===`[`){i.push(o),t.push(o),a++;continue}if(o===`}`||o===`]`){i.length>0&&i.pop(),t.push(o),a++;continue}t.push(o),a++}let o=t.join(``);return o=o.replace(/,\s*,/g,`,`),o=o.replace(/,\s*([}\]])/g,`$1`),o=o.replace(/\[\s*,/g,`[`),o=o.replace(/,\s*\]/g,`]`),o}function Jn(e){let t=e;for(let e=0;e<4;e++){let e;try{return JSON.parse(t),t}catch(n){let r=/position\s+(\d+)/.exec(n.message);if(!r)return t;e=Number(r[1])}let n=Math.max(0,e-40),r=t.slice(n,e+2),i=/(?<!\\)\\"(?=\s*(?:[,}\]]|"(?:[^"\\]|\\.)*"\s*:))/g,a=-1,o;for(;(o=i.exec(r))!==null;)a=o.index;if(a<0)return t;let s=n+a;t=t.slice(0,s)+`"`+t.slice(s+2)}return t}function Yn(e){if(e&&typeof e==`object`)return e;if(!e||typeof e!=`string`)return null;let t=e.trim();if(!t)return null;try{return JSON.parse(t)}catch{r.warn(`[Background] tool parameterdirectparse failed,attemptrepair...`)}if(t.length>102400)return r.warn(`[Background] tool parameteroverlong (`+t.length+` chars),skip regexrepair`),null;let n=t;n=Jn(n);try{let e=JSON.parse(n);return r.debug(`[Background] tool parameterposition-guidedrepair successful:`,e),e}catch{}n=n.replace(/,\s*([}\]])/g,`$1`),n=n.replace(/"([^"]+)":\s*([^",\{\}\[\]]+?)(\s*[,}\]])/g,(e,t,n,r)=>{let i=n.trim();return/^(true|false|null|-?\d+(\.\d+)?)$/.test(i)?e:`"${t}": "${i.replace(/"/g,`\\"`)}"${r}`});let i,a=0;do i=n,a++,n=n.replace(/"([^"]+)":\s*([^",\{\}\[\]]+?)(\s*[,}\]])/g,(e,t,n,r)=>{let i=n.trim();return/^(true|false|null|-?\d+(\.\d+)?)$/.test(i)?e:`"${t}": "${i.replace(/"/g,`\\"`)}"${r}`});while(n!==i&&a<10);if(a>=10&&n!==i)return r.warn(`[Background] tool parameterrepair iterationreach to limit (10 times),stop repair`),null;n=n.replace(/"([^"]+)":\s*"([^"]*)(")([^"]*)"/g,(e,t,n,r,i)=>`"${t}": "${n}\\"${i}"`),n=Kn(n),n=qn(n);try{let e=JSON.parse(n);return r.debug(`[Background] tool parameterrepairparse successful:`,e),e}catch(e){return r.error(`[Background] tool parameterrepairparse also failed:`,e,`after repaircharsstring:`,n.substring(0,200)),null}}function H(e,t,n={}){return{success:e,content:t,...n}}function Xn(){return new Promise(e=>{chrome.tabs.query({active:!0,currentWindow:!0},t=>{e(t&&t.length>0?t[0].id:null)})})}e(`zh`,{toolMemory:{missingAction:`缺少 action 参数`,missingType:`缺少 type 参数`,missingContent:`缺少 content 参数`,readFailed:`读取记忆文件失败: {error}`,writeFailed:`写入记忆文件失败: {error}`,parseFailed:`记忆文件解析失败: {error}`,updatedDuplicate:`已更新已有记忆: {id}(内容相同,已合并)`,added:`已添加记忆: {id} ({type}){warning}`,nearLimitWarning:`
114
114
  ⚠️ 记忆数量接近上限(事实: {facts}/{maxFacts}, 摘要: {summaries}/{maxSummaries}),建议调用 agent_memory action=manage 进行审查整理。`,updateNeedsId:`update 操作需要 memoryId 参数`,deleteNeedsId:`delete 操作需要 memoryId 参数`,typeMismatch:`记忆 {id} 类型不匹配(实际类型: {type})`,notFound:`未找到记忆: {id}`,updated:`已更新记忆: {id}`,deleted:`已删除记忆: {id}`,unsupportedAction:`不支持的操作: {action}`,storeMissingSubAction:`store 操作缺少 subAction (add/update/delete)`,manageMissingSubAction:`manage 操作缺少 subAction (review/compact)`,unsupportedMemoryAction:`不支持的 action: {action}`,memoryEmpty:`记忆文件为空,暂无存储的记忆。`,noMatch:`未找到匹配的记忆。`,foundResults:`找到 {count} 条相关记忆:{note}`,recallNoteAllOld:`(注:以上记忆在本对话中已检索过,此处为重复返回)`,recallNoteMixed:`(注:{oldCount} 条记忆在本对话中已检索过,仅返回新的 {newCount} 条)`,compactDone:`记忆压缩完成。移除了 {facts} 条事实记忆和 {summaries} 条摘要记忆(价值低于 {threshold})。当前: 事实 {totalFacts}, 摘要 {totalSummaries}`,reviewTitle:`## 记忆审查报告`,reviewOverview:`**概况**: 事实 {facts}/{maxFacts}, 摘要 {summaries}/{maxSummaries}`,reviewLastReview:`**上次审查**: {date}`,reviewNeverReviewed:`从未审查`,reviewCandidates:`**低价值记忆候选** (价值 < {threshold}):`,reviewNoCandidates:`无候选淘汰项,所有记忆价值良好。`,reviewSuggestion:`**建议操作**:`,reviewSuggestionDelete:`- 对于确实过时/不再适用的记忆,使用 agent_memory action=store subAction=delete 删除`,reviewSuggestionMerge:`- 对于内容相似的记忆,使用 agent_memory action=store subAction=update 合并`,reviewSuggestionKeep:`- 对于仍有用但价值低的记忆,可保留不做处理`,factLabel:`事实`,summaryLabel:`摘要`,neverAccessed:`从未`,memoryItemHeader:`**{index}. [{type}] {id}**`,memoryItemContent:` 内容: {content}`,memoryItemTitle:` 标题: {title}`,memoryItemTags:` 标签: {tags}`,memoryItemStats:` 重要性: {importance}/10 | 访问: {accessCount}次 | 创建: {createdAt}`,reviewItemCreated:` 创建: {createdAt} | 最后访问: {lastAccess} | 访问: {accessCount}次`}}),e(`en`,{toolMemory:{missingAction:`Missing action parameter`,missingType:`Missing type parameter`,missingContent:`Missing content parameter`,readFailed:`Failed to read memory file: {error}`,writeFailed:`Failed to write memory file: {error}`,parseFailed:`Memory file parse failed: {error}`,updatedDuplicate:`Updated existing memory: {id} (content identical, merged)`,added:`Added memory: {id} ({type}){warning}`,nearLimitWarning:`
115
- ⚠️ Memory count approaching limit (facts: {facts}/{maxFacts}, summaries: {summaries}/{maxSummaries}). Consider calling agent_memory action=manage to review and clean up.`,updateNeedsId:`update action requires memoryId parameter`,deleteNeedsId:`delete action requires memoryId parameter`,typeMismatch:`Memory {id} type mismatch (actual type: {type})`,notFound:`Memory not found: {id}`,updated:`Updated memory: {id}`,deleted:`Deleted memory: {id}`,unsupportedAction:`Unsupported action: {action}`,storeMissingSubAction:`store action missing subAction (add/update/delete)`,manageMissingSubAction:`manage action missing subAction (review/compact)`,unsupportedMemoryAction:`Unsupported action: {action}`,memoryEmpty:`Memory file is empty, no stored memories.`,noMatch:`No matching memories found.`,foundResults:`Found {count} relevant memories:{note}`,recallNoteAllOld:`(Note: The above memories have already been retrieved in this conversation, returned again)`,recallNoteMixed:`(Note: {oldCount} memories already retrieved in this conversation, only returning {newCount} new ones)`,compactDone:`Memory compaction complete. Removed {facts} fact memories and {summaries} summary memories (value below {threshold}). Current: facts {totalFacts}, summaries {totalSummaries}`,reviewTitle:`## Memory Review Report`,reviewOverview:`**Overview**: Facts {facts}/{maxFacts}, Summaries {summaries}/{maxSummaries}`,reviewLastReview:`**Last review**: {date}`,reviewNeverReviewed:`Never reviewed`,reviewCandidates:`**Low-value memory candidates** (value < {threshold}):`,reviewNoCandidates:`No candidates for removal, all memories have good value.`,reviewSuggestion:`**Suggested actions**:`,reviewSuggestionDelete:`- For outdated/no longer applicable memories, use agent_memory action=store subAction=delete to remove`,reviewSuggestionMerge:`- For similar memories, use agent_memory action=store subAction=update to merge`,reviewSuggestionKeep:`- For still useful but low-value memories, keep them as-is`,factLabel:`Fact`,summaryLabel:`Summary`,neverAccessed:`Never`,memoryItemHeader:`**{index}. [{type}] {id}**`,memoryItemContent:` Content: {content}`,memoryItemTitle:` Title: {title}`,memoryItemTags:` Tags: {tags}`,memoryItemStats:` Importance: {importance}/10 | Access: {accessCount} times | Created: {createdAt}`,reviewItemCreated:` Created: {createdAt} | Last access: {lastAccess} | Access: {accessCount} times`}});var jn=null;async function Mn(){for(;jn;)await jn;let e;return jn=new Promise(t=>{e=t}),()=>{e&&=(e(),jn=null,null)}}var Nn=`~/.ai-helper-agent/memory/global-memory.json`,Pn={version:1,updatedAt:new Date().toISOString(),stats:{totalFacts:0,totalSummaries:0,lastReviewAt:null},facts:[],summaries:[],meta:{maxFacts:50,maxSummaries:20,reviewThreshold:.8}};async function Fn(){let e=await qe(Nn);if(!e.success)return e.error&&(e.error.includes(`ENOENT`)||e.error.includes(`File does not exist`)||e.error.includes(`文件不存在`))?{success:!0,data:{...Pn,updatedAt:new Date().toISOString()}}:{success:!1,error:e.error};try{let t=JSON.parse(e.content);return{success:!0,data:{...Pn,...t,meta:{...Pn.meta,...t.meta||{}}}}}catch(e){return{success:!1,error:t(`toolMemory.parseFailed`,{error:e.message})}}}async function In(e){return e.updatedAt=new Date().toISOString(),e.stats.totalFacts=(e.facts||[]).length,e.stats.totalSummaries=(e.summaries||[]).length,e.version=e.version||1,Ye(Nn,JSON.stringify(e,null,2))}function Ln(e){return`${e===`fact`?`fact`:`sum`}_${Date.now().toString(36)}_${Math.random().toString(36).substring(2,6)}`}function Rn(e,t){let n=e.importance||5,r=e.accessCount||0,i=(t-new Date(e.createdAt).getTime())/864e5,a;return a=i<=7?1:i<=30?.8:i<=90?.5:.2,n*(1+Math.log(r+1))*a}async function zn(e){let t=await Mn();try{return await e()}finally{t()}}async function Bn(e,n){let{action:r,type:i,category:a,content:o,title:s,tags:c,importance:l,memoryId:u,sourceSessionId:d}=e;return r?!i&&r!==`delete`?U(!1,t(`toolMemory.missingType`),n):!o&&r!==`delete`?U(!1,t(`toolMemory.missingContent`),n):zn(async()=>{let e=await Fn();if(!e.success)return U(!1,t(`toolMemory.readFailed`,{error:e.error}),n);let f=e.data,p=new Date().toISOString(),m=i===`fact`?f.facts:f.summaries;if(r===`add`){let e={id:Ln(i),type:i,category:a||`custom`,content:o,tags:c||[],importance:l||5,accessCount:0,lastAccessAt:null,createdAt:p,updatedAt:p,sourceSessionId:d||null};i===`summary`&&s&&(e.title=s);let r=m.find(e=>e.content===o&&e.type===i);if(r){r.updatedAt=p,r.tags=c||r.tags,r.importance=l||r.importance,r.sourceSessionId=d||r.sourceSessionId;let e=await In(f);return e.success?{...U(!0,t(`toolMemory.updatedDuplicate`,{id:r.id}),n),memory:r,action:`updated`,stats:f.stats}:U(!1,t(`toolMemory.writeFailed`,{error:e.error}),n)}m.push(e);let u=await In(f);if(!u.success)return U(!1,t(`toolMemory.writeFailed`,{error:u.error}),n);let h=f.meta.maxFacts,g=f.meta.maxSummaries,_=f.facts.length/h,v=f.summaries.length/g,y=``;return(_>=.8||v>=.8)&&(y=t(`toolMemory.nearLimitWarning`,{facts:f.facts.length,maxFacts:h,summaries:f.summaries.length,maxSummaries:g})),{...U(!0,t(`toolMemory.added`,{id:e.id,type:i,warning:y}),n),memory:e,action:`added`,stats:f.stats}}if(r===`update`){if(!u)return U(!1,t(`toolMemory.updateNeedsId`),n);let e=m.findIndex(e=>e.id===u);if(e===-1){let e=i===`fact`?f.summaries:f.facts,r=e.findIndex(e=>e.id===u);return r===-1?U(!1,t(`toolMemory.notFound`,{id:u}),n):U(!1,t(`toolMemory.typeMismatch`,{id:u,type:e[r].type}),n)}let r=m[e];o!==void 0&&(r.content=o),c!==void 0&&(r.tags=c),l!==void 0&&(r.importance=l),a!==void 0&&(r.category=a),i===`summary`&&s!==void 0&&(r.title=s),r.updatedAt=p;let d=await In(f);return d.success?{...U(!0,t(`toolMemory.updated`,{id:u}),n),memory:r,action:`updated`,stats:f.stats}:U(!1,t(`toolMemory.writeFailed`,{error:d.error}),n)}if(r===`delete`){if(!u)return U(!1,t(`toolMemory.deleteNeedsId`),n);let e=[f.facts,f.summaries];for(let r of e){let e=r.findIndex(e=>e.id===u);if(e!==-1){let i=r.splice(e,1)[0];Hn(u);let a=await In(f);return a.success?{...U(!0,t(`toolMemory.deleted`,{id:u}),n),removed:i,stats:f.stats}:U(!1,t(`toolMemory.writeFailed`,{error:a.error}),n)}}return U(!1,t(`toolMemory.notFound`,{id:u}),n)}return U(!1,t(`toolMemory.unsupportedAction`,{action:r}),n)}):U(!1,t(`toolMemory.missingAction`),n)}var Vn=new Map;function Hn(e){for(let[t,n]of Vn.entries())n.has(e)&&(n.delete(e),n.size===0&&Vn.delete(t))}async function Un(e,n,i){let{query:a,tags:o,memoryType:s=`all`,limit:c=10}=e;return zn(async()=>{let e=await Fn();if(!e.success)return U(!1,t(`toolMemory.readFailed`,{error:e.error}),n);let l=e.data,u=[];if((s===`all`||s===`fact`)&&u.push(...l.facts.map(e=>({...e,_source:`facts`}))),(s===`all`||s===`summary`)&&u.push(...l.summaries.map(e=>({...e,_source:`summaries`}))),u.length===0)return{...U(!0,t(`toolMemory.memoryEmpty`),n),results:[],total:0};if(o&&o.length>0&&(u=u.filter(e=>{let t=(e.tags||[]).map(e=>e.toLowerCase());return o.some(e=>t.includes(e.toLowerCase()))})),a&&a.trim()){let e=new Set(`的.是.了.在.我.你.他.她.它.们.这.那.不.也.就.都.会.要.能.可.把.被.让.给.对.从.到.和.与.或.但.而.还.又.只.很.更.最.有.没.吗.呢.吧.啊.什么.怎么.为什么.哪里.哪个.多少.the.a.an.is.are.was.were.be.been.being.have.has.had.do.does.did.will.would.could.should.may.might.can.shall.must.need.dare.this.that.these.those.it.its.they.them.their.in.on.at.to.for.of.with.by.from.as.into.and.or.not.but.if.then.else.when.where.why.how.so.no.up.out.just.now.here.there.all.each.every`.split(`.`));function t(t){let n=t.toLowerCase().trim(),r=n.length>200?n.slice(0,200):n,i=r.split(/([\u4e00-\u9fff\u3400-\u4dbf\uf900-\ufaff]+|[a-z]+|\d+|[^a-z\d\u4e00-\u9fff\u3400-\u4dbf\uf900-\ufaff]+)/i),a=[];r.length>=2&&a.push(r);for(let e of i)if(!(!e||e.trim().length===0)){if(/^[\u4e00-\u9fff\u3400-\u4dbf\uf900-\ufaff]+$/.test(e)){if(e.length<=4)a.push(e);else for(let t=0;t<=e.length-2;t++)a.push(e.substring(t,t+2))}else/^[a-z\d]+$/.test(e)&&e.length>=2&&a.push(e)}return[...new Set(a)].filter(t=>t.length>=1&&!e.has(t)).slice(0,30)}let n=t(a),r=a.toLowerCase().trim();if(n.length>0&&(u=u.map(e=>{let t=0,i=(e.content||``).toLowerCase(),a=(e.title||``).toLowerCase(),o=(e.tags||[]).map(e=>e.toLowerCase());for(let e of n)i.includes(e)&&(t+=3),a.includes(e)&&(t+=2),o.some(t=>t.includes(e))&&(t+=2);return r.length>=2&&(i.includes(r)&&(t+=5),a.includes(r)&&(t+=3)),{memory:e,score:t}}).filter(e=>e.score>0).sort((e,t)=>t.score-e.score).map(e=>e.memory),u.length===0&&r.length>=2)){let e=u.filter(e=>{let t=(e.content||``).toLowerCase(),n=(e.title||``).toLowerCase();return t.includes(r)||n.includes(r)}).map(e=>({memory:e,score:5})).sort((e,t)=>t.score-e.score).map(e=>e.memory);e.length>0&&(u=e)}}let d=new Set,f=u.filter(e=>!d.has(e.id)&&(d.add(e.id),!0)).slice(0,c),p=``;if(i){let e=Vn.get(i);if(e&&e.size>0){let n=[],r=[];for(let t of f)e.has(t.id)?r.push(t):n.push(t);n.length===0&&r.length>0?(p=t(`toolMemory.recallNoteAllOld`),f=r):n.length>0&&(r.length>0&&(p=t(`toolMemory.recallNoteMixed`,{oldCount:r.length,newCount:n.length})),f=n)}}if(i&&f.length>0){Vn.has(i)||Vn.set(i,new Set);let e=Vn.get(i);for(let t of f)e.add(t.id)}for(let e of f){let t=(e._source===`facts`?l.facts:l.summaries).find(t=>t.id===e.id);t&&(t.accessCount=(t.accessCount||0)+1,t.lastAccessAt=new Date().toISOString(),delete e._source)}try{await In(l)}catch(e){r.warn(`[Memory] update visitcount failed:`,e.message)}return{success:!0,message:f.length===0?t(`toolMemory.noMatch`):t(`toolMemory.foundResults`,{count:f.length,note:p})+`
115
+ ⚠️ Memory count approaching limit (facts: {facts}/{maxFacts}, summaries: {summaries}/{maxSummaries}). Consider calling agent_memory action=manage to review and clean up.`,updateNeedsId:`update action requires memoryId parameter`,deleteNeedsId:`delete action requires memoryId parameter`,typeMismatch:`Memory {id} type mismatch (actual type: {type})`,notFound:`Memory not found: {id}`,updated:`Updated memory: {id}`,deleted:`Deleted memory: {id}`,unsupportedAction:`Unsupported action: {action}`,storeMissingSubAction:`store action missing subAction (add/update/delete)`,manageMissingSubAction:`manage action missing subAction (review/compact)`,unsupportedMemoryAction:`Unsupported action: {action}`,memoryEmpty:`Memory file is empty, no stored memories.`,noMatch:`No matching memories found.`,foundResults:`Found {count} relevant memories:{note}`,recallNoteAllOld:`(Note: The above memories have already been retrieved in this conversation, returned again)`,recallNoteMixed:`(Note: {oldCount} memories already retrieved in this conversation, only returning {newCount} new ones)`,compactDone:`Memory compaction complete. Removed {facts} fact memories and {summaries} summary memories (value below {threshold}). Current: facts {totalFacts}, summaries {totalSummaries}`,reviewTitle:`## Memory Review Report`,reviewOverview:`**Overview**: Facts {facts}/{maxFacts}, Summaries {summaries}/{maxSummaries}`,reviewLastReview:`**Last review**: {date}`,reviewNeverReviewed:`Never reviewed`,reviewCandidates:`**Low-value memory candidates** (value < {threshold}):`,reviewNoCandidates:`No candidates for removal, all memories have good value.`,reviewSuggestion:`**Suggested actions**:`,reviewSuggestionDelete:`- For outdated/no longer applicable memories, use agent_memory action=store subAction=delete to remove`,reviewSuggestionMerge:`- For similar memories, use agent_memory action=store subAction=update to merge`,reviewSuggestionKeep:`- For still useful but low-value memories, keep them as-is`,factLabel:`Fact`,summaryLabel:`Summary`,neverAccessed:`Never`,memoryItemHeader:`**{index}. [{type}] {id}**`,memoryItemContent:` Content: {content}`,memoryItemTitle:` Title: {title}`,memoryItemTags:` Tags: {tags}`,memoryItemStats:` Importance: {importance}/10 | Access: {accessCount} times | Created: {createdAt}`,reviewItemCreated:` Created: {createdAt} | Last access: {lastAccess} | Access: {accessCount} times`}});var Zn=null;async function Qn(){for(;Zn;)await Zn;let e;return Zn=new Promise(t=>{e=t}),()=>{e&&=(e(),Zn=null,null)}}var $n=`~/.ai-helper-agent/memory/global-memory.json`,er={version:1,updatedAt:new Date().toISOString(),stats:{totalFacts:0,totalSummaries:0,lastReviewAt:null},facts:[],summaries:[],meta:{maxFacts:50,maxSummaries:20,reviewThreshold:.8}};async function tr(){let e=await Qe($n);if(!e.success)return e.error&&(e.error.includes(`ENOENT`)||e.error.includes(`File does not exist`)||e.error.includes(`文件不存在`))?{success:!0,data:{...er,updatedAt:new Date().toISOString()}}:{success:!1,error:e.error};try{let t=JSON.parse(e.content);return{success:!0,data:{...er,...t,meta:{...er.meta,...t.meta||{}}}}}catch(e){return{success:!1,error:t(`toolMemory.parseFailed`,{error:e.message})}}}async function nr(e){return e.updatedAt=new Date().toISOString(),e.stats.totalFacts=(e.facts||[]).length,e.stats.totalSummaries=(e.summaries||[]).length,e.version=e.version||1,et($n,JSON.stringify(e,null,2))}function rr(e){return`${e===`fact`?`fact`:`sum`}_${Date.now().toString(36)}_${Math.random().toString(36).substring(2,6)}`}function ir(e,t){let n=e.importance||5,r=e.accessCount||0,i=(t-new Date(e.createdAt).getTime())/864e5,a;return a=i<=7?1:i<=30?.8:i<=90?.5:.2,n*(1+Math.log(r+1))*a}async function ar(e){let t=await Qn();try{return await e()}finally{t()}}async function or(e,n){let{action:r,type:i,category:a,content:o,title:s,tags:c,importance:l,memoryId:u,sourceSessionId:d}=e;return r?!i&&r!==`delete`?H(!1,t(`toolMemory.missingType`),n):!o&&r!==`delete`?H(!1,t(`toolMemory.missingContent`),n):ar(async()=>{let e=await tr();if(!e.success)return H(!1,t(`toolMemory.readFailed`,{error:e.error}),n);let f=e.data,p=new Date().toISOString(),m=i===`fact`?f.facts:f.summaries;if(r===`add`){let e={id:rr(i),type:i,category:a||`custom`,content:o,tags:c||[],importance:l||5,accessCount:0,lastAccessAt:null,createdAt:p,updatedAt:p,sourceSessionId:d||null};i===`summary`&&s&&(e.title=s);let r=m.find(e=>e.content===o&&e.type===i);if(r){r.updatedAt=p,r.tags=c||r.tags,r.importance=l||r.importance,r.sourceSessionId=d||r.sourceSessionId;let e=await nr(f);return e.success?{...H(!0,t(`toolMemory.updatedDuplicate`,{id:r.id}),n),memory:r,action:`updated`,stats:f.stats}:H(!1,t(`toolMemory.writeFailed`,{error:e.error}),n)}m.push(e);let u=await nr(f);if(!u.success)return H(!1,t(`toolMemory.writeFailed`,{error:u.error}),n);let h=f.meta.maxFacts,g=f.meta.maxSummaries,_=f.facts.length/h,v=f.summaries.length/g,y=``;return(_>=.8||v>=.8)&&(y=t(`toolMemory.nearLimitWarning`,{facts:f.facts.length,maxFacts:h,summaries:f.summaries.length,maxSummaries:g})),{...H(!0,t(`toolMemory.added`,{id:e.id,type:i,warning:y}),n),memory:e,action:`added`,stats:f.stats}}if(r===`update`){if(!u)return H(!1,t(`toolMemory.updateNeedsId`),n);let e=m.findIndex(e=>e.id===u);if(e===-1){let e=i===`fact`?f.summaries:f.facts,r=e.findIndex(e=>e.id===u);return r===-1?H(!1,t(`toolMemory.notFound`,{id:u}),n):H(!1,t(`toolMemory.typeMismatch`,{id:u,type:e[r].type}),n)}let r=m[e];o!==void 0&&(r.content=o),c!==void 0&&(r.tags=c),l!==void 0&&(r.importance=l),a!==void 0&&(r.category=a),i===`summary`&&s!==void 0&&(r.title=s),r.updatedAt=p;let d=await nr(f);return d.success?{...H(!0,t(`toolMemory.updated`,{id:u}),n),memory:r,action:`updated`,stats:f.stats}:H(!1,t(`toolMemory.writeFailed`,{error:d.error}),n)}if(r===`delete`){if(!u)return H(!1,t(`toolMemory.deleteNeedsId`),n);let e=[f.facts,f.summaries];for(let r of e){let e=r.findIndex(e=>e.id===u);if(e!==-1){let i=r.splice(e,1)[0];cr(u);let a=await nr(f);return a.success?{...H(!0,t(`toolMemory.deleted`,{id:u}),n),removed:i,stats:f.stats}:H(!1,t(`toolMemory.writeFailed`,{error:a.error}),n)}}return H(!1,t(`toolMemory.notFound`,{id:u}),n)}return H(!1,t(`toolMemory.unsupportedAction`,{action:r}),n)}):H(!1,t(`toolMemory.missingAction`),n)}var sr=new Map;function cr(e){for(let[t,n]of sr.entries())n.has(e)&&(n.delete(e),n.size===0&&sr.delete(t))}async function lr(e,n,i){let{query:a,tags:o,memoryType:s=`all`,limit:c=10}=e;return ar(async()=>{let e=await tr();if(!e.success)return H(!1,t(`toolMemory.readFailed`,{error:e.error}),n);let l=e.data,u=[];if((s===`all`||s===`fact`)&&u.push(...l.facts.map(e=>({...e,_source:`facts`}))),(s===`all`||s===`summary`)&&u.push(...l.summaries.map(e=>({...e,_source:`summaries`}))),u.length===0)return{...H(!0,t(`toolMemory.memoryEmpty`),n),results:[],total:0};if(o&&o.length>0&&(u=u.filter(e=>{let t=(e.tags||[]).map(e=>e.toLowerCase());return o.some(e=>t.includes(e.toLowerCase()))})),a&&a.trim()){let e=new Set(`的.是.了.在.我.你.他.她.它.们.这.那.不.也.就.都.会.要.能.可.把.被.让.给.对.从.到.和.与.或.但.而.还.又.只.很.更.最.有.没.吗.呢.吧.啊.什么.怎么.为什么.哪里.哪个.多少.the.a.an.is.are.was.were.be.been.being.have.has.had.do.does.did.will.would.could.should.may.might.can.shall.must.need.dare.this.that.these.those.it.its.they.them.their.in.on.at.to.for.of.with.by.from.as.into.and.or.not.but.if.then.else.when.where.why.how.so.no.up.out.just.now.here.there.all.each.every`.split(`.`));function t(t){let n=t.toLowerCase().trim(),r=n.length>200?n.slice(0,200):n,i=r.split(/([\u4e00-\u9fff\u3400-\u4dbf\uf900-\ufaff]+|[a-z]+|\d+|[^a-z\d\u4e00-\u9fff\u3400-\u4dbf\uf900-\ufaff]+)/i),a=[];r.length>=2&&a.push(r);for(let e of i)if(!(!e||e.trim().length===0)){if(/^[\u4e00-\u9fff\u3400-\u4dbf\uf900-\ufaff]+$/.test(e)){if(e.length<=4)a.push(e);else for(let t=0;t<=e.length-2;t++)a.push(e.substring(t,t+2))}else/^[a-z\d]+$/.test(e)&&e.length>=2&&a.push(e)}return[...new Set(a)].filter(t=>t.length>=1&&!e.has(t)).slice(0,30)}let n=t(a),r=a.toLowerCase().trim();if(n.length>0&&(u=u.map(e=>{let t=0,i=(e.content||``).toLowerCase(),a=(e.title||``).toLowerCase(),o=(e.tags||[]).map(e=>e.toLowerCase());for(let e of n)i.includes(e)&&(t+=3),a.includes(e)&&(t+=2),o.some(t=>t.includes(e))&&(t+=2);return r.length>=2&&(i.includes(r)&&(t+=5),a.includes(r)&&(t+=3)),{memory:e,score:t}}).filter(e=>e.score>0).sort((e,t)=>t.score-e.score).map(e=>e.memory),u.length===0&&r.length>=2)){let e=u.filter(e=>{let t=(e.content||``).toLowerCase(),n=(e.title||``).toLowerCase();return t.includes(r)||n.includes(r)}).map(e=>({memory:e,score:5})).sort((e,t)=>t.score-e.score).map(e=>e.memory);e.length>0&&(u=e)}}let d=new Set,f=u.filter(e=>!d.has(e.id)&&(d.add(e.id),!0)).slice(0,c),p=``;if(i){let e=sr.get(i);if(e&&e.size>0){let n=[],r=[];for(let t of f)e.has(t.id)?r.push(t):n.push(t);n.length===0&&r.length>0?(p=t(`toolMemory.recallNoteAllOld`),f=r):n.length>0&&(r.length>0&&(p=t(`toolMemory.recallNoteMixed`,{oldCount:r.length,newCount:n.length})),f=n)}}if(i&&f.length>0){sr.has(i)||sr.set(i,new Set);let e=sr.get(i);for(let t of f)e.add(t.id)}for(let e of f){let t=(e._source===`facts`?l.facts:l.summaries).find(t=>t.id===e.id);t&&(t.accessCount=(t.accessCount||0)+1,t.lastAccessAt=new Date().toISOString(),delete e._source)}try{await nr(l)}catch(e){r.warn(`[Memory] update visitcount failed:`,e.message)}return{success:!0,message:f.length===0?t(`toolMemory.noMatch`):t(`toolMemory.foundResults`,{count:f.length,note:p})+`
116
116
 
117
117
  `+f.map((e,n)=>{let r=t(`toolMemory.memoryItemHeader`,{index:n+1,type:e.type===`fact`?t(`toolMemory.factLabel`):t(`toolMemory.summaryLabel`),id:e.id})+`
118
118
  `;return r+=t(`toolMemory.memoryItemContent`,{content:e.content})+`
@@ -120,7 +120,7 @@ ${t}
120
120
  `),e.tags&&e.tags.length>0&&(r+=t(`toolMemory.memoryItemTags`,{tags:e.tags.join(`, `)})+`
121
121
  `),r+=t(`toolMemory.memoryItemStats`,{importance:e.importance,accessCount:e.accessCount,createdAt:e.createdAt}),r}).join(`
122
122
 
123
- `),results:f.map(e=>{let{_source:t,...n}=e;return n}),total:f.length,query:a,tool_call_id:n}})}async function Wn(e,n){let{action:r}=e;return r?zn(async()=>{let e=await Fn();if(!e.success)return U(!1,t(`toolMemory.readFailed`,{error:e.error}),n);let i=e.data,a=Date.now();if(r===`review`){let e=[...i.facts.map(e=>({...e,_source:`facts`})),...i.summaries.map(e=>({...e,_source:`summaries`}))].map(e=>({id:e.id,type:e.type,category:e.category,content:e.content,title:e.title,tags:e.tags,importance:e.importance,accessCount:e.accessCount||0,lastAccessAt:e.lastAccessAt,createdAt:e.createdAt,value:Rn(e,a).toFixed(2),_source:e._source})).sort((e,t)=>parseFloat(e.value)-parseFloat(t.value)),r=i.facts.length,o=i.summaries.length,s=i.meta.maxFacts,c=i.meta.maxSummaries,l=e.filter(e=>parseFloat(e.value)<10);return{...U(!0,t(`toolMemory.reviewTitle`)+`
123
+ `),results:f.map(e=>{let{_source:t,...n}=e;return n}),total:f.length,query:a,tool_call_id:n}})}async function ur(e,n){let{action:r}=e;return r?ar(async()=>{let e=await tr();if(!e.success)return H(!1,t(`toolMemory.readFailed`,{error:e.error}),n);let i=e.data,a=Date.now();if(r===`review`){let e=[...i.facts.map(e=>({...e,_source:`facts`})),...i.summaries.map(e=>({...e,_source:`summaries`}))].map(e=>({id:e.id,type:e.type,category:e.category,content:e.content,title:e.title,tags:e.tags,importance:e.importance,accessCount:e.accessCount||0,lastAccessAt:e.lastAccessAt,createdAt:e.createdAt,value:ir(e,a).toFixed(2),_source:e._source})).sort((e,t)=>parseFloat(e.value)-parseFloat(t.value)),r=i.facts.length,o=i.summaries.length,s=i.meta.maxFacts,c=i.meta.maxSummaries,l=e.filter(e=>parseFloat(e.value)<10);return{...H(!0,t(`toolMemory.reviewTitle`)+`
124
124
 
125
125
  `+t(`toolMemory.reviewOverview`,{facts:r,maxFacts:s,summaries:o,maxSummaries:c})+`
126
126
  `+t(`toolMemory.reviewLastReview`,{date:i.stats.lastReviewAt||t(`toolMemory.reviewNeverReviewed`)})+`
@@ -135,7 +135,7 @@ ${t}
135
135
  `+t(`toolMemory.reviewSuggestion`)+`
136
136
  `+t(`toolMemory.reviewSuggestionDelete`)+`
137
137
  `+t(`toolMemory.reviewSuggestionMerge`)+`
138
- `+t(`toolMemory.reviewSuggestionKeep`),n),scored:e.map(e=>{let{_source:t,...n}=e;return n}),candidates:l.map(e=>{let{_source:t,...n}=e;return n}),stats:i.stats}}if(r===`compact`){let e=0,r=0;i.facts=i.facts.filter(t=>Rn(t,a)<10?(e++,!1):!0),i.summaries=i.summaries.filter(e=>Rn(e,a)<10?(r++,!1):!0),i.stats.lastReviewAt=new Date().toISOString();let o=await In(i);return o.success?{...U(!0,t(`toolMemory.compactDone`,{facts:e,summaries:r,threshold:10,totalFacts:i.stats.totalFacts,totalSummaries:i.stats.totalSummaries}),n),removedFacts:e,removedSummaries:r,stats:i.stats}:U(!1,t(`toolMemory.writeFailed`,{error:o.error}),n)}return U(!1,t(`toolMemory.unsupportedAction`,{action:r}),n)}):U(!1,t(`toolMemory.missingAction`),n)}async function Gn(e,n,r){let{action:i,subAction:a}=e;return i?i===`recall`?Un(e,n,r):i===`store`?a?Bn({...e,action:a},n):U(!1,t(`toolMemory.storeMissingSubAction`),n):i===`manage`?a?Wn({...e,action:a},n):U(!1,t(`toolMemory.manageMissingSubAction`),n):U(!1,t(`toolMemory.unsupportedMemoryAction`,{action:i}),n):U(!1,t(`toolMemory.missingAction`),n)}var Kn=[`chrome://`,`chrome-extension://`,`chrome-search://`,`edge://`,`about:`,`chrome-error://`,`view-source:`,`devtools://`],qn=[`chrome.google.com`,`chromewebstore.google.com`],Jn=new Set([``,`/`,`?`,`#`,`:`]);function Yn(e){if(!e||Kn.some(t=>e.startsWith(t)))return!0;for(let t of qn){let n=`https://${t}`;if(e.startsWith(n)&&Jn.has(e.charAt(n.length)))return!0}return!1}var Xn={Alt:1,Control:2,Ctrl:2,Meta:4,Command:4,Cmd:4,Shift:8},Zn={Enter:{keyCode:13,code:`Enter`},Tab:{keyCode:9,code:`Tab`},Escape:{keyCode:27,code:`Escape`},Esc:{keyCode:27,code:`Escape`},Backspace:{keyCode:8,code:`Backspace`},Delete:{keyCode:46,code:`Delete`},Space:{keyCode:32,code:`Space`},Home:{keyCode:36,code:`Home`},End:{keyCode:35,code:`End`},PageUp:{keyCode:33,code:`PageUp`},PageDown:{keyCode:34,code:`PageDown`},Insert:{keyCode:45,code:`Insert`},ArrowLeft:{keyCode:37,code:`ArrowLeft`},ArrowUp:{keyCode:38,code:`ArrowUp`},ArrowRight:{keyCode:39,code:`ArrowRight`},ArrowDown:{keyCode:40,code:`ArrowDown`}};for(let e=1;e<=12;e++)Zn[`F${e}`]={keyCode:111+e,code:`F${e}`};function Qn(e){if(typeof e!=`string`||!e)return null;let t=e.split(`+`).map(e=>e.trim()),n=t.pop()||``,r=0;for(let e of t){let t=Xn[e];if(!t)return null;r|=t}let i=Zn[n];if(i)return{key:n===`Esc`?`Escape`:n,code:i.code,keyCode:i.keyCode,modifiers:r};if(n.length===1){let e=n.toUpperCase(),t=e.charCodeAt(0),i=``;return/[A-Z]/.test(e)?i=`Key${e}`:/[0-9]/.test(e)&&(i=`Digit${e}`),{key:n,code:i,keyCode:t,modifiers:r}}return null}function $n(e,t){return typeof e!=`string`||e.length<=t?e:e.slice(0,t)+`...[truncated ${e.length-t} chars]`}function er(e){return{url:e.url,method:e.method,resourceType:e.resourceType,status:e.status,mimeType:e.mimeType,startedAt:e.startedAt,requestHeaders:e.requestHeaders,responseHeaders:e.responseHeaders,postData:e.postData,body:e.body,bodyTruncated:e.bodyTruncated}}var tr=new Set([`Image`,`Font`,`Media`,`Manifest`,`Other`]),nr=[`text/`,`application/json`,`application/xml`,`application/javascript`,`application/ecmascript`,`application/x-www-form-urlencoded`,`application/graphql`,`application/ld+json`,`application/manifest+json`,`image/svg+xml`];function rr(e){if(!e||tr.has(e.resourceType))return!1;let t=String(e.mimeType||``).toLowerCase();return!t||nr.some(e=>t.startsWith(e))}function ir(e){let t=atob(e),n=Uint8Array.from(t,e=>e.charCodeAt(0));return new TextDecoder(`utf-8`).decode(n)}var ar=`1.3`,or=12e4,sr=`debugger-keepalive`,cr=100,lr=20480,W=new Map,ur=!1,dr=!1,fr=class extends Error{constructor(e=`Debugger session is not attached`){super(e),this.name=`DebuggerNotAttachedError`,this.code=`DEBUGGER_NOT_ATTACHED`}},pr=class extends Error{constructor(e){super(`Cannot attach debugger to restricted page: ${e}`),this.name=`RestrictedPageError`,this.code=`DEBUGGER_RESTRICTED_PAGE`,this.url=e}};function G(e){return W.get(e)||null}function K(e,t,n={}){return new Promise((r,i)=>{try{chrome.debugger.sendCommand({tabId:e},t,n,e=>{chrome.runtime.lastError?i(Error(chrome.runtime.lastError.message)):r(e)})}catch(e){i(e)}})}function mr(e){let t=G(e);t&&(t.idleTimer&&clearTimeout(t.idleTimer),t.idleTimer=setTimeout(()=>{r.debug(`[Debugger] idle timeout, auto-detaching tab ${e}`),Sr(e,`idle_timeout`).catch(()=>{})},or))}function hr(e){e.idleTimer&&=(clearTimeout(e.idleTimer),null)}function gr(){[...W.values()].some(e=>e.attached)?chrome.alarms.create(sr,{periodInMinutes:.5}):chrome.alarms.clear(sr).catch(()=>{})}function _r(e,t,n){let r=e.tabId,i=G(r);if(!i||!i.network.recording)return;let a=i.network;if(t===`Network.requestWillBeSent`){let e=n.request||{};if(a.filter&&!String(e.url||``).includes(a.filter))return;let t={requestId:n.requestId,url:e.url||``,method:e.method||``,resourceType:n.type||``,requestHeaders:e.headers||{},postData:typeof e.postData==`string`?$n(e.postData,lr):void 0,status:null,mimeType:``,responseHeaders:null,body:null,bodyTruncated:!1,startedAt:n.timestamp||null};if(a.entries.push(t),a.reqMap.set(n.requestId,t),a.entries.length>cr){let e=a.entries.shift();e&&a.reqMap.delete(e.requestId)}return}if(t===`Network.responseReceived`){let e=a.reqMap.get(n.requestId);if(!e)return;let t=n.response||{};e.status=t.status??null,e.mimeType=t.mimeType||``,e.responseHeaders=t.headers||null;return}if(t===`Network.loadingFinished`){let e=a.reqMap.get(n.requestId);if(!e||!rr(e))return;K(r,`Network.getResponseBody`,{requestId:n.requestId}).then(t=>{let n=t.body||``;if(t.base64Encoded)try{n=ir(n)}catch{n=`[base64 body, decode failed]`}n.length>lr?(e.body=$n(n,lr),e.bodyTruncated=!0):e.body=n}).catch(()=>{})}}function vr(e,t){let n=e.tabId;r.debug(`[Debugger] detached from tab ${n}, reason: ${t}`);let i=G(n);i&&(hr(i),i.attached=!1,i.network.recording=!1,W.delete(n)),gr()}function yr(){ur||(chrome.debugger.onEvent.addListener(_r),chrome.debugger.onDetach.addListener(vr),ur=!0,chrome.alarms.onAlarm.addListener(e=>{if(e.name===sr)for(let e of W.keys())G(e)?.attached&&mr(e)}))}function br(){dr||=(chrome.tabs.onRemoved.addListener(e=>{W.has(e)&&W.delete(e)}),!0)}async function xr(e){if(G(e)?.attached)return mr(e),{tabId:e,reused:!0};let t=await chrome.tabs.get(e).catch(()=>null);if(!t)throw Error(`Tab ${e} does not exist or is not accessible`);if(Yn(t.url||``))throw new pr(t.url||``);yr(),br(),await new Promise((t,n)=>{chrome.debugger.attach({tabId:e},ar,()=>{chrome.runtime.lastError?n(Error(chrome.runtime.lastError.message)):t()})}).catch(async t=>{let n=String(t?.message||``);if(!/already attached/i.test(n))throw t;r.debug(`[Debugger] stale attach detected on tab ${e}, forcing detach + retry`),await new Promise(t=>{chrome.debugger.detach({tabId:e},()=>{chrome.runtime.lastError,t()})}),await new Promise((t,n)=>{chrome.debugger.attach({tabId:e},ar,()=>{chrome.runtime.lastError?n(Error(chrome.runtime.lastError.message)):t()})})}),W.set(e,{attached:!0,idleTimer:null,network:{recording:!1,filter:``,entries:[],reqMap:new Map}});try{await Promise.all([K(e,`Page.enable`),K(e,`Runtime.enable`),K(e,`Network.enable`)])}catch(t){throw W.delete(e),await chrome.debugger.detach({tabId:e}).catch(()=>{}),t}return mr(e),gr(),r.debug(`[Debugger] attached to tab ${e}`),{tabId:e,reused:!1}}async function Sr(e,t=`manual`){let n=G(e),i=!!n;n&&(hr(n),n.attached=!1,n.network.recording=!1,W.delete(e)),i&&await Promise.allSettled([K(e,`Emulation.clearDeviceMetricsOverride`),K(e,`Emulation.clearGeolocationOverride`),K(e,`Network.setUserAgentOverride`,{userAgent:``}),K(e,`Emulation.setTimezoneOverride`,{timezoneId:``}),K(e,`Emulation.setEmulatedMedia`,{features:[]}),K(e,`Emulation.setTouchEmulationEnabled`,{enabled:!1})]),await new Promise(t=>{chrome.debugger.detach({tabId:e},()=>{chrome.runtime.lastError,t()})}),gr(),r.debug(`[Debugger] detached from tab ${e} (${t})`)}function Cr(e){return!!G(e)?.attached}function wr(){let e=[];for(let[t,n]of W.entries())n?.attached&&e.push(t);return e}async function q(e,t,n={}){if(!G(e)?.attached)throw new fr;try{let r=await K(e,t,n);return mr(e),r}catch(t){throw/not attached|detached|No tab with id/i.test(t.message)?(G(e)&&W.delete(e),gr(),new fr(t.message)):t}}function Tr(e,t=``){let n=G(e);if(!n?.attached)throw new fr;n.network.recording=!0,n.network.filter=t||``,mr(e)}function Er(e){let t=G(e);if(!t?.attached)throw new fr;let n=t.network.entries.map(er);return t.network.entries=[],t.network.reqMap.clear(),mr(e),n}function Dr(e){let t=G(e);if(!t?.attached)throw new fr;let n=t.network.entries.map(er);return t.network={recording:!1,filter:``,entries:[],reqMap:new Map},mr(e),n}e(`zh`,{toolDebugger:{missingAction:`缺少 action 参数`,unknownAction:`不支持的 action: {action}`,unknownInputType:`不支持的 inputType: {inputType}(合法值:click/type/press/scroll)`,unknownNetworkMode:`不支持的 networkMode: {mode}(合法值:start/collect/stop)`,unknownEmulateTarget:`不支持的 emulateTarget: {target}(合法值:ua/viewport/geolocation/timezone/colorScheme/reset)`,noTab:`未找到可调试的标签页`,attachSuccess:`已附着到标签页 {tabId},调试会话已开启。
138
+ `+t(`toolMemory.reviewSuggestionKeep`),n),scored:e.map(e=>{let{_source:t,...n}=e;return n}),candidates:l.map(e=>{let{_source:t,...n}=e;return n}),stats:i.stats}}if(r===`compact`){let e=0,r=0;i.facts=i.facts.filter(t=>ir(t,a)<10?(e++,!1):!0),i.summaries=i.summaries.filter(e=>ir(e,a)<10?(r++,!1):!0),i.stats.lastReviewAt=new Date().toISOString();let o=await nr(i);return o.success?{...H(!0,t(`toolMemory.compactDone`,{facts:e,summaries:r,threshold:10,totalFacts:i.stats.totalFacts,totalSummaries:i.stats.totalSummaries}),n),removedFacts:e,removedSummaries:r,stats:i.stats}:H(!1,t(`toolMemory.writeFailed`,{error:o.error}),n)}return H(!1,t(`toolMemory.unsupportedAction`,{action:r}),n)}):H(!1,t(`toolMemory.missingAction`),n)}async function dr(e,n,r){let{action:i,subAction:a}=e;return i?i===`recall`?lr(e,n,r):i===`store`?a?or({...e,action:a},n):H(!1,t(`toolMemory.storeMissingSubAction`),n):i===`manage`?a?ur({...e,action:a},n):H(!1,t(`toolMemory.manageMissingSubAction`),n):H(!1,t(`toolMemory.unsupportedMemoryAction`,{action:i}),n):H(!1,t(`toolMemory.missingAction`),n)}var fr=[`chrome://`,`chrome-extension://`,`chrome-search://`,`edge://`,`about:`,`chrome-error://`,`view-source:`,`devtools://`],pr=[`chrome.google.com`,`chromewebstore.google.com`],mr=new Set([``,`/`,`?`,`#`,`:`]);function hr(e){if(!e||fr.some(t=>e.startsWith(t)))return!0;for(let t of pr){let n=`https://${t}`;if(e.startsWith(n)&&mr.has(e.charAt(n.length)))return!0}return!1}var gr={Alt:1,Control:2,Ctrl:2,Meta:4,Command:4,Cmd:4,Shift:8},_r={Enter:{keyCode:13,code:`Enter`},Tab:{keyCode:9,code:`Tab`},Escape:{keyCode:27,code:`Escape`},Esc:{keyCode:27,code:`Escape`},Backspace:{keyCode:8,code:`Backspace`},Delete:{keyCode:46,code:`Delete`},Space:{keyCode:32,code:`Space`},Home:{keyCode:36,code:`Home`},End:{keyCode:35,code:`End`},PageUp:{keyCode:33,code:`PageUp`},PageDown:{keyCode:34,code:`PageDown`},Insert:{keyCode:45,code:`Insert`},ArrowLeft:{keyCode:37,code:`ArrowLeft`},ArrowUp:{keyCode:38,code:`ArrowUp`},ArrowRight:{keyCode:39,code:`ArrowRight`},ArrowDown:{keyCode:40,code:`ArrowDown`}};for(let e=1;e<=12;e++)_r[`F${e}`]={keyCode:111+e,code:`F${e}`};function vr(e){if(typeof e!=`string`||!e)return null;let t=e.split(`+`).map(e=>e.trim()),n=t.pop()||``,r=0;for(let e of t){let t=gr[e];if(!t)return null;r|=t}let i=_r[n];if(i)return{key:n===`Esc`?`Escape`:n,code:i.code,keyCode:i.keyCode,modifiers:r};if(n.length===1){let e=n.toUpperCase(),t=e.charCodeAt(0),i=``;return/[A-Z]/.test(e)?i=`Key${e}`:/[0-9]/.test(e)&&(i=`Digit${e}`),{key:n,code:i,keyCode:t,modifiers:r}}return null}function yr(e,t){return typeof e!=`string`||e.length<=t?e:e.slice(0,t)+`...[truncated ${e.length-t} chars]`}function br(e){return{url:e.url,method:e.method,resourceType:e.resourceType,status:e.status,mimeType:e.mimeType,startedAt:e.startedAt,requestHeaders:e.requestHeaders,responseHeaders:e.responseHeaders,postData:e.postData,body:e.body,bodyTruncated:e.bodyTruncated}}var xr=new Set([`Image`,`Font`,`Media`,`Manifest`,`Other`]),Sr=[`text/`,`application/json`,`application/xml`,`application/javascript`,`application/ecmascript`,`application/x-www-form-urlencoded`,`application/graphql`,`application/ld+json`,`application/manifest+json`,`image/svg+xml`];function Cr(e){if(!e||xr.has(e.resourceType))return!1;let t=String(e.mimeType||``).toLowerCase();return!t||Sr.some(e=>t.startsWith(e))}function wr(e){let t=atob(e),n=Uint8Array.from(t,e=>e.charCodeAt(0));return new TextDecoder(`utf-8`).decode(n)}var Tr=`1.3`,Er=12e4,Dr=`debugger-keepalive`,Or=100,kr=20480,U=new Map,Ar=!1,jr=!1,Mr=class extends Error{constructor(e=`Debugger session is not attached`){super(e),this.name=`DebuggerNotAttachedError`,this.code=`DEBUGGER_NOT_ATTACHED`}},Nr=class extends Error{constructor(e){super(`Cannot attach debugger to restricted page: ${e}`),this.name=`RestrictedPageError`,this.code=`DEBUGGER_RESTRICTED_PAGE`,this.url=e}};function W(e){return U.get(e)||null}function G(e,t,n={}){return new Promise((r,i)=>{try{chrome.debugger.sendCommand({tabId:e},t,n,e=>{chrome.runtime.lastError?i(Error(chrome.runtime.lastError.message)):r(e)})}catch(e){i(e)}})}function Pr(e){let t=W(e);t&&(t.idleTimer&&clearTimeout(t.idleTimer),t.idleTimer=setTimeout(()=>{r.debug(`[Debugger] idle timeout, auto-detaching tab ${e}`),Hr(e,`idle_timeout`).catch(()=>{})},Er))}function Fr(e){e.idleTimer&&=(clearTimeout(e.idleTimer),null)}function Ir(){[...U.values()].some(e=>e.attached)?chrome.alarms.create(Dr,{periodInMinutes:.5}):chrome.alarms.clear(Dr).catch(()=>{})}function Lr(e,t,n){let r=e.tabId,i=W(r);if(!i||!i.network.recording)return;let a=i.network;if(t===`Network.requestWillBeSent`){let e=n.request||{};if(a.filter&&!String(e.url||``).includes(a.filter))return;let t={requestId:n.requestId,url:e.url||``,method:e.method||``,resourceType:n.type||``,requestHeaders:e.headers||{},postData:typeof e.postData==`string`?yr(e.postData,kr):void 0,status:null,mimeType:``,responseHeaders:null,body:null,bodyTruncated:!1,startedAt:n.timestamp||null};if(a.entries.push(t),a.reqMap.set(n.requestId,t),a.entries.length>Or){let e=a.entries.shift();e&&a.reqMap.delete(e.requestId)}return}if(t===`Network.responseReceived`){let e=a.reqMap.get(n.requestId);if(!e)return;let t=n.response||{};e.status=t.status??null,e.mimeType=t.mimeType||``,e.responseHeaders=t.headers||null;return}if(t===`Network.loadingFinished`){let e=a.reqMap.get(n.requestId);if(!e||!Cr(e))return;G(r,`Network.getResponseBody`,{requestId:n.requestId}).then(t=>{let n=t.body||``;if(t.base64Encoded)try{n=wr(n)}catch{n=`[base64 body, decode failed]`}n.length>kr?(e.body=yr(n,kr),e.bodyTruncated=!0):e.body=n}).catch(()=>{})}}function Rr(e,t){let n=e.tabId;r.debug(`[Debugger] detached from tab ${n}, reason: ${t}`);let i=W(n);i&&(Fr(i),i.attached=!1,i.network.recording=!1,U.delete(n)),Ir()}function zr(){Ar||(chrome.debugger.onEvent.addListener(Lr),chrome.debugger.onDetach.addListener(Rr),Ar=!0,chrome.alarms.onAlarm.addListener(e=>{if(e.name===Dr)for(let e of U.keys())W(e)?.attached&&Pr(e)}))}function Br(){jr||=(chrome.tabs.onRemoved.addListener(e=>{U.has(e)&&U.delete(e)}),!0)}async function Vr(e){if(W(e)?.attached)return Pr(e),{tabId:e,reused:!0};let t=await chrome.tabs.get(e).catch(()=>null);if(!t)throw Error(`Tab ${e} does not exist or is not accessible`);if(hr(t.url||``))throw new Nr(t.url||``);zr(),Br(),await new Promise((t,n)=>{chrome.debugger.attach({tabId:e},Tr,()=>{chrome.runtime.lastError?n(Error(chrome.runtime.lastError.message)):t()})}).catch(async t=>{let n=String(t?.message||``);if(!/already attached/i.test(n))throw t;r.debug(`[Debugger] stale attach detected on tab ${e}, forcing detach + retry`),await new Promise(t=>{chrome.debugger.detach({tabId:e},()=>{chrome.runtime.lastError,t()})}),await new Promise((t,n)=>{chrome.debugger.attach({tabId:e},Tr,()=>{chrome.runtime.lastError?n(Error(chrome.runtime.lastError.message)):t()})})}),U.set(e,{attached:!0,idleTimer:null,network:{recording:!1,filter:``,entries:[],reqMap:new Map}});try{await Promise.all([G(e,`Page.enable`),G(e,`Runtime.enable`),G(e,`Network.enable`)])}catch(t){throw U.delete(e),await chrome.debugger.detach({tabId:e}).catch(()=>{}),t}return Pr(e),Ir(),r.debug(`[Debugger] attached to tab ${e}`),{tabId:e,reused:!1}}async function Hr(e,t=`manual`){let n=W(e),i=!!n;n&&(Fr(n),n.attached=!1,n.network.recording=!1,U.delete(e)),i&&await Promise.allSettled([G(e,`Emulation.clearDeviceMetricsOverride`),G(e,`Emulation.clearGeolocationOverride`),G(e,`Network.setUserAgentOverride`,{userAgent:``}),G(e,`Emulation.setTimezoneOverride`,{timezoneId:``}),G(e,`Emulation.setEmulatedMedia`,{features:[]}),G(e,`Emulation.setTouchEmulationEnabled`,{enabled:!1})]),await new Promise(t=>{chrome.debugger.detach({tabId:e},()=>{chrome.runtime.lastError,t()})}),Ir(),r.debug(`[Debugger] detached from tab ${e} (${t})`)}function Ur(e){return!!W(e)?.attached}function Wr(){let e=[];for(let[t,n]of U.entries())n?.attached&&e.push(t);return e}async function K(e,t,n={}){if(!W(e)?.attached)throw new Mr;try{let r=await G(e,t,n);return Pr(e),r}catch(t){throw/not attached|detached|No tab with id/i.test(t.message)?(W(e)&&U.delete(e),Ir(),new Mr(t.message)):t}}function Gr(e,t=``){let n=W(e);if(!n?.attached)throw new Mr;n.network.recording=!0,n.network.filter=t||``,Pr(e)}function Kr(e){let t=W(e);if(!t?.attached)throw new Mr;let n=t.network.entries.map(br);return t.network.entries=[],t.network.reqMap.clear(),Pr(e),n}function qr(e){let t=W(e);if(!t?.attached)throw new Mr;let n=t.network.entries.map(br);return t.network={recording:!1,filter:``,entries:[],reqMap:new Map},Pr(e),n}e(`zh`,{toolDebugger:{missingAction:`缺少 action 参数`,unknownAction:`不支持的 action: {action}`,unknownInputType:`不支持的 inputType: {inputType}(合法值:click/type/press/scroll)`,unknownNetworkMode:`不支持的 networkMode: {mode}(合法值:start/collect/stop)`,unknownEmulateTarget:`不支持的 emulateTarget: {target}(合法值:ua/viewport/geolocation/timezone/colorScheme/reset)`,noTab:`未找到可调试的标签页`,attachSuccess:`已附着到标签页 {tabId},调试会话已开启。
139
139
  注意:该标签页顶部会显示"扩展程序正在调试此浏览器"提示条,调试结束后请调用 action=detach 关闭;空闲 2 分钟也会自动脱离。受限页面(chrome://、扩展商店等)无法调试。`,attachReused:`标签页 {tabId} 的调试会话已存在,直接复用。`,detachSuccess:`已脱离标签页 {tabId},调试会话关闭,提示条已消除。`,notAttached:`调试会话不存在或已结束(可能用户取消了调试、打开了 DevTools 或页面已关闭)。请先调用 action=attach 重新附着。`,restrictedPage:`无法调试受限页面({url})。chrome://、扩展商店、PDF 阅读器等浏览器内部页面不允许调试,请切换到普通网页。`,attachFailed:`附着调试器失败: {error}`,commandFailed:`CDP 命令 {method} 执行失败: {error}`,evaluateMissing:`action=evaluate 需要 expression 参数`,evaluateException:`页面脚本执行抛出异常:
140
140
  {error}`,evaluateEmpty:`执行完成(无返回值)`,evaluateTruncated:`
141
141
  ...[返回值过长,已截断,共 {length} 字符]`,inputMissingType:`action=input 需要 inputType 参数(click/type/press/scroll)`,clickNeedTarget:`click 需要 selector 或 x/y 参数来定位点击位置`,selectorNotFound:`未找到匹配 selector 的元素: {selector}`,typeNeedText:`type 需要 text 参数(并用 selector 指定目标输入元素)`,pressNeedKey:`press 需要 key 参数,如 "Enter"、"Tab"、"Control+a"`,unknownKey:`无法识别的按键: {key}`,inputDone:`已派发原生 {kind} 事件到标签页 {tabId}。`,networkMissingMode:`action=network 需要 networkMode 参数(start/collect/stop)`,networkStarted:`已开始录制网络请求{filter}。操作页面后调用 networkMode=collect 取回结果(含响应体,单条最多 20KB,最多 100 条)。`,networkFilterSuffix:`(过滤: {filter})`,selectorInvisible:`元素存在但不可见(尺寸为零): {selector}`,networkEmpty:`缓冲区中没有新的网络请求。可先执行页面操作,再调用 collect。`,networkCollected:`录制到 {count} 条网络请求(JSON):
@@ -145,7 +145,7 @@ Note: a yellow "extension is debugging this browser" infobar appears on the tab
145
145
  {error}`,evaluateEmpty:`Execution finished (no return value)`,evaluateTruncated:`
146
146
  ...[return value too long, truncated; total {length} chars]`,inputMissingType:`action=input requires inputType (click/type/press/scroll)`,clickNeedTarget:`click requires a selector or x/y coordinates`,selectorNotFound:`No element matched selector: {selector}`,typeNeedText:`type requires text (and a selector for the target input element)`,pressNeedKey:`press requires a key, e.g. "Enter", "Tab", "Control+a"`,unknownKey:`Unrecognized key: {key}`,inputDone:`Dispatched native {kind} event to tab {tabId}.`,networkMissingMode:`action=network requires networkMode (start/collect/stop)`,networkStarted:`Network recording started{filter}. Interact with the page, then call networkMode=collect to fetch results (includes response bodies, up to 20KB each and 100 entries).`,networkFilterSuffix:` (filter: {filter})`,selectorInvisible:`Element exists but is invisible (zero size): {selector}`,networkEmpty:`No new network requests buffered. Perform some page actions and call collect again.`,networkCollected:`Recorded {count} network requests (JSON):
147
147
  {json}`,networkStopped:`Network recording stopped; {count} remaining requests (JSON):
148
- {json}`,networkStoppedEmpty:`Network recording stopped; buffer was empty.`,screenshotDone:`Screenshot captured ({mode}, {size}, {format}, ~{sizeKB} KB) and downloaded to the browser default download directory.`,screenshotClamped:` (page too tall; height clamped to {max}px to fit Chrome texture limit)`,modeViewport:`viewport`,modeFullPage:`full page`,modeElement:`element`,screenshotFailed:`Screenshot failed: {error}`,emulateMissingTarget:`action=emulate requires emulateTarget (ua/viewport/geolocation/timezone/colorScheme/reset)`,emulateUaNeedValue:`target=ua requires userAgent`,emulateViewportNeedSize:`target=viewport requires viewportWidth and viewportHeight`,emulateGeoNeedValue:`target=geolocation requires latitude and longitude`,emulateTzNeedValue:`target=timezone requires timezoneId`,emulateColorNeedValue:`target=colorScheme requires colorScheme (dark/light)`,emulateApplied:`Emulation applied: {target}. Use target=reset or detach to revert.`,emulateReset:`All emulation overrides cleared (UA / viewport / geolocation / timezone / color scheme).`}});var Or=3e4,kr=16e3,Ar=new Set([`attach`,`detach`,`evaluate`,`input`,`network`,`screenshot`,`emulate`]),jr=8,Mr=7;async function Nr(e,t){if(e.tabId)return Number(e.tabId);let n=await An();if(t===`attach`||n&&Cr(n))return n;let r=wr();return r.length===1?r[0]:n}async function Pr(e,t){let n=await q(e,`Runtime.evaluate`,{expression:t,returnByValue:!0,awaitPromise:!0,userGesture:!0});if(n.exceptionDetails){let e=n.exceptionDetails.exception?.description||n.exceptionDetails.text||`Unknown error`;throw Error(e)}return n.result?.value}var Fr=`
148
+ {json}`,networkStoppedEmpty:`Network recording stopped; buffer was empty.`,screenshotDone:`Screenshot captured ({mode}, {size}, {format}, ~{sizeKB} KB) and downloaded to the browser default download directory.`,screenshotClamped:` (page too tall; height clamped to {max}px to fit Chrome texture limit)`,modeViewport:`viewport`,modeFullPage:`full page`,modeElement:`element`,screenshotFailed:`Screenshot failed: {error}`,emulateMissingTarget:`action=emulate requires emulateTarget (ua/viewport/geolocation/timezone/colorScheme/reset)`,emulateUaNeedValue:`target=ua requires userAgent`,emulateViewportNeedSize:`target=viewport requires viewportWidth and viewportHeight`,emulateGeoNeedValue:`target=geolocation requires latitude and longitude`,emulateTzNeedValue:`target=timezone requires timezoneId`,emulateColorNeedValue:`target=colorScheme requires colorScheme (dark/light)`,emulateApplied:`Emulation applied: {target}. Use target=reset or detach to revert.`,emulateReset:`All emulation overrides cleared (UA / viewport / geolocation / timezone / color scheme).`}});var Jr=3e4,Yr=16e3,Xr=new Set([`attach`,`detach`,`evaluate`,`input`,`network`,`screenshot`,`emulate`]),Zr=8,Qr=7;async function $r(e,t){if(e.tabId)return Number(e.tabId);let n=await Xn();if(t===`attach`||n&&Ur(n))return n;let r=Wr();return r.length===1?r[0]:n}async function ei(e,t){let n=await K(e,`Runtime.evaluate`,{expression:t,returnByValue:!0,awaitPromise:!0,userGesture:!0});if(n.exceptionDetails){let e=n.exceptionDetails.exception?.description||n.exceptionDetails.text||`Unknown error`;throw Error(e)}return n.result?.value}var ti=`
149
149
  function __aihDeepQuery(root, sel) {
150
150
  if (!root) return null;
151
151
  var direct = null;
@@ -161,8 +161,8 @@ Note: a yellow "extension is debugging this browser" infobar appears on the tab
161
161
  }
162
162
  return null;
163
163
  }
164
- `;async function Ir(e,n){try{let{reused:r}=await xr(n);return U(!0,t(r?`toolDebugger.attachReused`:`toolDebugger.attachSuccess`,{tabId:n}),{tool_call_id:e.__toolCallId})}catch(n){return n instanceof pr?U(!1,t(`toolDebugger.restrictedPage`,{url:n.url}),{tool_call_id:e.__toolCallId}):U(!1,t(`toolDebugger.attachFailed`,{error:n.message}),{tool_call_id:e.__toolCallId})}}async function Lr(e,n){return await Sr(n).catch(()=>{}),U(!0,t(`toolDebugger.detachSuccess`,{tabId:n}),{tool_call_id:e.__toolCallId})}async function Rr(e,n){let r=e.expression;if(!r||typeof r!=`string`)return U(!1,t(`toolDebugger.evaluateMissing`),{tool_call_id:e.__toolCallId});try{let i=await Pr(n,r),a;return i===void 0?a=t(`toolDebugger.evaluateEmpty`):(a=typeof i==`string`?i:JSON.stringify(i,null,2),a.length>Or&&(a=a.slice(0,Or)+t(`toolDebugger.evaluateTruncated`,{length:a.length}))),U(!0,a,{tool_call_id:e.__toolCallId})}catch(n){return n instanceof fr?U(!1,t(`toolDebugger.notAttached`),{tool_call_id:e.__toolCallId}):U(!1,t(`toolDebugger.evaluateException`,{error:n.message}),{tool_call_id:e.__toolCallId})}}async function zr(e,n){if(n.selector){let r=await Pr(e,`(function(s){
165
- ${Fr}
164
+ `;async function ni(e,n){try{let{reused:r}=await Vr(n);return H(!0,t(r?`toolDebugger.attachReused`:`toolDebugger.attachSuccess`,{tabId:n}),{tool_call_id:e.__toolCallId})}catch(n){return n instanceof Nr?H(!1,t(`toolDebugger.restrictedPage`,{url:n.url}),{tool_call_id:e.__toolCallId}):H(!1,t(`toolDebugger.attachFailed`,{error:n.message}),{tool_call_id:e.__toolCallId})}}async function ri(e,n){return await Hr(n).catch(()=>{}),H(!0,t(`toolDebugger.detachSuccess`,{tabId:n}),{tool_call_id:e.__toolCallId})}async function ii(e,n){let r=e.expression;if(!r||typeof r!=`string`)return H(!1,t(`toolDebugger.evaluateMissing`),{tool_call_id:e.__toolCallId});try{let i=await ei(n,r),a;return i===void 0?a=t(`toolDebugger.evaluateEmpty`):(a=typeof i==`string`?i:JSON.stringify(i,null,2),a.length>Jr&&(a=a.slice(0,Jr)+t(`toolDebugger.evaluateTruncated`,{length:a.length}))),H(!0,a,{tool_call_id:e.__toolCallId})}catch(n){return n instanceof Mr?H(!1,t(`toolDebugger.notAttached`),{tool_call_id:e.__toolCallId}):H(!1,t(`toolDebugger.evaluateException`,{error:n.message}),{tool_call_id:e.__toolCallId})}}async function ai(e,n){if(n.selector){let r=await ei(e,`(function(s){
165
+ ${ti}
166
166
  var el = __aihDeepQuery(document, s);
167
167
  if (!el) return { found: false };
168
168
  var r0 = el.getBoundingClientRect();
@@ -182,13 +182,13 @@ Note: a yellow "extension is debugging this browser" infobar appears on the tab
182
182
  w: r.width,
183
183
  h: r.height,
184
184
  };
185
- })(${JSON.stringify(n.selector)})`);return!r||!r.found?{error:t(`toolDebugger.selectorNotFound`,{selector:n.selector})}:r.w===0&&r.h===0?{error:t(`toolDebugger.selectorInvisible`,{selector:n.selector})}:{x:r.x,y:r.y}}return typeof n.x==`number`&&typeof n.y==`number`?{x:n.x,y:n.y}:{error:t(`toolDebugger.clickNeedTarget`)}}async function Br(e,n){let r=e.__toolCallId,i=e.inputType;if(!i)return U(!1,t(`toolDebugger.inputMissingType`),{tool_call_id:r});try{switch(i){case`click`:{let i=await zr(n,e);if(i.error)return U(!1,i.error,{tool_call_id:r});let{x:a,y:o}=i;return await q(n,`Input.dispatchMouseEvent`,{type:`mouseMoved`,x:a,y:o,button:`none`,buttons:0}),await q(n,`Input.dispatchMouseEvent`,{type:`mousePressed`,x:a,y:o,button:`left`,buttons:1,clickCount:1}),await q(n,`Input.dispatchMouseEvent`,{type:`mouseReleased`,x:a,y:o,button:`left`,buttons:0,clickCount:1}),U(!0,t(`toolDebugger.inputDone`,{kind:`click`,tabId:n}),{tool_call_id:r})}case`type`:return e.text?(e.selector&&await Pr(n,`(function(s){
186
- ${Fr}
185
+ })(${JSON.stringify(n.selector)})`);return!r||!r.found?{error:t(`toolDebugger.selectorNotFound`,{selector:n.selector})}:r.w===0&&r.h===0?{error:t(`toolDebugger.selectorInvisible`,{selector:n.selector})}:{x:r.x,y:r.y}}return typeof n.x==`number`&&typeof n.y==`number`?{x:n.x,y:n.y}:{error:t(`toolDebugger.clickNeedTarget`)}}async function oi(e,n){let r=e.__toolCallId,i=e.inputType;if(!i)return H(!1,t(`toolDebugger.inputMissingType`),{tool_call_id:r});try{switch(i){case`click`:{let i=await ai(n,e);if(i.error)return H(!1,i.error,{tool_call_id:r});let{x:a,y:o}=i;return await K(n,`Input.dispatchMouseEvent`,{type:`mouseMoved`,x:a,y:o,button:`none`,buttons:0}),await K(n,`Input.dispatchMouseEvent`,{type:`mousePressed`,x:a,y:o,button:`left`,buttons:1,clickCount:1}),await K(n,`Input.dispatchMouseEvent`,{type:`mouseReleased`,x:a,y:o,button:`left`,buttons:0,clickCount:1}),H(!0,t(`toolDebugger.inputDone`,{kind:`click`,tabId:n}),{tool_call_id:r})}case`type`:return e.text?(e.selector&&await ei(n,`(function(s){
186
+ ${ti}
187
187
  var el = __aihDeepQuery(document, s);
188
188
  if (el) el.focus();
189
189
  return !!el;
190
- })(${JSON.stringify(e.selector)})`),await q(n,`Input.insertText`,{text:String(e.text)}),U(!0,t(`toolDebugger.inputDone`,{kind:`type`,tabId:n}),{tool_call_id:r})):U(!1,t(`toolDebugger.typeNeedText`),{tool_call_id:r});case`press`:{if(!e.key)return U(!1,t(`toolDebugger.pressNeedKey`),{tool_call_id:r});let i=Qn(e.key);if(!i)return U(!1,t(`toolDebugger.unknownKey`,{key:e.key}),{tool_call_id:r});let a=i.key;a.length===1&&i.modifiers&jr&&/[a-z]/.test(a)&&(a=a.toUpperCase());let o={key:a,code:i.code||void 0,windowsVirtualKeyCode:i.keyCode,nativeVirtualKeyCode:i.keyCode,modifiers:i.modifiers};return await q(n,`Input.dispatchKeyEvent`,a.length===1&&(i.modifiers&Mr)===0?{type:`keyDown`,...o,text:a,unmodifiedText:a}:{type:`keyDown`,...o}),await q(n,`Input.dispatchKeyEvent`,{type:`keyUp`,...o}),U(!0,t(`toolDebugger.inputDone`,{kind:`key:${e.key}`,tabId:n}),{tool_call_id:r})}case`scroll`:{let i=typeof e.x==`number`?e.x:null,a=typeof e.y==`number`?e.y:null;if(i===null||a===null){let e=await Pr(n,`({ x: window.innerWidth / 2, y: window.innerHeight / 2 })`);i=e.x,a=e.y}let o=typeof e.deltaX==`number`?e.deltaX:0,s=typeof e.deltaY==`number`?e.deltaY:300;return await q(n,`Input.dispatchMouseEvent`,{type:`mouseWheel`,x:i,y:a,deltaX:o,deltaY:s,button:`none`,buttons:0}),U(!0,t(`toolDebugger.inputDone`,{kind:`scroll`,tabId:n}),{tool_call_id:r})}default:return U(!1,t(`toolDebugger.unknownInputType`,{inputType:i}),{tool_call_id:r})}}catch(e){return e instanceof fr?U(!1,t(`toolDebugger.notAttached`),{tool_call_id:r}):U(!1,t(`toolDebugger.commandFailed`,{method:`Input/Runtime`,error:e.message}),{tool_call_id:r})}}async function Vr(e,n){let r=e.__toolCallId,i=e.networkMode;if(!i)return U(!1,t(`toolDebugger.networkMissingMode`),{tool_call_id:r});try{if(i===`start`){Tr(n,e.filterUrl||``);let i=e.filterUrl?t(`toolDebugger.networkFilterSuffix`,{filter:e.filterUrl}):``;return U(!0,t(`toolDebugger.networkStarted`,{filter:i}),{tool_call_id:r})}if(i===`collect`){let e=Er(n);return e.length===0?U(!0,t(`toolDebugger.networkEmpty`),{tool_call_id:r}):U(!0,t(`toolDebugger.networkCollected`,{count:e.length,json:JSON.stringify(e,null,2)}),{tool_call_id:r})}if(i===`stop`){let e=Dr(n);return e.length===0?U(!0,t(`toolDebugger.networkStoppedEmpty`),{tool_call_id:r}):U(!0,t(`toolDebugger.networkStopped`,{count:e.length,json:JSON.stringify(e,null,2)}),{tool_call_id:r})}return U(!1,t(`toolDebugger.unknownNetworkMode`,{mode:i}),{tool_call_id:r})}catch(e){return e instanceof fr?U(!1,t(`toolDebugger.notAttached`),{tool_call_id:r}):U(!1,t(`toolDebugger.commandFailed`,{method:`Network`,error:e.message}),{tool_call_id:r})}}async function Hr(e,n){let r=e.__toolCallId,i=e.imageFormat===`jpeg`?`jpeg`:`png`,a=``;try{let o=null,s=`viewport`;if(e.selector){let i=await Pr(n,`(function(s){
191
- ${Fr}
190
+ })(${JSON.stringify(e.selector)})`),await K(n,`Input.insertText`,{text:String(e.text)}),H(!0,t(`toolDebugger.inputDone`,{kind:`type`,tabId:n}),{tool_call_id:r})):H(!1,t(`toolDebugger.typeNeedText`),{tool_call_id:r});case`press`:{if(!e.key)return H(!1,t(`toolDebugger.pressNeedKey`),{tool_call_id:r});let i=vr(e.key);if(!i)return H(!1,t(`toolDebugger.unknownKey`,{key:e.key}),{tool_call_id:r});let a=i.key;a.length===1&&i.modifiers&Zr&&/[a-z]/.test(a)&&(a=a.toUpperCase());let o={key:a,code:i.code||void 0,windowsVirtualKeyCode:i.keyCode,nativeVirtualKeyCode:i.keyCode,modifiers:i.modifiers};return await K(n,`Input.dispatchKeyEvent`,a.length===1&&(i.modifiers&Qr)===0?{type:`keyDown`,...o,text:a,unmodifiedText:a}:{type:`keyDown`,...o}),await K(n,`Input.dispatchKeyEvent`,{type:`keyUp`,...o}),H(!0,t(`toolDebugger.inputDone`,{kind:`key:${e.key}`,tabId:n}),{tool_call_id:r})}case`scroll`:{let i=typeof e.x==`number`?e.x:null,a=typeof e.y==`number`?e.y:null;if(i===null||a===null){let e=await ei(n,`({ x: window.innerWidth / 2, y: window.innerHeight / 2 })`);i=e.x,a=e.y}let o=typeof e.deltaX==`number`?e.deltaX:0,s=typeof e.deltaY==`number`?e.deltaY:300;return await K(n,`Input.dispatchMouseEvent`,{type:`mouseWheel`,x:i,y:a,deltaX:o,deltaY:s,button:`none`,buttons:0}),H(!0,t(`toolDebugger.inputDone`,{kind:`scroll`,tabId:n}),{tool_call_id:r})}default:return H(!1,t(`toolDebugger.unknownInputType`,{inputType:i}),{tool_call_id:r})}}catch(e){return e instanceof Mr?H(!1,t(`toolDebugger.notAttached`),{tool_call_id:r}):H(!1,t(`toolDebugger.commandFailed`,{method:`Input/Runtime`,error:e.message}),{tool_call_id:r})}}async function si(e,n){let r=e.__toolCallId,i=e.networkMode;if(!i)return H(!1,t(`toolDebugger.networkMissingMode`),{tool_call_id:r});try{if(i===`start`){Gr(n,e.filterUrl||``);let i=e.filterUrl?t(`toolDebugger.networkFilterSuffix`,{filter:e.filterUrl}):``;return H(!0,t(`toolDebugger.networkStarted`,{filter:i}),{tool_call_id:r})}if(i===`collect`){let e=Kr(n);return e.length===0?H(!0,t(`toolDebugger.networkEmpty`),{tool_call_id:r}):H(!0,t(`toolDebugger.networkCollected`,{count:e.length,json:JSON.stringify(e,null,2)}),{tool_call_id:r})}if(i===`stop`){let e=qr(n);return e.length===0?H(!0,t(`toolDebugger.networkStoppedEmpty`),{tool_call_id:r}):H(!0,t(`toolDebugger.networkStopped`,{count:e.length,json:JSON.stringify(e,null,2)}),{tool_call_id:r})}return H(!1,t(`toolDebugger.unknownNetworkMode`,{mode:i}),{tool_call_id:r})}catch(e){return e instanceof Mr?H(!1,t(`toolDebugger.notAttached`),{tool_call_id:r}):H(!1,t(`toolDebugger.commandFailed`,{method:`Network`,error:e.message}),{tool_call_id:r})}}async function ci(e,n){let r=e.__toolCallId,i=e.imageFormat===`jpeg`?`jpeg`:`png`,a=``;try{let o=null,s=`viewport`;if(e.selector){let i=await ei(n,`(function(s){
191
+ ${ti}
192
192
  var el = __aihDeepQuery(document, s);
193
193
  if (!el) return null;
194
194
  var r = el.getBoundingClientRect();
@@ -196,7 +196,7 @@ Note: a yellow "extension is debugging this browser" infobar appears on the tab
196
196
  x: r.left + window.scrollX, y: r.top + window.scrollY,
197
197
  width: r.width, height: r.height
198
198
  };
199
- })(${JSON.stringify(e.selector)})`);if(!i||!i.width||!i.height)return U(!1,t(`toolDebugger.selectorNotFound`,{selector:e.selector}),{tool_call_id:r});o={...i,scale:1},s=`element`}else if(e.fullPage){let e=(await q(n,`Page.getLayoutMetrics`)).contentSize||{},r=Number(e.height)||0,i=Number(e.width)||0,c=Math.min(r,kr),l=Math.min(i,kr);o={x:e.x||0,y:e.y||0,width:l,height:c,scale:1},s=`fullPage`,(r>c||i>l)&&(a=t(`toolDebugger.screenshotClamped`,{max:kr}))}let c={format:i};i===`jpeg`&&(c.quality=Math.min(100,Math.max(1,e.quality||80))),o&&(c.clip=o,c.captureBeyondViewport=!0);let l=await q(n,`Page.captureScreenshot`,c);Tn(`data:image/${i};base64,${l.data}`,i);let u=t(`toolDebugger.mode${s===`fullPage`?`FullPage`:s===`element`?`Element`:`Viewport`}`),d=o?`${Math.round(o.width)}×${Math.round(o.height)}`:await Pr(n,`window.innerWidth + "\\u00d7" + window.innerHeight`);return U(!0,t(`toolDebugger.screenshotDone`,{mode:u,size:d,format:i,sizeKB:(l.data.length/1024).toFixed(1)})+a,{tool_call_id:r})}catch(e){return e instanceof fr?U(!1,t(`toolDebugger.notAttached`),{tool_call_id:r}):U(!1,t(`toolDebugger.screenshotFailed`,{error:e.message}),{tool_call_id:r})}}async function Ur(e,n){let r=e.__toolCallId,i=e.emulateTarget;if(!i)return U(!1,t(`toolDebugger.emulateMissingTarget`),{tool_call_id:r});try{switch(i){case`ua`:if(!e.userAgent)return U(!1,t(`toolDebugger.emulateUaNeedValue`),{tool_call_id:r});await q(n,`Network.setUserAgentOverride`,{userAgent:String(e.userAgent)});break;case`viewport`:{if(!e.viewportWidth||!e.viewportHeight)return U(!1,t(`toolDebugger.emulateViewportNeedSize`),{tool_call_id:r});let i=!!e.mobile;await q(n,`Emulation.setDeviceMetricsOverride`,{width:e.viewportWidth,height:e.viewportHeight,deviceScaleFactor:typeof e.deviceScaleFactor==`number`?e.deviceScaleFactor:1,mobile:i}),await q(n,`Emulation.setTouchEmulationEnabled`,{enabled:i});break}case`geolocation`:if(typeof e.latitude!=`number`||typeof e.longitude!=`number`)return U(!1,t(`toolDebugger.emulateGeoNeedValue`),{tool_call_id:r});await q(n,`Emulation.setGeolocationOverride`,{latitude:e.latitude,longitude:e.longitude,accuracy:1});break;case`timezone`:if(!e.timezoneId)return U(!1,t(`toolDebugger.emulateTzNeedValue`),{tool_call_id:r});await q(n,`Emulation.setTimezoneOverride`,{timezoneId:String(e.timezoneId)});break;case`colorScheme`:if(!e.colorScheme)return U(!1,t(`toolDebugger.emulateColorNeedValue`),{tool_call_id:r});await q(n,`Emulation.setEmulatedMedia`,{features:[{name:`prefers-color-scheme`,value:e.colorScheme}]});break;case`reset`:return await Promise.allSettled([q(n,`Emulation.clearDeviceMetricsOverride`),q(n,`Emulation.clearGeolocationOverride`),q(n,`Network.setUserAgentOverride`,{userAgent:``}),q(n,`Emulation.setTimezoneOverride`,{timezoneId:``}),q(n,`Emulation.setEmulatedMedia`,{features:[]}),q(n,`Emulation.setTouchEmulationEnabled`,{enabled:!1})]),U(!0,t(`toolDebugger.emulateReset`),{tool_call_id:r});default:return U(!1,t(`toolDebugger.unknownEmulateTarget`,{target:i}),{tool_call_id:r})}return U(!0,t(`toolDebugger.emulateApplied`,{target:i}),{tool_call_id:r})}catch(e){return e instanceof fr?U(!1,t(`toolDebugger.notAttached`),{tool_call_id:r}):U(!1,t(`toolDebugger.commandFailed`,{method:`Emulation/Network`,error:e.message}),{tool_call_id:r})}}async function Wr(e,n){let r=e?.action,i={...e,__toolCallId:n};if(!r)return U(!1,t(`toolDebugger.missingAction`),{tool_call_id:n});if(!Ar.has(r))return U(!1,t(`toolDebugger.unknownAction`,{action:r}),{tool_call_id:n});let a=await Nr(e,r);if(!a)return U(!1,t(`toolDebugger.noTab`),{tool_call_id:n});if(r!==`attach`&&r!==`detach`&&!Cr(a))return U(!1,t(`toolDebugger.notAttached`),{tool_call_id:n});switch(r){case`attach`:return Ir(i,a);case`detach`:return Lr(i,a);case`evaluate`:return Rr(i,a);case`input`:return Br(i,a);case`network`:return Vr(i,a);case`screenshot`:return Hr(i,a);case`emulate`:return Ur(i,a);default:return U(!1,t(`toolDebugger.unknownAction`,{action:r}),{tool_call_id:n})}}var Gr=[{id:`knowledge_search`,category:`knowledge`,execution:`background`,parallelizable:!0,requiresConfirmation:!1,type:`function`,function:{name:`knowledge_search`,description:`Search knowledge bases for relevant information. Use when you need factual grounding or the user asks about specific topics.`,parameters:{type:`object`,properties:{query:{type:`string`,description:`Search query`},collectionId:{type:`string`,description:`Knowledge base ID; omit to search all`},topK:{type:`integer`,description:`Number of results to return, default 5`}},required:[`query`]}}},{id:`knowledge_ingest`,category:`knowledge`,execution:`background`,parallelizable:!1,requiresConfirmation:!1,type:`function`,function:{name:`knowledge_ingest`,description:`Ingest a document or text into a knowledge base for future retrieval. Use knowledge_list first to get the collectionId.`,parameters:{type:`object`,properties:{collectionId:{type:`string`,description:`Target knowledge base ID (from knowledge_list)`},type:{type:`string`,enum:[`text`,`file`,`url`],description:`Source type: text (raw content), file (local file path), url (web page)`},content:{type:`string`,description:`Raw text, local file path, or URL depending on type`},name:{type:`string`,description:`Optional document name for display`},metadata:{type:`object`,description:`Optional metadata to attach to chunks`}},required:[`collectionId`,`type`,`content`]}}},{id:`knowledge_list`,category:`knowledge`,execution:`background`,parallelizable:!0,requiresConfirmation:!1,type:`function`,function:{name:`knowledge_list`,description:`List available knowledge bases and their document counts`,parameters:{type:`object`,properties:{}}}}];e(`zh`,{toolExec:{unknown:`未知`,unknownResultFormat:`未知结果格式`,tabAccessDenied:`无法访问该标签页: {error}`,tabErrorPage:`该标签页显示错误页面,页面未能成功加载。请检查 URL 是否正确、网络是否可达`,systemPageNotAllowed:`无法在系统页面使用工具: {url}`,contentScriptNotFound:`无法找到 content script 文件`,contentScriptInjectFailed:`注入 Content Script 失败: {error}`,unknownError:`未知错误`,argParseFailed:`工具参数解析失败`,unknownTool:`未知工具: {name}`,noTabAvailable:`没有可用的标签页`,noTitle:`(无标题)`,clarifyDialogFailed:`无法显示澄清对话框: {error}`,clarifyTimeout:`用户未在规定时间内完成澄清 ({seconds}秒)`,clarifyPanelClosed:`Side Panel 已关闭,澄清操作中止`,missingUrlParam:`缺少 URL 参数`,invalidUrlFormat:`无效的 URL 格式: {url}`,readResponseFailed:`读取响应内容失败: {error}`,tabNotFound:`未找到当前标签页`,getRequiresName:`get操作需要提供name参数`,setRequiresNameValue:`set操作需要提供name和value参数`,removeRequiresName:`remove操作需要提供name参数`,unknownAction:`未知操作: {action}`,missingTaskDesc:`缺少任务描述参数`,emptySubtasks:`子任务列表不能为空`,invalidSubtaskStructure:`子任务结构不完整,缺少id/name/description`,cannotGetCurrentTab:`无法获取当前标签页`,cannotParseTabUrl:`无法解析当前标签页 URL`,missingPrototypeId:`缺少 prototypeId 参数`,prototypeNotFound:`未找到原型: {id}`,fetchFailed:`获取失败: {error}`,missingHtmlParam:`缺少 HTML 参数`,missingTitleParam:`缺少 title 参数`,savePrototypeFailed:`保存原型失败`,executionFailed:`执行失败: {error}`,missingNameParam:`缺少 name 参数`,skillExecFailed:`Skill 执行失败`,skillExecException:`Skill 执行异常: {error}`,skillLoadFailed:`Skill 加载失败`,skillLoadException:`Skill 加载异常: {error}`,missingPathParam:`缺少 path 参数`,tabNotExistOrAccessible:`标签页 {tabId} 不存在或无法访问`,screenshotDownloaded:`截图已下载到本地({size} KB)`,screenshotSuccess:`截图成功!
199
+ })(${JSON.stringify(e.selector)})`);if(!i||!i.width||!i.height)return H(!1,t(`toolDebugger.selectorNotFound`,{selector:e.selector}),{tool_call_id:r});o={...i,scale:1},s=`element`}else if(e.fullPage){let e=(await K(n,`Page.getLayoutMetrics`)).contentSize||{},r=Number(e.height)||0,i=Number(e.width)||0,c=Math.min(r,Yr),l=Math.min(i,Yr);o={x:e.x||0,y:e.y||0,width:l,height:c,scale:1},s=`fullPage`,(r>c||i>l)&&(a=t(`toolDebugger.screenshotClamped`,{max:Yr}))}let c={format:i};i===`jpeg`&&(c.quality=Math.min(100,Math.max(1,e.quality||80))),o&&(c.clip=o,c.captureBeyondViewport=!0);let l=await K(n,`Page.captureScreenshot`,c);Gn(`data:image/${i};base64,${l.data}`,i);let u=t(`toolDebugger.mode${s===`fullPage`?`FullPage`:s===`element`?`Element`:`Viewport`}`),d=o?`${Math.round(o.width)}×${Math.round(o.height)}`:await ei(n,`window.innerWidth + "\\u00d7" + window.innerHeight`);return H(!0,t(`toolDebugger.screenshotDone`,{mode:u,size:d,format:i,sizeKB:(l.data.length/1024).toFixed(1)})+a,{tool_call_id:r})}catch(e){return e instanceof Mr?H(!1,t(`toolDebugger.notAttached`),{tool_call_id:r}):H(!1,t(`toolDebugger.screenshotFailed`,{error:e.message}),{tool_call_id:r})}}async function li(e,n){let r=e.__toolCallId,i=e.emulateTarget;if(!i)return H(!1,t(`toolDebugger.emulateMissingTarget`),{tool_call_id:r});try{switch(i){case`ua`:if(!e.userAgent)return H(!1,t(`toolDebugger.emulateUaNeedValue`),{tool_call_id:r});await K(n,`Network.setUserAgentOverride`,{userAgent:String(e.userAgent)});break;case`viewport`:{if(!e.viewportWidth||!e.viewportHeight)return H(!1,t(`toolDebugger.emulateViewportNeedSize`),{tool_call_id:r});let i=!!e.mobile;await K(n,`Emulation.setDeviceMetricsOverride`,{width:e.viewportWidth,height:e.viewportHeight,deviceScaleFactor:typeof e.deviceScaleFactor==`number`?e.deviceScaleFactor:1,mobile:i}),await K(n,`Emulation.setTouchEmulationEnabled`,{enabled:i});break}case`geolocation`:if(typeof e.latitude!=`number`||typeof e.longitude!=`number`)return H(!1,t(`toolDebugger.emulateGeoNeedValue`),{tool_call_id:r});await K(n,`Emulation.setGeolocationOverride`,{latitude:e.latitude,longitude:e.longitude,accuracy:1});break;case`timezone`:if(!e.timezoneId)return H(!1,t(`toolDebugger.emulateTzNeedValue`),{tool_call_id:r});await K(n,`Emulation.setTimezoneOverride`,{timezoneId:String(e.timezoneId)});break;case`colorScheme`:if(!e.colorScheme)return H(!1,t(`toolDebugger.emulateColorNeedValue`),{tool_call_id:r});await K(n,`Emulation.setEmulatedMedia`,{features:[{name:`prefers-color-scheme`,value:e.colorScheme}]});break;case`reset`:return await Promise.allSettled([K(n,`Emulation.clearDeviceMetricsOverride`),K(n,`Emulation.clearGeolocationOverride`),K(n,`Network.setUserAgentOverride`,{userAgent:``}),K(n,`Emulation.setTimezoneOverride`,{timezoneId:``}),K(n,`Emulation.setEmulatedMedia`,{features:[]}),K(n,`Emulation.setTouchEmulationEnabled`,{enabled:!1})]),H(!0,t(`toolDebugger.emulateReset`),{tool_call_id:r});default:return H(!1,t(`toolDebugger.unknownEmulateTarget`,{target:i}),{tool_call_id:r})}return H(!0,t(`toolDebugger.emulateApplied`,{target:i}),{tool_call_id:r})}catch(e){return e instanceof Mr?H(!1,t(`toolDebugger.notAttached`),{tool_call_id:r}):H(!1,t(`toolDebugger.commandFailed`,{method:`Emulation/Network`,error:e.message}),{tool_call_id:r})}}async function ui(e,n){let r=e?.action,i={...e,__toolCallId:n};if(!r)return H(!1,t(`toolDebugger.missingAction`),{tool_call_id:n});if(!Xr.has(r))return H(!1,t(`toolDebugger.unknownAction`,{action:r}),{tool_call_id:n});let a=await $r(e,r);if(!a)return H(!1,t(`toolDebugger.noTab`),{tool_call_id:n});if(r!==`attach`&&r!==`detach`&&!Ur(a))return H(!1,t(`toolDebugger.notAttached`),{tool_call_id:n});switch(r){case`attach`:return ni(i,a);case`detach`:return ri(i,a);case`evaluate`:return ii(i,a);case`input`:return oi(i,a);case`network`:return si(i,a);case`screenshot`:return ci(i,a);case`emulate`:return li(i,a);default:return H(!1,t(`toolDebugger.unknownAction`,{action:r}),{tool_call_id:n})}}var di=[{id:`knowledge_search`,category:`knowledge`,execution:`background`,parallelizable:!0,requiresConfirmation:!1,type:`function`,function:{name:`knowledge_search`,description:`Search knowledge bases for relevant information. Use when you need factual grounding or the user asks about specific topics.`,parameters:{type:`object`,properties:{query:{type:`string`,description:`Search query`},collectionId:{type:`string`,description:`Knowledge base ID; omit to search all`},topK:{type:`integer`,description:`Number of results to return, default 5`}},required:[`query`]}}},{id:`knowledge_ingest`,category:`knowledge`,execution:`background`,parallelizable:!1,requiresConfirmation:!1,type:`function`,function:{name:`knowledge_ingest`,description:`Ingest a document or text into a knowledge base for future retrieval. Use knowledge_list first to get the collectionId.`,parameters:{type:`object`,properties:{collectionId:{type:`string`,description:`Target knowledge base ID (from knowledge_list)`},type:{type:`string`,enum:[`text`,`file`,`url`],description:`Source type: text (raw content), file (local file path), url (web page)`},content:{type:`string`,description:`Raw text, local file path, or URL depending on type`},name:{type:`string`,description:`Optional document name for display`},metadata:{type:`object`,description:`Optional metadata to attach to chunks`}},required:[`collectionId`,`type`,`content`]}}},{id:`knowledge_list`,category:`knowledge`,execution:`background`,parallelizable:!0,requiresConfirmation:!1,type:`function`,function:{name:`knowledge_list`,description:`List available knowledge bases and their document counts`,parameters:{type:`object`,properties:{}}}}];e(`zh`,{toolExec:{unknown:`未知`,unknownResultFormat:`未知结果格式`,tabAccessDenied:`无法访问该标签页: {error}`,tabErrorPage:`该标签页显示错误页面,页面未能成功加载。请检查 URL 是否正确、网络是否可达`,systemPageNotAllowed:`无法在系统页面使用工具: {url}`,contentScriptNotFound:`无法找到 content script 文件`,contentScriptInjectFailed:`注入 Content Script 失败: {error}`,unknownError:`未知错误`,argParseFailed:`工具参数解析失败`,unknownTool:`未知工具: {name}`,noTabAvailable:`没有可用的标签页`,noTitle:`(无标题)`,clarifyDialogFailed:`无法显示澄清对话框: {error}`,clarifyTimeout:`用户未在规定时间内完成澄清 ({seconds}秒)`,clarifyPanelClosed:`Side Panel 已关闭,澄清操作中止`,missingUrlParam:`缺少 URL 参数`,invalidUrlFormat:`无效的 URL 格式: {url}`,readResponseFailed:`读取响应内容失败: {error}`,tabNotFound:`未找到当前标签页`,getRequiresName:`get操作需要提供name参数`,setRequiresNameValue:`set操作需要提供name和value参数`,removeRequiresName:`remove操作需要提供name参数`,unknownAction:`未知操作: {action}`,missingTaskDesc:`缺少任务描述参数`,emptySubtasks:`子任务列表不能为空`,invalidSubtaskStructure:`子任务结构不完整,缺少id/name/description`,cannotGetCurrentTab:`无法获取当前标签页`,cannotParseTabUrl:`无法解析当前标签页 URL`,missingPrototypeId:`缺少 prototypeId 参数`,prototypeNotFound:`未找到原型: {id}`,fetchFailed:`获取失败: {error}`,missingHtmlParam:`缺少 HTML 参数`,missingTitleParam:`缺少 title 参数`,savePrototypeFailed:`保存原型失败`,executionFailed:`执行失败: {error}`,missingNameParam:`缺少 name 参数`,skillExecFailed:`Skill 执行失败`,skillExecException:`Skill 执行异常: {error}`,skillLoadFailed:`Skill 加载失败`,skillLoadException:`Skill 加载异常: {error}`,missingPathParam:`缺少 path 参数`,tabNotExistOrAccessible:`标签页 {tabId} 不存在或无法访问`,screenshotDownloaded:`截图已下载到本地({size} KB)`,screenshotSuccess:`截图成功!
200
200
  图片大小约 {size} MB
201
201
  格式: {format}
202
202
  质量: {quality}
@@ -342,41 +342,42 @@ Image recognition analysis timed out (60 seconds), please check if the image rec
342
342
  Image recognition analysis failed: {error}`,dialogAccept:`auto-accept`,dialogDismiss:`auto-dismiss`,dialogRestore:`restore native dialogs`,dialogSet:`Dialog handling set to: {mode}. Subsequent alert/confirm/prompt will be handled accordingly`,knowledgeQueryRequired:`Missing query parameter. Please provide a search keyword.`,knowledgeSearchFailed:`Knowledge search failed: {error}`,knowledgeSearchNoResult:`No content related to "{query}" found in the knowledge bases.`,knowledgeSearchResult:`Found {count} relevant entries in the knowledge bases:
343
343
 
344
344
  {results}`,knowledgeResultHeader:`[{index}] Relevance {score}{sourcePart}`,knowledgeSourcePart:`, Source: {source}`,knowledgeIngestParamsRequired:`Missing collectionId/type/content parameter.`,knowledgeIngestBadType:`Unsupported ingest type: {type}. Available: text, file, url`,knowledgeIngestSuccess:`Ingested "{name}" into knowledge base ({chunks} chunks)`,knowledgeIngestFailed:`Knowledge ingest failed: {error}`,knowledgeListEmpty:`No knowledge bases yet. Ask the user to create one and import documents in the extension settings "Knowledge" tab.`,knowledgeListResult:`{count} knowledge base(s):
345
- {list}`,knowledgeListItem:`- {name} (id: {id}): {docs} documents · {chunks} chunks`,knowledgeListFailed:`Failed to list knowledge bases: {error}`,knowledgeSearchDisabled:`This knowledge base is disabled and cannot be searched. Ask the user to enable it in the extension settings "Knowledge" tab and retry.`,knowledgeIngestDisabled:`This knowledge base is disabled; ingest is not allowed. Ask the user to enable it in the extension settings "Knowledge" tab and retry.`}});var Kr=new Map,qr=new Set,Jr=new Set,Yr=new Map,Xr=null,Zr=150,Qr=3,$r=20;function ei(e,t=Zr){return!e||typeof e!=`string`||e.length<=t?e:e.slice(0,t-3)+`...`}function ti(e,t=0){if(!e||typeof e!=`object`||t>=Qr)return e;let n={};for(let[r,i]of Object.entries(e)){if(!i||typeof i!=`object`){n[r]=i;continue}let e={...i};delete e.$schema,delete e.$ref,delete e.definitions,delete e.additionalProperties,e.description&&=ei(e.description),e.properties&&=ti(e.properties,t+1),e.items&&typeof e.items==`object`&&(e.items.properties&&(e.items.properties=ti(e.items.properties,t+1)),e.items.description&&(e.items.description=ei(e.items.description))),n[r]=e}return n}function ni(e){if(!e||typeof e!=`object`)return{type:`object`,properties:{}};let{$schema:n,$ref:r,definitions:i,additionalProperties:a,...o}=e;if(o.type||=`object`,o.description&&=ei(o.description),o.properties){o.properties=ti(o.properties,0);let e=Object.keys(o.properties);if(e.length>$r){let n=e.slice(0,$r),r=e.slice($r),i={};n.forEach(e=>{i[e]=o.properties[e]}),i.additionalParams={type:`object`,description:t(`toolExec.additionalParamsDesc`,{count:r.length,names:r.join(`, `).slice(0,100)})},o.properties=i}}return o}Promise.resolve();async function ri(){let e=Xr,t;Xr=new Promise(e=>{t=e}),await e;try{let{mcpEnabled:e}=await chrome.storage.local.get([`mcpEnabled`]);if(e!==!0)return r.debug(`[Background] MCP globaltoggleclosed,skip toolload`),0;ii();let[t,n]=await Promise.all([ot(),ct()]);if(!t.success||!t.tools||t.tools.length===0)return r.debug(`[Background] no available MCP tool`),0;let i=new Set;if(n?.servers)for(let e of n.servers)e.enabled===!1&&i.add(e.id);let a=0;for(let e of t.tools){if(i.has(e.serverId)){r.debug(`[Background] skip disabled MCP server "${e.serverName}" tool: ${e.name}`);continue}let t=`mcp_${e.serverId}_${e.name}`;if(Jr.has(t))continue;let n={id:t,category:`mcp`,execution:`background`,parallelizable:!0,requiresConfirmation:!1,type:`function`,function:{name:t,description:ei(`[MCP:${e.serverName}] ${e.description||e.name}`,200),parameters:ni(e.inputSchema)}};f.push(n),m.push({id:n.id,type:n.type,function:n.function}),d[t]=`background`,Yi[t]=async(t,n)=>{let r=await st(e.serverId,e.name,t);return{success:r.success,content:r.content||r.error||``,tool_call_id:n}},Jr.add(t),Yr.set(t,{serverId:e.serverId,serverName:e.serverName,toolName:e.name}),a++}fi();let o=t.tools.filter(e=>!i.has(e.serverId)).map(e=>({id:`mcp_${e.serverId}_${e.name}`,name:e.name,description:`[MCP:${e.serverName}] ${e.description||e.name}`,category:`mcp`,execution:`background`,parallelizable:!0,requiresConfirmation:!1,enabled:!0,serverId:e.serverId,serverName:e.serverName}));return await chrome.storage.local.set({mcpTools:o}),r.debug(`[Background] loaded ${a} MCP tool`),a}catch(e){return r.warn(`[Background] load MCP tool failed (Agent may not be supported MCP):`,e.message),0}finally{t()}}function ii(){for(let e of Jr){let t=f.findIndex(t=>t.id===e);t>=0&&f.splice(t,1),t=m.findIndex(t=>t.id===e),t>=0&&m.splice(t,1),delete d[e],delete Yi[e]}Jr.clear(),Yr.clear(),fi(),chrome.storage.local.remove(`mcpTools`)}async function ai(){let e=Xr,t;Xr=new Promise(e=>{t=e}),await e;try{ii()}finally{t()}}function oi(e){return Yr.get(e)||null}function si(e){if(!e)return[];let t=e instanceof Set?e:new Set(e);if(t.size===0)return[];let n=[];for(let[e,r]of Yr)t.has(r.serverId)&&n.push(e);return n}var ci=new Map;function li(e,t){e&&(Array.isArray(t)&&t.length>0?ci.set(e,[...t]):ci.delete(e))}function ui(e){return e&&ci.get(e)||null}function di(e,t,n){if(!Array.isArray(n)||n.length===0)return e;let r=new Set(si(n));if(r.size===0)return e;let i=new Set(e.map(e=>e.id)),a=[...e];for(let e of t)r.has(e.id)&&!i.has(e.id)&&a.push(e);return a}function fi(){for(let e of Object.keys(Xi))delete Xi[e];s.clear(),a.clear();for(let e of f)e.execution===`background`&&Yi[e.id]&&(Xi[e.id]=Yi[e.id]),e.parallelizable&&s.add(e.id),e.requiresConfirmation&&a.add(e.id)}var pi=new Set,mi=null;async function hi(e,n){let{query:r,collectionId:i,topK:a}=e||{};if(!r||!String(r).trim())return J(!1,t(`toolExec.knowledgeQueryRequired`),{tool_call_id:n});let o={query:String(r)};if(i){let e=await gi(i,`toolExec.knowledgeSearchDisabled`);if(e)return J(!1,e,{tool_call_id:n});o.collectionIds=[i]}a&&(o.topK=a);let s=await ut(o);if(!s||s.success!==!0)return J(!1,t(`toolExec.knowledgeSearchFailed`,{error:s?.error||t(`toolExec.unknownError`)}),{tool_call_id:n});let c=Array.isArray(s.results)?s.results:[];if(c.length===0)return J(!0,t(`toolExec.knowledgeSearchNoResult`,{query:String(r)}),{tool_call_id:n});let l=c.map((e,n)=>{let r=e.metadata||{},i=r.documentName||r.source||``,a=i?t(`toolExec.knowledgeSourcePart`,{source:i}):``,o=typeof e.score==`number`?e.score.toFixed(3):`-`;return`${t(`toolExec.knowledgeResultHeader`,{index:n+1,score:o,sourcePart:a})}\n${e.content||``}`});return J(!0,t(`toolExec.knowledgeSearchResult`,{count:c.length,results:l.join(`
345
+ {list}`,knowledgeListItem:`- {name} (id: {id}): {docs} documents · {chunks} chunks`,knowledgeListFailed:`Failed to list knowledge bases: {error}`,knowledgeSearchDisabled:`This knowledge base is disabled and cannot be searched. Ask the user to enable it in the extension settings "Knowledge" tab and retry.`,knowledgeIngestDisabled:`This knowledge base is disabled; ingest is not allowed. Ask the user to enable it in the extension settings "Knowledge" tab and retry.`}});var fi=new Map,pi=new Set,mi=new Set,hi=new Map,gi=null,_i=150,vi=3,yi=20;function bi(e,t=_i){return!e||typeof e!=`string`||e.length<=t?e:e.slice(0,t-3)+`...`}function xi(e,t=0){if(!e||typeof e!=`object`||t>=vi)return e;let n={};for(let[r,i]of Object.entries(e)){if(!i||typeof i!=`object`){n[r]=i;continue}let e={...i};delete e.$schema,delete e.$ref,delete e.definitions,delete e.additionalProperties,e.description&&=bi(e.description),e.properties&&=xi(e.properties,t+1),e.items&&typeof e.items==`object`&&(e.items.properties&&(e.items.properties=xi(e.items.properties,t+1)),e.items.description&&(e.items.description=bi(e.items.description))),n[r]=e}return n}function Si(e){if(!e||typeof e!=`object`)return{type:`object`,properties:{}};let{$schema:n,$ref:r,definitions:i,additionalProperties:a,...o}=e;if(o.type||=`object`,o.description&&=bi(o.description),o.properties){o.properties=xi(o.properties,0);let e=Object.keys(o.properties);if(e.length>yi){let n=e.slice(0,yi),r=e.slice(yi),i={};n.forEach(e=>{i[e]=o.properties[e]}),i.additionalParams={type:`object`,description:t(`toolExec.additionalParamsDesc`,{count:r.length,names:r.join(`, `).slice(0,100)})},o.properties=i}}return o}Promise.resolve();async function Ci(){let e=gi,t;gi=new Promise(e=>{t=e}),await e;try{let{mcpEnabled:e}=await chrome.storage.local.get([`mcpEnabled`]);if(e!==!0)return r.debug(`[Background] MCP globaltoggleclosed,skip toolload`),0;wi();let[t,n]=await Promise.all([dt(),pt()]);if(!t.success||!t.tools||t.tools.length===0)return r.debug(`[Background] no available MCP tool`),0;let i=new Set;if(n?.servers)for(let e of n.servers)e.enabled===!1&&i.add(e.id);let a=0;for(let e of t.tools){if(i.has(e.serverId)){r.debug(`[Background] skip disabled MCP server "${e.serverName}" tool: ${e.name}`);continue}let t=`mcp_${e.serverId}_${e.name}`;if(mi.has(t))continue;let n={id:t,category:`mcp`,execution:`background`,parallelizable:!0,requiresConfirmation:!1,type:`function`,function:{name:t,description:bi(`[MCP:${e.serverName}] ${e.description||e.name}`,200),parameters:Si(e.inputSchema)}};c.push(n),f.push({id:n.id,type:n.type,function:n.function}),l[t]=`background`,ha[t]=async(t,n)=>{let r=await ft(e.serverId,e.name,t);return{success:r.success,content:r.content||r.error||``,tool_call_id:n}},mi.add(t),hi.set(t,{serverId:e.serverId,serverName:e.serverName,toolName:e.name}),a++}Mi();let o=t.tools.filter(e=>!i.has(e.serverId)).map(e=>({id:`mcp_${e.serverId}_${e.name}`,name:e.name,description:`[MCP:${e.serverName}] ${e.description||e.name}`,category:`mcp`,execution:`background`,parallelizable:!0,requiresConfirmation:!1,enabled:!0,serverId:e.serverId,serverName:e.serverName}));return await chrome.storage.local.set({mcpTools:o}),r.debug(`[Background] loaded ${a} MCP tool`),a}catch(e){return r.warn(`[Background] load MCP tool failed (Agent may not be supported MCP):`,e.message),0}finally{t()}}function wi(){for(let e of mi){let t=c.findIndex(t=>t.id===e);t>=0&&c.splice(t,1),t=f.findIndex(t=>t.id===e),t>=0&&f.splice(t,1),delete l[e],delete ha[e]}mi.clear(),hi.clear(),Mi(),chrome.storage.local.remove(`mcpTools`)}async function Ti(){let e=gi,t;gi=new Promise(e=>{t=e}),await e;try{wi()}finally{t()}}function Ei(e){return hi.get(e)||null}function Di(e){if(!e)return[];let t=e instanceof Set?e:new Set(e);if(t.size===0)return[];let n=[];for(let[e,r]of hi)t.has(r.serverId)&&n.push(e);return n}var Oi=new Map;function ki(e,t){e&&(Array.isArray(t)&&t.length>0?Oi.set(e,[...t]):Oi.delete(e))}function Ai(e){return e&&Oi.get(e)||null}function ji(e,t,n){if(!Array.isArray(n)||n.length===0)return e;let r=new Set(Di(n));if(r.size===0)return e;let i=new Set(e.map(e=>e.id)),a=[...e];for(let e of t)r.has(e.id)&&!i.has(e.id)&&a.push(e);return a}function Mi(){for(let e of Object.keys(ga))delete ga[e];m.clear(),_.clear();for(let e of c)e.execution===`background`&&ha[e.id]&&(ga[e.id]=ha[e.id]),e.parallelizable&&m.add(e.id),e.requiresConfirmation&&_.add(e.id)}var Ni=new Set,Pi=null;async function Fi(e,n){let{query:r,collectionId:i,topK:a}=e||{};if(!r||!String(r).trim())return q(!1,t(`toolExec.knowledgeQueryRequired`),{tool_call_id:n});let o={query:String(r)};if(i){let e=await Ii(i,`toolExec.knowledgeSearchDisabled`);if(e)return q(!1,e,{tool_call_id:n});o.collectionIds=[i]}a&&(o.topK=a);let s=await ht(o);if(!s||s.success!==!0)return q(!1,t(`toolExec.knowledgeSearchFailed`,{error:s?.error||t(`toolExec.unknownError`)}),{tool_call_id:n});let c=Array.isArray(s.results)?s.results:[];if(c.length===0)return q(!0,t(`toolExec.knowledgeSearchNoResult`,{query:String(r)}),{tool_call_id:n});let l=c.map((e,n)=>{let r=e.metadata||{},i=r.documentName||r.source||``,a=i?t(`toolExec.knowledgeSourcePart`,{source:i}):``,o=typeof e.score==`number`?e.score.toFixed(3):`-`;return`${t(`toolExec.knowledgeResultHeader`,{index:n+1,score:o,sourcePart:a})}\n${e.content||``}`});return q(!0,t(`toolExec.knowledgeSearchResult`,{count:c.length,results:l.join(`
346
346
 
347
- `)}),{tool_call_id:n})}async function gi(e,n){try{let r=await lt();if(!r||r.success!==!0)return null;let i=(Array.isArray(r.collections)?r.collections:[]).find(t=>t.id===e);if(i&&i.enabled===!1)return t(n)}catch{}return null}async function _i(e,n){let{collectionId:r,type:i,content:a,name:o,metadata:s}=e||{};if(!r||!i||!a)return J(!1,t(`toolExec.knowledgeIngestParamsRequired`),{tool_call_id:n});let c=await gi(r,`toolExec.knowledgeIngestDisabled`);if(c)return J(!1,c,{tool_call_id:n});let l;if(i===`text`)l={type:i,content:a,name:o,metadata:s};else if(i===`file`)l={type:i,path:a,metadata:s};else if(i===`url`)l={type:i,url:a,metadata:s};else return J(!1,t(`toolExec.knowledgeIngestBadType`,{type:i}),{tool_call_id:n});let u=await dt(r,l);return!u||u.success!==!0?J(!1,t(`toolExec.knowledgeIngestFailed`,{error:u?.error||t(`toolExec.unknownError`)}),{tool_call_id:n}):J(!0,t(`toolExec.knowledgeIngestSuccess`,{name:u.name||o||``,chunks:u.chunkCount||0}),{tool_call_id:n})}async function vi(e,n){let r=await lt();if(!r||r.success!==!0)return J(!1,t(`toolExec.knowledgeListFailed`,{error:r?.error||t(`toolExec.unknownError`)}),{tool_call_id:n});let i=(Array.isArray(r.collections)?r.collections:[]).filter(e=>e.enabled!==!1);if(i.length===0)return J(!0,t(`toolExec.knowledgeListEmpty`),{tool_call_id:n});let a=i.map(e=>t(`toolExec.knowledgeListItem`,{name:e.name||e.id,id:e.id,docs:e.documentCount||0,chunks:e.chunkCount||0}));return J(!0,t(`toolExec.knowledgeListResult`,{count:i.length,list:a.join(`
348
- `)}),{tool_call_id:n})}var yi={knowledge_search:hi,knowledge_ingest:_i,knowledge_list:vi};async function bi(){let e=await chrome.storage.local.get([`pairedAgents`,`activeAgentId`]),t=(e.pairedAgents||[]).find(t=>t.id===e.activeAgentId);if(!t)return!1;try{let e=new AbortController,n=setTimeout(()=>e.abort(),5e3),r=await fetch(`${t.url}/api/status`,{signal:e.signal,cache:`no-cache`});return clearTimeout(n),r.ok?(await r.json())?.ragAvailable===!0:!1}catch(e){return r.debug(`[Background] RAG availability check failed:`,e.message),!1}}async function xi(){let e=mi,t;mi=new Promise(e=>{t=e}),await e;try{let{ragEnabled:e}=await chrome.storage.local.get([`ragEnabled`]);if(e!==!0)return Si(),r.debug(`[Background] RAG globaltoggleclosed,skip toolload`),0;if(Si(),!await bi())return r.debug(`[Background] Agent RAG not available, skip tool load`),0;for(let e of Gr)f.push(e),m.push({id:e.id,type:e.type,function:e.function}),d[e.id]=`background`,Yi[e.id]=yi[e.id],pi.add(e.id);return fi(),Ci(),r.debug(`[Background] loaded ${pi.size} RAG tool`),pi.size}catch(e){return r.warn(`[Background] load RAG tool failed:`,e.message),0}finally{t()}}function Si(){for(let e of pi){let t=f.findIndex(t=>t.id===e);t>=0&&f.splice(t,1),t=m.findIndex(t=>t.id===e),t>=0&&m.splice(t,1),delete d[e],delete Yi[e]}pi.clear(),fi(),Ci()}function Ci(){let e=Gr.filter(e=>pi.has(e.id)).map(e=>({id:e.id,name:e.function?.name||e.id,description:e.function?.description||``,category:e.category||`knowledge`,execution:e.execution||`background`,parallelizable:e.parallelizable!==!1,requiresConfirmation:e.requiresConfirmation||!1,enabled:!0}));chrome.storage.local.set({ragTools:e}).catch(()=>{})}async function wi(){let e=mi,t;mi=new Promise(e=>{t=e}),await e;try{Si()}finally{t()}}var Ti=`sensitiveAuditLog`,Ei=100;async function Di(e,t,n={}){try{let r=(await chrome.storage.local.get([Ti]))[Ti]||[];r.unshift({timestamp:new Date().toISOString(),category:e,action:t,details:n}),r.length>Ei&&(r.length=Ei),await chrome.storage.local.set({[Ti]:r})}catch(e){console.warn(`[Background] Audit log write failed:`,e)}}var Oi=new Map,ki=3e4;function Ai(e){e?Oi.delete(e):Oi.clear()}async function ji(){let e=await chrome.storage.local.get([`pairedAgents`,`activeAgentId`]),t=(e.pairedAgents||[]).find(t=>t.id===e.activeAgentId);if(!t)return Oi.clear(),ze(`__global__`,!1),!1;let n=Date.now(),r=Oi.get(t.id);if(r&&r.connected!==null&&n-r.checkedAt<ki)return r.connected;try{let e=new AbortController,r=setTimeout(()=>e.abort(),5e3),i=await fetch(`${t.url}/api/status`,{signal:e.signal,cache:`no-cache`});clearTimeout(r);let a=i.ok;return Oi.set(t.id,{connected:a,checkedAt:n}),ze(t.id,a),console.log(`[Background] Agent connectivity check:`,a?`reachable`:`unreachable (status=`+i.status+`)`),a}catch(e){return Oi.set(t.id,{connected:!1,checkedAt:n}),ze(t.id,!1),console.log(`[Background] Agent connectivity check: unreachable (`+(e.name===`AbortError`?`timeout`:e.message)+`)`),!1}}async function Mi(e=null,n=null,r=null,i=null,a=null){return new Promise(o=>{let s=`agentEnabledTools_${n||`default`}`,c=`agentMcpClosedServers_${n||`default`}`;chrome.storage.local.get([s,`enabledTools`,`enableImageInput`,`pairedAgents`,`enableToolPreselect`,c],async n=>{let l=n[s];Array.isArray(l)||(l=n.enabledTools),Array.isArray(l)||(l=m.map(e=>e.id),console.log(`[Background] tool configuration not found, using default value (all enabled)`));let u={open_tab:`manage_tab`,switch_tab:`manage_tab`,close_tab:`manage_tab`,reload_tab:`manage_tab`,navigate_back_forward:`manage_tab`,search_bookmarks:`search_browser_data`,search_history:`search_browser_data`,agent_list_trash:`agent_trash`,agent_restore_trash:`agent_trash`,ai_agent_list:`manage_agent`,ai_agent_switch:`manage_agent`,manage_ai_agent:`manage_agent`,dispatch_sub_agent:`dispatch_task`,search_conversation_memory:`search_chats`,preview_ui_prototype:`preview_ui`,agent_read_file:`agent_file`,agent_write_file:`agent_file`,agent_list_dir:`agent_file`,agent_delete_file:`agent_file`,agent_download_file:`agent_file`,agent_search_files:`agent_search`,agent_search_content:`agent_search`,agent_skill_load:`agent_skill`,agent_workflow_run:`agent_skill`,click_element:`interact_element`,hover_element:`interact_element`,agent_exec_command:`agent_exec`,get_page_content:`page_content`,get_iframe_content:`iframe_content`,get_browser_info:`browser_info`,get_tabs:`list_tabs`,wait_for_element:`wait_element`,wait_for_navigation:`wait_navigation`,query_interactive_elements:`query_elements`,scroll_and_collect:`scroll_collect`,drag_and_drop:`drag_drop`,show_notification:`notify`,generate_qrcode:`qrcode`,clear_page_data:`clear_data`,search_chat_history:`search_chats`,ui_prototype:`preview_ui`},d=!1;l=l.map(e=>u[e]?(d=!0,u[e]):e),l=[...new Set(l)],d&&console.log(`[Background] detected old tool name,migrated to merged new tool name`);let f=e?l.filter(t=>e.includes(t)):l;if(e&&console.log(`[Background] tool filter: ${l.length} global → ${f.length} final`),r!=null&&Array.isArray(r)&&r.length>0&&(f.includes(`agent_skill`)||(f.push(`agent_skill`),console.log(`[Background] auto-adding skill tool: agent_skill`))),pi.size>0){let{ragToolsIntroduced:e}=await chrome.storage.local.get([`ragToolsIntroduced`]);if(e!==!0){for(let e of pi)f.includes(e)||f.push(e);console.log(`[Background] auto-adding ${pi.size} RAG knowledge tools (not yet introduced)`)}}let p=n.enableImageInput===!0,h=n.enableToolPreselect===!0;console.log(`[Background] getTools - enableToolPreselect:`,h);let g=await ji(),_=(n.pairedAgents||[]).length;console.log(`[Background] tool configuration: ${f.length} enable, Agent=${g}, image recognition=${p}`);let{mcpEnabled:v,skillsEnabled:y}=await chrome.storage.local.get([`mcpEnabled`,`skillsEnabled`]),b=new Set(Array.isArray(n[c])?n[c]:[]),x=new Set(Array.isArray(a)?a:[]),S=new Set(Array.isArray(i)?i:[]),C=m.filter(e=>e.id.startsWith(`mcp_`)?!0:f.includes(e.id)).filter(e=>{if(e.id.startsWith(`agent_`)&&!g||e.id===`manage_agent`&&_<2||e.id===`agent_skill`&&y===!1)return!1;if(e.id.startsWith(`mcp_`)){if(v!==!0||!g||!Jr.has(e.id))return!1;let t=Yr.get(e.id);if(t){if(S.has(t.serverId))return!0;if(b.has(t.serverId)||x.has(t.serverId))return!1}return!0}return!(e.id.startsWith(`knowledge_`)&&(!pi.has(e.id)||!g))}),w=C.map(e=>{let r=JSON.parse(JSON.stringify(e));if(e.id===`capture_page`){let e=r.function.parameters.properties.action;p||(e.enum=[`download`],e.description=t(`toolExec.captureDownloadAction`),e.default=`download`,r.function.description=t(`toolExec.captureDownloadDesc`))}if(e.id===`plan_task`){let e=n.preselectMinToolCount||10,i=h&&C.length>e;if(console.log(`[Background] getTools - processing plan_task, enableToolPreselect:`,h,`toolCount:`,C.length,`threshold:`,e,`shouldAdd:`,i),i){r.function.description=`任务规划与拆解,将复杂任务分解为子任务。重要:必须为每个子任务的 requiredTools 字段指定所需工具ID列表,子任务仅继承此处指定的工具。`;let e=r.function.parameters.properties.subtasks.items.properties;e.requiredTools={type:`array`,items:{type:`string`},description:t(`toolExec.requiredToolsDesc`,{tools:C.map(e=>e.id).join(`, `)})};let n=r.function.parameters.properties.subtasks.items.required;n.includes(`requiredTools`)||n.push(`requiredTools`),console.log(`[Background] getTools - added requiredTools to plan_task (required)`)}}return r});console.log(`[Background] finalavailable tools: ${w.length} `),o(w)})})}chrome.storage?.onChanged?.addListener?.(e=>{if(e.mcpEnabled){let t=e.mcpEnabled.newValue===!0;r.debug(`[Background] MCP globaltoggle changed:`,t),t?ri().then(e=>{r.debug(`[Background] MCP tools re-load:`,e,``)}):ai().then(()=>{r.debug(`[Background] MCP all toolsunload`)})}if(e.skillsEnabled&&console.log(`[Background] Skill global toggle changed:`,e.skillsEnabled.newValue!==!1),e.ragEnabled){let t=e.ragEnabled.newValue===!0;r.debug(`[Background] RAG globaltoggle changed:`,t),t?xi().then(e=>{r.debug(`[Background] RAG tools re-load:`,e,``)}):wi().then(()=>{r.debug(`[Background] RAG all toolsunload`)})}});async function Ni(e,n,r=null){let{action:i=`both`,tabId:a,format:o=`jpeg`,quality:s=60,visionMaxDim:c=1024,visionQuality:l=65}=e;try{let e,u,d=``,f=``;if(a)try{let t=await chrome.tabs.get(a);e=t.id,u=t.windowId,d=t.url||``,f=t.title||``,await chrome.tabs.update(e,{active:!0}),await new Promise(e=>setTimeout(e,300))}catch{return J(!1,t(`toolExec.tabNotExistOrAccessible`,{tabId:a}),{tool_call_id:n})}else{let r=await chrome.tabs.query({active:!0,currentWindow:!0});if(!r.length)return J(!1,t(`toolExec.cannotGetCurrentTab`),{tool_call_id:n});e=r[0].id,u=r[0].windowId,d=r[0].url||``,f=r[0].title||``}console.log(`[Background] taking screenshot: tabId=`,e,`url=`,d,`action=`,i,`format=`,o,`quality=`,s,`visionMaxDim=`,c,`visionQuality=`,l);let p=await new Promise((e,t)=>{chrome.tabs.captureVisibleTab(u,{format:o,quality:s},n=>{chrome.runtime.lastError?t(Error(chrome.runtime.lastError.message)):e(n)})}),m=(p.length/1024).toFixed(1);console.log(`[Background] screenshot complete,size:`,m,`KB`),chrome.storage.local.set({_lastVisionScreenshot:{dataUrl:p,sizeKB:m,url:d,title:f,timestamp:Date.now()}}).catch(()=>{});let h=i===`download`||i===`both`,g=i===`analyze`||i===`both`;if(h&&Tn(p,o),g){let e=await Pi(p,c,l/100),i=(e.length/1024).toFixed(1);console.log(`[Background] screenshot compressed size:`,i,`KB (maxDim:`,c,`quality:`,l,`)`);let a=await Fi(e,d,f,r);return h?J(!0,`${t(`toolExec.screenshotDownloaded`,{size:m})}。\n\n${a}`,{tool_call_id:n}):J(!0,a,{tool_call_id:n})}let _=(p.length/1024/1024).toFixed(2);return J(!0,t(`toolExec.screenshotSuccess`,{size:_,format:o===`png`?`png`:`jpg`,quality:s}),{tool_call_id:n})}catch(e){return J(!1,t(`toolExec.screenshotFailed`,{error:e.message}),{tool_call_id:n})}}async function Pi(e,t=1024,n=.65){try{let r=await(await fetch(e)).blob(),i=await createImageBitmap(r),{width:a,height:o}=i;(a>t||o>t)&&(a>o?(o=Math.round(t/a*o),a=t):(a=Math.round(t/o*a),o=t));let s=new OffscreenCanvas(a,o);s.getContext(`2d`).drawImage(i,0,0,a,o);let c=await s.convertToBlob({type:`image/jpeg`,quality:n});return new Promise((e,t)=>{let n=new FileReader;n.onloadend=()=>e(n.result),n.onerror=t,n.readAsDataURL(c)})}catch(t){return console.warn(`[Background] image compression failed, using original screenshot:`,t.message),e}}async function Fi(e,n,r,i=null){let a=await new Promise(e=>{chrome.storage.local.get([`imageApiBase`,`imageApiKey`,`imageModelName`,`apiBase`,`apiKey`,`modelName`,`streamEnabled`],e)}),o=a.imageApiBase||a.apiBase,s=a.imageApiKey||a.apiKey,c=a.imageModelName||a.modelName,l=a.streamEnabled!==!1;if(!o||!s)return console.log(`[Background] image recognition API not configured,returnscreenshotbasicinfo`),t(`toolExec.screenshotBasicInfo`,{title:r,url:n});console.log(`[Background] calling image recognition API to analyze screenshot,model:`,c,`endpoint:`,o,`streaming:`,l);let u=t(`toolExec.visionPrompt`,{title:r,url:n}),d=new AbortController,f=setTimeout(()=>d.abort(),6e4);try{let t={model:c,messages:[{role:`user`,content:[{type:`text`,text:u},{type:`image_url`,image_url:{url:e,detail:`auto`}}]}],max_tokens:2e3};l&&(t.stream=!0);let a=await fetch(`${o}/chat/completions`,{method:`POST`,headers:{"Content-Type":`application/json`,Authorization:`Bearer ${s}`},body:JSON.stringify(t),signal:d.signal});if(clearTimeout(f),!a.ok){let e=await a.text().catch(()=>``);return console.error(`[Background] image recognition API request failed:`,a.status,e),`页面截图已获取。\n\n- 页面标题: ${r}\n- 页面地址: ${n}\n\n图片识别分析失败(API 返回 ${a.status}),请检查图片识别 API 配置。`}let p;return p=l?await Ii(a,d,i):(await a.json()).choices?.[0]?.message?.content,p?(console.log(`[Background] image recognition analysis complete,result length:`,p.length),`页面截图分析结果:\n\n**页面**: ${r}\n**地址**: ${n}\n\n${p}`):(console.error(`[Background] image recognition API result is empty`),`页面截图已获取。\n\n- 页面标题: ${r}\n- 页面地址: ${n}\n\n图片识别返回结果为空,请重试。`)}catch(e){return clearTimeout(f),console.error(`[Background] image recognition API call exception:`,e.message),e.name===`AbortError`?`页面截图已获取。\n\n- 页面标题: ${r}\n- 页面地址: ${n}\n\n图片识别分析超时(60秒),请检查图片识别 API 是否可用或尝试重新截图。`:t(`toolExec.screenshotAnalysisError`,{title:r,url:n,error:e.message})}}async function Ii(e,t,n=null){let r=e.body.getReader(),i=new TextDecoder,a=``,o=``;try{for(;;){let e;e=t&&t.signal?await Promise.race([r.read(),new Promise((e,n)=>{if(t.signal.aborted){n(new DOMException(`Aborted`,`AbortError`));return}t.signal.addEventListener(`abort`,()=>n(new DOMException(`Aborted`,`AbortError`)),{once:!0})})]):await r.read();let{done:s,value:c}=e;if(s)break;a+=i.decode(c,{stream:!1});let l=a.split(`
349
- `);a=l.pop()||``;for(let e of l){let t=``;if(e.startsWith(`data:`)&&(t=e.substring(5).replace(/^\s+/,``)),!(!t||t===`[DONE]`))try{let e=JSON.parse(t),r=e.choices?.[0]?.delta?.content||e.choices?.[0]?.message?.content||e.choices?.[0]?.text||``;r&&(o+=r,n&&chrome.runtime.sendMessage({type:`VISION_ANALYSIS_CHUNK`,sessionId:n,delta:r}).catch(()=>{}))}catch(e){console.warn(`[Background] image recognition SSE parse failed,raw data:`,t.substring(0,200),`error:`,e.message)}}}}finally{r.releaseLock()}return o}function J(e,t,n={}){return{success:e,content:t,...n}}function Li(e){if(e===0)return`0 B`;let t=[`B`,`KB`,`MB`,`GB`,`TB`],n=1024,r=Math.floor(Math.log(e)/Math.log(n));return`${(e/n**r).toFixed(r===0?0:1)} ${t[r]}`}function Ri(e,n){if(e&&typeof e==`object`&&`success`in e){if(!(`content`in e)){if(e.message)e.content=e.message;else if(!e.success&&e.error){let n=String(e.error).replace(/\\/g,`\\\\`).replace(/"/g,`\\"`);e.content=t(`toolExec.operationFailed`,{error:n}),e.message=e.error}else{let{success:t,error:n,tool_call_id:r,...i}=e;e.content=JSON.stringify(i),e.metadata=i}console.warn(`[Background] toolreturnformatnon-standard (missing content field),auto-filled`)}return e.tool_call_id||=n,e}return typeof e==`string`?(console.warn(`[Background] toolreturnpurecharsstring but non-standardobject,use instead with makeResult()`),{success:!0,content:e,tool_call_id:n}):{success:!1,error:t(`toolExec.unknownResultFormat`),content:``,tool_call_id:n}}async function zi(e,t,n){try{let r=`toolUsageStats`,i=(await chrome.storage.local.get([r]))[r]||{},a=i[e]||{callCount:0,successCount:0,totalDuration:0,lastUsed:0};a.callCount++,t.success&&a.successCount++,a.totalDuration+=n,a.lastUsed=Date.now(),i[e]=a,chrome.storage.local.set({[r]:i})}catch(e){console.warn(`[Background] recordtoolstats failed:`,e)}}function Bi(){return new Promise(e=>{chrome.tabs.query({active:!0,currentWindow:!0},t=>{e(t&&t.length>0?t[0].id:null)})})}async function Vi(e,n,r){return new Promise(i=>{chrome.tabs.sendMessage(e,n,a=>{if(chrome.runtime.lastError){let a=chrome.runtime.lastError.message;console.warn(`[Background] sendmessage to content script failed:`,a),chrome.tabs.get(e,o=>{if(chrome.runtime.lastError||!o){i({success:!1,error:t(`toolExec.tabAccessDenied`,{error:a}),tool_call_id:r});return}let s=o.url||``;if(s.startsWith(`chrome://`)||s.startsWith(`chrome-extension://`)||s.startsWith(`about:`)||s.startsWith(`chrome-error://`)){s.startsWith(`chrome-error://`)?i({success:!1,error:t(`toolExec.tabErrorPage`),tool_call_id:r}):i({success:!1,error:t(`toolExec.systemPageNotAllowed`,{url:s}),tool_call_id:r});return}console.log(`[Background] attempt autoinject content script to Tab:`,e);let c=chrome.runtime.getManifest().content_scripts?.[0]?.js||[],l=c.findIndex(e=>/content/i.test(e)&&e.endsWith(`.js`)),u=l===-1?c:[c[l]];if(l===-1&&u.length===0){i({success:!1,error:t(`toolExec.contentScriptNotFound`),tool_call_id:r});return}chrome.scripting.executeScript({target:{tabId:e},files:u}).then(()=>{console.log(`[Background] Content script inject successful, startretrysendmessage`),d(e,n,0)}).catch(e=>{console.warn(`[Background] inject content script failed:`,e.message),e.message&&e.message.includes(`error page`)?i({success:!1,error:t(`toolExec.tabErrorPage`),tool_call_id:r}):i({success:!1,error:t(`toolExec.contentScriptInjectFailed`,{error:e.message}),tool_call_id:r})});function d(e,t,n){let a=[300,600,1200],o=a.length;setTimeout(()=>{chrome.tabs.sendMessage(e,t,s=>{chrome.runtime.lastError?n<o-1?(console.warn(`[Background] retry ${n+2}/${o+1} failed, ${a[n+1]}ms after retry:`,chrome.runtime.lastError.message),d(e,t,n+1)):(console.warn(`[Background] all has retryaverage failed:`,chrome.runtime.lastError.message),i({success:!1,error:chrome.runtime.lastError.message,tool_call_id:r})):(console.log(`[Background] retry successful (`+(n+2)+` times)`),i({...s,tool_call_id:r}))})},a[n])}})}else i({...a,tool_call_id:r})})})}async function Hi(e,n,r){let{action:i}=e;switch(i){case`open`:return ua(e,n,r);case`switch`:return da(e,n,r);case`close`:return fa(e,n);case`reload`:return va(e,n);case`navigate`:return _a(e,n);default:return J(!1,t(`toolExec.unknownManageTabAction`,{action:i}),{tool_call_id:n})}}async function Ui(e,n){let{action:r}=e;switch(r){case`bookmark`:return $i(e,n);case`history`:return ea(e,n);default:return J(!1,t(`toolExec.unknownSearchBrowserDataAction`,{action:r}),{tool_call_id:n})}}async function Wi(e,n){let{action:r}=e;switch(r){case`list`:return Oa(e,n);case`restore`:return ka(e,n);default:return J(!1,t(`toolExec.unknownAgentTrashAction`,{action:r}),{tool_call_id:n})}}async function Gi(e,n){let{action:r}=e;switch(r){case`list`:return Wa(e,n);case`switch`:return Ga(e,n);default:return J(!1,t(`toolExec.unknownManageAgentAction`,{action:r}),{tool_call_id:n})}}async function Ki(e,n){let{action:r}=e;switch(r){case`read`:return Ca(e,n);case`write`:return Ta(e,n);case`list`:return Ea(e,n);case`delete`:return Da(e,n);case`download`:return Aa(e,n);default:return J(!1,t(`toolExec.unknownAgentFileAction`,{action:r}),{tool_call_id:n})}}async function qi(e,n){let{searchType:r}=e;switch(r){case`file`:return Pa(e,n);case`content`:return Fa(e,n);default:return J(!1,t(`toolExec.unknownAgentSearchType`,{type:r}),{tool_call_id:n})}}async function Ji(e,n,r){let{scope:i=`last_n_rounds`,rounds:a=3,sessionId:o}=e,s=o||r||await D();if(!s)return J(!1,t(`toolExec.cannotGetSessionId`),{tool_call_id:n});let c=await k(s);if(!c)return J(!1,t(`toolExec.sessionNotFound`,{id:s}),{tool_call_id:n});let l=(c.messageHistory||[]).map((e,t)=>({msg:e,idx:t})).filter(({msg:e})=>e.role===`assistant`&&Array.isArray(e.executionLog)&&e.executionLog.length>0);if(l.length===0)return J(!0,t(`toolExec.noExecutionLog`),{tool_call_id:n});let u;u=i===`full_session`?l:l.slice(-Math.min(a,l.length));let d=[],f=[],p=[],m=[];for(let{msg:e,idx:n}of u){let r=n+1,i=e.executionLog||[];for(let e of i){let n=e.nodeType;if(m.push({round:r,nodeType:n,nodeName:e.nodeName||e.action?.name||t(`toolExec.unknown`),status:e.status||`unknown`,timestamp:e.timestamp||null,toolName:e.action?.name||null}),n===`tool_exec`){let n=e.action?.name||e.nodeName||t(`toolExec.unknownTool`,{name:`unknown`}),i=e.action?.arguments||e.action?.args||{},a=e.status;a===`success`?d.push({round:r,tool:n,args:i,result:e.observation||e.result||`成功`,description:e.nodeName||``}):(a===`failed`||a===`cancelled`)&&f.push({round:r,tool:n,args:i,status:a,error:e.error||e.observation||e.result||t(`toolExec.unknownError`),description:e.nodeName||``})}n===`reflection`&&p.push({round:r,tool:e.action?.name||e.nodeName||t(`toolExec.unknown`),effective:e.effective===void 0?null:e.effective,reasoning:e.reasoning||e.analysis||``,suggestion:e.suggestion||e.advice||``,reflectionType:e.reflectionType||``})}}let h=u.length,g=m.length,_=m.filter(e=>e.status===`success`).length,v=m.filter(e=>e.status===`failed`||e.status===`cancelled`).length,y={sessionId:s,scope:i,roundsAnalyzed:h,stats:{totalSteps:g,successCount:_,failCount:v,successRate:g>0?(_/g*100).toFixed(1)+`%`:`0%`},successPaths:d,failures:f,reflections:p,timeline:m},b=[];if(b.push(`## 执行日志提炼报告`),b.push(``),b.push(`**会话**: ${c.title||s.slice(0,8)}`),b.push(`**分析范围**: ${i}(${h} 轮)`),b.push(`**统计**: 共 ${g} 步,成功 ${_},失败 ${v},成功率 ${y.stats.successRate}`),b.push(``),d.length>0){b.push(`### ✅ 成功路径`),b.push(``);for(let e of d)b.push(`- **[轮次${e.round}]** 工具 \`${e.tool}\` → ${typeof e.result==`string`?e.result.substring(0,100):`执行成功`}`);b.push(``)}if(f.length>0){b.push(`### ❌ 失败教训`),b.push(``);for(let e of f)b.push(`- **[轮次${e.round}]** 工具 \`${e.tool}\` ${e.status}: ${typeof e.error==`string`?e.error.substring(0,150):`未知错误`}`);b.push(``)}if(p.length>0){b.push(`### 🎯 反思建议`),b.push(``);for(let e of p)b.push(`- **[轮次${e.round}]** 工具 \`${e.tool}\``),e.reasoning&&b.push(` - 推理: ${e.reasoning.substring(0,200)}`),e.suggestion&&b.push(` - 建议: ${e.suggestion.substring(0,200)}`);b.push(``)}return J(!0,b.join(`
350
- `),{tool_call_id:n,extractedData:y})}var Yi={capture_page:Ni,clarify_question:na,notify:ra,fetch_url:oa,list_tabs:pa,browser_info:ca,download_file:la,manage_cookies:ma,plan_task:ha,clear_data:ga,search_chats:ta,preview_ui:ya,agent_file:Ki,agent_exec:Ma,agent_search:qi,agent_skill:Sa,wait_navigation:wa,handle_dialog:sa,dispatch_task:wn,agent_memory:async(e,t,n)=>Gn(e,t,n),debug_page:Wr,page_content:Ra,extract_data:za,clipboard:Ba,manage_tab:Hi,search_browser_data:Ui,agent_trash:Wi,manage_agent:Gi,exec_log:Ji},Xi={};for(let e of f)e.execution===`background`&&Yi[e.id]&&(Xi[e.id]=Yi[e.id]);var Zi={};for(let e of f)if(e.execution===`content_script`){let t=e.function.parameters?.properties;if(t){let n=Object.keys(t);Zi[e.id]=e=>{let t={};for(let r of n)t[r]=e[r];return t}}else Zi[e.id]=()=>({})}Zi.search_in_page=e=>({query:e.query||e.pattern,mode:e.mode,caseSensitive:e.caseSensitive,contextLength:e.contextLength,maxResults:e.maxResults,highlight:e.highlight});async function Qi(e,n,r=null){let i=Date.now(),{name:a,arguments:o,id:s,function:c,index:l}=e,u=a||c&&c.name,f=s,p={};if(console.log(`[Background] tool callraw data:`,JSON.stringify(e)),c&&c.arguments){console.log(`[Background] toolCall.function.arguments type:`,typeof c.arguments);try{p=kn(c.arguments)||{}}catch(e){return console.error(`[Background] parsetool parameter failed:`,e,`originalvalue:`,JSON.stringify(c.arguments).substring(0,300)),{success:!1,error:t(`toolExec.argParseFailed`),tool_call_id:f}}let e=typeof c.arguments==`string`?c.arguments.trim():JSON.stringify(c.arguments);Object.keys(p).length===0&&e.length>0&&e!==`{}`&&console.error(`[Background] parameterparse after empty object!original arguments:`,JSON.stringify(c.arguments).substring(0,300))}else if(typeof o==`object`)p=o||{};else if(typeof o==`string`){console.log(`[Background] using backup argsStr parse:`,o.substring(0,300));try{p=kn(o)||{}}catch(e){return console.error(`[Background] parsetool parameter failed:`,e,`originalvalue:`,o),{success:!1,error:t(`toolExec.argParseFailed`),tool_call_id:f}}}console.log(`[Background] exec tool:`,u,p,`id:`,f);let m=d[u],h;if(m===`background`){let e=Xi[u];e?(console.log(`[Background] ${u} directly execute, not passed content script`),h=await e(p,f,r,n)):h={success:!1,error:t(`toolExec.unknownTool`,{name:u}),tool_call_id:f}}else if(m===`content_script`){let e=Zi[u];if(e){let n=u.toUpperCase(),i=e(p),a=r?L(r):null,o=p.tabId||a||await Bi();h=o?await Vi(o,{type:n,...i},f):{success:!1,error:t(`toolExec.noTabAvailable`),tool_call_id:f}}else h={success:!1,error:t(`toolExec.unknownTool`,{name:u}),tool_call_id:f}}else h={success:!1,error:t(`toolExec.unknownTool`,{name:u}),tool_call_id:f};h=Ri(h,f);let g=Date.now()-i;return zi(u,h,g),h}function $i(e,n){let r=e.query||``,a=parseInt(e.maxResults,10)||10;return console.log(`[Background] exec bookmarksearch:`,`query=`,JSON.stringify(r),`maxResults=`,a),new Promise(e=>{if(!chrome.bookmarks){console.error(`[Background] chrome.bookmarks API non- with `),e(J(!1,t(`toolExec.bookmarkApiUnavailable`)));return}if(!r||r.trim()===``){console.log(`[Background] emptyquery,getbookmark rootnode...`),chrome.bookmarks.getTree(n=>{if(console.log(`[Background] chrome.bookmarks.getTree callback, tree node count:`,n?n.length:`null`),chrome.runtime.lastError){console.error(`[Background] chrome.bookmarks.getTree error:`,chrome.runtime.lastError.message),e(J(!1,t(`toolExec.bookmarkFetchFailed`,{error:chrome.runtime.lastError.message})));return}let r=[];function o(e){e&&e.forEach(e=>{e.url&&r.push(e),e.children&&e.children.length>0&&o(e.children)})}if(o(n),console.log(`[Background] receiset to total bookmarks:`,r.length),r.length===0){e(J(!0,t(`toolExec.noBookmarks`)));return}let s=r.slice(0,a).map(e=>({title:e.title||t(`toolExec.noTitle`),url:e.url||``,dateAdded:e.dateAdded?new Date(e.dateAdded).toLocaleString(i()===`en`?`en-US`:`zh-CN`):null})),c=`${t(`toolExec.bookmarksCount`,{total:r.length,shown:s.length})}\n`+s.map((e,t)=>`${t+1}. ${e.title}\n URL: ${e.url}`).join(`
347
+ `)}),{tool_call_id:n})}async function Ii(e,n){try{let r=await mt();if(!r||r.success!==!0)return null;let i=(Array.isArray(r.collections)?r.collections:[]).find(t=>t.id===e);if(i&&i.enabled===!1)return t(n)}catch{}return null}async function Li(e,n){let{collectionId:r,type:i,content:a,name:o,metadata:s}=e||{};if(!r||!i||!a)return q(!1,t(`toolExec.knowledgeIngestParamsRequired`),{tool_call_id:n});let c=await Ii(r,`toolExec.knowledgeIngestDisabled`);if(c)return q(!1,c,{tool_call_id:n});let l;if(i===`text`)l={type:i,content:a,name:o,metadata:s};else if(i===`file`)l={type:i,path:a,metadata:s};else if(i===`url`)l={type:i,url:a,metadata:s};else return q(!1,t(`toolExec.knowledgeIngestBadType`,{type:i}),{tool_call_id:n});let u=await gt(r,l);return!u||u.success!==!0?q(!1,t(`toolExec.knowledgeIngestFailed`,{error:u?.error||t(`toolExec.unknownError`)}),{tool_call_id:n}):q(!0,t(`toolExec.knowledgeIngestSuccess`,{name:u.name||o||``,chunks:u.chunkCount||0}),{tool_call_id:n})}async function Ri(e,n){let r=await mt();if(!r||r.success!==!0)return q(!1,t(`toolExec.knowledgeListFailed`,{error:r?.error||t(`toolExec.unknownError`)}),{tool_call_id:n});let i=(Array.isArray(r.collections)?r.collections:[]).filter(e=>e.enabled!==!1);if(i.length===0)return q(!0,t(`toolExec.knowledgeListEmpty`),{tool_call_id:n});let a=i.map(e=>t(`toolExec.knowledgeListItem`,{name:e.name||e.id,id:e.id,docs:e.documentCount||0,chunks:e.chunkCount||0}));return q(!0,t(`toolExec.knowledgeListResult`,{count:i.length,list:a.join(`
348
+ `)}),{tool_call_id:n})}var zi={knowledge_search:Fi,knowledge_ingest:Li,knowledge_list:Ri};async function Bi(){let e=await chrome.storage.local.get([`pairedAgents`,`activeAgentId`]),t=(e.pairedAgents||[]).find(t=>t.id===e.activeAgentId);if(!t)return!1;try{let e=new AbortController,n=setTimeout(()=>e.abort(),5e3),r=await fetch(`${t.url}/api/status`,{signal:e.signal,cache:`no-cache`});return clearTimeout(n),r.ok?(await r.json())?.ragAvailable===!0:!1}catch(e){return r.debug(`[Background] RAG availability check failed:`,e.message),!1}}async function Vi(){let e=Pi,t;Pi=new Promise(e=>{t=e}),await e;try{let{ragEnabled:e}=await chrome.storage.local.get([`ragEnabled`]);if(e!==!0)return Hi(),r.debug(`[Background] RAG globaltoggleclosed,skip toolload`),0;if(Hi(),!await Bi())return r.debug(`[Background] Agent RAG not available, skip tool load`),0;for(let e of di)c.push(e),f.push({id:e.id,type:e.type,function:e.function}),l[e.id]=`background`,ha[e.id]=zi[e.id],Ni.add(e.id);return Mi(),Ui(),r.debug(`[Background] loaded ${Ni.size} RAG tool`),Ni.size}catch(e){return r.warn(`[Background] load RAG tool failed:`,e.message),0}finally{t()}}function Hi(){for(let e of Ni){let t=c.findIndex(t=>t.id===e);t>=0&&c.splice(t,1),t=f.findIndex(t=>t.id===e),t>=0&&f.splice(t,1),delete l[e],delete ha[e]}Ni.clear(),Mi(),Ui()}function Ui(){let e=di.filter(e=>Ni.has(e.id)).map(e=>({id:e.id,name:e.function?.name||e.id,description:e.function?.description||``,category:e.category||`knowledge`,execution:e.execution||`background`,parallelizable:e.parallelizable!==!1,requiresConfirmation:e.requiresConfirmation||!1,enabled:!0}));chrome.storage.local.set({ragTools:e}).catch(()=>{})}async function Wi(){let e=Pi,t;Pi=new Promise(e=>{t=e}),await e;try{Hi()}finally{t()}}var Gi=`sensitiveAuditLog`,Ki=100;async function qi(e,t,n={}){try{let r=(await chrome.storage.local.get([Gi]))[Gi]||[];r.unshift({timestamp:new Date().toISOString(),category:e,action:t,details:n}),r.length>Ki&&(r.length=Ki),await chrome.storage.local.set({[Gi]:r})}catch(e){console.warn(`[Background] Audit log write failed:`,e)}}var Ji=new Map,Yi=3e4;function Xi(e){e?Ji.delete(e):Ji.clear()}async function Zi(){let e=await chrome.storage.local.get([`pairedAgents`,`activeAgentId`]),t=(e.pairedAgents||[]).find(t=>t.id===e.activeAgentId);if(!t)return Ji.clear(),Ue(`__global__`,!1),!1;let n=Date.now(),r=Ji.get(t.id);if(r&&r.connected!==null&&n-r.checkedAt<Yi)return r.connected;try{let e=new AbortController,r=setTimeout(()=>e.abort(),5e3),i=await fetch(`${t.url}/api/status`,{signal:e.signal,cache:`no-cache`});clearTimeout(r);let a=i.ok;return Ji.set(t.id,{connected:a,checkedAt:n}),Ue(t.id,a),console.log(`[Background] Agent connectivity check:`,a?`reachable`:`unreachable (status=`+i.status+`)`),a}catch(e){return Ji.set(t.id,{connected:!1,checkedAt:n}),Ue(t.id,!1),console.log(`[Background] Agent connectivity check: unreachable (`+(e.name===`AbortError`?`timeout`:e.message)+`)`),!1}}async function Qi(e=null,n=null,r=null,i=null,a=null){return new Promise(o=>{let s=`agentEnabledTools_${n||`default`}`,c=`agentMcpClosedServers_${n||`default`}`;chrome.storage.local.get([s,`enabledTools`,`enableImageInput`,`pairedAgents`,`enableToolPreselect`,c],async n=>{let l=n[s];Array.isArray(l)||(l=n.enabledTools),Array.isArray(l)||(l=f.map(e=>e.id),console.log(`[Background] tool configuration not found, using default value (all enabled)`));let u={open_tab:`manage_tab`,switch_tab:`manage_tab`,close_tab:`manage_tab`,reload_tab:`manage_tab`,navigate_back_forward:`manage_tab`,search_bookmarks:`search_browser_data`,search_history:`search_browser_data`,agent_list_trash:`agent_trash`,agent_restore_trash:`agent_trash`,ai_agent_list:`manage_agent`,ai_agent_switch:`manage_agent`,manage_ai_agent:`manage_agent`,dispatch_sub_agent:`dispatch_task`,search_conversation_memory:`search_chats`,preview_ui_prototype:`preview_ui`,agent_read_file:`agent_file`,agent_write_file:`agent_file`,agent_list_dir:`agent_file`,agent_delete_file:`agent_file`,agent_download_file:`agent_file`,agent_search_files:`agent_search`,agent_search_content:`agent_search`,agent_skill_load:`agent_skill`,agent_workflow_run:`agent_skill`,click_element:`interact_element`,hover_element:`interact_element`,agent_exec_command:`agent_exec`,get_page_content:`page_content`,get_iframe_content:`iframe_content`,get_browser_info:`browser_info`,get_tabs:`list_tabs`,wait_for_element:`wait_element`,wait_for_navigation:`wait_navigation`,query_interactive_elements:`query_elements`,scroll_and_collect:`scroll_collect`,drag_and_drop:`drag_drop`,show_notification:`notify`,generate_qrcode:`qrcode`,clear_page_data:`clear_data`,search_chat_history:`search_chats`,ui_prototype:`preview_ui`},d=!1;l=l.map(e=>u[e]?(d=!0,u[e]):e),l=[...new Set(l)],d&&console.log(`[Background] detected old tool name,migrated to merged new tool name`);let p=e?l.filter(t=>e.includes(t)):l;if(e&&console.log(`[Background] tool filter: ${l.length} global → ${p.length} final`),r!=null&&Array.isArray(r)&&r.length>0&&(p.includes(`agent_skill`)||(p.push(`agent_skill`),console.log(`[Background] auto-adding skill tool: agent_skill`))),Ni.size>0){let{ragToolsIntroduced:e}=await chrome.storage.local.get([`ragToolsIntroduced`]);if(e!==!0){for(let e of Ni)p.includes(e)||p.push(e);console.log(`[Background] auto-adding ${Ni.size} RAG knowledge tools (not yet introduced)`)}}let m=n.enableImageInput===!0,h=n.enableToolPreselect===!0;console.log(`[Background] getTools - enableToolPreselect:`,h);let g=await Zi(),_=(n.pairedAgents||[]).length;console.log(`[Background] tool configuration: ${p.length} enable, Agent=${g}, image recognition=${m}`);let{mcpEnabled:v,skillsEnabled:y}=await chrome.storage.local.get([`mcpEnabled`,`skillsEnabled`]),b=new Set(Array.isArray(n[c])?n[c]:[]),x=new Set(Array.isArray(a)?a:[]),S=new Set(Array.isArray(i)?i:[]),C=f.filter(e=>e.id.startsWith(`mcp_`)?!0:p.includes(e.id)).filter(e=>{if(e.id.startsWith(`agent_`)&&!g||e.id===`manage_agent`&&_<2||e.id===`agent_skill`&&y===!1)return!1;if(e.id.startsWith(`mcp_`)){if(v!==!0||!g||!mi.has(e.id))return!1;let t=hi.get(e.id);if(t){if(S.has(t.serverId))return!0;if(b.has(t.serverId)||x.has(t.serverId))return!1}return!0}return!(e.id.startsWith(`knowledge_`)&&(!Ni.has(e.id)||!g))}),w=C.map(e=>{let r=JSON.parse(JSON.stringify(e));if(e.id===`capture_page`){let e=r.function.parameters.properties.action;m||(e.enum=[`download`],e.description=t(`toolExec.captureDownloadAction`),e.default=`download`,r.function.description=t(`toolExec.captureDownloadDesc`))}if(e.id===`plan_task`){let e=n.preselectMinToolCount||10,i=h&&C.length>e;if(console.log(`[Background] getTools - processing plan_task, enableToolPreselect:`,h,`toolCount:`,C.length,`threshold:`,e,`shouldAdd:`,i),i){r.function.description=`任务规划与拆解,将复杂任务分解为子任务。重要:必须为每个子任务的 requiredTools 字段指定所需工具ID列表,子任务仅继承此处指定的工具。`;let e=r.function.parameters.properties.subtasks.items.properties;e.requiredTools={type:`array`,items:{type:`string`},description:t(`toolExec.requiredToolsDesc`,{tools:C.map(e=>e.id).join(`, `)})};let n=r.function.parameters.properties.subtasks.items.required;n.includes(`requiredTools`)||n.push(`requiredTools`),console.log(`[Background] getTools - added requiredTools to plan_task (required)`)}}return r});console.log(`[Background] finalavailable tools: ${w.length} `),o(w)})})}chrome.storage?.onChanged?.addListener?.(e=>{if(e.mcpEnabled){let t=e.mcpEnabled.newValue===!0;r.debug(`[Background] MCP globaltoggle changed:`,t),t?Ci().then(e=>{r.debug(`[Background] MCP tools re-load:`,e,``)}):Ti().then(()=>{r.debug(`[Background] MCP all toolsunload`)})}if(e.skillsEnabled&&console.log(`[Background] Skill global toggle changed:`,e.skillsEnabled.newValue!==!1),e.ragEnabled){let t=e.ragEnabled.newValue===!0;r.debug(`[Background] RAG globaltoggle changed:`,t),t?Vi().then(e=>{r.debug(`[Background] RAG tools re-load:`,e,``)}):Wi().then(()=>{r.debug(`[Background] RAG all toolsunload`)})}});async function $i(e,n,r=null){let{action:i=`both`,tabId:a,format:o=`jpeg`,quality:s=60,visionMaxDim:c=1024,visionQuality:l=65}=e;try{let e,u,d=``,f=``;if(a)try{let t=await chrome.tabs.get(a);e=t.id,u=t.windowId,d=t.url||``,f=t.title||``,await chrome.tabs.update(e,{active:!0}),await new Promise(e=>setTimeout(e,300))}catch{return q(!1,t(`toolExec.tabNotExistOrAccessible`,{tabId:a}),{tool_call_id:n})}else{let r=await chrome.tabs.query({active:!0,currentWindow:!0});if(!r.length)return q(!1,t(`toolExec.cannotGetCurrentTab`),{tool_call_id:n});e=r[0].id,u=r[0].windowId,d=r[0].url||``,f=r[0].title||``}console.log(`[Background] taking screenshot: tabId=`,e,`url=`,d,`action=`,i,`format=`,o,`quality=`,s,`visionMaxDim=`,c,`visionQuality=`,l);let p=await new Promise((e,t)=>{chrome.tabs.captureVisibleTab(u,{format:o,quality:s},n=>{chrome.runtime.lastError?t(Error(chrome.runtime.lastError.message)):e(n)})}),m=(p.length/1024).toFixed(1);console.log(`[Background] screenshot complete,size:`,m,`KB`),chrome.storage.local.set({_lastVisionScreenshot:{dataUrl:p,sizeKB:m,url:d,title:f,timestamp:Date.now()}}).catch(()=>{});let h=i===`download`||i===`both`,g=i===`analyze`||i===`both`;if(h&&Gn(p,o),g){let e=await ea(p,c,l/100),i=(e.length/1024).toFixed(1);console.log(`[Background] screenshot compressed size:`,i,`KB (maxDim:`,c,`quality:`,l,`)`);let a=await ta(e,d,f,r);return h?q(!0,`${t(`toolExec.screenshotDownloaded`,{size:m})}。\n\n${a}`,{tool_call_id:n}):q(!0,a,{tool_call_id:n})}let _=(p.length/1024/1024).toFixed(2);return q(!0,t(`toolExec.screenshotSuccess`,{size:_,format:o===`png`?`png`:`jpg`,quality:s}),{tool_call_id:n})}catch(e){return q(!1,t(`toolExec.screenshotFailed`,{error:e.message}),{tool_call_id:n})}}async function ea(e,t=1024,n=.65){try{let r=await(await fetch(e)).blob(),i=await createImageBitmap(r),{width:a,height:o}=i;(a>t||o>t)&&(a>o?(o=Math.round(t/a*o),a=t):(a=Math.round(t/o*a),o=t));let s=new OffscreenCanvas(a,o);s.getContext(`2d`).drawImage(i,0,0,a,o);let c=await s.convertToBlob({type:`image/jpeg`,quality:n});return new Promise((e,t)=>{let n=new FileReader;n.onloadend=()=>e(n.result),n.onerror=t,n.readAsDataURL(c)})}catch(t){return console.warn(`[Background] image compression failed, using original screenshot:`,t.message),e}}async function ta(e,n,r,i=null){let a=await new Promise(e=>{chrome.storage.local.get([`imageApiBase`,`imageApiKey`,`imageModelName`,`apiBase`,`apiKey`,`modelName`,`streamEnabled`],e)}),o=a.imageApiBase||a.apiBase,s=a.imageApiKey||a.apiKey,c=a.imageModelName||a.modelName,l=a.streamEnabled!==!1;if(!o||!s)return console.log(`[Background] image recognition API not configured,returnscreenshotbasicinfo`),t(`toolExec.screenshotBasicInfo`,{title:r,url:n});console.log(`[Background] calling image recognition API to analyze screenshot,model:`,c,`endpoint:`,o,`streaming:`,l);let u=t(`toolExec.visionPrompt`,{title:r,url:n}),d=new AbortController,f=setTimeout(()=>d.abort(),6e4);try{let t={model:c,messages:[{role:`user`,content:[{type:`text`,text:u},{type:`image_url`,image_url:{url:e,detail:`auto`}}]}],max_tokens:2e3};l&&(t.stream=!0);let a=await fetch(`${o}/chat/completions`,{method:`POST`,headers:{"Content-Type":`application/json`,Authorization:`Bearer ${s}`},body:JSON.stringify(t),signal:d.signal});if(clearTimeout(f),!a.ok){let e=await a.text().catch(()=>``);return console.error(`[Background] image recognition API request failed:`,a.status,e),`页面截图已获取。\n\n- 页面标题: ${r}\n- 页面地址: ${n}\n\n图片识别分析失败(API 返回 ${a.status}),请检查图片识别 API 配置。`}let p,m;if(l)p=await na(a,d,i);else{let e=await a.json();m=e,p=e.choices?.[0]?.message?.content}return p?(console.log(`[Background] image recognition analysis complete,result length:`,p.length),`页面截图分析结果:\n\n**页面**: ${r}\n**地址**: ${n}\n\n${p}`):(l?console.error(`[Background] image recognition API result is empty (streaming), model:`,c,`check vision API SSE/streaming compatibility if this persists`):console.error(`[Background] image recognition API result is empty (non-streaming), model:`,c,`raw response:`,JSON.stringify(m)?.substring(0,300)),`页面截图已获取。\n\n- 页面标题: ${r}\n- 页面地址: ${n}\n\n图片识别返回结果为空,请重试。`)}catch(e){return clearTimeout(f),console.error(`[Background] image recognition API call exception:`,e.message),e.name===`AbortError`?`页面截图已获取。\n\n- 页面标题: ${r}\n- 页面地址: ${n}\n\n图片识别分析超时(60秒),请检查图片识别 API 是否可用或尝试重新截图。`:t(`toolExec.screenshotAnalysisError`,{title:r,url:n,error:e.message})}}async function na(e,t,n=null){let r=e.body.getReader(),i=new TextDecoder,a=``,o=``;try{for(;;){let e;e=t&&t.signal?await Promise.race([r.read(),new Promise((e,n)=>{if(t.signal.aborted){n(new DOMException(`Aborted`,`AbortError`));return}t.signal.addEventListener(`abort`,()=>n(new DOMException(`Aborted`,`AbortError`)),{once:!0})})]):await r.read();let{done:s,value:c}=e;a+=s?`
349
+ `:i.decode(c,{stream:!1});let l=a.split(`
350
+ `);a=l.pop()||``;for(let e of l){let t=``;if(e.startsWith(`data:`)&&(t=e.substring(5).replace(/^\s+/,``)),!(!t||t===`[DONE]`))try{let e=JSON.parse(t),r=e.choices?.[0]?.delta?.content||e.choices?.[0]?.message?.content||e.choices?.[0]?.text||``;r&&(o+=r,n&&chrome.runtime.sendMessage({type:`VISION_ANALYSIS_CHUNK`,sessionId:n,delta:r}).catch(()=>{}))}catch(e){console.warn(`[Background] image recognition SSE parse failed,raw data:`,t.substring(0,200),`error:`,e.message)}}if(s)break}}finally{r.releaseLock()}return o}function q(e,t,n={}){return{success:e,content:t,...n}}function ra(e){if(e===0)return`0 B`;let t=[`B`,`KB`,`MB`,`GB`,`TB`],n=1024,r=Math.floor(Math.log(e)/Math.log(n));return`${(e/n**r).toFixed(r===0?0:1)} ${t[r]}`}function ia(e,n){if(e&&typeof e==`object`&&`success`in e){if(!(`content`in e)){if(e.message)e.content=e.message;else if(!e.success&&e.error){let n=String(e.error).replace(/\\/g,`\\\\`).replace(/"/g,`\\"`);e.content=t(`toolExec.operationFailed`,{error:n}),e.message=e.error}else{let{success:t,error:n,tool_call_id:r,...i}=e;e.content=JSON.stringify(i),e.metadata=i}console.warn(`[Background] toolreturnformatnon-standard (missing content field),auto-filled`)}return e.tool_call_id||=n,e}return typeof e==`string`?(console.warn(`[Background] toolreturnpurecharsstring but non-standardobject,use instead with makeResult()`),{success:!0,content:e,tool_call_id:n}):{success:!1,error:t(`toolExec.unknownResultFormat`),content:``,tool_call_id:n}}async function aa(e,t,n){try{let r=`toolUsageStats`,i=(await chrome.storage.local.get([r]))[r]||{},a=i[e]||{callCount:0,successCount:0,totalDuration:0,lastUsed:0};a.callCount++,t.success&&a.successCount++,a.totalDuration+=n,a.lastUsed=Date.now(),i[e]=a,chrome.storage.local.set({[r]:i})}catch(e){console.warn(`[Background] recordtoolstats failed:`,e)}}function oa(){return new Promise(e=>{chrome.tabs.query({active:!0,currentWindow:!0},t=>{e(t&&t.length>0?t[0].id:null)})})}async function sa(e,n,r){return new Promise(i=>{chrome.tabs.sendMessage(e,n,a=>{if(chrome.runtime.lastError){let a=chrome.runtime.lastError.message;console.warn(`[Background] sendmessage to content script failed:`,a),chrome.tabs.get(e,o=>{if(chrome.runtime.lastError||!o){i({success:!1,error:t(`toolExec.tabAccessDenied`,{error:a}),tool_call_id:r});return}let s=o.url||``;if(s.startsWith(`chrome://`)||s.startsWith(`chrome-extension://`)||s.startsWith(`about:`)||s.startsWith(`chrome-error://`)){s.startsWith(`chrome-error://`)?i({success:!1,error:t(`toolExec.tabErrorPage`),tool_call_id:r}):i({success:!1,error:t(`toolExec.systemPageNotAllowed`,{url:s}),tool_call_id:r});return}console.log(`[Background] attempt autoinject content script to Tab:`,e);let c=chrome.runtime.getManifest().content_scripts?.[0]?.js||[],l=c.findIndex(e=>/content/i.test(e)&&e.endsWith(`.js`)),u=l===-1?c:[c[l]];if(l===-1&&u.length===0){i({success:!1,error:t(`toolExec.contentScriptNotFound`),tool_call_id:r});return}chrome.scripting.executeScript({target:{tabId:e},files:u}).then(()=>{console.log(`[Background] Content script inject successful, startretrysendmessage`),d(e,n,0)}).catch(e=>{console.warn(`[Background] inject content script failed:`,e.message),e.message&&e.message.includes(`error page`)?i({success:!1,error:t(`toolExec.tabErrorPage`),tool_call_id:r}):i({success:!1,error:t(`toolExec.contentScriptInjectFailed`,{error:e.message}),tool_call_id:r})});function d(e,t,n){let a=[300,600,1200],o=a.length;setTimeout(()=>{chrome.tabs.sendMessage(e,t,s=>{chrome.runtime.lastError?n<o-1?(console.warn(`[Background] retry ${n+2}/${o+1} failed, ${a[n+1]}ms after retry:`,chrome.runtime.lastError.message),d(e,t,n+1)):(console.warn(`[Background] all has retryaverage failed:`,chrome.runtime.lastError.message),i({success:!1,error:chrome.runtime.lastError.message,tool_call_id:r})):(console.log(`[Background] retry successful (`+(n+2)+` times)`),i({...s,tool_call_id:r}))})},a[n])}})}else i({...a,tool_call_id:r})})})}async function ca(e,n,r){let{action:i}=e;switch(i){case`open`:return Aa(e,n,r);case`switch`:return ja(e,n,r);case`close`:return Ma(e,n);case`reload`:return Ra(e,n);case`navigate`:return La(e,n);default:return q(!1,t(`toolExec.unknownManageTabAction`,{action:i}),{tool_call_id:n})}}async function la(e,n){let{action:r}=e;switch(r){case`bookmark`:return ya(e,n);case`history`:return ba(e,n);default:return q(!1,t(`toolExec.unknownSearchBrowserDataAction`,{action:r}),{tool_call_id:n})}}async function ua(e,n){let{action:r}=e;switch(r){case`list`:return Ja(e,n);case`restore`:return Ya(e,n);default:return q(!1,t(`toolExec.unknownAgentTrashAction`,{action:r}),{tool_call_id:n})}}async function da(e,n){let{action:r}=e;switch(r){case`list`:return uo(e,n);case`switch`:return fo(e,n);default:return q(!1,t(`toolExec.unknownManageAgentAction`,{action:r}),{tool_call_id:n})}}async function fa(e,n){let{action:r}=e;switch(r){case`read`:return Ua(e,n);case`write`:return Ga(e,n);case`list`:return Ka(e,n);case`delete`:return qa(e,n);case`download`:return Xa(e,n);default:return q(!1,t(`toolExec.unknownAgentFileAction`,{action:r}),{tool_call_id:n})}}async function pa(e,n){let{searchType:r}=e;switch(r){case`file`:return eo(e,n);case`content`:return to(e,n);default:return q(!1,t(`toolExec.unknownAgentSearchType`,{type:r}),{tool_call_id:n})}}async function ma(e,n,r){let{scope:i=`last_n_rounds`,rounds:a=3,sessionId:o}=e,s=o||r||await O();if(!s)return q(!1,t(`toolExec.cannotGetSessionId`),{tool_call_id:n});let c=await j(s);if(!c)return q(!1,t(`toolExec.sessionNotFound`,{id:s}),{tool_call_id:n});let l=(c.messageHistory||[]).map((e,t)=>({msg:e,idx:t})).filter(({msg:e})=>e.role===`assistant`&&Array.isArray(e.executionLog)&&e.executionLog.length>0);if(l.length===0)return q(!0,t(`toolExec.noExecutionLog`),{tool_call_id:n});let u;u=i===`full_session`?l:l.slice(-Math.min(a,l.length));let d=[],f=[],p=[],m=[];for(let{msg:e,idx:n}of u){let r=n+1,i=e.executionLog||[];for(let e of i){let n=e.nodeType;if(m.push({round:r,nodeType:n,nodeName:e.nodeName||e.action?.name||t(`toolExec.unknown`),status:e.status||`unknown`,timestamp:e.timestamp||null,toolName:e.action?.name||null}),n===`tool_exec`){let n=e.action?.name||e.nodeName||t(`toolExec.unknownTool`,{name:`unknown`}),i=e.action?.arguments||e.action?.args||{},a=e.status;a===`success`?d.push({round:r,tool:n,args:i,result:e.observation||e.result||`成功`,description:e.nodeName||``}):(a===`failed`||a===`cancelled`)&&f.push({round:r,tool:n,args:i,status:a,error:e.error||e.observation||e.result||t(`toolExec.unknownError`),description:e.nodeName||``})}n===`reflection`&&p.push({round:r,tool:e.action?.name||e.nodeName||t(`toolExec.unknown`),effective:e.effective===void 0?null:e.effective,reasoning:e.reasoning||e.analysis||``,suggestion:e.suggestion||e.advice||``,reflectionType:e.reflectionType||``})}}let h=u.length,g=m.length,_=m.filter(e=>e.status===`success`).length,v=m.filter(e=>e.status===`failed`||e.status===`cancelled`).length,y={sessionId:s,scope:i,roundsAnalyzed:h,stats:{totalSteps:g,successCount:_,failCount:v,successRate:g>0?(_/g*100).toFixed(1)+`%`:`0%`},successPaths:d,failures:f,reflections:p,timeline:m},b=[];if(b.push(`## 执行日志提炼报告`),b.push(``),b.push(`**会话**: ${c.title||s.slice(0,8)}`),b.push(`**分析范围**: ${i}(${h} 轮)`),b.push(`**统计**: 共 ${g} 步,成功 ${_},失败 ${v},成功率 ${y.stats.successRate}`),b.push(``),d.length>0){b.push(`### ✅ 成功路径`),b.push(``);for(let e of d)b.push(`- **[轮次${e.round}]** 工具 \`${e.tool}\` → ${typeof e.result==`string`?e.result.substring(0,100):`执行成功`}`);b.push(``)}if(f.length>0){b.push(`### ❌ 失败教训`),b.push(``);for(let e of f)b.push(`- **[轮次${e.round}]** 工具 \`${e.tool}\` ${e.status}: ${typeof e.error==`string`?e.error.substring(0,150):`未知错误`}`);b.push(``)}if(p.length>0){b.push(`### 🎯 反思建议`),b.push(``);for(let e of p)b.push(`- **[轮次${e.round}]** 工具 \`${e.tool}\``),e.reasoning&&b.push(` - 推理: ${e.reasoning.substring(0,200)}`),e.suggestion&&b.push(` - 建议: ${e.suggestion.substring(0,200)}`);b.push(``)}return q(!0,b.join(`
351
+ `),{tool_call_id:n,extractedData:y})}var ha={capture_page:$i,clarify_question:Sa,notify:Ca,fetch_url:Ea,list_tabs:Na,browser_info:Oa,download_file:ka,manage_cookies:Pa,plan_task:Fa,clear_data:Ia,search_chats:xa,preview_ui:za,agent_file:fa,agent_exec:Qa,agent_search:pa,agent_skill:Ha,wait_navigation:Wa,handle_dialog:Da,dispatch_task:Wn,agent_memory:async(e,t,n)=>dr(e,t,n),debug_page:ui,page_content:io,extract_data:ao,clipboard:oo,manage_tab:ca,search_browser_data:la,agent_trash:ua,manage_agent:da,exec_log:ma},ga={};for(let e of c)e.execution===`background`&&ha[e.id]&&(ga[e.id]=ha[e.id]);var _a={};for(let e of c)if(e.execution===`content_script`){let t=e.function.parameters?.properties;if(t){let n=Object.keys(t);_a[e.id]=e=>{let t={};for(let r of n)t[r]=e[r];return t}}else _a[e.id]=()=>({})}_a.search_in_page=e=>({query:e.query||e.pattern,mode:e.mode,caseSensitive:e.caseSensitive,contextLength:e.contextLength,maxResults:e.maxResults,highlight:e.highlight});async function va(e,n,r=null){let i=Date.now(),{name:a,arguments:o,id:s,function:c,index:u}=e,d=a||c&&c.name,f=s,p={};if(console.log(`[Background] tool callraw data:`,JSON.stringify(e)),c&&c.arguments){console.log(`[Background] toolCall.function.arguments type:`,typeof c.arguments);try{p=Yn(c.arguments)||{}}catch(e){return console.error(`[Background] parsetool parameter failed:`,e,`originalvalue:`,JSON.stringify(c.arguments).substring(0,300)),{success:!1,error:t(`toolExec.argParseFailed`),tool_call_id:f}}let e=typeof c.arguments==`string`?c.arguments.trim():JSON.stringify(c.arguments);Object.keys(p).length===0&&e.length>0&&e!==`{}`&&console.error(`[Background] parameterparse after empty object!original arguments:`,JSON.stringify(c.arguments).substring(0,300))}else if(typeof o==`object`)p=o||{};else if(typeof o==`string`){console.log(`[Background] using backup argsStr parse:`,o.substring(0,300));try{p=Yn(o)||{}}catch(e){return console.error(`[Background] parsetool parameter failed:`,e,`originalvalue:`,o),{success:!1,error:t(`toolExec.argParseFailed`),tool_call_id:f}}}console.log(`[Background] exec tool:`,d,p,`id:`,f);let m=l[d],h;if(m===`background`){let e=ga[d];e?(console.log(`[Background] ${d} directly execute, not passed content script`),h=await e(p,f,r,n)):h={success:!1,error:t(`toolExec.unknownTool`,{name:d}),tool_call_id:f}}else if(m===`content_script`){let e=_a[d];if(e){let n=d.toUpperCase(),i=e(p),a=r?je(r):null,o=p.tabId||a||await oa();h=o?await sa(o,{type:n,...i},f):{success:!1,error:t(`toolExec.noTabAvailable`),tool_call_id:f}}else h={success:!1,error:t(`toolExec.unknownTool`,{name:d}),tool_call_id:f}}else h={success:!1,error:t(`toolExec.unknownTool`,{name:d}),tool_call_id:f};h=ia(h,f);let g=Date.now()-i;return aa(d,h,g),h}function ya(e,n){let r=e.query||``,a=parseInt(e.maxResults,10)||10;return console.log(`[Background] exec bookmarksearch:`,`query=`,JSON.stringify(r),`maxResults=`,a),new Promise(e=>{if(!chrome.bookmarks){console.error(`[Background] chrome.bookmarks API non- with `),e(q(!1,t(`toolExec.bookmarkApiUnavailable`)));return}if(!r||r.trim()===``){console.log(`[Background] emptyquery,getbookmark rootnode...`),chrome.bookmarks.getTree(n=>{if(console.log(`[Background] chrome.bookmarks.getTree callback, tree node count:`,n?n.length:`null`),chrome.runtime.lastError){console.error(`[Background] chrome.bookmarks.getTree error:`,chrome.runtime.lastError.message),e(q(!1,t(`toolExec.bookmarkFetchFailed`,{error:chrome.runtime.lastError.message})));return}let r=[];function o(e){e&&e.forEach(e=>{e.url&&r.push(e),e.children&&e.children.length>0&&o(e.children)})}if(o(n),console.log(`[Background] receiset to total bookmarks:`,r.length),r.length===0){e(q(!0,t(`toolExec.noBookmarks`)));return}let s=r.slice(0,a).map(e=>({title:e.title||t(`toolExec.noTitle`),url:e.url||``,dateAdded:e.dateAdded?new Date(e.dateAdded).toLocaleString(i()===`en`?`en-US`:`zh-CN`):null})),c=`${t(`toolExec.bookmarksCount`,{total:r.length,shown:s.length})}\n`+s.map((e,t)=>`${t+1}. ${e.title}\n URL: ${e.url}`).join(`
351
352
 
352
- `);console.log(`[Background] bookmark search successful,return result:`,s.length),e(J(!0,c))});return}console.log(`[Background] call with chrome.bookmarks.search...`),chrome.bookmarks.search(r,n=>{if(console.log(`[Background] chrome.bookmarks.search callback, result count:`,n?n.length:`null`),chrome.runtime.lastError){console.error(`[Background] chrome.bookmarks.search error:`,chrome.runtime.lastError.message),e(J(!1,t(`toolExec.bookmarkSearchFailed`,{error:chrome.runtime.lastError.message})));return}if(!n||n.length===0){console.log(`[Background] not foundmatched bookmarks`),e(J(!0,t(`toolExec.bookmarkNoMatch`)));return}let r=n.slice(0,a).map(e=>({title:e.title||`(无标题)`,url:e.url||``,dateAdded:e.dateAdded?new Date(e.dateAdded).toLocaleString(`zh-CN`):null})),i=`找到 ${n.length} 个匹配的书签,显示前 ${r.length} 个:\n`+r.map((e,t)=>`${t+1}. ${e.title}\n URL: ${e.url}`).join(`
353
+ `);console.log(`[Background] bookmark search successful,return result:`,s.length),e(q(!0,c))});return}console.log(`[Background] call with chrome.bookmarks.search...`),chrome.bookmarks.search(r,n=>{if(console.log(`[Background] chrome.bookmarks.search callback, result count:`,n?n.length:`null`),chrome.runtime.lastError){console.error(`[Background] chrome.bookmarks.search error:`,chrome.runtime.lastError.message),e(q(!1,t(`toolExec.bookmarkSearchFailed`,{error:chrome.runtime.lastError.message})));return}if(!n||n.length===0){console.log(`[Background] not foundmatched bookmarks`),e(q(!0,t(`toolExec.bookmarkNoMatch`)));return}let r=n.slice(0,a).map(e=>({title:e.title||`(无标题)`,url:e.url||``,dateAdded:e.dateAdded?new Date(e.dateAdded).toLocaleString(`zh-CN`):null})),i=`找到 ${n.length} 个匹配的书签,显示前 ${r.length} 个:\n`+r.map((e,t)=>`${t+1}. ${e.title}\n URL: ${e.url}`).join(`
353
354
 
354
- `);console.log(`[Background] bookmark search successful,return result:`,r.length),e(J(!0,i))})})}function ea(e,n){let r=e.query||``,a=parseInt(e.maxResults,10)||10,o=e.startTime||null,s=e.endTime||null;return console.log(`[Background] exec historyrecordsearch:`,`query=`,JSON.stringify(r),`maxResults=`,a,`time range:`,o,`-`,s),new Promise(e=>{if(!chrome.history){console.error(`[Background] chrome.history API non- with `),e(J(!1,t(`toolExec.historyApiUnavailable`)));return}let n={text:r,maxResults:a};o&&(n.startTime=o),s&&(n.endTime=s),console.log(`[Background] call with chrome.history.search, options:`,JSON.stringify(n)),chrome.history.search(n,n=>{if(console.log(`[Background] chrome.history.search callback, result count:`,n?n.length:`null`),chrome.runtime.lastError){console.error(`[Background] chrome.history.search error:`,chrome.runtime.lastError.message),e(J(!1,t(`toolExec.historySearchFailed`,{error:chrome.runtime.lastError.message})));return}if(!n||n.length===0){console.log(`[Background] not foundmatched visitsrecord`),e(J(!0,t(`toolExec.historyNoMatch`)));return}let r=n.map(e=>({title:e.title||`(无标题)`,url:e.url,lastVisitTime:e.lastVisitTime?new Date(e.lastVisitTime).toLocaleString(i()===`en`?`en-US`:`zh-CN`):null,visitCount:e.visitCount||0})),a=`${t(`toolExec.historyResultsCount`,{count:n.length})}\n`+r.map((e,t)=>`${t+1}. ${e.title}\n URL: ${e.url}\n 最后访问: ${e.lastVisitTime}\n 访问次数: ${e.visitCount}`).join(`
355
+ `);console.log(`[Background] bookmark search successful,return result:`,r.length),e(q(!0,i))})})}function ba(e,n){let r=e.query||``,a=parseInt(e.maxResults,10)||10,o=e.startTime||null,s=e.endTime||null;return console.log(`[Background] exec historyrecordsearch:`,`query=`,JSON.stringify(r),`maxResults=`,a,`time range:`,o,`-`,s),new Promise(e=>{if(!chrome.history){console.error(`[Background] chrome.history API non- with `),e(q(!1,t(`toolExec.historyApiUnavailable`)));return}let n={text:r,maxResults:a};o&&(n.startTime=o),s&&(n.endTime=s),console.log(`[Background] call with chrome.history.search, options:`,JSON.stringify(n)),chrome.history.search(n,n=>{if(console.log(`[Background] chrome.history.search callback, result count:`,n?n.length:`null`),chrome.runtime.lastError){console.error(`[Background] chrome.history.search error:`,chrome.runtime.lastError.message),e(q(!1,t(`toolExec.historySearchFailed`,{error:chrome.runtime.lastError.message})));return}if(!n||n.length===0){console.log(`[Background] not foundmatched visitsrecord`),e(q(!0,t(`toolExec.historyNoMatch`)));return}let r=n.map(e=>({title:e.title||`(无标题)`,url:e.url,lastVisitTime:e.lastVisitTime?new Date(e.lastVisitTime).toLocaleString(i()===`en`?`en-US`:`zh-CN`):null,visitCount:e.visitCount||0})),a=`${t(`toolExec.historyResultsCount`,{count:n.length})}\n`+r.map((e,t)=>`${t+1}. ${e.title}\n URL: ${e.url}\n 最后访问: ${e.lastVisitTime}\n 访问次数: ${e.visitCount}`).join(`
355
356
 
356
- `);console.log(`[Background] historyrecordsearch successful,return result:`,r.length),e(J(!0,a))})})}async function ta(e,n,r=null){let i=(e.query||``).toLowerCase(),a=parseInt(e.maxResults,10)||(i?5:100),o=e.searchScope||`current_session`;console.log(`[Background] exec conversation memorysearch:`,`query=`,JSON.stringify(i),`maxResults=`,a,`scope=`,o,`sessionId=`,r);try{await E();let n=[],s=null;if(o!==`all_sessions`&&(s=r||await D()),n=(await w(s)).map(e=>({session:e.sessionLabel,index:e.index,role:e.role,content:e.content})),o===`all_sessions`&&(await ee()).forEach(e=>{n.push({session:e.sessionLabel,index:e.index,role:e.role,content:e.content})}),n.length===0)return J(!0,t(`toolExec.noChatRecords`));if(!i){let e=n.slice(0,a);return J(!0,`${t(`toolExec.chatMessagesCount`,{total:n.length,shown:e.length})}\n\n`+e.map((e,n)=>{let r=typeof e.content==`string`?e.content:Array.isArray(e.content)?e.content.filter(e=>e.type===`text`).map(e=>e.text).join(``):``,i=r.length>500?r.substring(0,500)+`...`:r;return`### ${n+1}. [${e.session}] ${e.role===`user`?t(`toolExec.roleUser`):t(`toolExec.roleAssistant`)}${t(`toolExec.chatMessageLabel`)}\n${i}`}).join(`
357
+ `);console.log(`[Background] historyrecordsearch successful,return result:`,r.length),e(q(!0,a))})})}async function xa(e,n,r=null){let i=(e.query||``).toLowerCase(),a=parseInt(e.maxResults,10)||(i?5:100),o=e.searchScope||`current_session`;console.log(`[Background] exec conversation memorysearch:`,`query=`,JSON.stringify(i),`maxResults=`,a,`scope=`,o,`sessionId=`,r);try{await ee();let n=[],s=null;if(o!==`all_sessions`&&(s=r||await O()),n=(await E(s)).map(e=>({session:e.sessionLabel,index:e.index,role:e.role,content:e.content})),o===`all_sessions`&&(await k()).forEach(e=>{n.push({session:e.sessionLabel,index:e.index,role:e.role,content:e.content})}),n.length===0)return q(!0,t(`toolExec.noChatRecords`));if(!i){let e=n.slice(0,a);return q(!0,`${t(`toolExec.chatMessagesCount`,{total:n.length,shown:e.length})}\n\n`+e.map((e,n)=>{let r=typeof e.content==`string`?e.content:Array.isArray(e.content)?e.content.filter(e=>e.type===`text`).map(e=>e.text).join(``):``,i=r.length>500?r.substring(0,500)+`...`:r;return`### ${n+1}. [${e.session}] ${e.role===`user`?t(`toolExec.roleUser`):t(`toolExec.roleAssistant`)}${t(`toolExec.chatMessageLabel`)}\n${i}`}).join(`
357
358
 
358
359
  ---
359
360
 
360
- `))}let c=i.split(/\s+/).filter(e=>e.length>0),l=n.map(e=>{let t=(typeof e.content==`string`?e.content:Array.isArray(e.content)?e.content.filter(e=>e.type===`text`).map(e=>e.text).join(``):``).toLowerCase(),n=0;t.includes(i)&&(n+=10);for(let e of c){t.includes(e)&&(n+=3);let r=e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`),i=(t.match(new RegExp(r,`g`))||[]).length;n+=i*.5}return(t.includes(`[引用内容]`)||t.includes(`[选中内容]`))&&(n+=1),{...e,score:n}}).filter(e=>e.score>0).sort((e,t)=>t.score-e.score).slice(0,a);if(l.length===0)return J(!0,t(`toolExec.chatNoMatch`,{query:e.query}));let u=`${t(`toolExec.chatResultsCount`,{count:l.length})}\n\n`+l.map((e,n)=>{let r=typeof e.content==`string`?e.content:Array.isArray(e.content)?e.content.filter(e=>e.type===`text`).map(e=>e.text).join(``):``,i=r.length>500?r.substring(0,500)+`...`:r;return`### ${n+1}. [${e.session}] ${e.role===`user`?t(`toolExec.roleUser`):t(`toolExec.roleAssistant`)}${t(`toolExec.chatMessageLabel`)} (相关度: ${e.score.toFixed(1)})\n${i}`}).join(`
361
+ `))}let c=i.split(/\s+/).filter(e=>e.length>0),l=n.map(e=>{let t=(typeof e.content==`string`?e.content:Array.isArray(e.content)?e.content.filter(e=>e.type===`text`).map(e=>e.text).join(``):``).toLowerCase(),n=0;t.includes(i)&&(n+=10);for(let e of c){t.includes(e)&&(n+=3);let r=e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`),i=(t.match(new RegExp(r,`g`))||[]).length;n+=i*.5}return(t.includes(`[引用内容]`)||t.includes(`[选中内容]`))&&(n+=1),{...e,score:n}}).filter(e=>e.score>0).sort((e,t)=>t.score-e.score).slice(0,a);if(l.length===0)return q(!0,t(`toolExec.chatNoMatch`,{query:e.query}));let u=`${t(`toolExec.chatResultsCount`,{count:l.length})}\n\n`+l.map((e,n)=>{let r=typeof e.content==`string`?e.content:Array.isArray(e.content)?e.content.filter(e=>e.type===`text`).map(e=>e.text).join(``):``,i=r.length>500?r.substring(0,500)+`...`:r;return`### ${n+1}. [${e.session}] ${e.role===`user`?t(`toolExec.roleUser`):t(`toolExec.roleAssistant`)}${t(`toolExec.chatMessageLabel`)} (相关度: ${e.score.toFixed(1)})\n${i}`}).join(`
361
362
 
362
363
  ---
363
364
 
364
- `);return console.log(`[Background] conversation memorysearch successful,return:`,l.length,`result`),J(!0,u)}catch(e){return console.error(`[Background] conversation memorysearch failed:`,e),J(!1,t(`toolExec.chatSearchError`,{error:e.message}))}}async function na(e,n,i=null){let{question:a,recommendedOption:o,allowCustomInput:s=!0,allowAdditionalInfo:c=!0}=e,l=Array.isArray(e.options)?e.options:e.options?[String(e.options)]:[];console.log(`[Background] exec clarificationtool:`,e,`toolCallId:`,n,`sessionId:`,i);let u=(await R()).reactConfig.clarifyTimeout;return new Promise(e=>{let d={question:a,options:l,recommendedOption:o===void 0?0:o,allowCustomInput:s,allowAdditionalInfo:c,toolCallId:n,timeout:u,sessionId:i},f=null,p=null,m=null,h=()=>{f&&=(clearTimeout(f),null),m&&=(clearInterval(m),null),p&&=(chrome.runtime.onMessage.removeListener(p),null)},g=r=>{if(r.type===`CLARIFY_RESPONSE`&&r.toolCallId===n){h(),console.log(`[Background] received clarificationresponse:`,r);let{selectedOption:n,customInput:i,additionalInfo:a}=r,o=``;o=n>=0&&l[n]?t(`toolExec.selectedOption`,{option:l[n]}):i&&i.trim()?t(`toolExec.customInput`,{input:i.trim()}):t(`toolExec.noClarification`),a&&a.trim()&&(o+=`\n补充说明: ${a.trim()}`),e(J(!0,o))}},_=e=>{let t=Me(i);if(!t)return!1;try{return t.postMessage(e),!0}catch(e){return r.debug(`[Background] clarify port postMessage failed, fallback to broadcast:`,e?.message),!1}},v=e=>{_(e)||chrome.runtime.sendMessage(e).catch(()=>{})},y=()=>{console.log(`[Background] clarification dialogsent, timeout:`,u,`ms`),f=setTimeout(()=>{console.error(`[Background] clarification dialogtimeout`),h(),v({type:`CLARIFY_TIMEOUT`,toolCallId:n,sessionId:i}),e({success:!1,error:t(`toolExec.clarifyTimeout`,{seconds:Math.round(u/1e3)}),tool_call_id:n})},u),m=setInterval(async()=>{try{let r=await chrome.runtime.getContexts({contextTypes:[`SIDE_PANEL`]});(!r||r.length===0)&&(console.warn(`[Background] Side Panel closed,early terminateclarificationwaiting`),h(),v({type:`CLARIFY_TIMEOUT`,toolCallId:n,sessionId:i}),e({success:!1,error:t(`toolExec.clarifyPanelClosed`),tool_call_id:n}))}catch{}},5e3),p=(e,t,n)=>{g(e)},chrome.runtime.onMessage.addListener(p)},b={type:`SHOW_CLARIFY_DIALOG`,sessionId:i,data:d};_(b)?y():chrome.runtime.sendMessage(b,r=>{if(chrome.runtime.lastError){console.error(`[Background] send clarificationmessage failed:`,chrome.runtime.lastError.message),h(),e({success:!1,error:t(`toolExec.clarifyDialogFailed`,{error:chrome.runtime.lastError.message}),tool_call_id:n});return}console.log(`[Background] clarification dialogsent to Side Panel,timeout:`,u,`ms`),y()})})}function ra(e,n){let{title:r,message:i,icon:a,silent:o=!1,requireInteraction:s=!1,playSound:c=!1,soundType:l=`default`}=e;return console.log(`[Background] exec browser notification:`,e,`toolCallId:`,n),new Promise(e=>{let n={type:`basic`,title:r,message:i,iconUrl:a||`icons/icon128.png`,silent:o===!0||o===`true`,requireInteraction:s===!0||s===`true`};chrome.notifications.create(n,n=>{if(chrome.runtime.lastError){console.error(`[Background] create notification failed:`,chrome.runtime.lastError.message),e(J(!1,t(`toolExec.notificationFailed`,{error:chrome.runtime.lastError.message})));return}console.log(`[Background] notification created,ID:`,n),c&&chrome.runtime.sendMessage({type:`PLAY_NOTIFICATION_SOUND`,soundType:l}),e(J(!0,t(`toolExec.notificationSent`)))})})}async function ia(e,t,n){let r=Math.max(1,Math.floor(Number(n)||6e4)),i=new AbortController,a=t?.signal,o,s;typeof AbortSignal.timeout==`function`?o=AbortSignal.timeout(r):(o=i.signal,s=setTimeout(()=>i.abort(),r));let c=()=>i.abort();o.addEventListener(`abort`,c,{once:!0}),a&&(a.aborted?i.abort():a.addEventListener(`abort`,c,{once:!0}));try{let n=await fetch(e,{...t,signal:i.signal});return o.removeEventListener(`abort`,c),a&&a.removeEventListener(`abort`,c),s&&clearTimeout(s),n}catch(e){throw o.removeEventListener(`abort`,c),a&&a.removeEventListener(`abort`,c),s&&clearTimeout(s),e.name===`AbortError`?a?.aborted?e:Error(`请求超时 (${r}ms)`):e}}async function aa(e,t,n,r=3,i=1e3,a=null){let o;for(let s=0;s<=r;s++)try{let c=await ia(e,t,n);if((c.status>=500||c.status===429)&&s<r){let e=await c.text().catch(()=>``);o=Error(`HTTP ${c.status}: ${e.substring(0,200)}`);let t=i*2**s;console.log(`[Background] API returned ${c.status}, retrying in ${t}ms (attempt ${s+1}/${r})`),a&&a(s+1,o,t),await new Promise(e=>setTimeout(e,t));continue}return c}catch(e){if(o=e,s>=r||e.name===`AbortError`&&!e.message.includes(`超时`))break;let t=i*2**s;console.log(`[Background] API call failed, retrying in ${t}ms (attempt ${s+1}/${r}):`,e.message),a&&a(s+1,e,t),await new Promise(e=>setTimeout(e,t))}throw o}async function oa(e,n){let{url:r,method:i=`GET`,headers:a={},body:o,timeout:s=15e3}=e;if(console.log(`[Background] exec HTTP request:`,`method=`,i,`url=`,r,`timeout=`,s),!r)return{success:!1,error:t(`toolExec.missingUrlParam`),tool_call_id:n};try{new URL(r)}catch{return{success:!1,error:t(`toolExec.invalidUrlFormat`,{url:r}),tool_call_id:n}}let c={};if(a&&typeof a==`object`)for(let[e,t]of Object.entries(a))c[e]=String(t??``);let l={method:i.toUpperCase(),headers:c};o&&i.toUpperCase()!==`GET`&&i.toUpperCase()!==`HEAD`&&(l.body=typeof o==`object`?JSON.stringify(o):o),console.log(`[Background] fetch options:`,JSON.stringify(l));try{let e=await aa(r,l,s,1);console.log(`[Background] HTTP response status:`,e.status,e.statusText);try{let t=await e.text(),r={success:e.status>=200&&e.status<300,status:e.status,statusText:e.statusText,content:t.substring(0,1e4),contentLength:t.length,url:e.url};return console.log(`[Background] HTTP response contentlength:`,t.length),{...r,tool_call_id:n}}catch(r){return console.error(`[Background] readresponse content failed:`,r),{success:!1,error:t(`toolExec.readResponseFailed`,{error:r.message}),status:e.status,tool_call_id:n}}}catch(e){let i=e.message;return e.name===`AbortError`?(console.warn(`[Background] HTTP request timed out:`,r,`(${s}ms)`),i=t(`toolExec.requestTimeout`,{timeout:s})):(console.error(`[Background] HTTP request failed:`,e.name,e.message),e.message===`Failed to fetch`?i=t(`toolExec.requestFailed`):e.message.includes(`CORS`)&&(i=`CORS 跨域限制,目标服务器不允许跨域访问`)),{success:!1,error:i,originalError:e.message,url:r,tool_call_id:n}}}async function sa(e,n,r){let i=e.action;if(!i)return{success:!1,error:t(`toolExec.missingAction`),tool_call_id:n};let a=r?L(r):null,o=e.tabId||a||await Bi();if(!o)return{success:!1,error:t(`toolExec.noTabAvailable`),tool_call_id:n};try{await chrome.scripting.executeScript({target:{tabId:o},world:`MAIN`,func:e=>e===`restore`?(window.__aihOriginalAlert&&(window.alert=window.__aihOriginalAlert,window.confirm=window.__aihOriginalConfirm,window.prompt=window.__aihOriginalPrompt,delete window.__aihOriginalAlert,delete window.__aihOriginalConfirm,delete window.__aihOriginalPrompt),`restored`):(window.__aihOriginalAlert||(window.__aihOriginalAlert=window.alert,window.__aihOriginalConfirm=window.confirm,window.__aihOriginalPrompt=window.prompt),e===`accept`?(window.alert=function(){},window.confirm=function(){return!0},window.prompt=function(){return``}):e===`dismiss`&&(window.alert=function(){},window.confirm=function(){return!1},window.prompt=function(){return null}),e),args:[i]});let e={accept:t(`toolExec.dialogAccept`),dismiss:t(`toolExec.dialogDismiss`),restore:t(`toolExec.dialogRestore`)};return J(!0,t(`toolExec.dialogSet`,{mode:e[i]||i}),{tool_call_id:n})}catch(e){return{success:!1,error:t(`toolExec.executionFailed`,{error:e.message}),tool_call_id:n}}}function ca(e,t){console.log(`[Background] get browserinfo`);let n={success:!0,browserName:navigator.appName,browserVersion:navigator.appVersion,platform:navigator.platform,language:navigator.language,userAgent:navigator.userAgent,cookieEnabled:navigator.cookieEnabled,onLine:navigator.onLine,prefersDarkMode:typeof window<`u`&&window.matchMedia&&window.matchMedia(`(prefers-color-scheme: dark)`).matches,screenWidth:typeof screen<`u`?screen.width:null,screenHeight:typeof screen<`u`?screen.height:null,colorDepth:typeof screen<`u`?screen.colorDepth:null};return typeof chrome<`u`&&chrome.runtime&&(n.extensionVersion=chrome.runtime.getManifest().version),Promise.resolve(n)}function la(e,n){let{url:r,filename:i}=e;return console.log(`[Background] download file:`,`url=`,r,`filename=`,i),new Promise(e=>{let n=i;if(!n){let e=r.split(`/`);n=e[e.length-1].split(`?`)[0]||`download`}chrome.downloads.download({url:r,filename:`Downloads/`+n,saveAs:!0},r=>{chrome.runtime.lastError?(console.error(`[Background] download failed:`,chrome.runtime.lastError.message),e({success:!1,error:chrome.runtime.lastError.message})):(console.log(`[Background] download created,ID:`,r),e({success:!0,message:t(`toolExec.downloadStarted`),downloadId:r,filename:n}))})})}function ua(e,n,r){let{url:i,active:a=!0,waitForLoad:o=!1,loadTimeout:s=15e3}=e,c=typeof a==`boolean`?a:String(a).toLowerCase()===`true`;return console.log(`[Background] opennewlabelpage:`,`url=`,i,`active=`,c,`waitForLoad=`,o,`loadTimeout=`,s),new Promise(e=>{chrome.tabs.create({url:i,active:c},a=>{if(chrome.runtime.lastError){console.error(`[Background] openlabelpage failed:`,chrome.runtime.lastError.message),e({success:!1,error:chrome.runtime.lastError.message,tool_call_id:n});return}r&&ke(r,a.id);let c=`后续操作此页的工具请传 tabId=${a.id}(不传则默认用此页)`;if(!o){e({success:!0,message:t(`toolExec.tabOpened`,{tabId:a.id,hint:c}),tabId:a.id,url:a.url,tool_call_id:n});return}let l=!1,u=Math.max(1e3,Math.floor(Number(s)||15e3)),d=setTimeout(()=>{l||(l=!0,chrome.tabs.onUpdated.removeListener(f),console.warn(`[Background] page loadtimeout:`,i,`(${u}ms)`),e({success:!0,message:t(`toolExec.tabOpenTimeout`,{timeout:u,hint:c}),tabId:a.id,url:a.url,loadTimedOut:!0,tool_call_id:n}))},u),f=(r,i,o)=>{if(r===a.id&&i.status===`complete`){if(l)return;l=!0,clearTimeout(d),chrome.tabs.onUpdated.removeListener(f),console.log(`[Background] page loadcomplete:`,o.url),e({success:!0,message:t(`toolExec.tabLoaded`,{url:o.url,hint:c}),tabId:a.id,url:o.url,tool_call_id:n})}};chrome.tabs.onUpdated.addListener(f)})})}function da(e,n,r){let{tabId:i}=e,a=parseInt(i,10);return console.log(`[Background] switchlabelpage:`,`tabId=`,a),new Promise(e=>{chrome.tabs.update(a,{active:!0},n=>{chrome.runtime.lastError?(console.error(`[Background] switchlabelpage failed:`,chrome.runtime.lastError.message),e({success:!1,error:chrome.runtime.lastError.message})):(r&&ke(r,n.id),e({success:!0,message:t(`toolExec.tabSwitched`,{tabId:n.id}),tabId:n.id,url:n.url}))})})}function fa(e,n){let{tabId:r}=e,i=r===void 0?void 0:parseInt(r,10);return console.log(`[Background] closelabelpage:`,`tabId=`,i),new Promise(e=>{(i||null)===null?chrome.tabs.query({active:!0,currentWindow:!0},n=>{n&&n.length>0?chrome.tabs.remove(n[0].id,()=>{chrome.runtime.lastError?e({success:!1,error:chrome.runtime.lastError.message}):e({success:!0,message:t(`toolExec.tabClosed`)})}):e({success:!1,error:t(`toolExec.tabNotFound`)})}):chrome.tabs.remove(i,()=>{chrome.runtime.lastError?e({success:!1,error:chrome.runtime.lastError.message}):e({success:!0,message:t(`toolExec.tabClosedWithId`,{tabId:i})})})})}function pa(e,t){let{mode:n=`all`,includeUrl:r=!0,includeTitle:i=!0}=e;return console.log(`[Background] getlabelpage column table:`,`mode=`,n,`includeUrl=`,r,`includeTitle=`,i),new Promise(e=>{let t=n===`active`?{active:!0,currentWindow:!0}:{currentWindow:!0};chrome.tabs.query(t,t=>{if(chrome.runtime.lastError)console.error(`[Background] getlabelpage failed:`,chrome.runtime.lastError.message),e({success:!1,error:chrome.runtime.lastError.message});else{let n=t.map(e=>{let t={id:e.id};return r&&(t.url=e.url),i&&(t.title=e.title),t.active=e.active,t});e({success:!0,count:n.length,tabs:n})}})})}function ma(e,n){return new Promise(r=>{let{action:i,name:a,value:o,domain:s,path:c=`/`,secure:l=!1,httpOnly:u=!1,expirationDate:d}=e,f=l===!0||l===`true`,p=u===!0||u===`true`,m=d===void 0?void 0:parseFloat(d);(e=>{chrome.tabs.query({active:!0,currentWindow:!0},t=>{if(t&&t[0]&&t[0].url)try{e(new URL(t[0].url).hostname)}catch{e(``)}else e(``)})})(e=>{let l=s||e;switch(i){case`get`:if(!a){r({success:!1,error:t(`toolExec.getRequiresName`),tool_call_id:n});return}chrome.cookies.get({url:`https://${l}`,name:a},e=>{chrome.runtime.lastError?r({success:!1,error:chrome.runtime.lastError.message,tool_call_id:n}):r({success:!0,cookie:e,tool_call_id:n})});break;case`set`:if(!a||o===void 0){r({success:!1,error:t(`toolExec.setRequiresNameValue`),tool_call_id:n});return}let e={url:`https://${l}`,name:a,value:o,path:c,secure:f,httpOnly:p,domain:l.startsWith(`.`)?l:`.`+l};m&&(e.expirationDate=m),chrome.cookies.set(e,e=>{chrome.runtime.lastError?r({success:!1,error:chrome.runtime.lastError.message,tool_call_id:n}):r({success:!0,cookie:e,message:t(`toolExec.cookieSet`,{name:a}),tool_call_id:n})});break;case`remove`:if(!a){r({success:!1,error:t(`toolExec.removeRequiresName`),tool_call_id:n});return}chrome.cookies.remove({url:`https://${l}`,name:a},e=>{chrome.runtime.lastError?r({success:!1,error:chrome.runtime.lastError.message,tool_call_id:n}):(r({success:!0,message:t(`toolExec.cookieDeleted`,{name:a}),tool_call_id:n}),Di(`cookie_write`,`Delete cookie: ${a}`,{domain:l,name:a}))});break;case`list`:chrome.cookies.getAll({domain:l},e=>{chrome.runtime.lastError?r({success:!1,error:chrome.runtime.lastError.message,tool_call_id:n}):r({success:!0,cookies:e,total:e.length,tool_call_id:n})});break;default:r({success:!1,error:t(`toolExec.unknownAction`,{action:i}),tool_call_id:n})}})})}function ha(e,n){let{taskDescription:r,subtasks:i=[],isComplex:a=!0,strategy:o=`sequential`}=e;if(console.log(`[Background] exec task planningtool:`,JSON.stringify(e)),!r)return Promise.resolve({success:!1,error:t(`toolExec.missingTaskDesc`),tool_call_id:n});if(!Array.isArray(i)||i.length===0)return Promise.resolve({success:!1,error:t(`toolExec.emptySubtasks`),tool_call_id:n});if(i.filter(e=>!e.id||!e.name||!e.description).length>0)return Promise.resolve({success:!1,error:t(`toolExec.invalidSubtaskStructure`),tool_call_id:n});let s={taskDescription:r,isComplex:a,strategy:o,totalSubtasks:i.length,estimatedTotalSteps:i.reduce((e,t)=>e+(t.estimatedSteps||1),0),subtasks:i.map(e=>({id:e.id,name:e.name,description:e.description,dependencies:e.dependencies||[],requiredTools:e.requiredTools||[],estimatedSteps:e.estimatedSteps||1})),planId:n||crypto.randomUUID(),createdAt:new Date().toISOString()};return Promise.resolve({success:!0,data:s,message:(()=>{let e=`📋 任务规划完成
365
+ `);return console.log(`[Background] conversation memorysearch successful,return:`,l.length,`result`),q(!0,u)}catch(e){return console.error(`[Background] conversation memorysearch failed:`,e),q(!1,t(`toolExec.chatSearchError`,{error:e.message}))}}async function Sa(e,n,i=null){let{question:a,recommendedOption:o,allowCustomInput:s=!0,allowAdditionalInfo:c=!0}=e,l=Array.isArray(e.options)?e.options:e.options?[String(e.options)]:[];console.log(`[Background] exec clarificationtool:`,e,`toolCallId:`,n,`sessionId:`,i);let u=(await B()).reactConfig.clarifyTimeout;return new Promise(e=>{let d={question:a,options:l,recommendedOption:o===void 0?0:o,allowCustomInput:s,allowAdditionalInfo:c,toolCallId:n,timeout:u,sessionId:i},f=null,p=null,m=null,h=()=>{f&&=(clearTimeout(f),null),m&&=(clearInterval(m),null),p&&=(chrome.runtime.onMessage.removeListener(p),null)},g=r=>{if(r.type===`CLARIFY_RESPONSE`&&r.toolCallId===n){h(),cn(i),console.log(`[Background] received clarificationresponse:`,r);let{selectedOption:n,customInput:a,additionalInfo:o}=r,s=``;s=n>=0&&l[n]?t(`toolExec.selectedOption`,{option:l[n]}):a&&a.trim()?t(`toolExec.customInput`,{input:a.trim()}):t(`toolExec.noClarification`),o&&o.trim()&&(s+=`\n补充说明: ${o.trim()}`),e(q(!0,s))}},_=e=>{let t=Ne(i);if(!t)return!1;try{return t.postMessage(e),!0}catch(e){return r.debug(`[Background] clarify port postMessage failed, fallback to broadcast:`,e?.message),!1}},v=e=>{_(e)||chrome.runtime.sendMessage(e).catch(()=>{})},y=()=>{console.log(`[Background] clarification dialogsent, timeout:`,u,`ms`),f=setTimeout(()=>{console.error(`[Background] clarification dialogtimeout`),h(),cn(i),v({type:`CLARIFY_TIMEOUT`,toolCallId:n,sessionId:i}),e({success:!1,error:t(`toolExec.clarifyTimeout`,{seconds:Math.round(u/1e3)}),tool_call_id:n})},u),m=setInterval(async()=>{try{let r=await chrome.runtime.getContexts({contextTypes:[`SIDE_PANEL`]});(!r||r.length===0)&&(console.warn(`[Background] Side Panel closed,early terminateclarificationwaiting`),h(),cn(i),v({type:`CLARIFY_TIMEOUT`,toolCallId:n,sessionId:i}),e({success:!1,error:t(`toolExec.clarifyPanelClosed`),tool_call_id:n}))}catch{}},5e3),p=(e,t,n)=>{g(e)},chrome.runtime.onMessage.addListener(p)},b={type:`SHOW_CLARIFY_DIALOG`,sessionId:i,data:d};_(b)?(sn({kind:`clarify`,sessionId:i,detail:a}).catch(()=>{}),y()):chrome.runtime.sendMessage(b,r=>{if(chrome.runtime.lastError){console.error(`[Background] send clarificationmessage failed:`,chrome.runtime.lastError.message),h(),e({success:!1,error:t(`toolExec.clarifyDialogFailed`,{error:chrome.runtime.lastError.message}),tool_call_id:n});return}console.log(`[Background] clarification dialogsent to Side Panel,timeout:`,u,`ms`),sn({kind:`clarify`,sessionId:i,detail:a}).catch(()=>{}),y()})})}function Ca(e,n){let{title:r,message:i,icon:a,silent:o=!1,requireInteraction:s=!1,playSound:c=!1,soundType:l=`default`}=e;return console.log(`[Background] exec browser notification:`,e,`toolCallId:`,n),new Promise(e=>{let n={type:`basic`,title:r,message:i,iconUrl:a||`icons/icon128.png`,silent:o===!0||o===`true`,requireInteraction:s===!0||s===`true`};chrome.notifications.create(n,n=>{if(chrome.runtime.lastError){console.error(`[Background] create notification failed:`,chrome.runtime.lastError.message),e(q(!1,t(`toolExec.notificationFailed`,{error:chrome.runtime.lastError.message})));return}console.log(`[Background] notification created,ID:`,n),c&&chrome.runtime.sendMessage({type:`PLAY_NOTIFICATION_SOUND`,soundType:l}),e(q(!0,t(`toolExec.notificationSent`)))})})}async function wa(e,t,n){let r=Math.max(1,Math.floor(Number(n)||6e4)),i=new AbortController,a=t?.signal,o,s;typeof AbortSignal.timeout==`function`?o=AbortSignal.timeout(r):(o=i.signal,s=setTimeout(()=>i.abort(),r));let c=()=>i.abort();o.addEventListener(`abort`,c,{once:!0}),a&&(a.aborted?i.abort():a.addEventListener(`abort`,c,{once:!0}));try{let n=await fetch(e,{...t,signal:i.signal});return o.removeEventListener(`abort`,c),a&&a.removeEventListener(`abort`,c),s&&clearTimeout(s),n}catch(e){throw o.removeEventListener(`abort`,c),a&&a.removeEventListener(`abort`,c),s&&clearTimeout(s),e.name===`AbortError`?a?.aborted?e:Error(`请求超时 (${r}ms)`):e}}async function Ta(e,t,n,r=3,i=1e3,a=null){let o;for(let s=0;s<=r;s++)try{let c=await wa(e,t,n);if((c.status>=500||c.status===429)&&s<r){let e=await c.text().catch(()=>``);o=Error(`HTTP ${c.status}: ${e.substring(0,200)}`);let t=i*2**s;console.log(`[Background] API returned ${c.status}, retrying in ${t}ms (attempt ${s+1}/${r})`),a&&a(s+1,o,t),await new Promise(e=>setTimeout(e,t));continue}return c}catch(e){if(o=e,s>=r||e.name===`AbortError`&&!e.message.includes(`超时`))break;let t=i*2**s;console.log(`[Background] API call failed, retrying in ${t}ms (attempt ${s+1}/${r}):`,e.message),a&&a(s+1,e,t),await new Promise(e=>setTimeout(e,t))}throw o}async function Ea(e,n){let{url:r,method:i=`GET`,headers:a={},body:o,timeout:s=15e3}=e;if(console.log(`[Background] exec HTTP request:`,`method=`,i,`url=`,r,`timeout=`,s),!r)return{success:!1,error:t(`toolExec.missingUrlParam`),tool_call_id:n};try{new URL(r)}catch{return{success:!1,error:t(`toolExec.invalidUrlFormat`,{url:r}),tool_call_id:n}}let c={};if(a&&typeof a==`object`)for(let[e,t]of Object.entries(a))c[e]=String(t??``);let l={method:i.toUpperCase(),headers:c};o&&i.toUpperCase()!==`GET`&&i.toUpperCase()!==`HEAD`&&(l.body=typeof o==`object`?JSON.stringify(o):o),console.log(`[Background] fetch options:`,JSON.stringify(l));try{let e=await Ta(r,l,s,1);console.log(`[Background] HTTP response status:`,e.status,e.statusText);try{let t=await e.text(),r={success:e.status>=200&&e.status<300,status:e.status,statusText:e.statusText,content:t.substring(0,1e4),contentLength:t.length,url:e.url};return console.log(`[Background] HTTP response contentlength:`,t.length),{...r,tool_call_id:n}}catch(r){return console.error(`[Background] readresponse content failed:`,r),{success:!1,error:t(`toolExec.readResponseFailed`,{error:r.message}),status:e.status,tool_call_id:n}}}catch(e){let i=e.message;return e.name===`AbortError`?(console.warn(`[Background] HTTP request timed out:`,r,`(${s}ms)`),i=t(`toolExec.requestTimeout`,{timeout:s})):(console.error(`[Background] HTTP request failed:`,e.name,e.message),e.message===`Failed to fetch`?i=t(`toolExec.requestFailed`):e.message.includes(`CORS`)&&(i=`CORS 跨域限制,目标服务器不允许跨域访问`)),{success:!1,error:i,originalError:e.message,url:r,tool_call_id:n}}}async function Da(e,n,r){let i=e.action;if(!i)return{success:!1,error:t(`toolExec.missingAction`),tool_call_id:n};let a=r?je(r):null,o=e.tabId||a||await oa();if(!o)return{success:!1,error:t(`toolExec.noTabAvailable`),tool_call_id:n};try{await chrome.scripting.executeScript({target:{tabId:o},world:`MAIN`,func:e=>e===`restore`?(window.__aihOriginalAlert&&(window.alert=window.__aihOriginalAlert,window.confirm=window.__aihOriginalConfirm,window.prompt=window.__aihOriginalPrompt,delete window.__aihOriginalAlert,delete window.__aihOriginalConfirm,delete window.__aihOriginalPrompt),`restored`):(window.__aihOriginalAlert||(window.__aihOriginalAlert=window.alert,window.__aihOriginalConfirm=window.confirm,window.__aihOriginalPrompt=window.prompt),e===`accept`?(window.alert=function(){},window.confirm=function(){return!0},window.prompt=function(){return``}):e===`dismiss`&&(window.alert=function(){},window.confirm=function(){return!1},window.prompt=function(){return null}),e),args:[i]});let e={accept:t(`toolExec.dialogAccept`),dismiss:t(`toolExec.dialogDismiss`),restore:t(`toolExec.dialogRestore`)};return q(!0,t(`toolExec.dialogSet`,{mode:e[i]||i}),{tool_call_id:n})}catch(e){return{success:!1,error:t(`toolExec.executionFailed`,{error:e.message}),tool_call_id:n}}}function Oa(e,t){console.log(`[Background] get browserinfo`);let n={success:!0,browserName:navigator.appName,browserVersion:navigator.appVersion,platform:navigator.platform,language:navigator.language,userAgent:navigator.userAgent,cookieEnabled:navigator.cookieEnabled,onLine:navigator.onLine,prefersDarkMode:typeof window<`u`&&window.matchMedia&&window.matchMedia(`(prefers-color-scheme: dark)`).matches,screenWidth:typeof screen<`u`?screen.width:null,screenHeight:typeof screen<`u`?screen.height:null,colorDepth:typeof screen<`u`?screen.colorDepth:null};return typeof chrome<`u`&&chrome.runtime&&(n.extensionVersion=chrome.runtime.getManifest().version),Promise.resolve(n)}function ka(e,n){let{url:r,filename:i}=e;return console.log(`[Background] download file:`,`url=`,r,`filename=`,i),new Promise(e=>{let n=i;if(!n){let e=r.split(`/`);n=e[e.length-1].split(`?`)[0]||`download`}chrome.downloads.download({url:r,filename:`Downloads/`+n,saveAs:!0},r=>{chrome.runtime.lastError?(console.error(`[Background] download failed:`,chrome.runtime.lastError.message),e({success:!1,error:chrome.runtime.lastError.message})):(console.log(`[Background] download created,ID:`,r),e({success:!0,message:t(`toolExec.downloadStarted`),downloadId:r,filename:n}))})})}function Aa(e,n,r){let{url:i,active:a=!0,waitForLoad:o=!1,loadTimeout:s=15e3}=e,c=typeof a==`boolean`?a:String(a).toLowerCase()===`true`;return console.log(`[Background] opennewlabelpage:`,`url=`,i,`active=`,c,`waitForLoad=`,o,`loadTimeout=`,s),new Promise(e=>{chrome.tabs.create({url:i,active:c},a=>{if(chrome.runtime.lastError){console.error(`[Background] openlabelpage failed:`,chrome.runtime.lastError.message),e({success:!1,error:chrome.runtime.lastError.message,tool_call_id:n});return}r&&Ae(r,a.id);let c=`后续操作此页的工具请传 tabId=${a.id}(不传则默认用此页)`;if(!o){e({success:!0,message:t(`toolExec.tabOpened`,{tabId:a.id,hint:c}),tabId:a.id,url:a.url,tool_call_id:n});return}let l=!1,u=Math.max(1e3,Math.floor(Number(s)||15e3)),d=setTimeout(()=>{l||(l=!0,chrome.tabs.onUpdated.removeListener(f),console.warn(`[Background] page loadtimeout:`,i,`(${u}ms)`),e({success:!0,message:t(`toolExec.tabOpenTimeout`,{timeout:u,hint:c}),tabId:a.id,url:a.url,loadTimedOut:!0,tool_call_id:n}))},u),f=(r,i,o)=>{if(r===a.id&&i.status===`complete`){if(l)return;l=!0,clearTimeout(d),chrome.tabs.onUpdated.removeListener(f),console.log(`[Background] page loadcomplete:`,o.url),e({success:!0,message:t(`toolExec.tabLoaded`,{url:o.url,hint:c}),tabId:a.id,url:o.url,tool_call_id:n})}};chrome.tabs.onUpdated.addListener(f)})})}function ja(e,n,r){let{tabId:i}=e,a=parseInt(i,10);return console.log(`[Background] switchlabelpage:`,`tabId=`,a),new Promise(e=>{chrome.tabs.update(a,{active:!0},n=>{chrome.runtime.lastError?(console.error(`[Background] switchlabelpage failed:`,chrome.runtime.lastError.message),e({success:!1,error:chrome.runtime.lastError.message})):(r&&Ae(r,n.id),e({success:!0,message:t(`toolExec.tabSwitched`,{tabId:n.id}),tabId:n.id,url:n.url}))})})}function Ma(e,n){let{tabId:r}=e,i=r===void 0?void 0:parseInt(r,10);return console.log(`[Background] closelabelpage:`,`tabId=`,i),new Promise(e=>{(i||null)===null?chrome.tabs.query({active:!0,currentWindow:!0},n=>{n&&n.length>0?chrome.tabs.remove(n[0].id,()=>{chrome.runtime.lastError?e({success:!1,error:chrome.runtime.lastError.message}):e({success:!0,message:t(`toolExec.tabClosed`)})}):e({success:!1,error:t(`toolExec.tabNotFound`)})}):chrome.tabs.remove(i,()=>{chrome.runtime.lastError?e({success:!1,error:chrome.runtime.lastError.message}):e({success:!0,message:t(`toolExec.tabClosedWithId`,{tabId:i})})})})}function Na(e,t){let{mode:n=`all`,includeUrl:r=!0,includeTitle:i=!0}=e;return console.log(`[Background] getlabelpage column table:`,`mode=`,n,`includeUrl=`,r,`includeTitle=`,i),new Promise(e=>{let t=n===`active`?{active:!0,currentWindow:!0}:{currentWindow:!0};chrome.tabs.query(t,t=>{if(chrome.runtime.lastError)console.error(`[Background] getlabelpage failed:`,chrome.runtime.lastError.message),e({success:!1,error:chrome.runtime.lastError.message});else{let n=t.map(e=>{let t={id:e.id};return r&&(t.url=e.url),i&&(t.title=e.title),t.active=e.active,t});e({success:!0,count:n.length,tabs:n})}})})}function Pa(e,n){return new Promise(r=>{let{action:i,name:a,value:o,domain:s,path:c=`/`,secure:l=!1,httpOnly:u=!1,expirationDate:d}=e,f=l===!0||l===`true`,p=u===!0||u===`true`,m=d===void 0?void 0:parseFloat(d);(e=>{chrome.tabs.query({active:!0,currentWindow:!0},t=>{if(t&&t[0]&&t[0].url)try{e(new URL(t[0].url).hostname)}catch{e(``)}else e(``)})})(e=>{let l=s||e;switch(i){case`get`:if(!a){r({success:!1,error:t(`toolExec.getRequiresName`),tool_call_id:n});return}chrome.cookies.get({url:`https://${l}`,name:a},e=>{chrome.runtime.lastError?r({success:!1,error:chrome.runtime.lastError.message,tool_call_id:n}):r({success:!0,cookie:e,tool_call_id:n})});break;case`set`:if(!a||o===void 0){r({success:!1,error:t(`toolExec.setRequiresNameValue`),tool_call_id:n});return}let e={url:`https://${l}`,name:a,value:o,path:c,secure:f,httpOnly:p,domain:l.startsWith(`.`)?l:`.`+l};m&&(e.expirationDate=m),chrome.cookies.set(e,e=>{chrome.runtime.lastError?r({success:!1,error:chrome.runtime.lastError.message,tool_call_id:n}):r({success:!0,cookie:e,message:t(`toolExec.cookieSet`,{name:a}),tool_call_id:n})});break;case`remove`:if(!a){r({success:!1,error:t(`toolExec.removeRequiresName`),tool_call_id:n});return}chrome.cookies.remove({url:`https://${l}`,name:a},e=>{chrome.runtime.lastError?r({success:!1,error:chrome.runtime.lastError.message,tool_call_id:n}):(r({success:!0,message:t(`toolExec.cookieDeleted`,{name:a}),tool_call_id:n}),qi(`cookie_write`,`Delete cookie: ${a}`,{domain:l,name:a}))});break;case`list`:chrome.cookies.getAll({domain:l},e=>{chrome.runtime.lastError?r({success:!1,error:chrome.runtime.lastError.message,tool_call_id:n}):r({success:!0,cookies:e,total:e.length,tool_call_id:n})});break;default:r({success:!1,error:t(`toolExec.unknownAction`,{action:i}),tool_call_id:n})}})})}function Fa(e,n){let{taskDescription:r,subtasks:i=[],isComplex:a=!0,strategy:o=`sequential`}=e;if(console.log(`[Background] exec task planningtool:`,JSON.stringify(e)),!r)return Promise.resolve({success:!1,error:t(`toolExec.missingTaskDesc`),tool_call_id:n});if(!Array.isArray(i)||i.length===0)return Promise.resolve({success:!1,error:t(`toolExec.emptySubtasks`),tool_call_id:n});if(i.filter(e=>!e.id||!e.name||!e.description).length>0)return Promise.resolve({success:!1,error:t(`toolExec.invalidSubtaskStructure`),tool_call_id:n});let s={taskDescription:r,isComplex:a,strategy:o,totalSubtasks:i.length,estimatedTotalSteps:i.reduce((e,t)=>e+(t.estimatedSteps||1),0),subtasks:i.map(e=>({id:e.id,name:e.name,description:e.description,dependencies:e.dependencies||[],requiredTools:e.requiredTools||[],estimatedSteps:e.estimatedSteps||1})),planId:n||crypto.randomUUID(),createdAt:new Date().toISOString()};return Promise.resolve({success:!0,data:s,message:(()=>{let e=`📋 任务规划完成
365
366
 
366
367
  `;return e+=`**原始任务**: ${r}\n\n`,e+=`**任务复杂度**: ${a?`复杂任务(已拆解)`:`简单任务`}\n`,e+=`**执行策略**: ${o===`sequential`?`顺序执行`:o===`parallel`?`并行执行`:`条件执行`}\n`,e+=`**子任务数量**: ${i.length}\n\n`,e+=`**子任务列表**:
367
- `,i.forEach((t,n)=>{e+=`\n${n+1}. **${t.name}**\n`,e+=` - ID: ${t.id}\n`,e+=` - 描述: ${t.description}\n`,t.dependencies&&t.dependencies.length>0&&(e+=` - 依赖: ${t.dependencies.join(`, `)}\n`),t.requiredTools&&t.requiredTools.length>0&&(e+=` - 所需工具: ${t.requiredTools.join(`, `)}\n`),e+=` - 预估步骤: ${t.estimatedSteps||1}\n`}),e})(),tool_call_id:n})}function ga(e,n){let{site:r}=e;return new Promise(e=>{chrome.tabs.query({active:!0,currentWindow:!0},i=>{if(chrome.runtime.lastError||!i||i.length===0){e({success:!1,error:t(`toolExec.cannotGetCurrentTab`),tool_call_id:n});return}let a=i[0],o;try{o=new URL(a.url).origin}catch{e({success:!1,error:t(`toolExec.cannotParseTabUrl`),tool_call_id:n});return}let s=r||o,c=[],l=[];l.push(new Promise(e=>{chrome.cookies.getAll({},t=>{if(chrome.runtime.lastError){console.warn(`[Background] get cookies failed:`,chrome.runtime.lastError.message),e();return}let n=t.filter(e=>{let t=e.domain.startsWith(`.`)?e.domain.substring(1):e.domain;try{let e=new URL(s).hostname;return e.endsWith(t)||t.endsWith(e)}catch{return!1}});if(n.length===0){e();return}let r=0;n.forEach(t=>{let i=`${t.secure?`https:`:`http:`}//${t.domain.replace(/^\./,``)}${t.path}`;chrome.cookies.remove({url:i,name:t.name},()=>{r++,r===n.length&&(c.push(`cookies`),e())})})})})),l.push(new Promise(e=>{chrome.tabs.sendMessage(a.id,{type:`CLEAR_PAGE_DATA`,storageTypes:[`localStorage`,`sessionStorage`]},t=>{if(chrome.runtime.lastError){console.warn(`[Background] send CLEAR_PAGE_DATA message failed:`,chrome.runtime.lastError.message);let t=(chrome.runtime.getManifest().content_scripts?.[0]?.js||[]).find(e=>e.includes(`content-`))||`content.js`;chrome.scripting.executeScript({target:{tabId:a.id},files:[t]}).then(()=>{setTimeout(()=>{chrome.tabs.sendMessage(a.id,{type:`CLEAR_PAGE_DATA`,storageTypes:[`localStorage`,`sessionStorage`]},t=>{chrome.runtime.lastError||t?.cleared&&c.push(...t.cleared),e()})},500)}).catch(()=>{e()})}else t?.cleared&&c.push(...t.cleared),e()})})),Promise.allSettled(l).then(()=>{let t=[...new Set(c)];Di(`page_data_clear`,`Clear page data: ${s}`,{site:s,cleared:t}),e({success:!0,cleared:t,site:s,tool_call_id:n})})})})}function _a(e,n){let{direction:r=`back`}=e;return new Promise(e=>{chrome.tabs.query({active:!0,currentWindow:!0},i=>{if(chrome.runtime.lastError||!i||i.length===0){e({success:!1,error:t(`toolExec.cannotGetCurrentTab`),tool_call_id:n});return}let a=i[0].id;r===`forward`?chrome.tabs.goForward(a,()=>{chrome.runtime.lastError?e({success:!1,error:chrome.runtime.lastError.message,direction:r,tool_call_id:n}):e({success:!0,direction:r,tool_call_id:n})}):chrome.tabs.goBack(a,()=>{chrome.runtime.lastError?e({success:!1,error:chrome.runtime.lastError.message,direction:r,tool_call_id:n}):e({success:!0,direction:r,tool_call_id:n})})})})}function va(e,n){let{tabId:r,bypassCache:i=!1}=e,a=r===void 0?void 0:parseInt(r,10);return new Promise(e=>{let r=t=>{chrome.tabs.reload(t,{bypassCache:!!i},()=>{chrome.runtime.lastError?e({success:!1,error:chrome.runtime.lastError.message,tabId:t,bypassCache:!!i,tool_call_id:n}):e({success:!0,tabId:t,bypassCache:!!i,tool_call_id:n})})};a===void 0?chrome.tabs.query({active:!0,currentWindow:!0},i=>{if(chrome.runtime.lastError||!i||i.length===0){e({success:!1,error:t(`toolExec.cannotGetCurrentTab`),tool_call_id:n});return}r(i[0].id)}):r(a)})}async function ya(e,n,r=null){let{action:i=`preview`,html:a,title:o,description:s,prototypeId:c}=e;if(i===`get`){if(console.log(`[Background] exec get UI prototype:`,`prototypeId=`,c),!c||!c.trim())return{success:!1,error:t(`toolExec.missingPrototypeId`),tool_call_id:n};try{let e=await S(c.trim());return e?(console.log(`[Background] get prototype successful:`,e.title,`HTMLlength:`,e.html?.length),{success:!0,message:t(`toolExec.prototypeCodeLoaded`,{title:e.title}),prototypeId:e.id,title:e.title,description:e.description||``,html:e.html,tool_call_id:n}):{success:!1,error:t(`toolExec.prototypeNotFound`,{id:c}),tool_call_id:n}}catch(e){return console.error(`[Background] get UI prototype failed:`,e),{success:!1,error:t(`toolExec.fetchFailed`,{error:e.message}),tool_call_id:n}}}if(console.log(`[Background] exec UI prototype preview:`,`title=`,o,`sessionId=`,r),!a||!a.trim())return{success:!1,error:t(`toolExec.missingHtmlParam`),tool_call_id:n};if(!o||!o.trim())return{success:!1,error:t(`toolExec.missingTitleParam`),tool_call_id:n};try{let e=`proto_`+Date.now()+`_`+Math.random().toString(36).substr(2,9),i={id:e,title:o.trim(),description:s||``,html:a.trim(),sessionId:r||null,createdAt:Date.now()};if(!await de(i))return{success:!1,error:t(`toolExec.savePrototypeFailed`),tool_call_id:n};console.log(`[Background] UI prototype saved,ID:`,e);let c=!1,l=null,u=!1;try{if((await He()).connected){let t=await Ye(`prototypes/${e}/index.html`,a.trim());if(t.success){if(l=t.path,console.log(`[Background] prototype written Agent:`,l),await de({...i,localPath:l}),await Dt()){let e=await Xe(l);e.success?(c=!0,console.log(`[Background] prototype inagent-side browseropen:`,l)):console.warn(`[Background] agent-side browseropen failed:`,e.error)}else u=!0,console.log(`[Background] agent is remote,in browser sidelabelpageopenprototype`)}else console.warn(`[Background] Agent filewrite failed:`,t.error)}}catch(e){console.warn(`[Background] Agent prototype write/open failed,fallback to Side Panel:`,e.message)}return chrome.runtime.sendMessage({type:`SHOW_UI_PROTOTYPE`,data:{prototypeId:e,title:i.title,description:i.description,localOpened:c,localPath:l,isRemoteAgent:u}}).catch(()=>{}),{success:!0,message:c?`UI 原型 "${o}" 已创建并在代理端浏览器打开`:`UI 原型 "${o}" 已创建`,prototypeId:e,localOpened:c,isRemoteAgent:u,localPath:l,tool_call_id:n}}catch(e){return console.error(`[Background] exec UI prototype preview failed:`,e),{success:!1,error:t(`toolExec.executionFailed`,{error:e.message}),tool_call_id:n}}}var ba=new Map;function xa(){ba.clear()}async function Sa(e,n){let{action:r,name:i,params:a={}}=e;if(!i)return{success:!1,error:t(`toolExec.missingNameParam`),tool_call_id:n};if(r===`run`)try{let e=await pt(i,a);return e.success?{success:!0,content:e.message||`Skill "${i}" 执行完成`,execId:e.execId,partial:e.partial||!1,results:e.results,tool_call_id:n}:{success:!1,error:e.error||t(`toolExec.skillExecFailed`),tool_call_id:n}}catch(e){return{success:!1,error:t(`toolExec.skillExecException`,{error:e.message}),tool_call_id:n}}let o=ba.get(i);if(o&&Date.now()-o.timestamp<6e4)return{success:!0,content:t(`toolExec.skillLoadedCached`,{name:i,prompt:o.prompt}),skill:o.skill,tool_call_id:n};try{let e=await bt(i);return e.success?(ba.set(i,{timestamp:Date.now(),prompt:e.prompt,skill:e.skill}),{success:!0,content:t(`toolExec.skillLoaded`,{name:i,prompt:e.prompt}),skill:e.skill,tool_call_id:n}):{success:!1,error:e.error||t(`toolExec.skillLoadFailed`),tool_call_id:n}}catch(e){return{success:!1,error:t(`toolExec.skillLoadException`,{error:e.message}),tool_call_id:n}}}async function Ca(e,n){let{path:r}=e;if(!r)return{success:!1,error:t(`toolExec.missingPathParam`),tool_call_id:n};let i=await qe(r);return i.success?{success:!0,content:i.content,size:i.size,path:i.path,tool_call_id:n}:{success:!1,error:i.error,tool_call_id:n}}async function wa(e,n,r){let{timeout:i=3e4,waitUntil:a=`load`,tabId:o}=e;try{let e=r?L(r):null,s=o||e||await Bi();return s?(console.log(`[Background] waitingpage navigationcomplete: tabId=`,s,`waitUntil=`,a,`timeout=`,i),new Promise(e=>{let r=!1,o=setTimeout(()=>{r||(r=!0,chrome.tabs.onUpdated.removeListener(c),console.warn(`[Background] waitingnavigatetimeout:`,i+`ms`),e({success:!1,error:t(`toolExec.navWaitTimeout`,{timeout:i}),tool_call_id:n}))},i);chrome.tabs.get(s,i=>{if(chrome.runtime.lastError||!i){clearTimeout(o),r||(r=!0,e({success:!1,error:t(`toolExec.tabUnavailable`),tool_call_id:n}));return}if(i.status===`complete`&&a===`load`){clearTimeout(o),r||(r=!0,e({success:!0,status:`complete`,url:i.url,message:t(`toolExec.pageLoaded`),tool_call_id:n}));return}if(i.status===`complete`&&a===`domcontentloaded`){clearTimeout(o),r||(r=!0,e({success:!0,status:`complete`,url:i.url,message:t(`toolExec.domReady`),tool_call_id:n}));return}});let c=(i,l,u)=>{i===s&&(r||(a===`networkidle`?l.status===`complete`&&setTimeout(()=>{r||(r=!0,clearTimeout(o),chrome.tabs.onUpdated.removeListener(c),e({success:!0,status:`complete`,url:u.url,message:t(`toolExec.networkIdle`),tool_call_id:n}))},500):l.status===`complete`?(r=!0,clearTimeout(o),chrome.tabs.onUpdated.removeListener(c),e({success:!0,status:`complete`,url:u.url,message:t(`toolExec.pageLoadComplete`),tool_call_id:n})):l.status))};chrome.tabs.onUpdated.addListener(c)})):{success:!1,error:t(`toolExec.noTabAvailable`),tool_call_id:n}}catch(e){return{success:!1,error:t(`toolExec.executionFailed`,{error:e.message}),tool_call_id:n}}}async function Ta(e,n){let{path:r,content:i}=e;if(!r)return{success:!1,error:t(`toolExec.missingPathParam`),tool_call_id:n};if(i==null)return{success:!1,error:t(`toolExec.missingContent`),tool_call_id:n};let a=await Ye(r,i);return a.success?(Di(`file_write`,`Write file: ${a.path}`,{path:a.path,size:a.size}),{success:!0,message:t(`toolExec.fileWritten`,{path:a.path,size:a.size}),path:a.path,size:a.size,tool_call_id:n}):{success:!1,error:a.error,tool_call_id:n}}async function Ea(e,n){let{path:r}=e,i=await Ze(r||`.`);if(i.success){let e=i.entries?.filter(e=>e.type===`file`)||[],r=i.entries?.filter(e=>e.type===`directory`)||[];return{success:!0,content:`${t(`toolExec.dirContent`,{path:i.path,count:i.entries?.length||0})}\n 📁 ${r.length} 个目录\n 📄 ${e.length} 个文件\n\n`+(i.entries||[]).map(e=>` ${e.type===`directory`?`📁`:`📄`} ${e.name}${e.type===`file`?` (${e.size} 字节)`:``}`).join(`
368
- `),path:i.path,entries:i.entries,tool_call_id:n}}return{success:!1,error:i.error,tool_call_id:n}}async function Da(e,n){let{path:r}=e;if(!r)return{success:!1,error:t(`toolExec.missingPathParam`),tool_call_id:n};let i=await Qe(r);if(i.success){let e=t(i.isDir?`toolExec.typeDirectory`:`toolExec.typeFile`);return Di(`file_delete`,`Delete ${i.isDir?`directory`:`file`}: ${i.path}`,{path:i.path,isDir:i.isDir}),{success:!0,message:t(`toolExec.trashDeleted`,{typeLabel:e,path:i.path}),path:i.path,isDir:i.isDir,tool_call_id:n}}return{success:!1,error:i.error,tool_call_id:n}}async function Oa(e,n){let r=await Tt();if(r.success){let i=r.entries||[];if(e.type===`file`?i=i.filter(e=>!e.isDir):e.type===`directory`&&(i=i.filter(e=>e.isDir)),e.hours&&typeof e.hours==`number`&&e.hours>0){let t=Date.now()-e.hours*3600*1e3;i=i.filter(e=>e.deletedAt>=t)}if(i.length===0){let r=e.type===`file`?`文件`:e.type===`directory`?`目录`:`项目`;return{success:!0,content:t(`toolExec.trashEmpty`,{typeHint:r}),entries:[],tool_call_id:n}}let a=Date.now();return{success:!0,content:`回收站中共有 ${i.length} 个项目(7天后自动清理):\n\n`+i.map((e,t)=>{let n=Math.round((a-e.deletedAt)/36e5),r=n<1?`刚刚`:n<24?`${n}小时前`:`${Math.round(n/24)}天前`,i=e.isDir?`📁 目录`:`📄 文件`;return` ${t+1}. trashId: ${e.id}\n ${i}: ${e.name}\n 原路径: ${e.originalPath}\n 大小: ${e.size} 字节 · ${r}`}).join(`
368
+ `,i.forEach((t,n)=>{e+=`\n${n+1}. **${t.name}**\n`,e+=` - ID: ${t.id}\n`,e+=` - 描述: ${t.description}\n`,t.dependencies&&t.dependencies.length>0&&(e+=` - 依赖: ${t.dependencies.join(`, `)}\n`),t.requiredTools&&t.requiredTools.length>0&&(e+=` - 所需工具: ${t.requiredTools.join(`, `)}\n`),e+=` - 预估步骤: ${t.estimatedSteps||1}\n`}),e})(),tool_call_id:n})}function Ia(e,n){let{site:r}=e;return new Promise(e=>{chrome.tabs.query({active:!0,currentWindow:!0},i=>{if(chrome.runtime.lastError||!i||i.length===0){e({success:!1,error:t(`toolExec.cannotGetCurrentTab`),tool_call_id:n});return}let a=i[0],o;try{o=new URL(a.url).origin}catch{e({success:!1,error:t(`toolExec.cannotParseTabUrl`),tool_call_id:n});return}let s=r||o,c=[],l=[];l.push(new Promise(e=>{chrome.cookies.getAll({},t=>{if(chrome.runtime.lastError){console.warn(`[Background] get cookies failed:`,chrome.runtime.lastError.message),e();return}let n=t.filter(e=>{let t=e.domain.startsWith(`.`)?e.domain.substring(1):e.domain;try{let e=new URL(s).hostname;return e.endsWith(t)||t.endsWith(e)}catch{return!1}});if(n.length===0){e();return}let r=0;n.forEach(t=>{let i=`${t.secure?`https:`:`http:`}//${t.domain.replace(/^\./,``)}${t.path}`;chrome.cookies.remove({url:i,name:t.name},()=>{r++,r===n.length&&(c.push(`cookies`),e())})})})})),l.push(new Promise(e=>{chrome.tabs.sendMessage(a.id,{type:`CLEAR_PAGE_DATA`,storageTypes:[`localStorage`,`sessionStorage`]},t=>{if(chrome.runtime.lastError){console.warn(`[Background] send CLEAR_PAGE_DATA message failed:`,chrome.runtime.lastError.message);let t=(chrome.runtime.getManifest().content_scripts?.[0]?.js||[]).find(e=>e.includes(`content-`))||`content.js`;chrome.scripting.executeScript({target:{tabId:a.id},files:[t]}).then(()=>{setTimeout(()=>{chrome.tabs.sendMessage(a.id,{type:`CLEAR_PAGE_DATA`,storageTypes:[`localStorage`,`sessionStorage`]},t=>{chrome.runtime.lastError||t?.cleared&&c.push(...t.cleared),e()})},500)}).catch(()=>{e()})}else t?.cleared&&c.push(...t.cleared),e()})})),Promise.allSettled(l).then(()=>{let t=[...new Set(c)];qi(`page_data_clear`,`Clear page data: ${s}`,{site:s,cleared:t}),e({success:!0,cleared:t,site:s,tool_call_id:n})})})})}function La(e,n){let{direction:r=`back`}=e;return new Promise(e=>{chrome.tabs.query({active:!0,currentWindow:!0},i=>{if(chrome.runtime.lastError||!i||i.length===0){e({success:!1,error:t(`toolExec.cannotGetCurrentTab`),tool_call_id:n});return}let a=i[0].id;r===`forward`?chrome.tabs.goForward(a,()=>{chrome.runtime.lastError?e({success:!1,error:chrome.runtime.lastError.message,direction:r,tool_call_id:n}):e({success:!0,direction:r,tool_call_id:n})}):chrome.tabs.goBack(a,()=>{chrome.runtime.lastError?e({success:!1,error:chrome.runtime.lastError.message,direction:r,tool_call_id:n}):e({success:!0,direction:r,tool_call_id:n})})})})}function Ra(e,n){let{tabId:r,bypassCache:i=!1}=e,a=r===void 0?void 0:parseInt(r,10);return new Promise(e=>{let r=t=>{chrome.tabs.reload(t,{bypassCache:!!i},()=>{chrome.runtime.lastError?e({success:!1,error:chrome.runtime.lastError.message,tabId:t,bypassCache:!!i,tool_call_id:n}):e({success:!0,tabId:t,bypassCache:!!i,tool_call_id:n})})};a===void 0?chrome.tabs.query({active:!0,currentWindow:!0},i=>{if(chrome.runtime.lastError||!i||i.length===0){e({success:!1,error:t(`toolExec.cannotGetCurrentTab`),tool_call_id:n});return}r(i[0].id)}):r(a)})}async function za(e,n,r=null){let{action:i=`preview`,html:a,title:o,description:s,prototypeId:c}=e;if(i===`get`){if(console.log(`[Background] exec get UI prototype:`,`prototypeId=`,c),!c||!c.trim())return{success:!1,error:t(`toolExec.missingPrototypeId`),tool_call_id:n};try{let e=await w(c.trim());return e?(console.log(`[Background] get prototype successful:`,e.title,`HTMLlength:`,e.html?.length),{success:!0,message:t(`toolExec.prototypeCodeLoaded`,{title:e.title}),prototypeId:e.id,title:e.title,description:e.description||``,html:e.html,tool_call_id:n}):{success:!1,error:t(`toolExec.prototypeNotFound`,{id:c}),tool_call_id:n}}catch(e){return console.error(`[Background] get UI prototype failed:`,e),{success:!1,error:t(`toolExec.fetchFailed`,{error:e.message}),tool_call_id:n}}}if(console.log(`[Background] exec UI prototype preview:`,`title=`,o,`sessionId=`,r),!a||!a.trim())return{success:!1,error:t(`toolExec.missingHtmlParam`),tool_call_id:n};if(!o||!o.trim())return{success:!1,error:t(`toolExec.missingTitleParam`),tool_call_id:n};try{let e=`proto_`+Date.now()+`_`+Math.random().toString(36).substr(2,9),i={id:e,title:o.trim(),description:s||``,html:a.trim(),sessionId:r||null,createdAt:Date.now()};if(!await P(i))return{success:!1,error:t(`toolExec.savePrototypeFailed`),tool_call_id:n};console.log(`[Background] UI prototype saved,ID:`,e);let c=!1,l=null,u=!1;try{if((await qe()).connected){let t=await et(`prototypes/${e}/index.html`,a.trim());if(t.success){if(l=t.path,console.log(`[Background] prototype written Agent:`,l),await P({...i,localPath:l}),await Mt()){let e=await tt(l);e.success?(c=!0,console.log(`[Background] prototype inagent-side browseropen:`,l)):console.warn(`[Background] agent-side browseropen failed:`,e.error)}else u=!0,console.log(`[Background] agent is remote,in browser sidelabelpageopenprototype`)}else console.warn(`[Background] Agent filewrite failed:`,t.error)}}catch(e){console.warn(`[Background] Agent prototype write/open failed,fallback to Side Panel:`,e.message)}return chrome.runtime.sendMessage({type:`SHOW_UI_PROTOTYPE`,data:{prototypeId:e,title:i.title,description:i.description,localOpened:c,localPath:l,isRemoteAgent:u}}).catch(()=>{}),{success:!0,message:c?`UI 原型 "${o}" 已创建并在代理端浏览器打开`:`UI 原型 "${o}" 已创建`,prototypeId:e,localOpened:c,isRemoteAgent:u,localPath:l,tool_call_id:n}}catch(e){return console.error(`[Background] exec UI prototype preview failed:`,e),{success:!1,error:t(`toolExec.executionFailed`,{error:e.message}),tool_call_id:n}}}var Ba=new Map;function Va(){Ba.clear()}async function Ha(e,n){let{action:r,name:i,params:a={}}=e;if(!i)return{success:!1,error:t(`toolExec.missingNameParam`),tool_call_id:n};if(r===`run`)try{let e=await vt(i,a);return e.success?{success:!0,content:e.message||`Skill "${i}" 执行完成`,execId:e.execId,partial:e.partial||!1,results:e.results,tool_call_id:n}:{success:!1,error:e.error||t(`toolExec.skillExecFailed`),tool_call_id:n}}catch(e){return{success:!1,error:t(`toolExec.skillExecException`,{error:e.message}),tool_call_id:n}}let o=Ba.get(i);if(o&&Date.now()-o.timestamp<6e4)return{success:!0,content:t(`toolExec.skillLoadedCached`,{name:i,prompt:o.prompt}),skill:o.skill,tool_call_id:n};try{let e=await Tt(i);return e.success?(Ba.set(i,{timestamp:Date.now(),prompt:e.prompt,skill:e.skill}),{success:!0,content:t(`toolExec.skillLoaded`,{name:i,prompt:e.prompt}),skill:e.skill,tool_call_id:n}):{success:!1,error:e.error||t(`toolExec.skillLoadFailed`),tool_call_id:n}}catch(e){return{success:!1,error:t(`toolExec.skillLoadException`,{error:e.message}),tool_call_id:n}}}async function Ua(e,n){let{path:r}=e;if(!r)return{success:!1,error:t(`toolExec.missingPathParam`),tool_call_id:n};let i=await Qe(r);return i.success?{success:!0,content:i.content,size:i.size,path:i.path,tool_call_id:n}:{success:!1,error:i.error,tool_call_id:n}}async function Wa(e,n,r){let{timeout:i=3e4,waitUntil:a=`load`,tabId:o}=e;try{let e=r?je(r):null,s=o||e||await oa();return s?(console.log(`[Background] waitingpage navigationcomplete: tabId=`,s,`waitUntil=`,a,`timeout=`,i),new Promise(e=>{let r=!1,o=setTimeout(()=>{r||(r=!0,chrome.tabs.onUpdated.removeListener(c),console.warn(`[Background] waitingnavigatetimeout:`,i+`ms`),e({success:!1,error:t(`toolExec.navWaitTimeout`,{timeout:i}),tool_call_id:n}))},i);chrome.tabs.get(s,i=>{if(chrome.runtime.lastError||!i){clearTimeout(o),r||(r=!0,e({success:!1,error:t(`toolExec.tabUnavailable`),tool_call_id:n}));return}if(i.status===`complete`&&a===`load`){clearTimeout(o),r||(r=!0,e({success:!0,status:`complete`,url:i.url,message:t(`toolExec.pageLoaded`),tool_call_id:n}));return}if(i.status===`complete`&&a===`domcontentloaded`){clearTimeout(o),r||(r=!0,e({success:!0,status:`complete`,url:i.url,message:t(`toolExec.domReady`),tool_call_id:n}));return}});let c=(i,l,u)=>{i===s&&(r||(a===`networkidle`?l.status===`complete`&&setTimeout(()=>{r||(r=!0,clearTimeout(o),chrome.tabs.onUpdated.removeListener(c),e({success:!0,status:`complete`,url:u.url,message:t(`toolExec.networkIdle`),tool_call_id:n}))},500):l.status===`complete`?(r=!0,clearTimeout(o),chrome.tabs.onUpdated.removeListener(c),e({success:!0,status:`complete`,url:u.url,message:t(`toolExec.pageLoadComplete`),tool_call_id:n})):l.status))};chrome.tabs.onUpdated.addListener(c)})):{success:!1,error:t(`toolExec.noTabAvailable`),tool_call_id:n}}catch(e){return{success:!1,error:t(`toolExec.executionFailed`,{error:e.message}),tool_call_id:n}}}async function Ga(e,n){let{path:r,content:i}=e;if(!r)return{success:!1,error:t(`toolExec.missingPathParam`),tool_call_id:n};if(i==null)return{success:!1,error:t(`toolExec.missingContent`),tool_call_id:n};let a=await et(r,i);return a.success?(qi(`file_write`,`Write file: ${a.path}`,{path:a.path,size:a.size}),{success:!0,message:t(`toolExec.fileWritten`,{path:a.path,size:a.size}),path:a.path,size:a.size,tool_call_id:n}):{success:!1,error:a.error,tool_call_id:n}}async function Ka(e,n){let{path:r}=e,i=await nt(r||`.`);if(i.success){let e=i.entries?.filter(e=>e.type===`file`)||[],r=i.entries?.filter(e=>e.type===`directory`)||[];return{success:!0,content:`${t(`toolExec.dirContent`,{path:i.path,count:i.entries?.length||0})}\n 📁 ${r.length} 个目录\n 📄 ${e.length} 个文件\n\n`+(i.entries||[]).map(e=>` ${e.type===`directory`?`📁`:`📄`} ${e.name}${e.type===`file`?` (${e.size} 字节)`:``}`).join(`
369
+ `),path:i.path,entries:i.entries,tool_call_id:n}}return{success:!1,error:i.error,tool_call_id:n}}async function qa(e,n){let{path:r}=e;if(!r)return{success:!1,error:t(`toolExec.missingPathParam`),tool_call_id:n};let i=await rt(r);if(i.success){let e=t(i.isDir?`toolExec.typeDirectory`:`toolExec.typeFile`);return qi(`file_delete`,`Delete ${i.isDir?`directory`:`file`}: ${i.path}`,{path:i.path,isDir:i.isDir}),{success:!0,message:t(`toolExec.trashDeleted`,{typeLabel:e,path:i.path}),path:i.path,isDir:i.isDir,tool_call_id:n}}return{success:!1,error:i.error,tool_call_id:n}}async function Ja(e,n){let r=await At();if(r.success){let i=r.entries||[];if(e.type===`file`?i=i.filter(e=>!e.isDir):e.type===`directory`&&(i=i.filter(e=>e.isDir)),e.hours&&typeof e.hours==`number`&&e.hours>0){let t=Date.now()-e.hours*3600*1e3;i=i.filter(e=>e.deletedAt>=t)}if(i.length===0){let r=e.type===`file`?`文件`:e.type===`directory`?`目录`:`项目`;return{success:!0,content:t(`toolExec.trashEmpty`,{typeHint:r}),entries:[],tool_call_id:n}}let a=Date.now();return{success:!0,content:`回收站中共有 ${i.length} 个项目(7天后自动清理):\n\n`+i.map((e,t)=>{let n=Math.round((a-e.deletedAt)/36e5),r=n<1?`刚刚`:n<24?`${n}小时前`:`${Math.round(n/24)}天前`,i=e.isDir?`📁 目录`:`📄 文件`;return` ${t+1}. trashId: ${e.id}\n ${i}: ${e.name}\n 原路径: ${e.originalPath}\n 大小: ${e.size} 字节 · ${r}`}).join(`
369
370
 
370
- `),entries:i,tool_call_id:n}}return{success:!1,error:r.error,tool_call_id:n}}async function ka(e,n){let{trashId:r}=e;if(!r)return{success:!1,error:t(`toolExec.missingTrashId`),tool_call_id:n};let i=await Et(r);return i.success?(Di(`file_restore`,`Restore file: ${i.restoredPath}`,{trashId:r,restoredPath:i.restoredPath}),{success:!0,message:t(`toolExec.trashRestored`,{path:i.restoredPath}),restoredPath:i.restoredPath,tool_call_id:n}):{success:!1,error:i.error,tool_call_id:n}}async function Aa(e,n){let{path:r}=e;if(!r)return{success:!1,error:t(`toolExec.missingPathParam`),tool_call_id:n};let i=await $e(r);if(!i.success)return{success:!1,error:i.error,tool_call_id:n};try{let e=`data:${i.mimeType||`application/octet-stream`};base64,${i.content}`,t=await new Promise((t,n)=>{chrome.downloads.download({url:e,filename:i.name,saveAs:!1},e=>{chrome.runtime.lastError?n(Error(chrome.runtime.lastError.message)):t(e)})});return{success:!0,content:i.type===`directory`?`目录 "${r}" 已打包为 ${i.name} 并开始下载 (${Li(i.size)})`:`文件 "${i.name}" 已开始下载 (${Li(i.size)})`,name:i.name,size:i.size,type:i.type,downloadId:t,tool_call_id:n}}catch(e){return{success:!1,error:`下载触发失败: ${e.message}`,tool_call_id:n}}}async function ja(e,t,n){let r,i=new Promise(e=>{r=()=>e(!0)});e&&Kr.set(e,{execId:null,ws:null,toolCallId:t,resolve:r});try{let e=await Promise.race([n,i]);return e===!0?{cancelled:!0}:{cancelled:!1,value:e}}finally{e&&Kr.delete(e)}}async function Ma(e,n,r){let{command:i,cwd:a,force:o,timeoutMs:s}=e;if(!i)return{success:!1,error:t(`toolExec.missingCommand`),tool_call_id:n};let c=await R(),l=!!o||!c.reactConfig.toolConfirmationEnabled,u=c.streamConfig?.streamEnabled!==!1,d=typeof s==`number`&&s>0?Math.max(5e3,s):c.reactConfig.toolTimeout,f=Math.max(12e4,Math.min(d*.8,6e5));if(u){let e=await nt(i,a,l);if(e.level===`deny`)return{success:!1,error:e.error||t(`toolExec.commandExecDenied`),level:`deny`,tool_call_id:n};if(!e.success&&!e.level)return{success:!1,error:e.error||t(`toolExec.commandExecFailed`),tool_call_id:n};if(e.level===`confirm`)return{success:!0,level:`confirm`,message:t(`toolExec.commandNeedConfirm`,{reason:e.reason,command:i}),reason:e.reason,command:i,cwd:a,tool_call_id:n};let{execId:o,wsUrl:s}=e,c=``,u=``,p=null,m=!1,h=null,g=!1,_=!1,v=!1,y=async e=>{if(h)try{h.close()}catch{}if(!g&&o){_=!0;try{await it(o),console.log(`[AgentExec] terminated commandprocess:`,o,e?`(origin reason : ${e})`:``)}catch(e){console.warn(`[AgentExec] terminate commandprocess failed:`,e.message)}}};try{if(h=await at(s,e=>{e.type===`stdout`?(c+=e.data,Mt(r,o,n,`stdout`,e.data)):e.type===`stderr`?(u+=e.data,Mt(r,o,n,`stderr`,e.data)):e.type===`exit`&&(p=e.exitCode,m=e.killed,g=!0,H(r,o,n,p))},()=>{},e=>{console.warn(`[AgentExec] WebSocket error:`,e)},f),!h)throw Error(`创建 WebSocket 连接失败`);r&&Kr.set(r,{execId:o,ws:h,toolCallId:n}),await new Promise((e,t)=>{if(r){let t=Kr.get(r);t&&(t.resolve=e)}if(g){e();return}let i=Date.now(),a=null,s=Date.now(),c=0,l=!1,u=setInterval(()=>qr.has(r)?(console.warn(`[AgentExec] cancelfallbacktimeouttrigger,force resolve:`,r),p=-1,H(r,o,n,-1),clearInterval(u),clearTimeout(m),e(),!0):!1,500),m=setTimeout(()=>{console.error(`[AgentExec] globalhard timeouttrigger (120s ),force killcommand:`,r),clearInterval(u),clearTimeout(a),p=-1,H(r,o,n,-1),y(`命令执行超时`).then(()=>{t(Error(`命令执行超时`))})},12e4),_=n=>{l||(l=!0,clearTimeout(a),clearInterval(u),clearTimeout(m),n===`resolve`?e():t(n))},b=()=>{a&&clearTimeout(a);let e=Date.now(),t=e-i,n=e-s,r=d*(1+c);if(n>=f){if(v=!0,console.warn(`[AgentExec] command idletimeout (`,Math.round(n/1e3),`s no output), possibly issuspended service,keep backgroundprocess`),h)try{h.close()}catch{}a&&clearTimeout(a),_(`resolve`);return}if(t>=r){if(c<5){c++;let e=d*(1+c);console.log(`[AgentExec] command stillexec ,auto extendtimeout (${c} times,total count${Math.round(e/1e3)}s)`),b();return}{let e=`命令执行总超时(${Math.round(r/1e3)}s,已延长5次)`;console.warn(`[AgentExec]`,e),y(e).then(()=>{_(Error(e))});return}}let o=r-t;a=setTimeout(b,Math.min(f,o))};b();let x=h.onmessage;h.onmessage=e=>{x(e);try{let t=JSON.parse(e.data);if(t.type===`stdout`||t.type===`stderr`)s=Date.now(),b();else if(t.type===`exit`){g=!0,a&&clearTimeout(a);try{h.close()}catch{}_(`resolve`)}else if(t.type===`error`){console.warn(`[AgentExec] Agent return error:`,t.error,`execId:`,t.execId),a&&clearTimeout(a);try{h.close()}catch{}y(t.error||`Agent 执行错误`).then(()=>{_(Error(t.error||`Agent 端命令执行失败`))})}}catch{}};let S=h.onclose;h.onclose=()=>{if(a&&clearTimeout(a),Kr.delete(r),qr.has(r)){p=-1,H(r,o,n,-1),_(`resolve`);return}if(S&&S(),v){_(`resolve`);return}g?_(`resolve`):(p=-1,H(r,o,n,-1),y(`WebSocket 连接意外关闭`).then(()=>{_(Error(`命令执行中断:WebSocket 连接意外关闭`))}))};let C=h.onerror;h.onerror=e=>{if(a&&clearTimeout(a),Kr.delete(r),qr.has(r)){p=-1,H(r,o,n,-1),_(`resolve`);return}C&&C(e),y(e.message).then(()=>{_(e)})}})}catch(e){let s=e.message||(e instanceof Error?`未知错误`:String(e));if(console.warn(`[AgentExec] WebSocket streaming failed:`,s),h)try{h.close()}catch{}if(Kr.delete(r),qr.has(r))return H(r,o,n,-1),Di(`command_exec`,`Command cancelled: ${i}`,{command:i,cwd:a,exitCode:-1,error:t(`toolExec.userCancelled`)}),{success:!1,level:`allow`,execId:o,exitCode:-1,stdout:c,stderr:u,killed:!0,content:`${t(`toolExec.commandCancelledWithOutput`)}${c?"stdout:\n```\n"+c+"\n```":``}${u?`
371
+ `),entries:i,tool_call_id:n}}return{success:!1,error:r.error,tool_call_id:n}}async function Ya(e,n){let{trashId:r}=e;if(!r)return{success:!1,error:t(`toolExec.missingTrashId`),tool_call_id:n};let i=await jt(r);return i.success?(qi(`file_restore`,`Restore file: ${i.restoredPath}`,{trashId:r,restoredPath:i.restoredPath}),{success:!0,message:t(`toolExec.trashRestored`,{path:i.restoredPath}),restoredPath:i.restoredPath,tool_call_id:n}):{success:!1,error:i.error,tool_call_id:n}}async function Xa(e,n){let{path:r}=e;if(!r)return{success:!1,error:t(`toolExec.missingPathParam`),tool_call_id:n};let i=await it(r);if(!i.success)return{success:!1,error:i.error,tool_call_id:n};try{let e=`data:${i.mimeType||`application/octet-stream`};base64,${i.content}`,t=await new Promise((t,n)=>{chrome.downloads.download({url:e,filename:i.name,saveAs:!1},e=>{chrome.runtime.lastError?n(Error(chrome.runtime.lastError.message)):t(e)})});return{success:!0,content:i.type===`directory`?`目录 "${r}" 已打包为 ${i.name} 并开始下载 (${ra(i.size)})`:`文件 "${i.name}" 已开始下载 (${ra(i.size)})`,name:i.name,size:i.size,type:i.type,downloadId:t,tool_call_id:n}}catch(e){return{success:!1,error:`下载触发失败: ${e.message}`,tool_call_id:n}}}async function Za(e,t,n){let r,i=new Promise(e=>{r=()=>e(!0)});e&&fi.set(e,{execId:null,ws:null,toolCallId:t,resolve:r});try{let e=await Promise.race([n,i]);return e===!0?{cancelled:!0}:{cancelled:!1,value:e}}finally{e&&fi.delete(e)}}async function Qa(e,n,r){let{command:i,cwd:a,force:o,timeoutMs:s}=e;if(!i)return{success:!1,error:t(`toolExec.missingCommand`),tool_call_id:n};let c=await B(),l=!!o||!c.reactConfig.toolConfirmationEnabled,u=c.streamConfig?.streamEnabled!==!1,d=typeof s==`number`&&s>0?Math.max(5e3,s):c.reactConfig.toolTimeout,f=Math.max(12e4,Math.min(d*.8,6e5));if(u){let e=await st(i,a,l);if(e.level===`deny`)return{success:!1,error:e.error||t(`toolExec.commandExecDenied`),level:`deny`,tool_call_id:n};if(!e.success&&!e.level)return{success:!1,error:e.error||t(`toolExec.commandExecFailed`),tool_call_id:n};if(e.level===`confirm`)return{success:!0,level:`confirm`,message:t(`toolExec.commandNeedConfirm`,{reason:e.reason,command:i}),reason:e.reason,command:i,cwd:a,tool_call_id:n};let{execId:o,wsUrl:s}=e,c=``,u=``,p=null,m=!1,h=null,g=!1,_=!1,v=!1,y=async e=>{if(h)try{h.close()}catch{}if(!g&&o){_=!0;try{await lt(o),console.log(`[AgentExec] terminated commandprocess:`,o,e?`(origin reason : ${e})`:``)}catch(e){console.warn(`[AgentExec] terminate commandprocess failed:`,e.message)}}};try{if(h=await ut(s,e=>{e.type===`stdout`?(c+=e.data,Lt(r,o,n,`stdout`,e.data)):e.type===`stderr`?(u+=e.data,Lt(r,o,n,`stderr`,e.data)):e.type===`exit`&&(p=e.exitCode,m=e.killed,g=!0,Rt(r,o,n,p))},()=>{},e=>{console.warn(`[AgentExec] WebSocket error:`,e)},f),!h)throw Error(`创建 WebSocket 连接失败`);r&&fi.set(r,{execId:o,ws:h,toolCallId:n}),await new Promise((e,t)=>{if(r){let t=fi.get(r);t&&(t.resolve=e)}if(g){e();return}let i=Date.now(),a=null,s=Date.now(),c=0,l=!1,u=setInterval(()=>pi.has(r)?(console.warn(`[AgentExec] cancelfallbacktimeouttrigger,force resolve:`,r),p=-1,Rt(r,o,n,-1),clearInterval(u),clearTimeout(m),e(),!0):!1,500),m=setTimeout(()=>{console.error(`[AgentExec] globalhard timeouttrigger (120s ),force killcommand:`,r),clearInterval(u),clearTimeout(a),p=-1,Rt(r,o,n,-1),y(`命令执行超时`).then(()=>{t(Error(`命令执行超时`))})},12e4),_=n=>{l||(l=!0,clearTimeout(a),clearInterval(u),clearTimeout(m),n===`resolve`?e():t(n))},b=()=>{a&&clearTimeout(a);let e=Date.now(),t=e-i,n=e-s,r=d*(1+c);if(n>=f){if(v=!0,console.warn(`[AgentExec] command idletimeout (`,Math.round(n/1e3),`s no output), possibly issuspended service,keep backgroundprocess`),h)try{h.close()}catch{}a&&clearTimeout(a),_(`resolve`);return}if(t>=r){if(c<5){c++;let e=d*(1+c);console.log(`[AgentExec] command stillexec ,auto extendtimeout (${c} times,total count${Math.round(e/1e3)}s)`),b();return}{let e=`命令执行总超时(${Math.round(r/1e3)}s,已延长5次)`;console.warn(`[AgentExec]`,e),y(e).then(()=>{_(Error(e))});return}}let o=r-t;a=setTimeout(b,Math.min(f,o))};b();let x=h.onmessage;h.onmessage=e=>{x(e);try{let t=JSON.parse(e.data);if(t.type===`stdout`||t.type===`stderr`)s=Date.now(),b();else if(t.type===`exit`){g=!0,a&&clearTimeout(a);try{h.close()}catch{}_(`resolve`)}else if(t.type===`error`){console.warn(`[AgentExec] Agent return error:`,t.error,`execId:`,t.execId),a&&clearTimeout(a);try{h.close()}catch{}y(t.error||`Agent 执行错误`).then(()=>{_(Error(t.error||`Agent 端命令执行失败`))})}}catch{}};let S=h.onclose;h.onclose=()=>{if(a&&clearTimeout(a),fi.delete(r),pi.has(r)){p=-1,Rt(r,o,n,-1),_(`resolve`);return}if(S&&S(),v){_(`resolve`);return}g?_(`resolve`):(p=-1,Rt(r,o,n,-1),y(`WebSocket 连接意外关闭`).then(()=>{_(Error(`命令执行中断:WebSocket 连接意外关闭`))}))};let C=h.onerror;h.onerror=e=>{if(a&&clearTimeout(a),fi.delete(r),pi.has(r)){p=-1,Rt(r,o,n,-1),_(`resolve`);return}C&&C(e),y(e.message).then(()=>{_(e)})}})}catch(e){let s=e.message||(e instanceof Error?`未知错误`:String(e));if(console.warn(`[AgentExec] WebSocket streaming failed:`,s),h)try{h.close()}catch{}if(fi.delete(r),pi.has(r))return Rt(r,o,n,-1),qi(`command_exec`,`Command cancelled: ${i}`,{command:i,cwd:a,exitCode:-1,error:t(`toolExec.userCancelled`)}),{success:!1,level:`allow`,execId:o,exitCode:-1,stdout:c,stderr:u,killed:!0,content:`${t(`toolExec.commandCancelledWithOutput`)}${c?"stdout:\n```\n"+c+"\n```":``}${u?`
371
372
  stderr:
372
373
  \`\`\`
373
374
  `+u+"\n```":``}`,message:`${t(`toolExec.commandCancelledWithOutput`)}${c?"stdout:\n```\n"+c+"\n```":``}${u?`
374
375
  stderr:
375
376
  \`\`\`
376
- `+u+"\n```":``}`,error:t(`toolExec.userCancelled`)};if(s.includes(`超时`)||s.includes(`中断`)||_)return H(r,o,n,-1),Di(`command_exec`,`Command failed: ${i}`,{command:i,cwd:a,exitCode:-1,error:s}),{success:!1,level:`allow`,execId:o,exitCode:-1,stdout:c,stderr:u,killed:!0,message:t(`toolExec.commandExecFailedWithOutput`,{error:s,output:(c?"stdout:\n```\n"+c+"\n```":``)+(u?`
377
+ `+u+"\n```":``}`,error:t(`toolExec.userCancelled`)};if(s.includes(`超时`)||s.includes(`中断`)||_)return Rt(r,o,n,-1),qi(`command_exec`,`Command failed: ${i}`,{command:i,cwd:a,exitCode:-1,error:s}),{success:!1,level:`allow`,execId:o,exitCode:-1,stdout:c,stderr:u,killed:!0,message:t(`toolExec.commandExecFailedWithOutput`,{error:s,output:(c?"stdout:\n```\n"+c+"\n```":``)+(u?`
377
378
  stderr:
378
379
  \`\`\`
379
- `+u+"\n```":``)}),error:s};console.warn(`[AgentExec] fallback to syncmode:`,s);let f=await ja(r,n,rt(i,a,l,d));return f.cancelled?{success:!1,content:t(`toolExec.commandCancelled`),error:t(`toolExec.userCancelled`),tool_call_id:n}:Na(f.value,i,a,n)}if(Di(`command_exec`,`Execute command: ${i}`,{command:i,cwd:a,exitCode:p}),v){H(r,o,n,0),console.log(`[AgentExec] idletimeout,returned partialresult (command possibly stillbackgroundrun )`);let e=`命令仍在后台运行(已空闲超时,进程未终止)。\n\n执行期间输出:\n${c?"stdout:\n```\n"+c+"\n```":`(无输出)`}${u?`
380
+ `+u+"\n```":``)}),error:s};console.warn(`[AgentExec] fallback to syncmode:`,s);let f=await Za(r,n,ct(i,a,l,d));return f.cancelled?{success:!1,content:t(`toolExec.commandCancelled`),error:t(`toolExec.userCancelled`),tool_call_id:n}:$a(f.value,i,a,n)}if(qi(`command_exec`,`Execute command: ${i}`,{command:i,cwd:a,exitCode:p}),v){Rt(r,o,n,0),console.log(`[AgentExec] idletimeout,returned partialresult (command possibly stillbackgroundrun )`);let e=`命令仍在后台运行(已空闲超时,进程未终止)。\n\n执行期间输出:\n${c?"stdout:\n```\n"+c+"\n```":`(无输出)`}${u?`
380
381
  stderr:
381
382
  \`\`\`
382
383
  `+u+"\n```":``}\n\n⚠️ 注意:此命令为挂起型进程(如服务/守护进程),进程仍在后台运行中。`;return{success:!0,level:`allow`,execId:o,partial:!0,stdout:c,stderr:u,content:e,message:e,hint:`命令为挂起型进程,仍在后台运行`,tool_call_id:n}}let b=p!=null,x=b&&p>=0&&p<=127,S=b?t(`toolExec.exitCodeInfo`,{code:p}):t(`toolExec.noExitCodeInfo`),C=t(`toolExec.commandExecComplete`,{exitInfo:S});return c&&(C+=`
@@ -384,31 +385,35 @@ stderr:
384
385
  `+t(`toolExec.stdoutOutput`,{stdout:c})),u&&(C+=`
385
386
  `+t(`toolExec.stderrOutput`,{stderr:u})),m&&(C+=`
386
387
  `+t(`toolExec.commandKilledWarning`)),b||(C+=`
387
- `+t(`toolExec.commandNoExitCodeWarning`)),{success:x,level:`allow`,execId:o,exitCode:b?p:void 0,stdout:c,stderr:u,killed:m,content:C,message:C,error:x?void 0:b?t(`toolExec.commandExitCodeError`,{code:p}):t(`toolExec.commandNoExitCodeErrorMsg`),tool_call_id:n}}let p=await ja(r,n,rt(i,a,l,d));return p.cancelled?{success:!1,content:t(`toolExec.commandCancelled`),error:t(`toolExec.userCancelled`),tool_call_id:n}:Na(p.value,i,a,n)}function Na(e,n,r,i){if(e.level===`deny`)return{success:!1,error:e.error||t(`toolExec.commandExecDenied`),level:`deny`,tool_call_id:i};if(!e.success&&!e.level)return{success:!1,error:e.error||t(`toolExec.commandExecFailed`),tool_call_id:i};if(e.level===`confirm`)return{success:!0,level:`confirm`,message:t(`toolExec.commandNeedConfirm`,{reason:e.reason,command:n}),reason:e.reason,command:n,cwd:r,tool_call_id:i};Di(`command_exec`,`Execute command: ${n}`,{command:n,cwd:r,exitCode:e.exitCode});let a=e.exitCode!==null&&e.exitCode!==void 0,o=a&&e.exitCode>=0&&e.exitCode<=127,s=a?t(`toolExec.exitCodeInfo`,{code:e.exitCode}):t(`toolExec.noExitCodeInfo`),c=t(`toolExec.commandExecComplete`,{exitInfo:s});return e.stdout&&(c+=`
388
+ `+t(`toolExec.commandNoExitCodeWarning`)),{success:x,level:`allow`,execId:o,exitCode:b?p:void 0,stdout:c,stderr:u,killed:m,content:C,message:C,error:x?void 0:b?t(`toolExec.commandExitCodeError`,{code:p}):t(`toolExec.commandNoExitCodeErrorMsg`),tool_call_id:n}}let p=await Za(r,n,ct(i,a,l,d));return p.cancelled?{success:!1,content:t(`toolExec.commandCancelled`),error:t(`toolExec.userCancelled`),tool_call_id:n}:$a(p.value,i,a,n)}function $a(e,n,r,i){if(e.level===`deny`)return{success:!1,error:e.error||t(`toolExec.commandExecDenied`),level:`deny`,tool_call_id:i};if(!e.success&&!e.level)return{success:!1,error:e.error||t(`toolExec.commandExecFailed`),tool_call_id:i};if(e.level===`confirm`)return{success:!0,level:`confirm`,message:t(`toolExec.commandNeedConfirm`,{reason:e.reason,command:n}),reason:e.reason,command:n,cwd:r,tool_call_id:i};qi(`command_exec`,`Execute command: ${n}`,{command:n,cwd:r,exitCode:e.exitCode});let a=e.exitCode!==null&&e.exitCode!==void 0,o=a&&e.exitCode>=0&&e.exitCode<=127,s=a?t(`toolExec.exitCodeInfo`,{code:e.exitCode}):t(`toolExec.noExitCodeInfo`),c=t(`toolExec.commandExecComplete`,{exitInfo:s});return e.stdout&&(c+=`
388
389
 
389
390
  `+t(`toolExec.stdoutOutput`,{stdout:e.stdout})),e.stderr&&(c+=`
390
391
  `+t(`toolExec.stderrOutput`,{stderr:e.stderr})),e.killed&&(c+=`
391
392
  `+t(`toolExec.commandKilledWarning`)),a||(c+=`
392
- `+t(`toolExec.commandNoExitCodeWarning`)),{success:o,level:`allow`,execId:e.execId,exitCode:a?e.exitCode:void 0,stdout:e.stdout||``,stderr:e.stderr||``,killed:e.killed||!1,message:c,error:o?void 0:a?t(`toolExec.commandExitCodeError`,{code:e.exitCode}):t(`toolExec.commandNoExitCodeErrorMsg`),tool_call_id:i}}async function Pa(e,n){let{path:r,pattern:i,recursive:a,maxResults:o}=e;if(!r)return{success:!1,error:t(`toolExec.missingPathParam`),tool_call_id:n};let s=await et(r,i||`*`,a!==!1,o||200);if(s.success){let e=s.engine===`fd`?t(`toolExec.engineLabelFd`):t(`toolExec.engineLabelNodejs`),r=s.results.slice(0,50).map(e=>`${e.path} (${e.size} bytes)`).join(`
393
+ `+t(`toolExec.commandNoExitCodeWarning`)),{success:o,level:`allow`,execId:e.execId,exitCode:a?e.exitCode:void 0,stdout:e.stdout||``,stderr:e.stderr||``,killed:e.killed||!1,message:c,error:o?void 0:a?t(`toolExec.commandExitCodeError`,{code:e.exitCode}):t(`toolExec.commandNoExitCodeErrorMsg`),tool_call_id:i}}async function eo(e,n){let{path:r,pattern:i,recursive:a,maxResults:o}=e;if(!r)return{success:!1,error:t(`toolExec.missingPathParam`),tool_call_id:n};let s=await at(r,i||`*`,a!==!1,o||200);if(s.success){let e=s.engine===`fd`?t(`toolExec.engineLabelFd`):t(`toolExec.engineLabelNodejs`),r=s.results.slice(0,50).map(e=>`${e.path} (${e.size} bytes)`).join(`
393
394
  `);return{success:!0,results:s.results,total:s.total,engine:s.engine,message:t(`toolExec.agentSearchFilesResult`,{total:s.total,engineLabel:e})+`
394
395
 
395
- `+r+(s.total>50?t(`toolExec.fileListLimitHint`,{count:50}):``),tool_call_id:n}}return{success:!1,error:s.error,tool_call_id:n}}async function Fa(e,n){let{path:r,pattern:i,filePattern:a,caseSensitive:o,recursive:s,maxResults:c,contextLines:l}=e;if(!r)return{success:!1,error:t(`toolExec.missingPathParam`),tool_call_id:n};if(!i)return{success:!1,error:t(`toolExec.missingPattern`),tool_call_id:n};let u=await tt(r,i,a||null,o||!1,s!==!1,c||100,l===void 0?2:l);if(u.success){let e=u.engine===`rg`?t(`toolExec.engineLabelRipgrep`):t(`toolExec.engineLabelNodejs`),r=u.results.slice(0,30).map(e=>`${e.file}:${e.line}\n${e.content}`).join(`
396
+ `+r+(s.total>50?t(`toolExec.fileListLimitHint`,{count:50}):``),tool_call_id:n}}return{success:!1,error:s.error,tool_call_id:n}}async function to(e,n){let{path:r,pattern:i,filePattern:a,caseSensitive:o,recursive:s,maxResults:c,contextLines:l}=e;if(!r)return{success:!1,error:t(`toolExec.missingPathParam`),tool_call_id:n};if(!i)return{success:!1,error:t(`toolExec.missingPattern`),tool_call_id:n};let u=await ot(r,i,a||null,o||!1,s!==!1,c||100,l===void 0?2:l);if(u.success){let e=u.engine===`rg`?t(`toolExec.engineLabelRipgrep`):t(`toolExec.engineLabelNodejs`),r=u.results.slice(0,30).map(e=>`${e.file}:${e.line}\n${e.content}`).join(`
396
397
 
397
398
  `);return{success:!0,results:u.results,total:u.total,engine:u.engine,message:t(`toolExec.agentSearchContentResult`,{total:u.total,engineLabel:e})+`
398
399
 
399
- `+r+(u.total>30?t(`toolExec.matchListLimitHint`,{count:30}):``),tool_call_id:n}}return{success:!1,error:u.error,tool_call_id:n}}var Ia=null;async function La(){let e=chrome.runtime.getURL(`offscreen/offscreen.html`);if(!((await chrome.runtime.getContexts({contextTypes:[`OFFSCREEN_DOCUMENT`],documentUrls:[e]})).length>0)){if(Ia){await Ia;return}Ia=chrome.offscreen.createDocument({url:`offscreen/offscreen.html`,reasons:[`CLIPBOARD`],justification:`用于读写系统剪贴板内容`});try{await Ia}finally{Ia=null}}}async function Ra(e,n,r,i){let{format:a=`text`,selector:o,maxLength:s=15e3,tabId:c}=e,l={text:`GET_PAGE_TEXT`,html:`GET_FULL_HTML`}[a];if(!l)return{success:!1,error:`不支持的格式: ${a},可选: text, html`,tool_call_id:n};try{let e=r?L(r):null,i=c||e||await Bi();return i?await Vi(i,{type:l,selector:o,maxLength:s},n):{success:!1,error:t(`toolExec.noTabAvailable`),tool_call_id:n}}catch(e){return{success:!1,error:e.message,tool_call_id:n}}}async function za(e,n,r,i){let{dataType:a,selector:o,filterType:s=`all`,includeHeaders:c=!0,format:l=`json`,includeImages:u=!1,minWidth:d=0,minHeight:f=0,maxResults:p=100,tabId:m}=e;if(!a)return{success:!1,error:t(`toolExec.missingDataType`),tool_call_id:n};let h={table:`EXTRACT_TABLE`,metadata:`EXTRACT_METADATA`,links:`EXTRACT_LINKS`,forms:`EXTRACT_FORMS`,images:`EXTRACT_IMAGES`}[a];if(!h)return{success:!1,error:`不支持的数据类型: ${a},可选: table, metadata, links, forms, images`,tool_call_id:n};try{let e=r?L(r):null,i=m||e||await Bi();return i?await Vi(i,{type:h,selector:o,filterType:s,includeHeaders:c,format:l,includeImages:u,minWidth:d,minHeight:f,maxResults:p},n):{success:!1,error:t(`toolExec.noTabAvailable`),tool_call_id:n}}catch(e){return{success:!1,error:e.message,tool_call_id:n}}}async function Ba(e,n){let{action:r,text:i,format:a=`text`}=e;if(!r)return{success:!1,error:t(`toolExec.missingAction`),tool_call_id:n};if(r===`copy`)return Va({text:i},n);if(r===`paste`)return Ha({},n);if(r===`get_selected`)try{let e=await Bi();return e?await Vi(e,{type:`GET_SELECTED_CONTENT`,format:a},n):{success:!1,error:t(`toolExec.noTabAvailable`),tool_call_id:n}}catch(e){return{success:!1,error:e.message,tool_call_id:n}}return{success:!1,error:`不支持的操作: ${r},可选: copy, paste, get_selected`,tool_call_id:n}}async function Va(e,n){let{text:r}=e;if(r==null)return{success:!1,error:t(`toolExec.missingText`),tool_call_id:n};try{await La();let e=await chrome.runtime.sendMessage({type:`COPY_TO_CLIPBOARD`,text:r});return e?.success?{success:!0,message:e.message||t(`toolExec.copiedToClipboard`),tool_call_id:n}:{success:!1,error:e?.error||t(`toolExec.copyFailed`),tool_call_id:n}}catch(e){return{success:!1,error:e.message,tool_call_id:n}}}async function Ha(e,t){try{await La();let e=await chrome.runtime.sendMessage({type:`PASTE_FROM_CLIPBOARD`});return e?.success?{success:!0,text:e.text,tool_call_id:t}:{success:!1,error:e?.error||`粘贴失败`,tool_call_id:t}}catch(e){return{success:!1,error:e.message,tool_call_id:t}}}async function Ua(e,t=`kill`){console.log(`[Background] cancelrunning Agent command,sessionId:`,e,`mode:`,t),qr.add(e);let n=Kr.get(e);if(!n){console.warn(`[Background] runningAgentCommands not found entry:`,e),setTimeout(()=>{qr.delete(e)},3e3);return}let{execId:r,ws:i,resolve:a,toolCallId:o}=n;console.log(`[Background] find to runningcommand,execId:`,r),Kr.delete(e),H(e,r,o,-1),a&&(a(),console.log(`[Background] Promise direct resolve,task continuesexec `));try{i.close()}catch{}t===`kill`?it(r).then(()=>{console.log(`[Background] stopped Agent command process:`,r)}).catch(e=>{console.warn(`[Background] stop Agent command process failed:`,e.message)}):console.log(`[Background] only disconnect WebSocket,command process continuesrun :`,r),setTimeout(()=>{qr.delete(e)},3e3)}async function Wa(e,n){try{let e=await Ue(),r=await We(),i=[];for(let t of e){let e=Be(t.id);i.push({id:t.id,name:t.name,url:t.url,reachable:e,disabled:t.disabled||!1,isActive:r?.id===t.id})}let a=i.map(e=>{let n=e.disabled?t(`toolExec.agentStatusDisabled`):e.reachable===!0?t(`toolExec.agentStatusOnline`):e.reachable===!1?t(`toolExec.agentStatusOffline`):t(`toolExec.agentStatusUnknown`),r=e.isActive?t(`toolExec.agentStatusActive`):``;return`- ${e.name} (${e.id}): ${n}${r}`}).join(`
400
- `);return{success:!0,content:t(`toolExec.agentListContent`,{summary:a,data:JSON.stringify(i,null,2)}),agents:i,activeAgentId:r?.id||null,tool_call_id:n}}catch(e){return{success:!1,error:t(`toolExec.agentListFailed`,{error:e.message}),tool_call_id:n}}}async function Ga(e,n){let{agentId:r,agentName:i}=e;if(!r&&!i)return{success:!1,error:t(`toolExec.missingAgentId`),tool_call_id:n};try{let e=await Ue(),a;if(r&&(a=e.find(e=>e.id===r)),!a&&i&&(a=e.find(e=>e.name===i),a||=e.find(e=>e.name&&e.name.toLowerCase().includes(i.toLowerCase()))),!a){let a=e.map(e=>`- ${e.name} (${e.id})`).join(`
401
- `);return{success:!1,error:t(`toolExec.agentNotFound`,{id:r||i,list:a}),tool_call_id:n}}if(a.disabled)return{success:!1,error:t(`toolExec.agentDisabled`,{name:a.name}),tool_call_id:n};if(!await Ge(a.id))return{success:!1,error:t(`toolExec.agentSwitchFailedSimple`,{name:a.name}),tool_call_id:n};let o=Be(a.id),s=o===!0?``:t(`toolExec.agentOfflineWarning`);return{success:!0,content:t(`toolExec.agentSwitchSuccess`,{name:a.name,id:a.id,warning:s}),agentId:a.id,agentName:a.name,offline:o!==!0,tool_call_id:n}}catch(e){return{success:!1,error:t(`toolExec.agentSwitchFailed`,{error:e.message}),tool_call_id:n}}}function Ka(e,t){return e??t}function qa(e,t,n){if(e===`*`||e===`?`||e===``)return()=>!0;let r=[];for(let i of String(e).split(`,`)){let e=1,a=i,o=i.indexOf(`/`);o!==-1&&(e=parseInt(i.slice(o+1),10)||1,a=i.slice(0,o));let s,c;if(a===`*`||a===``)s=t,c=n;else if(a.includes(`-`)){let e=a.split(`-`);s=parseInt(e[0],10),c=parseInt(e[1],10)}else s=c=parseInt(a,10);Number.isNaN(s)||Number.isNaN(c)||r.push({lo:s,hi:c,step:e})}return e=>r.some(({lo:t,hi:n,step:r})=>e>=t&&e<=n&&(e-t)%r===0)}function Ja(e,t=Date.now()){if(!e)return null;let n=String(e).trim().split(/\s+/);if(n.length!==5)return null;let r=qa(n[0],0,59),i=qa(n[1],0,23),a=qa(n[2],1,31),o=qa(n[3],1,12),s=qa(n[4],0,6),c=n[2]!==`*`&&n[2]!==`?`,l=n[4]!==`*`&&n[4]!==`?`,u=new Date(t+6e4);u.setSeconds(0,0);for(let e=0;e<527040;e++){let e=u.getMonth()+1,t=u.getDate(),n=u.getDay(),d=u.getHours(),f=u.getMinutes(),p=a(t),m=s(n),h=c&&l?p||m:(!c||p)&&(!l||m);if(o(e)&&h&&i(d)&&r(f))return u.getTime();u.setMinutes(u.getMinutes()+1)}return null}function Ya(e){let t=String(e??``).trim().match(/^(\d+(?:\.\d+)?)\s*(m|h|d|min|hour|day)?$/i);if(!t)return null;let n=parseFloat(t[1]);if(Number.isNaN(n))return null;let r=(t[2]||`m`).toLowerCase();return r===`h`||r===`hour`?n*=60:(r===`d`||r===`day`)&&(n*=1440),Math.max(1,Math.round(n))}function Xa(e,t=Date.now()){let n=e?.schedule;if(!n)return null;if(n.type===`once`){if(n.onceMode===`relative`){let e=Ya(n.value);return e?t+e*60*1e3:null}let e=new Date(n.value).getTime();return Number.isNaN(e)?null:e}if(n.type===`interval`){let e=Ya(n.value);return e?t+e*60*1e3:null}return n.type===`cron`?Ja(n.value,t):null}function Za(e,t=Date.now()){return e?!!(e.schedule?.type===`once`||e.maxRuns!=null&&Array.isArray(e.runHistory)&&e.runHistory.length>=e.maxRuns||e.endAt!=null&&t>=e.endAt):!1}function Qa(e={}){return{name:e.name||``,description:e.description||``,prompt:e.prompt||``,schedule:e.schedule||null,enabled:e.enabled!==!1,contextUrl:e.contextUrl||null,contextMode:e.contextMode||`fetch`,sessionId:e.sessionId||null,model:e.model||null,agentId:e.agentId||null,useTools:e.useTools==null?null:e.useTools,temperature:e.temperature==null?null:e.temperature,topP:e.topP==null?null:e.topP,maxRuns:e.maxRuns==null?null:Number(e.maxRuns)||null,endAt:e.endAt==null?null:Number(e.endAt)||null}}e(`zh`,{sched:{missingFields:`缺少必要字段(名称、指令、定时规则)`,notFound:`定时任务不存在`,running:`运行中`,success:`成功`,failed:`失败`,userMsgPrefix:`定时任务`,invalidCron:`Cron 表达式无效`,invalidInterval:`间隔时间格式无效`,taskDisabled:`任务已停用,无法执行`,notifFailTitle:`定时任务执行失败`,notifFailMsg:`任务「{name}」执行失败:{error}`}}),e(`en`,{sched:{missingFields:`Missing required fields (name, prompt, schedule)`,notFound:`Scheduled task not found`,running:`Running`,success:`Success`,failed:`Failed`,userMsgPrefix:`Scheduled task`,invalidCron:`Invalid cron expression`,invalidInterval:`Invalid interval value`,taskDisabled:`Task is disabled`,notifFailTitle:`Scheduled task failed`,notifFailMsg:`Task "{name}" failed: {error}`}});var $a=`st:`,eo=new Set;function to(e){return $a+e}function no(e){if(!e||!e.id)return;let t=to(e.id);if(!e.enabled){chrome.alarms.clear(t,()=>{});return}if(e.schedule?.type===`interval`){let n=Ya(e.schedule.value)||1;chrome.alarms.create(t,{delayInMinutes:n,periodInMinutes:n})}else{let n=Xa(e);n&&chrome.alarms.create(t,{when:n})}}async function ro(){try{let e=await chrome.alarms.getAll(),t=new Set(e.map(e=>e.name)),n=await C(),i=new Set(n.filter(e=>e.enabled&&e.schedule).map(e=>to(e.id)));for(let e of n){let n=to(e.id);e.enabled&&!t.has(n)&&no(e)}for(let t of e)t.name.startsWith($a)&&!i.has(t.name)&&await chrome.alarms.clear(t.name);r.debug(`[Scheduler] rehydrated alarms, tasks=${n.length}`)}catch(e){r.warn(`[Scheduler] rehydrateAlarms failed:`,e)}}chrome.alarms?.onAlarm?.addListener?.(e=>{if(!e.name.startsWith($a))return;let t=e.name.slice(3);mo(t).catch(e=>r.error(`[Scheduler] onAlarm runTask failed:`,t,e))});async function io(e){return e&&(j.find(t=>t.id===e)||((await chrome.storage.local.get([`customAgents`])).customAgents||[]).find(t=>t.id===e))||null}async function ao(e){if(e.sessionId){let t=await k(e.sessionId);if(t)return{session:t,created:!1}}return{session:await fe(e),created:!0}}async function oo(e,t){let n=new Date().toLocaleString(`zh-CN`),r=e?.systemPrompt||``;if(t&&t.length>0)try{let e=await yt(t);e?.success&&e.prompts&&(r+=`
400
+ `+r+(u.total>30?t(`toolExec.matchListLimitHint`,{count:30}):``),tool_call_id:n}}return{success:!1,error:u.error,tool_call_id:n}}var no=null;async function ro(){let e=chrome.runtime.getURL(`offscreen/offscreen.html`);if(!((await chrome.runtime.getContexts({contextTypes:[`OFFSCREEN_DOCUMENT`],documentUrls:[e]})).length>0)){if(no){await no;return}no=chrome.offscreen.createDocument({url:`offscreen/offscreen.html`,reasons:[`CLIPBOARD`],justification:`用于读写系统剪贴板内容`});try{await no}finally{no=null}}}async function io(e,n,r,i){let{format:a=`text`,selector:o,maxLength:s=15e3,tabId:c}=e,l={text:`GET_PAGE_TEXT`,html:`GET_FULL_HTML`}[a];if(!l)return{success:!1,error:`不支持的格式: ${a},可选: text, html`,tool_call_id:n};try{let e=r?je(r):null,i=c||e||await oa();return i?await sa(i,{type:l,selector:o,maxLength:s},n):{success:!1,error:t(`toolExec.noTabAvailable`),tool_call_id:n}}catch(e){return{success:!1,error:e.message,tool_call_id:n}}}async function ao(e,n,r,i){let{dataType:a,selector:o,filterType:s=`all`,includeHeaders:c=!0,format:l=`json`,includeImages:u=!1,minWidth:d=0,minHeight:f=0,maxResults:p=100,tabId:m}=e;if(!a)return{success:!1,error:t(`toolExec.missingDataType`),tool_call_id:n};let h={table:`EXTRACT_TABLE`,metadata:`EXTRACT_METADATA`,links:`EXTRACT_LINKS`,forms:`EXTRACT_FORMS`,images:`EXTRACT_IMAGES`}[a];if(!h)return{success:!1,error:`不支持的数据类型: ${a},可选: table, metadata, links, forms, images`,tool_call_id:n};try{let e=r?je(r):null,i=m||e||await oa();return i?await sa(i,{type:h,selector:o,filterType:s,includeHeaders:c,format:l,includeImages:u,minWidth:d,minHeight:f,maxResults:p},n):{success:!1,error:t(`toolExec.noTabAvailable`),tool_call_id:n}}catch(e){return{success:!1,error:e.message,tool_call_id:n}}}async function oo(e,n){let{action:r,text:i,format:a=`text`}=e;if(!r)return{success:!1,error:t(`toolExec.missingAction`),tool_call_id:n};if(r===`copy`)return so({text:i},n);if(r===`paste`)return co({},n);if(r===`get_selected`)try{let e=await oa();return e?await sa(e,{type:`GET_SELECTED_CONTENT`,format:a},n):{success:!1,error:t(`toolExec.noTabAvailable`),tool_call_id:n}}catch(e){return{success:!1,error:e.message,tool_call_id:n}}return{success:!1,error:`不支持的操作: ${r},可选: copy, paste, get_selected`,tool_call_id:n}}async function so(e,n){let{text:r}=e;if(r==null)return{success:!1,error:t(`toolExec.missingText`),tool_call_id:n};try{await ro();let e=await chrome.runtime.sendMessage({type:`COPY_TO_CLIPBOARD`,text:r});return e?.success?{success:!0,message:e.message||t(`toolExec.copiedToClipboard`),tool_call_id:n}:{success:!1,error:e?.error||t(`toolExec.copyFailed`),tool_call_id:n}}catch(e){return{success:!1,error:e.message,tool_call_id:n}}}async function co(e,t){try{await ro();let e=await chrome.runtime.sendMessage({type:`PASTE_FROM_CLIPBOARD`});return e?.success?{success:!0,text:e.text,tool_call_id:t}:{success:!1,error:e?.error||`粘贴失败`,tool_call_id:t}}catch(e){return{success:!1,error:e.message,tool_call_id:t}}}async function lo(e,t=`kill`){console.log(`[Background] cancelrunning Agent command,sessionId:`,e,`mode:`,t),pi.add(e);let n=fi.get(e);if(!n){console.warn(`[Background] runningAgentCommands not found entry:`,e),setTimeout(()=>{pi.delete(e)},3e3);return}let{execId:r,ws:i,resolve:a,toolCallId:o}=n;console.log(`[Background] find to runningcommand,execId:`,r),fi.delete(e),Rt(e,r,o,-1),a&&(a(),console.log(`[Background] Promise direct resolve,task continuesexec `));try{i.close()}catch{}t===`kill`?lt(r).then(()=>{console.log(`[Background] stopped Agent command process:`,r)}).catch(e=>{console.warn(`[Background] stop Agent command process failed:`,e.message)}):console.log(`[Background] only disconnect WebSocket,command process continuesrun :`,r),setTimeout(()=>{pi.delete(e)},3e3)}async function uo(e,n){try{let e=await Je(),r=await Ye(),i=[];for(let t of e){let e=We(t.id);i.push({id:t.id,name:t.name,url:t.url,reachable:e,disabled:t.disabled||!1,isActive:r?.id===t.id})}let a=i.map(e=>{let n=e.disabled?t(`toolExec.agentStatusDisabled`):e.reachable===!0?t(`toolExec.agentStatusOnline`):e.reachable===!1?t(`toolExec.agentStatusOffline`):t(`toolExec.agentStatusUnknown`),r=e.isActive?t(`toolExec.agentStatusActive`):``;return`- ${e.name} (${e.id}): ${n}${r}`}).join(`
401
+ `);return{success:!0,content:t(`toolExec.agentListContent`,{summary:a,data:JSON.stringify(i,null,2)}),agents:i,activeAgentId:r?.id||null,tool_call_id:n}}catch(e){return{success:!1,error:t(`toolExec.agentListFailed`,{error:e.message}),tool_call_id:n}}}async function fo(e,n){let{agentId:r,agentName:i}=e;if(!r&&!i)return{success:!1,error:t(`toolExec.missingAgentId`),tool_call_id:n};try{let e=await Je(),a;if(r&&(a=e.find(e=>e.id===r)),!a&&i&&(a=e.find(e=>e.name===i),a||=e.find(e=>e.name&&e.name.toLowerCase().includes(i.toLowerCase()))),!a){let a=e.map(e=>`- ${e.name} (${e.id})`).join(`
402
+ `);return{success:!1,error:t(`toolExec.agentNotFound`,{id:r||i,list:a}),tool_call_id:n}}if(a.disabled)return{success:!1,error:t(`toolExec.agentDisabled`,{name:a.name}),tool_call_id:n};if(!await Xe(a.id))return{success:!1,error:t(`toolExec.agentSwitchFailedSimple`,{name:a.name}),tool_call_id:n};let o=We(a.id),s=o===!0?``:t(`toolExec.agentOfflineWarning`);return{success:!0,content:t(`toolExec.agentSwitchSuccess`,{name:a.name,id:a.id,warning:s}),agentId:a.id,agentName:a.name,offline:o!==!0,tool_call_id:n}}catch(e){return{success:!1,error:t(`toolExec.agentSwitchFailed`,{error:e.message}),tool_call_id:n}}}function po(e,t){return e??t}function mo(e,t,n){if(e===`*`||e===`?`||e===``)return()=>!0;let r=[];for(let i of String(e).split(`,`)){let e=1,a=i,o=i.indexOf(`/`);o!==-1&&(e=parseInt(i.slice(o+1),10)||1,a=i.slice(0,o));let s,c;if(a===`*`||a===``)s=t,c=n;else if(a.includes(`-`)){let e=a.split(`-`);s=parseInt(e[0],10),c=parseInt(e[1],10)}else s=c=parseInt(a,10);Number.isNaN(s)||Number.isNaN(c)||r.push({lo:s,hi:c,step:e})}return e=>r.some(({lo:t,hi:n,step:r})=>e>=t&&e<=n&&(e-t)%r===0)}function ho(e,t=Date.now()){if(!e)return null;let n=String(e).trim().split(/\s+/);if(n.length!==5)return null;let r=mo(n[0],0,59),i=mo(n[1],0,23),a=mo(n[2],1,31),o=mo(n[3],1,12),s=mo(n[4],0,6),c=n[2]!==`*`&&n[2]!==`?`,l=n[4]!==`*`&&n[4]!==`?`,u=new Date(t+6e4);u.setSeconds(0,0);for(let e=0;e<527040;e++){let e=u.getMonth()+1,t=u.getDate(),n=u.getDay(),d=u.getHours(),f=u.getMinutes(),p=a(t),m=s(n),h=c&&l?p||m:(!c||p)&&(!l||m);if(o(e)&&h&&i(d)&&r(f))return u.getTime();u.setMinutes(u.getMinutes()+1)}return null}function go(e){let t=String(e??``).trim().match(/^(\d+(?:\.\d+)?)\s*(m|h|d|min|hour|day)?$/i);if(!t)return null;let n=parseFloat(t[1]);if(Number.isNaN(n))return null;let r=(t[2]||`m`).toLowerCase();return r===`h`||r===`hour`?n*=60:(r===`d`||r===`day`)&&(n*=1440),Math.max(1,Math.round(n))}function _o(e,t=Date.now()){let n=e?.schedule;if(!n)return null;if(n.type===`once`){if(n.onceMode===`relative`){let e=go(n.value);return e?t+e*60*1e3:null}let e=new Date(n.value).getTime();return Number.isNaN(e)?null:e}if(n.type===`interval`){let e=go(n.value);return e?t+e*60*1e3:null}return n.type===`cron`?ho(n.value,t):null}function vo(e,t=Date.now()){return e?!!(e.schedule?.type===`once`||e.maxRuns!=null&&Array.isArray(e.runHistory)&&e.runHistory.length>=e.maxRuns||e.endAt!=null&&t>=e.endAt):!1}function yo(e={}){return{name:e.name||``,description:e.description||``,prompt:e.prompt||``,schedule:e.schedule||null,enabled:e.enabled!==!1,contextUrl:e.contextUrl||null,contextMode:e.contextMode||`fetch`,sessionId:e.sessionId||null,model:e.model||null,agentId:e.agentId||null,useTools:e.useTools==null?null:e.useTools,temperature:e.temperature==null?null:e.temperature,topP:e.topP==null?null:e.topP,maxRuns:e.maxRuns==null?null:Number(e.maxRuns)||null,endAt:e.endAt==null?null:Number(e.endAt)||null}}e(`zh`,{sched:{missingFields:`缺少必要字段(名称、指令、定时规则)`,notFound:`定时任务不存在`,running:`运行中`,success:`成功`,failed:`失败`,userMsgPrefix:`定时任务`,invalidCron:`Cron 表达式无效`,invalidInterval:`间隔时间格式无效`,taskDisabled:`任务已停用,无法执行`,modelFallback:`原模型 {from} 在当前厂商({vendor})不可用,本次已改用 {to} 执行。`}}),e(`en`,{sched:{missingFields:`Missing required fields (name, prompt, schedule)`,notFound:`Scheduled task not found`,running:`Running`,success:`Success`,failed:`Failed`,userMsgPrefix:`Scheduled task`,invalidCron:`Invalid cron expression`,invalidInterval:`Invalid interval value`,taskDisabled:`Task is disabled`,modelFallback:`Model {from} is unavailable for the current vendor ({vendor}); this run used {to} instead.`}});var bo=`st:`,xo=new Set;function So(e){return bo+e}function Co(e){if(!e||!e.id)return;let t=So(e.id);if(!e.enabled){chrome.alarms.clear(t,()=>{});return}if(e.schedule?.type===`interval`){let n=go(e.schedule.value)||1;chrome.alarms.create(t,{delayInMinutes:n,periodInMinutes:n})}else{let n=_o(e);n&&chrome.alarms.create(t,{when:n})}}async function wo(){try{let e=await chrome.alarms.getAll(),t=new Set(e.map(e=>e.name)),n=await T(),i=new Set(n.filter(e=>e.enabled&&e.schedule).map(e=>So(e.id)));for(let e of n){let n=So(e.id);e.enabled&&!t.has(n)&&Co(e)}for(let t of e)t.name.startsWith(bo)&&!i.has(t.name)&&await chrome.alarms.clear(t.name);r.debug(`[Scheduler] rehydrated alarms, tasks=${n.length}`)}catch(e){r.warn(`[Scheduler] rehydrateAlarms failed:`,e)}}chrome.alarms?.onAlarm?.addListener?.(e=>{if(!e.name.startsWith(bo))return;let t=e.name.slice(3);Po(t).catch(e=>r.error(`[Scheduler] onAlarm runTask failed:`,t,e))});async function To(e){return e&&(ae.find(t=>t.id===e)||((await chrome.storage.local.get([`customAgents`])).customAgents||[]).find(t=>t.id===e))||null}async function Eo(e){if(e.sessionId){let t=await j(e.sessionId);if(t)return{session:t,created:!1}}return{session:await pe(e),created:!0}}async function Do(e,t){let n=new Date().toLocaleString(`zh-CN`),r=e?.systemPrompt||``;if(t&&t.length>0)try{let e=await wt(t);e?.success&&e.prompts&&(r+=`
402
403
 
403
404
  `+e.prompts)}catch{}return`你是用户的 AI 助手,正在执行一个预先设定的定时任务。请严格按照任务指令完成并直接返回结果。
404
405
  当前时间: ${n}
405
406
 
406
- ${r}`.trim()}function so(e,t=15e3){return new Promise(n=>{let r=Date.now(),i=async()=>{try{let t=await chrome.tabs.get(e);if(t&&t.status===`complete`){n(!0);return}}catch{n(!1);return}if(Date.now()-r>t){n(!1);return}setTimeout(i,300)};i()})}var co=e=>new Promise(t=>setTimeout(t,e));function lo(e){return`[网页上下文]\n标题: ${e.title||``}\nURL: ${e.url||``}\n内容:\n${e.content||``}`}function uo(e){try{let t=(document.body||document.documentElement).cloneNode(!0);t.querySelectorAll(`script,style,noscript,template,svg,canvas`).forEach(e=>e.remove());let n=(t.innerText||t.textContent||``).replace(/[ \t ]+/g,` `).replace(/\n[ \t]+/g,`
407
+ ${r}`.trim()}function Oo(e,t=15e3){return new Promise(n=>{let r=Date.now(),i=async()=>{try{let t=await chrome.tabs.get(e);if(t&&t.status===`complete`){n(!0);return}}catch{n(!1);return}if(Date.now()-r>t){n(!1);return}setTimeout(i,300)};i()})}var ko=e=>new Promise(t=>setTimeout(t,e));function Ao(e){return`[网页上下文]\n标题: ${e.title||``}\nURL: ${e.url||``}\n内容:\n${e.content||``}`}function jo(e){try{let t=(document.body||document.documentElement).cloneNode(!0);t.querySelectorAll(`script,style,noscript,template,svg,canvas`).forEach(e=>e.remove());let n=(t.innerText||t.textContent||``).replace(/[ \t ]+/g,` `).replace(/\n[ \t]+/g,`
407
408
  `).replace(/\n{3,}/g,`
408
409
 
409
- `).trim();return n.length>e&&(n=n.slice(0,e)),{success:!0,data:{title:document.title||``,url:location.href,content:n}}}catch(e){return{success:!1,error:String(e)}}}async function fo(e){for(let t=0;t<3;t++){try{let t=await chrome.tabs.sendMessage(e,{type:`GET_PAGE_TEXT`,maxLength:12e3});if(t&&t.success&&t.data)return{text:lo(t.data),title:t.data.title||``}}catch{}await co(400)}try{let t=await chrome.scripting.executeScript({target:{tabId:e},func:uo,args:[12e3]}),n=t&&t[0]&&t[0].result;if(n&&n.success&&n.data)return{text:lo(n.data),title:n.data.title||``}}catch(e){r.warn(`[Scheduler] scripting fallback failed:`,e)}return{text:``,title:``}}async function po(e){let t=null,n=null,i=``,a=``;try{let r=null;try{let t=new URL(e);r=(await chrome.tabs.query({})).find(e=>{try{let n=new URL(e.url||``);return n.origin===t.origin&&n.pathname===t.pathname}catch{return!1}})||null}catch{}if(r)t=r.id;else if(/^https?:/i.test(e)){let r=await chrome.tabs.create({url:e,active:!1});t=r.id,n=r.id,await so(t,15e3)}if(t){let e=await fo(t);i=e.text,a=e.title}i||=`[网页上下文]\nURL: ${e}\n`}catch(t){i=`[网页上下文]\nURL: ${e}\n`,r.warn(`[Scheduler] extractPageContext failed:`,t)}return{text:i,title:a,tabId:t,createdTabId:n}}async function mo(e,n=!1){if(eo.has(e))return r.debug(`[Scheduler] task already running, skip:`,e),!1;let i=await v(e);if(!i||!i.enabled&&!n)return!1;eo.add(e);let a=Date.now(),o=null,s=!1;try{i={...i,lastStatus:`running`,lastRunAt:Date.now()},await x(i),chrome.runtime.sendMessage({type:`SCHEDULED_TASK_RUN_STATE`,taskId:e,running:!0}).catch(()=>{});let{session:t,created:n}=await ao(i);n&&(i.sessionId=t.id,await x(i));let a=await io(i.agentId||t.agentId),c=await R(),l=i.model||t.model||a?.model||c.modelName,u=Ka(i.useTools,Ka(t.useTools,!0)),d=i.agentId||t.agentId||null,f=a?.toolIds??null,p=a?.skillIds??null,m=a?.mcpExcludedServerIds??null,h={temperature:Ka(i.temperature,Ka(t.temperature,c.temperature??.2)),top_p:Ka(i.topP,Ka(t.topP,c.topP??1))},g=``,_=null,v=null;if(i.contextUrl){if(i.contextMode===`url_only`)g=`[网页上下文]\nURL: ${i.contextUrl}\n`,v={url:i.contextUrl,title:``};else{let e=await po(i.contextUrl);g=e.text,_=e.tabId,o=e.createdTabId,v={url:i.contextUrl,title:e.title||``}}}let y=[{role:`system`,content:await oo(a,p)},{role:`user`,content:ho(i,g)}],b=`st_`+e+`_`+Date.now().toString(36),S,C=u?await Mi(f,d,p,null,m):[];if(C.length>0){let e=await pn(y,l,C,_,h,t.id,null,null,{value:0},[],b);S={content:e.content===void 0?e:e.content,executionLog:e.executionLog||[]}}else{let e=await yn(y,l,h,t.id,{},b),n=e.usage?[{id:`st_api_`+Date.now().toString(36),iteration:1,timestamp:new Date().toISOString(),status:`success`,nodeType:`api_call`,apiResponse:{tokenUsage:e.usage}}]:[];S={content:e.content===void 0?e:e.content,executionLog:n}}let w=typeof S.content==`string`?S.content:JSON.stringify(S.content);await go(t.id,i,w,S.executionLog,v),i={...i,lastStatus:`success`,lastError:null,lastRunAt:Date.now()},s=!0,r.debug(`[Scheduler] task completed:`,e)}catch(n){r.error(`[Scheduler] runTask failed:`,e,n),i={...await v(e)||i,lastStatus:`failed`,lastError:n?.message||String(n)};let a=n?.message||String(n);try{i.sessionId&&await P(i.sessionId,{role:`assistant`,content:t(`sched.failed`)+`: `+a})}catch{}try{chrome.notifications.create(`st_fail_`+e+`_`+Date.now(),{type:`basic`,iconUrl:chrome.runtime.getURL(`icons/icon128.png`),title:t(`sched.notifFailTitle`),message:t(`sched.notifFailMsg`,{name:i.name||``,error:a}),priority:2})}catch{}}finally{eo.delete(e);let t=Array.isArray(i.runHistory)?i.runHistory:[];if(t.push({id:`run_`+a.toString(36)+`_`+Math.random().toString(36).slice(2,6),startedAt:a,finishedAt:Date.now(),durationMs:Date.now()-a,status:i.lastStatus,error:i.lastError||null}),i.runHistory=t.slice(-50),Za(i)&&(i.enabled=!1),i.nextRunAt=i.enabled?Xa(i):null,i.updatedAt=Date.now(),await x(i),no(i),o)try{await chrome.tabs.remove(o)}catch{}i.sessionId&&chrome.runtime.sendMessage({type:`SCHEDULED_SESSION_UPDATED`,sessionId:i.sessionId,taskId:e}).catch(()=>{}),chrome.runtime.sendMessage({type:`SCHEDULED_TASK_RUN_STATE`,taskId:e,running:!1}).catch(()=>{})}return s}function ho(e,n){let r=`[${t(`sched.userMsgPrefix`)}: ${e.name||``}]\n${e.prompt||``}`;return n&&(r+=`
410
+ `).trim();return n.length>e&&(n=n.slice(0,e)),{success:!0,data:{title:document.title||``,url:location.href,content:n}}}catch(e){return{success:!1,error:String(e)}}}async function Mo(e){for(let t=0;t<3;t++){try{let t=await chrome.tabs.sendMessage(e,{type:`GET_PAGE_TEXT`,maxLength:12e3});if(t&&t.success&&t.data)return{text:Ao(t.data),title:t.data.title||``}}catch{}await ko(400)}try{let t=await chrome.scripting.executeScript({target:{tabId:e},func:jo,args:[12e3]}),n=t&&t[0]&&t[0].result;if(n&&n.success&&n.data)return{text:Ao(n.data),title:n.data.title||``}}catch(e){r.warn(`[Scheduler] scripting fallback failed:`,e)}return{text:``,title:``}}async function No(e){let t=null,n=null,i=``,a=``;try{let r=null;try{let t=new URL(e);r=(await chrome.tabs.query({})).find(e=>{try{let n=new URL(e.url||``);return n.origin===t.origin&&n.pathname===t.pathname}catch{return!1}})||null}catch{}if(r)t=r.id;else if(/^https?:/i.test(e)){let r=await chrome.tabs.create({url:e,active:!1});t=r.id,n=r.id,await Oo(t,15e3)}if(t){let e=await Mo(t);i=e.text,a=e.title}i||=`[网页上下文]\nURL: ${e}\n`}catch(t){i=`[网页上下文]\nURL: ${e}\n`,r.warn(`[Scheduler] extractPageContext failed:`,t)}return{text:i,title:a,tabId:t,createdTabId:n}}async function Po(e,n=!1){if(xo.has(e))return r.debug(`[Scheduler] task already running, skip:`,e),!1;let i=await b(e);if(!i||!i.enabled&&!n)return!1;xo.add(e);let a=Date.now(),o=null,s=!1,c=``;try{i={...i,lastStatus:`running`,lastRunAt:Date.now()},await C(i),chrome.runtime.sendMessage({type:`SCHEDULED_TASK_RUN_STATE`,taskId:e,running:!0}).catch(()=>{});let{session:n,created:a}=await Eo(i);a&&(i.sessionId=n.id,await C(i));let l=await To(i.agentId||n.agentId),u=await B(),d=i.model||n.model||l?.model||u.modelName;if(d!==u.modelName)try{let e=await g();e&&!p(d,e)&&(r.warn(`[Scheduler] model "${d}" not in active profile "${e.name}", fallback to "${u.modelName}"`),c=t(`sched.modelFallback`,{from:d,to:u.modelName,vendor:e.name}),d=u.modelName)}catch{}let f=po(i.useTools,po(n.useTools,!0)),m=i.agentId||n.agentId||null,h=l?.toolIds??null,_=l?.skillIds??null,v=l?.mcpExcludedServerIds??null,y={temperature:po(i.temperature,po(n.temperature,u.temperature??.2)),top_p:po(i.topP,po(n.topP,u.topP??1))},b=``,x=null,S=null;if(i.contextUrl){if(i.contextMode===`url_only`)b=`[网页上下文]\nURL: ${i.contextUrl}\n`,S={url:i.contextUrl,title:``};else{let e=await No(i.contextUrl);b=e.text,x=e.tabId,o=e.createdTabId,S={url:i.contextUrl,title:e.title||``}}}let w=[{role:`system`,content:await Do(l,_)},{role:`user`,content:Fo(i,b)}],T=`st_`+e+`_`+Date.now().toString(36),E,D=f?await Qi(h,m,_,null,v):[];if(D.length>0){let e=await Nn(w,d,D,x,y,n.id,null,null,{value:0},[],T);E={content:e.content===void 0?e:e.content,executionLog:e.executionLog||[]}}else{let e=await zn(w,d,y,n.id,{},T),t=e.usage?[{id:`st_api_`+Date.now().toString(36),iteration:1,timestamp:new Date().toISOString(),status:`success`,nodeType:`api_call`,apiResponse:{tokenUsage:e.usage}}]:[];E={content:e.content===void 0?e:e.content,executionLog:t}}let ee=typeof E.content==`string`?E.content:JSON.stringify(E.content),O=c?c+`
410
411
 
411
- `+n),r}async function go(e,t,n,r,i){let a=new Date().toISOString(),o={role:`user`,content:ho(t,``),timestamp:a};i&&i.url&&(o.contextBubbles=[{type:`page`,title:i.title||i.url,url:i.url}]),await P(e,o),await P(e,{role:`assistant`,content:n,executionLog:r||[],timestamp:a})}function _o(e,n){let{type:i}=e;return i===`SCHEDULED_TASK_LIST`?((async()=>{try{n({success:!0,tasks:(await C()).sort((e,t)=>(e.createdAt||0)-(t.createdAt||0))})}catch(e){n({success:!1,error:e.message})}})(),!0):i===`SCHEDULED_TASK_CREATE`||i===`SCHEDULED_TASK_UPDATE`?((async()=>{try{let r=Qa(e.task||{});if(!r.name||!r.prompt||!r.schedule||![`once`,`interval`,`cron`].includes(r.schedule.type)){n({success:!1,error:t(`sched.missingFields`)});return}let a=r.schedule;if(a.type===`cron`&&!Ja(a.value)){n({success:!1,error:t(`sched.invalidCron`)});return}if(a.type===`interval`&&!Ya(a.value)){n({success:!1,error:t(`sched.invalidInterval`)});return}if(a.type===`once`&&a.onceMode===`relative`&&!Ya(a.value)){n({success:!1,error:t(`sched.invalidInterval`)});return}let o=Date.now(),s;if(i===`SCHEDULED_TASK_CREATE`)s={id:`st_`+Date.now().toString(36)+`_`+Math.random().toString(36).slice(2,6),...r,lastRunAt:null,nextRunAt:null,lastStatus:null,lastError:null,createdAt:o,updatedAt:o};else{let i=await v(e.task.id);if(!i){n({success:!1,error:t(`sched.notFound`)});return}s={...i,...r,id:i.id,updatedAt:o}}s.nextRunAt=s.enabled?Xa(s):null,await x(s),no(s),n({success:!0,task:s})}catch(e){n({success:!1,error:e.message})}})(),!0):i===`SCHEDULED_TASK_DELETE`?((async()=>{try{await _(e.id),chrome.alarms.clear(to(e.id),()=>{}),n({success:!0})}catch(e){n({success:!1,error:e.message})}})(),!0):i===`SCHEDULED_TASK_TOGGLE`?((async()=>{try{let r=await v(e.id);if(!r){n({success:!1,error:t(`sched.notFound`)});return}r.enabled=!!e.enabled,r.nextRunAt=r.enabled?Xa(r):null,r.updatedAt=Date.now(),await x(r),no(r),n({success:!0,task:r})}catch(e){n({success:!1,error:e.message})}})(),!0):i===`SCHEDULED_TASK_RUN_NOW`&&((async()=>{try{let i=await v(e.id);if(!i){n({success:!1,error:t(`sched.notFound`)});return}let a=i.sessionId||null;try{let{session:e,created:t}=await ao(i);a=e.id,t&&(i.sessionId=e.id,await x(i))}catch{}mo(e.id,!0).catch(t=>r.error(`[Scheduler] run now failed:`,e.id,t)),n({success:!0,sessionId:a})}catch(e){n({success:!1,error:e.message})}})(),!0)}var vo=`_detachWindowId`;async function yo(){let e;try{e=await chrome.storage.local.get(vo)}catch{return null}let t=e?.[vo]||null;if(!t)return null;try{return await chrome.windows.get(t),t}catch{return chrome.storage.local.remove(vo).catch(()=>{}),null}}var bo=4e3;function xo(e){if(e==null)return``;let t=typeof e==`string`?e:JSON.stringify(e)??``;return t.length<=4e3?t:t.substring(0,bo)+`…[已截断]`}function So(e){let t=(e||[]).map(e=>`[${e.role===`user`?`User`:e.role===`assistant`?`Assistant`:e.role||`Unknown`}]\n${xo(e.content)}`),n=0,r=[];for(let e=t.length-1;e>=0&&(n+=t[e].length,!(n>8e4&&r.length>0));e--)r.unshift(t[e]);return`你是一个对话上下文压缩助手。下面是用户与 AI 助手之前的对话内容,请将其压缩为一份结构化中文摘要,供后续对话继续使用。
412
+ `+ee:ee;await Io(n.id,i,O,E.executionLog,S),on({success:!0,sessionId:i.sessionId,name:i.name,source:`scheduled`}).catch(()=>{}),i={...i,lastStatus:`success`,lastError:null,lastRunAt:Date.now()},s=!0,r.debug(`[Scheduler] task completed:`,e)}catch(n){r.error(`[Scheduler] runTask failed:`,e,n),i={...await b(e)||i,lastStatus:`failed`,lastError:n?.message||String(n)};let a=n?.message||String(n);try{if(i.sessionId){let e=t(`sched.failed`)+`: `+a+(c?`
413
+
414
+ `+c:``);await F(i.sessionId,{role:`assistant`,content:e})}}catch{}on({success:!1,sessionId:i.sessionId,name:i.name,error:a,source:`scheduled`}).catch(()=>{})}finally{xo.delete(e);let t=Array.isArray(i.runHistory)?i.runHistory:[];if(t.push({id:`run_`+a.toString(36)+`_`+Math.random().toString(36).slice(2,6),startedAt:a,finishedAt:Date.now(),durationMs:Date.now()-a,status:i.lastStatus,error:i.lastError||null}),i.runHistory=t.slice(-50),vo(i)&&(i.enabled=!1),i.nextRunAt=i.enabled?_o(i):null,i.updatedAt=Date.now(),await C(i),Co(i),o)try{await chrome.tabs.remove(o)}catch{}i.sessionId&&chrome.runtime.sendMessage({type:`SCHEDULED_SESSION_UPDATED`,sessionId:i.sessionId,taskId:e}).catch(()=>{}),chrome.runtime.sendMessage({type:`SCHEDULED_TASK_RUN_STATE`,taskId:e,running:!1}).catch(()=>{})}return s}function Fo(e,n){let r=`[${t(`sched.userMsgPrefix`)}: ${e.name||``}]\n${e.prompt||``}`;return n&&(r+=`
415
+
416
+ `+n),r}async function Io(e,t,n,r,i){let a=new Date().toISOString(),o={role:`user`,content:Fo(t,``),timestamp:a};i&&i.url&&(o.contextBubbles=[{type:`page`,title:i.title||i.url,url:i.url}]),await F(e,o),await F(e,{role:`assistant`,content:n,executionLog:r||[],timestamp:a})}function Lo(e,n){let{type:i}=e;return i===`SCHEDULED_TASK_LIST`?((async()=>{try{n({success:!0,tasks:(await T()).sort((e,t)=>(e.createdAt||0)-(t.createdAt||0))})}catch(e){n({success:!1,error:e.message})}})(),!0):i===`SCHEDULED_TASK_CREATE`||i===`SCHEDULED_TASK_UPDATE`?((async()=>{try{let r=yo(e.task||{});if(!r.name||!r.prompt||!r.schedule||![`once`,`interval`,`cron`].includes(r.schedule.type)){n({success:!1,error:t(`sched.missingFields`)});return}let a=r.schedule;if(a.type===`cron`&&!ho(a.value)){n({success:!1,error:t(`sched.invalidCron`)});return}if(a.type===`interval`&&!go(a.value)){n({success:!1,error:t(`sched.invalidInterval`)});return}if(a.type===`once`&&a.onceMode===`relative`&&!go(a.value)){n({success:!1,error:t(`sched.invalidInterval`)});return}let o=Date.now(),s;if(i===`SCHEDULED_TASK_CREATE`)s={id:`st_`+Date.now().toString(36)+`_`+Math.random().toString(36).slice(2,6),...r,lastRunAt:null,nextRunAt:null,lastStatus:null,lastError:null,createdAt:o,updatedAt:o};else{let i=await b(e.task.id);if(!i){n({success:!1,error:t(`sched.notFound`)});return}s={...i,...r,id:i.id,updatedAt:o}}s.nextRunAt=s.enabled?_o(s):null,await C(s),Co(s),n({success:!0,task:s})}catch(e){n({success:!1,error:e.message})}})(),!0):i===`SCHEDULED_TASK_DELETE`?((async()=>{try{await y(e.id),chrome.alarms.clear(So(e.id),()=>{}),n({success:!0})}catch(e){n({success:!1,error:e.message})}})(),!0):i===`SCHEDULED_TASK_TOGGLE`?((async()=>{try{let r=await b(e.id);if(!r){n({success:!1,error:t(`sched.notFound`)});return}r.enabled=!!e.enabled,r.nextRunAt=r.enabled?_o(r):null,r.updatedAt=Date.now(),await C(r),Co(r),n({success:!0,task:r})}catch(e){n({success:!1,error:e.message})}})(),!0):i===`SCHEDULED_TASK_RUN_NOW`&&((async()=>{try{let i=await b(e.id);if(!i){n({success:!1,error:t(`sched.notFound`)});return}let a=i.sessionId||null;try{let{session:e,created:t}=await Eo(i);a=e.id,t&&(i.sessionId=e.id,await C(i))}catch{}Po(e.id,!0).catch(t=>r.error(`[Scheduler] run now failed:`,e.id,t)),n({success:!0,sessionId:a})}catch(e){n({success:!1,error:e.message})}})(),!0)}var Ro=`_detachWindowId`;async function zo(){let e;try{e=await chrome.storage.local.get(Ro)}catch{return null}let t=e?.[Ro]||null;if(!t)return null;try{return await chrome.windows.get(t),t}catch{return chrome.storage.local.remove(Ro).catch(()=>{}),null}}var Bo=null,Vo=null,Ho=null,Uo=null;function Wo(e={}){typeof e.isBrowserFocused==`function`&&(Bo=e.isBrowserFocused),typeof e.getFocusedWindowId==`function`&&(Vo=e.getFocusedWindowId),typeof e.getActiveTabId==`function`&&(Ho=e.getActiveTabId),typeof e.getScope==`function`&&(Uo=e.getScope)}function Go(e,t=null){if(!Bo||!Vo||!Ho||!Uo)return!1;let n=t&&typeof t==`object`?t:e?Le(e):null;if(!n||n.windowId==null||!Bo()||n.windowId!==Vo()||n.panelHidden===!0)return!1;if((n.scope===`global`||n.scope===`tab-specific`?n.scope:Uo())===`global`)return!0;let r=n.hostTabId;return r!=null&&r===Ho(n.windowId)}var Ko=4e3;function qo(e){if(e==null)return``;let t=typeof e==`string`?e:JSON.stringify(e)??``;return t.length<=4e3?t:t.substring(0,Ko)+`…[已截断]`}function Jo(e){let t=(e||[]).map(e=>`[${e.role===`user`?`User`:e.role===`assistant`?`Assistant`:e.role||`Unknown`}]\n${qo(e.content)}`),n=0,r=[];for(let e=t.length-1;e>=0&&(n+=t[e].length,!(n>8e4&&r.length>0));e--)r.unshift(t[e]);return`你是一个对话上下文压缩助手。下面是用户与 AI 助手之前的对话内容,请将其压缩为一份结构化中文摘要,供后续对话继续使用。
412
417
 
413
418
  要求:
414
419
  1. 保留:用户的当前任务目标与最新诉求、已达成的关键结论与决策、重要的文件路径/代码/数据/实体名称、未完成事项与下一步。
@@ -419,5 +424,5 @@ ${r}`.trim()}function so(e,t=15e3){return new Promise(n=>{let r=Date.now(),i=asy
419
424
  对话内容:
420
425
  ${r.join(`
421
426
 
422
- `)}`}var Co=2048,wo=6e4;async function To({material:e,model:t,sessionId:n}={}){if(!Array.isArray(e)||e.length===0)return{success:!1,error:`material_empty`};let i=await R();if(!i?.apiBase||!i?.apiKey)return{success:!1,error:`config_missing`};let a=So(e),o=`${i.apiBase}/chat/completions`,s=t||i.modelName;try{let e=await aa(o,{method:`POST`,headers:{Authorization:`Bearer ${i.apiKey}`,"Content-Type":`application/json`},body:JSON.stringify({model:s,messages:[{role:`user`,content:a}],stream:!1,max_tokens:Co,temperature:.2})},wo,1,1e3);if(!e.ok)return r.warn(`[ContextCompactor] request failed: ${e.status}`),{success:!1,error:`http_${e.status}`};let t=await e.json(),c=(t.choices?.[0]?.message?.content||``).trim();return c?(Vt({sessionId:n,model:s,usage:t.usage,callType:`context_compaction`}).catch(()=>{}),r.debug(`[ContextCompactor] summary done, ${c.length} chars`),{success:!0,summary:c}):{success:!1,error:`empty_summary`}}catch(e){return r.warn(`[ContextCompactor] exception:`,e.message),{success:!1,error:e.message||`request_failed`}}}e(`zh`,{bg:{missingSessionId:`缺少 sessionId`,resumingFromCheckpoint:`从 checkpoint 恢复中...`,checkpointNotFound:`未找到可恢复的任务 checkpoint,可能已过期或被清理。请检查 Service Worker 控制台中的诊断日志(搜索 "checkpoint" 关键字)。`,resumeFailed:`恢复失败`,missingSkillName:`缺少技能名称`,fetchFailed:`获取失败`,preparing:`准备中...`,toolPreselect:`工具预筛选`,requestCancelled:`请求已被用户取消`,reactCancelled:`ReAct 循环已被用户取消`,apiCallFailed:`API 调用失败`}}),e(`en`,{bg:{missingSessionId:`Missing sessionId`,resumingFromCheckpoint:`Resuming from checkpoint...`,checkpointNotFound:`No checkpoint found for resumption. It may have expired or been cleaned. Check Service Worker console logs (search "checkpoint").`,resumeFailed:`Resume failed`,missingSkillName:`Missing skill name`,fetchFailed:`Fetch failed`,preparing:`Preparing...`,toolPreselect:`Tool Pre-filter`,requestCancelled:`Request was cancelled by user`,reactCancelled:`ReAct loop was cancelled by user`}}),n(),ro(),Promise.all([y().then(()=>b()),Ve()]).then(([e,t])=>{r.debug(`[Background] DB self-check passed,current has ${e.length} checkpoint`+(t?`,completedoldformat Agent migrate`:``))}).catch(e=>{r.warn(`[Background] cleanup expired checkpoint or DB self-check failed:`,e)});var Eo=1e3,Y=null,Do=null,X=null;yo().then(e=>{X=e}),chrome.runtime?.onConnect?.addListener?.(async e=>{if(e.name?.startsWith(`keepalive-`)){let t=e.name.replace(`keepalive-`,``),n=Ne(t);if(je(t,e),r.debug(`[Background] keepalive portconnected, sessionId:`,t,n?`(reconnect)`:`(first times)`),n&&!tn.has(t)){r.warn(`[Background] ⚠️ detected SW re started,sessionId`,t,` API call lost`);let n=null;try{let e=await F(t);e&&(n={iteration:e.iteration,interruptedReason:e.interruptedReason,updatedAt:e.updatedAt,messageCount:e.currentMessages?.length||0,subtaskPlan:e.subtaskPlan?{subtaskCount:e.subtaskPlan.subtasks?.length||0}:null},r.debug(`[Background] detected recoverable checkpoint:`,n))}catch(e){r.warn(`[Background] read checkpoint failed:`,e.message)}try{e.postMessage({type:`SW_RESTARTED`,sessionId:t,checkpoint:n})}catch(e){r.warn(`[Background] send SW_RESTARTED message failed:`,e.message)}}e.onDisconnect.addListener(()=>{Pe(t,e),r.debug(`[Background] keepalive port disconnected, sessionId:`,t)})}}),chrome.sidePanel?.setPanelBehavior?.({openPanelOnActionClick:!1}).catch(()=>{});var Z=`global`,Q=new Map,Oo=!!chrome.sidePanel?.onOpened,ko=!1,Ao=(async()=>{try{let e=await chrome.runtime.getContexts({contextTypes:[`SIDE_PANEL`]});return ko=e.length>0,e}catch{return[]}})();chrome.sidePanel?.onOpened?.addListener(e=>{e?.windowId!=null&&(r.debug(`[Background] sidePanel onOpened:`,JSON.stringify(e)),Q.set(e.windowId,e.tabId??null))}),chrome.sidePanel?.onClosed?.addListener(e=>{if(e?.windowId==null)return;r.debug(`[Background] sidePanel onClosed:`,JSON.stringify(e));let t=Q.get(e.windowId);Q.delete(e.windowId);let n=e.tabId??(typeof t==`number`?t:null);n!=null&&Ho(n)}),chrome.sidePanel?.setOptions?.({path:`side_panel.html`,enabled:!0}).catch(()=>{}),(async()=>{try{Z=jo((await chrome.storage.local.get([`sidePanelScope`])).sidePanelScope),Mo()}catch{}})();function jo(e){return e===`tab-specific`?`tab-specific`:`global`}function Mo(){Z===`tab-specific`?chrome.sidePanel?.setOptions?.({enabled:!1}).catch(()=>{}):(chrome.sidePanel?.setOptions?.({path:`side_panel.html`,enabled:!0}).catch(()=>{}),zo?.then(()=>Uo()).catch(()=>{}))}function No(e,{group:t=!0}={}){t&&Z===`tab-specific`&&Vo(e),Z===`tab-specific`&&chrome.sidePanel?.setOptions?.({tabId:e,path:`side_panel.html`,enabled:!0}).catch(()=>{})}var $=new Map,Po=`_aiHelperGroupByWindow`,Fo=`AI Helper`;async function Io(){try{return(await chrome.storage.local.get(`autoGroupTabs`))?.autoGroupTabs!==!1}catch{return!0}}async function Lo(){if(chrome.tabGroups)try{let e=(await chrome.storage.session.get(Po))[Po];if(Array.isArray(e))for(let[t,n]of e)try{await chrome.tabGroups.get(n),$.set(t,n)}catch{}}catch{}}function Ro(){chrome.storage.session?.set({[Po]:Array.from($.entries())}).catch(()=>{})}var zo=Lo();async function Bo(e){if(!(!chrome.tabGroups||!e?.id||e.windowId==null)&&!e.pinned&&await Io()){await zo;try{let t=$.get(e.windowId);if(t!=null)try{await chrome.tabGroups.get(t)}catch{t=null,$.delete(e.windowId),Ro()}if(t==null){try{let n=await chrome.tabGroups.query({windowId:e.windowId,title:Fo});n.length>0&&(t=n[0].id)}catch{}if(t==null){t=await chrome.tabs.group({tabIds:[e.id]});try{await chrome.tabGroups.update(t,{title:Fo,color:`blue`,collapsed:!1})}catch{}}else if(e.groupId!==t)try{await chrome.tabs.group({groupId:t,tabIds:[e.id]})}catch{}$.set(e.windowId,t),Ro()}else if(e.groupId!==t)try{await chrome.tabs.group({groupId:t,tabIds:[e.id]})}catch{}}catch(e){r.debug(`[Background] ensureAiHelperGroup failed:`,e?.message)}}}function Vo(e){!chrome.tabGroups||e==null||chrome.tabs.get(e).then(e=>Bo(e)).catch(()=>{})}async function Ho(e){if(!(Z!==`tab-specific`||!chrome.tabGroups||!chrome.tabs?.ungroup))try{let t=await chrome.tabs.get(e),[n]=await chrome.tabs.query({active:!0,windowId:t.windowId});if(n?.id!==t.id)return;let i=$.get(t.windowId);if(i==null||t.groupId!==i)return;await chrome.tabs.ungroup([t.id]),r.debug(`[Background] tab unbound from AI Helper group:`,t.id)}catch(e){r.debug(`[Background] unbindTabFromAiHelperGroup failed:`,e?.message)}}async function Uo(){if(!chrome.tabGroups||!chrome.tabs?.ungroup)return;let e=[...new Set($.values())];if(e.length!==0){$.clear(),Ro();for(let t of e)try{let e=await chrome.tabs.query({groupId:t});e.length>0&&await chrome.tabs.ungroup(e.map(e=>e.id))}catch{}r.debug(`[Background] AI Helper groups dissolved (scope switched to global)`)}}chrome.storage?.onChanged?.addListener?.((e,t)=>{if(t===`local`&&e.sidePanelScope){let t=jo(e.sidePanelScope.newValue);if(t!==Z){if(Z=t,t===`tab-specific`){chrome.runtime.getContexts({contextTypes:[`SIDE_PANEL`]}).then(e=>{e.length>0?chrome.tabs.query({active:!0,currentWindow:!0},e=>{e[0]?.id&&No(e[0].id,{group:!1}),Mo()}):Mo()}).catch(()=>{Mo()});return}Mo(),r.debug(`[Background] sidePanel scope changed to:`,t)}}}),chrome.action?.onClicked?.addListener?.(e=>{if(X){try{chrome.windows.update(X,{focused:!0}).catch(()=>{X=null,chrome.storage.local.remove(`_detachWindowId`).catch(()=>{}),No(e.id),chrome.sidePanel?.open?.({tabId:e.id}).catch(()=>{})})}catch{X=null,chrome.storage.local.remove(`_detachWindowId`).catch(()=>{}),No(e.id),chrome.sidePanel?.open?.({tabId:e.id}).catch(()=>{})}return}No(e.id),chrome.sidePanel?.open?.({tabId:e.id}).catch(e=>{r.warn(`[Background] open sidePanel failed:`,e?.message)})}),chrome.windows?.onRemoved?.addListener?.(e=>{X===e&&(X=null,chrome.storage.local.remove(`_detachWindowId`).catch(()=>{}),r.debug(`[Background] detached window closed, cleaned up windowId:`,e)),$.has(e)&&($.delete(e),Ro())}),chrome.tabs?.onUpdated?.addListener?.((e,t,n)=>{t.status===`complete`&&n.url?.startsWith(`http`)&&Z===`global`&&chrome.sidePanel?.setOptions?.({path:`side_panel.html`,enabled:!0})}),chrome.tabGroups?.onRemoved?.addListener?.(e=>{for(let[t,n]of $)if(n===e.id){$.delete(t),Ro();break}});var Wo=`_toggle_sidepanel`,Go=new Map,Ko=null;chrome.tabs?.onActivated?.addListener?.(({tabId:e,windowId:t})=>{Go.set(t,e),Ko=t}),chrome.tabs?.onRemoved?.addListener?.((e,{windowId:t})=>{Go.get(t)===e&&Go.delete(t)}),chrome.windows?.onFocusChanged?.addListener?.(e=>{e!==chrome.windows.WINDOW_ID_NONE&&(Ko=e)}),(async()=>{try{let[e]=await chrome.tabs.query({active:!0,lastFocusedWindow:!0});if(!e?.id)return;Go.set(e.windowId,e.id),Ko??=e.windowId}catch{}})(),chrome.commands?.getAll?.().then(e=>{let t=e.find(e=>e.name===Wo);t&&(t.shortcut?r.debug(`[Background] sidePanel shortcut:`,t.shortcut):r.warn(`[Background] sidePanel shortcut is not bound, set it at chrome://extensions/shortcuts`))}).catch(()=>{});function qo(){return Ko==null?null:Go.get(Ko)??null}function Jo(e){let t=Q.get(e.windowId);return t===void 0?!Oo&&ko:t===null||t===e.id}function Yo(e,t=null){let n=e=>{r.warn(`[Background] close sidePanel failed, fallback to panel self-close:`,e),chrome.runtime.sendMessage({type:`CLOSE_SIDEPANEL`}).catch(()=>{})};if(!chrome.sidePanel?.close){chrome.runtime.sendMessage({type:`CLOSE_SIDEPANEL`}).catch(e=>{r.warn(`[Background] send CLOSE_SIDEPANEL failed:`,e?.message)});return}let i=typeof t==`number`?{tabId:t}:{windowId:e};chrome.sidePanel.close(i).then(()=>{Q.delete(e)}).catch(r=>{if(typeof t!=`number`)return n(r?.message);chrome.sidePanel.close({windowId:e}).then(()=>{Q.delete(e)}).catch(e=>n(e?.message))})}function Xo(){setTimeout(()=>{chrome.runtime.getContexts({contextTypes:[`SIDE_PANEL`]}).then(e=>{e.length===0&&Q.clear()}).catch(()=>{})},300)}function Zo(e){let t=Z===`global`;if(Jo(e)){r.debug(`[Background] command: close sidePanel on tab`,e.id,e.windowId);let n=Q.get(e.windowId);Yo(e.windowId,t||n===null?null:e.id);return}r.debug(`[Background] command: open sidePanel on tab`,e.id,e.windowId),No(e.id);let n=t?{windowId:e.windowId}:{tabId:e.id};chrome.sidePanel?.open?.(n).then(()=>{Q.set(e.windowId,t?null:e.id)}).catch(e=>{r.warn(`[Background] open sidePanel failed:`,e?.message)})}function Qo(){if(Z===`global`){r.debug(`[Background] command: cold start, open sidePanel on current window`),chrome.sidePanel?.open?.({windowId:chrome.windows.WINDOW_ID_CURRENT}).catch(e=>{r.warn(`[Background] open sidePanel failed:`,e?.message)}),Ao.then(e=>{let t=e?.length>0;chrome.tabs.query({active:!0,lastFocusedWindow:!0}).then(([e])=>{if(e?.id){if(Go.set(e.windowId,e.id),Ko??=e.windowId,t){Yo(e.windowId,null);return}Q.set(e.windowId,null)}}).catch(()=>{})}).catch(()=>{});return}chrome.tabs.query({active:!0,lastFocusedWindow:!0},e=>{let t=e[0];t?.id&&(Go.set(t.windowId,t.id),Ko=t.windowId,Zo(t))})}chrome.commands?.onCommand?.addListener(e=>{if(e===Wo)try{if(X){try{chrome.windows.update(X,{focused:!0}).catch(()=>{X=null,chrome.storage.local.remove(`_detachWindowId`).catch(()=>{})})}catch{X=null,chrome.storage.local.remove(`_detachWindowId`).catch(()=>{})}return}let e=qo();r.debug(`[Background] toggle: scope=%s focusedWindow=%s tab=%s panels=%s events=%s close=%s`,Z,Ko,e,JSON.stringify([...Q]),Oo,!!chrome.sidePanel?.close),e==null?Qo():Zo({id:e,windowId:Ko}),Xo()}catch(e){r.warn(`[Background] toggle sidePanel exception:`,e?.message)}}),chrome.runtime?.onMessage?.addListener?.((e,n,i)=>{if(e.type===`IFRAME_SELECTION`){let t=n.tab?.id;return t&&chrome.tabs.sendMessage(t,{type:`IFRAME_SELECTION`,text:e.text,x:e.x,y:e.y},{frameId:0}).catch(()=>{}),!1}if(e.type===`IFRAME_CLICK_DISMISS`){let e=n.tab?.id;return e&&chrome.tabs.sendMessage(e,{type:`IFRAME_CLICK_DISMISS`}).catch(()=>{}),!1}if(e.type===`IFRAME_SELECTION_CLEAR`){let e=n.tab?.id;return e&&chrome.tabs.sendMessage(e,{type:`IFRAME_SELECTION_CLEAR`}).catch(()=>{}),!1}if(e.type===`CANCEL_REACT`){let{tabId:t,sessionId:n}=e;return n?(Ce(n),Ua(n)):Ce(t),!1}if(e.type===`COMPACT_CONTEXT_SUMMARY`){let{material:t,model:n,sessionId:a}=e;return To({material:t,model:n,sessionId:a}).then(e=>{i(e)}).catch(e=>{r.warn(`[Background] COMPACT_CONTEXT_SUMMARY failed:`,e),i({success:!1,error:e?.message||`unknown`})}),!0}if(e.type===`GET_CHECKPOINT`){let{sessionId:t}=e;return t?(F(t).then(e=>{if(!e){i({exists:!1});return}i({exists:!0,checkpoint:{iteration:e.iteration,interruptedReason:e.interruptedReason,updatedAt:e.updatedAt,messageCount:e.currentMessages?.length||0,subtaskPlan:e.subtaskPlan?{subtaskCount:e.subtaskPlan.subtasks?.length||0}:null}})}).catch(e=>{r.warn(`[Background] GET_CHECKPOINT query failed:`,e),i({exists:!1})}),!0):(i({exists:!1}),!1)}if(e.type===`DELETE_CHECKPOINT`){let{sessionId:t}=e;return t?N(t).then(e=>{i({success:e})}).catch(e=>{r.warn(`[Background] DELETE_CHECKPOINT failed:`,e),i({success:!1})}):i({success:!1}),!0}if(e.type===`RESUME_REACT`){let{sessionId:n,callId:a,userGuidance:o=``}=e;if(!n)return i({error:t(`bg.missingSessionId`)}),!1;r.debug(`[Background] recei to RESUME_REACT,sessionId:`,n,`userGuidance:`,o?`"${o.substring(0,50)}..."`:`( no )`);let s=tn.has(n),c=()=>{be(n);let e={type:`EXECUTION_STATUS_UPDATE`,nodeName:t(`bg.resumingFromCheckpoint`),status:`processing`,executionLog:[],sessionId:n};a&&(e.callId=a),chrome.runtime.sendMessage(e).catch(()=>{}),fn(n,o,a).then(e=>{if(!e){r.warn(`[Background] RESUME_REACT: not found checkpoint or restore failed`),F(n).then(e=>{r.warn(`[Background] RESUME_REACT: re-query checkpoint result:`,e?`exists`:`not found`)}).catch(()=>{}),chrome.runtime.sendMessage({type:`API_ERROR`,sessionId:n,callId:a,error:t(`bg.checkpointNotFound`),executionLog:[],resumed:!0}).catch(()=>{});return}r.debug(`[Background] RESUME_REACT complete,content length:`,e.content?.length);let i=(e.executionLog||[]).length>Eo?e.executionLog.slice(-1e3):e.executionLog||[];chrome.runtime.sendMessage({type:`API_COMPLETE`,sessionId:n,callId:a,content:e.content||``,executionLog:i,reflectionScore:e.reflectionScore,reasoningContent:e.reasoningContent||null,wasRevised:e.wasRevised||!1,resumed:!0}).catch(e=>{r.warn(`[Background] send RESUME completemessage failed:`,e)})}).catch(e=>{let i=e.name===`AbortError`||e.message===t(`bg.requestCancelled`)||e.message===t(`bg.reactCancelled`);r.debug(`[Background] RESUME_REACT failed:`,i?`(usercancel)`:e.message);let o=e.executionLog||[],s=o.length>Eo?o.slice(-1e3):o;chrome.runtime.sendMessage({type:`API_ERROR`,sessionId:n,callId:a,error:e.message||t(`bg.resumeFailed`),executionLog:s,resumed:!0}).catch(()=>{})})};return s?(r.debug(`[Background] RESUME_REACT: detectedoldtaskstill running , first cancel`),Ce(n),Ua(n),setTimeout(c,300)):c(),!1}if(e.type===`TERMINATE_COMMAND`){let{sessionId:t,mode:n}=e;return t&&Ua(t,n||`kill`),!1}if(e.type===`ABORT_CURRENT_TOOL`){let{sessionId:t}=e;return i({success:Ie(t)}),!1}if(e.type===`RELOAD_MCP_TOOLS`)return Y=null,ri().then(e=>{i({success:!0,count:e})}).catch(e=>{i({success:!1,error:e.message})}),!0;if(e.type===`RELOAD_RAG_TOOLS`)return xi().then(e=>{i({success:!0,count:e})}).catch(e=>{i({success:!1,error:e.message})}),!0;if(e.type===`RAG_LIST_COLLECTIONS`)return lt().then(e=>{e&&e.success?i({success:!0,collections:e.collections||[]}):i({success:!1,error:e&&e.error||`rag unavailable`})}).catch(e=>{i({success:!1,error:e.message})}),!0;if(e.type===`RAG_SEARCH`)return ut(e.params||{}).then(e=>{e&&e.success?i({success:!0,results:e.results||[],hasContext:!!e.hasContext}):i({success:!1,error:e&&e.error||`rag unavailable`})}).catch(e=>{i({success:!1,error:e.message})}),!0;if(e.type===`GET_MCP_TOOLS`){xi().catch(()=>{});let e=Date.now();return Y&&e-Y.loadedAt<3e4?(r.debug(`[Background] GET_MCP_TOOLS usingcache (${Y.tools.length} tool,${Math.round((e-Y.loadedAt)/1e3)}s before )`),i({success:!0,tools:Y.tools}),!0):(ri().then(e=>{let t=f.filter(e=>e.id.startsWith(`mcp_`)).map(e=>{let t=oi(e.id);return{id:e.id,name:t?.toolName||e.function?.name||e.id,description:e.function?.description||``,category:e.category||`mcp`,execution:e.execution||`background`,parallelizable:e.parallelizable!==!1,requiresConfirmation:e.requiresConfirmation||!1,enabled:!0,serverId:t?.serverId||``,serverName:t?.serverName||``}});Y={tools:t,loadedAt:Date.now()},r.debug(`[Background] GET_MCP_TOOLS return ${t.length} tool ( reloads ${e} )`),i({success:!0,tools:t})}).catch(e=>{i({success:!1,error:e.message})}),!0)}if(e.type===`GET_AGENT_SKILL_PROMPTS`){let t=Date.now(),n=e.skillNames||null;return!n&&Do&&t-Do.loadedAt<6e4?(i({success:!0,prompts:Do.prompts}),!0):((n&&n.length>0?yt(n):vt()).then(e=>{let t=e.success&&e.prompts||``;n||(Do={prompts:t,loadedAt:Date.now()}),i({success:!0,prompts:t})}).catch(e=>{i({success:!1,error:e.message})}),!0)}if(e.type===`GET_AGENT_SKILL_PROMPT`){let n=e.name;return n?(bt(n).then(e=>{i(e)}).catch(e=>{i({success:!1,error:e.message})}),!0):(i({success:!1,error:t(`bg.missingSkillName`)}),!0)}if(e.type===`GET_SKILL_LIST`)return ft().then(e=>{e?.success?i({success:!0,skills:e.skills||[]}):i({success:!1,skills:[],error:e?.error||t(`bg.fetchFailed`)})}).catch(e=>{i({success:!1,skills:[],error:e.message})}),!0;if(e.type===`CAPTURE_TAB`)return chrome.tabs.captureVisibleTab(null,{format:`jpeg`,quality:100},e=>{chrome.runtime.lastError?(r.error(`[Background] screenshot failed:`,chrome.runtime.lastError.message),i({error:chrome.runtime.lastError.message})):i({dataUrl:e})}),!0;if(e.type===`CAPTURE_TAB_FROM_PAGE`)return chrome.tabs.captureVisibleTab(null,{format:`jpeg`,quality:100},e=>{chrome.runtime.lastError?r.error(`[Background] pageshortcutscreenshot failed:`,chrome.runtime.lastError.message):chrome.runtime.sendMessage({type:`SCREENSHOT_RESULT`,dataUrl:e,mode:`full`}).catch(()=>{})}),!0;if(e.type===`CAPTURE_REGION_FROM_PAGE`){let e=n.tab?.id;return e?(chrome.tabs.sendMessage(e,{type:`START_REGION_SELECTION`},e=>{e&&chrome.tabs.captureVisibleTab(null,{format:`png`},t=>{chrome.runtime.lastError?r.error(`[Background] region screenshot failed:`,chrome.runtime.lastError.message):chrome.runtime.sendMessage({type:`SCREENSHOT_RESULT`,dataUrl:t,mode:`region`,rect:e}).catch(()=>{})})}),!0):!1}if(e.type===`CALL_API`){let{messages:n,model:i,useTools:a,tabId:o,apiParams:s,sessionId:c,imageApiBase:l,imageApiKey:u,agentId:d,agentToolIds:f,agentSkillIds:p,callId:m,forcedMcpServerIds:h,agentMcpExcludedServerIds:g}=e;li(c,h),l&&(s.imageApiBase=l),u&&(s.imageApiKey=u),be(c);let _={type:`EXECUTION_STATUS_UPDATE`,nodeName:t(`bg.preparing`),status:`processing`,executionLog:[]};return c&&(_.sessionId=c),m&&(_.callId=m),chrome.runtime.sendMessage(_).catch(()=>{}),r.debug(`[Background] recei to CALL_API message,sessionId:`,c,`useTools:`,a,`tabId:`,o,`apiParams:`,s),(a?(async()=>{let e=await Mi(f,d,p,h,g);if(e.length===0)return r.debug(`[Background] no available tools, skip pre-filter, direct normal conversation`),yn(n,i,s,c,{},m);r.debug(`[Background] get to ${e.length} tool`);let a=(await R()).reactConfig.enableToolPreselect,l;if(a?l=await Bt(n,i,e,s):(r.debug(`[Background] toolpre-filterclosed,using alltool`),l={type:`tools`,tools:e,executionLog:[]}),l.executionLog.length>0){let e={type:`EXECUTION_STATUS_UPDATE`,nodeName:t(`bg.toolPreselect`),status:`success`,executionLog:l.executionLog};c&&(e.sessionId=c),m&&(e.callId=m),r.debug(`[Background] sendpre-filterstateupdate:`,e),chrome.runtime.sendMessage(e).then(()=>{r.debug(`[Background] pre-filterstateupdatesend successful`)}).catch(e=>{r.error(`[Background] pre-filterstateupdatesend failed:`,e)})}if(l.type===`answer`)return r.debug(`[Background] pre-filtermodeldirect answer,skip mainmodelcall with `),{content:l.content,executionLog:l.executionLog};let{tools:u,executionLog:_}=l,v=di(u,e,h);r.debug(`[Background] after pre-filter ${v.length} tool`),r.debug(`[Background] pre-filter executionlog:`,JSON.stringify(_).substring(0,500)),_.length>0&&chrome.runtime.sendMessage({type:`STREAM_PRESELECT`,sessionId:c,callId:m,preselectLog:_}).catch(()=>{});let y=await pn(n,i,v,o,s,c,null,null,{value:1},_,m);return r.debug(`[Background] ReAct complete,executionLog total:`,y.executionLog?.length),{content:y.content===void 0?y:y.content,executionLog:y.executionLog||_,reflectionScore:y.reflectionScore,wasRevised:y.wasRevised||!1,reasoningContent:y.reasoningContent||null}})():yn(n,i,s,c)).then(e=>{let t=e.content===void 0?e:e.content,n=e.executionLog||[],o=e.reflectionScore,s=e.wasRevised||!1,l=e.reasoningContent||null;e.usage&&(Vt({sessionId:c,model:i||``,usage:e.usage,callType:`non_stream`}).catch(()=>{}),n.length===0&&(n=[{nodeType:`api_call`,nodeName:`API Call`,status:`success`,timestamp:new Date().toISOString(),apiResponse:{tokenUsage:e.usage}}])),r.debug(`[Background] API call complete,content length:`,t.length,`execution logcount:`,n.length),console.log(`[Background API_COMPLETE] useTools:`,a,`| executionLog entries:`,n.length,`| agent_file entries:`,n.filter(e=>e.nodeType===`tool_exec`&&e.action?.name===`agent_file`).length,`| first few types:`,n.slice(0,5).map(e=>`${e.nodeType}${e.action?`(${e.action.name})`:``}`));let u=n.length>Eo?n.slice(-1e3):n;chrome.runtime.sendMessage({type:`API_COMPLETE`,sessionId:c,callId:m,content:t,executionLog:u,reflectionScore:o,reasoningContent:l,wasRevised:s}).catch(e=>{r.warn(`[Background] send backmessage failed:`,e)})}).catch(e=>{e.name===`AbortError`||e.message===t(`bg.requestCancelled`)||e.message===t(`bg.reactCancelled`)?r.debug(`[Background] API call with by usercancel`):r.error(`[Background] API call with failed:`,e.message||e);let n=e.executionLog||[],i=n.length>Eo?n.slice(-1e3):n;chrome.runtime.sendMessage({type:`API_ERROR`,sessionId:c,callId:m,error:e.message||t(`bg.apiCallFailed`),executionLog:i}).catch(e=>{r.warn(`[Background] send errormessage failed:`,e)})}),!1}if(e.type===`GET_SESSION`)return R().then(e=>{i({modelName:e.modelName})}),!0;if(e.type===`GET_CHAT_CONFIG`)return Re().then(e=>{i(e)}),!0;if(e.type===`GET_PERMANENT_NOTES`)return Fn().then(e=>{if(!e.success){i({success:!1,facts:[],error:e.error});return}i({success:!0,facts:(e.data.facts||[]).sort((e,t)=>(t.importance||0)-(e.importance||0))})}).catch(e=>{i({success:!1,facts:[],error:e.message})}),!0;if(e.type===`OPEN_OPTIONS_PAGE`){let t=e.hash||``;return chrome.runtime.openOptionsPage(()=>{t&&chrome.tabs.query({url:chrome.runtime.getURL(`options.html`)+`*`},e=>{e.length>0&&chrome.tabs.update(e[0].id,{url:chrome.runtime.getURL(`options.html`)+`#`+t})})}),!1}if(e.type===`DETACH_SIDEPANEL`){let t=Math.min(Math.max(e.width||480,320),900);return(async()=>{try{let e=null;if(n.tab?.windowId)try{e=await chrome.windows.get(n.tab.windowId)}catch{}if(!e)try{e=await chrome.windows.getLastFocused()}catch{}let a=e?Math.max(e.left,Math.round(e.left+(e.width-t)/2)):void 0,o=e?Math.max(e.top,Math.round(e.top+(e.height-720)/2)):void 0,s=await chrome.windows.create({url:chrome.runtime.getURL(`side_panel.html`)+`?popup=1`,type:`popup`,width:t,height:720,left:a,top:o});X=s.id,await chrome.storage.local.set({_detachWindowId:s.id}).catch(()=>{}),r.debug(`[Background] sidePanel detached, windowId:`,s.id),i({success:!0,windowId:s.id})}catch(e){r.warn(`[Background] detach sidePanel failed:`,e?.message),i({success:!1,error:e?.message})}})(),!0}if(e.type===`ATTACH_SIDEPANEL`)return X=null,e.windowId&&chrome.windows.remove(e.windowId).catch(()=>{}),chrome.storage.local.remove(`_detachWindowId`).catch(()=>{}),chrome.tabs.query({active:!0,currentWindow:!0},e=>{e[0]?.id&&(No(e[0].id),chrome.sidePanel?.open?.({tabId:e[0].id}).catch(e=>{r.warn(`[Background] open sidePanel after attach failed:`,e?.message)}))}),i({success:!0}),!1;if(e.type===`SELECTION_TOOLBAR_ACTION`){let{prompt:i,action:a,text:o,systemPrompt:s}=e,c=n.tab?.id,l=n.frameId;if(r.debug(`[Background] received selected text toolbar operation:`,a,`tabId:`,c),a===`ai-search`)return X==null&&c&&(No(c),chrome.sidePanel.open({tabId:c}).catch(e=>{r.warn(`[Background] open Side Panel failed:`,e?.message||e)})),$o(i,o,c),!1;let u=[{role:`system`,content:s||{explain:`你正在处理用户在网页上选中的内容。用1-3句简洁解释选中内容,必要时补充一个简短示例。不要展开长篇论述。`,translate:`你正在处理用户在网页上选中的内容。自动检测语言:中文→英文,英文→中文,其他语言→同时给出中英文。只输出翻译结果,不添加额外说明。`,summary:`你正在处理用户在网页上选中的内容。用3-5个要点总结选中内容,每条要点一句话,提炼核心信息即可。`}[a]||`你正在处理用户在网页上选中的内容,请用简洁的语言回答用户的问题。`},{role:`user`,content:i}];return be(),R().then(async e=>{try{if(e.streamConfig?.streamEnabled!==!1&&c){let t=`toolbar_${c}_${Date.now()}`,n=await yn(u,e.modelName,{},t,{sendFn:e=>chrome.tabs.sendMessage(c,e,{frameId:l}).catch(()=>{}),typePrefix:`SELECTION_TOOLBAR_`}),i=n.content===void 0?n:n.content;n.usage&&Vt({sessionId:`selection_toolbar`,model:e.modelName,usage:n.usage,callType:`stream`}).catch(()=>{}),r.debug(`[Background] selected texttoolbarstreaming API complete,content length:`,i.length)}else{let t=await yn(u,e.modelName,{}),n=t.content===void 0?t:t.content;t.usage&&Vt({sessionId:`selection_toolbar`,model:e.modelName,usage:t.usage,callType:`non_stream`}).catch(()=>{}),r.debug(`[Background] selected texttoolbar API complete,content length:`,n.length),c&&chrome.tabs.sendMessage(c,{type:`SELECTION_TOOLBAR_RESULT`,content:n,usage:t.usage||null},{frameId:l}).catch(()=>{r.warn(`[Background] send SELECTION_TOOLBAR_RESULT to tab failed`)})}}catch(e){r.error(`[Background] selected texttoolbar API failed:`,e),c&&chrome.tabs.sendMessage(c,{type:`SELECTION_TOOLBAR_RESULT`,error:e.message||t(`bg.apiCallFailed`)},{frameId:l}).catch(()=>{})}}),!1}if(e.type===`FILL_SIDEPANEL_INPUT`){let t=n.tab?.id,i=e.text;return r.debug(`[Background] received follow-upfillrequested :`,i?.substring(0,50)),t&&(No(t),chrome.sidePanel.open({tabId:t}).catch(e=>{r.warn(`[Background] open Side Panel failed:`,e?.message||e)})),chrome.storage.session.set({pendingFillInput:{text:i,timestamp:Date.now()}}).catch(()=>{}),chrome.runtime.sendMessage({type:`FILL_SIDEPANEL_INPUT`,text:i}).catch(()=>{r.debug(`[Background] Side Panel not open,fillcontentstorage,waiting Side Panel load`)}),!1}if(e.type===`DIRECT_SEND`){let t=n.tab?.id,i=e.text,a=e.selectedText||``;return r.debug(`[Background] received directsendrequested :`,i?.substring(0,50)),t&&(No(t),chrome.sidePanel.open({tabId:t}).catch(e=>{r.warn(`[Background] open Side Panel failed:`,e?.message||e)})),chrome.storage.session.set({pendingDirectSend:{text:i,selectedText:a,timestamp:Date.now()}}).catch(()=>{}),chrome.runtime.sendMessage({type:`DIRECT_SEND`,text:i,selectedText:a}).catch(()=>{r.debug(`[Background] Side Panel not open,sendcontentstorage,waiting Side Panel load`)}),!1}if(e.type===`TRIGGER_AGENT_HEALTH_CHECK`)return rs.clear(),os(),!1;if(e.type===`OPTIONS_PAGE_OPEN`)return ns=!0,rs.clear(),os(),!1;if(e.type===`OPTIONS_PAGE_CLOSED`)return ns=!1,!1;if(e.type===`AGENT_CONNECTION_CHANGED`)return chrome.runtime.sendMessage({type:`AGENT_CONNECTION_CHANGED`,connected:e.connected,agentId:e.agentId}).catch(()=>{}),e.connected&&e.agentId?(gt(),Do=null,Y=null,xa(),rs.clear(),Ai(),ze(e.agentId,!0),ls(),ri().then(e=>{e>0&&r.debug(`[Background] switchagent after loaded: ${e} MCP tool`)}).catch(()=>{}),xi().then(e=>{e>0&&r.debug(`[Background] switchagent after loaded: ${e} RAG tool`)}).catch(()=>{}),setTimeout(()=>{os()},3e3)):e.connected||(ls(),Y=null,Do=null,xa(),os()),!1;if(e.type===`CHECK_FILES_EXIST`){let t=e.paths||[];return t.length===0?(i({success:!0,results:{}}),!1):((async()=>{let e=await Promise.allSettled(t.map(e=>Je(e))),n={};e.forEach((e,r)=>{e.status===`fulfilled`&&e.value.success?n[t[r]]=e.value.exists:n[t[r]]=!0}),i({success:!0,results:n})})(),!0)}if(e.type===`AGENT_RESTART`)return(async()=>{i(await xt())})(),!0;if(e.type===`AGENT_UPDATE`)return(async()=>{i(await St())})(),!0;if(e.type===`AGENT_STOP`)return(async()=>{i(await Ct())})(),!0;if(e.type===`OPEN_LOCAL_PROTOTYPE`)return(async()=>{i(await Xe(e.path))})(),!0;if(e.type===`DELETE_LOCAL_PROTOTYPE`)return(async()=>{try{let t=e.path.replace(/[\\/][^\\/]+\.html$/,``),n=await Qe(t);n.success?r.debug(`[Background] local prototypefile deleted:`,t):r.warn(`[Background] local prototypefiledelete failed:`,n.error),i(n)}catch(e){r.warn(`[Background] local prototypefiledelete failed:`,e.message),i({success:!1,error:e.message})}})(),!0;if(e.type?.startsWith(`SCHEDULED_TASK_`))return _o(e,i);if(e.type===`QUERY_AUDIT_LOGS`)return wt({category:e.category,limit:e.limit}).then(e=>{i(e)}).catch(e=>{i({success:!1,error:e.message})}),!0});async function $o(e,t,n){r.debug(`[Background] processselected text AI search:`,e.substring(0,50)+`...`),await chrome.storage.session.set({pendingSelectionSearch:{prompt:e,selectedText:t,timestamp:Date.now()}}),chrome.runtime.sendMessage({type:`SELECTION_AI_SEARCH`,prompt:e,selectedText:t}).catch(()=>{r.debug(`[Background] Side Panel not open,searchcontentstorage,waiting Side Panel load`)})}var es=null,ts=null,ns=!1,rs=new Map,is=new Map;async function as(e){let t=!1,n=5e3;try{let r=new AbortController,i=setTimeout(()=>r.abort(),n),a=await fetch(`${e.url}/api/status`,{signal:r.signal,cache:`no-cache`});clearTimeout(i),t=a.ok}catch{t=!1}if(!t){await new Promise(e=>setTimeout(e,500));try{let r=new AbortController,i=setTimeout(()=>r.abort(),n),a=await fetch(`${e.url}/api/status`,{signal:r.signal,cache:`no-cache`});clearTimeout(i),t=a.ok}catch{t=!1}}return t}async function os(){try{let e=await Ue();if(e.length===0){rs.size>0&&(rs.clear(),Ai(),ze(`__global__`,!1),ds(!1,`未配对`));return}let t=await We(),n=e.filter(e=>!e.disabled),i=ns?n:t&&!t.disabled?[t]:[];if(i.length===0)return;let a=(await Promise.allSettled(i.map(async e=>{let t=await as(e);return rs.get(e.id)===t?{agentId:e.id,name:e.name,connected:t,changed:!1}:(rs.set(e.id,t),ze(e.id,t),r.debug(`[Background] agent ${e.name} status change: ${t?`online`:`offline`}`),{agentId:e.id,name:e.name,connected:t,changed:!0})}))).filter(e=>e.status===`fulfilled`&&e.value.changed).map(e=>e.value);if(a.length>0){Ai();let e=a.find(e=>e.agentId===t?.id);e&&(ds(e.connected,e.connected?`在线`:`离线`,e.agentId),e.connected?(cs(e.agentId),ri().then(e=>{e>0&&r.debug(`[Background] Agent after reconnect loaded: ${e} MCP tool`)}).catch(()=>{}),xi().then(e=>{e>0&&r.debug(`[Background] Agent after reconnect loaded: ${e} RAG tool`)}).catch(()=>{})):(await ai(),await wi(),Y=null,r.debug(`[Background] Agent disconnect,cleaned MCP tool`),ss(t)))}}catch(e){r.warn(`[Background] agenthealth checkexception:`,e.message)}}function ss(e){if(!e||e.disabled||is.get(e.id))return;let t=n=>{if(n>=20){is.delete(e.id),r.debug(`[Background] agent ${e.name} auto reconnectabandoned (exceed maxretry times)`);return}let i=setTimeout(async()=>{let i=(await Ue()).find(t=>t.id===e.id);if(!i||i.disabled){is.delete(e.id),r.debug(`[Background] agent ${e.name} ${i?.disabled?`disable`:`delete`},stopauto reconnect`);return}r.debug(`[Background] agent ${e.name} auto reconnectattempt ${n+1}/20`),await as(e)?(is.delete(e.id),rs.set(e.id,!0),ze(e.id,!0),Ai(),ds(!0,`在线`,e.id),us(e.id),ri().then(t=>{t>0&&r.debug(`[Background] Agent ${e.name} reconnect successful,loaded: ${t} MCP tool`)}).catch(()=>{}),xi().then(t=>{t>0&&r.debug(`[Background] Agent ${e.name} reconnect successful,loaded: ${t} RAG tool`)}).catch(()=>{}),r.debug(`[Background] agent ${e.name} auto reconnect successful`)):t(n+1)},15e3);is.set(e.id,{timer:i,retries:n})};t(0)}function cs(e){let t=is.get(e);t&&(clearTimeout(t.timer),is.delete(e))}function ls(){for(let[e,t]of is)clearTimeout(t.timer);is.clear()}async function us(e){try{let t=await We();t&&t.id===e&&(ri().then(e=>{e>0&&r.debug(`[Background] active agentafter reconnect loaded: ${e} MCP tool`)}).catch(()=>{}),xi().then(e=>{e>0&&r.debug(`[Background] active agentafter reconnect loaded: ${e} RAG tool`)}).catch(()=>{}))}catch(e){r.warn(`[Background] refreshactive agentstate failed:`,e.message)}}function ds(e,t,n){chrome.runtime.sendMessage({type:`AGENT_STATUS_CHANGE`,connected:e,status:t,agentId:n}).catch(()=>{})}function fs(){ps(),r.debug(`[Background] start Agent health check (30s interval)`),os(),es=setInterval(os,3e4),hs()}function ps(){es&&(clearInterval(es),es=null,rs.clear()),gs()}async function ms(){try{let e=await We();if(!e||e.disabled)return;let t=new AbortController,n=setTimeout(()=>t.abort(),5e3);try{await fetch(`${e.url}/api/heartbeat`,{headers:{Authorization:`Bearer ${e.token}`},signal:t.signal,cache:`no-cache`})}finally{clearTimeout(n)}}catch{}}function hs(){gs(),ms(),ts=setInterval(ms,6e4)}function gs(){ts&&=(clearInterval(ts),null)}fs();
423
- //# sourceMappingURL=background-lzNSVAh8.js.map
427
+ `)}`}var Yo=2048,Xo=6e4;async function Zo({material:e,model:t,sessionId:n}={}){if(!Array.isArray(e)||e.length===0)return{success:!1,error:`material_empty`};let i=await B();if(!i?.apiBase||!i?.apiKey)return{success:!1,error:`config_missing`};let a=Jo(e),o=`${i.apiBase}/chat/completions`,s=t||i.modelName;try{let e=await Ta(o,{method:`POST`,headers:{Authorization:`Bearer ${i.apiKey}`,"Content-Type":`application/json`},body:JSON.stringify({model:s,messages:[{role:`user`,content:a}],stream:!1,max_tokens:Yo,temperature:.2})},Xo,1,1e3);if(!e.ok)return r.warn(`[ContextCompactor] request failed: ${e.status}`),{success:!1,error:`http_${e.status}`};let t=await e.json(),c=(t.choices?.[0]?.message?.content||``).trim();return c?(qt({sessionId:n,model:s,usage:t.usage,callType:`context_compaction`}).catch(()=>{}),r.debug(`[ContextCompactor] summary done, ${c.length} chars`),{success:!0,summary:c}):{success:!1,error:`empty_summary`}}catch(e){return r.warn(`[ContextCompactor] exception:`,e.message),{success:!1,error:e.message||`request_failed`}}}e(`zh`,{bg:{missingSessionId:`缺少 sessionId`,resumingFromCheckpoint:`从 checkpoint 恢复中...`,checkpointNotFound:`未找到可恢复的任务 checkpoint,可能已过期或被清理。请检查 Service Worker 控制台中的诊断日志(搜索 "checkpoint" 关键字)。`,resumeFailed:`恢复失败`,missingSkillName:`缺少技能名称`,fetchFailed:`获取失败`,preparing:`准备中...`,toolPreselect:`工具预筛选`,requestCancelled:`请求已被用户取消`,reactCancelled:`ReAct 循环已被用户取消`,apiCallFailed:`API 调用失败`}}),e(`en`,{bg:{missingSessionId:`Missing sessionId`,resumingFromCheckpoint:`Resuming from checkpoint...`,checkpointNotFound:`No checkpoint found for resumption. It may have expired or been cleaned. Check Service Worker console logs (search "checkpoint").`,resumeFailed:`Resume failed`,missingSkillName:`Missing skill name`,fetchFailed:`Fetch failed`,preparing:`Preparing...`,toolPreselect:`Tool Pre-filter`,requestCancelled:`Request was cancelled by user`,reactCancelled:`ReAct loop was cancelled by user`}}),n(),wo(),Promise.all([x().then(()=>S()),Ke()]).then(([e,t])=>{r.debug(`[Background] DB self-check passed,current has ${e.length} checkpoint`+(t?`,completedoldformat Agent migrate`:``))}).catch(e=>{r.warn(`[Background] cleanup expired checkpoint or DB self-check failed:`,e)});var Qo=1e3,$o=null,es=null,J=null;zo().then(e=>{J=e}),chrome.runtime?.onConnect?.addListener?.(async e=>{if(e.name?.startsWith(`keepalive-`)){let t=e.name.replace(`keepalive-`,``),n=Pe(t);if(Me(t,e),r.debug(`[Background] keepalive portconnected, sessionId:`,t,n?`(reconnect)`:`(first times)`),e.onMessage.addListener(n=>{if(n?.type===`KEEPALIVE_IDENTITY`){let i=n.identity?.windowId==null?null:n.identity.windowId,a=i==null?null:Q.get(i)??null,o=i==null?null:{windowId:i,hostTabId:a};Ie(t,o),r.debug(`[Background] keepalive identity reported, sessionId:`,t,JSON.stringify(o));try{e.postMessage({type:`HOST_TAB_RESOLVED`,sessionId:t,hostTabId:a})}catch(e){r.debug(`[Background] send HOST_TAB_RESOLVED failed:`,e.message)}}}),n&&!Sn.has(t)){r.warn(`[Background] ⚠️ detected SW re started,sessionId`,t,` API call lost`);let n=null;try{let e=await ge(t);e&&(n={iteration:e.iteration,interruptedReason:e.interruptedReason,updatedAt:e.updatedAt,messageCount:e.currentMessages?.length||0,subtaskPlan:e.subtaskPlan?{subtaskCount:e.subtaskPlan.subtasks?.length||0}:null},r.debug(`[Background] detected recoverable checkpoint:`,n))}catch(e){r.warn(`[Background] read checkpoint failed:`,e.message)}try{e.postMessage({type:`SW_RESTARTED`,sessionId:t,checkpoint:n})}catch(e){r.warn(`[Background] send SW_RESTARTED message failed:`,e.message)}}e.onDisconnect.addListener(()=>{Re(t,e),r.debug(`[Background] keepalive port disconnected, sessionId:`,t)})}}),chrome.sidePanel?.setPanelBehavior?.({openPanelOnActionClick:!1}).catch(()=>{});var Y=`global`,X=new Map,ts=!!chrome.sidePanel?.onOpened,ns=!1,rs=(async()=>{try{let e=await chrome.runtime.getContexts({contextTypes:[`SIDE_PANEL`]});return ns=e.length>0,e}catch{return[]}})();chrome.sidePanel?.onOpened?.addListener(e=>{e?.windowId!=null&&(r.debug(`[Background] sidePanel onOpened:`,JSON.stringify(e)),X.set(e.windowId,e.tabId??null))}),chrome.sidePanel?.onClosed?.addListener(e=>{if(e?.windowId==null)return;r.debug(`[Background] sidePanel onClosed:`,JSON.stringify(e));let t=X.get(e.windowId);X.delete(e.windowId);let n=e.tabId??(typeof t==`number`?t:null);n!=null&&hs(n)}),chrome.sidePanel?.setOptions?.({path:`side_panel.html`,enabled:!0}).catch(()=>{}),(async()=>{try{Y=is((await chrome.storage.local.get([`sidePanelScope`])).sidePanelScope),as()}catch{}})();function is(e){return e===`tab-specific`?`tab-specific`:`global`}function as(){Y===`tab-specific`?chrome.sidePanel?.setOptions?.({enabled:!1}).catch(()=>{}):(chrome.sidePanel?.setOptions?.({path:`side_panel.html`,enabled:!0}).catch(()=>{}),fs?.then(()=>gs()).catch(()=>{}))}function os(e,{group:t=!0}={}){t&&Y===`tab-specific`&&ms(e),Y===`tab-specific`&&chrome.sidePanel?.setOptions?.({tabId:e,path:`side_panel.html`,enabled:!0}).catch(()=>{})}var Z=new Map,ss=`_aiHelperGroupByWindow`,cs=`AI Helper`;async function ls(){try{return(await chrome.storage.local.get(`autoGroupTabs`))?.autoGroupTabs!==!1}catch{return!0}}async function us(){if(chrome.tabGroups)try{let e=(await chrome.storage.session.get(ss))[ss];if(Array.isArray(e))for(let[t,n]of e)try{await chrome.tabGroups.get(n),Z.set(t,n)}catch{}}catch{}}function ds(){chrome.storage.session?.set({[ss]:Array.from(Z.entries())}).catch(()=>{})}var fs=us();async function ps(e){if(!(!chrome.tabGroups||!e?.id||e.windowId==null)&&!e.pinned&&await ls()){await fs;try{let t=Z.get(e.windowId);if(t!=null)try{await chrome.tabGroups.get(t)}catch{t=null,Z.delete(e.windowId),ds()}if(t==null){try{let n=await chrome.tabGroups.query({windowId:e.windowId,title:cs});n.length>0&&(t=n[0].id)}catch{}if(t==null){t=await chrome.tabs.group({tabIds:[e.id]});try{await chrome.tabGroups.update(t,{title:cs,color:`blue`,collapsed:!1})}catch{}}else if(e.groupId!==t)try{await chrome.tabs.group({groupId:t,tabIds:[e.id]})}catch{}Z.set(e.windowId,t),ds()}else if(e.groupId!==t)try{await chrome.tabs.group({groupId:t,tabIds:[e.id]})}catch{}}catch(e){r.debug(`[Background] ensureAiHelperGroup failed:`,e?.message)}}}function ms(e){!chrome.tabGroups||e==null||chrome.tabs.get(e).then(e=>ps(e)).catch(()=>{})}async function hs(e){if(!(Y!==`tab-specific`||!chrome.tabGroups||!chrome.tabs?.ungroup))try{let t=await chrome.tabs.get(e),[n]=await chrome.tabs.query({active:!0,windowId:t.windowId});if(n?.id!==t.id)return;let i=Z.get(t.windowId);if(i==null||t.groupId!==i)return;await chrome.tabs.ungroup([t.id]),r.debug(`[Background] tab unbound from AI Helper group:`,t.id)}catch(e){r.debug(`[Background] unbindTabFromAiHelperGroup failed:`,e?.message)}}async function gs(){if(!chrome.tabGroups||!chrome.tabs?.ungroup)return;let e=[...new Set(Z.values())];if(e.length!==0){Z.clear(),ds();for(let t of e)try{let e=await chrome.tabs.query({groupId:t});e.length>0&&await chrome.tabs.ungroup(e.map(e=>e.id))}catch{}r.debug(`[Background] AI Helper groups dissolved (scope switched to global)`)}}chrome.storage?.onChanged?.addListener?.((e,t)=>{if(t===`local`&&e.sidePanelScope){let t=is(e.sidePanelScope.newValue);if(t!==Y){if(Y=t,t===`tab-specific`){chrome.runtime.getContexts({contextTypes:[`SIDE_PANEL`]}).then(e=>{e.length>0?chrome.tabs.query({active:!0,currentWindow:!0},e=>{e[0]?.id&&os(e[0].id,{group:!1}),as()}):as()}).catch(()=>{as()});return}as(),r.debug(`[Background] sidePanel scope changed to:`,t)}}}),chrome.action?.onClicked?.addListener?.(e=>{if(J){try{chrome.windows.update(J,{focused:!0}).catch(()=>{J=null,chrome.storage.local.remove(`_detachWindowId`).catch(()=>{}),os(e.id),chrome.sidePanel?.open?.({tabId:e.id}).catch(()=>{})})}catch{J=null,chrome.storage.local.remove(`_detachWindowId`).catch(()=>{}),os(e.id),chrome.sidePanel?.open?.({tabId:e.id}).catch(()=>{})}return}os(e.id),chrome.sidePanel?.open?.({tabId:e.id}).catch(e=>{r.warn(`[Background] open sidePanel failed:`,e?.message)})}),chrome.windows?.onRemoved?.addListener?.(e=>{J===e&&(J=null,chrome.storage.local.remove(`_detachWindowId`).catch(()=>{}),r.debug(`[Background] detached window closed, cleaned up windowId:`,e)),Z.has(e)&&(Z.delete(e),ds())}),chrome.tabs?.onUpdated?.addListener?.((e,t,n)=>{t.status===`complete`&&n.url?.startsWith(`http`)&&Y===`global`&&chrome.sidePanel?.setOptions?.({path:`side_panel.html`,enabled:!0})}),chrome.tabGroups?.onRemoved?.addListener?.(e=>{for(let[t,n]of Z)if(n===e.id){Z.delete(t),ds();break}});var _s=`_toggle_sidepanel`,Q=new Map,$=null;chrome.tabs?.onActivated?.addListener?.(({tabId:e,windowId:t})=>{Q.set(t,e),$=t}),chrome.tabs?.onRemoved?.addListener?.((e,{windowId:t})=>{Q.get(t)===e&&Q.delete(t)}),chrome.windows?.onFocusChanged?.addListener?.(e=>{e!==chrome.windows.WINDOW_ID_NONE&&($=e)});var vs=null;chrome.windows?.onFocusChanged?.addListener?.(e=>{vs=e!==chrome.windows.WINDOW_ID_NONE}),chrome.windows?.getLastFocused?.()?.then?.(e=>{vs===null&&(vs=e?.focused===!0)})?.catch?.(()=>{}),(async()=>{try{let[e]=await chrome.tabs.query({active:!0,lastFocusedWindow:!0});if(!e?.id)return;Q.set(e.windowId,e.id),$??=e.windowId}catch{}})(),chrome.commands?.getAll?.().then(e=>{let t=e.find(e=>e.name===_s);t&&(t.shortcut?r.debug(`[Background] sidePanel shortcut:`,t.shortcut):r.warn(`[Background] sidePanel shortcut is not bound, set it at chrome://extensions/shortcuts`))}).catch(()=>{});function ys(){return $==null?null:Q.get($)??null}function bs(e){let t=X.get(e.windowId);return t===void 0?!ts&&ns:t===null||t===e.id}function xs(e,t=null){let n=e=>{r.warn(`[Background] close sidePanel failed, fallback to panel self-close:`,e),chrome.runtime.sendMessage({type:`CLOSE_SIDEPANEL`}).catch(()=>{})};if(!chrome.sidePanel?.close){chrome.runtime.sendMessage({type:`CLOSE_SIDEPANEL`}).catch(e=>{r.warn(`[Background] send CLOSE_SIDEPANEL failed:`,e?.message)});return}let i=typeof t==`number`?{tabId:t}:{windowId:e};chrome.sidePanel.close(i).then(()=>{X.delete(e)}).catch(r=>{if(typeof t!=`number`)return n(r?.message);chrome.sidePanel.close({windowId:e}).then(()=>{X.delete(e)}).catch(e=>n(e?.message))})}function Ss(){setTimeout(()=>{chrome.runtime.getContexts({contextTypes:[`SIDE_PANEL`]}).then(e=>{e.length===0&&X.clear()}).catch(()=>{})},300)}function Cs(e){let t=Y===`global`;if(bs(e)){r.debug(`[Background] command: close sidePanel on tab`,e.id,e.windowId);let n=X.get(e.windowId);xs(e.windowId,t||n===null?null:e.id);return}r.debug(`[Background] command: open sidePanel on tab`,e.id,e.windowId),os(e.id);let n=t?{windowId:e.windowId}:{tabId:e.id};chrome.sidePanel?.open?.(n).then(()=>{X.set(e.windowId,t?null:e.id)}).catch(e=>{r.warn(`[Background] open sidePanel failed:`,e?.message)})}function ws(){if(Y===`global`){r.debug(`[Background] command: cold start, open sidePanel on current window`),chrome.sidePanel?.open?.({windowId:chrome.windows.WINDOW_ID_CURRENT}).catch(e=>{r.warn(`[Background] open sidePanel failed:`,e?.message)}),rs.then(e=>{let t=e?.length>0;chrome.tabs.query({active:!0,lastFocusedWindow:!0}).then(([e])=>{if(e?.id){if(Q.set(e.windowId,e.id),$??=e.windowId,t){xs(e.windowId,null);return}X.set(e.windowId,null)}}).catch(()=>{})}).catch(()=>{});return}chrome.tabs.query({active:!0,lastFocusedWindow:!0},e=>{let t=e[0];t?.id&&(Q.set(t.windowId,t.id),$=t.windowId,Cs(t))})}function Ts(){let e=e=>{typeof e==`number`&&chrome.windows?.update?.(e,{focused:!0})?.catch?.(()=>{})},t=$;if(t==null){chrome.sidePanel?.open?.({windowId:chrome.windows.WINDOW_ID_CURRENT})?.catch?.(()=>{}),chrome.windows?.getLastFocused?.()?.then?.(t=>e(t?.id))?.catch?.(()=>{});return}let n=X.get(t);if(n!==void 0){e(t),typeof n==`number`&&n!==Q.get(t)&&chrome.tabs?.update?.(n,{active:!0})?.catch?.(()=>{});return}let r=Y===`global`,i=Q.get(t)??null;if(r||i==null){chrome.sidePanel?.open?.({windowId:t})?.then?.(()=>{X.set(t,r?null:i)})?.catch?.(()=>e(t));return}os(i,{group:!1}),chrome.sidePanel?.open?.({tabId:i})?.then?.(()=>{X.set(t,i)})?.catch?.(()=>e(t))}Wo({isBrowserFocused:()=>vs===!0,getFocusedWindowId:()=>$,getActiveTabId:e=>Q.get(e)??null,getScope:()=>Y}),$t({isPanelVisible:Go,revealPanel:Ts}),chrome.commands?.onCommand?.addListener(e=>{if(e===_s)try{if(J){try{chrome.windows.update(J,{focused:!0}).catch(()=>{J=null,chrome.storage.local.remove(`_detachWindowId`).catch(()=>{})})}catch{J=null,chrome.storage.local.remove(`_detachWindowId`).catch(()=>{})}return}let e=ys();r.debug(`[Background] toggle: scope=%s focusedWindow=%s tab=%s panels=%s events=%s close=%s`,Y,$,e,JSON.stringify([...X]),ts,!!chrome.sidePanel?.close),e==null?ws():Cs({id:e,windowId:$}),Ss()}catch(e){r.warn(`[Background] toggle sidePanel exception:`,e?.message)}}),chrome.runtime?.onMessage?.addListener?.((e,n,i)=>{if(e.type===`IFRAME_SELECTION`){let t=n.tab?.id;return t&&chrome.tabs.sendMessage(t,{type:`IFRAME_SELECTION`,text:e.text,x:e.x,y:e.y},{frameId:0}).catch(()=>{}),!1}if(e.type===`IFRAME_CLICK_DISMISS`){let e=n.tab?.id;return e&&chrome.tabs.sendMessage(e,{type:`IFRAME_CLICK_DISMISS`}).catch(()=>{}),!1}if(e.type===`IFRAME_SELECTION_CLEAR`){let e=n.tab?.id;return e&&chrome.tabs.sendMessage(e,{type:`IFRAME_SELECTION_CLEAR`}).catch(()=>{}),!1}if(e.type===`CANCEL_REACT`){let{tabId:t,sessionId:n}=e;return n?(Te(n),lo(n)):Te(t),!1}if(e.type===`COMPACT_CONTEXT_SUMMARY`){let{material:t,model:n,sessionId:a}=e;return Zo({material:t,model:n,sessionId:a}).then(e=>{i(e)}).catch(e=>{r.warn(`[Background] COMPACT_CONTEXT_SUMMARY failed:`,e),i({success:!1,error:e?.message||`unknown`})}),!0}if(e.type===`GET_CHECKPOINT`){let{sessionId:t}=e;return t?(ge(t).then(e=>{if(!e){i({exists:!1});return}i({exists:!0,checkpoint:{iteration:e.iteration,interruptedReason:e.interruptedReason,updatedAt:e.updatedAt,messageCount:e.currentMessages?.length||0,subtaskPlan:e.subtaskPlan?{subtaskCount:e.subtaskPlan.subtasks?.length||0}:null}})}).catch(e=>{r.warn(`[Background] GET_CHECKPOINT query failed:`,e),i({exists:!1})}),!0):(i({exists:!1}),!1)}if(e.type===`DELETE_CHECKPOINT`){let{sessionId:t}=e;return t?se(t).then(e=>{i({success:e})}).catch(e=>{r.warn(`[Background] DELETE_CHECKPOINT failed:`,e),i({success:!1})}):i({success:!1}),!0}if(e.type===`RESUME_REACT`){let{sessionId:n,callId:a,userGuidance:o=``}=e;if(!n)return i({error:t(`bg.missingSessionId`)}),!1;r.debug(`[Background] recei to RESUME_REACT,sessionId:`,n,`userGuidance:`,o?`"${o.substring(0,50)}..."`:`( no )`);let s=Sn.has(n),c=()=>{Se(n);let e={type:`EXECUTION_STATUS_UPDATE`,nodeName:t(`bg.resumingFromCheckpoint`),status:`processing`,executionLog:[],sessionId:n};a&&(e.callId=a),chrome.runtime.sendMessage(e).catch(()=>{}),Mn(n,o,a).then(e=>{if(!e){r.warn(`[Background] RESUME_REACT: not found checkpoint or restore failed`),ge(n).then(e=>{r.warn(`[Background] RESUME_REACT: re-query checkpoint result:`,e?`exists`:`not found`)}).catch(()=>{}),chrome.runtime.sendMessage({type:`API_ERROR`,sessionId:n,callId:a,error:t(`bg.checkpointNotFound`),executionLog:[],resumed:!0}).catch(()=>{});return}r.debug(`[Background] RESUME_REACT complete,content length:`,e.content?.length);let i=(e.executionLog||[]).length>Qo?e.executionLog.slice(-1e3):e.executionLog||[];chrome.runtime.sendMessage({type:`API_COMPLETE`,sessionId:n,callId:a,content:e.content||``,executionLog:i,reflectionScore:e.reflectionScore,reasoningContent:e.reasoningContent||null,wasRevised:e.wasRevised||!1,resumed:!0}).catch(e=>{r.warn(`[Background] send RESUME completemessage failed:`,e)})}).catch(e=>{let i=e.name===`AbortError`||e.message===t(`bg.requestCancelled`)||e.message===t(`bg.reactCancelled`);r.debug(`[Background] RESUME_REACT failed:`,i?`(usercancel)`:e.message);let o=e.executionLog||[],s=o.length>Qo?o.slice(-1e3):o;chrome.runtime.sendMessage({type:`API_ERROR`,sessionId:n,callId:a,error:e.message||t(`bg.resumeFailed`),executionLog:s,resumed:!0}).catch(()=>{})})};return s?(r.debug(`[Background] RESUME_REACT: detectedoldtaskstill running , first cancel`),Te(n),lo(n),setTimeout(c,300)):c(),!1}if(e.type===`TERMINATE_COMMAND`){let{sessionId:t,mode:n}=e;return t&&lo(t,n||`kill`),!1}if(e.type===`ABORT_CURRENT_TOOL`){let{sessionId:t}=e;return i({success:Be(t)}),!1}if(e.type===`RELOAD_MCP_TOOLS`)return $o=null,Ci().then(e=>{i({success:!0,count:e})}).catch(e=>{i({success:!1,error:e.message})}),!0;if(e.type===`RELOAD_RAG_TOOLS`)return Vi().then(e=>{i({success:!0,count:e})}).catch(e=>{i({success:!1,error:e.message})}),!0;if(e.type===`RAG_LIST_COLLECTIONS`)return mt().then(e=>{e&&e.success?i({success:!0,collections:e.collections||[]}):i({success:!1,error:e&&e.error||`rag unavailable`})}).catch(e=>{i({success:!1,error:e.message})}),!0;if(e.type===`RAG_SEARCH`)return ht(e.params||{}).then(e=>{e&&e.success?i({success:!0,results:e.results||[],hasContext:!!e.hasContext}):i({success:!1,error:e&&e.error||`rag unavailable`})}).catch(e=>{i({success:!1,error:e.message})}),!0;if(e.type===`GET_MCP_TOOLS`){Vi().catch(()=>{});let e=Date.now();return $o&&e-$o.loadedAt<3e4?(r.debug(`[Background] GET_MCP_TOOLS usingcache (${$o.tools.length} tool,${Math.round((e-$o.loadedAt)/1e3)}s before )`),i({success:!0,tools:$o.tools}),!0):(Ci().then(e=>{let t=c.filter(e=>e.id.startsWith(`mcp_`)).map(e=>{let t=Ei(e.id);return{id:e.id,name:t?.toolName||e.function?.name||e.id,description:e.function?.description||``,category:e.category||`mcp`,execution:e.execution||`background`,parallelizable:e.parallelizable!==!1,requiresConfirmation:e.requiresConfirmation||!1,enabled:!0,serverId:t?.serverId||``,serverName:t?.serverName||``}});$o={tools:t,loadedAt:Date.now()},r.debug(`[Background] GET_MCP_TOOLS return ${t.length} tool ( reloads ${e} )`),i({success:!0,tools:t})}).catch(e=>{i({success:!1,error:e.message})}),!0)}if(e.type===`GET_AGENT_SKILL_PROMPTS`){let t=Date.now(),n=e.skillNames||null;return!n&&es&&t-es.loadedAt<6e4?(i({success:!0,prompts:es.prompts}),!0):((n&&n.length>0?wt(n):Ct()).then(e=>{let t=e.success&&e.prompts||``;n||(es={prompts:t,loadedAt:Date.now()}),i({success:!0,prompts:t})}).catch(e=>{i({success:!1,error:e.message})}),!0)}if(e.type===`GET_AGENT_SKILL_PROMPT`){let n=e.name;return n?(Tt(n).then(e=>{i(e)}).catch(e=>{i({success:!1,error:e.message})}),!0):(i({success:!1,error:t(`bg.missingSkillName`)}),!0)}if(e.type===`GET_SKILL_LIST`)return _t().then(e=>{e?.success?i({success:!0,skills:e.skills||[]}):i({success:!1,skills:[],error:e?.error||t(`bg.fetchFailed`)})}).catch(e=>{i({success:!1,skills:[],error:e.message})}),!0;if(e.type===`CAPTURE_TAB`)return chrome.tabs.captureVisibleTab(null,{format:`jpeg`,quality:100},e=>{chrome.runtime.lastError?(r.error(`[Background] screenshot failed:`,chrome.runtime.lastError.message),i({error:chrome.runtime.lastError.message})):i({dataUrl:e})}),!0;if(e.type===`CAPTURE_TAB_FROM_PAGE`)return chrome.tabs.captureVisibleTab(null,{format:`jpeg`,quality:100},e=>{chrome.runtime.lastError?r.error(`[Background] pageshortcutscreenshot failed:`,chrome.runtime.lastError.message):chrome.runtime.sendMessage({type:`SCREENSHOT_RESULT`,dataUrl:e,mode:`full`}).catch(()=>{})}),!0;if(e.type===`CAPTURE_REGION_FROM_PAGE`){let e=n.tab?.id;return e?(chrome.tabs.sendMessage(e,{type:`START_REGION_SELECTION`},e=>{e&&chrome.tabs.captureVisibleTab(null,{format:`png`},t=>{chrome.runtime.lastError?r.error(`[Background] region screenshot failed:`,chrome.runtime.lastError.message):chrome.runtime.sendMessage({type:`SCREENSHOT_RESULT`,dataUrl:t,mode:`region`,rect:e}).catch(()=>{})})}),!0):!1}if(e.type===`CALL_API`){let{messages:n,model:i,useTools:a,tabId:o,apiParams:s,sessionId:c,imageApiBase:l,imageApiKey:u,agentId:d,agentToolIds:f,agentSkillIds:p,callId:m,forcedMcpServerIds:h,agentMcpExcludedServerIds:g}=e;ki(c,h),l&&(s.imageApiBase=l),u&&(s.imageApiKey=u),Se(c);let _={type:`EXECUTION_STATUS_UPDATE`,nodeName:t(`bg.preparing`),status:`processing`,executionLog:[]};return c&&(_.sessionId=c),m&&(_.callId=m),chrome.runtime.sendMessage(_).catch(()=>{}),r.debug(`[Background] recei to CALL_API message,sessionId:`,c,`useTools:`,a,`tabId:`,o,`apiParams:`,s),(a?(async()=>{let e=await Qi(f,d,p,h,g);if(e.length===0)return r.debug(`[Background] no available tools, skip pre-filter, direct normal conversation`),zn(n,i,s,c,{},m);r.debug(`[Background] get to ${e.length} tool`);let a=(await B()).reactConfig.enableToolPreselect,l;if(a?l=await Kt(n,i,e,s):(r.debug(`[Background] toolpre-filterclosed,using alltool`),l={type:`tools`,tools:e,executionLog:[]}),l.executionLog.length>0){let e={type:`EXECUTION_STATUS_UPDATE`,nodeName:t(`bg.toolPreselect`),status:`success`,executionLog:l.executionLog};c&&(e.sessionId=c),m&&(e.callId=m),r.debug(`[Background] sendpre-filterstateupdate:`,e),chrome.runtime.sendMessage(e).then(()=>{r.debug(`[Background] pre-filterstateupdatesend successful`)}).catch(e=>{r.error(`[Background] pre-filterstateupdatesend failed:`,e)})}if(l.type===`answer`)return r.debug(`[Background] pre-filtermodeldirect answer,skip mainmodelcall with `),{content:l.content,executionLog:l.executionLog};let{tools:u,executionLog:_}=l,v=ji(u,e,h);r.debug(`[Background] after pre-filter ${v.length} tool`),r.debug(`[Background] pre-filter executionlog:`,JSON.stringify(_).substring(0,500)),_.length>0&&chrome.runtime.sendMessage({type:`STREAM_PRESELECT`,sessionId:c,callId:m,preselectLog:_}).catch(()=>{});let y=await Nn(n,i,v,o,s,c,null,null,{value:1},_,m);return r.debug(`[Background] ReAct complete,executionLog total:`,y.executionLog?.length),{content:y.content===void 0?y:y.content,executionLog:y.executionLog||_,reflectionScore:y.reflectionScore,wasRevised:y.wasRevised||!1,reasoningContent:y.reasoningContent||null}})():zn(n,i,s,c)).then(e=>{let t=e.content===void 0?e:e.content,n=e.executionLog||[],o=e.reflectionScore,s=e.wasRevised||!1,l=e.reasoningContent||null;e.usage&&(qt({sessionId:c,model:i||``,usage:e.usage,callType:`non_stream`}).catch(()=>{}),n.length===0&&(n=[{nodeType:`api_call`,nodeName:`API Call`,status:`success`,timestamp:new Date().toISOString(),apiResponse:{tokenUsage:e.usage}}])),r.debug(`[Background] API call complete,content length:`,t.length,`execution logcount:`,n.length),console.log(`[Background API_COMPLETE] useTools:`,a,`| executionLog entries:`,n.length,`| agent_file entries:`,n.filter(e=>e.nodeType===`tool_exec`&&e.action?.name===`agent_file`).length,`| first few types:`,n.slice(0,5).map(e=>`${e.nodeType}${e.action?`(${e.action.name})`:``}`));let u=n.length>Qo?n.slice(-1e3):n;chrome.runtime.sendMessage({type:`API_COMPLETE`,sessionId:c,callId:m,content:t,executionLog:u,reflectionScore:o,reasoningContent:l,wasRevised:s}).catch(e=>{r.warn(`[Background] send backmessage failed:`,e)})}).catch(e=>{e.name===`AbortError`||e.message===t(`bg.requestCancelled`)||e.message===t(`bg.reactCancelled`)?r.debug(`[Background] API call with by usercancel`):r.error(`[Background] API call with failed:`,e.message||e);let n=e.executionLog||[],i=n.length>Qo?n.slice(-1e3):n;chrome.runtime.sendMessage({type:`API_ERROR`,sessionId:c,callId:m,error:e.message||t(`bg.apiCallFailed`),executionLog:i}).catch(e=>{r.warn(`[Background] send errormessage failed:`,e)})}),!1}if(e.type===`GET_SESSION`)return B().then(e=>{i({modelName:e.modelName})}),!0;if(e.type===`GET_CHAT_CONFIG`)return Ve().then(e=>{i(e)}),!0;if(e.type===`GET_PERMANENT_NOTES`)return tr().then(e=>{if(!e.success){i({success:!1,facts:[],error:e.error});return}i({success:!0,facts:(e.data.facts||[]).sort((e,t)=>(t.importance||0)-(e.importance||0))})}).catch(e=>{i({success:!1,facts:[],error:e.message})}),!0;if(e.type===`OPEN_OPTIONS_PAGE`){let t=e.hash||``;return chrome.runtime.openOptionsPage(()=>{t&&chrome.tabs.query({url:chrome.runtime.getURL(`options.html`)+`*`},e=>{e.length>0&&chrome.tabs.update(e[0].id,{url:chrome.runtime.getURL(`options.html`)+`#`+t})})}),!1}if(e.type===`DETACH_SIDEPANEL`){let t=Math.min(Math.max(e.width||480,320),900);return(async()=>{try{let e=null;if(n.tab?.windowId)try{e=await chrome.windows.get(n.tab.windowId)}catch{}if(!e)try{e=await chrome.windows.getLastFocused()}catch{}let a=e?Math.max(e.left,Math.round(e.left+(e.width-t)/2)):void 0,o=e?Math.max(e.top,Math.round(e.top+(e.height-720)/2)):void 0,s=await chrome.windows.create({url:chrome.runtime.getURL(`side_panel.html`)+`?popup=1`,type:`popup`,width:t,height:720,left:a,top:o});J=s.id,await chrome.storage.local.set({_detachWindowId:s.id}).catch(()=>{}),r.debug(`[Background] sidePanel detached, windowId:`,s.id),i({success:!0,windowId:s.id})}catch(e){r.warn(`[Background] detach sidePanel failed:`,e?.message),i({success:!1,error:e?.message})}})(),!0}if(e.type===`ATTACH_SIDEPANEL`)return J=null,e.windowId&&chrome.windows.remove(e.windowId).catch(()=>{}),chrome.storage.local.remove(`_detachWindowId`).catch(()=>{}),chrome.tabs.query({active:!0,currentWindow:!0},e=>{e[0]?.id&&(os(e[0].id),chrome.sidePanel?.open?.({tabId:e[0].id}).catch(e=>{r.warn(`[Background] open sidePanel after attach failed:`,e?.message)}))}),i({success:!0}),!1;if(e.type===`SELECTION_TOOLBAR_ACTION`){let{prompt:i,action:a,text:o,systemPrompt:s}=e,c=n.tab?.id,l=n.frameId;if(r.debug(`[Background] received selected text toolbar operation:`,a,`tabId:`,c),a===`ai-search`)return J==null&&c&&(os(c),chrome.sidePanel.open({tabId:c}).catch(e=>{r.warn(`[Background] open Side Panel failed:`,e?.message||e)})),Es(i,o,c),!1;let u=[{role:`system`,content:s||{explain:`你正在处理用户在网页上选中的内容。用1-3句简洁解释选中内容,必要时补充一个简短示例。不要展开长篇论述。`,translate:`你正在处理用户在网页上选中的内容。自动检测语言:中文→英文,英文→中文,其他语言→同时给出中英文。只输出翻译结果,不添加额外说明。`,summary:`你正在处理用户在网页上选中的内容。用3-5个要点总结选中内容,每条要点一句话,提炼核心信息即可。`}[a]||`你正在处理用户在网页上选中的内容,请用简洁的语言回答用户的问题。`},{role:`user`,content:i}];return Se(),B().then(async e=>{try{if(e.streamConfig?.streamEnabled!==!1&&c){let t=`toolbar_${c}_${Date.now()}`,n=await zn(u,e.modelName,{},t,{sendFn:e=>chrome.tabs.sendMessage(c,e,{frameId:l}).catch(()=>{}),typePrefix:`SELECTION_TOOLBAR_`}),i=n.content===void 0?n:n.content;n.usage&&qt({sessionId:`selection_toolbar`,model:e.modelName,usage:n.usage,callType:`stream`}).catch(()=>{}),r.debug(`[Background] selected texttoolbarstreaming API complete,content length:`,i.length)}else{let t=await zn(u,e.modelName,{}),n=t.content===void 0?t:t.content;t.usage&&qt({sessionId:`selection_toolbar`,model:e.modelName,usage:t.usage,callType:`non_stream`}).catch(()=>{}),r.debug(`[Background] selected texttoolbar API complete,content length:`,n.length),c&&chrome.tabs.sendMessage(c,{type:`SELECTION_TOOLBAR_RESULT`,content:n,usage:t.usage||null},{frameId:l}).catch(()=>{r.warn(`[Background] send SELECTION_TOOLBAR_RESULT to tab failed`)})}}catch(e){r.error(`[Background] selected texttoolbar API failed:`,e),c&&chrome.tabs.sendMessage(c,{type:`SELECTION_TOOLBAR_RESULT`,error:e.message||t(`bg.apiCallFailed`)},{frameId:l}).catch(()=>{})}}),!1}if(e.type===`FILL_SIDEPANEL_INPUT`){let t=n.tab?.id,i=e.text;return r.debug(`[Background] received follow-upfillrequested :`,i?.substring(0,50)),t&&(os(t),chrome.sidePanel.open({tabId:t}).catch(e=>{r.warn(`[Background] open Side Panel failed:`,e?.message||e)})),chrome.storage.session.set({pendingFillInput:{text:i,timestamp:Date.now()}}).catch(()=>{}),chrome.runtime.sendMessage({type:`FILL_SIDEPANEL_INPUT`,text:i}).catch(()=>{r.debug(`[Background] Side Panel not open,fillcontentstorage,waiting Side Panel load`)}),!1}if(e.type===`DIRECT_SEND`){let t=n.tab?.id,i=e.text,a=e.selectedText||``;return r.debug(`[Background] received directsendrequested :`,i?.substring(0,50)),t&&(os(t),chrome.sidePanel.open({tabId:t}).catch(e=>{r.warn(`[Background] open Side Panel failed:`,e?.message||e)})),chrome.storage.session.set({pendingDirectSend:{text:i,selectedText:a,timestamp:Date.now()}}).catch(()=>{}),chrome.runtime.sendMessage({type:`DIRECT_SEND`,text:i,selectedText:a}).catch(()=>{r.debug(`[Background] Side Panel not open,sendcontentstorage,waiting Side Panel load`)}),!1}if(e.type===`TRIGGER_AGENT_HEALTH_CHECK`)return As.clear(),Ns(),!1;if(e.type===`OPTIONS_PAGE_OPEN`)return ks=!0,As.clear(),Ns(),!1;if(e.type===`OPTIONS_PAGE_CLOSED`)return ks=!1,!1;if(e.type===`AGENT_CONNECTION_CHANGED`)return chrome.runtime.sendMessage({type:`AGENT_CONNECTION_CHANGED`,connected:e.connected,agentId:e.agentId}).catch(()=>{}),e.connected&&e.agentId?(xt(),es=null,$o=null,Va(),As.clear(),Xi(),Ue(e.agentId,!0),Is(),Ci().then(e=>{e>0&&r.debug(`[Background] switchagent after loaded: ${e} MCP tool`)}).catch(()=>{}),Vi().then(e=>{e>0&&r.debug(`[Background] switchagent after loaded: ${e} RAG tool`)}).catch(()=>{}),setTimeout(()=>{Ns()},3e3)):e.connected||(Is(),$o=null,es=null,Va(),Ns()),!1;if(e.type===`CHECK_FILES_EXIST`){let t=e.paths||[];return t.length===0?(i({success:!0,results:{}}),!1):((async()=>{let e=await Promise.allSettled(t.map(e=>$e(e))),n={};e.forEach((e,r)=>{e.status===`fulfilled`&&e.value.success?n[t[r]]=e.value.exists:n[t[r]]=!0}),i({success:!0,results:n})})(),!0)}if(e.type===`AGENT_RESTART`)return(async()=>{i(await Et())})(),!0;if(e.type===`AGENT_UPDATE`)return(async()=>{i(await Dt())})(),!0;if(e.type===`AGENT_STOP`)return(async()=>{i(await Ot())})(),!0;if(e.type===`OPEN_LOCAL_PROTOTYPE`)return(async()=>{i(await tt(e.path))})(),!0;if(e.type===`DELETE_LOCAL_PROTOTYPE`)return(async()=>{try{let t=e.path.replace(/[\\/][^\\/]+\.html$/,``),n=await rt(t);n.success?r.debug(`[Background] local prototypefile deleted:`,t):r.warn(`[Background] local prototypefiledelete failed:`,n.error),i(n)}catch(e){r.warn(`[Background] local prototypefiledelete failed:`,e.message),i({success:!1,error:e.message})}})(),!0;if(e.type===`TASK_FEEDBACK_NOTIFY`)return on({success:!!e.success,sessionId:e.sessionId||null,error:e.error||``,source:`chat`,panelSnapshot:e.panel&&typeof e.panel==`object`?e.panel:null}).catch(()=>{}),!1;if(e.type?.startsWith(`SCHEDULED_TASK_`))return Lo(e,i);if(e.type===`QUERY_AUDIT_LOGS`)return kt({category:e.category,limit:e.limit}).then(e=>{i(e)}).catch(e=>{i({success:!1,error:e.message})}),!0});async function Es(e,t,n){r.debug(`[Background] processselected text AI search:`,e.substring(0,50)+`...`),await chrome.storage.session.set({pendingSelectionSearch:{prompt:e,selectedText:t,timestamp:Date.now()}}),chrome.runtime.sendMessage({type:`SELECTION_AI_SEARCH`,prompt:e,selectedText:t}).catch(()=>{r.debug(`[Background] Side Panel not open,searchcontentstorage,waiting Side Panel load`)})}var Ds=null,Os=null,ks=!1,As=new Map,js=new Map;async function Ms(e){let t=!1,n=5e3;try{let r=new AbortController,i=setTimeout(()=>r.abort(),n),a=await fetch(`${e.url}/api/status`,{signal:r.signal,cache:`no-cache`});clearTimeout(i),t=a.ok}catch{t=!1}if(!t){await new Promise(e=>setTimeout(e,500));try{let r=new AbortController,i=setTimeout(()=>r.abort(),n),a=await fetch(`${e.url}/api/status`,{signal:r.signal,cache:`no-cache`});clearTimeout(i),t=a.ok}catch{t=!1}}return t}async function Ns(){try{let e=await Je();if(e.length===0){As.size>0&&(As.clear(),Xi(),Ue(`__global__`,!1),Rs(!1,`未配对`));return}let t=await Ye(),n=e.filter(e=>!e.disabled),i=ks?n:t&&!t.disabled?[t]:[];if(i.length===0)return;let a=(await Promise.allSettled(i.map(async e=>{let t=await Ms(e);return As.get(e.id)===t?{agentId:e.id,name:e.name,connected:t,changed:!1}:(As.set(e.id,t),Ue(e.id,t),r.debug(`[Background] agent ${e.name} status change: ${t?`online`:`offline`}`),{agentId:e.id,name:e.name,connected:t,changed:!0})}))).filter(e=>e.status===`fulfilled`&&e.value.changed).map(e=>e.value);if(a.length>0){Xi();let e=a.find(e=>e.agentId===t?.id);e&&(Rs(e.connected,e.connected?`在线`:`离线`,e.agentId),e.connected?(Fs(e.agentId),Ci().then(e=>{e>0&&r.debug(`[Background] Agent after reconnect loaded: ${e} MCP tool`)}).catch(()=>{}),Vi().then(e=>{e>0&&r.debug(`[Background] Agent after reconnect loaded: ${e} RAG tool`)}).catch(()=>{})):(await Ti(),await Wi(),$o=null,r.debug(`[Background] Agent disconnect,cleaned MCP tool`),Ps(t)))}}catch(e){r.warn(`[Background] agenthealth checkexception:`,e.message)}}function Ps(e){if(!e||e.disabled||js.get(e.id))return;let t=n=>{if(n>=20){js.delete(e.id),r.debug(`[Background] agent ${e.name} auto reconnectabandoned (exceed maxretry times)`);return}let i=setTimeout(async()=>{let i=(await Je()).find(t=>t.id===e.id);if(!i||i.disabled){js.delete(e.id),r.debug(`[Background] agent ${e.name} ${i?.disabled?`disable`:`delete`},stopauto reconnect`);return}r.debug(`[Background] agent ${e.name} auto reconnectattempt ${n+1}/20`),await Ms(e)?(js.delete(e.id),As.set(e.id,!0),Ue(e.id,!0),Xi(),Rs(!0,`在线`,e.id),Ls(e.id),Ci().then(t=>{t>0&&r.debug(`[Background] Agent ${e.name} reconnect successful,loaded: ${t} MCP tool`)}).catch(()=>{}),Vi().then(t=>{t>0&&r.debug(`[Background] Agent ${e.name} reconnect successful,loaded: ${t} RAG tool`)}).catch(()=>{}),r.debug(`[Background] agent ${e.name} auto reconnect successful`)):t(n+1)},15e3);js.set(e.id,{timer:i,retries:n})};t(0)}function Fs(e){let t=js.get(e);t&&(clearTimeout(t.timer),js.delete(e))}function Is(){for(let[e,t]of js)clearTimeout(t.timer);js.clear()}async function Ls(e){try{let t=await Ye();t&&t.id===e&&(Ci().then(e=>{e>0&&r.debug(`[Background] active agentafter reconnect loaded: ${e} MCP tool`)}).catch(()=>{}),Vi().then(e=>{e>0&&r.debug(`[Background] active agentafter reconnect loaded: ${e} RAG tool`)}).catch(()=>{}))}catch(e){r.warn(`[Background] refreshactive agentstate failed:`,e.message)}}function Rs(e,t,n){chrome.runtime.sendMessage({type:`AGENT_STATUS_CHANGE`,connected:e,status:t,agentId:n}).catch(()=>{})}function zs(){Bs(),r.debug(`[Background] start Agent health check (30s interval)`),Ns(),Ds=setInterval(Ns,3e4),Hs()}function Bs(){Ds&&(clearInterval(Ds),Ds=null,As.clear()),Us()}async function Vs(){try{let e=await Ye();if(!e||e.disabled)return;let t=new AbortController,n=setTimeout(()=>t.abort(),5e3);try{await fetch(`${e.url}/api/heartbeat`,{headers:{Authorization:`Bearer ${e.token}`},signal:t.signal,cache:`no-cache`})}finally{clearTimeout(n)}}catch{}}function Hs(){Us(),Vs(),Os=setInterval(Vs,6e4)}function Us(){Os&&=(clearInterval(Os),null)}zs();
428
+ //# sourceMappingURL=background-CXWCRDE3.js.map