ai-helper-agent 2.2.0 → 2.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/README.md +94 -1
  2. package/README.zh-CN.md +94 -1
  3. package/dist/assets/{agent-store-DOyMdB_7.js → agent-store-DcAs6YyA.js} +2 -2
  4. package/dist/assets/{agent-store-DOyMdB_7.js.map → agent-store-DcAs6YyA.js.map} +1 -1
  5. package/dist/assets/background.js +83 -89
  6. package/dist/assets/background.js.map +1 -1
  7. package/dist/assets/content.js +81 -65
  8. package/dist/assets/{i18n-MmYITlVj.js → i18n-C4jSRoCH.js} +5 -5
  9. package/dist/assets/i18n-C4jSRoCH.js.map +1 -0
  10. package/dist/assets/{model-profiles-CV_sUuPf.js → model-profiles-Dl_MsXWa.js} +5 -5
  11. package/dist/assets/model-profiles-Dl_MsXWa.js.map +1 -0
  12. package/dist/assets/options-8-nu3P5K.css +1 -0
  13. package/dist/assets/options.js +264 -197
  14. package/dist/assets/options.js.map +1 -1
  15. package/dist/assets/{page-snapshot-renderer-CE53ibi-.js → page-snapshot-renderer-CVL6r6Kf.js} +2 -2
  16. package/dist/assets/{page-snapshot-renderer-CE53ibi-.js.map → page-snapshot-renderer-CVL6r6Kf.js.map} +1 -1
  17. package/dist/assets/{session-store-B0ZPGm7d.js → session-store-CzVQCgQ_.js} +4 -4
  18. package/dist/assets/session-store-CzVQCgQ_.js.map +1 -0
  19. package/dist/assets/side_panel.css +1 -1
  20. package/dist/assets/side_panel.js +327 -293
  21. package/dist/assets/side_panel.js.map +1 -1
  22. package/dist/assets/version-CNG2KGnJ.js +2 -0
  23. package/dist/assets/version-CNG2KGnJ.js.map +1 -0
  24. package/dist/libs/jspdf.min.js +1 -1
  25. package/dist/manifest.json +2 -2
  26. package/dist/offscreen/offscreen.js +4 -4
  27. package/dist/options.html +140 -3
  28. package/dist/side_panel.html +27 -4
  29. package/package.json +1 -1
  30. package/src/config.js +72 -24
  31. package/src/crypto-lite.js +31 -0
  32. package/src/locales/en.json +55 -0
  33. package/src/locales/zh.json +55 -0
  34. package/src/memory/embedding-config.js +95 -0
  35. package/src/memory/fusion.js +60 -0
  36. package/src/memory/injection.js +118 -0
  37. package/src/memory/routes.js +193 -0
  38. package/src/memory/service.js +957 -0
  39. package/src/memory/tags.js +62 -0
  40. package/src/memory/tier.js +37 -0
  41. package/src/memory/tokens.js +158 -0
  42. package/src/memory/vectors.js +128 -0
  43. package/src/rag/embedding/index.js +7 -0
  44. package/src/rag/embedding/local.js +25 -0
  45. package/src/rag/keyword-match.js +112 -0
  46. package/src/rag/manager.js +15 -0
  47. package/src/rag/searcher.js +15 -87
  48. package/src/server.js +6 -0
  49. package/dist/assets/i18n-MmYITlVj.js.map +0 -1
  50. package/dist/assets/model-profiles-CV_sUuPf.js.map +0 -1
  51. package/dist/assets/options-Df_1Dtn8.css +0 -1
  52. package/dist/assets/session-store-B0ZPGm7d.js.map +0 -1
  53. /package/dist/_locales/{zh → zh_CN}/messages.json +0 -0
