@realqiyan/agent-task 0.0.1-rc.2 → 0.1.0-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CONTEXT.md +17 -0
- package/README.md +30 -7
- package/bin/agent-task.mjs +35 -36
- package/config.example.json +1 -1
- package/dist/{launcher.js → application/launcher.js} +49 -58
- package/dist/application/main.js +125 -0
- package/dist/application/mcp-entry.js +71 -0
- package/dist/{startup.js → application/startup.js} +6 -11
- package/dist/application/task-runtime.js +42 -0
- package/dist/configuration/contract.js +28 -0
- package/dist/{environment.js → configuration/environment.js} +1 -5
- package/dist/configuration/files.js +42 -0
- package/dist/configuration/management.js +6 -0
- package/dist/configuration/model.js +2 -0
- package/dist/configuration/policy.js +24 -0
- package/dist/configuration/ports.js +2 -0
- package/dist/{settings.js → configuration/settings.js} +54 -39
- package/dist/executors/environment.js +10 -0
- package/dist/executors/model.js +2 -0
- package/dist/executors/ports.js +2 -0
- package/dist/executors/registry.js +131 -0
- package/dist/executors/validation.js +9 -0
- package/dist/infrastructure/lock.js +55 -0
- package/dist/{private-files.js → infrastructure/private-files.js} +1 -7
- package/dist/infrastructure/sqlite.js +19 -0
- package/dist/infrastructure/version.js +3 -0
- package/dist/{acp.js → integrations/acp/connection.js} +13 -11
- package/dist/integrations/acp/discovery.js +271 -0
- package/dist/{node-execution.js → integrations/acp/execution.js} +1 -1
- package/dist/integrations/acp/runtime.js +43 -0
- package/dist/{worker.js → integrations/acp/worker.js} +7 -4
- package/dist/{coordinator.js → integrations/coordinator/coordinator.js} +16 -7
- package/dist/{coordinator-provider.js → integrations/coordinator/provider.js} +1 -1
- package/dist/{coordinator-storage.js → integrations/coordinator/storage.js} +2 -2
- package/dist/integrations/local-service/control.js +58 -0
- package/dist/protocol/cli/admin-client.js +45 -0
- package/dist/protocol/cli/commands.js +389 -0
- package/dist/{http-auth.js → protocol/http/auth.js} +1 -1
- package/dist/protocol/http/server.js +119 -0
- package/dist/{web.js → protocol/http/web.js} +24 -17
- package/dist/{mcp.js → protocol/mcp.js} +13 -13
- package/dist/protocol/services.js +2 -0
- package/dist/protocol/settings-contract.js +37 -0
- package/dist/protocol/stdio.js +71 -0
- package/dist/protocol/task-contract.js +28 -0
- package/dist/results/files.js +70 -0
- package/dist/results/ports.js +2 -0
- package/dist/results/service.js +42 -0
- package/dist/shared/errors.js +13 -0
- package/dist/shared/limits.js +3 -0
- package/dist/shared/time.js +2 -0
- package/dist/shared/validation.js +8 -0
- package/dist/tasks/definitions.js +86 -0
- package/dist/tasks/graph.js +23 -0
- package/dist/{human-input.js → tasks/human-input.js} +8 -7
- package/dist/tasks/model.js +2 -0
- package/dist/tasks/ports.js +2 -0
- package/dist/tasks/runs.js +263 -0
- package/dist/tasks/schedule.js +36 -0
- package/dist/tasks/sessions.js +62 -0
- package/dist/tasks/storage/records.js +45 -0
- package/dist/{task-storage.js → tasks/storage/store.js} +28 -40
- package/dist/tasks/supervisor.js +227 -0
- package/dist/tasks/validation.js +24 -0
- package/dist/web/settings-view.js +46 -33
- package/docs/adr/0001-task-request-scope.md +3 -0
- package/docs/adr/0002-mcp-workspace-source.md +3 -0
- package/docs/adr/0003-adapter-installation.md +3 -0
- package/docs/architecture-guidelines.md +8 -6
- package/docs/cli.md +57 -0
- package/docs/deployment.md +46 -70
- package/docs/design-proposal.md +5 -2
- package/docs/release.md +14 -15
- package/docs/technical-design.md +49 -26
- package/docs/validation.md +92 -18
- package/docs/web-console.md +16 -11
- package/package.json +9 -7
- package/scripts/install-lib.mjs +7 -116
- package/scripts/mcp-call.mjs +1 -1
- package/scripts/probe-agent.mjs +14 -12
- package/scripts/service-runner.mjs +9 -4
- package/scripts/setup-wizard.mjs +38 -16
- package/scripts/setup.mjs +69 -108
- package/deploy/agent-task.service.example +0 -17
- package/dist/admin.js +0 -31
- package/dist/config.js +0 -72
- package/dist/executor-runtime.js +0 -37
- package/dist/lock.js +0 -43
- package/dist/main.js +0 -175
- package/dist/model.js +0 -25
- package/dist/results.js +0 -79
- package/dist/settings-contract.js +0 -16
- package/dist/task-contract.js +0 -37
- package/dist/task-model.js +0 -2
- package/dist/tasks.js +0 -508
- package/dist/version.js +0 -3
- package/scripts/uninstall.mjs +0 -57
- /package/dist/{permissions.js → executors/permissions.js} +0 -0
- /package/dist/{workspace.js → infrastructure/workspace.js} +0 -0
package/docs/deployment.md
CHANGED
|
@@ -1,115 +1,91 @@
|
|
|
1
1
|
# 安装与运行
|
|
2
2
|
|
|
3
|
-
支持 Linux 和 macOS,要求 Node.js **22.19+** 与 npm。安装包包含运行产物,不需要源码或 TypeScript
|
|
3
|
+
支持 Linux 和 macOS,要求 Node.js **22.19+** 与 npm。安装包包含运行产物,不需要源码或 TypeScript。本文描述当前实现;已发布版本和平台证据见[验证说明](validation.md),发布操作见[发布说明](release.md)。
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## 安装与初始化
|
|
6
6
|
|
|
7
7
|
```bash
|
|
8
8
|
npm install -g @realqiyan/agent-task
|
|
9
9
|
agent-task setup
|
|
10
|
-
agent-task start
|
|
11
10
|
```
|
|
12
11
|
|
|
13
|
-
使用当前用户可写的 npm prefix
|
|
12
|
+
使用当前用户可写的 npm prefix。向导要求确认安装目录、数据目录、端口、令牌配置及协调员 provider;选择 provider 后收集模型和凭据。令牌可以确认后随机生成,也可以从私有 JSON 文件提供。取消确认不写配置,密钥输入不回显。未配置 provider 时仍可管理服务,但不能接收可执行任务。
|
|
14
13
|
|
|
15
|
-
|
|
14
|
+
无终端环境必须明确确认这些初始化选项。例如,私有凭据文件已包含协调员密钥时:
|
|
16
15
|
|
|
17
16
|
```bash
|
|
18
|
-
agent-task setup --executors none --cwd /absolute/workspace --prepare-only
|
|
19
|
-
# 另一个首次安装选择:安装 Pi ACP 组件,但不授权执行。
|
|
20
17
|
agent-task setup --home /absolute/private/agent-task \
|
|
21
|
-
--
|
|
22
|
-
--provider deepseek --model deepseek-flash
|
|
18
|
+
--data-dir /absolute/private/agent-task/data --port 8765 \
|
|
19
|
+
--provider deepseek --model deepseek-flash \
|
|
20
|
+
--credentials-file /absolute/private/coordinator.json \
|
|
21
|
+
--generate-tokens --yes
|
|
23
22
|
```
|
|
24
23
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
默认安装目录为 Linux 的 `~/.local/share/agent-task` 或 macOS 的 `~/Library/Application Support/agent-task`。自定义 `--home` 后,后续命令也传同一路径。setup 输出私有文件路径和控制台地址,**不打印 token**。
|
|
28
|
-
|
|
29
|
-
## 数据目录与配置
|
|
30
|
-
|
|
31
|
-
初始 `dataDir` 是安装目录下的 `data/`。运行配置、私有环境文件、任务和协调会话记录、结果及服务文件日志均位于当前 `dataDir`。配置契约见 [config.ts](../src/config.ts),路径选择与新目录准备见 [startup.ts](../src/startup.ts)。
|
|
32
|
-
|
|
33
|
-
安装目录保留固定的 `launch.json` 定位文件、安装清单、组件及启动器控制资源;它不是另一份运行配置。这个固定入口让原有 CLI、systemd 和 launchd 注册在更换数据目录后仍能找到服务。npm 包、用户工作空间和执行端原生配置不随 `dataDir` 移动。
|
|
34
|
-
|
|
35
|
-
在 Web 修改数据目录后,下次启动只在目标目录准备已保存的配置和私有环境,并切换定位文件;**不复制任务、会话、结果或日志,不删除旧目录**。目标已有不同启动文件时拒绝覆盖;须停服核对并显式准备目标,不自动合并或修复。新目录没有旧任务,不能把切换目录当成故障恢复或重放许可。
|
|
24
|
+
此例从文件读取协调员密钥,并生成独立的服务和管理员令牌。已有服务令牌和管理员令牌时,由同一私有文件提供,省略 `--generate-tokens`。不通过命令参数传密钥值。完整选项见 `agent-task setup --help`,凭据文件约束见 [environment.ts](../src/configuration/environment.ts)。
|
|
36
25
|
|
|
37
|
-
|
|
38
|
-
2. 在[控制台](web-console.md)配置协调模型、单独保存模型密钥及注册执行端。未配置协调模型时可管理服务,但不能接收可执行任务。
|
|
39
|
-
3. 按执行端官方方式准备原生认证及权限:[Pi](https://github.com/earendil-works/pi/tree/v1.3.0/packages/coding-agent/docs)、[Codex ACP](https://github.com/agentclientprotocol/codex-acp#readme)、[Claude ACP](https://github.com/zed-industries/claude-agent-acp)、[OpenCode](https://opencode.ai/docs/acp/)。后台服务与原生登录须使用同一 OS 用户及相应 HOME/配置目录。
|
|
40
|
-
4. 审核原生工具、沙箱、凭据和结果文件读取权限后,再明确批准无人值守执行。注册只选类型,不配置命令、参数、环境变量清单或 ACP 工具白名单;系统映射见 [executor-runtime.ts](../src/executor-runtime.ts)。额外 ACP 审批请求被拒绝,不自动批准。
|
|
26
|
+
安装目录和数据目录须属于当前用户,使用规范绝对路径和私有权限。setup 输出文件路径,不打印 token。自定义 `--home` 后,后续命令及 MCP 配置使用同一路径。初始化不安装执行 CLI 或 ACP 适配器,不执行原生登录。
|
|
41
27
|
|
|
42
|
-
|
|
28
|
+
## MCP 接入与工作目录
|
|
43
29
|
|
|
44
|
-
|
|
30
|
+
在宿主的 MCP 配置中添加命令,例如采用 `mcpServers` 格式的宿主:
|
|
45
31
|
|
|
46
|
-
```
|
|
47
|
-
|
|
32
|
+
```json
|
|
33
|
+
{
|
|
34
|
+
"mcpServers": {
|
|
35
|
+
"agent-task": {
|
|
36
|
+
"command": "agent-task",
|
|
37
|
+
"args": ["mcp"]
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
48
41
|
```
|
|
49
42
|
|
|
50
|
-
|
|
43
|
+
自定义安装目录时,参数改为 `["mcp", "--home", "/absolute/private/agent-task"]`。宿主找不到命令时,使用已安装 `agent-task` 的绝对路径。配置文件位置和外层结构由宿主决定,本服务不自动修改宿主配置或识别宿主当前项目。
|
|
51
44
|
|
|
52
|
-
|
|
45
|
+
`agent-task mcp` 通过 stdio 接入,自动启动或连接同一安装目录的共用后台,并从私有文件读取内部服务 token。无需先执行 `start`,也无需把端口和 token 复制到 MCP 配置。stdout 仅传输 MCP 消息。
|
|
53
46
|
|
|
54
|
-
|
|
55
|
-
agent-task start
|
|
56
|
-
# 另一个终端:
|
|
57
|
-
agent-task status
|
|
58
|
-
agent-task restart
|
|
59
|
-
```
|
|
47
|
+
任务显式提供 `workspace` 时使用该目录;省略时使用本次 stdio 进程的启动目录。宿主须从目标项目目录启动命令,或在创建任务时明确传目录。服务不使用共用后台的启动目录猜测项目,也不根据 MCP roots 或宿主名称推断。直接 HTTP 接入需自行携带服务 token,并在 `task_create` 中指定目录。
|
|
60
48
|
|
|
61
|
-
|
|
49
|
+
创建时校验目录存在并规范化,随后固定到任务;周期执行也使用同一目录。需要修改目录时取消旧任务的未来触发,再创建新任务。创建请求按最终目录和 `requestKey` 去重,不同项目可独立使用同一请求键。契约见 [task-contract.ts](../src/protocol/task-contract.ts),决策原因见[目录来源](adr/0002-mcp-workspace-source.md)与[请求去重](adr/0001-task-request-scope.md)。
|
|
62
50
|
|
|
63
|
-
|
|
51
|
+
## 执行端发现与准备
|
|
64
52
|
|
|
65
|
-
|
|
53
|
+
每次 MCP 连接初始化时,后台从自己的原生 PATH 检测 pi、codex、claude 和 opencode。四者均不存在时拒绝 MCP 连接,提示至少安装一种;CLI/Web 管理入口仍可使用。安装和认证由对应官方工具负责:[Pi](https://github.com/earendil-works/pi/tree/v1.3.0/packages/coding-agent/docs)、[Codex](https://github.com/openai/codex)、[Claude Code](https://code.claude.com/docs/en/overview)、[OpenCode](https://opencode.ai/docs/)。
|
|
66
54
|
|
|
67
|
-
|
|
55
|
+
发现原生 CLI 后,后台为缺少 ACP 适配器的执行端安装当时最新版,已有安装直接复用;OpenCode 使用原生 ACP 命令。安装在后台进行,可用 MCP `executor_list`、`agent-task executor list` 或 Web 查看准备结果。任务只能选择就绪执行端。适配器安装失败时保留管理入口和其他就绪执行端,修正原因后显式刷新或升级。包映射和安装实现见 [discovery.ts](../src/integrations/acp/discovery.ts)。
|
|
68
56
|
|
|
69
|
-
|
|
57
|
+
适配器保存在安装目录的私有 `adapters/` 中,不修改全局 npm 包或执行 CLI 的原生配置。普通重连不访问 registry 升级已有适配器。显式更新使用 `agent-task executor upgrade codex --yes`,再查询状态;新版本发布成功前保留原安装,活动 ACP 进程不因升级被重启。高级启停设置及 Web/CLI 操作见 [CLI 说明](cli.md#执行端发现与更新)。
|
|
70
58
|
|
|
71
|
-
|
|
59
|
+
后台的原生环境来自启动它的进程,不随不同 MCP 客户端切换。新 CLI 位于已有 PATH 时可用 `executor refresh` 重新检测;PATH 本身变化时先停止后台,再从正确环境连接或启动。原生登录须与后台使用同一 OS 用户及 HOME/配置目录。
|
|
72
60
|
|
|
73
|
-
|
|
61
|
+
就绪只表示启动依赖已准备,不证明原生认证、模型或工具权限可用。服务沿用执行端原生授权,不另设手工批准开关;额外 ACP 审批请求一律拒绝,不自动扩大权限。服务和协调员秘密只从私有环境文件加载。执行端继承用户原生环境前,过滤私有文件变量、服务令牌、协调员凭据及同值别名;不要将执行端原生凭据放入服务的私有文件。过滤实现见 [environment.ts](../src/executors/environment.ts),它不构成同一用户下的沙箱。
|
|
62
|
+
|
|
63
|
+
## 后台、前台与健康检查
|
|
74
64
|
|
|
75
65
|
```bash
|
|
76
|
-
agent-task service install
|
|
77
66
|
agent-task status
|
|
78
67
|
agent-task restart
|
|
68
|
+
agent-task stop
|
|
69
|
+
# 需要前台管理时:
|
|
70
|
+
agent-task start
|
|
79
71
|
```
|
|
80
72
|
|
|
81
|
-
|
|
73
|
+
stdio 退出只关闭当前连接。由 `mcp` 启动的后台使用独立进程组,宿主关闭或原终端退出后,已提交任务继续调度;没有自动空闲退出。`stop` 显式关闭后台和活动执行。`start` 是前台入口,Ctrl-C 关闭该启动器及其运行进程。
|
|
82
74
|
|
|
83
|
-
|
|
75
|
+
独立后台不保证机器关机、系统清理用户进程或后台自身故障后继续运行,也不配置开机自启。再次启动后读取持久任务;已中断且结果不明的执行保持阻断,不自动重试、重放或改派。
|
|
84
76
|
|
|
85
|
-
|
|
86
|
-
systemctl --user status agent-task.service
|
|
87
|
-
systemctl --user stop agent-task.service
|
|
88
|
-
journalctl --user -u agent-task.service
|
|
89
|
-
```
|
|
77
|
+
`restart` 与 Web 的重启入口使用同一启动器,应用已保存配置。只有新实例通过带 MCP token 的健康检查才返回成功,并给出实例标识及地址。端口变化时以该地址为准。重启关闭 ACP 会话,不保证等待人工回复的运行能无损继续。请求超时先用 `status` 核对,不盲目重复操作。
|
|
90
78
|
|
|
91
|
-
|
|
79
|
+
MCP 接入不会自动重启一个已存在但不可用的后台。故障时查看安装目录的 `launcher.log` 和当前数据目录的 `service.log`;修正私有启动文件后显式重启,启动器已退出时重新连接或运行 `start`。启动失败不会回滚配置或重放工作。
|
|
92
80
|
|
|
93
|
-
|
|
81
|
+
## 数据目录与管理
|
|
94
82
|
|
|
95
|
-
|
|
96
|
-
launchctl print gui/$(id -u)/com.agent-task.service
|
|
97
|
-
agent-task restart
|
|
98
|
-
agent-task service remove
|
|
99
|
-
```
|
|
100
|
-
|
|
101
|
-
LaunchAgent 不是系统 LaunchDaemon,不保证用户注销后运行,也不等同于 Linux cgroup。两平台都不保证休眠或关机期间准点执行。服务文件日志由启动器写入当前数据目录;systemd journal 是操作系统另行管理的日志。
|
|
102
|
-
|
|
103
|
-
## 更新与卸载
|
|
83
|
+
运行配置、私有环境文件、任务和协调会话记录、结果及服务日志位于当前 `dataDir`。安装目录保留 `launch.json` 定位文件、初始化清单、适配器及启动器控制资源。npm 包、项目工作空间和执行端原生配置与数据目录分开。路径实现见 [startup.ts](../src/application/startup.ts)。
|
|
104
84
|
|
|
105
|
-
|
|
85
|
+
打开 `status` 返回地址同源的 `/admin/`,用本地编辑器读取当前 `dataDir/environment.json` 中的 `AGENT_TASK_ADMIN_TOKEN`,在连接表单输入。不要把 token 放入 URL、命令参数、Git 或截图。CLI 从私有文件读取管理员令牌。两端使用同一管理服务,见[控制台说明](web-console.md)和 [CLI 说明](cli.md)。
|
|
106
86
|
|
|
107
|
-
|
|
87
|
+
修改数据目录后,下次启动只准备目标配置和私有环境,并切换定位文件;不复制任务、会话、结果或日志,不删除旧目录。目标已有不同启动文件时拒绝覆盖,须停服核对并显式准备目标。新目录没有旧任务,目录切换不是恢复或重放许可。
|
|
108
88
|
|
|
109
|
-
|
|
110
|
-
agent-task service remove # 仅停止并移除服务注册
|
|
111
|
-
agent-task uninstall # 再移除本安装拥有的 ACP 组件
|
|
112
|
-
npm uninstall -g @realqiyan/agent-task # 最后由 npm 移除应用包
|
|
113
|
-
```
|
|
89
|
+
重复 setup 保留已有配置。初始化中断后须显式执行 `setup --resume`,它只接续已保存且一致的初始化文件;缺少凭据或所有权不明时停止核查,不猜测修复。更新前停止后台并备份安装目录和数据目录。调研阶段不保证旧配置或数据兼容,普通启动不迁移历史。
|
|
114
90
|
|
|
115
|
-
|
|
91
|
+
源码开发者执行 `npm ci --ignore-scripts && npm run build` 后,可用 `node bin/agent-task.mjs setup`、`node bin/agent-task.mjs mcp` 或 `npm start -- --home ...`。内部 `dist/application/main.js` 不是独立的重启入口。
|
package/docs/design-proposal.md
CHANGED
|
@@ -2,13 +2,16 @@
|
|
|
2
2
|
|
|
3
3
|
本文保留产品目标和架构取舍。实现入口见[代码导航](technical-design.md),实际证据见[验证说明](validation.md)。
|
|
4
4
|
|
|
5
|
+
使用流程简化的决策原因见[请求去重范围](adr/0001-task-request-scope.md)、[工作目录来源](adr/0002-mcp-workspace-source.md)和[适配器安装](adr/0003-adapter-installation.md)。
|
|
6
|
+
|
|
5
7
|
## 产品目标
|
|
6
8
|
|
|
7
9
|
- 调用方通过 MCP 提交整体目标、DAG 和每节点的 ACP 执行端指派,支持立即、定时及周期执行。
|
|
8
10
|
- 任务不依赖发起客户端持续在线,保留执行、交付、失败和缺少用户事实的记录。
|
|
11
|
+
- 初始化由用户确认目录、端口、令牌及协调模型;执行端自动发现并按需准备适配器。stdio 接入连接独立后台,宿主退出后后台继续调度;宿主配置由用户添加,不自动识别宿主当前项目。
|
|
9
12
|
- 协调员推进既定 DAG、解释中间结果、处理澄清并组织交付;领域分析和工具操作交给执行端。
|
|
10
13
|
- 缺少用户事实时可持久等待,回复后续接原运行,不丢失已接受工作。
|
|
11
|
-
- 提供本机 Web
|
|
14
|
+
- 提供本机 Web 控制台,管理配置、查看任务,并只控制任务的未来触发;CLI 覆盖全部 Web 管理能力,两端复用同一套服务。配置保存后通过 Web 或 CLI 重启生效;切换数据目录不搬迁或删除旧历史。
|
|
12
15
|
|
|
13
16
|
Pi Agent、Codex、Claude、OpenCode 是 ACP 集成目标,不是嵌入本服务的领域执行器。声明支持、代码实现和真实验收必须区分。
|
|
14
17
|
|
|
@@ -44,7 +47,7 @@ ACP 执行端:原生会话、领域推理和工具操作
|
|
|
44
47
|
|
|
45
48
|
暂不实现:执行中修改 DAG、自动重试或跨端故障转移、丢失 ACP 会话的重连、人工核对后强制恢复、远程执行、多租户、日历时区调度、技能同步及动态 MCP 转发。它们需要独立产品决策,不因引入 durable 自动获得。
|
|
46
49
|
|
|
47
|
-
|
|
50
|
+
启动方式见[部署说明](deployment.md)。[本机控制台](web-console.md)复用任务服务,使用独立管理员认证与浏览器请求边界;不提供文件下载或其他任务写操作。
|
|
48
51
|
|
|
49
52
|
## 外部依据
|
|
50
53
|
|
package/docs/release.md
CHANGED
|
@@ -12,28 +12,27 @@ npm run check
|
|
|
12
12
|
npm test
|
|
13
13
|
git diff --check
|
|
14
14
|
npm run pack:release
|
|
15
|
-
npm run test:install -- ./realqiyan-agent-task-0.0
|
|
15
|
+
npm run test:install -- ./realqiyan-agent-task-0.1.0-rc.1.tgz
|
|
16
16
|
```
|
|
17
17
|
|
|
18
|
-
|
|
18
|
+
安装验证先检查当前 OS 和 Node.js 版本,再在独立临时目录执行真正的全局 npm 安装,禁用 lifecycle scripts,不使用项目源码或编译器;随后验证初始化、前台启动、Web 配置、重启和认证健康检查,再验证 stdio 自动启动后台、断开后后台仍可用及显式 stop。MCP 客户端使用安装包的 SDK 依赖。验证脚本不调用模型或启动 ACP 工作。
|
|
19
19
|
|
|
20
|
-
输出报告只包含结果和证据目录,不包含 token
|
|
20
|
+
输出报告只包含结果和证据目录,不包含 token;只将实际运行的宿主平台记为通过,其他平台明确记为未执行。临时目录权限为私有,内有验证专用随机凭据及空任务库,不上传这些目录。基础测试中的真实 PTY 用例先检查平台及 `script` 能否创建终端;能力不可用时明确跳过,不能把跳过当成终端验收通过。
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
脚本只验证当前环境,不在 Linux 上推断 macOS 行为;需要 macOS 证据时,在相应环境单独运行同一命令。本地可设置 `npm_config_cache` 复用下载缓存,tarball 验证可用 `npm_config_registry` 指定依赖镜像,报告会记录其地址;`--registry` 发布后验收固定使用 npmjs。不能以复制项目的 node_modules 替代安装验证。
|
|
23
23
|
|
|
24
24
|
## GitHub Actions 门禁与受控发布
|
|
25
25
|
|
|
26
|
-
- [Validate](../.github/workflows/ci.yml):PR/master
|
|
26
|
+
- [Validate](../.github/workflows/ci.yml):PR/master 或手动触发时在 Ubuntu 执行 TypeScript 与依赖边界检查、基础测试及构建;检查包清单。安装任务**不 checkout 项目源码**,只接收 tarball 和验收脚本,在当前 Linux runner 验证启动、重启及认证检查。常规 CI 不再要求 macOS runner;这不代表 macOS 已验证或不受支持。
|
|
27
27
|
- [Publish npm](../.github/workflows/publish.yml):仅手动触发,限制 master 和账号 realqiyan,输入须匹配已验收包版本。再次执行全部门禁,再发布同一 tarball,不重建、不执行包脚本。发布后核查 latest 并执行默认全局安装验证。
|
|
28
|
-
- 普通 CI 没有 npm
|
|
28
|
+
- 普通 CI 没有 npm 凭据。发布作业使用 npm Trusted Publisher 和 GitHub OIDC,不读取 `NPM_TOKEN`;并发发布被串行化。
|
|
29
29
|
|
|
30
|
-
|
|
31
|
-
1.
|
|
32
|
-
2.
|
|
33
|
-
3.
|
|
34
|
-
4. 将代码审查后提交到 master,再在 Actions 选择 Publish npm,输入已验收的版本(本次为 `0.0.1-rc.2`)。包尚不存在时,应确认账号允许首次创建此名称;认证/权限失败须停止,不能换账号或跳过验证。
|
|
30
|
+
首次启用前,由维护者完成以下配置:
|
|
31
|
+
1. 创建 GitHub Environment **npm**,仅允许 master 部署;按仓库需要配置审核人。工作流中的 environment 名称本身**不自动创建审核保护**。
|
|
32
|
+
2. 在 npm 包的 Trusted Publisher 设置中授权 GitHub 仓库 `realqiyan/agent-task`、工作流 `publish.yml`、Environment `npm`,允许 `npm publish`。认证与 2FA 在 npm 官方界面完成,不上传本机登录凭据。
|
|
33
|
+
3. 核查分支保护及工作流修改权限,再在 Actions 选择 Publish npm,输入已验收的版本(本次为 `0.1.0-rc.1`)。认证/权限失败须停止,不能换账号或跳过验证。
|
|
35
34
|
|
|
36
|
-
|
|
35
|
+
发布作业使用 Node 24 与支持 OIDC 的 npm;命令明确传 `--tag latest --access public --provenance`。Trusted Publisher 授权和 provenance 是不同条件,设置工作流不等于 npm 已授权。首次配置和有效期限制以 [npm 官方说明](https://docs.npmjs.com/trusted-publishers/)为准。
|
|
37
36
|
|
|
38
37
|
## 经授权的本机发布
|
|
39
38
|
|
|
@@ -43,11 +42,11 @@ npm run test:install -- ./realqiyan-agent-task-0.0.1-rc.2.tgz --service
|
|
|
43
42
|
npm login --registry=https://registry.npmjs.org
|
|
44
43
|
npm whoami --registry=https://registry.npmjs.org
|
|
45
44
|
# 必须确认输出 realqiyan,再发布已检查的 tarball:
|
|
46
|
-
npm publish ./realqiyan-agent-task-0.0
|
|
45
|
+
npm publish ./realqiyan-agent-task-0.1.0-rc.1.tgz --ignore-scripts \
|
|
47
46
|
--access public --tag latest --registry=https://registry.npmjs.org
|
|
48
|
-
npm view @realqiyan/agent-task@0.0
|
|
47
|
+
npm view @realqiyan/agent-task@0.1.0-rc.1 version license --registry=https://registry.npmjs.org
|
|
49
48
|
npm view @realqiyan/agent-task dist-tags --json --registry=https://registry.npmjs.org
|
|
50
|
-
node scripts/verify-install.mjs --registry
|
|
49
|
+
node scripts/verify-install.mjs --registry
|
|
51
50
|
```
|
|
52
51
|
|
|
53
52
|
登录成功不等于发布授权已完成。若 registry 返回需要 2FA 的 E403,停止发布;维护者须在自己的终端完成发布时认证,或配置有目标包发布权限、短有效期且获准 bypass 2FA 的 granular token。不要关闭账号 2FA,不在聊天、命令参数或日志中传递一次性验证码或 token;不把本机登录凭据自动上传到 GitHub。
|
package/docs/technical-design.md
CHANGED
|
@@ -1,37 +1,60 @@
|
|
|
1
1
|
# 代码导航
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
本文指向职责入口、依赖边界和资源所有者,不复述字段、默认值或状态枚举。目标见[总体方案](design-proposal.md),设计要求见[架构原则](architecture-guidelines.md)。
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## 模块与公开能力
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
按业务能力组织 `tasks`、`executors`、`configuration` 和 `results`。各模块用普通数据模型表达内部数据,服务通过构造参数接收依赖。没有服务定位器或统一转发门面。协议入口只获得[公开业务能力](../src/protocol/services.ts)。
|
|
8
|
+
|
|
9
|
+
| 责任 | 实现入口 | 基础验证 |
|
|
8
10
|
| --- | --- | --- |
|
|
9
|
-
|
|
|
10
|
-
|
|
|
11
|
-
|
|
|
12
|
-
|
|
|
13
|
-
|
|
|
14
|
-
|
|
|
15
|
-
|
|
|
16
|
-
|
|
|
17
|
-
|
|
|
18
|
-
|
|
|
19
|
-
|
|
|
20
|
-
|
|
|
21
|
-
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
##
|
|
26
|
-
|
|
27
|
-
- `
|
|
28
|
-
|
|
29
|
-
|
|
11
|
+
| 任务定义、执行端快照、未来触发控制 | [TaskDefinitions](../src/tasks/definitions.ts)、[图校验](../src/tasks/graph.ts)、[时间规则](../src/tasks/schedule.ts) | [tasks.test.mjs](../tests/tasks.test.mjs) |
|
|
12
|
+
| Run 与节点状态的业务修改入口、派发与提交顺序 | [TaskRuns](../src/tasks/runs.ts)、[数据模型](../src/tasks/model.ts)、[窄能力契约](../src/tasks/ports.ts) | [tasks.test.mjs](../tests/tasks.test.mjs)、[task-storage.test.mjs](../tests/task-storage.test.mjs) |
|
|
13
|
+
| 时钟、协调会话监督、取消与收尾 | [RunSupervisor](../src/tasks/supervisor.ts)、[NodeSessions](../src/tasks/sessions.ts) | [tasks.test.mjs](../tests/tasks.test.mjs)、[restart.test.mjs](../tests/restart.test.mjs) |
|
|
14
|
+
| 人工事实等待与回复 | [纯状态规则](../src/tasks/human-input.ts)、[TaskRuns](../src/tasks/runs.ts) | [human-input.test.mjs](../tests/human-input.test.mjs) |
|
|
15
|
+
| 本机执行端目录、准入比较、凭据隔离 | [ExecutorRegistry](../src/executors/registry.ts)、[发现与安装](../src/integrations/acp/discovery.ts)、[环境过滤](../src/executors/environment.ts)、[审批策略](../src/executors/permissions.ts) | [executors.test.mjs](../tests/executors.test.mjs)、[policy.test.mjs](../tests/policy.test.mjs)、[config-preflight.test.mjs](../tests/config-preflight.test.mjs) |
|
|
16
|
+
| 配置与凭据编辑、发布顺序、影响预览 | [Settings](../src/configuration/settings.ts)、[配置规则](../src/configuration/policy.ts)、[预览组合](../src/configuration/management.ts) | [settings.test.mjs](../tests/settings.test.mjs)、[web.test.mjs](../tests/web.test.mjs) |
|
|
17
|
+
| 请求规范化、内部数据与严格记录校验 | [任务请求](../src/protocol/task-contract.ts)、[配置请求](../src/protocol/settings-contract.ts)、[内部数据校验](../src/tasks/validation.ts)、[持久记录](../src/tasks/storage/records.ts) | [task-storage.test.mjs](../tests/task-storage.test.mjs) |
|
|
18
|
+
| 持久读写与事务 | [TaskStore](../src/tasks/storage/store.ts)、[配置文件](../src/configuration/files.ts)、[私有文件操作](../src/infrastructure/private-files.ts) | [task-storage.test.mjs](../tests/task-storage.test.mjs)、[settings.test.mjs](../tests/settings.test.mjs) |
|
|
19
|
+
| 结果文件授权与文件持久化 | [Results](../src/results/service.ts)、[文件能力](../src/results/ports.ts)、[文件实现](../src/results/files.ts) | [results.test.mjs](../tests/results.test.mjs) |
|
|
20
|
+
| ACP、worker 与进程协议 | [ACP 连接](../src/integrations/acp/connection.ts)、[worker 监督](../src/integrations/acp/execution.ts)、[worker 入口](../src/integrations/acp/worker.ts)、[命令映射](../src/integrations/acp/runtime.ts) | [execution.test.mjs](../tests/execution.test.mjs)、[tasks.test.mjs](../tests/tasks.test.mjs) |
|
|
21
|
+
| durable 工具、模型与会话存储 | [协调适配](../src/integrations/coordinator/coordinator.ts)、[provider](../src/integrations/coordinator/provider.ts)、[存储](../src/integrations/coordinator/storage.ts) | [coordinator-provider.test.mjs](../tests/coordinator-provider.test.mjs)、[durable.test.mjs](../tests/durable.test.mjs) |
|
|
22
|
+
| MCP、HTTP 与 Web | [MCP 工具](../src/protocol/mcp.ts)、[stdio 接入](../src/protocol/stdio.ts)、[HTTP 服务](../src/protocol/http/server.ts)、[Web 路由](../src/protocol/http/web.ts)、[页面](../src/web/) | [service.test.mjs](../tests/service.test.mjs)、[web.test.mjs](../tests/web.test.mjs) |
|
|
23
|
+
| CLI 与本机控制协议 | [CLI](../src/protocol/cli/commands.ts)、[管理客户端](../src/protocol/cli/admin-client.ts)、[启动器客户端](../src/integrations/local-service/control.ts) | [web.test.mjs](../tests/web.test.mjs)、[restart.test.mjs](../tests/restart.test.mjs) |
|
|
24
|
+
| 装配、启动、关闭与重启 | [main](../src/application/main.ts)、[MCP 后台启动](../src/application/mcp-entry.ts)、[业务运行实例](../src/application/task-runtime.ts)、[launcher](../src/application/launcher.ts)、[启动准备](../src/application/startup.ts) | [stdio.test.mjs](../tests/stdio.test.mjs)、[restart.test.mjs](../tests/restart.test.mjs)、[service.test.mjs](../tests/service.test.mjs) |
|
|
25
|
+
| 安装与发布 | [命令入口](../bin/agent-task.mjs)、[setup](../scripts/setup.mjs)、[安装库](../scripts/install-lib.mjs)、[包门禁](../scripts/pack-release.mjs)、[工作流](../.github/workflows/) | [install.test.mjs](../tests/install.test.mjs)、[setup.test.mjs](../tests/setup.test.mjs)、[发布说明](release.md) |
|
|
26
|
+
|
|
27
|
+
## 依赖与一致性边界
|
|
28
|
+
|
|
29
|
+
[依赖检查器](../scripts/check-boundaries.mjs)随 `npm run check` 执行。它检查 TypeScript 模块的静态导入、类型依赖、再导出、字面量动态导入和 worker 文件引用,拒绝循环依赖、越层引用、SDK 进入业务模块,以及运行服务之外的 `commitRun` 调用。新增文件必须有明确职责分类。
|
|
30
|
+
|
|
31
|
+
模型只依赖模型;能力契约只依赖数据与其他契约;纯规则和基础校验不接触存储或协议。服务可组合其他服务,但不导入存储实现、基础设施或协议 SDK。存储实现依赖数据、校验和基础设施。协议与执行适配器调用业务能力,由应用入口装配。CLI 读取私有启动信息及调用启动器的边界在检查器中明确列出。
|
|
32
|
+
|
|
33
|
+
[TaskRuns](../src/tasks/runs.ts)持有 Run 写能力。定义服务不写 Run;监督器、模型工具、ACP 回调、超时、取消和人工回复通过运行服务的业务操作修改它。任务游标与 Run 仍使用同一事务,节点派发在创建 worker 前提交;异步结果返回后重新读取当前状态。缺少持久字段或非规范记录直接拒绝,不使用请求默认值修复。配置文件是管理员提供的下次启动输入,按配置请求契约解析;它不与 Task/Run 的持久记录契约共用默认值。
|
|
34
|
+
|
|
35
|
+
检查器约束源码依赖,不是权限沙箱,也不证明运行时副作用安全。真实模型和执行端的证据边界见[验证说明](validation.md)。
|
|
36
|
+
|
|
37
|
+
## 资源所有权
|
|
38
|
+
|
|
39
|
+
| 资源 | 创建与关闭责任 |
|
|
40
|
+
| --- | --- |
|
|
41
|
+
| 数据目录排他锁 | 应用入口取得,在业务与网络资源收尾后释放 |
|
|
42
|
+
| 业务 SQLite 与业务服务 | `createTaskRuntime` 创建;关闭先停止业务入口与监督,再关闭存储 |
|
|
43
|
+
| 协调调用、时钟与取消信号 | `RunSupervisor` 创建并等待其结束;`TaskRuns` 不持有进程或 SDK 对象 |
|
|
44
|
+
| 节点会话句柄、超时与等待期间的会话 | `NodeSessions` 持有;关闭调用共用同一个完成结果 |
|
|
45
|
+
| 适配器安装进程与安装锁 | `ExecutorRegistry` 管理安装准入与取消,`LocalExecutors` 持有进程和锁;发布后保留旧组件,关闭时等待安装退出 |
|
|
46
|
+
| stdio 接入与共享后台 | `mcp-entry` 连接或启动独立 launcher;stdio 关闭只释放本连接,后台由显式 stop 或服务管理器关闭 |
|
|
47
|
+
| worker 与 ACP 进程组 | ACP 接入创建与回收;监督器只持有窄会话能力 |
|
|
48
|
+
| durable storage 与 Harness | 每次协调调用创建;打开失败关闭存储,成功后由 Harness 关闭其存储 |
|
|
49
|
+
| HTTP listener 与 MCP transport/server | `HttpServer` 持有;请求断开只释放请求资源,应用关闭停止新请求并收尾 |
|
|
50
|
+
| 配置和结果文件描述符 | 文件适配器在单次操作内打开,并在 `finally` 中关闭 |
|
|
51
|
+
|
|
52
|
+
关闭接口幂等。关闭开始后拒绝新的业务操作;未验收的外部执行被中断并阻断后续自动派发。进程组回收与文件事务不能证明无孤儿进程、断电恢复或外部副作用 exactly-once。
|
|
30
53
|
|
|
31
54
|
## 集成与验收入口
|
|
32
55
|
|
|
33
56
|
- [probe-agent.mjs](../scripts/probe-agent.mjs):只做 ACP initialize。
|
|
34
57
|
- [单节点用例](../tests/e2e/deepseek-acp.test.mjs)、[人工回复 DAG 用例](../tests/e2e/human-dag.test.mjs):真实模型验收。
|
|
35
|
-
- [E2E harness](../tests/e2e/harness.mjs)、[Pi
|
|
58
|
+
- [E2E harness](../tests/e2e/harness.mjs)、[Pi 启动器](../scripts/run-pi-human-e2e.mjs):环境准备、服务生命周期和证据保存。
|
|
36
59
|
|
|
37
|
-
|
|
60
|
+
配置示例见 [config.example.json](../config.example.json),命令和依赖版本见 [package.json](../package.json)。操作前置条件与已验证范围见[部署说明](deployment.md)、[验证说明](validation.md)。
|
package/docs/validation.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# 验证导航与证据边界
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
**当前使用流程简化已通过本地基础测试、适配器安装、独立安装包验收,以及单节点与三节点 DAG 的真实模型复验。** 具体版本、环境和证据见下文。项目不宣称生产可用或外部副作用 exactly-once。
|
|
4
4
|
|
|
5
5
|
## 本地验证
|
|
6
6
|
|
|
@@ -10,34 +10,58 @@ npm test
|
|
|
10
10
|
git diff --check
|
|
11
11
|
```
|
|
12
12
|
|
|
13
|
-
各职责的测试入口见[代码导航](technical-design.md)。基础测试使用真实本地文件、SQLite、进程和 SDK,不调用外部模型,不使用假模型或模拟 provider。失败进程和 no_model
|
|
13
|
+
各职责的测试入口见[代码导航](technical-design.md)。基础测试使用真实本地文件、SQLite、进程和 SDK,不调用外部模型,不使用假模型或模拟 provider。失败进程和 no_model 只证明失败路径;结构化状态用例不证明模型语义判断。`check` 同时执行 TypeScript 与[依赖边界检查](../scripts/check-boundaries.mjs),后者检查模块依赖、循环、SDK 位置和 Run 写入口;它不证明运行时权限或模型语义。
|
|
14
|
+
|
|
15
|
+
2026-10-23,Linux x64、Node 24.15.0:使用流程简化通过类型与依赖边界检查、49 项基础测试和包清单门禁。重点证据:
|
|
16
|
+
|
|
17
|
+
- [stdio 进程测试](../tests/stdio.test.mjs):两个项目并发连接只保留一个后台;目录默认值、显式覆盖及跨项目请求键独立。关闭 stdin 和向客户端进程组发送 SIGHUP 后,后台仍触发未来任务。这些运行因 `no_model` 失败,只证明持续调度与无误派发,不证明 ACP 成功。
|
|
18
|
+
- [MCP 服务测试](../tests/service.test.mjs):没有原生 CLI 时拒绝连接,管理接口可用;安装到已有 PATH 后,下次连接重新发现。直接 HTTP 提交缺少目录时拒绝。
|
|
19
|
+
- [执行端测试](../tests/executors.test.mjs):原生 CLI 与适配器分开检测,禁用不安装,已有安装离线复用;真实失败安装进程不替换已发布组件,关闭时取消等待且不释放其他进程的锁。
|
|
20
|
+
- [初始化 PTY 测试](../tests/setup.test.mjs):目录、端口和令牌须确认,取消不写文件;协调员密钥隐藏输入,生成令牌不输出。初始化不安装执行端。
|
|
21
|
+
- [启动锁测试](../tests/sqlite.test.mjs):四个真实进程同时争用全新锁文件时,只有一个取得所有权;持锁进程强杀后可重新取得锁。修复前曾复现所有启动器同时争锁失败,修复后使用有限的错开重试,不触发任务重放。
|
|
22
|
+
- [存储测试](../tests/task-storage.test.mjs)与[任务测试](../tests/tasks.test.mjs):固定规范工作目录、按目录去重、严格记录拒绝而不修复、事务失败回滚、先持久派发意图再启动真实进程,以及关闭与迟到回调。
|
|
23
|
+
|
|
24
|
+
当前版本的真实模型证据见 [0.1.0-rc.1 复验](#010-rc1-复验)。本次未运行 macOS 验收。此前模块化重构的 42 项测试及临时源码副本中的依赖违规拒绝实验也已通过,属于本次改造前的证据。
|
|
14
25
|
|
|
15
26
|
## 控制台验证
|
|
16
27
|
|
|
17
|
-
[
|
|
28
|
+
[Web/CLI 用例](../tests/web.test.mjs)使用真实本机服务进程验证两端查询与保存的互通、旧草稿拒绝、发现状态和禁用策略一致、凭据引用保护、离线失败不写文件,以及独立管理员认证、Host/Origin/请求类型边界、有限任务写入、密钥不回显或进入日志。也验证重启后的配置差异和目录切换不复制历史。[重启用例](../tests/restart.test.mjs)验证前台 CLI、固定端口进程更换、绑定失败不能报成功,以及持久化的不确定派发在重复重启后仍被阻断。实际任务记录来自业务服务,不使用假模型输出。
|
|
18
29
|
|
|
19
30
|
[配置用例](../tests/settings.test.mjs)验证私有文件边界、旧编辑拒绝、显式凭据环境、端点与密钥引用分离、服务令牌别名不能作为模型凭据、失败时保留文件,以及关闭后拒绝操作。这些用例不构成断电、磁盘满或目录同步失败窗口的完整证据。
|
|
20
31
|
|
|
21
|
-
尚未完成真实浏览器交互、CSP
|
|
32
|
+
尚未完成真实浏览器交互、CSP 执行和跨浏览器缓存/自动填充验收;CLI 的编辑器交互和隐藏终端凭据输入也未做终端验收,凭据测试使用 stdin。需在浏览器核对:不可信任务文本不执行脚本或加载外链;离开、刷新和退出后无令牌残留;配置草稿不被轮询覆盖;密钥保存与配置保存的提示明确。HTTP 头检查不能替代这些验证,也不证明模型认证或 ACP 执行成功。
|
|
33
|
+
|
|
34
|
+
### 执行端与安装包
|
|
22
35
|
|
|
23
|
-
|
|
36
|
+
同日使用隔离 HOME,从 npm registry 真实安装 pi-acp 0.0.34、codex-acp 2.2.2 和 claude-agent-acp 0.94.0,再确认后续准备复用同一安装。报告位于 `/tmp/agent-task-adapter-install-T68wMA/report.json`。没有启动原生 CLI、发送 ACP 会话或调用模型;成功下载与准备不等于认证或任务成功。
|
|
24
37
|
|
|
25
|
-
|
|
38
|
+
由当前源码打包的本地 tarball 通过独立 prefix 安装验收,不依赖源码或 TypeScript。前台启动、Web HTTP 保存、Web/CLI 重启、stdio 自动启动后台、执行端发现、客户端断开后后台健康,以及显式 stop 均通过。使用真实失败程序提供可发现的原生路径,未执行 ACP 或模型工作;捕获输出未发现验证凭据。报告位于 `/tmp/agent-task-npm-LD5GQJ/report.json`。临时目录可能被系统清理,长期证据需安全归档。
|
|
26
39
|
|
|
27
|
-
|
|
40
|
+
当前候选的发布状态见下文;历史包验收不代替当前 macOS、真实宿主应用或四种执行端的模型任务复验。
|
|
28
41
|
|
|
29
42
|
## 真实模型验收入口
|
|
30
43
|
|
|
31
44
|
仅在获准环境显式运行,会产生模型费用;不使用个人凭据或真实交易:
|
|
32
45
|
|
|
33
|
-
- 单节点:`npm run test:e2e`。需安全注入 `DEEPSEEK_API_KEY`,并将 `AGENT_TASK_E2E_EXECUTOR`
|
|
34
|
-
- DAG 与人工回复:`npm run test:e2e:human -- --quantity 4`。需已安装 Pi
|
|
46
|
+
- 单节点:`npm run test:e2e`。需安全注入 `DEEPSEEK_API_KEY`,并将 `AGENT_TASK_E2E_EXECUTOR` 设为获准的 `pi`、`codex`、`claude` 或 `opencode`。执行端须另行准备原生认证及无领域副作用的配置,不继承协调密钥。连接时准备缺少的适配器。
|
|
47
|
+
- DAG 与人工回复:`npm run test:e2e:human -- --quantity 4`。需已安装 Pi 和获准 DeepSeek 测试凭据;适配器在连接时准备。数量由测试客户端提供,不冒充真人回答。
|
|
35
48
|
- 真人模式:`npm run test:e2e:human -- --answer-file /absolute/private/path/quantity.txt`。使用新文件,等待旁边的 `.question.json` 出现,再写入答案。
|
|
36
49
|
|
|
37
50
|
完整前置检查、参数和断言见 [E2E 用例](../tests/e2e/)、[Pi 启动器](../scripts/run-pi-human-e2e.mjs)。Pi 启动器为两端共用获准测试密钥,创建独立原生配置,只启用 read;这不是 OS 沙箱或独立账户隔离。强杀或断电不能保证临时认证清理,需管理员核查。
|
|
38
51
|
|
|
39
52
|
运行证据保留在命令输出的私有目录,可能包含敏感内容;不自动删除或将一次成功推广为普遍支持。
|
|
40
53
|
|
|
54
|
+
### 0.1.0-rc.1 复验
|
|
55
|
+
|
|
56
|
+
2026-10-23,Linux x64、Node 24.15.0,使用已有获准 DeepSeek 测试凭据、`deepseek-flash` 协调员、隔离的只读 Pi 原生配置及连接时安装的 pi-acp 0.0.34。现有单节点和三节点用例各执行一次,均通过;没有修改交付断言或重试任务。
|
|
57
|
+
|
|
58
|
+
- 单节点约 16.3 秒:真实 ACP 交付包含标识和结果 323,一个会话、一轮执行,结果文件持久化通过。证据:`/tmp/agent-task-real-e2e-Igj91J`;Run:`5d4f2b74-eb41-402c-874e-441b1fb29d91`。
|
|
59
|
+
- 三节点约 36.5 秒:测试客户端提供数量 4,结果 1292;同一 Run 等待并接受回复,节点轮数 1 / 2 / 1,已接受的上游不重放,三个交付均保留标识和必需数值。证据:`/tmp/agent-task-real-e2e-oreA3j`;Run:`3e6dd91b-35a5-4038-945c-c9d402d2829f`。
|
|
60
|
+
|
|
61
|
+
两项测试均在提交任务后断开客户端,再由新连接观察结果。原始测试日志:`/tmp/agent-task-pi-human-6N0Zlj/test-1.log`。服务正常退出,临时原生认证和服务环境文件已清空,任务、会话、结果及验收摘要保留。临时目录可能被系统清理,长期证据需安全归档。
|
|
62
|
+
|
|
63
|
+
此证据覆盖当前任务契约和适配器准备路径。系统级自启、真实 Pi 宿主退出、模型执行中重启及 Codex、Claude、OpenCode 模型任务未验收;stdio 后台生命周期由本地进程测试覆盖。只读配置不是 OS 沙箱。
|
|
64
|
+
|
|
41
65
|
### 本机三节点验收
|
|
42
66
|
|
|
43
67
|
2026-10-22,Linux x64、Node 24.15.0,使用 DeepSeek 协调员和只读 Pi ACP 执行端,此前带 JSON 格式约束的用例运行 `npm run test:e2e:human -- --quantity 4` 一次通过,约 28 秒。数量由测试客户端提供,结果为 1292,不是真人输入。
|
|
@@ -54,10 +78,31 @@ Linux x64、Node 24.15.0:35 项基础测试、TypeScript 检查及 npm 包清
|
|
|
54
78
|
|
|
55
79
|
同日移除用例中的 JSON 格式要求和固定澄清口令,以相同命令复验一次,约 26 秒。三个节点均输出普通文本或 Markdown,轮数为 1 / 2 / 1;没有为了格式追加澄清,计算结果仍为 1292。
|
|
56
80
|
|
|
57
|
-
但测试未通过:`audit` 原始输出包含必需标识,协调员接受的片段遗漏了该标识,验收理由仍声称包含它,运行被标为 `succeeded`。[三节点用例](../tests/e2e/human-dag.test.mjs)
|
|
81
|
+
但测试未通过:`audit` 原始输出包含必需标识,协调员接受的片段遗漏了该标识,验收理由仍声称包含它,运行被标为 `succeeded`。[三节点用例](../tests/e2e/human-dag.test.mjs)的内容断言拦住了这一遗漏,没有降低断言或重跑。此结果说明文本传递可执行,但不能把运行成功状态当成完整交付的证据;随后补充了摘录完整性指令,后续复验见下节。交付格式原则见[总体方案](design-proposal.md#架构选择)。
|
|
58
82
|
|
|
59
83
|
测试日志:`/tmp/agent-task-pi-human-K8huNN/test-1.log`;运行证据:`/tmp/agent-task-real-e2e-XgRgeo`。旧记录保留,临时原生认证已清空。
|
|
60
84
|
|
|
85
|
+
### 模块化重构后复验
|
|
86
|
+
|
|
87
|
+
2026-10-23,Linux x64、Node 24.15.0,使用 DeepSeek `deepseek-flash` 协调员、独立只读 Pi 配置和 pi-acp 0.0.34。两项现有用例各执行一次,均通过;没有修改用例断言或重复运行失败任务。
|
|
88
|
+
|
|
89
|
+
| 用例 | 结果与证据 |
|
|
90
|
+
| --- | --- |
|
|
91
|
+
| 三节点 DAG 与人工回复 | `npm run test:e2e:human -- --quantity 4`,约 31.4 秒。一个 TaskRun、三个 ACP 会话,节点轮数为 1 / 2 / 1。测试客户端提供数量 4,结果为 1292;等待约 2.1 秒后续接原 Run,在同一 `total` 会话内澄清,已接受的 `price` 记录保持不变。三个交付均保留必需标识,内容断言通过。 |
|
|
92
|
+
| 单节点 | 复用同一隔离配置的临时启动器运行现有 `deepseek-acp.test.mjs`,约 7.6 秒。一个 TaskRun、一个 ACP 会话、一轮执行,接受包含标识和结果 323 的交付,验证结果文件已持久化。 |
|
|
93
|
+
|
|
94
|
+
两次提交后均断开发起 MCP 客户端,再由新连接观察完成。服务均正常退出;本次创建的 Pi 原生认证与测试服务环境文件中的凭据已清空,历史和结果文件保留。
|
|
95
|
+
|
|
96
|
+
- DAG 日志:`/tmp/agent-task-pi-human-lpMTR3/test-1.log`;证据:`/tmp/agent-task-real-e2e-nwjC0U`;Run:`a42b672f-2f49-4c23-a169-98d25b2b2243`。
|
|
97
|
+
- 单节点日志:`/tmp/agent-task-pi-single-lseufC/test-1.log`;证据:`/tmp/agent-task-real-e2e-iV24X1`;Run:`7320bfda-3968-4305-acf6-10d7a9dae4e7`。
|
|
98
|
+
- 两个证据目录均保留 `acceptance-summary.json`、`record-audit.json`、业务 SQLite、运行快照及事件记录。临时目录可能被系统清理,长期留存需管理员安全归档。
|
|
99
|
+
|
|
100
|
+
同日以只读方式交叉核查业务库、durable 库、Pi 原生会话和结果文件。四个数据库的完整性与外键检查通过,业务记录通过严格持久化 schema 校验,最终快照与数据库一致。DAG 只有一个协调会话、两次提交(初始任务与数量回复)、11 次模型生成及 11 次工具调用;单节点为一个会话、一次提交、4 次模型生成及 4 次工具调用。所有调用均完成,无工具错误,协调员活动状态及收件箱为空。等待快照中下游仍为 pending,接受的 price 与最终记录完全一致。
|
|
101
|
+
|
|
102
|
+
四个节点的逐轮输入输出均与 Pi 原生日志一致,接受的交付全文与末轮输出及结果文件一致,标识和必需数值完整。DAG 原生日志只有两次 read,分别读取已接受的 price、total 文件;单节点没有工具调用。执行端启动另有 3 + 1 次 `npm view @earendil-works/pi-coding-agent version` 记录,来源为本机 pi-acp 的启动版本检查,Pi 的 `--offline` 不阻止该行为;日志没有查询结果,无法确认 registry 请求是否完成。两次服务退出码均为 0,临时认证及服务环境文件均为空对象。
|
|
103
|
+
|
|
104
|
+
本次通过覆盖了此前失败的交付标识断言,不证明模型始终完整摘录。数量来自声明的测试值,不是真人文件回复;未进行真实模型运行中的重启、故障恢复,或 Codex、Claude、OpenCode 成功路径验收。原生只读配置不是 OS 沙箱;原始 stderr 和完整 ACP 通信未保留,不能据此证明执行栈没有其他外部访问或诊断错误。
|
|
105
|
+
|
|
61
106
|
## 恢复保证的边界
|
|
62
107
|
|
|
63
108
|
早期 durable 研究曾在真实 SQLite/文件/SIGKILL 实验中观察到:外部文件写入后、结果提交前崩溃,恢复检查点再次执行了未做幂等保护的写入。这不是 ACP 恢复验收,而是检查点不保证外部副作用 exactly-once 的证据。
|
|
@@ -66,17 +111,47 @@ Linux x64、Node 24.15.0:35 项基础测试、TypeScript 检查及 npm 包清
|
|
|
66
111
|
|
|
67
112
|
Linux x64、Node 24.15.0 的本机记录:
|
|
68
113
|
|
|
69
|
-
-
|
|
114
|
+
- 专属目录安装、重复安装及带 token 的 MCP 健康检查通过。
|
|
70
115
|
- Pi 1.3.0 + pi-acp 0.0.34、codex-acp 2.2.2、OpenCode 1.19.3 在独立无认证 HOME 下均通过 initialize;没有发送 session/new 或模型任务,也未自动批准执行端。
|
|
71
|
-
- 经 MCP 保存并暂停未来任务,两次卸载后保留任务记录、配置、环境、工作空间和未入清单文件;服务已移除。
|
|
72
116
|
- 首次安装实验遭遇磁盘满并损坏实验清单;未删除任务数据修复。修正后在新的专属目录完成上述部署复验,不构成业务运行时磁盘满恢复的证据。
|
|
73
117
|
|
|
74
118
|
证据目录:`/tmp/agent-task-deploy-verified`、`/tmp/agent-task-deploy-final`;工作空间:`/tmp/agent-task-deploy-workspace`;空认证 HOME:`/tmp/agent-task-deploy-native-home`。临时文件可能被系统清理,长期留存需管理员安全归档。
|
|
75
119
|
|
|
76
|
-
macOS 的 npm 安装、LaunchAgent 启停及卸载保留数据已在 GitHub macOS ARM64 runner 验证,见下文。原生认证与权限、真实任务、终端关闭/用户注销后的存续,以及执行端取消和进程清理仍未验收;CI 服务启动不能替代这些证据。
|
|
77
120
|
|
|
78
121
|
## npm 发布候选验证
|
|
79
122
|
|
|
123
|
+
### 0.1.0-rc.1(本地验收完成,等待发布)
|
|
124
|
+
|
|
125
|
+
本候选包含 stdio 共用后台、本机执行端发现与适配器准备、固定任务目录和按目录去重,以及调度周期调整。初始化须确认目录、端口、令牌及协调模型;普通启动不转换旧配置或业务数据。
|
|
126
|
+
|
|
127
|
+
2026-10-23,Linux x64、Node 24.15.0:锁定依赖重装、类型与依赖边界检查、49 项基础测试、两项真实模型测试、包清单门禁及独立安装验收均通过。真实模型范围见 [0.1.0-rc.1 复验](#010-rc1-复验)。
|
|
128
|
+
|
|
129
|
+
本地候选包安装报告:`/tmp/agent-task-npm-SxC74r/report.json`。使用独立 prefix 与原生 HOME,不依赖源码或 TypeScript;前台、Web/CLI 重启、stdio 自动启动、断开后后台健康和 stop 均通过。此次依赖下载使用 npm 镜像;发布后的默认安装须另以 npmjs 验证。报告仅把本机 Linux 记为通过,未执行 macOS 验收。发布完成以工作流结果和 registry 核对为准。
|
|
130
|
+
|
|
131
|
+
### 0.0.1-rc.3(历史证据)
|
|
132
|
+
|
|
133
|
+
2026-10-23,[GitHub 发布运行 39980466554](https://github.com/realqiyan/agent-task/actions/runs/39980466554)验证提交 `80b12de`:Node 22.19.0/24.x 类型与依赖检查、基础测试、包清单门禁,以及当前 Linux runner 的独立安装、启动、重启和认证检查均通过。当前发布门禁验证宿主环境;macOS 需在对应环境另行验收。安装报告明确标记其他平台未执行,PTY 用例在缺少终端能力时明确跳过。
|
|
134
|
+
|
|
135
|
+
发布作业使用 Node 24.21.0、npm 11.19.0 和 GitHub OIDC。包版本检查及 provenance 签名成功,但上传包的 npm PUT 请求返回 E404;发布后的默认安装验证因此未执行。随后 registry 查询未发现 `0.0.1-rc.3`,不能把生成 provenance 当作包已发布。
|
|
136
|
+
|
|
137
|
+
错误指向 npm 发布授权未生效,需核对该包的 Trusted Publisher 与仓库、工作流、Environment 和允许操作是否匹配。本机凭据读取 trust 设置返回 403,尚未确认具体缺失或不匹配项。GitHub 的 `npm` Environment 已限制为 master;工作流配置与 npm 端授权仍需分别核实,见[发布说明](release.md)。
|
|
138
|
+
|
|
139
|
+
本机检查与 42 项基础测试通过;独立空工具 PATH 下的真实测试进程确认 PTY 用例明确跳过。发布诊断及已去除下载 URL 查询参数的日志保留于 `/tmp/agent-task-rc3-final-d4tqqpt9`,临时目录可能被系统清理。
|
|
140
|
+
|
|
141
|
+
2026-10-23 后续匿名 registry 核对确认 `0.0.1-rc.3` 已存在,发布元数据包含 provenance;当时 `latest=0.0.1-rc.3`。上述失败运行是历史记录,不代表后续 registry 状态,也不能单凭元数据判定最终成功发布的操作渠道。
|
|
142
|
+
|
|
143
|
+
### 0.0.1-rc.2(历史证据)
|
|
144
|
+
|
|
145
|
+
2026-10-22,`realqiyan` 已将 **[@realqiyan/agent-task@0.0.1-rc.2](https://www.npmjs.com/package/@realqiyan/agent-task/v/0.0.1-rc.2)** 发布到 npmjs。匿名 registry 查询确认版本、发布账号、MIT 许可证及 `latest=0.0.1-rc.2`。本机直接发布了下述 CI 已验收的同一 tarball,没有重新构建,也没有 GitHub provenance。
|
|
146
|
+
|
|
147
|
+
- [Validate 运行 39829900075](https://github.com/realqiyan/agent-task/actions/runs/39829900075)在提交 `48549ea` 上全部通过:Node 22.19.0/24.x 类型检查、35 项基础测试、构建和包清单门禁。
|
|
148
|
+
- Ubuntu x64 与 macOS ARM64 的 Node 22.19.0 安装任务不 checkout 源码,使用同一 CI tarball 验证前台、Web/CLI 重启、启动目录/端口/token 变量名切换、认证健康检查。macOS 证据来自 hosted runner,不包括 Intel Mac、浏览器、休眠或用户注销场景。
|
|
149
|
+
- 发布后在 Linux x64、Node 24.15.0 以独立空 npm 配置匿名执行默认 `npm install -g @realqiyan/agent-task`,未指定版本或使用本地 tarball;固定使用 npmjs。前台、Web HTTP 配置、重启、健康检查均通过。
|
|
150
|
+
|
|
151
|
+
发布后安装报告:`/tmp/agent-task-npm-vseswA/report.json`。捕获输出未发现验证凭据,测试服务已移除。没有模型调用或 ACP 任务,不替代原生认证、权限或真实模型复验。临时目录可能被系统清理;包内文档是打包时快照,后续证据以本仓库为准。
|
|
152
|
+
|
|
153
|
+
### 0.0.1-rc.1(历史证据)
|
|
154
|
+
|
|
80
155
|
2026-10-22,`realqiyan` 已将 **[@realqiyan/agent-task@0.0.1-rc.1](https://www.npmjs.com/package/@realqiyan/agent-task/v/0.0.1-rc.1)** 发布到 npmjs。匿名 registry 查询确认版本、发布账号、MIT 许可证及 `latest=0.0.1-rc.1`。本次经授权从本机发布,没有 GitHub provenance。包内文档是打包时快照,后续证据以[仓库中的最新记录](https://github.com/realqiyan/agent-task/blob/master/docs/validation.md#npm-发布候选验证)为准。
|
|
81
156
|
|
|
82
157
|
npm 因包名保护拒绝了未加 scope 的 `agent-task`:名称被判定与 `agent-base` 过于相似。维护者已明确批准使用 `@realqiyan/agent-task`,安装命令随之改为 `npm install -g @realqiyan/agent-task`,CLI 仍为 `agent-task`。未关闭账号 2FA,也未上传本机凭据。
|
|
@@ -85,13 +160,12 @@ npm 因包名保护拒绝了未加 scope 的 `agent-task`:名称被判定与 `
|
|
|
85
160
|
|
|
86
161
|
- Node 22.19.0 和 24.15.0 的 TypeScript 检查、33 项基础测试及构建均通过;真实 PTY 用例验证 setup 的确认/取消、生成独立 token 和不输出凭据。
|
|
87
162
|
- [包清单门禁](../scripts/pack-release.mjs)通过:仅包含预编译 JS、Web 资源、明确列出的操作脚本、示例及公开文档;不包含源码、开发工具、凭据文件、运行数据库或本地记录。
|
|
88
|
-
- Node 22.19.0 先验收 scoped tarball,再从 npmjs 按 `npm install -g @realqiyan/agent-task` 的默认版本选择全局安装到独立临时 prefix;没有指定版本或使用本地 tarball 替代 registry 安装。禁用 lifecycle scripts,不使用项目源码或 TypeScript。前台启动、Web HTTP
|
|
89
|
-
- 重复 setup 保留 token;重复卸载保留配置、凭据、任务库和工作空间。显式注册的执行端仍未授权,没有 ACP 工作或模型调用。捕获的命令、前台输出及用户服务日志未出现验证用凭据,测试服务已移除。
|
|
163
|
+
- Node 22.19.0 先验收 scoped tarball,再从 npmjs 按 `npm install -g @realqiyan/agent-task` 的默认版本选择全局安装到独立临时 prefix;没有指定版本或使用本地 tarball 替代 registry 安装。禁用 lifecycle scripts,不使用项目源码或 TypeScript。前台启动、Web HTTP 配置保存/重启及带认证的健康检查均通过。
|
|
90
164
|
- tarball 预验收使用 npm 镜像依赖;发布后验收固定使用 `https://registry.npmjs.org/`,通过独立空 npm 配置文件进行匿名安装。复用 npm 下载缓存,没有复制项目 node_modules;不构成空缓存下载时延的保证。
|
|
91
165
|
|
|
92
166
|
Linux 22.19.0 的发布后 registry 安装报告:`/tmp/agent-task-npm-uM8FT5/report.json`;scoped tarball 预验收报告:`/tmp/agent-task-npm-Zgkggc/report.json`。临时目录包含验证专用随机凭据和空业务库,不上传或打包;报告仅含结果。Node 22.19.0 会输出内置 SQLite 的 experimental warning,这不是认证错误。
|
|
93
167
|
|
|
94
|
-
同日,[GitHub Validate 运行 39813423968](https://github.com/realqiyan/agent-task/actions/runs/39813423968)在提交 `461a1b0` 上全部通过:Node 22.19.0/24.x 检查、基础测试、构建及包清单门禁;Ubuntu x64 与 macOS ARM64 的 Node 22.19.0 安装任务均不 checkout 源码,使用 CI tarball 完成前台、Web HTTP
|
|
168
|
+
同日,[GitHub Validate 运行 39813423968](https://github.com/realqiyan/agent-task/actions/runs/39813423968)在提交 `461a1b0` 上全部通过:Node 22.19.0/24.x 检查、基础测试、构建及包清单门禁;Ubuntu x64 与 macOS ARM64 的 Node 22.19.0 安装任务均不 checkout 源码,使用 CI tarball 完成前台、Web HTTP 配置、认证健康检查验收。报告确认输出无验证凭据,没有模型或 ACP 工作。macOS 的证据来自 hosted runner,不包括 Intel Mac、交互式终端/浏览器、休眠或用户注销场景。
|
|
95
169
|
|
|
96
170
|
[受控发布工作流](../.github/workflows/publish.yml)已推送,但发布 Environment 审核和 npm 发布 secret 尚未配置,发布作业没有实际执行;本机首发和 Validate 通过不等于 Actions 发布已经验收。
|
|
97
171
|
|
|
@@ -99,10 +173,10 @@ Linux 22.19.0 的发布后 registry 安装报告:`/tmp/agent-task-npm-uM8FT5/r
|
|
|
99
173
|
|
|
100
174
|
## 尚未验证
|
|
101
175
|
|
|
102
|
-
-
|
|
176
|
+
- 复杂任务的语义验收、并行分支与汇合、不同执行端之间的交付。
|
|
103
177
|
- 各执行端原生权限、认证续期、沙箱、技能/MCP 发现及文件访问;其他模型和 OpenAI 兼容端点的协议差异。
|
|
104
178
|
- 真实模型崩溃窗口、重复收费和预算行为;人工等待期间保留真实 ACP 会话的续答、并发回复、长时间等待及重启。
|
|
105
|
-
-
|
|
179
|
+
- 系统级强杀、断电、业务库磁盘满、真实任务的长期监督和原生权限。
|
|
106
180
|
- SDK 升级、历史数据转换,以及执行中修改计划等当前未开放能力。
|
|
107
181
|
|
|
108
182
|
实现和操作入口见[代码导航](technical-design.md)、[部署说明](deployment.md)。
|