@botlearn-course/daemon 0.0.1 → 0.0.3
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 +12 -1
- package/dist/agent-service-session.d.ts +67 -0
- package/dist/agent-service-session.js +796 -0
- package/dist/agent-service-ws-protocol.d.ts +28 -0
- package/dist/agent-service-ws-protocol.js +128 -0
- package/dist/cli.d.ts +1 -2
- package/dist/cli.js +114 -13
- package/dist/course-client.js +4 -2
- package/dist/index.d.ts +4 -0
- package/dist/index.js +4 -0
- package/dist/mcp/report-progress-server.d.ts +21 -0
- package/dist/mcp/report-progress-server.js +136 -0
- package/dist/mcp/report-progress.d.ts +29 -0
- package/dist/mcp/report-progress.js +60 -0
- package/dist/run-dispatcher.d.ts +15 -0
- package/dist/run-dispatcher.js +126 -6
- package/dist/runtime-env.d.ts +9 -0
- package/dist/runtime-env.js +40 -0
- package/dist/runtime-profile.js +25 -13
- package/dist/runtimes/acp-stream.js +2 -0
- package/dist/runtimes/codex.d.ts +1 -1
- package/dist/runtimes/codex.js +2 -2
- package/dist/runtimes/deepseek-tui.d.ts +6 -2
- package/dist/runtimes/deepseek-tui.js +238 -41
- package/dist/runtimes/engine.d.ts +14 -3
- package/dist/runtimes/engine.js +32 -5
- package/dist/runtimes/hermes-agent.d.ts +1 -1
- package/dist/runtimes/hermes-agent.js +3 -2
- package/dist/runtimes/ndjson-stream.d.ts +1 -1
- package/dist/runtimes/ndjson-stream.js +4 -2
- package/dist/runtimes/openclaw-acp.js +3 -1
- package/dist/runtimes/progress.d.ts +50 -0
- package/dist/runtimes/progress.js +339 -0
- package/dist/sandbox-supervisor.d.ts +3 -0
- package/dist/sandbox-supervisor.js +176 -0
- package/dist/transcript.js +6 -0
- package/dist/types.d.ts +29 -3
- package/dist/websocket-client.d.ts +43 -0
- package/dist/websocket-client.js +320 -0
- package/dist/workspace.d.ts +9 -0
- package/dist/workspace.js +43 -2
- package/package.json +3 -2
package/README.md
CHANGED
|
@@ -36,6 +36,12 @@ npx @botlearn-course/daemon@latest course logout
|
|
|
36
36
|
| `course doctor` | 打印 Auth 状态(不含 token)与 runtime 探测表(安装路径 / 版本 / 登录状态 / 安装提示)。 |
|
|
37
37
|
| `--help` / `--version` | 帮助与版本。 |
|
|
38
38
|
|
|
39
|
+
包内还包含供 BotLearn 托管 E2B Template 使用的内部命令
|
|
40
|
+
`botlearn-sandbox-supervisor agent-service session`。它不是 BYOA 用户入口:生产环境只允许由
|
|
41
|
+
Agent Service 以固定 argv 启动,通过 stdin 接收一次性 bootstrap,并把 daemon/runtime 分别降权
|
|
42
|
+
到 `botlearn-control`/`user` UID。`agent-service session --bootstrap-stdin` 同样属于受 supervisor
|
|
43
|
+
保护的内部协议,不应直接暴露给课程任务或 workspace shell。
|
|
44
|
+
|
|
39
45
|
## 支持的 runtime
|
|
40
46
|
|
|
41
47
|
run 的 `runtime.id` 决定用哪个 adapter 执行;未指定时默认 `codex`。runtime 不可用时 run 会
|
|
@@ -47,7 +53,7 @@ run 的 `runtime.id` 决定用哪个 adapter 执行;未指定时默认 `codex`
|
|
|
47
53
|
| `claude-code` | Claude Code | `claude` | `BOTLEARN_CLAUDE_BIN` | doctor 会额外探测登录状态 |
|
|
48
54
|
| `gemini` | Gemini CLI | `gemini` | `BOTLEARN_GEMINI_BIN` | |
|
|
49
55
|
| `kimi-cli` | Kimi CLI | `kimi` | `BOTLEARN_KIMI_CLI_BIN` | |
|
|
50
|
-
| `deepseek-tui` | DeepSeek TUI | `deepseek` | `BOTLEARN_DEEPSEEK_TUI_BIN` | |
|
|
56
|
+
| `deepseek-tui` | DeepSeek TUI | `deepseek` | `BOTLEARN_DEEPSEEK_TUI_BIN` | Linux/macOS 本地 server 会保留现有 MCP 配置并注入零依赖 `report_progress`;`botlearn` 是保留 server key。Windows 因固定 runtime 无法保证 MCP clean-env,首版 fail closed、不注入 progress |
|
|
51
57
|
| `hermes-agent` | Hermes Agent | `hermes-acp` | `BOTLEARN_HERMES_AGENT_BIN` | ACP stdio 协议 |
|
|
52
58
|
| `openclaw-acp` | OpenClaw (ACP) | `openclaw` | `BOTLEARN_OPENCLAW_BIN` | 还需配置 `BOTLEARN_OPENCLAW_URL`(可选 `BOTLEARN_OPENCLAW_TOKEN` / `BOTLEARN_OPENCLAW_AGENT`),二进制或 URL 缺失时 doctor 标记不可用 |
|
|
53
59
|
| `fake` | 假 runtime | 无 | — | 仅测试/演示用:产出确定性文本与一个 `draft.md`。默认隐藏,只有 `BOTLEARN_DAEMON_ENABLE_FAKE_RUNTIME=1` 时才注册并上报 |
|
|
@@ -93,10 +99,15 @@ runtime 凭据。
|
|
|
93
99
|
终态前把完整文件上传到 Course Service 的受保护存储。
|
|
94
100
|
- 每个 run 在独立 workspace 内执行并有超时上限;runtime 进程在取消/超时后会被终止
|
|
95
101
|
(SIGTERM → SIGKILL)。
|
|
102
|
+
- `report_progress` MCP 子进程以 clean environment 启动,不继承 Course 控制字段或模型凭据;
|
|
103
|
+
transcript 与 Course event 只保留严格归一化后的 `summary` / `status`,不保存原始 tool arguments。
|
|
96
104
|
- `course logout` 只删除本机凭据;要让服务端立即吊销该 daemon,请在前端 daemon 列表执行
|
|
97
105
|
revoke。
|
|
98
106
|
- 本包 production 依赖为零,发布 tarball 只包含 `dist/`、`README.md`、`package.json`、
|
|
99
107
|
`LICENSE`(CI 发布前强制校验)。
|
|
108
|
+
- 托管 session 的 control token/reconnect state 位于 runtime UID 不可访问的 `0700` control home;
|
|
109
|
+
runtime workspace 独立可写,Prompt Pack/Skill 则通过 control-owned、group-readable 的只读视图
|
|
110
|
+
提供。长期模型 provider key 留在 Agent Service,runtime 只拿 generation-scoped proxy grant。
|
|
100
111
|
|
|
101
112
|
## 发布
|
|
102
113
|
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { type Logger } from "./log.js";
|
|
2
|
+
import { type PersistentSessionExecution, type PreparedPersistentTurn, type RunReportingClient } from "./run-dispatcher.js";
|
|
3
|
+
import type { CourseRuntime, CourseRuntimeProfile, RunEvent, RunFileCandidate, RunFileRecord, RunStartPayload } from "./types.js";
|
|
4
|
+
export interface AgentServiceSessionOptions {
|
|
5
|
+
wsUrl: string;
|
|
6
|
+
sessionId: string;
|
|
7
|
+
sessionToken: string;
|
|
8
|
+
runtimes: Map<string, CourseRuntime>;
|
|
9
|
+
daemonVersion: string;
|
|
10
|
+
runtimeEnv?: Record<string, string>;
|
|
11
|
+
log?: Logger;
|
|
12
|
+
random?: () => number;
|
|
13
|
+
sleep?: (ms: number) => Promise<void>;
|
|
14
|
+
}
|
|
15
|
+
/** Long-running daemon client for one persistent managed sandbox session. */
|
|
16
|
+
export declare class AgentServiceSessionClient implements RunReportingClient, PersistentSessionExecution {
|
|
17
|
+
private readonly options;
|
|
18
|
+
private readonly log;
|
|
19
|
+
private readonly random;
|
|
20
|
+
private readonly sleep;
|
|
21
|
+
private readonly state;
|
|
22
|
+
private readonly dispatcher;
|
|
23
|
+
private readonly attempts;
|
|
24
|
+
private readonly runtimeProfiles;
|
|
25
|
+
private readonly pendingAcks;
|
|
26
|
+
private readonly pendingFilePrepares;
|
|
27
|
+
private readonly pendingFileCommits;
|
|
28
|
+
private readonly fileGrants;
|
|
29
|
+
private readonly inflightCommands;
|
|
30
|
+
private socket;
|
|
31
|
+
private sessionGeneration;
|
|
32
|
+
private connectionEpoch;
|
|
33
|
+
private inboundSeq;
|
|
34
|
+
private heartbeatMs;
|
|
35
|
+
private staleMs;
|
|
36
|
+
private stopped;
|
|
37
|
+
private permanentFailure;
|
|
38
|
+
constructor(options: AgentServiceSessionOptions);
|
|
39
|
+
prepareTurn(payload: RunStartPayload): PreparedPersistentTurn;
|
|
40
|
+
persistNativeSession(sessionId: string): void;
|
|
41
|
+
run(): Promise<void>;
|
|
42
|
+
stop(): void;
|
|
43
|
+
postEvent(agentRunId: string, event: RunEvent): Promise<void>;
|
|
44
|
+
postFile(agentRunId: string, file: RunFileCandidate): Promise<RunFileRecord>;
|
|
45
|
+
uploadFileContent(agentRunId: string, fileId: string, absPath: string, mimeType?: string): Promise<RunFileRecord>;
|
|
46
|
+
getRunRuntimeProfile(agentRunId: string): Promise<CourseRuntimeProfile>;
|
|
47
|
+
private connectOnce;
|
|
48
|
+
private handleHello;
|
|
49
|
+
private assertServerFrame;
|
|
50
|
+
private handleServerFrame;
|
|
51
|
+
private applyDesiredState;
|
|
52
|
+
private reconcileInterruptedCommand;
|
|
53
|
+
private runtimeActivation;
|
|
54
|
+
private ackEventOrFile;
|
|
55
|
+
private acceptFileGrant;
|
|
56
|
+
private replaySpool;
|
|
57
|
+
private sendHeartbeat;
|
|
58
|
+
private sendCommandAck;
|
|
59
|
+
private sendControlFrame;
|
|
60
|
+
private sendFrame;
|
|
61
|
+
private nextOutboundSeq;
|
|
62
|
+
private spoolBytes;
|
|
63
|
+
private enforceSpoolLimit;
|
|
64
|
+
private rejectPending;
|
|
65
|
+
private rejectPendingFiles;
|
|
66
|
+
private persist;
|
|
67
|
+
}
|