@@ -1,4 +1,4 @@
1
- import{a as e,c as t}from"./i18n-MmYITlVj.js";e(`zh`,{pageInteraction:{refHint:`ref 编号仅本次查询有效,页面导航/刷新或切换 tab 后需重新 query_elements`,snapshotHeader:`可交互元素快照:{count} 个元素`,snapshotTruncated:`(共 {total} 个,已截断,请用 filterByText 缩小范围)`,snapshotPageInfo:`(第 {page}/{totalPages} 页,本次输出 {count} 个)`,snapshotHasMore:`还有更多元素:调用 query_elements 时带 page={next} 查看`,snapshotPageOutOfRange:`page={page} 超出范围(共 {totalPages} 页)`,snapshotOverlayBlock:`[打开层]`,snapshotBodyBlock:`[页面主体]`,snapshotFooter:`(ref 编号仅当前快照有效;页面变化后请重新调用 query_elements)`,snapshotHeaderFrames:`(含 {n} 个 iframe)`,snapshotFramesLimited:`(部分 iframe 超出数量/深度上限,未展开)`,snapshotFrameBlock:`[frame #{index}{title}{hostSeg}]`,snapshotFramePlaceholder:`iframe #{index}{title}`,snapshotFrameUnreachable:`(内容不可访问)`}}),e(`en`,{pageInteraction:{refHint:`ref numbers are only valid for the current query; re-run query_elements after page navigation/refresh or tab switch`,snapshotHeader:`Interactive elements snapshot: {count} element(s)`,snapshotTruncated:` (of {total} total; truncated — narrow down with filterByText)`,snapshotPageInfo:` (page {page}/{totalPages}, {count} shown)`,snapshotHasMore:`More elements available: call query_elements with page={next}`,snapshotPageOutOfRange:`page={page} is out of range (only {totalPages} page(s))`,snapshotOverlayBlock:`[Open overlays]`,snapshotBodyBlock:`[Page body]`,snapshotFooter:`(ref numbers are valid only for this snapshot; re-run query_elements after the page changes)`,snapshotHeaderFrames:` ({n} iframe(s))`,snapshotFramesLimited:` (some iframes exceed count/depth limits; not expanded)`,snapshotFrameBlock:`[frame #{index}{title}{hostSeg}]`,snapshotFramePlaceholder:`iframe #{index}{title}`,snapshotFrameUnreachable:` (content inaccessible)`}});function n(e){if(!e)return``;if(e===`about:srcdoc`)return`srcdoc`;if(e===`about:blank`)return`blank`;try{return new URL(e).hostname||``}catch{return``}}function r(e,t){for(let n of e)n.t===`el`&&n.localRef!=null&&t.push(n),n.children&&n.children.length&&r(n.children,t)}function i(e,n,r){if(e.status===`hidden`||e.status===`off`)return!1;let i=e.title?` "${e.title}"`:``,a;return a=e.status===`ok`&&e.frameIndex!=null?t(`pageInteraction.snapshotFramePlaceholder`,{index:e.frameIndex,title:i}):e.status===`unreachable`&&e.frameIndex!=null?t(`pageInteraction.snapshotFramePlaceholder`,{index:e.frameIndex,title:i})+t(`pageInteraction.snapshotFrameUnreachable`):`iframe${i}`,a=` `.repeat(e.depth||0)+a,r.budget-=a.length+1,n.push(a),!0}function a(e,t,n){if(!e)return!1;if(e.t===`frame`)return i(e,t,n);let r=[],o=!1;for(let t of e.children||[])a(t,r,n)&&(o=!0);if(e.t===`el`){if(e.localRef!=null&&n.selected.has(e)){if(n.budget<=0)return n.truncated=!0,o;let i=e.role||``,a=e.name||``,s=e.attrs||``,c=e.depth+i.length+(a?a.length+2:0)+(s?s.length+1:0)+12;if(n.budget-c<0)return n.truncated=!0,o;let l=`${` `.repeat(e.depth)}${i}${a?` "${a}"`:``} [ref ${e.localRef}]${s?` `+s:``}`;return n.budget-=l.length+1,n.count+=1,t.push(l,...r),!0}return o?(t.push(...r),!0):!1}if(e.t===`container`){if(o){let i=`${` `.repeat(e.depth)}${e.role}${e.name?` "${e.name}"`:``}`;return n.budget-=i.length+1,t.push(i,...r),!0}return!1}return o?(t.push(...r),!0):!1}function o(e,n,r){let i=[];if((e.overlayTrees||[]).length){for(let t of e.overlayTrees)a(t,i,r);i.length&&n.push(t(`pageInteraction.snapshotOverlayBlock`),...i,t(`pageInteraction.snapshotBodyBlock`))}for(let t of e.bodyTree||[])a(t,n,r)}function s(e={}){let{frames:i=[],page:a=1,maxResults:s=100,maxChars:c=6e3,countOnly:l=!1,frameCount:u=0,framesLimited:d=0}=e||{},f=Number.isInteger(a)&&a>=1?a:1,p=Math.max(1,s),m=[];for(let e of i)r(e.overlayTrees||[],m),r(e.bodyTree||[],m);let h=m.length;if(l)return{success:!0,content:``,count:h,total:h,truncated:!1,hint:``};let g=Math.ceil(h/p),_=u>0?t(`pageInteraction.snapshotHeaderFrames`,{n:u}):``,v=d>0?t(`pageInteraction.snapshotFramesLimited`):``;if(h>0&&f>g)return{success:!0,content:[t(`pageInteraction.snapshotHeader`,{count:h})+_+v,t(`pageInteraction.snapshotPageOutOfRange`,{page:f,totalPages:g}),t(`pageInteraction.snapshotFooter`)].join(`
1
+ import{a as e,c as t}from"./i18n-C4jSRoCH.js";e(`zh`,{pageInteraction:{refHint:`ref 编号仅本次查询有效,页面导航/刷新或切换 tab 后需重新 query_elements`,snapshotHeader:`可交互元素快照:{count} 个元素`,snapshotTruncated:`(共 {total} 个,已截断,请用 filterByText 缩小范围)`,snapshotPageInfo:`(第 {page}/{totalPages} 页,本次输出 {count} 个)`,snapshotHasMore:`还有更多元素:调用 query_elements 时带 page={next} 查看`,snapshotPageOutOfRange:`page={page} 超出范围(共 {totalPages} 页)`,snapshotOverlayBlock:`[打开层]`,snapshotBodyBlock:`[页面主体]`,snapshotFooter:`(ref 编号仅当前快照有效;页面变化后请重新调用 query_elements)`,snapshotHeaderFrames:`(含 {n} 个 iframe)`,snapshotFramesLimited:`(部分 iframe 超出数量/深度上限,未展开)`,snapshotFrameBlock:`[frame #{index}{title}{hostSeg}]`,snapshotFramePlaceholder:`iframe #{index}{title}`,snapshotFrameUnreachable:`(内容不可访问)`}}),e(`en`,{pageInteraction:{refHint:`ref numbers are only valid for the current query; re-run query_elements after page navigation/refresh or tab switch`,snapshotHeader:`Interactive elements snapshot: {count} element(s)`,snapshotTruncated:` (of {total} total; truncated — narrow down with filterByText)`,snapshotPageInfo:` (page {page}/{totalPages}, {count} shown)`,snapshotHasMore:`More elements available: call query_elements with page={next}`,snapshotPageOutOfRange:`page={page} is out of range (only {totalPages} page(s))`,snapshotOverlayBlock:`[Open overlays]`,snapshotBodyBlock:`[Page body]`,snapshotFooter:`(ref numbers are valid only for this snapshot; re-run query_elements after the page changes)`,snapshotHeaderFrames:` ({n} iframe(s))`,snapshotFramesLimited:` (some iframes exceed count/depth limits; not expanded)`,snapshotFrameBlock:`[frame #{index}{title}{hostSeg}]`,snapshotFramePlaceholder:`iframe #{index}{title}`,snapshotFrameUnreachable:` (content inaccessible)`}});function n(e){if(!e)return``;if(e===`about:srcdoc`)return`srcdoc`;if(e===`about:blank`)return`blank`;try{return new URL(e).hostname||``}catch{return``}}function r(e,t){for(let n of e)n.t===`el`&&n.localRef!=null&&t.push(n),n.children&&n.children.length&&r(n.children,t)}function i(e,n,r){if(e.status===`hidden`||e.status===`off`)return!1;let i=e.title?` "${e.title}"`:``,a;return a=e.status===`ok`&&e.frameIndex!=null?t(`pageInteraction.snapshotFramePlaceholder`,{index:e.frameIndex,title:i}):e.status===`unreachable`&&e.frameIndex!=null?t(`pageInteraction.snapshotFramePlaceholder`,{index:e.frameIndex,title:i})+t(`pageInteraction.snapshotFrameUnreachable`):`iframe${i}`,a=` `.repeat(e.depth||0)+a,r.budget-=a.length+1,n.push(a),!0}function a(e,t,n){if(!e)return!1;if(e.t===`frame`)return i(e,t,n);let r=[],o=!1;for(let t of e.children||[])a(t,r,n)&&(o=!0);if(e.t===`el`){if(e.localRef!=null&&n.selected.has(e)){if(n.budget<=0)return n.truncated=!0,o;let i=e.role||``,a=e.name||``,s=e.attrs||``,c=e.depth+i.length+(a?a.length+2:0)+(s?s.length+1:0)+12;if(n.budget-c<0)return n.truncated=!0,o;let l=`${` `.repeat(e.depth)}${i}${a?` "${a}"`:``} [ref ${e.localRef}]${s?` `+s:``}`;return n.budget-=l.length+1,n.count+=1,t.push(l,...r),!0}return o?(t.push(...r),!0):!1}if(e.t===`container`){if(o){let i=`${` `.repeat(e.depth)}${e.role}${e.name?` "${e.name}"`:``}`;return n.budget-=i.length+1,t.push(i,...r),!0}return!1}return o?(t.push(...r),!0):!1}function o(e,n,r){let i=[];if((e.overlayTrees||[]).length){for(let t of e.overlayTrees)a(t,i,r);i.length&&n.push(t(`pageInteraction.snapshotOverlayBlock`),...i,t(`pageInteraction.snapshotBodyBlock`))}for(let t of e.bodyTree||[])a(t,n,r)}function s(e={}){let{frames:i=[],page:a=1,maxResults:s=100,maxChars:c=6e3,countOnly:l=!1,frameCount:u=0,framesLimited:d=0}=e||{},f=Number.isInteger(a)&&a>=1?a:1,p=Math.max(1,s),m=[];for(let e of i)r(e.overlayTrees||[],m),r(e.bodyTree||[],m);let h=m.length;if(l)return{success:!0,content:``,count:h,total:h,truncated:!1,hint:``};let g=Math.ceil(h/p),_=u>0?t(`pageInteraction.snapshotHeaderFrames`,{n:u}):``,v=d>0?t(`pageInteraction.snapshotFramesLimited`):``;if(h>0&&f>g)return{success:!0,content:[t(`pageInteraction.snapshotHeader`,{count:h})+_+v,t(`pageInteraction.snapshotPageOutOfRange`,{page:f,totalPages:g}),t(`pageInteraction.snapshotFooter`)].join(`
2
2
  `),count:0,total:h,page:f,totalPages:g,hasMore:!1,truncated:!1,hint:``};let y=(f-1)*p,b=new Set(m.slice(y,y+p)),x=f<g,S={selected:b,budget:c,truncated:!1,count:0},C=[],w=i.find(e=>e.isTop)||i[0];w&&o(w,C,S);for(let e of i.filter(e=>e!==w)){let r=[];if(o(e,r,S),!r.length)continue;let i=` `.repeat(Math.max(0,(e.depth||1)-1)*2),a=e.frameInfo&&e.frameInfo.title?` "${e.frameInfo.title}"`:``,s=n(e.frameInfo&&e.frameInfo.url);C.push(i+t(`pageInteraction.snapshotFrameBlock`,{index:e.frameIndex,title:a,hostSeg:s?` · `+s:``}),...r.map(e=>i+` `+e))}let T=g>1,E=t(`pageInteraction.snapshotHeader`,{count:T?h:S.count})+_+v+(T?t(`pageInteraction.snapshotPageInfo`,{page:f,totalPages:g,count:S.count}):``)+(S.truncated?t(`pageInteraction.snapshotTruncated`,{total:h}):``);return C.unshift(E),x&&C.push(t(`pageInteraction.snapshotHasMore`,{next:f+1})),C.push(t(`pageInteraction.snapshotFooter`)),{success:!0,content:C.join(`
3
3
  `),count:S.count,total:h,page:f,totalPages:g,hasMore:x,truncated:S.truncated,hint:x?t(`pageInteraction.snapshotHasMore`,{next:f+1}):t(`pageInteraction.refHint`)}}export{s as t};
4
- //# sourceMappingURL=page-snapshot-renderer-CE53ibi-.js.map
4
+ //# sourceMappingURL=page-snapshot-renderer-CVL6r6Kf.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"page-snapshot-renderer-CE53ibi-.js","names":[],"sources":["../../src/shared/page-snapshot-renderer.js"],"sourcesContent":["// shared/page-snapshot-renderer.js - 页面元素快照唯一渲染出口(纯函数,content 与 background 共用)\n// 输入:各帧结构化 ops(嵌套 treeNode)+ 分页参数;输出:文本快照\n// 渲染语义逐条复刻阶段二 renderTree/queryInteractiveElements:子行先渲染、父行后决定、\n// 预算失败时子树丢弃但 childProduced 影响祖先容器行;容器行/iframe 占位行盲扣预算\nimport { t, registerTranslations } from './i18n.js';\n\nregisterTranslations('zh', {\n pageInteraction: {\n // —— 快照渲染(阶段三从 page-interaction.js 迁入 + 新增帧键)——\n refHint: 'ref 编号仅本次查询有效,页面导航/刷新或切换 tab 后需重新 query_elements',\n snapshotHeader: '可交互元素快照:{count} 个元素',\n snapshotTruncated: '(共 {total} 个,已截断,请用 filterByText 缩小范围)',\n snapshotPageInfo: '(第 {page}/{totalPages} 页,本次输出 {count} 个)',\n snapshotHasMore: '还有更多元素:调用 query_elements 时带 page={next} 查看',\n snapshotPageOutOfRange: 'page={page} 超出范围(共 {totalPages} 页)',\n snapshotOverlayBlock: '[打开层]',\n snapshotBodyBlock: '[页面主体]',\n snapshotFooter: '(ref 编号仅当前快照有效;页面变化后请重新调用 query_elements)',\n snapshotHeaderFrames: '(含 {n} 个 iframe)',\n snapshotFramesLimited: '(部分 iframe 超出数量/深度上限,未展开)',\n snapshotFrameBlock: '[frame #{index}{title}{hostSeg}]',\n snapshotFramePlaceholder: 'iframe #{index}{title}',\n snapshotFrameUnreachable: '(内容不可访问)',\n },\n});\n\nregisterTranslations('en', {\n pageInteraction: {\n refHint: 'ref numbers are only valid for the current query; re-run query_elements after page navigation/refresh or tab switch',\n snapshotHeader: 'Interactive elements snapshot: {count} element(s)',\n snapshotTruncated: ' (of {total} total; truncated — narrow down with filterByText)',\n snapshotPageInfo: ' (page {page}/{totalPages}, {count} shown)',\n snapshotHasMore: 'More elements available: call query_elements with page={next}',\n snapshotPageOutOfRange: 'page={page} is out of range (only {totalPages} page(s))',\n snapshotOverlayBlock: '[Open overlays]',\n snapshotBodyBlock: '[Page body]',\n snapshotFooter: '(ref numbers are valid only for this snapshot; re-run query_elements after the page changes)',\n snapshotHeaderFrames: ' ({n} iframe(s))',\n snapshotFramesLimited: ' (some iframes exceed count/depth limits; not expanded)',\n snapshotFrameBlock: '[frame #{index}{title}{hostSeg}]',\n snapshotFramePlaceholder: 'iframe #{index}{title}',\n snapshotFrameUnreachable: ' (content inaccessible)',\n },\n});\n\n/** 区块头 host 片段:主机名省字符;srcdoc/blank 特判 */\nfunction frameHost(url) {\n if (!url) return '';\n if (url === 'about:srcdoc') return 'srcdoc';\n if (url === 'about:blank') return 'blank';\n try { return new URL(url).hostname || ''; } catch { return ''; }\n}\n\n/** 先序收集树中可输出的 el 节点(全局 matched 流的数据源) */\nfunction collectMatchedNodes(nodes, out) {\n for (const node of nodes) {\n if (node.t === 'el' && node.localRef != null) out.push(node);\n if (node.children && node.children.length) collectMatchedNodes(node.children, out);\n }\n}\n\n/** iframe 占位行渲染:像容器行一样盲扣预算;excluded/未匹配不带编号 */\nfunction renderFrameNode(node, lines, ctx) {\n if (node.status === 'hidden' || node.status === 'off') return false;\n const titleSeg = node.title ? ` \"${node.title}\"` : '';\n let line;\n if (node.status === 'ok' && node.frameIndex != null) {\n line = t('pageInteraction.snapshotFramePlaceholder', { index: node.frameIndex, title: titleSeg });\n } else if (node.status === 'unreachable' && node.frameIndex != null) {\n line = t('pageInteraction.snapshotFramePlaceholder', { index: node.frameIndex, title: titleSeg })\n + t('pageInteraction.snapshotFrameUnreachable');\n } else {\n line = `iframe${titleSeg}`;\n }\n line = ' '.repeat(node.depth || 0) + line;\n ctx.budget -= line.length + 1;\n lines.push(line);\n return true;\n}\n\n/** 渲染单个 treeNode(复刻阶段二 renderTree 控制流),返回本子树是否产生输出行 */\nfunction renderNode(node, lines, ctx) {\n if (!node) return false;\n if (node.t === 'frame') return renderFrameNode(node, lines, ctx);\n\n const childLines = [];\n let childProduced = false;\n for (const child of (node.children || [])) {\n if (renderNode(child, childLines, ctx)) childProduced = true;\n }\n\n if (node.t === 'el') {\n if (node.localRef != null && ctx.selected.has(node)) {\n if (ctx.budget <= 0) { ctx.truncated = true; return childProduced; }\n const role = node.role || '';\n const name = node.name || '';\n const attrs = node.attrs || '';\n // 估算行长度(含 [ref NNNNN] 上限 12 字符)后再输出,控制字符预算\n const estimate = node.depth + role.length + (name ? name.length + 2 : 0) + (attrs ? attrs.length + 1 : 0) + 12;\n if (ctx.budget - estimate < 0) { ctx.truncated = true; return childProduced; }\n const line = `${' '.repeat(node.depth)}${role}${name ? ` \"${name}\"` : ''} [ref ${node.localRef}]${attrs ? ' ' + attrs : ''}`;\n ctx.budget -= line.length + 1;\n ctx.count += 1;\n lines.push(line, ...childLines); // DOM 顺序:父行在子行前\n return true;\n }\n // 未选中:透传子行(阶段二行为)\n if (childProduced) { lines.push(...childLines); return true; }\n return false;\n }\n\n if (node.t === 'container') {\n if (childProduced) {\n const line = `${' '.repeat(node.depth)}${node.role}${node.name ? ` \"${node.name}\"` : ''}`;\n ctx.budget -= line.length + 1; // 容器行盲扣预算(阶段二行为)\n lines.push(line, ...childLines);\n return true;\n }\n return false;\n }\n\n // 未知节点:透传子行\n if (childProduced) { lines.push(...childLines); return true; }\n return false;\n}\n\n/** 帧分区渲染:叠加层区块(产出时才打标记)→ 主体 */\nfunction renderFrameSection(frame, lines, ctx) {\n const overlayLines = [];\n if ((frame.overlayTrees || []).length) {\n for (const node of frame.overlayTrees) renderNode(node, overlayLines, ctx);\n if (overlayLines.length) {\n lines.push(t('pageInteraction.snapshotOverlayBlock'), ...overlayLines, t('pageInteraction.snapshotBodyBlock'));\n }\n }\n for (const node of (frame.bodyTree || [])) renderNode(node, lines, ctx);\n}\n\n/**\n * 渲染快照(唯一出口)。\n * 全局 matched 流 = 顶层(打开层→主体)→ 各帧按数组序(帧树先序,各帧内部 打开层→主体)。\n * 分页/预算跨帧统一;区块头缩进 (depth-1)*2,块内容额外缩进 2(缩进开销不计预算,近似)。\n */\nexport function renderSnapshot(options = {}) {\n const {\n frames = [],\n page = 1,\n maxResults = 100,\n maxChars = 6000,\n countOnly = false,\n frameCount = 0,\n framesLimited = 0,\n } = options || {};\n const pageNum = Number.isInteger(page) && page >= 1 ? page : 1;\n const pageSize = Math.max(1, maxResults);\n\n const stream = [];\n for (const frame of frames) {\n collectMatchedNodes(frame.overlayTrees || [], stream);\n collectMatchedNodes(frame.bodyTree || [], stream);\n }\n const total = stream.length;\n\n if (countOnly) {\n return { success: true, content: '', count: total, total, truncated: false, hint: '' };\n }\n\n const totalPages = Math.ceil(total / pageSize);\n const frameSuffix = frameCount > 0 ? t('pageInteraction.snapshotHeaderFrames', { n: frameCount }) : '';\n const limitNote = framesLimited > 0 ? t('pageInteraction.snapshotFramesLimited') : '';\n\n // 越界页:不渲染,返回范围提示(模型可自我纠正)\n if (total > 0 && pageNum > totalPages) {\n const content = [\n t('pageInteraction.snapshotHeader', { count: total }) + frameSuffix + limitNote,\n t('pageInteraction.snapshotPageOutOfRange', { page: pageNum, totalPages }),\n t('pageInteraction.snapshotFooter'),\n ].join('\\n');\n return { success: true, content, count: 0, total, page: pageNum, totalPages, hasMore: false, truncated: false, hint: '' };\n }\n\n const pageStart = (pageNum - 1) * pageSize;\n const selected = new Set(stream.slice(pageStart, pageStart + pageSize));\n const hasMore = pageNum < totalPages;\n const ctx = { selected, budget: maxChars, truncated: false, count: 0 };\n\n // 顶层:与阶段二逐字节一致(无帧时 frameSuffix/limitNote/区块均为空)\n const lines = [];\n const topFrame = frames.find(f => f.isTop) || frames[0];\n if (topFrame) renderFrameSection(topFrame, lines, ctx);\n\n // 各子帧区块(数组序=帧树先序;仅渲染出内容时输出区块头;区块头缩进 (depth-1)*2,块内容额外缩进 2)\n for (const frame of frames.filter(f => f !== topFrame)) {\n const blockLines = [];\n renderFrameSection(frame, blockLines, ctx);\n if (!blockLines.length) continue;\n const indent = ' '.repeat(Math.max(0, (frame.depth || 1) - 1) * 2);\n const titleSeg = frame.frameInfo && frame.frameInfo.title ? ` \"${frame.frameInfo.title}\"` : '';\n const host = frameHost(frame.frameInfo && frame.frameInfo.url);\n lines.push(\n indent + t('pageInteraction.snapshotFrameBlock', { index: frame.frameIndex, title: titleSeg, hostSeg: host ? ' · ' + host : '' }),\n ...blockLines.map(l => indent + ' ' + l),\n );\n }\n\n const paged = totalPages > 1;\n const header = t('pageInteraction.snapshotHeader', { count: paged ? total : ctx.count })\n + frameSuffix\n + limitNote\n + (paged ? t('pageInteraction.snapshotPageInfo', { page: pageNum, totalPages, count: ctx.count }) : '')\n + (ctx.truncated ? t('pageInteraction.snapshotTruncated', { total }) : '');\n lines.unshift(header);\n if (hasMore) lines.push(t('pageInteraction.snapshotHasMore', { next: pageNum + 1 }));\n lines.push(t('pageInteraction.snapshotFooter'));\n\n return {\n success: true,\n content: lines.join('\\n'),\n count: ctx.count,\n total,\n page: pageNum,\n totalPages,\n hasMore,\n truncated: ctx.truncated,\n hint: hasMore ? t('pageInteraction.snapshotHasMore', { next: pageNum + 1 }) : t('pageInteraction.refHint'),\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"page-snapshot-renderer-CVL6r6Kf.js","names":[],"sources":["../../src/shared/page-snapshot-renderer.js"],"sourcesContent":["// shared/page-snapshot-renderer.js - 页面元素快照唯一渲染出口(纯函数,content 与 background 共用)\n// 输入:各帧结构化 ops(嵌套 treeNode)+ 分页参数;输出:文本快照\n// 渲染语义逐条复刻阶段二 renderTree/queryInteractiveElements:子行先渲染、父行后决定、\n// 预算失败时子树丢弃但 childProduced 影响祖先容器行;容器行/iframe 占位行盲扣预算\nimport { t, registerTranslations } from './i18n.js';\n\nregisterTranslations('zh', {\n pageInteraction: {\n // —— 快照渲染(阶段三从 page-interaction.js 迁入 + 新增帧键)——\n refHint: 'ref 编号仅本次查询有效,页面导航/刷新或切换 tab 后需重新 query_elements',\n snapshotHeader: '可交互元素快照:{count} 个元素',\n snapshotTruncated: '(共 {total} 个,已截断,请用 filterByText 缩小范围)',\n snapshotPageInfo: '(第 {page}/{totalPages} 页,本次输出 {count} 个)',\n snapshotHasMore: '还有更多元素:调用 query_elements 时带 page={next} 查看',\n snapshotPageOutOfRange: 'page={page} 超出范围(共 {totalPages} 页)',\n snapshotOverlayBlock: '[打开层]',\n snapshotBodyBlock: '[页面主体]',\n snapshotFooter: '(ref 编号仅当前快照有效;页面变化后请重新调用 query_elements)',\n snapshotHeaderFrames: '(含 {n} 个 iframe)',\n snapshotFramesLimited: '(部分 iframe 超出数量/深度上限,未展开)',\n snapshotFrameBlock: '[frame #{index}{title}{hostSeg}]',\n snapshotFramePlaceholder: 'iframe #{index}{title}',\n snapshotFrameUnreachable: '(内容不可访问)',\n },\n});\n\nregisterTranslations('en', {\n pageInteraction: {\n refHint: 'ref numbers are only valid for the current query; re-run query_elements after page navigation/refresh or tab switch',\n snapshotHeader: 'Interactive elements snapshot: {count} element(s)',\n snapshotTruncated: ' (of {total} total; truncated — narrow down with filterByText)',\n snapshotPageInfo: ' (page {page}/{totalPages}, {count} shown)',\n snapshotHasMore: 'More elements available: call query_elements with page={next}',\n snapshotPageOutOfRange: 'page={page} is out of range (only {totalPages} page(s))',\n snapshotOverlayBlock: '[Open overlays]',\n snapshotBodyBlock: '[Page body]',\n snapshotFooter: '(ref numbers are valid only for this snapshot; re-run query_elements after the page changes)',\n snapshotHeaderFrames: ' ({n} iframe(s))',\n snapshotFramesLimited: ' (some iframes exceed count/depth limits; not expanded)',\n snapshotFrameBlock: '[frame #{index}{title}{hostSeg}]',\n snapshotFramePlaceholder: 'iframe #{index}{title}',\n snapshotFrameUnreachable: ' (content inaccessible)',\n },\n});\n\n/** 区块头 host 片段:主机名省字符;srcdoc/blank 特判 */\nfunction frameHost(url) {\n if (!url) return '';\n if (url === 'about:srcdoc') return 'srcdoc';\n if (url === 'about:blank') return 'blank';\n try { return new URL(url).hostname || ''; } catch { return ''; }\n}\n\n/** 先序收集树中可输出的 el 节点(全局 matched 流的数据源) */\nfunction collectMatchedNodes(nodes, out) {\n for (const node of nodes) {\n if (node.t === 'el' && node.localRef != null) out.push(node);\n if (node.children && node.children.length) collectMatchedNodes(node.children, out);\n }\n}\n\n/** iframe 占位行渲染:像容器行一样盲扣预算;excluded/未匹配不带编号 */\nfunction renderFrameNode(node, lines, ctx) {\n if (node.status === 'hidden' || node.status === 'off') return false;\n const titleSeg = node.title ? ` \"${node.title}\"` : '';\n let line;\n if (node.status === 'ok' && node.frameIndex != null) {\n line = t('pageInteraction.snapshotFramePlaceholder', { index: node.frameIndex, title: titleSeg });\n } else if (node.status === 'unreachable' && node.frameIndex != null) {\n line = t('pageInteraction.snapshotFramePlaceholder', { index: node.frameIndex, title: titleSeg })\n + t('pageInteraction.snapshotFrameUnreachable');\n } else {\n line = `iframe${titleSeg}`;\n }\n line = ' '.repeat(node.depth || 0) + line;\n ctx.budget -= line.length + 1;\n lines.push(line);\n return true;\n}\n\n/** 渲染单个 treeNode(复刻阶段二 renderTree 控制流),返回本子树是否产生输出行 */\nfunction renderNode(node, lines, ctx) {\n if (!node) return false;\n if (node.t === 'frame') return renderFrameNode(node, lines, ctx);\n\n const childLines = [];\n let childProduced = false;\n for (const child of (node.children || [])) {\n if (renderNode(child, childLines, ctx)) childProduced = true;\n }\n\n if (node.t === 'el') {\n if (node.localRef != null && ctx.selected.has(node)) {\n if (ctx.budget <= 0) { ctx.truncated = true; return childProduced; }\n const role = node.role || '';\n const name = node.name || '';\n const attrs = node.attrs || '';\n // 估算行长度(含 [ref NNNNN] 上限 12 字符)后再输出,控制字符预算\n const estimate = node.depth + role.length + (name ? name.length + 2 : 0) + (attrs ? attrs.length + 1 : 0) + 12;\n if (ctx.budget - estimate < 0) { ctx.truncated = true; return childProduced; }\n const line = `${' '.repeat(node.depth)}${role}${name ? ` \"${name}\"` : ''} [ref ${node.localRef}]${attrs ? ' ' + attrs : ''}`;\n ctx.budget -= line.length + 1;\n ctx.count += 1;\n lines.push(line, ...childLines); // DOM 顺序:父行在子行前\n return true;\n }\n // 未选中:透传子行(阶段二行为)\n if (childProduced) { lines.push(...childLines); return true; }\n return false;\n }\n\n if (node.t === 'container') {\n if (childProduced) {\n const line = `${' '.repeat(node.depth)}${node.role}${node.name ? ` \"${node.name}\"` : ''}`;\n ctx.budget -= line.length + 1; // 容器行盲扣预算(阶段二行为)\n lines.push(line, ...childLines);\n return true;\n }\n return false;\n }\n\n // 未知节点:透传子行\n if (childProduced) { lines.push(...childLines); return true; }\n return false;\n}\n\n/** 帧分区渲染:叠加层区块(产出时才打标记)→ 主体 */\nfunction renderFrameSection(frame, lines, ctx) {\n const overlayLines = [];\n if ((frame.overlayTrees || []).length) {\n for (const node of frame.overlayTrees) renderNode(node, overlayLines, ctx);\n if (overlayLines.length) {\n lines.push(t('pageInteraction.snapshotOverlayBlock'), ...overlayLines, t('pageInteraction.snapshotBodyBlock'));\n }\n }\n for (const node of (frame.bodyTree || [])) renderNode(node, lines, ctx);\n}\n\n/**\n * 渲染快照(唯一出口)。\n * 全局 matched 流 = 顶层(打开层→主体)→ 各帧按数组序(帧树先序,各帧内部 打开层→主体)。\n * 分页/预算跨帧统一;区块头缩进 (depth-1)*2,块内容额外缩进 2(缩进开销不计预算,近似)。\n */\nexport function renderSnapshot(options = {}) {\n const {\n frames = [],\n page = 1,\n maxResults = 100,\n maxChars = 6000,\n countOnly = false,\n frameCount = 0,\n framesLimited = 0,\n } = options || {};\n const pageNum = Number.isInteger(page) && page >= 1 ? page : 1;\n const pageSize = Math.max(1, maxResults);\n\n const stream = [];\n for (const frame of frames) {\n collectMatchedNodes(frame.overlayTrees || [], stream);\n collectMatchedNodes(frame.bodyTree || [], stream);\n }\n const total = stream.length;\n\n if (countOnly) {\n return { success: true, content: '', count: total, total, truncated: false, hint: '' };\n }\n\n const totalPages = Math.ceil(total / pageSize);\n const frameSuffix = frameCount > 0 ? t('pageInteraction.snapshotHeaderFrames', { n: frameCount }) : '';\n const limitNote = framesLimited > 0 ? t('pageInteraction.snapshotFramesLimited') : '';\n\n // 越界页:不渲染,返回范围提示(模型可自我纠正)\n if (total > 0 && pageNum > totalPages) {\n const content = [\n t('pageInteraction.snapshotHeader', { count: total }) + frameSuffix + limitNote,\n t('pageInteraction.snapshotPageOutOfRange', { page: pageNum, totalPages }),\n t('pageInteraction.snapshotFooter'),\n ].join('\\n');\n return { success: true, content, count: 0, total, page: pageNum, totalPages, hasMore: false, truncated: false, hint: '' };\n }\n\n const pageStart = (pageNum - 1) * pageSize;\n const selected = new Set(stream.slice(pageStart, pageStart + pageSize));\n const hasMore = pageNum < totalPages;\n const ctx = { selected, budget: maxChars, truncated: false, count: 0 };\n\n // 顶层:与阶段二逐字节一致(无帧时 frameSuffix/limitNote/区块均为空)\n const lines = [];\n const topFrame = frames.find(f => f.isTop) || frames[0];\n if (topFrame) renderFrameSection(topFrame, lines, ctx);\n\n // 各子帧区块(数组序=帧树先序;仅渲染出内容时输出区块头;区块头缩进 (depth-1)*2,块内容额外缩进 2)\n for (const frame of frames.filter(f => f !== topFrame)) {\n const blockLines = [];\n renderFrameSection(frame, blockLines, ctx);\n if (!blockLines.length) continue;\n const indent = ' '.repeat(Math.max(0, (frame.depth || 1) - 1) * 2);\n const titleSeg = frame.frameInfo && frame.frameInfo.title ? ` \"${frame.frameInfo.title}\"` : '';\n const host = frameHost(frame.frameInfo && frame.frameInfo.url);\n lines.push(\n indent + t('pageInteraction.snapshotFrameBlock', { index: frame.frameIndex, title: titleSeg, hostSeg: host ? ' · ' + host : '' }),\n ...blockLines.map(l => indent + ' ' + l),\n );\n }\n\n const paged = totalPages > 1;\n const header = t('pageInteraction.snapshotHeader', { count: paged ? total : ctx.count })\n + frameSuffix\n + limitNote\n + (paged ? t('pageInteraction.snapshotPageInfo', { page: pageNum, totalPages, count: ctx.count }) : '')\n + (ctx.truncated ? t('pageInteraction.snapshotTruncated', { total }) : '');\n lines.unshift(header);\n if (hasMore) lines.push(t('pageInteraction.snapshotHasMore', { next: pageNum + 1 }));\n lines.push(t('pageInteraction.snapshotFooter'));\n\n return {\n success: true,\n content: lines.join('\\n'),\n count: ctx.count,\n total,\n page: pageNum,\n totalPages,\n hasMore,\n truncated: ctx.truncated,\n hint: hasMore ? t('pageInteraction.snapshotHasMore', { next: pageNum + 1 }) : t('pageInteraction.refHint'),\n };\n}\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/agent-store-DOyMdB_7.js","assets/rolldown-runtime-C0FnF6B9.js","assets/i18n-MmYITlVj.js"])))=>i.map(i=>d[i]);
2
- import{a as e,c as t,l as n}from"./i18n-MmYITlVj.js";e(`zh`,{db:{sessionLabel:`会话 {id}`,archivedLabel:`[归档] {label}`}}),e(`en`,{db:{sessionLabel:`Session {id}`,archivedLabel:`[Archived] {label}`}});var r=`ai-helper-db`,i=6,a=6048e5,o=`react_checkpoint_`;function s(){return new Promise((e,t)=>{let a=indexedDB.open(r,i);a.onupgradeneeded=e=>{let t=e.target.result;if(t.objectStoreNames.contains(`sessions`)||t.createObjectStore(`sessions`,{keyPath:`id`}).createIndex(`updatedAt`,`updatedAt`,{unique:!1}),t.objectStoreNames.contains(`activeSession`)||t.createObjectStore(`activeSession`,{keyPath:`key`}),t.objectStoreNames.contains(`archivedSessions`)||t.createObjectStore(`archivedSessions`,{keyPath:`id`}).createIndex(`createdAt`,`createdAt`,{unique:!1}),!t.objectStoreNames.contains(`uiPrototypes`)){let e=t.createObjectStore(`uiPrototypes`,{keyPath:`id`});e.createIndex(`createdAt`,`createdAt`,{unique:!1}),e.createIndex(`sessionId`,`sessionId`,{unique:!1})}if(!t.objectStoreNames.contains(`tokenStats`)){let e=t.createObjectStore(`tokenStats`,{keyPath:`id`});e.createIndex(`sessionId`,`sessionId`,{unique:!1}),e.createIndex(`timestamp`,`timestamp`,{unique:!1})}if(t.objectStoreNames.contains(`reactCheckpoints`)||t.createObjectStore(`reactCheckpoints`,{keyPath:`sessionId`}).createIndex(`updatedAt`,`updatedAt`,{unique:!1}),!t.objectStoreNames.contains(`bookmarks`)){let e=t.createObjectStore(`bookmarks`,{keyPath:`id`});e.createIndex(`sessionId`,`sessionId`,{unique:!1}),e.createIndex(`createdAt`,`createdAt`,{unique:!1})}if(!t.objectStoreNames.contains(`scheduledTasks`)){let e=t.createObjectStore(`scheduledTasks`,{keyPath:`id`});e.createIndex(`nextRunAt`,`nextRunAt`,{unique:!1}),e.createIndex(`enabled`,`enabled`,{unique:!1})}},a.onsuccess=t=>{let r=t.target.result;r.onversionchange=e=>{n.debug(`[IDB] detected versionchange event,maindynamicclosecurrent connection as allows upgrade`);try{e.target.close()}catch{}c=null},e(r)},a.onerror=e=>{n.error(`[IDB] opendatabase failed:`,e.target.error),t(e.target.error)},a.onblocked=()=>{n.warn(`[IDB] databaseupgrade blocked (other connections notclose),waitingretry...`)}})}var c=null;function l(){c&&(c=null,n.debug(`[IDB] databaseconnectionreset`))}function u(){return c||=s(),c}function d(e,t,r,i=!1){return u().then(a=>new Promise((o,s)=>{let c=null,u=!1;if(!a.objectStoreNames.contains(e)){if(n.error(`[IDB] store "${e}" not found!current DB version: ${a.version}, store column table: [${Array.from(a.objectStoreNames).join(`, `)}]`),i){u=!0,s(Error(`Store "${e}" does not exist in database (version ${a.version})`));return}u=!0;try{a.close()}catch{}l(),setTimeout(()=>{d(e,t,r,!0).then(o).catch(s)},50);return}let f;try{f=a.transaction(e,t)}catch(a){if(n.error(`[IDB] create transaction failed (${e}):`,a.message),i){u=!0,s(a);return}u=!0,l(),setTimeout(()=>{d(e,t,r,!0).then(o).catch(s)},50);return}r(f.objectStore(e),e=>{c=e}),f.oncomplete=()=>{u||(u=!0,o(c))},f.onerror=a=>{if(u)return;u=!0;let c=a.target.error||Error(`Transaction error on ${e}`);n.error(`[IDB] transaction error (${e}):`,c),i?s(c):(l(),d(e,t,r,!0).then(o).catch(s))},f.onabort=()=>{u||(u=!0,i?s(Error(`Transaction aborted on ${e}`)):(l(),d(e,t,r,!0).then(o).catch(s)))}}))}function f(){return d(`sessions`,`readonly`,(e,t)=>{let n=e.getAll();n.onsuccess=()=>t(n.result||[]),n.onerror=()=>t([])})}function p(e){return d(`sessions`,`readonly`,(t,n)=>{let r=t.get(e);r.onsuccess=()=>n(r.result||null),r.onerror=()=>n(null)})}async function ee(e,t){if(!e||!t)return!1;try{let n=await p(e);if(!n||!n.messageHistory)return!1;let r=n.messageHistory.findIndex(e=>(e.messageId||e.id)===t);return r!==-1&&(n.messageHistory.splice(r,1),await m(n))}catch(e){return n.error(`[DB] deleteMessageFromSession failed:`,e),!1}}function m(e){return d(`sessions`,`readwrite`,(t,n)=>{let r=t.put(e);r.onsuccess=()=>n(!0),r.onerror=()=>n(!1)})}function te(e){return d(`sessions`,`readwrite`,(t,n)=>{let r=t.delete(e);r.onsuccess=()=>n(!0),r.onerror=()=>n(!1)})}function ne(e){return u().then(t=>new Promise(n=>{let r=t.transaction(`sessions`,`readwrite`),i=r.objectStore(`sessions`);e.forEach(e=>i.put(e)),r.oncomplete=()=>n(!0),r.onerror=()=>n(!1)}))}function h(){return d(`activeSession`,`readonly`,(e,t)=>{let n=e.get(`active`);n.onsuccess=()=>t(n.result?.sessionId||null),n.onerror=()=>t(null)})}function g(e){return d(`activeSession`,`readwrite`,(t,n)=>{let r=t.put({key:`active`,sessionId:e});r.onsuccess=()=>n(!0),r.onerror=()=>n(!1)})}function _(){return d(`archivedSessions`,`readonly`,(e,t)=>{let n=e.getAll();n.onsuccess=()=>t(n.result||[]),n.onerror=()=>t([])})}function re(e){return u().then(t=>new Promise(n=>{let r=t.transaction(`archivedSessions`,`readwrite`),i=r.objectStore(`archivedSessions`),a=i.clear();a.onsuccess=()=>{e.forEach(e=>i.put(e))},r.oncomplete=()=>n(!0),r.onerror=()=>n(!1)}))}function ie(e){let t=Date.now(),n={...e,createdAt:e.createdAt||t,updatedAt:t};return d(`uiPrototypes`,`readwrite`,(e,t)=>{let r=e.put(n);r.onsuccess=()=>t(n),r.onerror=()=>t(null)})}function ae(e){return d(`uiPrototypes`,`readonly`,(t,n)=>{let r=t.get(e);r.onsuccess=()=>n(r.result||null),r.onerror=()=>n(null)})}function oe(e=null){return d(`uiPrototypes`,`readonly`,(t,n)=>{let r=t.getAll();r.onsuccess=()=>{let t=r.result||[];e&&(t=t.filter(t=>t.sessionId===e)),t.sort((e,t)=>(t.createdAt||0)-(e.createdAt||0)),n(t)},r.onerror=()=>n([])})}function se(e){return d(`uiPrototypes`,`readwrite`,(t,n)=>{let r=t.delete(e);r.onsuccess=()=>n(!0),r.onerror=()=>n(!1)})}function ce(e){return e?p(e).then(e=>{if(!e)return[];let n=e.title||t(`db.sessionLabel`,{id:e.id?.slice(0,8)});return(e.messageHistory||[]).filter(e=>e.content).map((t,r)=>({session:e.id,sessionLabel:n,index:r,role:t.role,content:t.content}))}):f().then(e=>{let n=e,r=[];return n.forEach(e=>{let n=e.title||t(`db.sessionLabel`,{id:e.id?.slice(0,8)});(e.messageHistory||[]).forEach((t,i)=>{t.content&&r.push({session:e.id,sessionLabel:n,index:i,role:t.role,content:t.content})})}),r})}function le(){return _().then(e=>{let n=[];return e.forEach(e=>{let r=t(`db.archivedLabel`,{label:e.title||t(`db.sessionLabel`,{id:e.id?.slice(0,8)})});(e.messages||[]).forEach((t,i)=>{t.content&&n.push({session:e.id,sessionLabel:r,index:i,role:t.role,content:t.content})})}),n})}function ue(){return new Promise(e=>{chrome.storage.local.get([`sessions`,`conversationSessions`],async t=>{let r=!1;if(t.sessions?.list?.length>0){let{list:e,activeSessionId:i}=t.sessions;await ne(e),i&&await g(i),r=!0,n.debug(`[IDB] migrated activesession:`,e.length,``)}t.conversationSessions?.sessions?.length>0&&(await re(t.conversationSessions.sessions),r=!0,n.debug(`[IDB] migrated archivesession:`,t.conversationSessions.sessions.length,``)),r&&chrome.storage.local.remove([`sessions`,`conversationSessions`,`chatHistory`],()=>{n.debug(`[IDB] cleaned chrome.storage.local olddata`)}),e(r)})})}async function v(){(await f()).length>0||await h()||await ue()}async function de(e){if(!e?.sessionId)return!1;let t=Date.now(),r={...e,updatedAt:t,createdAt:e.createdAt||t},i=o+e.sessionId,a=!1;try{await chrome.storage.local.set({[i]:r}),a=!0}catch(e){n.warn(`[Storage] chrome.storage.local save checkpoint failed:`,e.message)}let s=!1;try{s=await d(`reactCheckpoints`,`readwrite`,(e,t)=>{let n=e.put(r);n.onsuccess=()=>t(!0),n.onerror=()=>t(!1)})}catch(e){n.warn(`[Storage] IndexedDB save checkpoint failed (downgraded to chrome.storage.local):`,e.message)}return!a&&!s?(n.error(`[Storage] checkpoint save complete failed:chrome.storage.local and IndexedDB averagenon- with `),!1):!0}async function fe(e){if(!e)return null;try{let t=await d(`reactCheckpoints`,`readonly`,(t,n)=>{let r=t.get(e);r.onsuccess=()=>n(r.result||null),r.onerror=()=>n(null)});if(t)return t}catch{}try{let t=o+e;return(await chrome.storage.local.get(t))[t]||null}catch(e){return n.warn(`[Storage] chrome.storage.local read checkpoint failed:`,e.message),null}}async function y(e){if(!e)return!1;let t=!1;try{let n=o+e;await chrome.storage.local.remove(n),t=!0}catch(e){n.warn(`[Storage] chrome.storage.local delete checkpoint failed:`,e.message)}try{await d(`reactCheckpoints`,`readwrite`,(t,n)=>{let r=t.delete(e);r.onsuccess=()=>n(!0),r.onerror=()=>n(!1)}),t=!0}catch{}return t}async function b(){let e=[];try{let t=await chrome.storage.local.get(null);for(let[n,r]of Object.entries(t))n.startsWith(o)&&r?.sessionId&&e.push(r)}catch(e){n.warn(`[Storage] chrome.storage.local get all checkpoint failed:`,e.message)}let t=[];try{t=await d(`reactCheckpoints`,`readonly`,(e,t)=>{let n=e.getAll();n.onsuccess=()=>t(n.result||[]),n.onerror=()=>t([])})}catch{}let r=new Map;for(let t of e)r.set(t.sessionId,t);for(let e of t)r.set(e.sessionId,e);return Array.from(r.values())}async function pe(){let e=await b(),t=Date.now(),r=e.filter(e=>(e.updatedAt||0)<t-a);if(r.length===0)return 0;let i=0;for(let e of r)await y(e.sessionId)&&i++;return n.debug(`[IDB] cleanup ${i} expired ReAct checkpoint`),i}function x(){return d(`bookmarks`,`readonly`,(e,t)=>{let n=e.getAll();n.onsuccess=()=>t(n.result||[]),n.onerror=()=>t([])})}function me(e){return d(`bookmarks`,`readwrite`,(t,n)=>{let r=t.put(e);r.onsuccess=()=>n(!0),r.onerror=()=>n(!1)})}function S(e){return d(`bookmarks`,`readwrite`,(t,n)=>{let r=t.delete(e);r.onsuccess=()=>n(!0),r.onerror=()=>n(!1)})}function he(e,t){return d(`bookmarks`,`readwrite`,(n,r)=>{let i=n.get(e);i.onsuccess=()=>{let e=i.result;if(!e){r(!1);return}e.pinned=t;let a=n.put(e);a.onsuccess=()=>r(!0),a.onerror=()=>r(!1)},i.onerror=()=>r(!1)})}function ge(e){return d(`scheduledTasks`,`readonly`,(t,n)=>{let r=t.get(e);r.onsuccess=()=>n(r.result||null),r.onerror=()=>n(null)})}function _e(){return d(`scheduledTasks`,`readonly`,(e,t)=>{let n=e.getAll();n.onsuccess=()=>t(n.result||[]),n.onerror=()=>t([])})}function ve(e){return d(`scheduledTasks`,`readwrite`,(t,n)=>{let r=t.put(e);r.onsuccess=()=>n(!0),r.onerror=()=>n(!1)})}function ye(e){return d(`scheduledTasks`,`readwrite`,(t,n)=>{let r=t.delete(e);r.onsuccess=()=>n(!0),r.onerror=()=>n(!1)})}var C=`tokenStats`,w=new Set([`selection_toolbar`]);function be(e){let t={id:`tcr_${Date.now()}_${Math.random().toString(36).slice(2,8)}`,sessionId:e.sessionId,timestamp:new Date().toISOString(),model:e.model||`unknown`,promptTokens:e.promptTokens||0,completionTokens:e.completionTokens||0,totalTokens:e.totalTokens||0,contextWindow:e.contextWindow||256e3,contextUsageRate:e.contextWindow>0?(e.promptTokens||0)/e.contextWindow:0,callType:e.callType||`unknown`};return d(C,`readwrite`,(e,n)=>{let r=e.put(t);r.onsuccess=()=>n(!0),r.onerror=()=>n(!1)})}function xe(e){return d(C,`readonly`,(t,n)=>{let r=t.index(`sessionId`),i=e?r.getAll(IDBKeyRange.bound(e,e+`￿`)):t.getAll();i.onsuccess=()=>{let t=(i.result||[]).filter(t=>t.sessionId===e||e&&t.sessionId?.startsWith(e+`_`));if(t.length===0){n({sessionId:e,totalPromptTokens:0,totalCompletionTokens:0,totalTokens:0,apiCallCount:0,avgContextUsageRate:0,maxContextUsageRate:0,minContextUsageRate:0,records:[]});return}let r=t.map(e=>e.contextUsageRate||0).filter(e=>e>0);n({sessionId:e,totalPromptTokens:t.reduce((e,t)=>e+(t.promptTokens||0),0),totalCompletionTokens:t.reduce((e,t)=>e+(t.completionTokens||0),0),totalTokens:t.reduce((e,t)=>e+(t.totalTokens||0),0),apiCallCount:t.length,avgContextUsageRate:r.length>0?r.reduce((e,t)=>e+t,0)/r.length:0,maxContextUsageRate:r.length>0?Math.max(...r):0,minContextUsageRate:r.length>0?Math.min(...r):0,records:t.sort((e,t)=>new Date(t.timestamp)-new Date(e.timestamp)).slice(0,20)})},i.onerror=()=>n(null)})}function Se(){return d(C,`readonly`,(e,t)=>{let n=e.getAll();n.onsuccess=()=>{let e=n.result||[];if(e.length===0){t({totalPromptTokens:0,totalCompletionTokens:0,totalTokens:0,totalApiCalls:0,totalSessions:0,lastUpdated:null});return}let r=new Set(e.map(e=>e.sessionId).filter(e=>e&&!w.has(e)));t({totalPromptTokens:e.reduce((e,t)=>e+(t.promptTokens||0),0),totalCompletionTokens:e.reduce((e,t)=>e+(t.completionTokens||0),0),totalTokens:e.reduce((e,t)=>e+(t.totalTokens||0),0),totalApiCalls:e.length,totalSessions:r.size,lastUpdated:e.reduce((e,t)=>t.timestamp>e?t.timestamp:e,``)})},n.onerror=()=>t(null)})}function Ce(){return d(C,`readwrite`,(e,t)=>{let n=e.clear();n.onsuccess=()=>t(!0),n.onerror=()=>t(!1)})}function we(e=30){return d(C,`readonly`,(t,n)=>{let r=new Date(new Date().getTime()-e*24*60*60*1e3),i=t.index(`timestamp`).getAll(IDBKeyRange.lowerBound(r.toISOString()));i.onsuccess=()=>{let e=i.result||[],t=new Map;e.forEach(e=>{let n=new Date(e.timestamp);if(n<r)return;let i=n.toISOString().split(`T`)[0];t.has(i)||t.set(i,{date:i,totalTokens:0,apiCalls:0});let a=t.get(i);a.totalTokens+=e.totalTokens||0,a.apiCalls+=1}),n(Array.from(t.values()).sort((e,t)=>e.date.localeCompare(t.date)))},i.onerror=()=>n([])})}function Te(e,t){return d(C,`readonly`,(n,r)=>{let i=n.index(`timestamp`).getAll(IDBKeyRange.bound(e,t));i.onsuccess=()=>{let n=i.result||[],a=new Date(e),o=new Date(t),s=n.filter(e=>{let t=new Date(e.timestamp);return t>=a&&t<=o});if(s.length===0){r({totalPromptTokens:0,totalCompletionTokens:0,totalTokens:0,totalApiCalls:0,totalSessions:0,lastUpdated:null});return}let c=new Set(s.map(e=>e.sessionId).filter(e=>e&&!w.has(e)));r({totalPromptTokens:s.reduce((e,t)=>e+(t.promptTokens||0),0),totalCompletionTokens:s.reduce((e,t)=>e+(t.completionTokens||0),0),totalTokens:s.reduce((e,t)=>e+(t.totalTokens||0),0),totalApiCalls:s.length,totalSessions:c.size,lastUpdated:s.reduce((e,t)=>t.timestamp>e?t.timestamp:e,``)})},i.onerror=()=>r(null)})}function Ee(){return d(C,`readonly`,(e,t)=>{let n=e.getAll();n.onsuccess=()=>{let e=n.result||[],r=new Map;e.forEach(e=>{let t=e.model||`unknown`;r.has(t)||r.set(t,0),r.set(t,r.get(t)+(e.totalTokens||0))});let i=Array.from(r.values()).reduce((e,t)=>e+t,0);t(Array.from(r.entries()).map(([e,t])=>({model:e,totalTokens:t,percentage:i>0?t/i*100:0})).sort((e,t)=>t.totalTokens-e.totalTokens))},n.onerror=()=>t([])})}function De(){return d(C,`readonly`,(e,t)=>{let n=e.getAll();n.onsuccess=()=>{let e=n.result||[],r=new Map;e.forEach(e=>{let t=e.callType||`unknown`;r.has(t)||r.set(t,0),r.set(t,r.get(t)+(e.totalTokens||0))});let i=Array.from(r.values()).reduce((e,t)=>e+t,0);t(Array.from(r.entries()).map(([e,t])=>({callType:e,totalTokens:t,percentage:i>0?t/i*100:0})).sort((e,t)=>t.totalTokens-e.totalTokens))},n.onerror=()=>t([])})}var Oe=[{id:`default`,name:`Default Assistant`,description:`All-purpose AI assistant with all tool capabilities`,icon:`🤖`,systemPrompt:null,toolIds:null,skillIds:null,isBuiltin:!0,allowSubDispatch:!1,model:null,temperature:null,topP:null}],ke=[{name:`Code Review Expert`,icon:`🔍`,description:`Focused on code review and quality assurance`,systemPrompt:`You are a senior Code Review Expert. Your responsibilities:
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/agent-store-DcAs6YyA.js","assets/rolldown-runtime-C0FnF6B9.js","assets/i18n-C4jSRoCH.js"])))=>i.map(i=>d[i]);
2
+ import{a as e,c as t,l as n}from"./i18n-C4jSRoCH.js";e(`zh`,{db:{sessionLabel:`会话 {id}`,archivedLabel:`[归档] {label}`}}),e(`en`,{db:{sessionLabel:`Session {id}`,archivedLabel:`[Archived] {label}`}});var r=`ai-helper-db`,i=6,a=6048e5,o=`react_checkpoint_`;function s(){return new Promise((e,t)=>{let a=indexedDB.open(r,i);a.onupgradeneeded=e=>{let t=e.target.result;if(t.objectStoreNames.contains(`sessions`)||t.createObjectStore(`sessions`,{keyPath:`id`}).createIndex(`updatedAt`,`updatedAt`,{unique:!1}),t.objectStoreNames.contains(`activeSession`)||t.createObjectStore(`activeSession`,{keyPath:`key`}),t.objectStoreNames.contains(`archivedSessions`)||t.createObjectStore(`archivedSessions`,{keyPath:`id`}).createIndex(`createdAt`,`createdAt`,{unique:!1}),!t.objectStoreNames.contains(`uiPrototypes`)){let e=t.createObjectStore(`uiPrototypes`,{keyPath:`id`});e.createIndex(`createdAt`,`createdAt`,{unique:!1}),e.createIndex(`sessionId`,`sessionId`,{unique:!1})}if(!t.objectStoreNames.contains(`tokenStats`)){let e=t.createObjectStore(`tokenStats`,{keyPath:`id`});e.createIndex(`sessionId`,`sessionId`,{unique:!1}),e.createIndex(`timestamp`,`timestamp`,{unique:!1})}if(t.objectStoreNames.contains(`reactCheckpoints`)||t.createObjectStore(`reactCheckpoints`,{keyPath:`sessionId`}).createIndex(`updatedAt`,`updatedAt`,{unique:!1}),!t.objectStoreNames.contains(`bookmarks`)){let e=t.createObjectStore(`bookmarks`,{keyPath:`id`});e.createIndex(`sessionId`,`sessionId`,{unique:!1}),e.createIndex(`createdAt`,`createdAt`,{unique:!1})}if(!t.objectStoreNames.contains(`scheduledTasks`)){let e=t.createObjectStore(`scheduledTasks`,{keyPath:`id`});e.createIndex(`nextRunAt`,`nextRunAt`,{unique:!1}),e.createIndex(`enabled`,`enabled`,{unique:!1})}},a.onsuccess=t=>{let r=t.target.result;r.onversionchange=e=>{n.debug(`[IDB] detected versionchange event,maindynamicclosecurrent connection as allows upgrade`);try{e.target.close()}catch{}c=null},e(r)},a.onerror=e=>{n.error(`[IDB] opendatabase failed:`,e.target.error),t(e.target.error)},a.onblocked=()=>{n.warn(`[IDB] databaseupgrade blocked (other connections notclose),waitingretry...`)}})}var c=null;function l(){c&&(c=null,n.debug(`[IDB] databaseconnectionreset`))}function u(){return c||=s(),c}function d(e,t,r,i=!1){return u().then(a=>new Promise((o,s)=>{let c=null,u=!1;if(!a.objectStoreNames.contains(e)){if(n.error(`[IDB] store "${e}" not found!current DB version: ${a.version}, store column table: [${Array.from(a.objectStoreNames).join(`, `)}]`),i){u=!0,s(Error(`Store "${e}" does not exist in database (version ${a.version})`));return}u=!0;try{a.close()}catch{}l(),setTimeout(()=>{d(e,t,r,!0).then(o).catch(s)},50);return}let f;try{f=a.transaction(e,t)}catch(a){if(n.error(`[IDB] create transaction failed (${e}):`,a.message),i){u=!0,s(a);return}u=!0,l(),setTimeout(()=>{d(e,t,r,!0).then(o).catch(s)},50);return}r(f.objectStore(e),e=>{c=e}),f.oncomplete=()=>{u||(u=!0,o(c))},f.onerror=a=>{if(u)return;u=!0;let c=a.target.error||Error(`Transaction error on ${e}`);n.error(`[IDB] transaction error (${e}):`,c),i?s(c):(l(),d(e,t,r,!0).then(o).catch(s))},f.onabort=()=>{u||(u=!0,i?s(Error(`Transaction aborted on ${e}`)):(l(),d(e,t,r,!0).then(o).catch(s)))}}))}function f(){return d(`sessions`,`readonly`,(e,t)=>{let n=e.getAll();n.onsuccess=()=>t(n.result||[]),n.onerror=()=>t([])})}function p(e){return d(`sessions`,`readonly`,(t,n)=>{let r=t.get(e);r.onsuccess=()=>n(r.result||null),r.onerror=()=>n(null)})}async function ee(e,t){if(!e||!t)return!1;try{let n=await p(e);if(!n||!n.messageHistory)return!1;let r=n.messageHistory.findIndex(e=>(e.messageId||e.id)===t);return r!==-1&&(n.messageHistory.splice(r,1),await m(n))}catch(e){return n.error(`[DB] deleteMessageFromSession failed:`,e),!1}}function m(e){return d(`sessions`,`readwrite`,(t,n)=>{let r=t.put(e);r.onsuccess=()=>n(!0),r.onerror=()=>n(!1)})}function te(e){return d(`sessions`,`readwrite`,(t,n)=>{let r=t.delete(e);r.onsuccess=()=>n(!0),r.onerror=()=>n(!1)})}function ne(e){return u().then(t=>new Promise(n=>{let r=t.transaction(`sessions`,`readwrite`),i=r.objectStore(`sessions`);e.forEach(e=>i.put(e)),r.oncomplete=()=>n(!0),r.onerror=()=>n(!1)}))}function h(){return d(`activeSession`,`readonly`,(e,t)=>{let n=e.get(`active`);n.onsuccess=()=>t(n.result?.sessionId||null),n.onerror=()=>t(null)})}function g(e){return d(`activeSession`,`readwrite`,(t,n)=>{let r=t.put({key:`active`,sessionId:e});r.onsuccess=()=>n(!0),r.onerror=()=>n(!1)})}function _(){return d(`archivedSessions`,`readonly`,(e,t)=>{let n=e.getAll();n.onsuccess=()=>t(n.result||[]),n.onerror=()=>t([])})}function re(e){return u().then(t=>new Promise(n=>{let r=t.transaction(`archivedSessions`,`readwrite`),i=r.objectStore(`archivedSessions`),a=i.clear();a.onsuccess=()=>{e.forEach(e=>i.put(e))},r.oncomplete=()=>n(!0),r.onerror=()=>n(!1)}))}function ie(e){let t=Date.now(),n={...e,createdAt:e.createdAt||t,updatedAt:t};return d(`uiPrototypes`,`readwrite`,(e,t)=>{let r=e.put(n);r.onsuccess=()=>t(n),r.onerror=()=>t(null)})}function ae(e){return d(`uiPrototypes`,`readonly`,(t,n)=>{let r=t.get(e);r.onsuccess=()=>n(r.result||null),r.onerror=()=>n(null)})}function oe(e=null){return d(`uiPrototypes`,`readonly`,(t,n)=>{let r=t.getAll();r.onsuccess=()=>{let t=r.result||[];e&&(t=t.filter(t=>t.sessionId===e)),t.sort((e,t)=>(t.createdAt||0)-(e.createdAt||0)),n(t)},r.onerror=()=>n([])})}function se(e){return d(`uiPrototypes`,`readwrite`,(t,n)=>{let r=t.delete(e);r.onsuccess=()=>n(!0),r.onerror=()=>n(!1)})}function ce(e){return e?p(e).then(e=>{if(!e)return[];let n=e.title||t(`db.sessionLabel`,{id:e.id?.slice(0,8)});return(e.messageHistory||[]).filter(e=>e.content).map((t,r)=>({session:e.id,sessionLabel:n,index:r,role:t.role,content:t.content}))}):f().then(e=>{let n=e,r=[];return n.forEach(e=>{let n=e.title||t(`db.sessionLabel`,{id:e.id?.slice(0,8)});(e.messageHistory||[]).forEach((t,i)=>{t.content&&r.push({session:e.id,sessionLabel:n,index:i,role:t.role,content:t.content})})}),r})}function le(){return _().then(e=>{let n=[];return e.forEach(e=>{let r=t(`db.archivedLabel`,{label:e.title||t(`db.sessionLabel`,{id:e.id?.slice(0,8)})});(e.messages||[]).forEach((t,i)=>{t.content&&n.push({session:e.id,sessionLabel:r,index:i,role:t.role,content:t.content})})}),n})}function ue(){return new Promise(e=>{chrome.storage.local.get([`sessions`,`conversationSessions`],async t=>{let r=!1;if(t.sessions?.list?.length>0){let{list:e,activeSessionId:i}=t.sessions;await ne(e),i&&await g(i),r=!0,n.debug(`[IDB] migrated activesession:`,e.length,``)}t.conversationSessions?.sessions?.length>0&&(await re(t.conversationSessions.sessions),r=!0,n.debug(`[IDB] migrated archivesession:`,t.conversationSessions.sessions.length,``)),r&&chrome.storage.local.remove([`sessions`,`conversationSessions`,`chatHistory`],()=>{n.debug(`[IDB] cleaned chrome.storage.local olddata`)}),e(r)})})}async function v(){(await f()).length>0||await h()||await ue()}async function de(e){if(!e?.sessionId)return!1;let t=Date.now(),r={...e,updatedAt:t,createdAt:e.createdAt||t},i=o+e.sessionId,a=!1;try{await chrome.storage.local.set({[i]:r}),a=!0}catch(e){n.warn(`[Storage] chrome.storage.local save checkpoint failed:`,e.message)}let s=!1;try{s=await d(`reactCheckpoints`,`readwrite`,(e,t)=>{let n=e.put(r);n.onsuccess=()=>t(!0),n.onerror=()=>t(!1)})}catch(e){n.warn(`[Storage] IndexedDB save checkpoint failed (downgraded to chrome.storage.local):`,e.message)}return!a&&!s?(n.error(`[Storage] checkpoint save complete failed:chrome.storage.local and IndexedDB averagenon- with `),!1):!0}async function fe(e){if(!e)return null;try{let t=await d(`reactCheckpoints`,`readonly`,(t,n)=>{let r=t.get(e);r.onsuccess=()=>n(r.result||null),r.onerror=()=>n(null)});if(t)return t}catch{}try{let t=o+e;return(await chrome.storage.local.get(t))[t]||null}catch(e){return n.warn(`[Storage] chrome.storage.local read checkpoint failed:`,e.message),null}}async function y(e){if(!e)return!1;let t=!1;try{let n=o+e;await chrome.storage.local.remove(n),t=!0}catch(e){n.warn(`[Storage] chrome.storage.local delete checkpoint failed:`,e.message)}try{await d(`reactCheckpoints`,`readwrite`,(t,n)=>{let r=t.delete(e);r.onsuccess=()=>n(!0),r.onerror=()=>n(!1)}),t=!0}catch{}return t}async function b(){let e=[];try{let t=await chrome.storage.local.get(null);for(let[n,r]of Object.entries(t))n.startsWith(o)&&r?.sessionId&&e.push(r)}catch(e){n.warn(`[Storage] chrome.storage.local get all checkpoint failed:`,e.message)}let t=[];try{t=await d(`reactCheckpoints`,`readonly`,(e,t)=>{let n=e.getAll();n.onsuccess=()=>t(n.result||[]),n.onerror=()=>t([])})}catch{}let r=new Map;for(let t of e)r.set(t.sessionId,t);for(let e of t)r.set(e.sessionId,e);return Array.from(r.values())}async function pe(){let e=await b(),t=Date.now(),r=e.filter(e=>(e.updatedAt||0)<t-a);if(r.length===0)return 0;let i=0;for(let e of r)await y(e.sessionId)&&i++;return n.debug(`[IDB] cleanup ${i} expired ReAct checkpoint`),i}function x(){return d(`bookmarks`,`readonly`,(e,t)=>{let n=e.getAll();n.onsuccess=()=>t(n.result||[]),n.onerror=()=>t([])})}function me(e){return d(`bookmarks`,`readwrite`,(t,n)=>{let r=t.put(e);r.onsuccess=()=>n(!0),r.onerror=()=>n(!1)})}function S(e){return d(`bookmarks`,`readwrite`,(t,n)=>{let r=t.delete(e);r.onsuccess=()=>n(!0),r.onerror=()=>n(!1)})}function he(e,t){return d(`bookmarks`,`readwrite`,(n,r)=>{let i=n.get(e);i.onsuccess=()=>{let e=i.result;if(!e){r(!1);return}e.pinned=t;let a=n.put(e);a.onsuccess=()=>r(!0),a.onerror=()=>r(!1)},i.onerror=()=>r(!1)})}function ge(e){return d(`scheduledTasks`,`readonly`,(t,n)=>{let r=t.get(e);r.onsuccess=()=>n(r.result||null),r.onerror=()=>n(null)})}function _e(){return d(`scheduledTasks`,`readonly`,(e,t)=>{let n=e.getAll();n.onsuccess=()=>t(n.result||[]),n.onerror=()=>t([])})}function ve(e){return d(`scheduledTasks`,`readwrite`,(t,n)=>{let r=t.put(e);r.onsuccess=()=>n(!0),r.onerror=()=>n(!1)})}function ye(e){return d(`scheduledTasks`,`readwrite`,(t,n)=>{let r=t.delete(e);r.onsuccess=()=>n(!0),r.onerror=()=>n(!1)})}var C=`tokenStats`,w=new Set([`selection_toolbar`]);function be(e){let t={id:`tcr_${Date.now()}_${Math.random().toString(36).slice(2,8)}`,sessionId:e.sessionId,timestamp:new Date().toISOString(),model:e.model||`unknown`,promptTokens:e.promptTokens||0,completionTokens:e.completionTokens||0,totalTokens:e.totalTokens||0,contextWindow:e.contextWindow||256e3,contextUsageRate:e.contextWindow>0?(e.promptTokens||0)/e.contextWindow:0,callType:e.callType||`unknown`};return d(C,`readwrite`,(e,n)=>{let r=e.put(t);r.onsuccess=()=>n(!0),r.onerror=()=>n(!1)})}function xe(e){return d(C,`readonly`,(t,n)=>{let r=t.index(`sessionId`),i=e?r.getAll(IDBKeyRange.bound(e,e+`￿`)):t.getAll();i.onsuccess=()=>{let t=(i.result||[]).filter(t=>t.sessionId===e||e&&t.sessionId?.startsWith(e+`_`));if(t.length===0){n({sessionId:e,totalPromptTokens:0,totalCompletionTokens:0,totalTokens:0,apiCallCount:0,avgContextUsageRate:0,maxContextUsageRate:0,minContextUsageRate:0,records:[]});return}let r=t.map(e=>e.contextUsageRate||0).filter(e=>e>0);n({sessionId:e,totalPromptTokens:t.reduce((e,t)=>e+(t.promptTokens||0),0),totalCompletionTokens:t.reduce((e,t)=>e+(t.completionTokens||0),0),totalTokens:t.reduce((e,t)=>e+(t.totalTokens||0),0),apiCallCount:t.length,avgContextUsageRate:r.length>0?r.reduce((e,t)=>e+t,0)/r.length:0,maxContextUsageRate:r.length>0?Math.max(...r):0,minContextUsageRate:r.length>0?Math.min(...r):0,records:t.sort((e,t)=>new Date(t.timestamp)-new Date(e.timestamp)).slice(0,20)})},i.onerror=()=>n(null)})}function Se(){return d(C,`readonly`,(e,t)=>{let n=e.getAll();n.onsuccess=()=>{let e=n.result||[];if(e.length===0){t({totalPromptTokens:0,totalCompletionTokens:0,totalTokens:0,totalApiCalls:0,totalSessions:0,lastUpdated:null});return}let r=new Set(e.map(e=>e.sessionId).filter(e=>e&&!w.has(e)));t({totalPromptTokens:e.reduce((e,t)=>e+(t.promptTokens||0),0),totalCompletionTokens:e.reduce((e,t)=>e+(t.completionTokens||0),0),totalTokens:e.reduce((e,t)=>e+(t.totalTokens||0),0),totalApiCalls:e.length,totalSessions:r.size,lastUpdated:e.reduce((e,t)=>t.timestamp>e?t.timestamp:e,``)})},n.onerror=()=>t(null)})}function Ce(){return d(C,`readwrite`,(e,t)=>{let n=e.clear();n.onsuccess=()=>t(!0),n.onerror=()=>t(!1)})}function we(e=30){return d(C,`readonly`,(t,n)=>{let r=new Date(new Date().getTime()-e*24*60*60*1e3),i=t.index(`timestamp`).getAll(IDBKeyRange.lowerBound(r.toISOString()));i.onsuccess=()=>{let e=i.result||[],t=new Map;e.forEach(e=>{let n=new Date(e.timestamp);if(n<r)return;let i=n.toISOString().split(`T`)[0];t.has(i)||t.set(i,{date:i,totalTokens:0,apiCalls:0});let a=t.get(i);a.totalTokens+=e.totalTokens||0,a.apiCalls+=1}),n(Array.from(t.values()).sort((e,t)=>e.date.localeCompare(t.date)))},i.onerror=()=>n([])})}function Te(e,t){return d(C,`readonly`,(n,r)=>{let i=n.index(`timestamp`).getAll(IDBKeyRange.bound(e,t));i.onsuccess=()=>{let n=i.result||[],a=new Date(e),o=new Date(t),s=n.filter(e=>{let t=new Date(e.timestamp);return t>=a&&t<=o});if(s.length===0){r({totalPromptTokens:0,totalCompletionTokens:0,totalTokens:0,totalApiCalls:0,totalSessions:0,lastUpdated:null});return}let c=new Set(s.map(e=>e.sessionId).filter(e=>e&&!w.has(e)));r({totalPromptTokens:s.reduce((e,t)=>e+(t.promptTokens||0),0),totalCompletionTokens:s.reduce((e,t)=>e+(t.completionTokens||0),0),totalTokens:s.reduce((e,t)=>e+(t.totalTokens||0),0),totalApiCalls:s.length,totalSessions:c.size,lastUpdated:s.reduce((e,t)=>t.timestamp>e?t.timestamp:e,``)})},i.onerror=()=>r(null)})}function Ee(){return d(C,`readonly`,(e,t)=>{let n=e.getAll();n.onsuccess=()=>{let e=n.result||[],r=new Map;e.forEach(e=>{let t=e.model||`unknown`;r.has(t)||r.set(t,0),r.set(t,r.get(t)+(e.totalTokens||0))});let i=Array.from(r.values()).reduce((e,t)=>e+t,0);t(Array.from(r.entries()).map(([e,t])=>({model:e,totalTokens:t,percentage:i>0?t/i*100:0})).sort((e,t)=>t.totalTokens-e.totalTokens))},n.onerror=()=>t([])})}function De(){return d(C,`readonly`,(e,t)=>{let n=e.getAll();n.onsuccess=()=>{let e=n.result||[],r=new Map;e.forEach(e=>{let t=e.callType||`unknown`;r.has(t)||r.set(t,0),r.set(t,r.get(t)+(e.totalTokens||0))});let i=Array.from(r.values()).reduce((e,t)=>e+t,0);t(Array.from(r.entries()).map(([e,t])=>({callType:e,totalTokens:t,percentage:i>0?t/i*100:0})).sort((e,t)=>t.totalTokens-e.totalTokens))},n.onerror=()=>t([])})}var Oe=[{id:`default`,name:`Default Assistant`,description:`All-purpose AI assistant with all tool capabilities`,icon:`🤖`,systemPrompt:null,toolIds:null,skillIds:null,isBuiltin:!0,allowSubDispatch:!1,model:null,temperature:null,topP:null}],ke=[{name:`Code Review Expert`,icon:`🔍`,description:`Focused on code review and quality assurance`,systemPrompt:`You are a senior Code Review Expert. Your responsibilities:
3
3
  1. Review code for logical correctness, performance, and security
4
4
  2. Check code style, naming conventions, and best practices
5
5
  3. Identify potential bugs, memory leaks, and concurrency issues
@@ -73,5 +73,5 @@ Writing principles:
73
73
  - 结构清晰:使用标题、列表和表格组织内容
74
74
  - 示例先行:关键概念必须附带代码或配置示例
75
75
  - 面向读者:根据目标受众调整技术深度
76
- - 保持简洁:避免冗余,每段文字都应承载信息`,toolIds:[`page_content`,`clipboard`,`search_browser_data`,`search_chats`,`fetch_url`,`agent_file`,`agent_search`,`extract_data`,`capture_page`,`search_in_page`],allowSubDispatch:!1}];function Ae(){return`agent_`+Date.now().toString(36)+`_`+Math.random().toString(36).substring(2,6)}var T=new Set,E=new Set,D=[],O=`deepseek-v4-pro`,k=null,A=[],j=!0,M=!0,N=null,P=!1,F=null,I=``,L=``,R=[],z=-1,B=-1,V=[],H=[],U=-1,W=null,G=-1,K=[],q=-1,je=`prompts`,Me=`prompts`,Ne=!1,Pe=-1,Fe=-1,Ie=-1,Le=null,Re=``,ze=[],Be=-1,Ve=null,He=null,Ue=null,We=null,Ge=[],Ke={platformName:`Unknown`,platform:`unknown`,arch:`unknown`,shell:`/bin/sh`,homeDir:`/home/user`,workdir:``,connected:!1},qe={maxMemoryMessages:20,enableExecutionLog:!1,showMessageTimestamp:!0},Je=.2,Ye=1,Xe=0,Ze=`all`,Qe=``,$e=[],et=[],tt={},J=new Map,nt=null,Y=new Map,rt=new Set,it=new Map,at=null,ot=null,st=null,ct=null,lt=null,ut=3e5,dt=null,ft=!1,pt=null,mt=[],ht=``,gt=null,_t=0,vt=0,yt=-1,bt=!1,xt=``,St=``,Ct=``,wt=[],Tt=!0,Et=[],Dt=new Map,Ot=new Map,kt=new Map,At=new Map,jt=!1,Mt=!1,Nt=new Map,X={get isGenerating(){return T.has(k)},set isGenerating(e){e?T.add(k):T.delete(k),document.dispatchEvent(new CustomEvent(`generating-state-changed`))},get generatingSessionIds(){return T},get completedSessionIds(){return E},set completedSessionIds(e){E=e},get messageHistory(){return D},set messageHistory(e){D=e},get currentModel(){return O},set currentModel(e){O=e},get activeSessionId(){return k},set activeSessionId(e){k=e},get sessions(){return A},set sessions(e){A=e},get useTools(){return j},set useTools(e){j=e},get isolateChat(){return M},set isolateChat(e){M=e},get activeCompaction(){return N},set activeCompaction(e){N=e},get enableSelectionQuery(){return P},set enableSelectionQuery(e){P=e},get currentTabId(){return F},set currentTabId(e){F=e},get selectedContextText(){return I},set selectedContextText(e){I=e},get quotedContextText(){return L},set quotedContextText(e){L=e},get customPrompts(){return R},set customPrompts(e){R=e},get selectedPromptIndex(){return z},set selectedPromptIndex(e){z=e},get selectedSkillIndex(){return B},set selectedSkillIndex(e){B=e},get selectedSkills(){return V},set selectedSkills(e){V=e},get selectedMcpServices(){return H},set selectedMcpServices(e){H=e},get selectedMcpServiceIndex(){return U},set selectedMcpServiceIndex(e){U=e},get selectedPage(){return W},set selectedPage(e){W=e},get selectedPageIndex(){return G},set selectedPageIndex(e){G=e},get knowledgeRefs(){return K},set knowledgeRefs(e){K=e},get selectedKnowledgeAtIndex(){return q},set selectedKnowledgeAtIndex(e){q=e},get activeDropdownTab(){return je},set activeDropdownTab(e){je=e},get lastActiveDropdownTab(){return Me},set lastActiveDropdownTab(e){Me=e},get showMergedList(){return Ne},set showMergedList(e){Ne=e},get selectedAgentAtIndex(){return Pe},set selectedAgentAtIndex(e){Pe=e},get selectedProxyAtIndex(){return Fe},set selectedProxyAtIndex(e){Fe=e},get selectedFileAtIndex(){return Ie},set selectedFileAtIndex(e){Ie=e},get draggedItemIndex(){return Le},set draggedItemIndex(e){Le=e},get systemPrompt(){return Re},set systemPrompt(e){Re=e},get activeAgentId(){return Ve},set activeAgentId(e){Ve=e},get activeAgentToolIds(){return He},set activeAgentToolIds(e){He=e},get activeAgentMcpExcludedServerIds(){return Ue},set activeAgentMcpExcludedServerIds(e){Ue=e},get activeAgentSkillIds(){return We},set activeAgentSkillIds(e){We=e},get customAgents(){return Ge},set customAgents(e){Ge=e},get agentPlatform(){return Ke},set agentPlatform(e){Object.assign(Ke,e)},get inputHistory(){return ze},set inputHistory(e){ze=e},get inputHistoryIndex(){return Be},set inputHistoryIndex(e){Be=e},get chatConfig(){return qe},set chatConfig(e){qe=e},get temperature(){return Je},set temperature(e){Je=e},get topP(){return Ye},set topP(e){Ye=e},get selectedTempIndex(){return Xe},set selectedTempIndex(e){Xe=e},get currentCategory(){return Ze},set currentCategory(e){Ze=e},get currentSearch(){return Qe},set currentSearch(e){Qe=e},get enabledTools(){return $e},set enabledTools(e){$e=e},get mcpClosedServers(){return et},set mcpClosedServers(e){et=e},get collapsedCategories(){return tt},get sessionExecutionStatus(){return J},set sessionExecutionStatus(e){J=e},get currentExecutionStatus(){return J.get(k)||null},set currentExecutionStatus(e){e===null?J.delete(k):J.set(k,e)},get executionLogListener(){return nt},set executionLogListener(e){nt=e},get pendingCancelApi(){return Y.get(k)||null},set pendingCancelApi(e){e===null?Y.delete(k):Y.set(k,e)},get pendingCancelApiMap(){return Y},get pendingCallApiSessionIds(){return rt},set pendingCallApiSessionIds(e){rt=e},get substituteLoadingIds(){return it},set substituteLoadingIds(e){it=e},get currentClarifyToolCallId(){return at},set currentClarifyToolCallId(e){at=e},get currentClarifySessionId(){return ot},set currentClarifySessionId(e){ot=e},get currentConfirmToolCallId(){return st},set currentConfirmToolCallId(e){st=e},get currentConfirmSessionId(){return ct},set currentConfirmSessionId(e){ct=e},get clarifyTimerInterval(){return lt},set clarifyTimerInterval(e){lt=e},get clarifyTimeoutValue(){return ut},set clarifyTimeoutValue(e){ut=e},get messageTocContainer(){return dt},set messageTocContainer(e){dt=e},get isMouseOverToc(){return ft},set isMouseOverToc(e){ft=e},get tocHideTimer(){return pt},set tocHideTimer(e){pt=e},get bookmarks(){return mt},set bookmarks(e){mt=e},get lastSelectedText(){return ht},set lastSelectedText(e){ht=e},get currentSelectionRange(){return gt},set currentSelectionRange(e){gt=e},get lastMouseX(){return _t},set lastMouseX(e){_t=e},get lastMouseY(){return vt},set lastMouseY(e){vt=e},get pendingDeleteIndex(){return yt},set pendingDeleteIndex(e){yt=e},get enableImageInput(){return bt},set enableImageInput(e){bt=e},get imageModelName(){return xt},set imageModelName(e){xt=e},get imageApiBase(){return St},set imageApiBase(e){St=e},get imageApiKey(){return Ct},set imageApiKey(e){Ct=e},get attachedImages(){return wt},set attachedImages(e){wt=e},get enableFileInput(){return Tt},set enableFileInput(e){Tt=e},get attachedFiles(){return Et},set attachedFiles(e){Et=e},get agentVersions(){return Dt},set agentVersions(e){Dt=e},get agentWorkdirs(){return Ot},set agentWorkdirs(e){Ot=e},get agentHomeDirs(){return kt},set agentHomeDirs(e){kt=e},get agentSystemInfos(){return At},set agentSystemInfos(e){At=e},get isScrolling(){return jt},set isScrolling(e){jt=e},get isComposing(){return Mt},set isComposing(e){Mt=e},get customModelMap(){return Nt},set customModelMap(e){Nt=e}},Pt=`modulepreload`,Ft=function(e){return`/`+e},It={},Lt=function(e,t,n){let r=Promise.resolve();if(t&&t.length>0){let e=document.getElementsByTagName(`link`),i=document.querySelector(`meta[property=csp-nonce]`),a=i?.nonce||i?.getAttribute(`nonce`);function o(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}function s(e){return import.meta.resolve?import.meta.resolve(e):new URL(e,import.meta.url).href}r=o(t.map(t=>{if(t=Ft(t,n),t=s(t),t in It)return;It[t]=!0;let r=t.endsWith(`.css`);for(let n=e.length-1;n>=0;n--){let i=e[n];if(i.href===t&&(!r||i.rel===`stylesheet`))return}let i=document.createElement(`link`);if(i.rel=r?`stylesheet`:Pt,r||(i.as=`script`),i.crossOrigin=``,i.href=t,a&&i.setAttribute(`nonce`,a),document.head.appendChild(i),r)return new Promise((e,n)=>{i.addEventListener(`load`,e),i.addEventListener(`error`,()=>n(Error(`Unable to preload CSS for ${t}`)))})}))}function i(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return r.then(t=>{for(let e of t||[])e.status===`rejected`&&i(e.reason);return e().catch(i)})};e(`zh`,{session:{newSession:`新会话`,importedSession:`导入的会话`,unnamedSession:`未命名会话`,restoredSession:`恢复的会话`,forkSuffix:`分叉`,sourceNotFound:`源会话不存在`,scheduledSession:`定时任务`}}),e(`en`,{session:{newSession:`New session`,importedSession:`Imported session`,unnamedSession:`Unnamed session`,restoredSession:`Restored session`,forkSuffix:`Fork`,sourceNotFound:`Source session not found`,scheduledSession:`Scheduled task`}});async function Rt(e){try{await y(e)}catch(e){n.warn(`[session-store] cleanup ReAct checkpoint failed:`,e)}}var zt=!1;async function Z(){zt||(await v(),zt=!0,Bt())}async function Bt(){try{let e=await f(),t=new Set(e.map(e=>e.id));t.add(`default`);let r=await chrome.storage.local.get(null),i=Object.keys(r).filter(e=>e.startsWith(`scrollPosition_`)&&!t.has(e.slice(15)));i.length>0&&(await chrome.storage.local.remove(i),n.debug(`[session-store] cleanup ${i.length} orphan scrollPosition key:`,i))}catch(e){n.warn(`[session-store] cleanup orphaned scrollPosition failed:`,e)}}async function Vt(){await Z();let[e,t]=await Promise.all([f(),h()]);return e.sort((e,t)=>e.order!==void 0&&t.order!==void 0?e.order-t.order:e.order===void 0?t.order===void 0?new Date(e.createdAt)-new Date(t.createdAt):1:-1),{activeSessionId:t,list:e}}function Q(e){return typeof e==`string`?e:Array.isArray(e)?e.filter(e=>e.type===`text`).map(e=>e.text).join(``):``}async function Ht(){if(!X.activeSessionId)return!1;let e=await p(X.activeSessionId);if(!e)return n.warn(`[SessionStore] saveCurrentSession cannot find currentsession:`,X.activeSessionId),!1;if(e.model=X.currentModel,e.useTools=X.useTools,e.enabledTools=[...X.enabledTools],e.agentId=X.activeAgentId||null,e.temperature=X.temperature,e.topP=X.topP,e.contextCompaction=X.activeCompaction||void 0,e.messageHistory=X.messageHistory.map(e=>({role:e.role,content:e.content||``,executionLog:e.executionLog||[],reflectionScore:e.reflectionScore,wasRevised:e.wasRevised||!1,htmlContent:e.htmlContent||void 0,messageId:e.messageId||void 0,timestamp:e.timestamp||void 0,contextBubbles:e.contextBubbles||void 0,resumable:e.resumable||!1})),e.updatedAt=new Date().toISOString(),!e.forkMetadata){let t=X.messageHistory.find(e=>e.role===`user`);t&&(e.title=Q(t.content).substring(0,50).replace(/\n/g,` `))}return await m(e)?!0:(n.error(`[SessionStore] putSession failed, sessionId:`,X.activeSessionId),!1)}async function Ut(){await Z();let e=$(),n={id:e,title:t(`session.newSession`),model:X.currentModel,useTools:X.useTools,enabledTools:[...X.enabledTools],agentId:X.activeAgentId||null,temperature:X.temperature,topP:X.topP,messageHistory:[],scrollPosition:0,createdAt:new Date().toISOString(),updatedAt:new Date().toISOString(),order:Date.now(),isGenerating:!1,lastExecutionLog:[]};return await m(n),await g(e),n}async function Wt(e){await Z();let n=[];for(let r of e){let e={id:$(),title:r.title||t(`session.importedSession`),model:r.model||X.currentModel,useTools:r.useTools===void 0||r.useTools,enabledTools:r.enabledTools||[...X.enabledTools],temperature:r.temperature===void 0?X.temperature:r.temperature,topP:r.topP===void 0?X.topP:r.topP,agentId:r.agentId||null,messageHistory:(r.messageHistory||[]).map(e=>({role:e.role,content:e.content||``,executionLog:e.executionLog||[],reflectionScore:e.reflectionScore,wasRevised:e.wasRevised||!1,htmlContent:e.htmlContent||void 0,messageId:e.messageId||void 0,timestamp:e.timestamp||void 0})),scrollPosition:0,createdAt:r.createdAt||new Date().toISOString(),updatedAt:new Date().toISOString(),order:Date.now()+n.length,isGenerating:!1,lastExecutionLog:[]};await m(e),n.push(e)}return!await h()&&n.length>0&&await g(n[0].id),n}async function Gt(e,t){let n=await p(e);return n?(n.messageHistory=n.messageHistory||[],n.messageHistory.push({role:t.role,content:t.content||``,executionLog:t.executionLog||[],reflectionScore:t.reflectionScore,wasRevised:t.wasRevised||!1,htmlContent:t.htmlContent||void 0,messageId:t.messageId||void 0,timestamp:t.timestamp||void 0,contextBubbles:t.contextBubbles||void 0}),n.updatedAt=new Date().toISOString(),n.isGenerating=!1,await m(n),!0):!1}function $(){return`sess_`+Date.now().toString(36)+`_`+Math.random().toString(36).substring(2,8)}async function Kt(e){if(e===X.activeSessionId)return;let t=Ht(),r=chrome.storage.local.get([`modelName`,`temperature`,`topP`]).catch(()=>({})),[i]=await Promise.all([p(e),t]);if(!i)return n.error(`[SessionStore] find not to session:`,e),!1;if(await g(e),X.activeSessionId=e,X.messageHistory=i.messageHistory||[],X.activeCompaction=i.contextCompaction||null,X.currentModel=i.model||X.currentModel,X.temperature=i.temperature===void 0?X.temperature:i.temperature,X.topP=i.topP===void 0?X.topP:i.topP,X.useTools=i.useTools===void 0?X.useTools:i.useTools,X.activeAgentId=i.agentId||null,i.agentId?chrome.storage.local.set({activeAssistantId:i.agentId}):chrome.storage.local.remove(`activeAssistantId`),i.agentId&&i.agentId!=="default")try{let{getAgent:e}=await Lt(async()=>{let{getAgent:e}=await import(`./agent-store-DOyMdB_7.js`).then(e=>e.t);return{getAgent:e}},__vite__mapDeps([0,1,2])),t=await e(i.agentId);t&&(t.model&&(X.currentModel=t.model),t.temperature!==null&&t.temperature!==void 0&&(X.temperature=t.temperature,X.topP=t.topP!==null&&t.topP!==void 0?t.topP:1),document.dispatchEvent(new CustomEvent(`agent-model-changed`)))}catch{}else{let e=await r;e.modelName&&(X.currentModel=e.modelName),e.temperature!==void 0&&(X.temperature=e.temperature),e.topP!==void 0&&(X.topP=e.topP),document.dispatchEvent(new CustomEvent(`agent-model-changed`))}return i.isGenerating&&X.pendingCallApiSessionIds.has(e)?X.generatingSessionIds.add(e):i.isGenerating&&(n.debug(`[SessionStore] detected expiredperiod isGenerating mark,async cleanup:`,e),(async()=>{try{let t=await p(e);t&&(t.isGenerating=!1,await m(t))}catch(e){n.warn(`[SessionStore] cleanup expired isGenerating mark failed:`,e)}})()),i}async function qt(e){let t=await f(),r=await h();await te(e),chrome.storage.local.remove(`scrollPosition_`+e),await Rt(e);try{let t=(await x()).filter(t=>t.sessionId===e);for(let e of t)await S(e.id);t.length>0&&n.info(`[SessionStore] cleaned ${t.length} bookmark (session ${e} deleted)`)}catch(e){n.warn(`[SessionStore] cleanup bookmarks failed:`,e)}if(r===e){let n=[...t].sort((e,t)=>e.order!==void 0&&t.order!==void 0?e.order-t.order:e.order===void 0?t.order===void 0?new Date(e.createdAt)-new Date(t.createdAt):1:-1),r=n.findIndex(t=>t.id===e),i=n.filter(t=>t.id!==e);i.length>0?await g(i[Math.min(r,i.length-1)].id):await g(null)}return!0}async function Jt(e,t){let n=await p(e);return n?(n.title=t,n.updatedAt=new Date().toISOString(),await m(n),!0):!1}async function Yt(e){let t=await f(),n=new Map(t.map(e=>[e.id,e])),r=[];return e.forEach((e,t)=>{let i=n.get(e);i&&(i.order=t,r.push(m(i)))}),await Promise.all(r),!0}async function Xt(){if(!X.messageHistory||X.messageHistory.length===0)return;let e=await p(X.activeSessionId);if(!e)return;let n=X.messageHistory.find(e=>e.role===`user`),r=n?Q(n.content).substring(0,50).replace(/\n/g,` `):e.title||t(`session.unnamedSession`),i=Date.now().toString(36)+Math.random().toString(36).substring(2,8),a=X.messageHistory.map(e=>({role:e.role,content:e.content||``,executionLog:e.executionLog||[],reflectionScore:e.reflectionScore,wasRevised:e.wasRevised||!1,htmlContent:e.htmlContent||void 0})),o=await _();o.push({id:i,title:r,createdAt:new Date().toISOString(),messages:a}),o.length>20&&o.splice(0,o.length-20),await re(o);let s=await Ut();return await qt(e.id),await Kt(s.id),!0}async function Zt(e,n=null){await Z();let r=await p(e);if(!r)throw Error(t(`session.sourceNotFound`));let i=$(),a=new Date().toISOString(),o=r.messageHistory||[],s=!1;if(n){let e=o.findIndex(e=>e.messageId===n);e>=0&&(o=o.slice(0,e+1),s=!0)}let c=o.map(e=>({...e,executionLog:Array.isArray(e.executionLog)?[...e.executionLog]:[],contextBubbles:Array.isArray(e.contextBubbles)?[...e.contextBubbles]:void 0,messageId:`msg_`+Date.now().toString(36)+`_`+Math.random().toString(36).substring(2,8)})),l={...r,id:i,title:`${r.title||t(`session.newSession`)} - ${t(`session.forkSuffix`)}`,messageHistory:c,isGenerating:!1,lastExecutionLog:[],scrollPosition:0,createdAt:a,updatedAt:a,order:Date.now(),forkMetadata:{sourceSessionId:e,forkedAt:a,...s?{upToMessageId:n}:{}}};return await m(l),await g(i),l}async function Qt(e){await Z();let n={id:$(),title:e.name||t(`session.scheduledSession`),model:e.model||null,useTools:e.useTools==null?null:e.useTools,enabledTools:null,agentId:e.agentId||null,temperature:e.temperature==null?null:e.temperature,topP:e.topP==null?null:e.topP,messageHistory:[],scrollPosition:0,createdAt:new Date().toISOString(),updatedAt:new Date().toISOString(),order:Date.now(),isGenerating:!1,lastExecutionLog:[],scheduledTaskId:e.id};return await m(n),n}export{ye as A,ge as B,De as C,S as D,pe as E,b as F,ve as G,ae as H,_e as I,ce as J,de as K,f as L,v as M,h as N,ee as O,x as P,le as R,xe as S,be as T,oe as U,p as V,me as W,he as Y,Ae as _,qt as a,Se as b,Vt as c,Ht as d,Kt as f,Oe as g,ke as h,Ut as i,se as j,y as k,Jt as l,X as m,Xt as n,Zt as o,Lt as p,ie as q,Qt as r,Wt as s,Gt as t,Yt as u,Ce as v,Ee as w,Te as x,we as y,fe as z};
77
- //# sourceMappingURL=session-store-B0ZPGm7d.js.map
76
+ - 保持简洁:避免冗余,每段文字都应承载信息`,toolIds:[`page_content`,`clipboard`,`search_browser_data`,`search_chats`,`fetch_url`,`agent_file`,`agent_search`,`extract_data`,`capture_page`,`search_in_page`],allowSubDispatch:!1}];function Ae(){return`agent_`+Date.now().toString(36)+`_`+Math.random().toString(36).substring(2,6)}var je=[{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:{}}}}],T=new Set,E=new Set,D=[],O=`deepseek-v4-pro`,k=null,A=[],j=!0,M=!0,N=null,P=!1,F=null,I=``,L=``,R=[],z=-1,B=-1,V=[],H=[],U=-1,W=null,G=-1,K=[],q=-1,Me=`prompts`,Ne=`prompts`,Pe=!1,Fe=-1,Ie=-1,Le=-1,Re=null,ze=``,J=[],Be=-1,Ve=null,He=null,Ue=null,We=null,Ge=[],Ke={platformName:`Unknown`,platform:`unknown`,arch:`unknown`,shell:`/bin/sh`,homeDir:`/home/user`,workdir:``,connected:!1},qe={maxMemoryMessages:20,enableExecutionLog:!1,showMessageTimestamp:!0,autoCompaction:!1,autoCompactionThreshold:.85,persistSummaryToMemory:!0},Je=.2,Ye=1,Xe=0,Ze=`all`,Qe=``,$e=[],et=[],tt={},Y=new Map,nt=null,X=new Map,rt=new Set,it=new Map,at=null,ot=null,st=null,ct=null,lt=null,ut=3e5,dt=null,ft=!1,pt=null,mt=[],ht=``,gt=null,_t=0,vt=0,yt=-1,bt=!1,xt=``,St=``,Ct=``,wt=[],Tt=!0,Et=[],Dt=new Map,Ot=new Map,kt=new Map,At=new Map,jt=!1,Mt=!1,Nt=new Map,Z={get isGenerating(){return T.has(k)},set isGenerating(e){e?T.add(k):T.delete(k),document.dispatchEvent(new CustomEvent(`generating-state-changed`))},get generatingSessionIds(){return T},get completedSessionIds(){return E},set completedSessionIds(e){E=e},get messageHistory(){return D},set messageHistory(e){D=e},get currentModel(){return O},set currentModel(e){O=e},get activeSessionId(){return k},set activeSessionId(e){k=e},get sessions(){return A},set sessions(e){A=e},get useTools(){return j},set useTools(e){j=e},get isolateChat(){return M},set isolateChat(e){M=e},get activeCompaction(){return N},set activeCompaction(e){N=e},get enableSelectionQuery(){return P},set enableSelectionQuery(e){P=e},get currentTabId(){return F},set currentTabId(e){F=e},get selectedContextText(){return I},set selectedContextText(e){I=e},get quotedContextText(){return L},set quotedContextText(e){L=e},get customPrompts(){return R},set customPrompts(e){R=e},get selectedPromptIndex(){return z},set selectedPromptIndex(e){z=e},get selectedSkillIndex(){return B},set selectedSkillIndex(e){B=e},get selectedSkills(){return V},set selectedSkills(e){V=e},get selectedMcpServices(){return H},set selectedMcpServices(e){H=e},get selectedMcpServiceIndex(){return U},set selectedMcpServiceIndex(e){U=e},get selectedPage(){return W},set selectedPage(e){W=e},get selectedPageIndex(){return G},set selectedPageIndex(e){G=e},get knowledgeRefs(){return K},set knowledgeRefs(e){K=e},get selectedKnowledgeAtIndex(){return q},set selectedKnowledgeAtIndex(e){q=e},get activeDropdownTab(){return Me},set activeDropdownTab(e){Me=e},get lastActiveDropdownTab(){return Ne},set lastActiveDropdownTab(e){Ne=e},get showMergedList(){return Pe},set showMergedList(e){Pe=e},get selectedAgentAtIndex(){return Fe},set selectedAgentAtIndex(e){Fe=e},get selectedProxyAtIndex(){return Ie},set selectedProxyAtIndex(e){Ie=e},get selectedFileAtIndex(){return Le},set selectedFileAtIndex(e){Le=e},get draggedItemIndex(){return Re},set draggedItemIndex(e){Re=e},get systemPrompt(){return ze},set systemPrompt(e){ze=e},get activeAgentId(){return Ve},set activeAgentId(e){Ve=e},get activeAgentToolIds(){return He},set activeAgentToolIds(e){He=e},get activeAgentMcpExcludedServerIds(){return Ue},set activeAgentMcpExcludedServerIds(e){Ue=e},get activeAgentSkillIds(){return We},set activeAgentSkillIds(e){We=e},get customAgents(){return Ge},set customAgents(e){Ge=e},get agentPlatform(){return Ke},set agentPlatform(e){Object.assign(Ke,e)},get inputHistory(){return J},set inputHistory(e){J=e},get inputHistoryIndex(){return Be},set inputHistoryIndex(e){Be=e},get chatConfig(){return qe},set chatConfig(e){qe=e},get temperature(){return Je},set temperature(e){Je=e},get topP(){return Ye},set topP(e){Ye=e},get selectedTempIndex(){return Xe},set selectedTempIndex(e){Xe=e},get currentCategory(){return Ze},set currentCategory(e){Ze=e},get currentSearch(){return Qe},set currentSearch(e){Qe=e},get enabledTools(){return $e},set enabledTools(e){$e=e},get mcpClosedServers(){return et},set mcpClosedServers(e){et=e},get collapsedCategories(){return tt},get sessionExecutionStatus(){return Y},set sessionExecutionStatus(e){Y=e},get currentExecutionStatus(){return Y.get(k)||null},set currentExecutionStatus(e){e===null?Y.delete(k):Y.set(k,e)},get executionLogListener(){return nt},set executionLogListener(e){nt=e},get pendingCancelApi(){return X.get(k)||null},set pendingCancelApi(e){e===null?X.delete(k):X.set(k,e)},get pendingCancelApiMap(){return X},get pendingCallApiSessionIds(){return rt},set pendingCallApiSessionIds(e){rt=e},get substituteLoadingIds(){return it},set substituteLoadingIds(e){it=e},get currentClarifyToolCallId(){return at},set currentClarifyToolCallId(e){at=e},get currentClarifySessionId(){return ot},set currentClarifySessionId(e){ot=e},get currentConfirmToolCallId(){return st},set currentConfirmToolCallId(e){st=e},get currentConfirmSessionId(){return ct},set currentConfirmSessionId(e){ct=e},get clarifyTimerInterval(){return lt},set clarifyTimerInterval(e){lt=e},get clarifyTimeoutValue(){return ut},set clarifyTimeoutValue(e){ut=e},get messageTocContainer(){return dt},set messageTocContainer(e){dt=e},get isMouseOverToc(){return ft},set isMouseOverToc(e){ft=e},get tocHideTimer(){return pt},set tocHideTimer(e){pt=e},get bookmarks(){return mt},set bookmarks(e){mt=e},get lastSelectedText(){return ht},set lastSelectedText(e){ht=e},get currentSelectionRange(){return gt},set currentSelectionRange(e){gt=e},get lastMouseX(){return _t},set lastMouseX(e){_t=e},get lastMouseY(){return vt},set lastMouseY(e){vt=e},get pendingDeleteIndex(){return yt},set pendingDeleteIndex(e){yt=e},get enableImageInput(){return bt},set enableImageInput(e){bt=e},get imageModelName(){return xt},set imageModelName(e){xt=e},get imageApiBase(){return St},set imageApiBase(e){St=e},get imageApiKey(){return Ct},set imageApiKey(e){Ct=e},get attachedImages(){return wt},set attachedImages(e){wt=e},get enableFileInput(){return Tt},set enableFileInput(e){Tt=e},get attachedFiles(){return Et},set attachedFiles(e){Et=e},get agentVersions(){return Dt},set agentVersions(e){Dt=e},get agentWorkdirs(){return Ot},set agentWorkdirs(e){Ot=e},get agentHomeDirs(){return kt},set agentHomeDirs(e){kt=e},get agentSystemInfos(){return At},set agentSystemInfos(e){At=e},get isScrolling(){return jt},set isScrolling(e){jt=e},get isComposing(){return Mt},set isComposing(e){Mt=e},get customModelMap(){return Nt},set customModelMap(e){Nt=e}},Pt=`modulepreload`,Ft=function(e){return`/`+e},It={},Lt=function(e,t,n){let r=Promise.resolve();if(t&&t.length>0){let e=document.getElementsByTagName(`link`),i=document.querySelector(`meta[property=csp-nonce]`),a=i?.nonce||i?.getAttribute(`nonce`);function o(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}function s(e){return import.meta.resolve?import.meta.resolve(e):new URL(e,import.meta.url).href}r=o(t.map(t=>{if(t=Ft(t,n),t=s(t),t in It)return;It[t]=!0;let r=t.endsWith(`.css`);for(let n=e.length-1;n>=0;n--){let i=e[n];if(i.href===t&&(!r||i.rel===`stylesheet`))return}let i=document.createElement(`link`);if(i.rel=r?`stylesheet`:Pt,r||(i.as=`script`),i.crossOrigin=``,i.href=t,a&&i.setAttribute(`nonce`,a),document.head.appendChild(i),r)return new Promise((e,n)=>{i.addEventListener(`load`,e),i.addEventListener(`error`,()=>n(Error(`Unable to preload CSS for ${t}`)))})}))}function i(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return r.then(t=>{for(let e of t||[])e.status===`rejected`&&i(e.reason);return e().catch(i)})};e(`zh`,{session:{newSession:`新会话`,importedSession:`导入的会话`,unnamedSession:`未命名会话`,restoredSession:`恢复的会话`,forkSuffix:`分叉`,sourceNotFound:`源会话不存在`,scheduledSession:`定时任务`}}),e(`en`,{session:{newSession:`New session`,importedSession:`Imported session`,unnamedSession:`Unnamed session`,restoredSession:`Restored session`,forkSuffix:`Fork`,sourceNotFound:`Source session not found`,scheduledSession:`Scheduled task`}});async function Rt(e){try{await y(e)}catch(e){n.warn(`[session-store] cleanup ReAct checkpoint failed:`,e)}}var zt=!1;async function Q(){zt||(await v(),zt=!0,Bt())}async function Bt(){try{let e=await f(),t=new Set(e.map(e=>e.id));t.add(`default`);let r=await chrome.storage.local.get(null),i=Object.keys(r).filter(e=>e.startsWith(`scrollPosition_`)&&!t.has(e.slice(15)));i.length>0&&(await chrome.storage.local.remove(i),n.debug(`[session-store] cleanup ${i.length} orphan scrollPosition key:`,i))}catch(e){n.warn(`[session-store] cleanup orphaned scrollPosition failed:`,e)}}async function Vt(){await Q();let[e,t]=await Promise.all([f(),h()]);return e.sort((e,t)=>e.order!==void 0&&t.order!==void 0?e.order-t.order:e.order===void 0?t.order===void 0?new Date(e.createdAt)-new Date(t.createdAt):1:-1),{activeSessionId:t,list:e}}function Ht(e){return typeof e==`string`?e:Array.isArray(e)?e.filter(e=>e.type===`text`).map(e=>e.text).join(``):``}async function Ut(){if(!Z.activeSessionId)return!1;let e=await p(Z.activeSessionId);if(!e)return n.warn(`[SessionStore] saveCurrentSession cannot find currentsession:`,Z.activeSessionId),!1;if(e.model=Z.currentModel,e.useTools=Z.useTools,e.enabledTools=[...Z.enabledTools],e.agentId=Z.activeAgentId||null,e.temperature=Z.temperature,e.topP=Z.topP,e.contextCompaction=Z.activeCompaction||void 0,e.messageHistory=Z.messageHistory.map(e=>({role:e.role,content:e.content||``,executionLog:e.executionLog||[],reflectionScore:e.reflectionScore,wasRevised:e.wasRevised||!1,htmlContent:e.htmlContent||void 0,messageId:e.messageId||void 0,timestamp:e.timestamp||void 0,contextBubbles:e.contextBubbles||void 0,resumable:e.resumable||!1})),e.updatedAt=new Date().toISOString(),!e.forkMetadata){let t=Z.messageHistory.find(e=>e.role===`user`);t&&(e.title=Ht(t.content).substring(0,50).replace(/\n/g,` `))}return await m(e)?!0:(n.error(`[SessionStore] putSession failed, sessionId:`,Z.activeSessionId),!1)}async function Wt(){await Q();let e=$(),n={id:e,title:t(`session.newSession`),model:Z.currentModel,useTools:Z.useTools,enabledTools:[...Z.enabledTools],agentId:Z.activeAgentId||null,temperature:Z.temperature,topP:Z.topP,messageHistory:[],scrollPosition:0,createdAt:new Date().toISOString(),updatedAt:new Date().toISOString(),order:Date.now(),isGenerating:!1,lastExecutionLog:[]};return await m(n),await g(e),n}async function Gt(e){await Q();let n=[];for(let r of e){let e={id:$(),title:r.title||t(`session.importedSession`),model:r.model||Z.currentModel,useTools:r.useTools===void 0||r.useTools,enabledTools:r.enabledTools||[...Z.enabledTools],temperature:r.temperature===void 0?Z.temperature:r.temperature,topP:r.topP===void 0?Z.topP:r.topP,agentId:r.agentId||null,messageHistory:(r.messageHistory||[]).map(e=>({role:e.role,content:e.content||``,executionLog:e.executionLog||[],reflectionScore:e.reflectionScore,wasRevised:e.wasRevised||!1,htmlContent:e.htmlContent||void 0,messageId:e.messageId||void 0,timestamp:e.timestamp||void 0})),scrollPosition:0,createdAt:r.createdAt||new Date().toISOString(),updatedAt:new Date().toISOString(),order:Date.now()+n.length,isGenerating:!1,lastExecutionLog:[]};await m(e),n.push(e)}return!await h()&&n.length>0&&await g(n[0].id),n}async function Kt(e,t){let n=await p(e);return n?(n.messageHistory=n.messageHistory||[],n.messageHistory.push({role:t.role,content:t.content||``,executionLog:t.executionLog||[],reflectionScore:t.reflectionScore,wasRevised:t.wasRevised||!1,htmlContent:t.htmlContent||void 0,messageId:t.messageId||void 0,timestamp:t.timestamp||void 0,contextBubbles:t.contextBubbles||void 0}),n.updatedAt=new Date().toISOString(),n.isGenerating=!1,await m(n),!0):!1}function $(){return`sess_`+Date.now().toString(36)+`_`+Math.random().toString(36).substring(2,8)}async function qt(e){if(e===Z.activeSessionId)return;let t=Ut(),r=chrome.storage.local.get([`modelName`,`temperature`,`topP`]).catch(()=>({})),[i]=await Promise.all([p(e),t]);if(!i)return n.error(`[SessionStore] find not to session:`,e),!1;if(await g(e),Z.activeSessionId=e,Z.messageHistory=i.messageHistory||[],Z.activeCompaction=i.contextCompaction||null,Z.currentModel=i.model||Z.currentModel,Z.temperature=i.temperature===void 0?Z.temperature:i.temperature,Z.topP=i.topP===void 0?Z.topP:i.topP,Z.useTools=i.useTools===void 0?Z.useTools:i.useTools,Z.activeAgentId=i.agentId||null,i.agentId?chrome.storage.local.set({activeAssistantId:i.agentId}):chrome.storage.local.remove(`activeAssistantId`),i.agentId&&i.agentId!=="default")try{let{getAgent:e}=await Lt(async()=>{let{getAgent:e}=await import(`./agent-store-DcAs6YyA.js`).then(e=>e.t);return{getAgent:e}},__vite__mapDeps([0,1,2])),t=await e(i.agentId);t&&(t.model&&(Z.currentModel=t.model),t.temperature!==null&&t.temperature!==void 0&&(Z.temperature=t.temperature,Z.topP=t.topP!==null&&t.topP!==void 0?t.topP:1),document.dispatchEvent(new CustomEvent(`agent-model-changed`)))}catch{}else{let e=await r;e.modelName&&(Z.currentModel=e.modelName),e.temperature!==void 0&&(Z.temperature=e.temperature),e.topP!==void 0&&(Z.topP=e.topP),document.dispatchEvent(new CustomEvent(`agent-model-changed`))}return i.isGenerating&&Z.pendingCallApiSessionIds.has(e)?Z.generatingSessionIds.add(e):i.isGenerating&&(n.debug(`[SessionStore] detected expiredperiod isGenerating mark,async cleanup:`,e),(async()=>{try{let t=await p(e);t&&(t.isGenerating=!1,await m(t))}catch(e){n.warn(`[SessionStore] cleanup expired isGenerating mark failed:`,e)}})()),i}async function Jt(e){let t=await f(),r=await h();await te(e),chrome.storage.local.remove(`scrollPosition_`+e),await Rt(e);try{let t=(await x()).filter(t=>t.sessionId===e);for(let e of t)await S(e.id);t.length>0&&n.info(`[SessionStore] cleaned ${t.length} bookmark (session ${e} deleted)`)}catch(e){n.warn(`[SessionStore] cleanup bookmarks failed:`,e)}if(r===e){let n=[...t].sort((e,t)=>e.order!==void 0&&t.order!==void 0?e.order-t.order:e.order===void 0?t.order===void 0?new Date(e.createdAt)-new Date(t.createdAt):1:-1),r=n.findIndex(t=>t.id===e),i=n.filter(t=>t.id!==e);i.length>0?await g(i[Math.min(r,i.length-1)].id):await g(null)}return!0}async function Yt(e,t){let n=await p(e);return n?(n.title=t,n.updatedAt=new Date().toISOString(),await m(n),!0):!1}async function Xt(e){let t=await f(),n=new Map(t.map(e=>[e.id,e])),r=[];return e.forEach((e,t)=>{let i=n.get(e);i&&(i.order=t,r.push(m(i)))}),await Promise.all(r),!0}async function Zt(){if(!Z.messageHistory||Z.messageHistory.length===0)return;let e=await p(Z.activeSessionId);if(!e)return;let n=Z.messageHistory.find(e=>e.role===`user`),r=n?Ht(n.content).substring(0,50).replace(/\n/g,` `):e.title||t(`session.unnamedSession`),i=Date.now().toString(36)+Math.random().toString(36).substring(2,8),a=Z.messageHistory.map(e=>({role:e.role,content:e.content||``,executionLog:e.executionLog||[],reflectionScore:e.reflectionScore,wasRevised:e.wasRevised||!1,htmlContent:e.htmlContent||void 0})),o=await _();o.push({id:i,title:r,createdAt:new Date().toISOString(),messages:a}),o.length>20&&o.splice(0,o.length-20),await re(o);let s=await Wt();return await Jt(e.id),await qt(s.id),!0}async function Qt(e,n=null){await Q();let r=await p(e);if(!r)throw Error(t(`session.sourceNotFound`));let i=$(),a=new Date().toISOString(),o=r.messageHistory||[],s=!1;if(n){let e=o.findIndex(e=>e.messageId===n);e>=0&&(o=o.slice(0,e+1),s=!0)}let c=o.map(e=>({...e,executionLog:Array.isArray(e.executionLog)?[...e.executionLog]:[],contextBubbles:Array.isArray(e.contextBubbles)?[...e.contextBubbles]:void 0,messageId:`msg_`+Date.now().toString(36)+`_`+Math.random().toString(36).substring(2,8)})),l={...r,id:i,title:`${r.title||t(`session.newSession`)} - ${t(`session.forkSuffix`)}`,messageHistory:c,isGenerating:!1,lastExecutionLog:[],scrollPosition:0,createdAt:a,updatedAt:a,order:Date.now(),forkMetadata:{sourceSessionId:e,forkedAt:a,...s?{upToMessageId:n}:{}}};return await m(l),await g(i),l}async function $t(e){await Q();let n={id:$(),title:e.name||t(`session.scheduledSession`),model:e.model||null,useTools:e.useTools==null?null:e.useTools,enabledTools:null,agentId:e.agentId||null,temperature:e.temperature==null?null:e.temperature,topP:e.topP==null?null:e.topP,messageHistory:[],scrollPosition:0,createdAt:new Date().toISOString(),updatedAt:new Date().toISOString(),order:Date.now(),isGenerating:!1,lastExecutionLog:[],scheduledTaskId:e.id};return await m(n),n}export{y as A,fe as B,xe as C,pe as D,be as E,x as F,me as G,p as H,b as I,ie as J,ve as K,_e as L,se as M,v as N,S as O,h as P,f as R,Te as S,Ee as T,ae as U,ge as V,oe as W,he as X,ce as Y,Oe as _,Jt as a,we as b,Vt as c,Ut as d,qt as f,ke as g,je as h,Wt as i,ye as j,ee as k,Yt as l,Z as m,Zt as n,Qt as o,Lt as p,de as q,$t as r,Gt as s,Kt as t,Xt as u,Ae as v,De as w,Se as x,Ce as y,le as z};
77
+ //# sourceMappingURL=session-store-CzVQCgQ_.js.map