ai-helper-agent 2.2.0 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) 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-qLZ_Nmmz.js} +2 -2
  4. package/dist/assets/{agent-store-DOyMdB_7.js.map → agent-store-qLZ_Nmmz.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 +40 -40
  8. package/dist/assets/{i18n-MmYITlVj.js → i18n-sOTxZemV.js} +5 -5
  9. package/dist/assets/i18n-sOTxZemV.js.map +1 -0
  10. package/dist/assets/{model-profiles-CV_sUuPf.js → model-profiles-DcTdflVP.js} +5 -5
  11. package/dist/assets/model-profiles-DcTdflVP.js.map +1 -0
  12. package/dist/assets/options-B6ca-cwx.css +1 -0
  13. package/dist/assets/options.js +218 -197
  14. package/dist/assets/options.js.map +1 -1
  15. package/dist/assets/{page-snapshot-renderer-CE53ibi-.js → page-snapshot-renderer-C-4bo-cW.js} +2 -2
  16. package/dist/assets/{page-snapshot-renderer-CE53ibi-.js.map → page-snapshot-renderer-C-4bo-cW.js.map} +1 -1
  17. package/dist/assets/{session-store-B0ZPGm7d.js → session-store-U8WKrdGX.js} +4 -4
  18. package/dist/assets/session-store-U8WKrdGX.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-DzUoXKcK.js +2 -0
  23. package/dist/assets/version-DzUoXKcK.js.map +1 -0
  24. package/dist/manifest.json +2 -2
  25. package/dist/offscreen/offscreen.js +4 -4
  26. package/dist/options.html +111 -3
  27. package/dist/side_panel.html +27 -4
  28. package/package.json +1 -1
  29. package/src/config.js +72 -24
  30. package/src/crypto-lite.js +31 -0
  31. package/src/locales/en.json +55 -0
  32. package/src/locales/zh.json +55 -0
  33. package/src/memory/embedding-config.js +95 -0
  34. package/src/memory/fusion.js +60 -0
  35. package/src/memory/injection.js +118 -0
  36. package/src/memory/routes.js +193 -0
  37. package/src/memory/service.js +957 -0
  38. package/src/memory/tags.js +62 -0
  39. package/src/memory/tier.js +37 -0
  40. package/src/memory/tokens.js +158 -0
  41. package/src/memory/vectors.js +128 -0
  42. package/src/rag/embedding/index.js +7 -0
  43. package/src/rag/embedding/local.js +25 -0
  44. package/src/rag/keyword-match.js +112 -0
  45. package/src/rag/manager.js +15 -0
  46. package/src/rag/searcher.js +15 -87
  47. package/src/server.js +6 -0
  48. package/dist/assets/i18n-MmYITlVj.js.map +0 -1
  49. package/dist/assets/model-profiles-CV_sUuPf.js.map +0 -1
  50. package/dist/assets/options-Df_1Dtn8.css +0 -1
  51. package/dist/assets/session-store-B0ZPGm7d.js.map +0 -1
  52. /package/dist/_locales/{zh → zh_CN}/messages.json +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i18n-sOTxZemV.js","names":[],"sources":["../../src/shared/logger.js","../../src/shared/locales/zh.js","../../src/shared/locales/en.js","../../src/shared/i18n.js"],"sourcesContent":["const LOG_LEVEL = {\n DEBUG: 0,\n INFO: 1,\n WARN: 2,\n ERROR: 3\n};\n\nlet currentLevel = LOG_LEVEL.DEBUG;\n\nexport function setLogLevel(level) {\n currentLevel = level;\n}\n\nexport function getLogLevel() {\n return currentLevel;\n}\n\nexport function debug(...args) {\n if (currentLevel <= LOG_LEVEL.DEBUG) {\n console.debug('[AIH]', ...args);\n }\n}\n\nexport function info(...args) {\n if (currentLevel <= LOG_LEVEL.INFO) {\n console.info('[AIH]', ...args);\n }\n}\n\nexport function warn(...args) {\n if (currentLevel <= LOG_LEVEL.WARN) {\n console.warn('[AIH]', ...args);\n }\n}\n\nexport function error(...args) {\n if (currentLevel <= LOG_LEVEL.ERROR) {\n console.error('[AIH]', ...args);\n }\n}\n\nexport const logger = {\n debug,\n info,\n warn,\n error,\n setLogLevel,\n getLogLevel\n};\n\nexport default logger;","// 中文语言包\n// 按模块分组,key 用点分访问(如 t('common.confirm'))\n\nexport default {\n common: {\n confirm: '确认',\n cancel: '取消',\n close: '关闭',\n ok: '确定',\n save: '保存',\n delete: '删除',\n edit: '编辑',\n retry: '重试',\n loading: '加载中...',\n none: '无',\n add: '添加',\n clear: '清空',\n selectAll: '全选',\n deselectAll: '取消全选',\n refresh: '刷新',\n enabled: '已启用',\n disabled: '已停用',\n bytes: '字节',\n copy: '复制',\n copySuccess: '已复制',\n copyFailed: '复制失败',\n },\n\n // 敏感操作确认对话框(confirm-dialog 试点)\n dialog: {\n operationConfirm: '操作确认',\n confirmDefaultMessage: '模型请求执行敏感操作,是否允许?',\n confirmAction: '模型请求执行操作: {name}',\n remainingTime: '剩余时间: {time}',\n deny: '拒绝',\n approveOnce: '本次放行',\n approveLoop: '当前任务放行',\n },\n\n // 敏感操作显示名\n sensitiveTool: {\n manage_cookies: '管理 Cookie',\n clear_data: '清除页面数据',\n download_file: '下载文件',\n manage_tab: '标签页管理',\n agent_file: '文件操作',\n debug_page: '页面调试(Debugger)',\n debuggerAttachHint: '\\n\\n开启后该标签页顶部会显示\"扩展程序正在调试此浏览器\"提示条,结束后自动消失。',\n unknown: '未知操作',\n tabInfo: '\\n\\n标签页标题: {title}\\n标签页 URL: {url}',\n tabInfoError: '\\n\\n(无法获取标签页信息: {error})',\n untitled: '无标题',\n unknownUrl: '未知',\n },\n\n // 设置页\n settings: {\n docTitle: 'AI Helper - 配置',\n language: '界面语言',\n languageChanged: '语言已切换,部分页面刷新后生效',\n pageTitle: 'AI Helper 配置',\n subtitle: '网页智能助手 - OpenAI 兼容接口',\n importConfigTitle: '导入配置',\n exportConfigTitle: '导出配置',\n tabBasic: '基础',\n tabReact: '推理',\n tabReflection: '反思',\n tabToolbar: '划词',\n tabAgent: '代理',\n tabToolbox: '扩展',\n saveConfig: '保存配置',\n // 基础 tab 内容\n apiBaseHint: '(从下拉列表选择,或手动输入)',\n addApiBaseTitle: '添加自定义 API Base URL',\n addAddress: '+ 添加地址',\n apiBaseUrlPlaceholder: 'API Base URL(如 https://api.example.com/v1)',\n apiBaseLabelPlaceholder: '标签/备注(可选,如 我的代理)',\n confirmAdd: '确认添加',\n requiredHint: '(必填)',\n apiKeyHint: '请从您使用的大模型平台获取对应的 API Key,并在此配置中填写。请妥善保管您的 API Key,避免泄露。',\n apiKeyPlaceholder: '请输入您的 API Key',\n toggleApiKey: '显示/隐藏 API Key',\n modelName: '模型名称',\n modelNameHint: '(从下拉列表选择,或点击下方按钮添加新模型)',\n selectModelPlaceholder: '请从下方选择模型',\n noMatch: '无匹配项',\n addModelTitle: '添加自定义模型',\n addModel: '+ 添加模型',\n fetchModels: '⟳ 从 API 获取',\n fetchModelsTitle: '从当前厂商 API 拉取可用模型列表',\n fetchModelsLoading: '获取中…',\n fetchModelsNeedConfig: '请先填写 API Base URL 和 API Key',\n fetchModelsSuccess: '✅ 已获取 {total} 个模型(新增 {added} 个)',\n fetchModelsEmpty: '未获取到模型,请手动添加',\n fetchModelsFailed: '❌ 获取失败,请检查配置或手动添加模型',\n fetchModelsAuthFailed: '❌ 认证失败,请检查 API Key',\n modelNameInputPlaceholder: '模型名称(如 gpt-4o)',\n contextWindowPlaceholder: '上下文窗口大小(tokens)',\n contextWindowHint: '128K=128000, 200K=200000, 1M=1000000, 留空则自动推断',\n enableImageInput: '启用图片识别功能',\n enableImageInputHint: '(开启后可在侧边栏发送图片给多模态模型进行分析)',\n imageApiBaseHint: '(从下拉列表选择,或手动输入;留空则使用基础模型配置)',\n addImageApiBaseTitle: '添加自定义图片 API Base URL',\n useBaseModelPlaceholder: '留空则使用基础模型配置',\n imageApiKeyHint: '(可选,留空则使用基础模型配置)',\n imageApiKeyPlaceholder: '请输入图片识别 API Key',\n imageModelNameHint: '(支持多模态视觉能力的模型,从列表选择或添加新模型;留空则使用基础模型的模型名称)',\n useBaseModelPlaceholderShort: '留空则使用基础模型',\n addImageModelTitle: '添加自定义图片识别模型',\n systemPrompt: '系统提示词',\n systemPromptHint: '(可选,留空则使用默认值)',\n resetToDefault: '重置为默认值',\n systemPromptTip: '💡 提示:系统提示词用于定义 AI 助手的行为和角色。',\n collapse: '− 收起',\n modelNameRequired: '请输入模型名称',\n modelAdded: '模型已添加',\n imageModelAdded: '图片模型已添加',\n apiBaseSwitched: 'API Base URL 已切换,请确保 API Key 对应有效',\n apiBaseRequired: '请输入 API Base URL',\n urlInvalid: 'URL 格式不正确',\n apiBaseAdded: 'API Base URL 已添加',\n imageApiBaseSwitched: '图片 API Base URL 已切换',\n imageApiBaseAdded: '图片 API Base URL 已添加',\n maxIterationsRangeError: '最大循环次数必须在 10-1000 之间',\n apiTimeoutRangeError: 'API 请求超时必须在 1-10 分钟 之间',\n loopTimeoutRangeError: '整体循环超时必须在 1-120 分钟 之间',\n toolTimeoutRangeError: '工具执行超时必须在 1-30 分钟 之间',\n apiKeyEmpty: 'API Key 不能为空',\n saveFailed: '保存失败:{message}',\n saveSuccess: '配置已保存成功!',\n deleteModel: '删除此模型',\n ctxSliderIconTitle: '设置该模型的上下文窗口',\n ctxSliderAuto: '自动',\n ctxSliderAutoTitle: '恢复自动推断',\n ctxBadgeAutoTip: '自动推断(未手动设置)',\n ctxSliderResetAuto: '恢复自动',\n deleteApiBase: '删除此地址',\n // 厂商配置(多配置记忆与快速切换)\n providerConfig: '厂商配置',\n providerConfigHint: '(切换后立即生效;每个配置独立记忆地址、API Key、模型列表)',\n profileScopeHint: '以下设置保存到厂商配置“{name}”,切换厂商时自动联动',\n newProfile: '+ 新建',\n newProfileTitle: '新建一个空的厂商配置',\n profileNameTitle: '新建厂商配置',\n saveAsProfile: '另存为',\n saveAsProfileTitle: '以当前配置另存为新的厂商配置',\n renameProfile: '重命名',\n renameProfileTitle: '重命名当前配置',\n deleteProfile: '删除',\n deleteProfileTitle: '删除当前配置',\n profileNamePlaceholder: '配置名称(如 DeepSeek 官方、我的中转)',\n profileNameRequired: '请输入配置名称',\n deleteProfileConfirm: '确定要删除厂商配置“{name}”吗?删除后不可恢复。',\n atLeastOneProfile: '至少保留一个厂商配置',\n profileSwitched: '已切换到 {name}',\n profileCreated: '已创建配置 {name}',\n profileRenamed: '已重命名为 {name}',\n profileDeleted: '已删除配置 {name}',\n profileCopySuffix: '副本',\n // 完成反馈(声音 + 彩带)\n completionFeedbackTitle: '完成反馈',\n completionSound: '播放提示音(成功与失败音效不同)',\n completionSoundHint: '成功时清脆三连音(Do-Mi-Sol 上扬),失败时低沉方波双音;用户主动取消不播放',\n completionConfetti: '播放彩带动画',\n completionConfettiHint: '仅在回答成功完成时播放;失败和取消不播放',\n // 桌面通知\n completionNotification: '任务完成或失败时弹出桌面通知',\n completionNotificationHint: '仅在看不到侧边栏时弹出;成功自动消失,失败停留至手动关闭;点击通知打开侧边栏',\n scheduledNotification: '定时任务完成或失败时弹出桌面通知',\n scheduledNotificationHint: '定时任务在后台执行、无声音等其他提醒渠道,开关开启时总是弹出;默认开启,可手动关闭',\n // 交互提醒\n interactionNotification: 'AI 需要你确认或澄清时提醒我',\n interactionNotificationHint: '推理循环等待你操作时弹桌面提醒;仅在看得到侧边栏时不打扰,点击通知打开侧边栏',\n showMessageTimestamp: '显示消息时间戳',\n showMessageTimestampHint: '(在用户问题气泡下方显示发问时间,今天显示时分,非今天显示日期)',\n // 侧边栏作用域\n sidePanelScopeTitle: '侧边栏作用域',\n sidePanelScopeGlobal: '全局模式',\n sidePanelScopeTab: '标签页绑定模式',\n sidePanelScopeGlobalHint: '同一窗口内所有标签页共享同一份侧边栏实例,切换标签页时始终可见',\n sidePanelScopeTabHint: '侧边栏只在打开它的标签页显示;可在多个标签页各自打开,切走自动隐藏、切回自动恢复',\n // 自动分组\n autoGroupTabs: '标签页绑定模式下,把打开侧边栏的标签页归入分组',\n autoGroupTabsHint: '仅标签页绑定模式生效;把这些标签页归入一个彩色标签组便于识别(标签页会被移动到分组所在位置),关闭某个标签页的侧边栏或切回全局模式时会移出分组',\n },\n\n // 顶部栏\n header: {\n docTitle: 'AI Helper - 模型问答',\n settingsTitle: '插件设置',\n switchAgent: '切换助手',\n defaultAssistant: '🤖 默认助手',\n notConnected: '未连接',\n agentAddress: '代理地址',\n copyAgentAddress: '复制代理地址',\n refreshAgentStatus: '刷新代理在线状态',\n restart: '重启',\n restartAgent: '重启代理服务',\n update: '更新',\n updateAndRestart: '更新并重启代理',\n stop: '停止',\n stopAgent: '停止代理服务',\n addEditAgent: '新增/编辑代理',\n addEditAssistant: '新增/编辑助手',\n manageKnowledge: '管理知识库',\n moreActions: '更多操作',\n clearChat: '清除对话',\n exportChat: '导出对话',\n importChat: '导入对话',\n prototypeLibrary: '原型页面库',\n tokenStats: 'Token 统计',\n auditLog: '命令执行审计',\n shortcuts: '查看快捷键',\n versionInfo: '版本信息',\n detachTitle: '脱离为独立窗口',\n attachTitle: '回归侧边栏',\n },\n\n // 脱离/回归窗口\n detach: {\n taskRunning: '任务执行中,请等待完成后再操作',\n },\n\n // 会话管理\n session: {\n allSessions: '全部会话',\n newSessionTitle: '新建会话 (Alt+N)',\n searchPlaceholder: '搜索会话...',\n closeAll: '关闭全部',\n renameTitle: '重命名会话',\n renamePlaceholder: '请输入会话名称',\n confirmCloseTitle: '确认关闭会话',\n confirmCloseMessage: '确定要关闭该会话吗?此操作不可撤销。',\n },\n\n // 欢迎区\n chat: {\n welcomeTitle: '开始对话',\n welcomeSubtitle: '输入您的问题,AI 助手将为您解答',\n askBasedOnSelection: '基于选中内容提问',\n confirmClearTitle: '确认清除',\n confirmClearMessage: '确定要清除所有对话历史吗?',\n confirmDeletePromptTitle: '确认删除',\n confirmDeletePromptMessage: '确定要删除这个提示词吗?',\n requestFailed: '请求失败: {message}',\n networkError: '网络错误,请检查网络连接后重试',\n timeoutError: '请求超时: {message}',\n taskInterruptedSwRestart: '后台服务异常重启,API 调用已中断',\n quote: '引用',\n export: '导出',\n quoteTitle: '引用此消息',\n quotedPrefix: '💬 已引用: {text}',\n navPrevTitle: '上一条消息 (Alt+↑),Ctrl/Cmd+点击回到最顶端',\n navNextTitle: '下一条消息 (Alt+↓),Ctrl/Cmd+点击跳到底端',\n navQuestionTitle: '问题列表',\n navEmptyLabel: '暂无问题',\n navQuestionNoText: '(图片/附件消息)',\n },\n\n // 工具面板\n toolPanel: {\n title: '工具配置',\n searchPlaceholder: '搜索工具名称或描述...',\n categoryAll: '全部',\n preselect: '工具预筛选',\n preselectHint: '开启:AI 先判断哪些工具可能用得上,只传相关工具。好处是 Token 省了,但万一判断不准,漏掉了关键工具,任务可能做不好\\n关闭:全部启用的工具一次性给模型。没有判断开销,启动更快,但工具太多会浪费 Token',\n confirmHint: '启用后,当模型执行敏感操作(工具调用、命令执行等)时,会弹出确认框等待用户确认。\\n关闭后,所有操作将直接放行执行,无需确认。',\n clearSearch: '清除搜索',\n configBtnTitle: '点击打开工具详细配置',\n },\n\n // 工具使用统计\n toolStats: {\n title: '📊 工具使用统计',\n subtitle: '各工具调用频率、成功率、平均耗时',\n usedTools: '已使用工具',\n calls: '调用',\n success: '成功',\n successRate: '成功率',\n avgDuration: '平均耗时',\n unusedTools: '未使用工具',\n noData: '暂无统计数据',\n btnTitle: '工具使用统计',\n clearTitle: '清空统计',\n },\n\n // Token 统计\n tokenStatsPanel: {\n title: '🪙 Token 使用统计',\n subtitle: '单次问答 ReAct 会话维度 & 总体维度',\n currentSession: '当前会话',\n globalStats: '全局统计',\n recentCalls: '近期调用',\n noData: '暂无统计数据',\n // Tab 导航\n tabTrend: '趋势',\n tabDistribution: '分布',\n tabGlobal: '全局',\n // 时间范围切换\n timeRangeToday: '今日',\n timeRangeWeek: '本周',\n timeRangeMonth: '本月',\n timeRangeAll: '全部',\n // 全局 sparkline\n globalSparklineTitle: '最近 30 天趋势',\n },\n\n // 通用确认弹窗(window.showCustomConfirm)\n customConfirm: {\n defaultTitle: '确认操作',\n },\n\n // 提示弹窗\n promptDialog: {\n title: '提示',\n },\n\n // 提示词管理\n promptManager: {\n title: '提示词管理',\n codePlaceholder: '编码(如: code)',\n contentPlaceholder: '提示词内容',\n addPrompt: '添加提示词',\n },\n\n // 澄清对话框\n clarify: {\n title: '需要您的澄清',\n selectOption: '请选择一个选项',\n inputPlaceholder: '请输入补充信息(可选)...',\n customPlaceholder: '请输入您的自定义内容...',\n additionalTitle: '补充说明(可选)',\n additionalHint: '如果您有更多相关信息,可以在此补充说明',\n remainingTime: '剩余时间: 3:00',\n },\n\n // 原型库\n prototype: {\n previewTitle: 'UI 原型预览',\n continueOptimize: '💡 继续优化',\n libraryTitle: '🎨 原型页面库',\n searchPlaceholder: '搜索原型...',\n sortTimeNew: '时间 (新→旧)',\n sortTimeOld: '时间 (旧→新)',\n sortTitleAz: '标题 (A→Z)',\n sortTitleZa: '标题 (Z→A)',\n empty: '暂无原型',\n zoomOut: '缩小 (Ctrl+滚轮)',\n zoomReset: '点击重置',\n resetZoom: '点击重置',\n zoomIn: '放大 (Ctrl+滚轮)',\n download: '下载',\n openInTab: '新标签页打开',\n openInNewTab: '新标签页打开',\n openLocal: '本地浏览器打开',\n },\n\n // 快捷键\n shortcuts: {\n title: '⌨️ 快捷键',\n sendMessage: '发送消息',\n newLine: '换行',\n inputHistory: '输入历史(输入框内)',\n clearInput: '清空输入框',\n keyColumn: '快捷键',\n functionColumn: '功能',\n platformColumn: '平台',\n platformWinMac: 'Win / Mac',\n prevMessage: '跳转到上一条消息',\n nextMessage: '跳转到下一条消息',\n colShortcut: '快捷键',\n colFunction: '功能',\n colPlatform: '平台',\n gotoPrev: '跳转到上一条消息',\n gotoNext: '跳转到下一条消息',\n scrollTop: '回到对话顶部',\n scrollBottom: '跳到对话底部',\n fullScreenshot: '全页面截图',\n areaScreenshot: '区域截图',\n regionScreenshot: '区域截图',\n toggleToolConfig: '打开/关闭工具配置',\n openShortcutsPanel: '打开快捷键面板',\n openShortcutPanel: '打开快捷键面板',\n newSession: '新建会话',\n closeSession: '关闭当前会话',\n closeCurrentSession: '关闭当前会话',\n editLastMessage: '编辑最近一条用户消息',\n },\n\n // 版本信息弹窗\n versionInfo: {\n title: 'ℹ️ 版本信息',\n version: '版本号',\n tag: 'Git Tag',\n commit: 'Git 提交',\n publishedAt: '发布时间',\n website: '官网',\n discussions: '讨论频道',\n reportIssue: '上报问题',\n githubRepo: 'GitHub 仓库',\n giteeRepo: 'Gitee 仓库',\n copy: '复制信息',\n },\n\n // 图片编辑器\n imageEditor: {\n editImage: '编辑图片',\n brush: '画笔 (B)',\n rect: '矩形 (R)',\n ellipse: '椭圆 (E)',\n arrow: '箭头 (A)',\n line: '直线 (L)',\n undo: '撤销 (Ctrl+Z)',\n confirm: '确认 (Enter)',\n cancel: '取消 (Esc)',\n downloadImage: '下载图片',\n prev: '上一张',\n next: '下一张',\n prevImage: '上一张',\n nextImage: '下一张',\n brushSize: '画笔粗细',\n eraser: '橡皮擦',\n },\n\n // 对话导出\n chatExport: {\n selectCurrentOnly: '仅选当前',\n selectedCount: '已选 {count} 个',\n exportSelected: '导出选中',\n title: '导出会话',\n exportSessions: '导出会话',\n },\n\n // 助手编辑器\n agentEditor: {\n createNew: '创建新助手',\n namePlaceholder: '助手名称',\n icon: '图标',\n descPlaceholder: '这个助手擅长什么?',\n templateQuickCreate: '模板快速创建',\n promptPlaceholder: '你是一个专业的...',\n availableTools: '可用工具',\n availableSkills: '可用技能',\n modelSettings: '模型设置(留空则使用全局设置)',\n modelPlaceholder: '选择或输入模型名称',\n allowSubAgent: '允许作为子助手被调度',\n name: '名称',\n desc: '简短描述',\n nameLabel: '名称',\n descLabel: '简短描述',\n selectTemplate: '-- 选择模板(可选) --',\n systemPrompt: '系统提示词(定义助手的角色和能力)',\n inheritGlobalToolsHint: '(不勾选则继承全局工具设置)',\n inheritGlobalSkillsHint: '(不勾选则使用全部启用技能)',\n toolsInheritGlobal: '(不勾选则继承全局工具设置)',\n skillsInheritAll: '(不勾选则使用全部启用技能)',\n noSetting: '不设置(使用全局)',\n noPreset: '不设置(使用全局)',\n deleteTitle: '删除此助手',\n deleteAgentTitle: '删除此助手',\n },\n\n // 命令执行审计\n auditLog: {\n title: '📋 命令执行审计',\n filterAll: '全部',\n filterCommand: '命令执行',\n filterFile: '文件操作',\n filterAuth: '认证',\n filterSecurity: '安全',\n filterSystem: '系统',\n recent50: '最近50条',\n recent100: '最近100条',\n recent200: '最近200条',\n recent500: '最近500条',\n searchPlaceholder: '搜索操作名、命令或路径...',\n categoryFilter: '分类筛选:',\n countLabel: '条数:',\n clearSearch: '清除',\n empty: '暂无审计日志',\n noLogs: '暂无审计日志',\n defaultRange: '默认查询最近7天的审计日志',\n },\n\n // 输入区\n input: {\n atHint: '提示词 (单击) / 网页 (Ctrl/Cmd+单击)',\n placeholder: \"输入'/'快捷提示、'@'切换助手或网页、'$'选择工作目录文件、'↑↓'切换历史输入、Esc清空\",\n send: '发送',\n clearSelection: '取消选中内容',\n pageLabel: '🌐 网页',\n clearPage: '取消网页',\n mcpLabel: '🔌 MCP',\n clearMcp: '取消MCP服务',\n skillLabel: '🧩 技能',\n clearSkill: '取消技能',\n screenshotTitle: '截取当前页面',\n attachFileTitle: '上传文件(PDF/Word/Excel/文本)',\n screenshot: '截取当前页面',\n uploadFile: '上传文件(PDF/Word/Excel/文本)',\n aiDisclaimer: '内容由 AI 生成,仅供参考',\n addMenuTitle: '添加内容',\n addMenuPrompt: '提示词',\n addMenuScreenshot: '截图',\n addMenuScreenshotFull: '整页截图',\n addMenuScreenshotFullDesc: '截取当前可见页面',\n addMenuScreenshotRegion: '区域截图',\n addMenuScreenshotRegionDesc: '拖拽框选页面区域',\n addMenuFile: '附件',\n addMenuSwitches: '开关',\n },\n\n // 模型选择下拉\n model: {\n selectModel: '选择模型',\n temperature: '温度',\n },\n\n // 内嵌下拉(厂商 / 模型列表)的过滤搜索\n sectionSelect: {\n searchPlaceholder: '输入关键字过滤…',\n noMatch: '无匹配项',\n },\n\n // API 厂商快速切换(侧边栏模型设置)\n provider: {\n label: 'API 厂商',\n manage: '管理厂商配置',\n },\n\n // 提示词/Agent 选择器\n promptSelector: {\n prompts: '提示词',\n skills: '技能',\n pages: '网页',\n agents: '助手',\n proxies: '代理',\n knowledge: '知识库',\n pagesCount: '网页 ({count})',\n agentsCount: '助手 ({count})',\n proxiesCount: '代理 ({count})',\n knowledgeCount: '知识库 ({count})',\n headerHint: '方向键切换 · Enter发送 · Ctrl+Enter带入文本框',\n agentHeaderHint: '方向键切换 · Enter选择 · Esc取消',\n switchHint: '方向键切换 · Enter发送 · Ctrl+Enter带入文本框',\n switchHintSelect: '方向键切换 · Enter选择 · Ctrl+Enter选中并关闭 · Esc取消',\n mergedTitle: '聚合搜索',\n mergedTitleCount: '聚合搜索 ({count})',\n },\n\n // 记忆设置\n memory: {\n label: '记忆',\n historyLimit: '记忆历史限制',\n hint: '记忆越多,上下文越连贯,但 token 消耗也越大;记忆太少,则可能无法结合前文准确回答。',\n unlimited: '不限制',\n recent200: '最近200条',\n recent100: '最近100条',\n recent50: '最近50条',\n recent20: '最近20条',\n recent10: '最近10条',\n recent5: '最近5条',\n recent2: '最近2条',\n custom: '自定义:',\n unit: '条',\n configEntry: '打开记忆配置',\n autoCompactLabel: '自动压缩',\n autoCompactHint: '上下文占用达到 85% 时,发送前自动压缩一次为摘要(会额外产生一次摘要调用)。',\n persistSummaryLabel: '摘要存入记忆',\n persistSummaryHint: '压缩时把摘要沉淀为跨会话长期记忆;同一会话重复压缩只更新同一条。',\n },\n\n // 开关项\n toggle: {\n memoryHint: '开启后,前文问答将作为上下文(默认全部,条数可配置)',\n toolsHint: '工具总开关:点击开启或关闭工具调用',\n selectionHint: '开启后,划词选中内容时可快速提问',\n tools: '工具',\n selection: '划词',\n modelSettings: '模型设置',\n toolsConfigTitle: '点击打开工具详细配置',\n },\n\n // 选中内容指示器\n selection: {\n clearSelection: '取消选中内容',\n page: '🌐 网页',\n clearPage: '取消网页',\n clearMcp: '取消MCP服务',\n skill: '🧩 技能',\n clearSkill: '取消技能',\n },\n\n // 工具分类名称(与 constants.js TOOL_CATEGORY_NAMES 对应)\n toolCategory: {\n page_interaction: '🖱️ 页面交互',\n form_operation: '📝 表单操作',\n content_extraction: '📄 内容提取',\n tab_management: '📑 标签页管理',\n bookmark_history: '🔖 书签历史',\n storage_management: '💾 存储管理',\n network_request: '🌐 网络请求',\n media_output: '📷 媒体与输出',\n debug_dev: '🔧 调试开发',\n ai_collaboration: '🤖 AI协作',\n local_agent: '🖥️ 代理',\n mcp: '🔌 MCP',\n knowledge: '📚 知识库',\n },\n\n // 预设温度档位(side_panel/constants.js PRESET_MODES)\n presetMode: {\n preciseLabel: '精准严谨',\n preciseTip: '改错、调试、要准确答案(低随机性,适合修 bug)',\n generalLabel: '日常通用',\n generalTip: '多数场景都好用(平衡稳定与灵活,适合写脚本)',\n divergentLabel: '思路发散',\n divergentTip: '要多种方案做对比(适合重构、方案对比)',\n creativeLabel: '创意脑暴',\n creativeTip: '写文案、起名、头脑风暴(高随机性,不建议正式代码)',\n },\n\n // 工具描述(给用户看;给模型的英文描述见 background/tools/*.js)\n tool: {\n agent_file: '代理本地文件操作(读取/写入/列表/删除/下载)',\n agent_trash: '管理代理回收站(查看/恢复已删除项)',\n agent_exec: '在代理机器上执行 Shell 命令',\n agent_search: '在代理机器上搜索文件或文件内容',\n agent_skill: '加载或运行 Skill(run=工作流,load=Agent Skill)',\n manage_agent: '查看或切换已配对的 AI 代理',\n exec_log: '提取执行日志,分析成功路径与失败教训',\n clarify_question: '向用户提问澄清,提供选项供选择',\n highlight_text: '在页面上高亮文本,用于视觉强调',\n plan_task: '将复杂任务规划拆解为子任务',\n search_chats: '搜索历史对话记录',\n preview_ui: '预览或获取 UI 原型',\n dispatch_task: '向子代理派发任务',\n interact_element: '交互页面元素(ref/文本/选择器定位;支持 click/hover/type 输入)',\n scroll_to: '滚动页面到目标位置(元素/坐标/文本)',\n wait_element: '等待元素出现/消失/可见性变化',\n drag_drop: '拖拽元素(⚠️ 试验性,多数页面可能无效)',\n wait_navigation: '等待页面导航完成',\n handle_dialog: '处理页面弹窗(自动确认/取消/恢复 alert/confirm/prompt)',\n fill_form: '批量填写多个表单字段(支持 ref 定位)',\n keyboard_input: '输入文本或派发按键事件(可绕过 React/Vue 受控组件)',\n file_upload: '上传文件到页面',\n select_dropdown: '下拉框选择(支持自定义组件)',\n page_content: '获取页面文本或 HTML 内容',\n extract_data: '提取结构化数据(表格/链接/图片/表单/元信息)',\n query_elements: '查询可交互元素,返回树形快照与 ref 编号(打开的弹窗/菜单提升到 [打开层];可见 iframe 以 [frame #N] 区块纳入,其 ref 全局有效;同一元素编号稳定,页面变化后需重新查询;hasMore 为真时用 page 翻页)',\n search_in_page: '在当前页面中查找文本',\n iframe_content: '获取页面中 iframe 的内容',\n scroll_collect: '滚动并收集内容,适用于无限滚动/懒加载页面',\n notify: '显示浏览器通知',\n clipboard: '剪贴板操作(复制/粘贴/获取选中文本)',\n download_file: '下载文件到本地',\n qrcode: '生成二维码',\n capture_page: '截取页面截图(下载/分析/两者)',\n browser_info: '获取浏览器版本和环境信息',\n inject_css: '向页面注入自定义 CSS',\n agent_memory: '长期记忆管理(存储/回忆/维护)',\n manage_storage: '读写浏览器 localStorage 或 sessionStorage',\n manage_cookies: '获取/设置/删除/列出浏览器 Cookie',\n clear_data: '清除站点的 localStorage/sessionStorage',\n fetch_url: '向指定 URL 发送 HTTP GET/POST 请求',\n manage_tab: '管理浏览器标签页(打开/切换/关闭/刷新/前进后退)',\n list_tabs: '获取已打开的标签页列表',\n search_browser_data: '搜索浏览器书签或访问历史',\n debug_page: '高级页面调试(CDP):原生输入事件、网络抓包、执行 JS、整页/元素截图、设备与 UA 模拟',\n knowledge_search: '检索知识库获取相关内容(只读)',\n knowledge_ingest: '将文本/本地文件/网页导入知识库(写入操作)',\n knowledge_list: '列出可用知识库及其文档数量',\n },\n\n // options.html - 推理 tab\n react: {\n title: '⚙️ 推理循环配置',\n subtitle: '控制 AI 推理循环的行为参数(高级配置)',\n maxIterations: '最大循环次数',\n maxIterationsHint: '(复杂任务可适当增加)',\n min: '最小: 10',\n max: '最大: 1000',\n apiTimeout: 'API 请求超时',\n apiTimeoutHint: '(单次 API 调用的最长等待时间)',\n unitMinute: '分钟 (min)',\n min1Minute: '最小: 1分钟',\n max10Minutes: '最大: 10分钟',\n max120Minutes: '最大: 120分钟',\n max30Minutes: '最大: 30分钟',\n loopTimeout: '整体循环超时',\n loopTimeoutHint: '(整个推理循环的最长执行时间)',\n toolTimeout: '工具执行超时',\n toolTimeoutHint: '(单个工具执行的最长等待时间)',\n toolConfirmation: '敏感操作确认',\n toolConfirmationHint: '(模型执行敏感操作时,弹窗确认后再执行)',\n enabled: '已启用',\n disabled: '已停用',\n toolConfirmationDesc1: '启用后,当模型执行敏感操作(工具调用、命令执行等)时,会弹出确认框等待用户确认。',\n toolConfirmationDesc2: '关闭后,所有操作将直接放行执行,无需确认。',\n enableExecutionLog: '启用执行日志',\n enableExecutionLogHint: '(显示 API 调用和工具执行的详细日志,帮助调试和理解 AI 思考过程)',\n enableExecutionLogDesc1: '启用后,消息底部会显示\"执行日志\"按钮,点击可查看 API 调用和工具执行的详细过程。',\n enableExecutionLogDesc2: '关闭后,消息底部不再显示该按钮。',\n streaming: '流式输出',\n streamingHint: '(开启后 AI 回复会实时逐字显示,提供更快的反馈感知)',\n streamingDesc1: '开启后 AI 回复会实时逐字显示,代理端命令执行时也会实时输出,提供更快的反馈感知。',\n streamingDesc2: '如果遇到兼容性问题,可关闭此开关回退到一次性输出模式。',\n streamExpandTools: '流式工具卡片默认展开',\n streamExpandToolsHint: '(关闭则工具卡片默认折叠,仅显示标题与状态,点击可展开详情)',\n configGuide: '💡 配置说明',\n guideReasoningLoop: '推理循环',\n guideReasoningLoopDesc: '是 AI 助手进行多步推理和工具调用的核心机制。',\n guideLoopCount: '循环次数',\n guideLoopCountDesc: ':决定 AI 可以进行多少轮推理-行动循环',\n guideTimeout: '超时设置',\n guideTimeoutDesc: ':防止长时间等待或无限循环',\n guideClarifyWait: '澄清等待',\n guideClarifyWaitDesc: ':用户澄清时间不计入整体循环超时(暂停计时)',\n guideTip: '• 建议根据网络状况和任务复杂度调整这些参数',\n },\n\n // options.html - 反思 tab\n reflection: {\n title: '🎯 AI 自我反思配置',\n enabled: '已启用',\n subtitle: '控制 AI 对任务执行结果的自我评估和修订行为',\n postReflection: '后置反思',\n postReflectionHint: '(完成后评估结果质量)',\n subtaskReflection: '子任务反思',\n subtaskReflectionHint: '(高级功能,默认关闭)',\n configGuide: '💡 反思配置说明',\n guidePostReflection: '后置反思',\n guidePostReflectionDesc: ':在推理循环结束后,AI 会对最终结果进行自我评估。如果评分低于阈值,会自动修订或重新执行。',\n guideSubtaskReflection: '子任务反思',\n guideSubtaskReflectionDesc: ':对于复杂任务拆解后的子任务进行单独评估,默认关闭(高级功能)。',\n guideTip: '• 启用反思会增加 API 调用次数,建议根据需求权衡',\n },\n\n // options.html - 划词工具栏 tab\n toolbar: {\n title: '🔧 工具栏设置',\n enabled: '已启用',\n subtitle: '管理划词工具栏的按钮和顺序',\n iconOnly: '工具栏图标精简模式(仅显示图标,不显示文字)',\n addCustomTool: '+ 添加自定义工具',\n domainBlocklistTitle: '域名屏蔽',\n domainBlocklistDesc: '在此添加需要屏蔽工具栏的域名,屏蔽后该域名下不再显示划词工具栏',\n domainAddPlaceholder: '例如:example.com(不含 http/https)',\n add: '添加',\n toolEditModalTitle: '添加自定义工具',\n toolName: '工具名称',\n toolNamePlaceholder: '例如:润色、改写、代码审查',\n systemPromptLabel: '系统提示词',\n systemPromptHint: '(定义该工具的行为)',\n toolPromptPlaceholder: '例如:你是一个文本润色助手,请将用户输入的内容润色得更流畅、更专业。',\n builtinBadge: '内置',\n customBadge: '自定义',\n moveUp: '上移',\n moveDown: '下移',\n dragSort: '拖拽排序',\n editCustomToolTitle: '编辑自定义工具',\n toolNameEmpty: '工具名称不能为空',\n toolPromptEmpty: '系统提示词不能为空',\n toolNotFound: '未找到该工具',\n cannotEditBuiltin: '不能编辑内置工具',\n noBlockedDomains: '暂无屏蔽域名,在上方输入域名添加',\n unblock: '取消屏蔽',\n domainEmpty: '域名不能为空',\n domainInvalid: '请输入有效的域名,例如 example.com',\n domainExists: '该域名已存在',\n },\n\n // options.html - 代理配置 tab\n agentConfig: {\n title: '🖥️ 代理配置',\n subtitle: '连接代理服务,实现文件读写、系统命令执行、对话记忆管理、Skill 工作流及 MCP 协议扩展等高级能力。支持配置并匹配多个代理,一键连接。',\n pairedAgents: '已配对代理',\n notConnected: '未连接',\n detailToggle: '▶ 详细信息',\n addAgentTitle: '添加新代理',\n agentName: '代理名称',\n agentNameHint: '(自定义,留空则自动获取)',\n agentNamePlaceholder: '例如:办公室 Mac',\n agentUrl: '代理地址',\n agentUrlHint: '(代理服务的 HTTP 地址)',\n pairCode: '配对码',\n pairCodeHint: '(在 Agent 终端窗口中查看)',\n pairCodePlaceholder: '6位配对码',\n connect: '连接',\n toolCount: '{count} 个工具',\n selectedTotalCount: '(已选 {selected} / 共 {total})',\n toggleCategoryAll: '点击切换该分类全选/取消全选',\n useInstructionTitle: '💡 使用说明及安全提示',\n installGuideTitle: '📥 安装代理端 v{version}(与当前插件版本匹配)',\n installGuideHint: '复制下方命令粘贴到终端执行,将安装与当前插件版本一致的代理端,避免版本不匹配导致无法连接。',\n installGuideMacLinux: 'macOS / Linux',\n copyCmd: '复制',\n copyCmdAuto: '一键复制(按当前系统)',\n copyCmdSuccess: '安装命令已复制到剪贴板',\n copyCmdFailed: '复制失败,请手动选中命令复制',\n method1: '方式一:NPM 全局安装(推荐)',\n method1Step1: '(要求 Node.js ≥ 18)',\n method1Step2: ' 或简写 ',\n method1Step3: '3. 终端显示 6 位配对码,在此页面填入并点击\"连接\"',\n method2: '方式二:本地源码运行(开发调试)',\n method2Step2: '2. 终端显示 6 位配对码,在此页面填入并点击\"连接\"',\n cmdAlias: '命令别名',\n cmdAliasPrefix: ' 可简写为 ',\n cmdAliasSuffix: ',所有命令均支持',\n bgRun: '后台运行:',\n bgRunMethod1: ' 方式一:',\n bgRunMethod1Mid: ' 或 ',\n bgRunMethod2: ' 方式二:',\n moreCmd: '更多命令:',\n moreCmdMid: ' 或 ',\n securityTitle: '⚠️ 安全提示',\n security1: '代理服务默认仅监听本机地址(127.0.0.1),如需远程连接请修改启动参数。',\n security2: '文件操作限制在工作目录和白名单允许目录内,不可越权访问。',\n security3: '高危命令自动拦截,敏感命令支持配置化确认放行。',\n addAnotherAgent: '再添加一个代理',\n checking: '检测中',\n connected: '已连接',\n online: '在线',\n offline: '离线',\n clickToEditName: '点击编辑名称',\n currentInUse: '当前使用 · ',\n enable: '启用',\n disable: '停用',\n disconnect: '断开',\n connectedTo: '已连接到: {name}',\n confirmDeleteAgent: '确定要删除代理 \"{name}\" ({url}) 吗?\\n删除后需重新配对才能使用。',\n deleteAgentTitle: '删除代理',\n agentDeleted: '已删除代理: {name}',\n agentDisabledToast: '已停用代理: {name}',\n agentEnabledToast: '已启用代理: {name}',\n fetchingAgentInfo: '正在获取代理信息...',\n agentUnreachable: '代理服务不可达',\n tokenExpired: 'Token 已失效 - 请重新配对',\n cannotConnectAgent: '无法连接到代理 - 请确认代理服务已启动',\n notConnectedSelect: '未连接 - 请从列表中选择代理连接',\n notConnectedAdd: '未连接 - 请添加代理配对',\n unlimited: '无限制',\n idle: '空闲',\n unknownCommand: '(未知命令)',\n detailVersion: '版本',\n detailSystem: '系统',\n detailHostname: '主机名',\n detailHomeDir: '用户目录',\n detailRunningProcesses: '运行中进程',\n detailRunningProcessesCount: '运行中进程 ({count})',\n detailMemoryUsage: '内存使用',\n detailMemoryDetail: '堆 {used}MB / 总 {total}MB · RSS {rss}MB',\n detailUptime: '运行时长',\n detailCpuUser: 'CPU 用户态',\n detailCpuSystem: 'CPU 内核态',\n detailCommandTimeout: '命令超时',\n detailUploadMaxSize: '上传大小限制',\n detailFileMaxSize: '读取大小限制',\n detailAllowedPaths: '允许访问的目录',\n detailPairCodeTTL: '配对码有效期',\n detailWorkdir: '📁 工作目录: {dir}',\n pairCodeRequired: '请输入6位配对码',\n pairing: '正在配对...',\n pairingBtn: '配对中...',\n unnamedAgent: '未命名代理',\n pairSuccess: '配对成功!已添加: {name}',\n pairFailed: '配对失败:{error}',\n unknownError: '未知错误',\n connectFailed: '连接失败 - 请确认代理服务已启动',\n cannotConnectAgentMsg: '无法连接到 Agent: {error}',\n disconnectedToast: '已断开连接',\n detailToggleOpen: '▼ 详细信息',\n pairFailedShort: '配对失败',\n },\n\n // options.html - 工具箱 tab\n toolbox: {\n checkingAgent: '正在检查 Agent 连接...',\n mcpTitle: '🔌 MCP 服务器管理',\n mcpDisabled: '已停用',\n mcpDesc: '通过 MCP 协议连接外部工具服务器,扩展 AI 助手的工具能力。关闭后所有 MCP 工具将不会发送到 AI 上下文。',\n loading: '加载中...',\n addMcpServer: '+ 添加 MCP 服务器',\n skillTitle: '🧩 技能管理',\n skillDisabled: '已停用',\n skillDesc: '管理可复用的工作流和 Agent 技能。关闭后所有技能内容将不会注入到 AI 系统提示词中。',\n ragTitle: '📚 知识库检索(RAG)',\n ragDisabled: '已停用',\n ragDesc: '在代理端本地构建知识库,对话时检索增强回答。需要安装额外的可选依赖(约 200-300MB),关闭后知识库内容不会发送到 AI 上下文。',\n ragServiceEnabled: '知识库检索已启用',\n ragServiceDisabled: '知识库检索已停用',\n ragStatusChecking: '正在检测 RAG 能力...',\n ragStatusReadyTitle: 'RAG 能力已就绪',\n ragStatusReadyDesc: '代理端依赖已安装。知识库管理功能将在后续版本提供。',\n ragStatusNotInstalledTitle: '代理端未安装 RAG 依赖',\n ragStatusNotInstalledDesc: '启用知识库检索需要先在代理端安装额外的依赖包。',\n ragStatusNodeLowTitle: '运行环境不满足要求',\n ragStatusNodeLowDesc: 'RAG 功能需要 Node.js 22+(代理端当前为 {version}),请升级 Node.js 后重启代理。',\n ragStatusAgentOffTitle: '代理未连接',\n ragStatusAgentOffDesc: '请先在「代理」Tab 中连接 Agent 服务后再配置知识库检索',\n ragStatusUnreachableTitle: '无法获取代理状态',\n ragStatusUnreachableDesc: '请确认代理服务运行正常后点击「重新检测」。',\n ragInstallPackagesLabel: '需要安装的包:',\n ragInstallRequirements: '运行环境要求 Node.js 22+;预计下载约 200-300MB(含 onnxruntime 原生库,视平台而定);首次使用还需下载 AI 模型约 95MB。',\n ragInstallNoRestartNeeded: '安装成功后自动就绪,无需重启代理服务。',\n ragInstallCommandLabel: '也可在代理端安装目录手动执行:',\n ragCopyCmd: '📋 复制命令',\n ragCopied: '已复制到剪贴板',\n ragCopyFailed: '复制失败,请手动选择复制',\n ragInstallBtn: '⬇️ 一键安装 RAG 依赖',\n ragInstallBtnBusy: '安装中...',\n ragRedetectBtn: '🔄 重新检测',\n ragInstallStarted: '安装已开始,正在下载依赖...',\n ragInstallRunning: '正在安装 RAG 依赖...',\n ragAutoRestoreRunning: '代理更新后依赖缺失,正在自动恢复...',\n ragInstallTip: '安装过程可能需要几分钟,期间请勿关闭代理服务。',\n ragInstallVerifying: '依赖安装完成,正在验证...',\n ragInstallSuccess: 'RAG 依赖安装成功,能力已就绪',\n ragInstallFailedToast: 'RAG 依赖安装失败',\n ragInstallFailedAdvice: '若多次安装失败,可尝试重启代理服务(或稍后重试)后点击「重新检测」。',\n ragInstallLogLabel: '安装日志(最近输出):',\n ragRedetectReady: '重新检测完成:RAG 能力已就绪',\n ragRedetectStillMissing: '重新检测完成:仍未检测到 RAG 依赖',\n ragRedetectStillMissingDetail: '仍未检测到 RAG 依赖 - {error}',\n ragRedetectFailed: '重新检测失败: {error}',\n importSkill: '+ 导入技能',\n reloadSkills: '🔄 重新加载',\n enabledCountTotal: '已启用 {enabled} / 共 {total}',\n unknownAgent: '未知代理',\n currentAgentSupports: '当前代理:<strong>{name}</strong> — 支持MCP和技能',\n agentNotConnectedHint: '代理未连接 — 请在「代理」Tab 中连接',\n mcpIdRequired: '请填写服务器 ID',\n mcpUrlRequired: '请填写服务端 URL',\n mcpCommandRequired: '请填写命令路径',\n mcpReconnecting: '正在重新连接...',\n mcpUpdateReconnected: 'MCP 服务器更新成功,已重连({count} 工具)',\n mcpUnknownError: '未知错误,请检查命令与参数是否正确',\n mcpUpdatedReconnectFailed: '配置已更新,但重连失败: {error}',\n mcpUpdateSuccess: 'MCP 服务器更新成功',\n mcpUpdateFailed: '更新失败: {error}',\n mcpServiceEnabled: 'MCP 服务已启用',\n mcpServiceDisabled: 'MCP 服务已停用',\n skillServiceEnabled: '技能服务已启用',\n skillServiceDisabled: '技能服务已停用',\n mcpAddSuccess: 'MCP 服务器添加成功',\n mcpAddFailed: '添加失败: {error}',\n mcpConnecting: '正在连接...',\n mcpConnectSuccess: '连接成功',\n mcpDisconnectSuccess: '已断开连接',\n mcpEnabledToast: '已启用',\n mcpDisabledToast: '已禁用',\n mcpConfirmDelete: '确定要删除该 MCP 服务器吗?',\n deleteConfirmTitle: '删除确认',\n deleteSuccess: '删除成功',\n collapseTools: '收起 {count} 个工具',\n viewTools: '查看 {count} 个工具',\n operationFailed: '操作失败: {error}',\n sizeBytes: '大小: {size} 字节',\n skillConfirmDelete: '确定要删除技能 \"{name}\" 吗?',\n skillEnabledToast: '已启用技能 \"{name}\"',\n skillDisabledToast: '已停用技能 \"{name}\"',\n skillInfoFailed: '获取技能信息失败: {error}',\n skillRunning: '正在运行技能 \"{name}\"...',\n skillContentFailed: '获取技能内容失败',\n skillGetFailed: '获取失败: {error}',\n skillsReloaded: '已重新加载 {count} 个技能',\n skillsReloadFailed: '重新加载失败: {error}',\n emptyAgentNotConnectedTitle: '代理未连接',\n emptyAgentNotConnectedDescMcp: '请先在「代理」Tab 中连接 Agent 服务后,再配置 MCP 服务器',\n emptyNoMcpTitle: '暂无 MCP 服务器',\n emptyNoMcpDesc: '点击下方按钮添加 MCP 服务器,扩展 AI 助手的工具能力',\n emptyAgentNotConnectedDescSkill: '请先在「代理」Tab 中连接 Agent 服务后,再管理技能',\n emptyNoSkillTitle: '暂无技能',\n emptyNoSkillDesc: '支持两种技能类型:<br><strong>Workflow 技能</strong>:导入 JSON 文件(确定性自动化流程)<br><strong>Agent 技能</strong>:导入 SKILL.md 目录/Zip/URL(AI 能力扩展)',\n mcpIdPlaceholder: '服务器 ID',\n mcpIdPlaceholderUnique: '服务器 ID(唯一标识)',\n mcpNamePlaceholder: '显示名称',\n mcpEnvVars: '环境变量',\n mcpEnvVarsHint: '(仅 stdio 传输需要,敏感值优先在 shell 配置中 export)',\n mcpAddVar: '+ 添加变量',\n mcpConnected: '已连接',\n mcpDisconnected: '未连接',\n mcpToggleEnabled: '启用中,点击停用',\n mcpToggleDisabled: '已停用,点击启用',\n mcpDisconnectBtn: '断开',\n mcpConnectBtn: '连接',\n mcpVarNamePlaceholder: '变量名',\n mcpVarValuePlaceholder: '值',\n mcpToggleEye: '显示/隐藏',\n mcpRemoveRow: '删除此行',\n mcpHeaderNamePlaceholder: 'Header 名',\n mcpHeaders: '请求头 (Headers)',\n mcpHeadersHint: '(HTTP 传输时附加的请求头,如 Authorization、X-API-Key 等)',\n mcpAddHeader: '+ 添加请求头',\n transportStdioTitle: '子进程通信 (npx/python 等)',\n transportSseTitle: 'Server-Sent Events (HTTP GET 长连接 + POST 发消息)',\n transportStreamableHttpTitle: 'MCP 官方推荐 HTTP 传输 (POST + GET SSE)',\n transportWebsocketTitle: 'WebSocket 双向通信',\n mcpCommandPlaceholder: '命令路径,如 npx、python',\n mcpArgsPlaceholder: '参数,空格分隔',\n mcpCustomHeadersCount: '{count} 个自定义请求头',\n mcpAddFailedShort: '添加失败',\n mcpDeleteFailedShort: '删除失败',\n mcpConnectFailedShort: '连接失败',\n mcpDisconnectFailedShort: '断开失败',\n mcpOperationFailedShort: '操作失败',\n workflowSkillsTitle: 'Workflow 技能(自动化流程)',\n agentSkillsTitle: 'Agent 技能(AI 能力扩展)',\n stepCount: '{count} 步骤',\n resourceCount: '{count} 资源',\n expand: '展开',\n run: '运行',\n enable: '启用',\n disable: '停用',\n builtin: '内置',\n moreCount: '+{count} 更多',\n editSkillMd: '编辑 SKILL.md',\n viewDetails: '查看详情',\n required: '*必填',\n optional: '选填',\n runSkillTitle: '运行技能 \"{name}\"',\n fillParamsHint: '请填写以下参数后运行:',\n defaultParamHint: ' (默认: {default})',\n noExecutionResult: '无执行结果',\n conditionNotMetSkipped: '条件不满足,已跳过',\n executionSuccess: '执行成功',\n executionFailed: '执行失败',\n truncated: '... (共 {count} 字符,已截断)',\n executionComplete: '执行完成',\n executionSummary: '{success} 成功, {fail} 失败, {skip} 跳过',\n skillRunResultTitle: '技能 \"{name}\" {status}',\n skillImportFailedShort: '导入失败',\n skillDeleteFailedShort: '删除失败',\n skillOperationFailedShort: '操作失败',\n invalidSkillDataFormat: '无效的技能数据格式',\n editAgentSkill: '编辑 Agent 技能',\n newAgentSkill: '新建 Agent 技能',\n skillNameLabel: '技能名称',\n skillDescLabel: '描述',\n skillVersionLabel: '版本',\n skillMarkdownLabel: 'SKILL.md 内容(Markdown)',\n skillDescPlaceholder: '简要描述此技能的功能(建议用“在需要……时使用”句式写明触发场景,便于模型按需自动加载)',\n skillDescScenePlaceholder: '简要描述此技能的功能和适用场景(建议用“在需要……时使用”句式,便于模型按需自动加载)',\n skillNameExamplePlaceholder: 'e.g. code-review 或 deploy-to-server',\n skillMarkdownPlaceholder: '# 技能名称\\n\\n## 何时使用\\n- 条件1\\n- 条件2\\n\\n## 执行步骤\\n1. 步骤1\\n2. 步骤2',\n skillMarkdownPlaceholderShort: '## 何时使用\\n- 条件1\\n- 条件2\\n\\n## 执行步骤\\n1. 步骤1\\n2. 步骤2',\n existingResources: '已有资源文件',\n skillNameRequired: '请输入技能名称',\n skillMarkdownRequired: '请输入 SKILL.md 内容',\n agentSkillSaved: 'Agent 技能 \"{name}\" 保存成功',\n saveFailedShort: '保存失败',\n saveFailed: '保存失败: {error}',\n viewSkillTitle: '查看技能: {name}',\n importSkillTitle: '导入技能',\n importBtn: '导入',\n jsonImport: 'JSON 导入',\n newAuthoring: '新建编写',\n zipPackage: 'Zip 包',\n urlImport: 'URL 导入',\n jsonImportDesc: '导入 JSON 格式的 Workflow 技能(确定性自动化流程)',\n clickOrDragJson: '点击选择 JSON 文件或拖拽到此处',\n jsonFileHint: '支持 .json 格式的 Workflow 技能定义文件',\n markdownImportDesc: '直接编写 SKILL.md 内容,创建 Agent 技能(AI 能力扩展)',\n zipImportDesc: '导入包含 SKILL.md 的 Zip 压缩包,可附带 scripts/templates/assets 等辅助资源',\n clickOrDragZip: '点击选择 Zip 文件或拖拽到此处',\n zipFileHint: 'Zip 包内需包含 SKILL.md 文件,可选的 scripts/ templates/ assets/ 子目录',\n urlImportDesc: '从远程 URL 下载技能的 Zip 包并自动导入',\n downloadUrl: '下载地址',\n selectJsonFile: '请选择 JSON 文件',\n workflowSkillImported: 'Workflow 技能 \"{name}\" 导入成功',\n agentSkillCreated: 'Agent 技能 \"{name}\" 创建成功',\n createFailedShort: '创建失败',\n selectZipFile: '请选择 Zip 文件',\n fileTooLarge: '文件过大,最大支持 50MB',\n fileReadFailed: '文件读取失败',\n agentSkillImported: 'Agent 技能 \"{name}\" 导入成功',\n urlRequired: '请输入 URL',\n importFailed: '导入失败: {error}',\n // 搜索 + 筛选\n searchMcpPlaceholder: '搜索 MCP 服务器...',\n searchSkillPlaceholder: '搜索技能...',\n filterAll: '全部',\n filterEnabled: '已启用',\n filterDisabled: '已停用',\n noMatchResult: '无匹配结果',\n },\n\n // 记忆向量配置面板(options.html 记忆标签页)\n memoryPanel: {\n tabTitle: '记忆',\n title: '记忆向量',\n enabled: '已启用',\n disabled: '已停用',\n statusTitle: '向量索引状态',\n statusLoading: '读取中…',\n statusOffline: '代理未连接,暂时读不到向量状态',\n statusFail: '向量状态读取失败',\n statusOldAgent: '当前代理版本没有这个状态接口,请重启代理后再看',\n statusDetail: '返回信息',\n statusIndexed: '已索引 {indexed} / 共 {total} 条',\n statusStored: '向量指纹',\n statusCurrent: '当前配置指纹',\n statusTier: '生效档位',\n statusStale: '已陈旧:模型变更后未重建',\n statusFresh: '与当前配置一致',\n staleHint: '旧向量与新配置不可比,语义召回会静默退化。请点「重建向量索引」(有未保存的修改先保存)。',\n modeLabel: '嵌入来源',\n modeRemote: '远端服务(OpenAI 兼容接口)',\n modeLocal: '本地模型',\n baseUrlLabel: '服务地址',\n baseUrlPlaceholder: 'https://api.openai.com/v1',\n modelLabel: '模型名称',\n modelPlaceholder: 'BAAI/bge-m3',\n apiKeyLabel: 'API Key',\n apiKeyPlaceholder: '留空表示不修改',\n apiKeyClearBtn: '清除已存 Key',\n apiKeyClearConfirm: '清除后远端语义召回随即停用(降回关键词档),直到重新填入并保存新 Key。确定清除?',\n apiKeyCleared: '已清除已存的 API Key',\n apiKeyClearFail: '清除 Key 失败:{error}',\n configNotLoaded: '配置未成功加载,为避免把代理里的设置覆盖成空,请刷新面板后重试',\n dimsLabel: '向量维度(可留空,测试时自动探测)',\n prefixLabel: '查询前缀(queryPrefix,可留空)',\n localNotice: '本地档无需测试连通性:保存后直接重建向量索引(首次使用需下载模型,可能数十分钟)。嵌入在 512 token 处静默截断,超长条目只有前部进入向量。',\n testBtn: '测试连通性',\n testRunning: '测试中…',\n testOk: '连通正常:{model} 输出 {dims} 维',\n testFail: '测试失败:{error}',\n scopeHint: '本 Tab 的配置会在点击底部「保存配置」时一并写入代理(本地 agent 服务)的 config.json;代理未连接时跳过该项,仅保存扩展自身设置',\n saveSkippedOffline: '代理未连接,记忆向量配置未保存(仅保存了扩展设置)',\n saveSuccess: '记忆向量配置已保存',\n saveFail: '保存失败:{error}',\n toggleOnSaved: '已启用语义向量召回',\n toggleOffSaved: '已停用,召回回落关键词通道',\n toggleFail: '开关切换失败:{error}',\n reindexBtn: '重建向量索引',\n reindexConfirm: '重建会用当前配置重新计算全部记忆的向量。本地档 41 条实测约 23 分钟(远端约 2 分钟),期间请勿关闭本页面。确定继续?',\n reindexRunning: '重建进行中,请勿关闭页面…',\n reindexDone: '重建完成:已索引 {indexed} / {total}',\n reindexBatchFail: '({count} 批失败,详见 agent 日志)',\n reindexOverWindow: '({count} 条超出 {window} token 窗口,尾部未进向量)',\n reindexSkipped: '未重建:向量档未启用',\n reindexFail: '重建失败:{error}',\n gateAgentOffTitle: '代理未连接',\n gateAgentOffBody: '记忆向量配置由本地代理提供。请先在「代理」标签页完成代理连接,再回到这里配置。',\n gateRagTitle: '本地模型依赖未就绪',\n gateRagMissing: '本地模型需要 RAG 依赖。请先在「扩展」面板完成安装,再回到这里配置。',\n goToAgentTab: '前往「代理」标签页',\n goToToolboxTab: '前往「扩展」标签页'\n },\n\n // 知识库管理面板(options.html 知识库标签页)\n knowledge: {\n tabTitle: '知识库',\n\n // 门控引导\n gateAgentOffTitle: '代理未连接',\n gateAgentOffDesc: '知识库功能由本地代理提供。请先在「代理」标签页完成代理连接,再回到这里管理知识库。',\n gateRagOffTitle: '知识库功能未启用',\n gateRagOffDesc: '开启上方「知识库检索」总开关后,即可创建和管理知识库。',\n gateRagUnavailableTitle: '代理端能力未就绪',\n gateRagUnavailableDesc: 'RAG 依赖尚未安装,或 Node 版本不满足要求(需 Node 22+)。请查看下方安装引导。',\n goToAgentTab: '前往「代理」标签页',\n goToToolboxTab: '前往「扩展」标签页',\n enableNow: '立即启用',\n\n // 列表\n title: '知识库',\n createBtn: '+ 新建知识库',\n searchPlaceholder: '搜索知识库...',\n emptyTitle: '还没有知识库',\n emptyDesc: '点击「新建知识库」创建第一个知识库,然后导入文档开始使用。',\n loadFailed: '加载失败: {error}',\n retry: '重试',\n statsSummary: '{docs} 文档 · {chunks} 分块',\n modeLocal: '本地模型',\n modeRemote: '远端服务',\n\n // 卡片操作\n actionEdit: '编辑',\n actionIngest: '导入',\n actionSearch: '检索测试',\n actionDocs: '文档',\n actionDelete: '删除',\n actionEnable: '启用',\n actionDisable: '停用',\n badgeDisabled: '已停用',\n enableSuccess: '知识库「{name}」已启用',\n disableSuccess: '知识库「{name}」已停用',\n\n // 新建弹窗\n createTitle: '新建知识库',\n nameLabel: '名称',\n namePlaceholder: '例如:产品文档集',\n descLabel: '描述(可选)',\n descPlaceholder: '简要说明这个知识库存放什么内容',\n createConfirm: '创建',\n creating: '创建中...',\n createSuccess: '知识库「{name}」已创建',\n nameRequired: '请输入知识库名称',\n\n // 编辑知识库\n editTitle: '编辑知识库',\n editConfirm: '保存',\n saving: '保存中...',\n editSuccess: '知识库信息已更新',\n\n // 向量模型配置(创建/编辑弹窗)\n vectorSectionTitle: '向量模型',\n vectorModeLocal: '本地模型(内置 BGE 中文模型)',\n vectorModeRemote: '远端服务(OpenAI 兼容接口)',\n vectorModeLocalHint: '使用代理端内置 BGE 中文模型生成向量,无需额外配置;首次导入需下载模型文件。',\n vectorModeRemoteHint: '调用远端 OpenAI 兼容的向量服务(如硅基流动、智谱、OpenAI 等)。',\n vectorEndpointLabel: '接口地址(Base URL,含版本段)',\n vectorEndpointPlaceholder: '例如 https://api.siliconflow.cn/v1',\n vectorApiKeyLabel: 'API Key',\n vectorApiKeyPlaceholder: '粘贴 API Key',\n vectorApiKeyKeep: '留空则沿用已保存的 Key',\n vectorModelLabel: '模型名称',\n vectorModelPlaceholder: '例如 BAAI/bge-m3',\n vectorDimsLabel: '向量维度(可留空,测试时自动探测)',\n vectorDimsPlaceholder: '自动',\n vectorTestBtn: '测试连通性',\n vectorTesting: '测试中...',\n vectorTestOk: '连接成功:{model}({dims} 维)',\n vectorDimsFilled: '已自动填充维度:{dims}',\n vectorTestFailed: '测试失败: {error}',\n vectorEndpointRequired: '请填写远端接口地址',\n vectorModelRequired: '请填写模型名称',\n\n // 重建索引(向量/分块配置变更)\n rebuildConfirmTitle: '变更向量配置',\n rebuildConfirm: '向量模型或分块参数变更后需要重建索引(重新向量化全部文档)。重建期间仍可检索旧索引,完成后自动切换。确定继续吗?',\n rebuildStarted: '已开始重建索引,完成后将自动刷新...',\n progressRebuilding: '正在重建索引 {current}/{total} 篇文档…',\n rebuildDone: '索引重建完成',\n rebuildFailed: '索引重建失败: {error}',\n\n // 删除知识库\n deleteConfirmTitle: '删除知识库',\n deleteConfirm: '确定删除「{name}」吗?其中的 {docs} 个文档、{chunks} 个分块将一并删除,操作不可恢复。',\n deleteSuccess: '知识库已删除',\n\n // 导入文档\n ingestTitle: '导入文档到「{name}」',\n tabFile: '文件',\n tabText: '文本',\n tabUrl: 'URL',\n dropHint: '拖拽文件到此处,或点击选择',\n dropSupported: '支持 txt / md / pdf / docx / xlsx / html 等格式,单文件 ≤ 50MB',\n selectedFile: '已选择:{name}',\n textContentLabel: '文本内容',\n textContentPlaceholder: '在此粘贴要导入的文本内容...',\n textNameLabel: '文档名称(可选)',\n textNamePlaceholder: '留空则自动命名',\n urlLabel: '网页地址',\n urlPlaceholder: 'https://example.com/page',\n chunkSettingsTitle: '分块设置',\n chunkSizeLabel: '块大小(字符)',\n chunkOverlapLabel: '重叠(字符)',\n ingestConfirm: '开始导入',\n ingesting: '正在解析并向量化,首次导入可能需要下载模型,请稍候...',\n progressParsing: '正在解析文档…',\n progressChunking: '正在分块…',\n progressEmbedding: '正在向量化 {current}/{total} 块…',\n progressStoring: '正在写入索引…',\n ingestSuccess: '导入完成:{name}({chunks} 个分块)',\n ingestFailed: '导入失败: {error}',\n fileRequired: '请先选择文件',\n contentRequired: '请输入要导入的文本内容',\n urlRequired: '请输入网页地址',\n fileTooLarge: '文件过大,最大支持 50MB',\n\n // 文档列表\n docsTitle: '「{name}」的文档',\n docsEmpty: '还没有导入任何文档',\n docChunkCount: '{count} 分块',\n docDeleteConfirmTitle: '删除文档',\n docDeleteConfirm: '确定删除文档「{name}」吗?该文档的所有分块将从知识库中移除。',\n docDeleteSuccess: '文档已删除',\n\n // 检索测试\n searchTitle: '检索测试',\n searchScope: '检索范围:「{name}」',\n searchQueryPlaceholder: '输入查询语句,例如:如何导出数据?',\n searchBtn: '检索',\n searching: '检索中...',\n searchTopKLabel: '返回条数',\n searchThresholdLabel: '相似度阈值',\n searchHitCount: '命中 {count} 条',\n searchNoHits: '没有命中任何内容,可尝试降低相似度阈值。',\n searchFallbackHint: '相似度均低于阈值,以下为最佳匹配(仅供参考):',\n searchFailed: '检索失败: {error}',\n expandFull: '展开全文',\n collapse: '收起',\n scoreLabel: '相似度',\n opFailed: '操作失败: {error}',\n },\n\n // 上下文气泡\n contextBubble: {\n labelSelection: '选中内容',\n labelQuoted: '引用',\n labelSkill: '技能',\n labelMcp: 'MCP',\n labelPage: '网页',\n labelFile: '文件',\n labelKnowledge: '知识库',\n clickToExpand: '点击展开',\n bubbleSkill: '{name} 🧩',\n bubbleMcp: '{name} 🔌',\n bubblePage: '{title} 🌐',\n bubbleKnowledge: '{name} 📚 · 命中 {count} 条',\n bubbleKnowledgeMiss: '{name} 📚 · 未命中',\n bubbleKnowledgeFailed: '{name} 📚 · 检索失败',\n bubbleKnowledgeSearching: '正在检索知识库…',\n kbHitToggle: '点击展开/收起全文',\n kbHitTruncated: '✂ 已截断 · 原文 {total} 字,前 {kept} 字已发送',\n kbHitTruncatedTitle: '为控制上下文体积,内容截断后再发送给模型;此处显示的即模型实际收到的版本',\n kbHitTruncatedBadge: '✂ {count} 条已截断',\n },\n\n // options.html - 导出/导入配置弹窗\n configDialog: {\n exportTitle: '导出配置',\n includeSecrets: '包含 API 密钥',\n secretWarn: '⚠ 敏感信息,请确保文件安全',\n exportDesc: '导出文件将包含除 Agent 连接信息外的所有配置,可选择是否包含 API 密钥。',\n export: '导出',\n importTitle: '导入配置',\n mergeImport: '合并导入 — 仅覆盖文件中存在的配置项,保留其他',\n replaceImport: '完全替换 — 清空当前配置,使用文件中的配置',\n confirmImport: '确认导入',\n exportSuccess: '配置已导出',\n exportFailed: '导出失败: {error}',\n unknownTime: '未知',\n importSummary: '导出时间: {time},包含 {count} 项配置',\n invalidFileFormat: '无效的文件格式',\n unrecognizedFormat: '无法识别的配置格式',\n unknownConfigKey: '未知的配置项: {key}',\n importFailed: '导入失败: {error}',\n importParseFailed: '导入失败: 无法解析文件格式',\n importedCount: '已导入 {count} 项配置',\n },\n};\n","// English language pack\n// Grouped by module; keys accessed via dot notation (e.g. t('common.confirm'))\n\nexport default {\n common: {\n confirm: 'Confirm',\n cancel: 'Cancel',\n close: 'Close',\n ok: 'OK',\n save: 'Save',\n delete: 'Delete',\n edit: 'Edit',\n retry: 'Retry',\n loading: 'Loading...',\n none: 'None',\n add: 'Add',\n clear: 'Clear',\n selectAll: 'Select All',\n deselectAll: 'Deselect All',\n refresh: 'Refresh',\n enabled: 'Enabled',\n disabled: 'Disabled',\n bytes: 'bytes',\n copy: 'Copy',\n copySuccess: 'Copied',\n copyFailed: 'Copy failed',\n },\n\n // Sensitive operation confirmation dialog (confirm-dialog pilot)\n dialog: {\n operationConfirm: 'Operation Confirmation',\n confirmDefaultMessage: 'The model requests to execute a sensitive operation. Allow?',\n confirmAction: 'The model requests to execute: {name}',\n remainingTime: 'Time remaining: {time}',\n deny: 'Deny',\n approveOnce: 'Allow Once',\n approveLoop: 'Allow for This Task',\n },\n\n // Sensitive tool display names\n sensitiveTool: {\n manage_cookies: 'Manage Cookies',\n clear_data: 'Clear Page Data',\n download_file: 'Download File',\n manage_tab: 'Tab Management',\n agent_file: 'File Operations',\n debug_page: 'Page Debugger',\n debuggerAttachHint: '\\n\\nAfter enabling, a yellow \"extension is debugging this browser\" infobar appears on the tab until the session ends.',\n unknown: 'Unknown Operation',\n tabInfo: '\\n\\nTab title: {title}\\nTab URL: {url}',\n tabInfoError: '\\n\\n(Unable to get tab info: {error})',\n untitled: 'Untitled',\n unknownUrl: 'Unknown',\n },\n\n // Settings page\n settings: {\n docTitle: 'AI Helper - Settings',\n language: 'Interface Language',\n languageChanged: 'Language changed. Some pages will update after refresh.',\n pageTitle: 'AI Helper Settings',\n subtitle: 'Web AI Assistant - OpenAI Compatible API',\n importConfigTitle: 'Import Settings',\n exportConfigTitle: 'Export Settings',\n tabBasic: 'Basic',\n tabReact: 'Reasoning',\n tabReflection: 'Reflection',\n tabToolbar: 'Selection',\n tabAgent: 'Agent',\n tabToolbox: 'Extension',\n saveConfig: 'Save Settings',\n // Basic tab content\n apiBaseHint: '(Select from dropdown, or enter manually)',\n addApiBaseTitle: 'Add custom API Base URL',\n addAddress: '+ Add address',\n apiBaseUrlPlaceholder: 'API Base URL (e.g. https://api.example.com/v1)',\n apiBaseLabelPlaceholder: 'Label/Note (optional, e.g. My proxy)',\n confirmAdd: 'Confirm Add',\n requiredHint: '(required)',\n apiKeyHint: 'Please obtain the API Key from your LLM provider and enter it here. Keep your API Key safe and avoid leakage.',\n apiKeyPlaceholder: 'Enter your API Key',\n toggleApiKey: 'Show/Hide API Key',\n modelName: 'Model name',\n modelNameHint: '(Select from dropdown, or click the button below to add a new model)',\n selectModelPlaceholder: 'Select a model below',\n noMatch: 'No matches',\n addModelTitle: 'Add custom model',\n addModel: '+ Add model',\n fetchModels: '⟳ Fetch from API',\n fetchModelsTitle: 'Fetch available models from the current provider API',\n fetchModelsLoading: 'Fetching…',\n fetchModelsNeedConfig: 'Please fill in API Base URL and API Key first',\n fetchModelsSuccess: '✅ Fetched {total} models ({added} new)',\n fetchModelsEmpty: 'No models returned, please add manually',\n fetchModelsFailed: '❌ Fetch failed, check config or add manually',\n fetchModelsAuthFailed: '❌ Authentication failed, check API Key',\n modelNameInputPlaceholder: 'Model name (e.g. gpt-4o)',\n contextWindowPlaceholder: 'Context window size (tokens)',\n contextWindowHint: '128K=128000, 200K=200000, 1M=1000000; leave empty to auto-detect',\n enableImageInput: 'Enable image recognition',\n enableImageInputHint: '(When enabled, you can send images to multimodal models in the sidebar)',\n imageApiBaseHint: '(Select from dropdown, or enter manually; leave empty to use base model config)',\n addImageApiBaseTitle: 'Add custom image API Base URL',\n useBaseModelPlaceholder: 'Leave empty to use base model config',\n imageApiKeyHint: '(optional; leave empty to use base model config)',\n imageApiKeyPlaceholder: 'Enter image recognition API Key',\n imageModelNameHint: '(Models with multimodal vision capability; select from list or add a new one; leave empty to use base model name)',\n useBaseModelPlaceholderShort: 'Leave empty to use base model',\n addImageModelTitle: 'Add custom image recognition model',\n systemPrompt: 'System prompt',\n systemPromptHint: '(optional; leave empty to use default)',\n resetToDefault: 'Reset to default',\n systemPromptTip: '💡 Tip: The system prompt defines the behavior and role of the AI assistant.',\n collapse: '− Collapse',\n modelNameRequired: 'Please enter a model name',\n modelAdded: 'Model added',\n imageModelAdded: 'Image model added',\n apiBaseSwitched: 'API Base URL switched. Make sure the API Key is valid.',\n apiBaseRequired: 'Please enter an API Base URL',\n urlInvalid: 'Invalid URL format',\n apiBaseAdded: 'API Base URL added',\n imageApiBaseSwitched: 'Image API Base URL switched',\n imageApiBaseAdded: 'Image API Base URL added',\n maxIterationsRangeError: 'Max loop iterations must be between 10-1000',\n apiTimeoutRangeError: 'API request timeout must be between 1-10 minutes',\n loopTimeoutRangeError: 'Overall loop timeout must be between 1-120 minutes',\n toolTimeoutRangeError: 'Tool execution timeout must be between 1-30 minutes',\n apiKeyEmpty: 'API Key cannot be empty',\n saveFailed: 'Save failed: {message}',\n saveSuccess: 'Configuration saved successfully!',\n deleteModel: 'Delete this model',\n ctxSliderIconTitle: 'Set context window for this model',\n ctxSliderAuto: 'Auto',\n ctxSliderAutoTitle: 'Reset to auto-detect',\n ctxBadgeAutoTip: 'Auto-inferred (not set manually)',\n ctxSliderResetAuto: 'Reset to auto',\n deleteApiBase: 'Delete this address',\n // Provider profiles (multi-profile memory & quick switch)\n providerConfig: 'Provider Profiles',\n providerConfigHint: '(Takes effect immediately after switching; each profile remembers its own API base, key and model list)',\n profileScopeHint: 'The settings below are saved to provider profile “{name}” and follow profile switching',\n newProfile: '+ New',\n newProfileTitle: 'Create an empty provider profile',\n profileNameTitle: 'New Provider Profile',\n saveAsProfile: 'Save As',\n saveAsProfileTitle: 'Save current settings as a new provider profile',\n renameProfile: 'Rename',\n renameProfileTitle: 'Rename current profile',\n deleteProfile: 'Delete',\n deleteProfileTitle: 'Delete current profile',\n profileNamePlaceholder: 'Profile name (e.g. DeepSeek Official, My Proxy)',\n profileNameRequired: 'Please enter a profile name',\n deleteProfileConfirm: 'Are you sure you want to delete provider profile “{name}”? This cannot be undone.',\n atLeastOneProfile: 'At least one provider profile must be kept',\n profileSwitched: 'Switched to {name}',\n profileCreated: 'Profile {name} created',\n profileRenamed: 'Renamed to {name}',\n profileDeleted: 'Profile {name} deleted',\n profileCopySuffix: 'Copy',\n // Completion feedback (sound + confetti)\n completionFeedbackTitle: 'Completion Feedback',\n completionSound: 'Play sound (different tones for success and failure)',\n completionSoundHint: 'Success: bright rising triad (Do-Mi-Sol); Failure: low square-wave double tone; user cancellation is silent',\n completionConfetti: 'Play confetti animation',\n completionConfettiHint: 'Only plays on successful completion; not on failures or cancellations',\n // Desktop notifications\n completionNotification: 'Show a desktop notification when a task completes or fails',\n completionNotificationHint: 'Only shown when the side panel is out of view; success auto-dismisses, failures stay until dismissed; click the notification to open the side panel',\n scheduledNotification: 'Show a desktop notification when a scheduled task completes or fails',\n scheduledNotificationHint: 'Scheduled tasks run in the background with no sound or other alerts, so notifications always appear when enabled; on by default, can be turned off',\n // Interaction reminders\n interactionNotification: 'Remind me when AI needs confirmation or clarification',\n interactionNotificationHint: 'Shows a desktop reminder while the reasoning loop waits for your action; stays quiet when the side panel is in view; click the notification to open the side panel',\n showMessageTimestamp: 'Show message timestamps',\n showMessageTimestampHint: '(Shows the asking time below each user question; time only for today, date included for other days)',\n // Side panel scope\n sidePanelScopeTitle: 'Side Panel Scope',\n sidePanelScopeGlobal: 'Global mode',\n sidePanelScopeTab: 'Tab-bound mode',\n sidePanelScopeGlobalHint: 'All tabs in the same window share one side panel instance, and it stays visible when you switch tabs',\n sidePanelScopeTabHint: 'Side panel shows only on the tabs where you opened it; you can open it on multiple tabs, auto-hides when switching away and restores when switching back',\n // Auto tab grouping\n autoGroupTabs: 'In Tab-bound mode, group tabs where the side panel is opened',\n autoGroupTabsHint: 'Applies to Tab-bound mode only; puts those tabs into a colored tab group for easy identification (tabs move to the group position), and removes a tab when its side panel is closed or you switch back to Global mode',\n },\n\n // Header bar\n header: {\n docTitle: 'AI Helper - Chat',\n settingsTitle: 'Extension Settings',\n switchAgent: 'Switch Assistant',\n defaultAssistant: '🤖 Default Assistant',\n notConnected: 'Not Connected',\n agentAddress: 'Agent Address',\n copyAgentAddress: 'Copy agent address',\n refreshAgentStatus: 'Refresh agent status',\n restart: 'Restart',\n restartAgent: 'Restart agent service',\n update: 'Update',\n updateAndRestart: 'Update and restart agent',\n stop: 'Stop',\n stopAgent: 'Stop agent service',\n addEditAgent: 'Add/Edit Agent',\n addEditAssistant: 'Add/Edit Assistant',\n manageKnowledge: 'Manage Knowledge',\n moreActions: 'More actions',\n clearChat: 'Clear Conversation',\n exportChat: 'Export Conversation',\n importChat: 'Import Conversation',\n prototypeLibrary: 'Prototype Library',\n tokenStats: 'Token Stats',\n auditLog: 'Command Audit',\n shortcuts: 'Shortcuts',\n versionInfo: 'Version Info',\n detachTitle: 'Detach to standalone window',\n attachTitle: 'Attach back to side panel',\n },\n\n // Detach/attach window\n detach: {\n taskRunning: 'Task is running, please wait until it finishes',\n },\n\n // Session management\n session: {\n allSessions: 'All Sessions',\n newSessionTitle: 'New Session (Alt+N)',\n searchPlaceholder: 'Search sessions...',\n closeAll: 'Close All',\n renameTitle: 'Rename Session',\n renamePlaceholder: 'Enter session name',\n confirmCloseTitle: 'Confirm Close Session',\n confirmCloseMessage: 'Are you sure you want to close this session? This action cannot be undone.',\n },\n\n // Welcome area\n chat: {\n welcomeTitle: 'Start a Conversation',\n welcomeSubtitle: 'Enter your question and the AI assistant will help you',\n askBasedOnSelection: 'Ask based on selection',\n confirmClearTitle: 'Confirm Clear',\n confirmClearMessage: 'Are you sure you want to clear all conversation history?',\n confirmDeletePromptTitle: 'Confirm Delete',\n confirmDeletePromptMessage: 'Are you sure you want to delete this prompt?',\n requestFailed: 'Request failed: {message}',\n networkError: 'Network error, please check your connection and try again',\n timeoutError: 'Request timeout: {message}',\n taskInterruptedSwRestart: 'Background service restarted unexpectedly, API call interrupted',\n quote: 'Quote',\n export: 'Export',\n quoteTitle: 'Quote this message',\n quotedPrefix: '💬 Quoted: {text}',\n navPrevTitle: 'Previous message (Alt+↑), Ctrl/Cmd+click to go to top',\n navNextTitle: 'Next message (Alt+↓), Ctrl/Cmd+click to go to bottom',\n navQuestionTitle: 'Questions',\n navEmptyLabel: 'No questions',\n navQuestionNoText: '(image/attachment message)',\n },\n\n // Tool panel\n toolPanel: {\n title: 'Tool Settings',\n searchPlaceholder: 'Search tool name or description...',\n categoryAll: 'All',\n preselect: 'Tool Pre-filter',\n preselectHint: 'On: The AI first decides which tools might be useful and only sends relevant ones. Saves tokens, but if it misjudges and misses a key tool, the task may fail.\\nOff: All enabled tools are sent at once. No judgment overhead, faster start, but too many tools waste tokens.',\n confirmHint: 'When enabled, the model will show a confirmation dialog for sensitive operations (tool calls, command execution, etc.) and wait for user approval.\\nWhen disabled, all operations will be executed directly without confirmation.',\n clearSearch: 'Clear search',\n configBtnTitle: 'Click to open detailed tool settings',\n },\n\n // Tool usage statistics\n toolStats: {\n title: '📊 Tool Usage Stats',\n subtitle: 'Call frequency, success rate, average duration per tool',\n usedTools: 'Used Tools',\n calls: 'Calls',\n success: 'Success',\n successRate: 'Success Rate',\n avgDuration: 'Avg Duration',\n unusedTools: 'Unused Tools',\n noData: 'No data available',\n btnTitle: 'Tool Usage Stats',\n clearTitle: 'Clear stats',\n },\n\n // Token stats\n tokenStatsPanel: {\n title: '🪙 Token Usage Stats',\n subtitle: 'Per ReAct session & overall dimensions',\n currentSession: 'Current Session',\n globalStats: 'Global Stats',\n recentCalls: 'Recent Calls',\n noData: 'No data available',\n // Tab navigation\n tabTrend: 'Trend',\n tabDistribution: 'Distribution',\n tabGlobal: 'Global',\n // Time range switch\n timeRangeToday: 'Today',\n timeRangeWeek: 'Week',\n timeRangeMonth: 'Month',\n timeRangeAll: 'All',\n // Global sparkline\n globalSparklineTitle: 'Last 30 Days Trend',\n },\n\n // Generic confirm dialog (window.showCustomConfirm)\n customConfirm: {\n defaultTitle: 'Confirm Action',\n },\n\n // Prompt dialog\n promptDialog: {\n title: 'Notice',\n },\n\n // Prompt manager\n promptManager: {\n title: 'Prompt Manager',\n codePlaceholder: 'Code (e.g. code)',\n contentPlaceholder: 'Prompt content',\n addPrompt: 'Add Prompt',\n },\n\n // Clarify dialog\n clarify: {\n title: 'Clarification Needed',\n selectOption: 'Please select an option',\n inputPlaceholder: 'Enter additional info (optional)...',\n customPlaceholder: 'Enter your custom content...',\n additionalTitle: 'Additional Notes (optional)',\n additionalHint: 'If you have more relevant information, you can add it here',\n remainingTime: 'Time remaining: 3:00',\n },\n\n // Prototype library\n prototype: {\n previewTitle: 'UI Prototype Preview',\n continueOptimize: '💡 Continue Optimizing',\n libraryTitle: '🎨 Prototype Library',\n searchPlaceholder: 'Search prototypes...',\n sortTimeNew: 'Time (new→old)',\n sortTimeOld: 'Time (old→new)',\n sortTitleAz: 'Title (A→Z)',\n sortTitleZa: 'Title (Z→A)',\n empty: 'No prototypes',\n zoomOut: 'Zoom out (Ctrl+scroll)',\n zoomReset: 'Click to reset',\n resetZoom: 'Click to reset',\n zoomIn: 'Zoom in (Ctrl+scroll)',\n download: 'Download',\n openInTab: 'Open in new tab',\n openInNewTab: 'Open in new tab',\n openLocal: 'Open in local browser',\n },\n\n // Shortcuts\n shortcuts: {\n title: '⌨️ Shortcuts',\n sendMessage: 'Send message',\n newLine: 'New line',\n inputHistory: 'Input history (in input box)',\n clearInput: 'Clear input',\n keyColumn: 'Shortcut',\n functionColumn: 'Function',\n platformColumn: 'Platform',\n platformWinMac: 'Win / Mac',\n prevMessage: 'Jump to previous message',\n nextMessage: 'Jump to next message',\n colShortcut: 'Shortcut',\n colFunction: 'Function',\n colPlatform: 'Platform',\n gotoPrev: 'Jump to previous message',\n gotoNext: 'Jump to next message',\n scrollTop: 'Scroll to top of conversation',\n scrollBottom: 'Scroll to bottom of conversation',\n fullScreenshot: 'Full-page screenshot',\n areaScreenshot: 'Area screenshot',\n regionScreenshot: 'Area screenshot',\n toggleToolConfig: 'Open/close tool settings',\n openShortcutsPanel: 'Open shortcuts panel',\n openShortcutPanel: 'Open shortcuts panel',\n newSession: 'New session',\n closeSession: 'Close current session',\n closeCurrentSession: 'Close current session',\n editLastMessage: 'Edit last user message',\n },\n\n // Version info modal\n versionInfo: {\n title: 'ℹ️ Version Info',\n version: 'Version',\n tag: 'Git Tag',\n commit: 'Git Commit',\n publishedAt: 'Published At',\n website: 'Website',\n discussions: 'Discussions',\n reportIssue: 'Report Issue',\n githubRepo: 'GitHub Repository',\n giteeRepo: 'Gitee Repository',\n copy: 'Copy Info',\n },\n\n // Image editor\n imageEditor: {\n editImage: 'Edit Image',\n brush: 'Brush (B)',\n rect: 'Rectangle (R)',\n ellipse: 'Ellipse (E)',\n arrow: 'Arrow (A)',\n line: 'Line (L)',\n undo: 'Undo (Ctrl+Z)',\n confirm: 'Confirm (Enter)',\n cancel: 'Cancel (Esc)',\n downloadImage: 'Download image',\n prev: 'Previous',\n next: 'Next',\n prevImage: 'Previous',\n nextImage: 'Next',\n brushSize: 'Brush size',\n eraser: 'Eraser',\n },\n\n // Chat export\n chatExport: {\n selectCurrentOnly: 'Select Current Only',\n selectedCount: '{count} selected',\n exportSelected: 'Export Selected',\n title: 'Export Conversations',\n exportSessions: 'Export Conversations',\n },\n\n // Agent editor\n agentEditor: {\n createNew: 'Create New Assistant',\n namePlaceholder: 'Assistant name',\n icon: 'Icon',\n descPlaceholder: 'What is this assistant good at?',\n templateQuickCreate: 'Quick create from template',\n promptPlaceholder: 'You are a professional...',\n availableTools: 'Available Tools',\n availableSkills: 'Available Skills',\n modelSettings: 'Model Settings (leave empty to use global settings)',\n modelPlaceholder: 'Select or enter model name',\n allowSubAgent: 'Allow being scheduled as a sub-assistant',\n name: 'Name',\n desc: 'Short description',\n nameLabel: 'Name',\n descLabel: 'Short description',\n selectTemplate: '-- Select template (optional) --',\n systemPrompt: 'System prompt (defines the assistant role and capabilities)',\n inheritGlobalToolsHint: '(unchecked: inherit global tool settings)',\n inheritGlobalSkillsHint: '(unchecked: use all enabled skills)',\n toolsInheritGlobal: '(unchecked: inherit global tool settings)',\n skillsInheritAll: '(unchecked: use all enabled skills)',\n noSetting: 'No setting (use global)',\n noPreset: 'No setting (use global)',\n deleteTitle: 'Delete this assistant',\n deleteAgentTitle: 'Delete this assistant',\n },\n\n // Command audit log\n auditLog: {\n title: '📋 Command Audit',\n filterAll: 'All',\n filterCommand: 'Command Execution',\n filterFile: 'File Operation',\n filterAuth: 'Authentication',\n filterSecurity: 'Security',\n filterSystem: 'System',\n recent50: 'Last 50',\n recent100: 'Last 100',\n recent200: 'Last 200',\n recent500: 'Last 500',\n searchPlaceholder: 'Search action name, command or path...',\n categoryFilter: 'Category filter:',\n countLabel: 'Count:',\n clearSearch: 'Clear',\n empty: 'No audit logs',\n noLogs: 'No audit logs',\n defaultRange: 'Defaults to querying the last 7 days of audit logs',\n },\n\n // Input area\n input: {\n atHint: 'Prompts (click) / Pages (Ctrl/Cmd+click)',\n placeholder: \"Type '/' for prompts, '@' to switch assistant/page, '$' to pick workspace file, '↑↓' for history, Esc to clear\",\n send: 'Send',\n clearSelection: 'Clear selected content',\n pageLabel: '🌐 Page',\n clearPage: 'Clear page',\n mcpLabel: '🔌 MCP',\n clearMcp: 'Clear MCP service',\n skillLabel: '🧩 Skill',\n clearSkill: 'Clear skill',\n screenshotTitle: 'Capture current page',\n attachFileTitle: 'Upload file (PDF/Word/Excel/Text)',\n screenshot: 'Capture current page',\n uploadFile: 'Upload file (PDF/Word/Excel/Text)',\n aiDisclaimer: 'AI-generated content, for reference only.',\n addMenuTitle: 'Add content',\n addMenuPrompt: 'Prompts',\n addMenuScreenshot: 'Screenshot',\n addMenuScreenshotFull: 'Full page capture',\n addMenuScreenshotFullDesc: 'Capture the current visible page',\n addMenuScreenshotRegion: 'Area capture',\n addMenuScreenshotRegionDesc: 'Drag to select an area on the page',\n addMenuFile: 'Attachment',\n addMenuSwitches: 'Toggles',\n },\n\n // Model selector dropdown\n model: {\n selectModel: 'Select model',\n temperature: 'Temperature',\n },\n\n // Filter search for inline selects (provider / model lists)\n sectionSelect: {\n searchPlaceholder: 'Type to filter…',\n noMatch: 'No matches',\n },\n\n // API provider quick switch (side panel model settings)\n provider: {\n label: 'API Provider',\n manage: 'Manage provider profiles',\n },\n\n // Prompt/Agent selector\n promptSelector: {\n prompts: 'Prompts',\n skills: 'Skills',\n pages: 'Pages',\n agents: 'Assistants',\n proxies: 'Agents',\n knowledge: 'Knowledge',\n pagesCount: 'Pages ({count})',\n agentsCount: 'Assistants ({count})',\n proxiesCount: 'Agents ({count})',\n knowledgeCount: 'Knowledge ({count})',\n headerHint: 'Arrow keys to switch · Enter to send · Ctrl+Enter to insert into input',\n agentHeaderHint: 'Arrow keys to switch · Enter to select · Esc to cancel',\n switchHint: 'Arrow keys to switch · Enter to send · Ctrl+Enter to insert into input',\n switchHintSelect: 'Arrow keys to switch · Enter to select · Ctrl+Enter to select & close · Esc to cancel',\n mergedTitle: 'Aggregated Search',\n mergedTitleCount: 'Aggregated Search ({count})',\n },\n\n // Memory settings\n memory: {\n label: 'Memory',\n historyLimit: 'Memory History Limit',\n configEntry: 'Open memory settings',\n hint: 'More memory means more coherent context, but higher token consumption; too little memory may prevent accurate answers based on previous context.',\n unlimited: 'Unlimited',\n recent200: 'Last 200',\n recent100: 'Last 100',\n recent50: 'Last 50',\n recent20: 'Last 20',\n recent10: 'Last 10',\n recent5: 'Last 5',\n recent2: 'Last 2',\n custom: 'Custom:',\n unit: 'entries',\n autoCompactLabel: 'Auto-compact',\n autoCompactHint: 'Compact history into a summary once before sending when context usage reaches 85% (adds one summarization call).',\n persistSummaryLabel: 'Save summary to memory',\n persistSummaryHint: 'Store the compaction summary as cross-session long-term memory; repeated compaction in one session updates the same entry.',\n },\n\n // Toggle items\n toggle: {\n memoryHint: 'When enabled, previous Q&A will be used as context (all by default, configurable count)',\n toolsHint: 'Master tool switch: click to enable or disable tool calls',\n selectionHint: 'When enabled, select text on page to quickly ask questions',\n tools: 'Tools',\n selection: 'Selection',\n modelSettings: 'Model Settings',\n toolsConfigTitle: 'Click to open detailed tool settings',\n },\n\n // Selection indicators\n selection: {\n clearSelection: 'Clear selected content',\n page: '🌐 Page',\n clearPage: 'Clear page',\n clearMcp: 'Clear MCP service',\n skill: '🧩 Skill',\n clearSkill: 'Clear skill',\n },\n\n // Tool category names (corresponds to constants.js TOOL_CATEGORY_NAMES)\n toolCategory: {\n page_interaction: '🖱️ Page Interaction',\n form_operation: '📝 Form Operation',\n content_extraction: '📄 Content Extraction',\n tab_management: '📑 Tab Management',\n bookmark_history: '🔖 Bookmarks & History',\n storage_management: '💾 Storage Management',\n network_request: '🌐 Network Request',\n media_output: '📷 Media & Output',\n debug_dev: '🔧 Debug & Dev',\n ai_collaboration: '🤖 AI Collaboration',\n local_agent: '🖥️ Agent',\n mcp: '🔌 MCP',\n knowledge: '📚 Knowledge',\n },\n\n // Preset temperature modes (side_panel/constants.js PRESET_MODES)\n presetMode: {\n preciseLabel: 'Precise',\n preciseTip: 'Bug fixing, debugging, accurate answers (low randomness, good for fixing bugs)',\n generalLabel: 'General',\n generalTip: 'Works well for most cases (balanced stability & flexibility, good for scripts)',\n divergentLabel: 'Divergent',\n divergentTip: 'Multiple approaches to compare (good for refactoring, solution comparison)',\n creativeLabel: 'Creative',\n creativeTip: 'Copywriting, naming, brainstorming (high randomness, not for production code)',\n },\n\n // Tool descriptions (for users; model-facing English descriptions in background/tools/*.js)\n tool: {\n agent_file: 'File operations on agent machine (read/write/list/delete/download)',\n agent_trash: 'Manage agent trash bin (list/restore deleted items)',\n agent_exec: 'Execute shell commands on agent machine',\n agent_search: 'Search files or content on agent machine',\n agent_skill: 'Load or run a Skill (run=Workflow, load=Agent Skill)',\n manage_agent: 'List or switch paired AI agents',\n exec_log: 'Extract execution logs to analyze successful paths and failure lessons',\n clarify_question: 'Ask user a clarifying question with options',\n highlight_text: 'Highlight text on page for visual emphasis',\n plan_task: 'Plan and decompose complex task into subtasks',\n search_chats: 'Search past conversation history',\n preview_ui: 'Preview or retrieve a UI prototype',\n dispatch_task: 'Dispatch task to a sub-agent',\n interact_element: 'Interact with page element (locate via ref/text/selector; click/hover/type)',\n scroll_to: 'Scroll page to target (element/coordinates/text)',\n wait_element: 'Wait for element to appear/disappear/change visibility',\n drag_drop: 'Drag element (⚠️ experimental, may not work on most pages)',\n wait_navigation: 'Wait for page navigation to complete',\n handle_dialog: 'Handle page dialogs (accept/dismiss/restore alert/confirm/prompt)',\n fill_form: 'Fill multiple form fields at once (supports ref)',\n keyboard_input: 'Type text or dispatch key event (bypasses React/Vue controlled components)',\n file_upload: 'Upload file to page',\n select_dropdown: 'Dropdown selection (supports custom components)',\n page_content: 'Get page text or HTML content',\n extract_data: 'Extract structured data (tables/links/images/forms/metadata)',\n query_elements: 'Query interactive elements, returns tree snapshot with ref numbers (open overlays lifted under [Open overlays]; visible iframes included as [frame #N] blocks with globally valid refs; refs stable for the same element; re-query after page changes; use page to paginate when hasMore)',\n search_in_page: 'Find text in current page content',\n iframe_content: 'Get content of an iframe in the page',\n scroll_collect: 'Scroll and collect content from infinite scroll/lazy-loaded pages',\n notify: 'Show browser notification',\n clipboard: 'Clipboard operations (copy/paste/get selection)',\n download_file: 'Download file to local',\n qrcode: 'Generate QR code',\n capture_page: 'Capture page screenshot (download/analyze/both)',\n browser_info: 'Get browser version and environment info',\n inject_css: 'Inject custom CSS into page',\n agent_memory: 'Long-term memory management (store/recall/manage)',\n manage_storage: 'Read/write browser localStorage or sessionStorage',\n manage_cookies: 'Get/set/remove/list browser cookies',\n clear_data: 'Clear localStorage/sessionStorage for a site',\n fetch_url: 'Send HTTP GET/POST request to a URL',\n manage_tab: 'Manage browser tabs (open/switch/close/reload/navigate)',\n list_tabs: 'Get list of open tabs',\n search_browser_data: 'Search browser bookmarks or history',\n debug_page: 'Advanced page debugging via CDP: native input events, network capture, JS evaluation, full-page/element screenshots, device & UA emulation',\n knowledge_search: 'Search knowledge bases for relevant content (read-only)',\n knowledge_ingest: 'Import text/local file/web page into a knowledge base (write operation)',\n knowledge_list: 'List available knowledge bases and document counts',\n },\n\n // options.html - react tab\n react: {\n title: '⚙️ Reasoning Loop Settings',\n subtitle: 'Control behavior parameters of the AI reasoning loop (advanced)',\n maxIterations: 'Max loop iterations',\n maxIterationsHint: '(increase for complex tasks)',\n min: 'Min: 10',\n max: 'Max: 1000',\n apiTimeout: 'API request timeout',\n apiTimeoutHint: '(max wait time for a single API call)',\n unitMinute: 'minutes (min)',\n min1Minute: 'Min: 1 minute',\n max10Minutes: 'Max: 10 minutes',\n max120Minutes: 'Max: 120 minutes',\n max30Minutes: 'Max: 30 minutes',\n loopTimeout: 'Overall loop timeout',\n loopTimeoutHint: '(max execution time for the entire reasoning loop)',\n toolTimeout: 'Tool execution timeout',\n toolTimeoutHint: '(max wait time for a single tool execution)',\n toolConfirmation: 'Sensitive operation confirmation',\n toolConfirmationHint: '(confirm via dialog before the model performs sensitive operations)',\n enabled: 'Enabled',\n disabled: 'Disabled',\n toolConfirmationDesc1: 'When enabled, the model will show a confirmation dialog for sensitive operations (tool calls, command execution, etc.) and wait for user approval.',\n toolConfirmationDesc2: 'When disabled, all operations will be executed directly without confirmation.',\n enableExecutionLog: 'Enable execution log',\n enableExecutionLogHint: '(show detailed logs of API calls and tool execution to help debug and understand AI thinking)',\n enableExecutionLogDesc1: 'When enabled, an \"Execution Log\" button appears under messages; click to view the detailed API call and tool execution process.',\n enableExecutionLogDesc2: 'When disabled, the button no longer appears.',\n streaming: 'Streaming output',\n streamingHint: '(when enabled, AI replies are streamed token-by-token for faster perceived response)',\n streamingDesc1: 'When enabled, AI replies and agent-side command execution output stream in real time for faster feedback.',\n streamingDesc2: 'If you encounter compatibility issues, disable this to fall back to one-shot output mode.',\n streamExpandTools: 'Expand streaming tool cards by default',\n streamExpandToolsHint: '(when disabled, tool cards are collapsed by default; only title and status are shown, click to expand)',\n configGuide: '💡 Configuration Notes',\n guideReasoningLoop: 'Reasoning loop',\n guideReasoningLoopDesc: ' is the core mechanism for the AI assistant to perform multi-step reasoning and tool calls.',\n guideLoopCount: 'Loop count',\n guideLoopCountDesc: ': determines how many reason-act iterations the AI can perform',\n guideTimeout: 'Timeout settings',\n guideTimeoutDesc: ': prevent long waits or infinite loops',\n guideClarifyWait: 'Clarification wait',\n guideClarifyWaitDesc: ': user clarification time is not counted toward the overall loop timeout (paused)',\n guideTip: '• Adjust these parameters based on network conditions and task complexity',\n },\n\n // options.html - Reflection tab\n reflection: {\n title: '🎯 AI Self-Reflection Settings',\n enabled: 'Enabled',\n subtitle: 'Control the AI self-evaluation and revision behavior for task results',\n postReflection: 'Post-reflection',\n postReflectionHint: '(evaluate result quality after completion)',\n subtaskReflection: 'Subtask reflection',\n subtaskReflectionHint: '(advanced feature, off by default)',\n configGuide: '💡 Reflection Configuration Notes',\n guidePostReflection: 'Post-reflection',\n guidePostReflectionDesc: ': after the reasoning loop ends, the AI self-evaluates the final result. If the score is below the threshold, it will automatically revise or re-execute.',\n guideSubtaskReflection: 'Subtask reflection',\n guideSubtaskReflectionDesc: ': performs separate evaluation for subtasks after complex task decomposition; off by default (advanced feature).',\n guideTip: '• Enabling reflection increases the number of API calls; weigh this against your needs',\n },\n\n // options.html - Selection toolbar tab\n toolbar: {\n title: '🔧 Toolbar Settings',\n enabled: 'Enabled',\n subtitle: 'Manage buttons and order of the selection toolbar',\n iconOnly: 'Compact icon-only mode (show icons only, no text)',\n addCustomTool: '+ Add custom tool',\n domainBlocklistTitle: 'Domain blocklist',\n domainBlocklistDesc: 'Add domains where the toolbar should be blocked. Once blocked, the selection toolbar will not appear on those domains.',\n domainAddPlaceholder: 'e.g. example.com (without http/https)',\n add: 'Add',\n toolEditModalTitle: 'Add custom tool',\n toolName: 'Tool name',\n toolNamePlaceholder: 'e.g. Polish, Rewrite, Code review',\n systemPromptLabel: 'System prompt',\n systemPromptHint: '(defines the tool behavior)',\n toolPromptPlaceholder: 'e.g. You are a text polishing assistant. Make the user input more fluent and professional.',\n builtinBadge: 'Built-in',\n customBadge: 'Custom',\n moveUp: 'Move up',\n moveDown: 'Move down',\n dragSort: 'Drag to sort',\n editCustomToolTitle: 'Edit custom tool',\n toolNameEmpty: 'Tool name cannot be empty',\n toolPromptEmpty: 'System prompt cannot be empty',\n toolNotFound: 'Tool not found',\n cannotEditBuiltin: 'Cannot edit built-in tools',\n noBlockedDomains: 'No blocked domains. Enter a domain above to add.',\n unblock: 'Unblock',\n domainEmpty: 'Domain cannot be empty',\n domainInvalid: 'Please enter a valid domain, e.g. example.com',\n domainExists: 'This domain already exists',\n },\n\n // options.html - Agent config tab\n agentConfig: {\n title: '🖥️ Agent Settings',\n subtitle: 'Connect to the agent service for advanced capabilities such as file read/write, system command execution, conversation memory management, Skill workflows and MCP protocol extensions. Supports multiple agents with one-click connection.',\n pairedAgents: 'Paired agents',\n notConnected: 'Not connected',\n detailToggle: '▶ Details',\n addAgentTitle: 'Add new agent',\n agentName: 'Agent name',\n agentNameHint: '(custom; auto-fetched if empty)',\n agentNamePlaceholder: 'e.g. Office Mac',\n agentUrl: 'Agent address',\n agentUrlHint: '(HTTP address of the agent service)',\n pairCode: 'Pairing code',\n pairCodeHint: '(view it in the Agent terminal window)',\n pairCodePlaceholder: '6-digit pairing code',\n connect: 'Connect',\n toolCount: '{count} tools',\n selectedTotalCount: '(Selected {selected} / Total {total})',\n toggleCategoryAll: 'Click to toggle select all/deselect all in this category',\n useInstructionTitle: '💡 Usage Instructions and Safety Tips',\n installGuideTitle: '📥 Install Agent v{version} (matches current extension version)',\n installGuideHint: 'Copy the command below and paste it into a terminal to install the agent version that matches this extension, avoiding version-mismatch connection failures.',\n installGuideMacLinux: 'macOS / Linux',\n copyCmd: 'Copy',\n copyCmdAuto: 'Copy (for current OS)',\n copyCmdSuccess: 'Install command copied to clipboard',\n copyCmdFailed: 'Copy failed, please select and copy the command manually',\n method1: 'Method 1: NPM global install (recommended)',\n method1Step1: '(requires Node.js ≥ 18)',\n method1Step2: ' or shorthand ',\n method1Step3: '3. The terminal shows a 6-digit pairing code; enter it on this page and click \"Connect\"',\n method2: 'Method 2: Run from source (for development)',\n method2Step2: '2. The terminal shows a 6-digit pairing code; enter it on this page and click \"Connect\"',\n cmdAlias: 'Command alias',\n cmdAliasPrefix: ' can be shortened to ',\n cmdAliasSuffix: '; all commands support this',\n bgRun: 'Background run:',\n bgRunMethod1: ' Method 1: ',\n bgRunMethod1Mid: ' or ',\n bgRunMethod2: ' Method 2: ',\n moreCmd: 'More commands:',\n moreCmdMid: ' or ',\n securityTitle: '⚠️ Security Tips',\n security1: 'The agent service listens only on localhost (127.0.0.1) by default. Modify startup parameters for remote connections.',\n security2: 'File operations are restricted to the working directory and whitelisted directories; no privilege escalation.',\n security3: 'High-risk commands are automatically blocked; sensitive commands support configurable approval.',\n addAnotherAgent: 'Add another agent',\n checking: 'Checking',\n connected: 'Connected',\n online: 'Online',\n offline: 'Offline',\n clickToEditName: 'Click to edit name',\n currentInUse: 'Current in use · ',\n enable: 'Enable',\n disable: 'Disable',\n disconnect: 'Disconnect',\n connectedTo: 'Connected to: {name}',\n confirmDeleteAgent: 'Are you sure you want to delete agent \"{name}\" ({url})?\\nYou will need to pair again after deletion.',\n deleteAgentTitle: 'Delete Agent',\n agentDeleted: 'Agent deleted: {name}',\n agentDisabledToast: 'Agent disabled: {name}',\n agentEnabledToast: 'Agent enabled: {name}',\n fetchingAgentInfo: 'Fetching agent info...',\n agentUnreachable: 'Agent service unreachable',\n tokenExpired: 'Token expired - please re-pair',\n cannotConnectAgent: 'Cannot connect to agent - please make sure the agent service is running',\n notConnectedSelect: 'Not connected - please select an agent from the list',\n notConnectedAdd: 'Not connected - please add an agent pair',\n unlimited: 'Unlimited',\n idle: 'Idle',\n unknownCommand: '(unknown command)',\n detailVersion: 'Version',\n detailSystem: 'System',\n detailHostname: 'Hostname',\n detailHomeDir: 'Home directory',\n detailRunningProcesses: 'Running processes',\n detailRunningProcessesCount: 'Running processes ({count})',\n detailMemoryUsage: 'Memory usage',\n detailMemoryDetail: 'Heap {used}MB / Total {total}MB · RSS {rss}MB',\n detailUptime: 'Uptime',\n detailCpuUser: 'CPU user',\n detailCpuSystem: 'CPU system',\n detailCommandTimeout: 'Command timeout',\n detailUploadMaxSize: 'Upload size limit',\n detailFileMaxSize: 'Read size limit',\n detailAllowedPaths: 'Allowed paths',\n detailPairCodeTTL: 'Pairing code validity',\n detailWorkdir: '📁 Working directory: {dir}',\n pairCodeRequired: 'Please enter the 6-digit pairing code',\n pairing: 'Pairing...',\n pairingBtn: 'Pairing...',\n unnamedAgent: 'Unnamed agent',\n pairSuccess: 'Pairing succeeded! Added: {name}',\n pairFailed: 'Pairing failed: {error}',\n unknownError: 'Unknown error',\n connectFailed: 'Connection failed - please make sure the agent service is running',\n cannotConnectAgentMsg: 'Cannot connect to Agent: {error}',\n disconnectedToast: 'Disconnected',\n detailToggleOpen: '▼ Details',\n pairFailedShort: 'Pairing failed',\n },\n\n // options.html - Toolbox tab\n toolbox: {\n checkingAgent: 'Checking Agent connection...',\n mcpTitle: '🔌 MCP Server Management',\n mcpDisabled: 'Disabled',\n mcpDesc: 'Connect external tool servers via the MCP protocol to extend the AI assistant tool capabilities. When disabled, no MCP tools will be sent to the AI context.',\n loading: 'Loading...',\n addMcpServer: '+ Add MCP server',\n skillTitle: '🧩 Skill Management',\n skillDisabled: 'Disabled',\n skillDesc: 'Manage reusable workflows and Agent Skills. When disabled, no Skill content will be injected into the AI system prompt.',\n ragTitle: '📚 Knowledge Retrieval (RAG)',\n ragDisabled: 'Disabled',\n ragDesc: 'Build a knowledge base locally on the agent side for retrieval-augmented answers. Requires optional dependencies (~200-300MB). When disabled, knowledge base content will not be sent to the AI context.',\n ragServiceEnabled: 'Knowledge retrieval enabled',\n ragServiceDisabled: 'Knowledge retrieval disabled',\n ragStatusChecking: 'Checking RAG capability...',\n ragStatusReadyTitle: 'RAG capability ready',\n ragStatusReadyDesc: 'Agent-side dependencies are installed. Knowledge base management will be available in a later version.',\n ragStatusNotInstalledTitle: 'RAG dependencies not installed on agent',\n ragStatusNotInstalledDesc: 'Enable knowledge retrieval by installing the extra dependency packages on the agent side first.',\n ragStatusNodeLowTitle: 'Environment requirement not met',\n ragStatusNodeLowDesc: 'RAG requires Node.js 22+ (agent currently runs {version}). Please upgrade Node.js and restart the agent.',\n ragStatusAgentOffTitle: 'Agent not connected',\n ragStatusAgentOffDesc: 'Please connect the Agent service in the \"Agent\" tab first, then configure knowledge retrieval',\n ragStatusUnreachableTitle: 'Cannot fetch agent status',\n ragStatusUnreachableDesc: 'Please make sure the agent service is running, then click \"Re-detect\".',\n ragInstallPackagesLabel: 'Packages to install:',\n ragInstallRequirements: 'Requires Node.js 22+; estimated download of about 200-300MB (includes onnxruntime native libraries, varies by platform); first use also downloads an AI model (~95MB).',\n ragInstallNoRestartNeeded: 'Ready automatically after installation - no agent restart needed.',\n ragInstallCommandLabel: 'Or run manually in the agent install directory:',\n ragCopyCmd: '📋 Copy command',\n ragCopied: 'Copied to clipboard',\n ragCopyFailed: 'Copy failed, please select and copy manually',\n ragInstallBtn: '⬇️ Install RAG dependencies',\n ragInstallBtnBusy: 'Installing...',\n ragRedetectBtn: '🔄 Re-detect',\n ragInstallStarted: 'Installation started, downloading dependencies...',\n ragInstallRunning: 'Installing RAG dependencies...',\n ragAutoRestoreRunning: 'Dependencies missing after agent update - auto-restoring...',\n ragInstallTip: 'Installation may take several minutes. Please do not close the agent service.',\n ragInstallVerifying: 'Installation finished, verifying...',\n ragInstallSuccess: 'RAG dependencies installed successfully, capability is ready',\n ragInstallFailedToast: 'RAG dependency installation failed',\n ragInstallFailedAdvice: 'If installation keeps failing, try restarting the agent service (or retry later), then click \"Re-detect\".',\n ragInstallLogLabel: 'Installation log (recent output):',\n ragRedetectReady: 'Re-detection finished: RAG capability is ready',\n ragRedetectStillMissing: 'Re-detection finished: RAG dependencies still missing',\n ragRedetectStillMissingDetail: 'RAG dependencies still missing - {error}',\n ragRedetectFailed: 'Re-detection failed: {error}',\n importSkill: '+ Import Skill',\n reloadSkills: '🔄 Reload',\n enabledCountTotal: 'Enabled {enabled} / Total {total}',\n unknownAgent: 'Unknown agent',\n currentAgentSupports: 'Current agent: <strong>{name}</strong> — MCP and Skill supported',\n agentNotConnectedHint: 'Agent not connected — please connect in the \"Agent\" tab',\n mcpIdRequired: 'Please enter the server ID',\n mcpUrlRequired: 'Please enter the server URL',\n mcpCommandRequired: 'Please enter the command path',\n mcpReconnecting: 'Reconnecting...',\n mcpUpdateReconnected: 'MCP server updated, reconnected ({count} tools)',\n mcpUnknownError: 'Unknown error, please check the command and arguments',\n mcpUpdatedReconnectFailed: 'Config updated, but reconnect failed: {error}',\n mcpUpdateSuccess: 'MCP server updated successfully',\n mcpUpdateFailed: 'Update failed: {error}',\n mcpServiceEnabled: 'MCP service enabled',\n mcpServiceDisabled: 'MCP service disabled',\n skillServiceEnabled: 'Skill service enabled',\n skillServiceDisabled: 'Skill service disabled',\n mcpAddSuccess: 'MCP server added successfully',\n mcpAddFailed: 'Add failed: {error}',\n mcpConnecting: 'Connecting...',\n mcpConnectSuccess: 'Connected successfully',\n mcpDisconnectSuccess: 'Disconnected',\n mcpEnabledToast: 'Enabled',\n mcpDisabledToast: 'Disabled',\n mcpConfirmDelete: 'Are you sure you want to delete this MCP server?',\n deleteConfirmTitle: 'Confirm Delete',\n deleteSuccess: 'Deleted successfully',\n collapseTools: 'Collapse {count} tools',\n viewTools: 'View {count} tools',\n operationFailed: 'Operation failed: {error}',\n sizeBytes: 'Size: {size} bytes',\n skillConfirmDelete: 'Are you sure you want to delete Skill \"{name}\"?',\n skillEnabledToast: 'Enabled Skill \"{name}\"',\n skillDisabledToast: 'Disabled Skill \"{name}\"',\n skillInfoFailed: 'Failed to get Skill info: {error}',\n skillRunning: 'Running Skill \"{name}\"...',\n skillContentFailed: 'Failed to get Skill content',\n skillGetFailed: 'Failed to fetch: {error}',\n skillsReloaded: 'Reloaded {count} Skills',\n skillsReloadFailed: 'Reload failed: {error}',\n emptyAgentNotConnectedTitle: 'Agent not connected',\n emptyAgentNotConnectedDescMcp: 'Please connect the Agent service in the \"Agent\" tab first, then configure MCP servers',\n emptyNoMcpTitle: 'No MCP servers',\n emptyNoMcpDesc: 'Click the button below to add an MCP server and extend the AI assistant tool capabilities',\n emptyAgentNotConnectedDescSkill: 'Please connect the Agent service in the \"Agent\" tab first, then manage Skills',\n emptyNoSkillTitle: 'No Skills',\n emptyNoSkillDesc: 'Two Skill types are supported:<br><strong>Workflow Skill</strong>: import JSON files (deterministic automated flows)<br><strong>Agent Skill</strong>: import SKILL.md directory/Zip/URL (AI capability extension)',\n mcpIdPlaceholder: 'Server ID',\n mcpIdPlaceholderUnique: 'Server ID (unique identifier)',\n mcpNamePlaceholder: 'Display name',\n mcpEnvVars: 'Environment variables',\n mcpEnvVarsHint: '(Only needed for stdio transport; export sensitive values in shell config)',\n mcpAddVar: '+ Add variable',\n mcpConnected: 'Connected',\n mcpDisconnected: 'Not connected',\n mcpToggleEnabled: 'Enabled, click to disable',\n mcpToggleDisabled: 'Disabled, click to enable',\n mcpDisconnectBtn: 'Disconnect',\n mcpConnectBtn: 'Connect',\n mcpVarNamePlaceholder: 'Variable name',\n mcpVarValuePlaceholder: 'Value',\n mcpToggleEye: 'Show/Hide',\n mcpRemoveRow: 'Remove this row',\n mcpHeaderNamePlaceholder: 'Header name',\n mcpHeaders: 'Headers',\n mcpHeadersHint: '(HTTP request headers, e.g. Authorization, X-API-Key)',\n mcpAddHeader: '+ Add header',\n transportStdioTitle: 'Subprocess communication (npx/python etc.)',\n transportSseTitle: 'Server-Sent Events (HTTP GET long connection + POST to send)',\n transportStreamableHttpTitle: 'MCP officially recommended HTTP transport (POST + GET SSE)',\n transportWebsocketTitle: 'WebSocket bidirectional communication',\n mcpCommandPlaceholder: 'Command path, e.g. npx, python',\n mcpArgsPlaceholder: 'Arguments, space-separated',\n mcpCustomHeadersCount: '{count} custom headers',\n mcpAddFailedShort: 'Add failed',\n mcpDeleteFailedShort: 'Delete failed',\n mcpConnectFailedShort: 'Connect failed',\n mcpDisconnectFailedShort: 'Disconnect failed',\n mcpOperationFailedShort: 'Operation failed',\n workflowSkillsTitle: 'Workflow Skills (automated flows)',\n agentSkillsTitle: 'Agent Skills (AI capability extension)',\n stepCount: '{count} steps',\n resourceCount: '{count} resources',\n expand: 'Expand',\n run: 'Run',\n enable: 'Enable',\n disable: 'Disable',\n builtin: 'Built-in',\n moreCount: '+{count} more',\n editSkillMd: 'Edit SKILL.md',\n viewDetails: 'View details',\n required: '*Required',\n optional: 'Optional',\n runSkillTitle: 'Run Skill \"{name}\"',\n fillParamsHint: 'Please fill in the following parameters and run:',\n defaultParamHint: ' (default: {default})',\n noExecutionResult: 'No execution result',\n conditionNotMetSkipped: 'Condition not met, skipped',\n executionSuccess: 'Executed successfully',\n executionFailed: 'Execution failed',\n truncated: '... ({count} chars total, truncated)',\n executionComplete: 'Execution complete',\n executionSummary: '{success} succeeded, {fail} failed, {skip} skipped',\n skillRunResultTitle: 'Skill \"{name}\" {status}',\n skillImportFailedShort: 'Import failed',\n skillDeleteFailedShort: 'Delete failed',\n skillOperationFailedShort: 'Operation failed',\n invalidSkillDataFormat: 'Invalid Skill data format',\n editAgentSkill: 'Edit Agent Skill',\n newAgentSkill: 'New Agent Skill',\n skillNameLabel: 'Skill name',\n skillDescLabel: 'Description',\n skillVersionLabel: 'Version',\n skillMarkdownLabel: 'SKILL.md content (Markdown)',\n skillDescPlaceholder: 'Briefly describe what this Skill does (prefer \"Use when...\" phrasing so the model can load it on demand)',\n skillDescScenePlaceholder: 'Briefly describe the Skill functionality and applicable scenarios (prefer \"Use when...\" phrasing so the model can load it on demand)',\n skillNameExamplePlaceholder: 'e.g. code-review or deploy-to-server',\n skillMarkdownPlaceholder: '# Skill name\\n\\n## When to use\\n- Condition 1\\n- Condition 2\\n\\n## Execution steps\\n1. Step 1\\n2. Step 2',\n skillMarkdownPlaceholderShort: '## When to use\\n- Condition 1\\n- Condition 2\\n\\n## Execution steps\\n1. Step 1\\n2. Step 2',\n existingResources: 'Existing resource files',\n skillNameRequired: 'Please enter the Skill name',\n skillMarkdownRequired: 'Please enter the SKILL.md content',\n agentSkillSaved: 'Agent Skill \"{name}\" saved successfully',\n saveFailedShort: 'Save failed',\n saveFailed: 'Save failed: {error}',\n viewSkillTitle: 'View Skill: {name}',\n importSkillTitle: 'Import Skill',\n importBtn: 'Import',\n jsonImport: 'JSON Import',\n newAuthoring: 'New Authoring',\n zipPackage: 'Zip',\n urlImport: 'URL Import',\n jsonImportDesc: 'Import a Workflow Skill in JSON format (deterministic automated flow)',\n clickOrDragJson: 'Click to select a JSON file or drag it here',\n jsonFileHint: 'Supports .json Workflow Skill definition files',\n markdownImportDesc: 'Write SKILL.md content directly to create an Agent Skill (AI capability extension)',\n zipImportDesc: 'Import a Zip archive containing SKILL.md, with optional scripts/templates/assets resources',\n clickOrDragZip: 'Click to select a Zip file or drag it here',\n zipFileHint: 'The Zip must contain a SKILL.md file; optional scripts/ templates/ assets/ subdirectories',\n urlImportDesc: 'Download a Skill Zip from a remote URL and import automatically',\n downloadUrl: 'Download URL',\n selectJsonFile: 'Please select a JSON file',\n workflowSkillImported: 'Workflow Skill \"{name}\" imported successfully',\n agentSkillCreated: 'Agent Skill \"{name}\" created successfully',\n createFailedShort: 'Create failed',\n selectZipFile: 'Please select a Zip file',\n fileTooLarge: 'File too large; max 50MB supported',\n fileReadFailed: 'File read failed',\n agentSkillImported: 'Agent Skill \"{name}\" imported successfully',\n urlRequired: 'Please enter a URL',\n importFailed: 'Import failed: {error}',\n // Search + filter\n searchMcpPlaceholder: 'Search MCP servers...',\n searchSkillPlaceholder: 'Search skills...',\n filterAll: 'All',\n filterEnabled: 'Enabled',\n filterDisabled: 'Disabled',\n noMatchResult: 'No matching results',\n },\n\n // Memory vector config panel (options.html Memory tab)\n memoryPanel: {\n tabTitle: 'Memory',\n title: 'Memory Vectors',\n enabled: 'Enabled',\n disabled: 'Disabled',\n statusTitle: 'Vector index status',\n statusLoading: 'Loading…',\n statusOffline: 'Agent is not connected, vector status unavailable',\n statusFail: 'Failed to read vector status',\n statusOldAgent: 'This agent version has no such status endpoint — restart the agent',\n statusDetail: 'Response',\n statusIndexed: 'Indexed {indexed} of {total}',\n statusStored: 'Stored vector fingerprint',\n statusCurrent: 'Current config fingerprint',\n statusTier: 'Active tier',\n statusStale: 'Stale: model changed without rebuild',\n statusFresh: 'Matches current config',\n staleHint: 'Old vectors are incomparable with the new config, so semantic recall degrades silently. Click “Rebuild vector index” (save unsaved edits first).',\n modeLabel: 'Embedding source',\n modeRemote: 'Remote service (OpenAI-compatible API)',\n modeLocal: 'Local model',\n baseUrlLabel: 'Endpoint',\n baseUrlPlaceholder: 'https://api.openai.com/v1',\n modelLabel: 'Model name',\n modelPlaceholder: 'BAAI/bge-m3',\n apiKeyLabel: 'API Key',\n apiKeyPlaceholder: 'Leave blank to keep the stored key',\n apiKeyClearBtn: 'Clear stored key',\n apiKeyClearConfirm: 'Remote semantic recall stops (falls back to keywords) until a new key is saved. Clear the stored key?',\n apiKeyCleared: 'Stored API key cleared',\n apiKeyClearFail: 'Failed to clear key: {error}',\n configNotLoaded: 'Config failed to load. Refresh the panel before saving so the agent’s stored settings are not overwritten with blanks',\n dimsLabel: 'Vector dimensions (blank is fine, detected on test)',\n prefixLabel: 'Query prefix (optional)',\n localNotice: 'Local mode needs no connectivity test: save, then rebuild the vector index (the first run downloads the model and may take tens of minutes). Embeddings are silently truncated at 512 tokens, so only the head of an over-long entry is indexed.',\n testBtn: 'Test connectivity',\n testRunning: 'Testing…',\n testOk: 'OK: {model} returns {dims} dimensions',\n testFail: 'Test failed: {error}',\n scopeHint: 'Clicking the bottom “Save” also writes this tab’s config into the agent service config.json; when the agent is offline this item is skipped and only extension settings are saved',\n saveSkippedOffline: 'Agent not connected — memory vector config was not saved (only extension settings saved)',\n saveSuccess: 'Memory vector config saved',\n saveFail: 'Save failed: {error}',\n toggleOnSaved: 'Semantic vector recall enabled',\n toggleOffSaved: 'Semantic vector recall disabled - recall falls back to keywords',\n toggleFail: 'Failed to toggle: {error}',\n reindexBtn: 'Rebuild vector index',\n reindexConfirm: 'Rebuilding recomputes vectors for every memory with the current config. On local mode 41 entries measured about 23 minutes (remote about 2). Keep this page open. Continue?',\n reindexRunning: 'Rebuilding, please keep this page open…',\n reindexDone: 'Rebuild done: indexed {indexed} of {total}',\n reindexBatchFail: ' ({count} batches failed, see agent logs)',\n reindexOverWindow: ' ({count} entries exceed the {window}-token window, their tails are not indexed)',\n reindexSkipped: 'Rebuild skipped: vector tier is disabled',\n reindexFail: 'Rebuild failed: {error}',\n gateAgentOffTitle: 'Agent not connected',\n gateAgentOffBody: 'Memory vector config is provided by the local agent. Connect an agent in the \"Agent\" tab first, then come back here.',\n gateRagTitle: 'Local model dependency missing',\n gateRagMissing: 'Local models require the RAG dependency. Install it in the \"Extensions\" panel first, then come back here.',\n goToAgentTab: 'Go to \"Agent\" tab',\n goToToolboxTab: 'Go to \"Extensions\" tab'\n },\n\n // Knowledge base management panel (options.html Knowledge tab)\n knowledge: {\n tabTitle: 'Knowledge',\n\n // Gating guide\n gateAgentOffTitle: 'Agent not connected',\n gateAgentOffDesc: 'Knowledge base is provided by the local agent. Connect an agent in the \"Agent\" tab first, then come back here.',\n gateRagOffTitle: 'Knowledge base feature is disabled',\n gateRagOffDesc: 'Turn on the \"Knowledge Retrieval\" master switch above to create and manage knowledge bases.',\n gateRagUnavailableTitle: 'Agent capability not ready',\n gateRagUnavailableDesc: 'RAG dependencies are not installed or the Node version is unsupported (Node 22+ required). See the install guide below.',\n goToAgentTab: 'Go to \"Agent\" tab',\n goToToolboxTab: 'Go to \"Extensions\" tab',\n enableNow: 'Enable Now',\n\n // List\n title: 'Knowledge Bases',\n createBtn: '+ New Knowledge Base',\n searchPlaceholder: 'Search knowledge bases...',\n emptyTitle: 'No knowledge base yet',\n emptyDesc: 'Click \"New Knowledge Base\" to create one, then import documents to get started.',\n loadFailed: 'Failed to load: {error}',\n retry: 'Retry',\n statsSummary: '{docs} docs · {chunks} chunks',\n modeLocal: 'Local model',\n modeRemote: 'Remote service',\n\n // Card actions\n actionEdit: 'Edit',\n actionIngest: 'Import',\n actionSearch: 'Test Search',\n actionDocs: 'Docs',\n actionDelete: 'Delete',\n actionEnable: 'Enable',\n actionDisable: 'Disable',\n badgeDisabled: 'Disabled',\n enableSuccess: 'Knowledge base \"{name}\" enabled',\n disableSuccess: 'Knowledge base \"{name}\" disabled',\n\n // Create dialog\n createTitle: 'New Knowledge Base',\n nameLabel: 'Name',\n namePlaceholder: 'e.g. Product Docs',\n descLabel: 'Description (optional)',\n descPlaceholder: 'Briefly describe what this knowledge base contains',\n createConfirm: 'Create',\n creating: 'Creating...',\n createSuccess: 'Knowledge base \"{name}\" created',\n nameRequired: 'Please enter a name',\n\n // Edit knowledge base\n editTitle: 'Edit Knowledge Base',\n editConfirm: 'Save',\n saving: 'Saving...',\n editSuccess: 'Knowledge base updated',\n\n // Embedding model config (create/edit dialog)\n vectorSectionTitle: 'Embedding model',\n vectorModeLocal: 'Local model (bundled BGE Chinese model)',\n vectorModeRemote: 'Remote service (OpenAI-compatible API)',\n vectorModeLocalHint: 'Use the agent-bundled BGE Chinese model. No extra config needed; the model file downloads on first import.',\n vectorModeRemoteHint: 'Call a remote OpenAI-compatible embedding service (SiliconFlow, Zhipu, OpenAI, etc.).',\n vectorEndpointLabel: 'Endpoint (Base URL with version segment)',\n vectorEndpointPlaceholder: 'e.g. https://api.siliconflow.cn/v1',\n vectorApiKeyLabel: 'API Key',\n vectorApiKeyPlaceholder: 'Paste API key',\n vectorApiKeyKeep: 'Leave empty to keep the saved key',\n vectorModelLabel: 'Model name',\n vectorModelPlaceholder: 'e.g. BAAI/bge-m3',\n vectorDimsLabel: 'Dimensions (optional, auto-detected on test)',\n vectorDimsPlaceholder: 'Auto',\n vectorTestBtn: 'Test Connection',\n vectorTesting: 'Testing...',\n vectorTestOk: 'Connected: {model} ({dims} dims)',\n vectorDimsFilled: 'Dimensions auto-filled: {dims}',\n vectorTestFailed: 'Test failed: {error}',\n vectorEndpointRequired: 'Remote endpoint is required',\n vectorModelRequired: 'Model name is required',\n\n // Index rebuild (embedding/chunk config change)\n rebuildConfirmTitle: 'Change Embedding Config',\n rebuildConfirm: 'Changing the embedding model or chunk settings requires rebuilding the index (all documents will be re-embedded). The old index stays searchable during the rebuild and switches automatically when done. Continue?',\n rebuildStarted: 'Index rebuild started, refreshing when complete...',\n progressRebuilding: 'Rebuilding index {current}/{total} documents…',\n rebuildDone: 'Index rebuild complete',\n rebuildFailed: 'Index rebuild failed: {error}',\n\n // Delete knowledge base\n deleteConfirmTitle: 'Delete Knowledge Base',\n deleteConfirm: 'Delete \"{name}\"? Its {docs} documents and {chunks} chunks will be removed permanently.',\n deleteSuccess: 'Knowledge base deleted',\n\n // Ingest documents\n ingestTitle: 'Import documents into \"{name}\"',\n tabFile: 'File',\n tabText: 'Text',\n tabUrl: 'URL',\n dropHint: 'Drag & drop a file here, or click to choose',\n dropSupported: 'Supports txt / md / pdf / docx / xlsx / html, up to 50MB per file',\n selectedFile: 'Selected: {name}',\n textContentLabel: 'Text content',\n textContentPlaceholder: 'Paste the text to import here...',\n textNameLabel: 'Document name (optional)',\n textNamePlaceholder: 'Leave empty to auto-name',\n urlLabel: 'Web page URL',\n urlPlaceholder: 'https://example.com/page',\n chunkSettingsTitle: 'Chunk settings',\n chunkSizeLabel: 'Chunk size (chars)',\n chunkOverlapLabel: 'Overlap (chars)',\n ingestConfirm: 'Start Import',\n ingesting: 'Parsing and embedding. The first import may download the model, please wait...',\n progressParsing: 'Parsing document…',\n progressChunking: 'Splitting into chunks…',\n progressEmbedding: 'Embedding chunks {current}/{total}…',\n progressStoring: 'Writing to index…',\n ingestSuccess: 'Imported: {name} ({chunks} chunks)',\n ingestFailed: 'Import failed: {error}',\n fileRequired: 'Please choose a file first',\n contentRequired: 'Please enter the text content',\n urlRequired: 'Please enter the URL',\n fileTooLarge: 'File too large, 50MB max',\n\n // Document list\n docsTitle: 'Documents in \"{name}\"',\n docsEmpty: 'No documents imported yet',\n docChunkCount: '{count} chunks',\n docDeleteConfirmTitle: 'Delete Document',\n docDeleteConfirm: 'Delete document \"{name}\"? All its chunks will be removed from the knowledge base.',\n docDeleteSuccess: 'Document deleted',\n\n // Search test\n searchTitle: 'Test Search',\n searchScope: 'Scope: \"{name}\"',\n searchQueryPlaceholder: 'Enter a query, e.g. How to export data?',\n searchBtn: 'Search',\n searching: 'Searching...',\n searchTopKLabel: 'Top K',\n searchThresholdLabel: 'Threshold',\n searchHitCount: '{count} hits',\n searchNoHits: 'No hits. Try lowering the similarity threshold.',\n searchFallbackHint: 'All scores are below the threshold. Best matches for reference:',\n searchFailed: 'Search failed: {error}',\n expandFull: 'Expand',\n collapse: 'Collapse',\n scoreLabel: 'Score',\n opFailed: 'Operation failed: {error}',\n },\n\n // Context bubble\n contextBubble: {\n labelSelection: 'Selection',\n labelQuoted: 'Quote',\n labelSkill: 'Skill',\n labelMcp: 'MCP',\n labelPage: 'Page',\n labelFile: 'File',\n labelKnowledge: 'Knowledge',\n clickToExpand: 'Click to expand',\n bubbleSkill: '{name} 🧩',\n bubbleMcp: '{name} 🔌',\n bubblePage: '{title} 🌐',\n bubbleKnowledge: '{name} 📚 · {count} hits',\n bubbleKnowledgeMiss: '{name} 📚 · no match',\n bubbleKnowledgeFailed: '{name} 📚 · retrieval failed',\n bubbleKnowledgeSearching: 'Searching knowledge base…',\n kbHitToggle: 'Click to expand/collapse',\n kbHitTruncated: '✂ Truncated · {total} chars total, first {kept} sent',\n kbHitTruncatedTitle: 'Truncated to fit the context window; what is shown here is exactly what the model received',\n kbHitTruncatedBadge: '✂ {count} truncated',\n },\n\n // options.html - Export/import config dialogs\n configDialog: {\n exportTitle: 'Export Settings',\n includeSecrets: 'Include API keys',\n secretWarn: '⚠ Sensitive information; keep the file safe',\n exportDesc: 'The exported file will contain all settings except Agent connection info. You can choose whether to include API keys.',\n export: 'Export',\n importTitle: 'Import Settings',\n mergeImport: 'Merge import — only overwrite settings present in the file; keep the rest',\n replaceImport: 'Full replace — clear current settings and use the file content',\n confirmImport: 'Confirm Import',\n exportSuccess: 'Settings exported',\n exportFailed: 'Export failed: {error}',\n unknownTime: 'Unknown',\n importSummary: 'Exported at: {time}, containing {count} settings',\n invalidFileFormat: 'Invalid file format',\n unrecognizedFormat: 'Unrecognized settings format',\n unknownConfigKey: 'Unknown setting key: {key}',\n importFailed: 'Import failed: {error}',\n importParseFailed: 'Import failed: cannot parse file format',\n importedCount: 'Imported {count} settings',\n },\n};\n","// i18n.js - 轻量国际化模块\n// 提供同步的 t(key, params) 查表 + 参数插值,支持运行时语言切换与订阅刷新\n//\n// 用法:\n// import { t, setLanguage, getLanguage, subscribe, applyI18n, initI18n } from '../shared/i18n.js';\n// t('common.confirm') // → \"确认\"\n// t('dialog.remainingTime', { time: '1:30' }) // → \"剩余时间: 1:30\"\n//\n// HTML 占位(语言切换/页面加载时调用 applyI18n 自动填充):\n// <button data-i18n=\"common.confirm\">确认</button>\n// <input data-i18n-placeholder=\"ui.inputPlaceholder\" />\n// <span data-i18n-title=\"ui.tip\" title=\"x\"></span>\n\nimport zh from './locales/zh.js';\nimport en from './locales/en.js';\n\n// 支持的语言列表(顺序即 UI 展示顺序)\nexport const SUPPORTED_LANGUAGES = [\n { code: 'zh', label: '中文' },\n { code: 'en', label: 'English' },\n];\n\nexport const DEFAULT_LANGUAGE = 'zh';\n\n/**\n * 根据浏览器 UI 语言自动匹配合适的语言代码\n * chrome.i18n.getUILanguage() 返回如 \"zh-CN\", \"en-US\", \"ja\" 等\n * 当前仅支持 zh 和 en 两种,zh* 匹配中文,其余统一用英文\n * @returns {'zh'|'en'}\n */\nfunction detectBrowserLanguage() {\n if (typeof chrome === 'undefined' || !chrome.i18n) return DEFAULT_LANGUAGE;\n try {\n const browserLang = chrome.i18n.getUILanguage(); // e.g. \"zh-CN\", \"en-US\"\n if (browserLang && browserLang.startsWith('zh')) return 'zh';\n } catch (e) { /* 获取失败,走默认 */ }\n return 'en';\n}\n\n// 当前语言\nlet currentLang = DEFAULT_LANGUAGE;\n\n// 各语言翻译字典:{ zh: {...}, en: {...} }\nconst translations = { zh, en };\n\n// 语言变更订阅者集合\nconst subscribers = new Set();\n\n/**\n * 在字典中按点分 key 查找(如 'common.confirm')\n * @param {object} dict\n * @param {string} key\n * @returns {string|undefined}\n */\nfunction lookup(dict, key) {\n if (!dict || !key) return undefined;\n const parts = key.split('.');\n let cur = dict;\n for (const p of parts) {\n if (cur == null || typeof cur !== 'object') return undefined;\n cur = cur[p];\n }\n return typeof cur === 'string' ? cur : undefined;\n}\n\n/**\n * 参数插值:将 {name} 替换为 params.name\n * @param {string} str\n * @param {object} [params]\n * @returns {string}\n */\nfunction interpolate(str, params) {\n if (!params || typeof str !== 'string') return str;\n return str.replace(/\\{(\\w+)\\}/g, (m, name) =>\n (params[name] !== undefined && params[name] !== null) ? String(params[name]) : m\n );\n}\n\n/**\n * 翻译\n * 查找顺序: 当前语言 → 英文 fallback → key 本身(不报错)\n * @param {string} key - 点分 key,如 'common.confirm'\n * @param {object} [params] - 插值参数,如 { name: 'x.js' }\n * @returns {string}\n */\nexport function t(key, params) {\n const fromCur = lookup(translations[currentLang], key);\n if (fromCur !== undefined) return interpolate(fromCur, params);\n // 英文 fallback(避免当前语言缺 key 时直接显示原始 key)\n if (currentLang !== 'en') {\n const fromEn = lookup(translations.en, key);\n if (fromEn !== undefined) return interpolate(fromEn, params);\n }\n // 最终 fallback: 返回 key 本身,便于发现遗漏\n return key;\n}\n\n/**\n * 获取当前语言代码\n * @returns {string}\n */\nexport function getLanguage() {\n return currentLang;\n}\n\n/**\n * 设置当前语言并持久化,通知所有订阅者\n * @param {string} lang - 语言代码,如 'zh' / 'en'\n * @param {boolean} [persist=true] - 是否写入 chrome.storage.local\n */\nexport function setLanguage(lang, persist = true) {\n if (!lang || lang === currentLang) return;\n if (!translations[lang]) {\n // 未知语言,忽略\n return;\n }\n currentLang = lang;\n if (persist && typeof chrome !== 'undefined' && chrome.storage && chrome.storage.local) {\n chrome.storage.local.set({ language: lang }).catch(() => {});\n }\n // 通知订阅者\n for (const cb of subscribers) {\n try { cb(lang); } catch (e) { /* 单个订阅者异常不影响其它 */ }\n }\n}\n\n/**\n * 订阅语言变更\n * @param {(lang: string) => void} callback\n * @returns {() => void} 取消订阅函数\n */\nexport function subscribe(callback) {\n if (typeof callback === 'function') subscribers.add(callback);\n return () => subscribers.delete(callback);\n}\n\n/**\n * 注册/合并某个语言的翻译字典(各模块可按需追加自己的文案)\n * @param {string} lang\n * @param {object} dict\n */\nexport function registerTranslations(lang, dict) {\n if (!translations[lang]) translations[lang] = {};\n translations[lang] = deepMerge(translations[lang], dict);\n}\n\nfunction deepMerge(target, source) {\n for (const k of Object.keys(source || {})) {\n if (source[k] && typeof source[k] === 'object' && !Array.isArray(source[k])) {\n if (!target[k] || typeof target[k] !== 'object') target[k] = {};\n deepMerge(target[k], source[k]);\n } else {\n target[k] = source[k];\n }\n }\n return target;\n}\n\n// 防止 storage.onChanged 监听重复注册\nlet storageListenerBound = false;\n\n/**\n * 初始化语言:从 chrome.storage.local 读取已保存的语言偏好\n * 并注册 storage.onChanged 监听,实现 background / side_panel / options / content 跨环境同步\n * 应在各环境启动时调用\n * @returns {Promise<string>} 实际生效的语言代码\n */\nexport async function initI18n() {\n if (typeof chrome === 'undefined' || !chrome.storage || !chrome.storage.local) {\n return currentLang;\n }\n try {\n const result = await chrome.storage.local.get('language');\n if (result.language && translations[result.language]) {\n // 用户已手动设置语言偏好,直接使用\n currentLang = result.language;\n } else {\n // 未设置偏好,根据浏览器语言自动检测并持久化\n const detectedLang = detectBrowserLanguage();\n currentLang = detectedLang;\n // 持久化自动检测结果,后续启动直接复用\n chrome.storage.local.set({ language: detectedLang }).catch(() => {});\n }\n } catch (e) {\n // 读取失败,根据浏览器语言 fallback\n currentLang = detectBrowserLanguage();\n }\n // 监听 storage 变更,跨环境同步语言(不持久化,避免循环写入)\n if (!storageListenerBound) {\n storageListenerBound = true;\n try {\n chrome.storage.onChanged.addListener((changes, areaName) => {\n if (areaName !== 'local' || !changes.language) return;\n const newLang = changes.language.newValue;\n if (newLang && translations[newLang] && newLang !== currentLang) {\n currentLang = newLang;\n for (const cb of subscribers) {\n try { cb(newLang); } catch (e) { /* 单个订阅者异常不影响其它 */ }\n }\n }\n });\n } catch (e) {\n // 某些环境无 storage.onChanged,忽略\n }\n }\n return currentLang;\n}\n\n/**\n * 将 DOM 中带 data-i18n* 属性的元素填充为对应语言文案\n * 在页面加载后、语言切换后调用\n * @param {ParentNode} [root=document]\n */\nexport function applyI18n(root) {\n if (typeof document === 'undefined') return;\n const scope = root || document;\n\n // textContent\n scope.querySelectorAll('[data-i18n]').forEach((el) => {\n const key = el.getAttribute('data-i18n');\n if (key) el.textContent = t(key);\n });\n // placeholder\n scope.querySelectorAll('[data-i18n-placeholder]').forEach((el) => {\n const key = el.getAttribute('data-i18n-placeholder');\n if (key) el.placeholder = t(key);\n });\n // title\n scope.querySelectorAll('[data-i18n-title]').forEach((el) => {\n const key = el.getAttribute('data-i18n-title');\n if (key) el.title = t(key);\n });\n // aria-label\n scope.querySelectorAll('[data-i18n-aria-label]').forEach((el) => {\n const key = el.getAttribute('data-i18n-aria-label');\n if (key) el.setAttribute('aria-label', t(key));\n });\n}\n\nexport default {\n t,\n getLanguage,\n setLanguage,\n subscribe,\n registerTranslations,\n initI18n,\n applyI18n,\n SUPPORTED_LANGUAGES,\n DEFAULT_LANGUAGE,\n};\n"],"mappings":"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"}