ai-helper-agent 2.3.1 → 2.4.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 (74) hide show
  1. package/README.md +13 -3
  2. package/dist/assets/__vite-browser-external-CM3Eme-n.js +1 -0
  3. package/dist/assets/agent-store-Ce3f4Ya3.js +1 -0
  4. package/dist/assets/background.js +104 -80
  5. package/dist/assets/chat-export-CWSUeOo4.js +37 -0
  6. package/dist/assets/chunk-CMxvf4Kt.js +1 -0
  7. package/dist/assets/content.js +159 -156
  8. package/dist/assets/{dist-BQOFgIxk.js → dist-DhUTa_WT.js} +5 -6
  9. package/dist/assets/dist-LQPh1k0y.js +24 -0
  10. package/dist/assets/i18n-ouMgDZ2t.js +49 -0
  11. package/dist/assets/jszip.min-Bm_16osY.js +2 -0
  12. package/dist/assets/lib-33nIefF6.js +220 -0
  13. package/dist/assets/{marked.min.js-08SGy6CO.js → marked.min.js-D2rXgLAQ.js} +7 -8
  14. package/dist/assets/{marked.min.js-loader-4kRZ9iCP.js → marked.min.js-loader-tKH5SQVQ.js} +1 -1
  15. package/dist/assets/model-profiles-6dzdrSS4.js +24 -0
  16. package/dist/assets/network-scope-CNRYXk74.js +1 -0
  17. package/dist/assets/options-Cp1UMkjK.css +1 -0
  18. package/dist/assets/options.js +108 -102
  19. package/dist/assets/{page-snapshot-renderer-CVL6r6Kf.js → page-snapshot-renderer-j72q92KH.js} +2 -3
  20. package/dist/assets/pdf-DnVqBaAN.js +6 -0
  21. package/dist/assets/session-store-CmGs_rhh.js +76 -0
  22. package/dist/assets/side_panel.css +1 -1
  23. package/dist/assets/side_panel.js +958 -1124
  24. package/dist/assets/theme-BRAX5X2F.css +1 -0
  25. package/dist/assets/{modulepreload-polyfill-P2Xu9kJm.js → theme-CLwYsx9o.js} +1 -1
  26. package/dist/assets/utils-9i9g8vW8.js +112 -0
  27. package/dist/assets/version-BrT5Y9A7.js +1 -0
  28. package/dist/assets/xlsx-DGkz7cnk.js +105 -0
  29. package/dist/manifest.json +2 -5
  30. package/dist/offscreen/offscreen.js +7 -7
  31. package/dist/options.html +151 -75
  32. package/dist/side_panel.html +167 -137
  33. package/package.json +1 -1
  34. package/src/config.js +3 -2
  35. package/src/executor.js +99 -18
  36. package/src/locales/en.json +16 -2
  37. package/src/locales/zh.json +16 -2
  38. package/src/memory/injection.js +12 -2
  39. package/src/memory/routes.js +6 -0
  40. package/src/memory/service.js +57 -2
  41. package/src/rag/manager.js +1 -1
  42. package/src/rag/url-guard.js +27 -12
  43. package/src/security.js +433 -31
  44. package/src/server.js +28 -8
  45. package/dist/assets/agent-store-DcAs6YyA.js +0 -2
  46. package/dist/assets/agent-store-DcAs6YyA.js.map +0 -1
  47. package/dist/assets/background.js.map +0 -1
  48. package/dist/assets/dist-BQOFgIxk.js.map +0 -1
  49. package/dist/assets/i18n-C4jSRoCH.js +0 -50
  50. package/dist/assets/i18n-C4jSRoCH.js.map +0 -1
  51. package/dist/assets/jszip.min-BXqW2-9v.js +0 -3
  52. package/dist/assets/jszip.min-BXqW2-9v.js.map +0 -1
  53. package/dist/assets/lib-Bi7BFuND.js +0 -221
  54. package/dist/assets/lib-Bi7BFuND.js.map +0 -1
  55. package/dist/assets/marked.min.js-08SGy6CO.js.map +0 -1
  56. package/dist/assets/model-profiles-Dl_MsXWa.js +0 -25
  57. package/dist/assets/model-profiles-Dl_MsXWa.js.map +0 -1
  58. package/dist/assets/options-8-nu3P5K.css +0 -1
  59. package/dist/assets/options.js.map +0 -1
  60. package/dist/assets/page-snapshot-renderer-CVL6r6Kf.js.map +0 -1
  61. package/dist/assets/pdf-HiJ0icvU.js +0 -7
  62. package/dist/assets/pdf-HiJ0icvU.js.map +0 -1
  63. package/dist/assets/rolldown-runtime-C0FnF6B9.js +0 -1
  64. package/dist/assets/session-store-CzVQCgQ_.js +0 -77
  65. package/dist/assets/session-store-CzVQCgQ_.js.map +0 -1
  66. package/dist/assets/side_panel.js.map +0 -1
  67. package/dist/assets/version-CNG2KGnJ.js +0 -2
  68. package/dist/assets/version-CNG2KGnJ.js.map +0 -1
  69. package/dist/assets/xlsx-BHKh7vjA.js +0 -106
  70. package/dist/assets/xlsx-BHKh7vjA.js.map +0 -1
  71. package/dist/icons/badges/license-MIT.svg +0 -21
  72. package/dist/icons/badges/platform.svg +0 -21
  73. package/dist/icons/badges/prs-welcome.svg +0 -21
  74. package/dist/icons/badges/version.svg +0 -21
@@ -1 +0,0 @@
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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"}