ai-helper-agent 1.15.7 → 1.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +38 -3
- package/README.zh-CN.md +38 -3
- package/bin/agent.js +79 -1
- package/dist/assets/agent-store-BS0nP4TI.js +2 -0
- package/dist/assets/agent-store-BS0nP4TI.js.map +1 -0
- package/dist/assets/background.js +119 -39
- package/dist/assets/background.js.map +1 -1
- package/dist/assets/{constants-DBNqocFG.js → constants-C6-BtNIC.js} +2 -2
- package/dist/assets/constants-C6-BtNIC.js.map +1 -0
- package/dist/assets/content.js +54 -50
- package/dist/assets/dist-BQOFgIxk.js +134 -0
- package/dist/assets/dist-BQOFgIxk.js.map +1 -0
- package/dist/assets/i18n-tNh5vOPi.js +48 -0
- package/dist/assets/i18n-tNh5vOPi.js.map +1 -0
- package/dist/assets/jszip.min-BXqW2-9v.js +3 -0
- package/dist/assets/jszip.min-BXqW2-9v.js.map +1 -0
- package/dist/assets/lib-Bi7BFuND.js +221 -0
- package/dist/assets/lib-Bi7BFuND.js.map +1 -0
- package/dist/assets/model-profiles-Cx0-W0mY.js +2 -0
- package/dist/assets/model-profiles-Cx0-W0mY.js.map +1 -0
- package/dist/assets/options-BSJoTevf.css +1 -0
- package/dist/assets/options.js +304 -98
- package/dist/assets/options.js.map +1 -1
- package/dist/assets/pdf-HiJ0icvU.js +7 -0
- package/dist/assets/pdf-HiJ0icvU.js.map +1 -0
- package/dist/assets/session-store-zjq2FLki.js +100 -0
- package/dist/assets/session-store-zjq2FLki.js.map +1 -0
- package/dist/assets/side_panel.css +1 -1
- package/dist/assets/side_panel.js +1297 -1236
- package/dist/assets/side_panel.js.map +1 -1
- package/dist/assets/xlsx-BHKh7vjA.js +106 -0
- package/dist/assets/xlsx-BHKh7vjA.js.map +1 -0
- package/dist/manifest.json +4 -4
- package/dist/offscreen/offscreen.js +13 -9
- package/dist/options.html +133 -7
- package/dist/side_panel.html +102 -37
- package/package.json +12 -1
- package/src/config.js +4 -1
- package/src/executor.js +56 -30
- package/src/locales/cli.json +24 -0
- package/src/locales/en.json +37 -1
- package/src/locales/zh.json +37 -1
- package/src/process-tree.js +73 -0
- package/src/rag/config.js +69 -0
- package/src/rag/detect.js +85 -0
- package/src/rag/document/chunker.js +75 -0
- package/src/rag/document/loader.js +48 -0
- package/src/rag/document/parsers/html.js +46 -0
- package/src/rag/document/parsers/office.js +55 -0
- package/src/rag/document/parsers/pdf.js +20 -0
- package/src/rag/document/parsers/text.js +14 -0
- package/src/rag/embedding/index.js +60 -0
- package/src/rag/embedding/local.js +80 -0
- package/src/rag/embedding/openai-compat.js +63 -0
- package/src/rag/errors.js +29 -0
- package/src/rag/install.js +389 -0
- package/src/rag/manager.js +1038 -0
- package/src/rag/routes.js +275 -0
- package/src/rag/searcher.js +167 -0
- package/src/rag/store/index.js +14 -0
- package/src/rag/store/vectra.js +123 -0
- package/src/rag/url-guard.js +214 -0
- package/src/security.js +2 -1
- package/src/server.js +89 -14
- package/src/trash.js +39 -7
- package/dist/assets/agent-defaults-Ct1YxFzI.js +0 -99
- package/dist/assets/agent-defaults-Ct1YxFzI.js.map +0 -1
- package/dist/assets/agent-store-D0Es5Ite.js +0 -2
- package/dist/assets/agent-store-D0Es5Ite.js.map +0 -1
- package/dist/assets/constants-DBNqocFG.js.map +0 -1
- package/dist/assets/i18n-De3tbtBv.js +0 -44
- package/dist/assets/i18n-De3tbtBv.js.map +0 -1
- package/dist/assets/options-DpveyMnB.css +0 -1
- package/dist/assets/session-manager-UTq_z6mZ.js +0 -105
- package/dist/assets/session-manager-UTq_z6mZ.js.map +0 -1
- package/dist/assets/session-manager-ui-DwceYZzF.js +0 -71
- package/dist/assets/session-manager-ui-DwceYZzF.js.map +0 -1
- package/dist/assets/state-B9PZN_fc.js +0 -2
- package/dist/assets/state-B9PZN_fc.js.map +0 -1
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
# AI Helper Agent
|
|
4
4
|
|
|
5
|
-
AI Helper Agent — a local proxy service that provides the [AI Helper Chrome Extension](https://github.com/xiweicheng/ai-helper) with local file read/write, system command execution, Skill system, and MCP protocol extension capabilities.
|
|
5
|
+
AI Helper Agent — a local proxy service that provides the [AI Helper Chrome Extension](https://github.com/xiweicheng/ai-helper) ([Edge Add-ons](https://microsoftedge.microsoft.com/addons/detail/ai-helper-%E7%BD%91%E9%A1%B5%E6%99%BA%E8%83%BD%E5%8A%A9%E6%89%8B/kabhmgfbkhpbfhhnokaafhkdbckeipcl)) with local file read/write, system command execution, Skill system, and MCP protocol extension capabilities.
|
|
6
6
|
|
|
7
7
|
## Installation
|
|
8
8
|
|
|
@@ -26,7 +26,7 @@ ai-helper-agent start -b
|
|
|
26
26
|
ai-helper-agent start --workdir /path/to/your/project --port 18911
|
|
27
27
|
```
|
|
28
28
|
|
|
29
|
-
After startup, the terminal will display a
|
|
29
|
+
After startup, the terminal will display a 6-digit pairing code. Enter it in the "Agent" tab of the Chrome extension settings page to complete pairing.
|
|
30
30
|
|
|
31
31
|
## CLI Commands
|
|
32
32
|
|
|
@@ -107,7 +107,7 @@ All file operations are restricted to directories listed in the `allowedPaths` w
|
|
|
107
107
|
|
|
108
108
|
### Authentication
|
|
109
109
|
|
|
110
|
-
Pairing is completed by entering the
|
|
110
|
+
Pairing is completed by entering the 6-digit pairing code displayed in the terminal into the extension. The pairing code rotates every 30 seconds. After successful pairing, an HMAC token is used for subsequent request authentication, stored in `~/.ai-helper-agent/pairings.json`.
|
|
111
111
|
|
|
112
112
|
## Configuration
|
|
113
113
|
|
|
@@ -359,6 +359,40 @@ Configuration file path: `~/.ai-helper-agent/config.json`
|
|
|
359
359
|
4. Tool call requests are forwarded to MCP servers via the agent
|
|
360
360
|
5. Tool results are returned to the extension
|
|
361
361
|
|
|
362
|
+
## Knowledge Base (RAG)
|
|
363
|
+
|
|
364
|
+
Optional local retrieval-augmented generation. Turn documents into searchable knowledge bases so the extension can answer with cited sources. The RAG stack ships as optional dependencies — the agent detects availability at startup and reports it via `/api/rag/status`; when dependencies are missing, RAG requests return `503` and the extension offers one-click installation (whitelisted packages, progress polled from `/api/rag/install/status`).
|
|
365
|
+
|
|
366
|
+
- **Data location** — knowledge bases are stored under `~/.ai-helper-agent/rag/` (override with the `AI_HELPER_RAG_ROOT` environment variable)
|
|
367
|
+
- **Multiple knowledge bases** — create / update / delete collections, each keeping its own embedding config and statistics
|
|
368
|
+
- **Multi-format ingestion** — `.txt` `.md` `.json` `.csv` `.html` / PDF / Word (`mammoth`) / PPT (`officeparser`) / Excel; ingest by raw text, file (base64), or URL, with staged parsing → chunking → embedding → storage progress
|
|
369
|
+
- **Hybrid retrieval** — vector similarity with keyword-hit boosting; searching multiple bases splits the `topK` quota across them
|
|
370
|
+
- **Pluggable embeddings** — local model (`Xenova/bge-small-zh-v1.5`, 512-dim, runs locally via `@huggingface/transformers`) by default, or any OpenAI-compatible embedding endpoint (with a connectivity test returning actual dimensions)
|
|
371
|
+
- **Index rebuild** — changing a collection's embedding space rebuilds its index in the background (temporary-directory replay → atomic swap)
|
|
372
|
+
|
|
373
|
+
### RAG API
|
|
374
|
+
|
|
375
|
+
Endpoints are registered inside the authenticated region (Bearer token required) and loaded on demand — only when the RAG dependencies are available.
|
|
376
|
+
|
|
377
|
+
| Method | Path | Description |
|
|
378
|
+
|--------|------|-------------|
|
|
379
|
+
| POST | `/api/rag/install` | Start whitelisted RAG dependency installation |
|
|
380
|
+
| GET | `/api/rag/install/status` | Installation progress |
|
|
381
|
+
| POST | `/api/rag/detect` | Re-detect RAG dependency availability |
|
|
382
|
+
| GET | `/api/rag/status` | Capability & install status |
|
|
383
|
+
| POST | `/api/rag/test-embedding` | Test remote embedding endpoint connectivity (returns actual dimensions) |
|
|
384
|
+
| GET | `/api/rag/collections` | List knowledge bases |
|
|
385
|
+
| POST | `/api/rag/collections` | Create a knowledge base |
|
|
386
|
+
| PUT | `/api/rag/collections/{id}` | Update name / description / embedding config (rebuilds index on embedding-space change) |
|
|
387
|
+
| DELETE | `/api/rag/collections/{id}` | Delete a knowledge base |
|
|
388
|
+
| GET | `/api/rag/collections/{id}/stats` | Document / chunk statistics |
|
|
389
|
+
| POST | `/api/rag/collections/{id}/ingest` | Ingest text / file / URL (synchronous) |
|
|
390
|
+
| GET | `/api/rag/collections/{id}/ingest/status` | Ingestion progress snapshot (for polling) |
|
|
391
|
+
| GET | `/api/rag/collections/{id}/documents` | Document list |
|
|
392
|
+
| DELETE | `/api/rag/collections/{id}/documents/{docId}` | Delete a document |
|
|
393
|
+
| POST | `/api/rag/collections/{id}/search` | Search a single knowledge base |
|
|
394
|
+
| POST | `/api/rag/search` | Cross-knowledge-base search |
|
|
395
|
+
|
|
362
396
|
## Tech Stack
|
|
363
397
|
|
|
364
398
|
- Node.js >= 18
|
|
@@ -366,6 +400,7 @@ Configuration file path: `~/.ai-helper-agent/config.json`
|
|
|
366
400
|
- `ws` library (WebSocket server)
|
|
367
401
|
- Zero external framework dependencies
|
|
368
402
|
- Optional dependencies: `fd`, `rg` (ripgrep) — for accelerated file search
|
|
403
|
+
- Optional dependencies for the knowledge base (RAG): `vectra` (vector store), `@huggingface/transformers` (local embeddings), `pdf-parse` / `mammoth` / `officeparser` / `cheerio` (document parsers)
|
|
369
404
|
|
|
370
405
|
## License
|
|
371
406
|
|
package/README.zh-CN.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
# AI Helper Agent
|
|
4
4
|
|
|
5
|
-
AI Helper 代理服务,为 [AI Helper Chrome 扩展](https://github.com/xiweicheng/ai-helper)
|
|
5
|
+
AI Helper 代理服务,为 [AI Helper Chrome 扩展](https://github.com/xiweicheng/ai-helper)([Edge 扩展商店](https://microsoftedge.microsoft.com/addons/detail/ai-helper-%E7%BD%91%E9%A1%B5%E6%99%BA%E8%83%BD%E5%8A%A9%E6%89%8B/kabhmgfbkhpbfhhnokaafhkdbckeipcl))提供本地文件读写、系统命令执行、Skill 技能系统和 MCP 协议扩展能力。
|
|
6
6
|
|
|
7
7
|
## 安装
|
|
8
8
|
|
|
@@ -26,7 +26,7 @@ ai-helper-agent start -b
|
|
|
26
26
|
ai-helper-agent start --workdir /path/to/your/project --port 18911
|
|
27
27
|
```
|
|
28
28
|
|
|
29
|
-
启动后终端会显示
|
|
29
|
+
启动后终端会显示 6 位配对码,在 Chrome 扩展设置页「代理」标签中填入即可完成配对。
|
|
30
30
|
|
|
31
31
|
## CLI 命令
|
|
32
32
|
|
|
@@ -107,7 +107,7 @@ Agent 通过 PID 文件(`~/.ai-helper-agent/agent.pid`)管理进程生命周
|
|
|
107
107
|
|
|
108
108
|
### 认证机制
|
|
109
109
|
|
|
110
|
-
首次配对时用户在扩展中输入终端显示的
|
|
110
|
+
首次配对时用户在扩展中输入终端显示的 6 位配对码完成配对。配对码每 30 秒轮换。配对成功后使用 HMAC token 做后续请求认证,存储在 `~/.ai-helper-agent/pairings.json`。
|
|
111
111
|
|
|
112
112
|
## 配置
|
|
113
113
|
|
|
@@ -359,6 +359,40 @@ enabled: true
|
|
|
359
359
|
4. 工具调用请求通过 Agent 转发到 MCP Server
|
|
360
360
|
5. 工具结果返回给扩展
|
|
361
361
|
|
|
362
|
+
## 知识库(RAG)
|
|
363
|
+
|
|
364
|
+
可选的本地检索增强生成(RAG)能力:将文档索引为可检索的知识库,让插件回答时附带引用来源。RAG 依赖为可选安装 —— Agent 启动时自动检测可用性,并通过 `/api/rag/status` 对外暴露;依赖缺失时 RAG 请求返回 `503`,插件端提供一键安装(白名单依赖,进度可经 `/api/rag/install/status` 轮询)。
|
|
365
|
+
|
|
366
|
+
- **数据位置** —— 知识库存储于 `~/.ai-helper-agent/rag/`(可用环境变量 `AI_HELPER_RAG_ROOT` 覆盖)
|
|
367
|
+
- **多知识库管理** —— 创建 / 更新 / 删除知识库,各自维护向量配置与统计信息
|
|
368
|
+
- **多格式导入** —— `.txt` `.md` `.json` `.csv` `.html` / PDF / Word(`mammoth`)/ PPT(`officeparser`)/ Excel;支持文本、文件(base64)、URL 三种导入方式,解析 → 分块 → 向量化 → 存储分阶段进度可查
|
|
369
|
+
- **混合检索** —— 向量相似度 + 关键词命中抬分;跨库检索时 `topK` 配额按库均分
|
|
370
|
+
- **可插拔向量化** —— 默认本地模型(`Xenova/bge-small-zh-v1.5`,512 维,经 `@huggingface/transformers` 本地运行),也可接入任意 OpenAI 兼容向量服务(支持连通性测试并返回实际维度)
|
|
371
|
+
- **索引重建** —— 知识库向量空间变更时后台自动重建(临时目录重放 → 原子换入)
|
|
372
|
+
|
|
373
|
+
### RAG API
|
|
374
|
+
|
|
375
|
+
以下接口注册在认证区内(需 Bearer Token),且仅在 RAG 依赖可用时按需加载。
|
|
376
|
+
|
|
377
|
+
| 方法 | 路径 | 说明 |
|
|
378
|
+
|------|------|------|
|
|
379
|
+
| POST | `/api/rag/install` | 触发白名单 RAG 依赖安装 |
|
|
380
|
+
| GET | `/api/rag/install/status` | 安装进度 |
|
|
381
|
+
| POST | `/api/rag/detect` | 重新检测 RAG 依赖可用性 |
|
|
382
|
+
| GET | `/api/rag/status` | 能力与安装状态 |
|
|
383
|
+
| POST | `/api/rag/test-embedding` | 测试远端向量服务连通性(返回实际维度) |
|
|
384
|
+
| GET | `/api/rag/collections` | 列出知识库 |
|
|
385
|
+
| POST | `/api/rag/collections` | 创建知识库 |
|
|
386
|
+
| PUT | `/api/rag/collections/{id}` | 更新名称 / 描述 / 向量配置(向量空间变更自动重建索引) |
|
|
387
|
+
| DELETE | `/api/rag/collections/{id}` | 删除知识库 |
|
|
388
|
+
| GET | `/api/rag/collections/{id}/stats` | 文档数 / 分块数统计 |
|
|
389
|
+
| POST | `/api/rag/collections/{id}/ingest` | 导入文本 / 文件 / URL(同步执行) |
|
|
390
|
+
| GET | `/api/rag/collections/{id}/ingest/status` | 导入进度快照(供轮询) |
|
|
391
|
+
| GET | `/api/rag/collections/{id}/documents` | 文档列表 |
|
|
392
|
+
| DELETE | `/api/rag/collections/{id}/documents/{docId}` | 删除文档 |
|
|
393
|
+
| POST | `/api/rag/collections/{id}/search` | 单库检索 |
|
|
394
|
+
| POST | `/api/rag/search` | 跨知识库检索 |
|
|
395
|
+
|
|
362
396
|
## 技术栈
|
|
363
397
|
|
|
364
398
|
- Node.js >= 18
|
|
@@ -366,6 +400,7 @@ enabled: true
|
|
|
366
400
|
- `ws` 库(WebSocket 服务)
|
|
367
401
|
- 零外部框架依赖
|
|
368
402
|
- 可选依赖:`fd`、`rg`(ripgrep)— 用于加速文件搜索
|
|
403
|
+
- 知识库(RAG)可选依赖:`vectra`(向量存储)、`@huggingface/transformers`(本地向量化)、`pdf-parse` / `mammoth` / `officeparser` / `cheerio`(文档解析)
|
|
369
404
|
|
|
370
405
|
## License
|
|
371
406
|
|
package/bin/agent.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// Usage: ai-helper-agent <start|stop|restart|status|paircode|config> [options]
|
|
4
4
|
import { join, dirname, resolve } from 'path';
|
|
5
5
|
import { existsSync, readFileSync, writeFileSync, unlinkSync, mkdirSync } from 'fs';
|
|
6
|
-
import { spawn } from 'child_process';
|
|
6
|
+
import { spawn, spawnSync } from 'child_process';
|
|
7
7
|
import { homedir } from 'os';
|
|
8
8
|
import { fileURLToPath } from 'url';
|
|
9
9
|
import { detectSystemLang } from '../src/sys-lang.js';
|
|
@@ -166,9 +166,19 @@ function removePidFile() {
|
|
|
166
166
|
|
|
167
167
|
/**
|
|
168
168
|
* Kill process by PID
|
|
169
|
+
* Windows:process.kill 只终止单个进程且跳过优雅信号,改用 taskkill /F /T 连子树一起终止,
|
|
170
|
+
* 避免回退路径残留运行中的命令 / MCP 子进程
|
|
169
171
|
*/
|
|
170
172
|
function killByPid(pid) {
|
|
171
173
|
if (!pid || typeof pid !== 'number' || pid <= 0) return false;
|
|
174
|
+
if (process.platform === 'win32') {
|
|
175
|
+
try {
|
|
176
|
+
const r = spawnSync('taskkill', ['/F', '/T', '/PID', String(pid)], { windowsHide: true, stdio: 'ignore' });
|
|
177
|
+
return r.status === 0;
|
|
178
|
+
} catch {
|
|
179
|
+
return false;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
172
182
|
try {
|
|
173
183
|
process.kill(pid, 'SIGTERM');
|
|
174
184
|
return true;
|
|
@@ -226,6 +236,7 @@ function printHelp() {
|
|
|
226
236
|
console.log(t('cmdStatus'));
|
|
227
237
|
console.log(t('cmdPaircode'));
|
|
228
238
|
console.log(t('cmdConfig'));
|
|
239
|
+
console.log(t('cmdRag'));
|
|
229
240
|
console.log(t('cmdHelp'));
|
|
230
241
|
console.log('');
|
|
231
242
|
console.log(t('startupOptions'));
|
|
@@ -242,6 +253,7 @@ function printHelp() {
|
|
|
242
253
|
console.log(' ai-helper-agent stop');
|
|
243
254
|
console.log(' ai-helper-agent restart -b');
|
|
244
255
|
console.log(' ai-helper-agent status');
|
|
256
|
+
console.log(' ai-helper-agent rag install');
|
|
245
257
|
}
|
|
246
258
|
|
|
247
259
|
/**
|
|
@@ -665,6 +677,72 @@ if (command === 'start') {
|
|
|
665
677
|
console.log(JSON.stringify(config, null, 2));
|
|
666
678
|
console.log(`[Agent] ${t('configFileLocation', { path: CONFIG_FILE })}`);
|
|
667
679
|
|
|
680
|
+
// ==================== rag ====================
|
|
681
|
+
} else if (command === 'rag') {
|
|
682
|
+
// 子命令:status(检测能力)/ install(一键安装 RAG 依赖)
|
|
683
|
+
const sub = rawArgs[1];
|
|
684
|
+
|
|
685
|
+
// 同步 CLI 语言,保证 RAG 检测日志与命令行界面语言一致
|
|
686
|
+
const { setRagLang } = await import('../src/rag/detect.js');
|
|
687
|
+
setRagLang(lang);
|
|
688
|
+
|
|
689
|
+
if (sub === 'status') {
|
|
690
|
+
const { detectRagAvailable, isNodeVersionSupported } = await import('../src/rag/detect.js');
|
|
691
|
+
console.log(`[Agent] ${t('ragStatusTitle')}`);
|
|
692
|
+
console.log(`[Agent] ${t('ragNodeVersion', { version: process.version })}`);
|
|
693
|
+
if (!isNodeVersionSupported()) {
|
|
694
|
+
console.log(`[Agent] ${t('ragNodeLow', { version: process.version })}`);
|
|
695
|
+
process.exit(1);
|
|
696
|
+
}
|
|
697
|
+
const available = await detectRagAvailable();
|
|
698
|
+
console.log(`[Agent] ${available ? t('ragAvailable') : t('ragNotAvailable')}`);
|
|
699
|
+
process.exit(available ? 0 : 1);
|
|
700
|
+
}
|
|
701
|
+
|
|
702
|
+
if (sub === 'install') {
|
|
703
|
+
console.log(`[Agent] ${t('ragInstalling')}`);
|
|
704
|
+
// 与 API 一键安装共用同一命令构建:显式包名清单(ragDependencies)、
|
|
705
|
+
// 包目录内安装使 overrides 生效、--no-save 不污染包目录
|
|
706
|
+
const { buildRagInstallCommand } = await import('../src/rag/install.js');
|
|
707
|
+
let cmd;
|
|
708
|
+
try {
|
|
709
|
+
cmd = buildRagInstallCommand();
|
|
710
|
+
} catch (err) {
|
|
711
|
+
console.error(`[Agent] ${err.message}`);
|
|
712
|
+
process.exit(1);
|
|
713
|
+
}
|
|
714
|
+
const npm = spawn(cmd.command, cmd.args, {
|
|
715
|
+
cwd: cmd.cwd,
|
|
716
|
+
shell: cmd.shell,
|
|
717
|
+
stdio: 'inherit',
|
|
718
|
+
env: { ...process.env },
|
|
719
|
+
windowsHide: true
|
|
720
|
+
});
|
|
721
|
+
const code = await new Promise((resolvePromise) => {
|
|
722
|
+
npm.on('error', (err) => {
|
|
723
|
+
console.error(`[Agent] ${err.message}`);
|
|
724
|
+
resolvePromise(1);
|
|
725
|
+
});
|
|
726
|
+
npm.on('close', resolvePromise);
|
|
727
|
+
});
|
|
728
|
+
if (code !== 0) {
|
|
729
|
+
console.error(`[Agent] ${t('ragInstallFailed', { code })}`);
|
|
730
|
+
process.exit(1);
|
|
731
|
+
}
|
|
732
|
+
// 安装后验证(以实际加载结果为准)
|
|
733
|
+
const { detectRagAvailable } = await import('../src/rag/detect.js');
|
|
734
|
+
const available = await detectRagAvailable();
|
|
735
|
+
console.log(`[Agent] ${available ? t('ragInstallSuccess') : t('ragVerifyFailed')}`);
|
|
736
|
+
process.exit(available ? 0 : 1);
|
|
737
|
+
}
|
|
738
|
+
|
|
739
|
+
// 未知/缺失子命令:显示用法
|
|
740
|
+
if (sub) {
|
|
741
|
+
console.error(`[Agent] ${t('ragUnknownSub', { sub })}`);
|
|
742
|
+
}
|
|
743
|
+
console.log(t('ragHelpUsage'));
|
|
744
|
+
process.exit(1);
|
|
745
|
+
|
|
668
746
|
// ==================== help ====================
|
|
669
747
|
} else {
|
|
670
748
|
printHelp();
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{r as e}from"./rolldown-runtime-C0FnF6B9.js";import{a as t,c as n}from"./i18n-tNh5vOPi.js";import{_ as r,g as i}from"./session-store-zjq2FLki.js";var a=e({createAgent:()=>m,deleteAgent:()=>g,getActiveAgentId:()=>_,getAgent:()=>p,getAllAgents:()=>d,getCustomAgents:()=>f,setActiveAgentId:()=>v,updateAgent:()=>h});t(`zh`,{agentStore:{unnamedAgent:`未命名Agent`}}),t(`en`,{agentStore:{unnamedAgent:`Unnamed Agent`}});var o=`customAgents`,s=`activeAssistantId`,c=`activeAgentId`,l=!1;async function u(){if(l)return;l=!0;let e=await chrome.storage.local.get([c,s]),t=e[c],n=e[s];t&&!n&&!t.startsWith(`pa_`)&&(await chrome.storage.local.set({[s]:t}),await chrome.storage.local.remove(c))}async function d(){let e=(await chrome.storage.local.get([o]))[o]||[];return[...i,...e]}async function f(){return(await chrome.storage.local.get([o]))[o]||[]}async function p(e){return e&&(await d()).find(t=>t.id===e)||null}async function m(e){let t=await f(),i={id:r(),name:e.name||n(`agentStore.unnamedAgent`),description:e.description||``,icon:e.icon||`🤖`,systemPrompt:e.systemPrompt||``,toolIds:e.toolIds||null,skillIds:e.skillIds||null,mcpExcludedServerIds:e.mcpExcludedServerIds??null,isBuiltin:!1,allowSubDispatch:e.allowSubDispatch!==void 0&&e.allowSubDispatch,model:e.model||null,temperature:e.temperature===void 0?null:e.temperature,topP:e.topP===void 0?null:e.topP,createdAt:new Date().toISOString(),updatedAt:new Date().toISOString()};return t.push(i),await chrome.storage.local.set({[o]:t}),i}async function h(e,t){let n=await f(),r=n.findIndex(t=>t.id===e);return r===-1?null:(n[r]={...n[r],...t,id:e,isBuiltin:!1,updatedAt:new Date().toISOString()},await chrome.storage.local.set({[o]:n}),n[r])}async function g(e){let t=await f(),n=t.findIndex(t=>t.id===e);return n!==-1&&(t.splice(n,1),await chrome.storage.local.set({[o]:t}),(await chrome.storage.local.get([s]))[s]===e&&await chrome.storage.local.remove(s),!0)}async function _(){return await u(),(await chrome.storage.local.get([s]))[s]||null}async function v(e){e?await chrome.storage.local.set({[s]:e}):await chrome.storage.local.remove(s)}export{p as a,h as c,_ as i,m as n,d as o,g as r,v as s,a as t};
|
|
2
|
+
//# sourceMappingURL=agent-store-BS0nP4TI.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-store-BS0nP4TI.js","names":[],"sources":["../../src/side_panel/agent-store.js"],"sourcesContent":["// side_panel/agent-store.js - Agent 数据持久化\nimport { BUILTIN_AGENTS, generateAgentId } from '../shared/agent-defaults.js';\nimport { t, registerTranslations } from '../shared/i18n.js';\n\nregisterTranslations('zh', {\n agentStore: {\n unnamedAgent: '未命名Agent',\n },\n});\nregisterTranslations('en', {\n agentStore: {\n unnamedAgent: 'Unnamed Agent',\n },\n});\n\nconst STORAGE_KEY = 'customAgents';\nconst ACTIVE_KEY = 'activeAssistantId';\nconst LEGACY_ACTIVE_KEY = 'activeAgentId';\n\nlet migratedActiveKey = false;\n\nasync function migrateLegacyActiveKey() {\n if (migratedActiveKey) return;\n migratedActiveKey = true;\n\n const result = await chrome.storage.local.get([LEGACY_ACTIVE_KEY, ACTIVE_KEY]);\n const legacyValue = result[LEGACY_ACTIVE_KEY];\n const newValue = result[ACTIVE_KEY];\n\n if (legacyValue && !newValue && !legacyValue.startsWith('pa_')) {\n await chrome.storage.local.set({ [ACTIVE_KEY]: legacyValue });\n await chrome.storage.local.remove(LEGACY_ACTIVE_KEY);\n }\n}\n\n/**\n * 获取所有 Agent(内置 + 用户自定义)\n * @returns {Promise<Array>}\n */\nexport async function getAllAgents() {\n const result = await chrome.storage.local.get([STORAGE_KEY]);\n const customAgents = result[STORAGE_KEY] || [];\n return [...BUILTIN_AGENTS, ...customAgents];\n}\n\n/**\n * 仅获取用户自定义的 Agent\n * @returns {Promise<Array>}\n */\nexport async function getCustomAgents() {\n const result = await chrome.storage.local.get([STORAGE_KEY]);\n return result[STORAGE_KEY] || [];\n}\n\n/**\n * 根据 ID 获取单个 Agent\n * @param {string} agentId\n * @returns {Promise<Object|null>}\n */\nexport async function getAgent(agentId) {\n if (!agentId) return null;\n const all = await getAllAgents();\n return all.find(a => a.id === agentId) || null;\n}\n\n/**\n * 创建新的自定义 Agent\n * @param {Object} agentData - 不含 id 的 Agent 数据\n * @returns {Promise<Object>}\n */\nexport async function createAgent(agentData) {\n const agents = await getCustomAgents();\n const newAgent = {\n id: generateAgentId(),\n name: agentData.name || t('agentStore.unnamedAgent'),\n description: agentData.description || '',\n icon: agentData.icon || '🤖',\n systemPrompt: agentData.systemPrompt || '',\n toolIds: agentData.toolIds || null, // null = 继承全局\n skillIds: agentData.skillIds || null, // null = 继承全部启用技能\n mcpExcludedServerIds: agentData.mcpExcludedServerIds ?? null, // MCP 服务排除列表(服务级 deny-list)\n isBuiltin: false,\n allowSubDispatch: agentData.allowSubDispatch !== undefined ? agentData.allowSubDispatch : false,\n model: agentData.model || null,\n temperature: agentData.temperature !== undefined ? agentData.temperature : null,\n topP: agentData.topP !== undefined ? agentData.topP : null,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n };\n agents.push(newAgent);\n await chrome.storage.local.set({ [STORAGE_KEY]: agents });\n return newAgent;\n}\n\n/**\n * 更新已有的自定义 Agent\n * @param {string} agentId\n * @param {Object} updates\n * @returns {Promise<Object|null>}\n */\nexport async function updateAgent(agentId, updates) {\n const agents = await getCustomAgents();\n const idx = agents.findIndex(a => a.id === agentId);\n if (idx === -1) return null;\n \n agents[idx] = {\n ...agents[idx],\n ...updates,\n id: agentId, // id 不可变\n isBuiltin: false, // 不可变\n updatedAt: new Date().toISOString(),\n };\n await chrome.storage.local.set({ [STORAGE_KEY]: agents });\n return agents[idx];\n}\n\n/**\n * 删除自定义 Agent\n * @param {string} agentId\n * @returns {Promise<boolean>}\n */\nexport async function deleteAgent(agentId) {\n const agents = await getCustomAgents();\n const idx = agents.findIndex(a => a.id === agentId);\n if (idx === -1) return false;\n \n agents.splice(idx, 1);\n await chrome.storage.local.set({ [STORAGE_KEY]: agents });\n\n // 如果删除的 Agent 是当前选中的,重置为默认\n const result = await chrome.storage.local.get([ACTIVE_KEY]);\n if (result[ACTIVE_KEY] === agentId) {\n await chrome.storage.local.remove(ACTIVE_KEY);\n }\n \n return true;\n}\n\n/**\n * 获取当前选中的 Agent ID\n * @returns {Promise<string|null>}\n */\nexport async function getActiveAgentId() {\n await migrateLegacyActiveKey();\n const result = await chrome.storage.local.get([ACTIVE_KEY]);\n return result[ACTIVE_KEY] || null;\n}\n\n/**\n * 设置当前选中的 Agent ID\n * @param {string|null} agentId\n */\nexport async function setActiveAgentId(agentId) {\n if (agentId) {\n await chrome.storage.local.set({ [ACTIVE_KEY]: agentId });\n } else {\n await chrome.storage.local.remove(ACTIVE_KEY);\n }\n}\n\n/**\n * 从模板创建 Agent\n * @param {Object} template\n * @returns {Promise<Object>}\n */\nexport async function createAgentFromTemplate(template) {\n return createAgent({\n name: template.name,\n icon: template.icon,\n description: template.description,\n systemPrompt: template.systemPrompt,\n toolIds: template.toolIds ? [...template.toolIds] : null,\n allowSubDispatch: template.allowSubDispatch || false,\n });\n}\n"],"mappings":"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"}
|