@dobby.ai/dobby 0.1.0 → 0.1.2
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 +84 -39
- package/dist/src/agent/event-forwarder.js +185 -16
- package/dist/src/cli/commands/cron.js +39 -35
- package/dist/src/cli/commands/doctor.js +81 -2
- package/dist/src/cli/commands/extension.js +3 -1
- package/dist/src/cli/commands/init.js +43 -173
- package/dist/src/cli/commands/topology.js +38 -14
- package/dist/src/cli/program.js +15 -137
- package/dist/src/cli/shared/config-io.js +3 -31
- package/dist/src/cli/shared/config-mutators.js +33 -9
- package/dist/src/cli/shared/configure-sections.js +52 -12
- package/dist/src/cli/shared/init-catalog.js +89 -46
- package/dist/src/cli/shared/local-extension-specs.js +85 -0
- package/dist/src/cli/shared/schema-prompts.js +26 -2
- package/dist/src/core/gateway.js +3 -1
- package/dist/src/core/routing.js +53 -38
- package/dist/src/core/types.js +2 -0
- package/dist/src/cron/config.js +2 -2
- package/dist/src/cron/service.js +87 -23
- package/dist/src/cron/store.js +1 -1
- package/dist/src/main.js +0 -0
- package/dist/src/shared/dobby-repo.js +40 -0
- package/package.json +11 -4
- package/.env.example +0 -9
- package/AGENTS.md +0 -267
- package/ROADMAP.md +0 -34
- package/config/cron.example.json +0 -9
- package/config/gateway.example.json +0 -128
- package/config/models.custom.example.json +0 -27
- package/dist/src/agent/tests/event-forwarder.test.js +0 -113
- package/dist/src/cli/shared/config-path.js +0 -207
- package/dist/src/cli/shared/init-models-file.js +0 -65
- package/dist/src/cli/shared/presets.js +0 -86
- package/dist/src/cli/tests/config-command.test.js +0 -42
- package/dist/src/cli/tests/config-io.test.js +0 -64
- package/dist/src/cli/tests/config-mutators.test.js +0 -47
- package/dist/src/cli/tests/config-path.test.js +0 -21
- package/dist/src/cli/tests/discord-config.test.js +0 -23
- package/dist/src/cli/tests/doctor.test.js +0 -107
- package/dist/src/cli/tests/init-catalog.test.js +0 -87
- package/dist/src/cli/tests/presets.test.js +0 -41
- package/dist/src/cli/tests/program-options.test.js +0 -92
- package/dist/src/cli/tests/routing-config.test.js +0 -199
- package/dist/src/cli/tests/routing-legacy.test.js +0 -191
- package/dist/src/core/tests/control-command.test.js +0 -17
- package/dist/src/core/tests/gateway-update-strategy.test.js +0 -167
- package/dist/src/core/tests/runtime-registry.test.js +0 -116
- package/dist/src/core/tests/typing-controller.test.js +0 -103
- package/docs/BOXLITE_SANDBOX_FEASIBILITY.md +0 -175
- package/docs/CRON_SCHEDULER_DESIGN.md +0 -374
- package/docs/DOCKER_SANDBOX_vs_BOXLITE.md +0 -77
- package/docs/EXTENSION_SYSTEM_ARCHITECTURE.md +0 -119
- package/docs/MVP.md +0 -135
- package/docs/RUNBOOK.md +0 -242
- package/docs/TEAMWORK_HANDOFF_DESIGN.md +0 -440
- package/plugins/connector-discord/dobby.manifest.json +0 -18
- package/plugins/connector-discord/index.js +0 -1
- package/plugins/connector-discord/package-lock.json +0 -360
- package/plugins/connector-discord/package.json +0 -38
- package/plugins/connector-discord/src/connector.ts +0 -350
- package/plugins/connector-discord/src/contribution.ts +0 -21
- package/plugins/connector-discord/src/mapper.ts +0 -102
- package/plugins/connector-discord/tsconfig.json +0 -19
- package/plugins/connector-feishu/dobby.manifest.json +0 -18
- package/plugins/connector-feishu/index.js +0 -1
- package/plugins/connector-feishu/package-lock.json +0 -618
- package/plugins/connector-feishu/package.json +0 -38
- package/plugins/connector-feishu/src/connector.ts +0 -343
- package/plugins/connector-feishu/src/contribution.ts +0 -26
- package/plugins/connector-feishu/src/mapper.ts +0 -401
- package/plugins/connector-feishu/tsconfig.json +0 -19
- package/plugins/plugin-sdk/index.d.ts +0 -261
- package/plugins/plugin-sdk/index.js +0 -1
- package/plugins/plugin-sdk/package-lock.json +0 -12
- package/plugins/plugin-sdk/package.json +0 -22
- package/plugins/provider-claude/dobby.manifest.json +0 -17
- package/plugins/provider-claude/index.js +0 -1
- package/plugins/provider-claude/package-lock.json +0 -3398
- package/plugins/provider-claude/package.json +0 -39
- package/plugins/provider-claude/src/contribution.ts +0 -1018
- package/plugins/provider-claude/tsconfig.json +0 -19
- package/plugins/provider-claude-cli/dobby.manifest.json +0 -17
- package/plugins/provider-claude-cli/index.js +0 -1
- package/plugins/provider-claude-cli/package-lock.json +0 -2898
- package/plugins/provider-claude-cli/package.json +0 -38
- package/plugins/provider-claude-cli/src/contribution.ts +0 -1673
- package/plugins/provider-claude-cli/tsconfig.json +0 -19
- package/plugins/provider-pi/dobby.manifest.json +0 -17
- package/plugins/provider-pi/index.js +0 -1
- package/plugins/provider-pi/package-lock.json +0 -3877
- package/plugins/provider-pi/package.json +0 -40
- package/plugins/provider-pi/src/contribution.ts +0 -476
- package/plugins/provider-pi/tsconfig.json +0 -19
- package/plugins/sandbox-core/boxlite.js +0 -1
- package/plugins/sandbox-core/dobby.manifest.json +0 -17
- package/plugins/sandbox-core/docker.js +0 -1
- package/plugins/sandbox-core/package-lock.json +0 -136
- package/plugins/sandbox-core/package.json +0 -39
- package/plugins/sandbox-core/src/boxlite-context.ts +0 -2
- package/plugins/sandbox-core/src/boxlite-contribution.ts +0 -53
- package/plugins/sandbox-core/src/boxlite-executor.ts +0 -911
- package/plugins/sandbox-core/src/docker-contribution.ts +0 -43
- package/plugins/sandbox-core/src/docker-executor.ts +0 -217
- package/plugins/sandbox-core/tsconfig.json +0 -19
- package/scripts/local-extensions.mjs +0 -168
- package/src/agent/event-forwarder.ts +0 -414
- package/src/cli/commands/config.ts +0 -328
- package/src/cli/commands/configure.ts +0 -92
- package/src/cli/commands/cron.ts +0 -410
- package/src/cli/commands/doctor.ts +0 -230
- package/src/cli/commands/extension.ts +0 -205
- package/src/cli/commands/init.ts +0 -396
- package/src/cli/commands/start.ts +0 -223
- package/src/cli/commands/topology.ts +0 -383
- package/src/cli/index.ts +0 -9
- package/src/cli/program.ts +0 -465
- package/src/cli/shared/config-io.ts +0 -277
- package/src/cli/shared/config-mutators.ts +0 -440
- package/src/cli/shared/config-schema.ts +0 -228
- package/src/cli/shared/config-types.ts +0 -121
- package/src/cli/shared/configure-sections.ts +0 -551
- package/src/cli/shared/discord-config.ts +0 -14
- package/src/cli/shared/init-catalog.ts +0 -189
- package/src/cli/shared/init-models-file.ts +0 -77
- package/src/cli/shared/runtime.ts +0 -33
- package/src/cli/shared/schema-prompts.ts +0 -414
- package/src/cli/tests/config-command.test.ts +0 -56
- package/src/cli/tests/config-io.test.ts +0 -92
- package/src/cli/tests/config-mutators.test.ts +0 -59
- package/src/cli/tests/doctor.test.ts +0 -120
- package/src/cli/tests/init-catalog.test.ts +0 -96
- package/src/cli/tests/program-options.test.ts +0 -113
- package/src/cli/tests/routing-config.test.ts +0 -209
- package/src/core/control-command.ts +0 -12
- package/src/core/dedup-store.ts +0 -103
- package/src/core/gateway.ts +0 -607
- package/src/core/routing.ts +0 -379
- package/src/core/runtime-registry.ts +0 -141
- package/src/core/tests/control-command.test.ts +0 -20
- package/src/core/tests/runtime-registry.test.ts +0 -140
- package/src/core/tests/typing-controller.test.ts +0 -129
- package/src/core/types.ts +0 -318
- package/src/core/typing-controller.ts +0 -119
- package/src/cron/config.ts +0 -154
- package/src/cron/schedule.ts +0 -61
- package/src/cron/service.ts +0 -249
- package/src/cron/store.ts +0 -155
- package/src/cron/types.ts +0 -60
- package/src/extension/loader.ts +0 -145
- package/src/extension/manager.ts +0 -355
- package/src/extension/manifest.ts +0 -26
- package/src/extension/registry.ts +0 -229
- package/src/main.ts +0 -8
- package/src/sandbox/executor.ts +0 -44
- package/src/sandbox/host-executor.ts +0 -118
- package/tsconfig.json +0 -18
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
# Docker Sandboxes vs BoxLite 选型方案(面向 `dobby`)
|
|
2
|
-
|
|
3
|
-
## 简要结论
|
|
4
|
-
1. 结论:在你当前架构下,主选 `BoxLite`,保留现有 `docker` 后端作为回退;`Docker Sandboxes` 仅作为“开发机交互调试工具”可选。
|
|
5
|
-
2. 原因:你的核心执行面是程序化 `Executor.exec(command, cwd, timeout, signal, env)`,而不是交互式 agent CLI。`BoxLite` 与此接口天然更贴合。
|
|
6
|
-
3. 你的目标是“本地 agent 更谨慎访问文件系统 + 可自由试错”,`BoxLite` 更容易做强边界(只挂载 route/projectRoot)和可恢复试错(每会话/每路由生命周期控制)。
|
|
7
|
-
|
|
8
|
-
## 横向对比(与当前架构相关)
|
|
9
|
-
| 维度 | Docker Sandboxes | BoxLite |
|
|
10
|
-
| -------------------------- | ------------------------------------------------------------------ | --------------------------------------------------- |
|
|
11
|
-
| 产品定位 | 面向 AI agent 工作流(Docker Desktop 体验优先) | 面向可嵌入式 sandbox runtime(SDK/程序化优先) |
|
|
12
|
-
| 接入方式 | 以 `docker sandbox ...` CLI/工作流为主 | Node/Python/Rust SDK 直接嵌入业务代码 |
|
|
13
|
-
| 运行模式 | 本地模式 + 云模式(但本地模式对 Codex/Claude,云模式支持矩阵不同) | 本地优先;另有 BoxRun(local/hybrid/serverless) |
|
|
14
|
-
| 隔离模型 | 每个 sandbox 私有 Docker daemon;但文档明确仍继承用户系统权限边界 | micro-VM 硬件级隔离,库嵌入,无常驻 daemon |
|
|
15
|
-
| 文件系统策略 | workspace 同步/映射友好,适合交互开发 | volume/workingDir 精细控制,适合 route 级边界治理 |
|
|
16
|
-
| 网络治理 | 有网络策略机制 | 可通过 security/network 选项约束(按 SDK/平台能力) |
|
|
17
|
-
| 稳定性表态 | 官方标注 Beta、非生产就绪 | 仍属快速演进项目,但更偏 SDK 生产集成路径 |
|
|
18
|
-
| 与你当前 `Executor` 贴合度 | 中(需要 CLI 编排层转译) | 高(可直接实现 `BoxliteExecutor`) |
|
|
19
|
-
|
|
20
|
-
## 针对当前架构的最终选型
|
|
21
|
-
1. 主选:`BoxLite` 作为新 sandbox backend。
|
|
22
|
-
2. 保留:`docker` backend 继续存在,作为回退与兼容路径。
|
|
23
|
-
3. 不选主路径:`Docker Sandboxes` 不进入 `Executor` 主执行链路,仅用于开发者本机交互调试(可选)。
|
|
24
|
-
|
|
25
|
-
推断说明:该结论基于你当前接口与调用链
|
|
26
|
-
`<repo-root>/src/sandbox/executor.ts:5`、`<repo-root>/src/sandbox/executor.ts:18`、`<repo-root>/src/agent/session-factory.ts:168`、`<repo-root>/src/core/types.ts:109`。
|
|
27
|
-
|
|
28
|
-
## 决策后实施规格(decision-complete)
|
|
29
|
-
|
|
30
|
-
## 1) 公共接口/类型变更
|
|
31
|
-
1. 保持 `Executor` 接口不变:`exec(command, cwd, options)` 与 `close()`。
|
|
32
|
-
2. 扩展 `SandboxConfig.boxlite`(当前仅 `workspaceRoot`)为可运营字段集合:`image`、`cpus`、`memoryMib`、`containerWorkspaceRoot`、`reuseMode`、`autoRemove`、`securityProfile`。
|
|
33
|
-
3. 默认值:
|
|
34
|
-
`image=alpine:latest`,`containerWorkspaceRoot=/workspace`,`reuseMode=conversation`,`securityProfile=maximum`。
|
|
35
|
-
|
|
36
|
-
## 2) 执行语义
|
|
37
|
-
1. 每个 conversation key 绑定一个 box(默认),避免跨会话“stop 连坐”。
|
|
38
|
-
2. 仅挂载该 route 的 `projectRoot` 到 box 内 `/workspace`。
|
|
39
|
-
3. 命令执行统一 `sh -lc "cd <guest-cwd> && <command>"`,保持与现有 DockerExecutor 行为一致。
|
|
40
|
-
4. timeout/abort 策略:
|
|
41
|
-
超时或 `AbortSignal` 触发时,不依赖 `execution.kill()`;直接 `box.stop()`,返回 `killed=true`,并重建该 conversation box。
|
|
42
|
-
|
|
43
|
-
## 3) 失败模式处理
|
|
44
|
-
1. 启动时原生 binding 缺失:fail fast,错误信息必须带安装修复建议。
|
|
45
|
-
2. box stop 失败:记录 error,强制丢弃 runtime 引用,下一次 exec 全新建 box。
|
|
46
|
-
3. cwd 越界:继续沿用现有 `assertWithinRoot` 逻辑,直接拒绝执行。
|
|
47
|
-
|
|
48
|
-
## 4) 测试与验收场景
|
|
49
|
-
1. 路由隔离:A/B 两个 route 不可跨目录读写。
|
|
50
|
-
2. 中断能力:长命令在 stop 后 3 秒内结束并回报 `killed=true`。
|
|
51
|
-
3. 超时恢复:超时后下一条命令可在新 box 成功执行。
|
|
52
|
-
4. 并发安全:同 conversation 串行,不出现队列错乱。
|
|
53
|
-
5. 依赖健壮性:缺失 native 包时启动即报错,不在运行中才崩溃。
|
|
54
|
-
|
|
55
|
-
## 5) rollout 方案
|
|
56
|
-
1. `sandbox.backend=boxlite` 先在单 route 灰度,其他 route 保持 `docker`。
|
|
57
|
-
2. 收集 7 天指标:超时率、中断成功率、命令失败率、平均执行延迟。
|
|
58
|
-
3. 达标后扩大到全部 route;未达标自动回退 `docker`。
|
|
59
|
-
|
|
60
|
-
## 假设与默认
|
|
61
|
-
1. 你的主要场景是“本地 agent 的程序化执行安全”,不是“Docker Desktop 交互体验优先”。
|
|
62
|
-
2. 本机具备 virtualization 与 Docker 基础环境。
|
|
63
|
-
3. 当前优先级是“文件系统边界可控 + 可试错恢复”,高于“零改造接入”。
|
|
64
|
-
|
|
65
|
-
## 主要依据(sources)
|
|
66
|
-
1. [Docker Sandboxes Overview](https://docs.docker.com/ai/sandboxes/)
|
|
67
|
-
2. [Docker Sandboxes Architecture](https://docs.docker.com/ai/sandboxes/architecture/)
|
|
68
|
-
3. [Docker Sandboxes Supported Agents](https://docs.docker.com/ai/sandboxes/supported-agents/)
|
|
69
|
-
4. [Docker Sandboxes Get Started](https://docs.docker.com/ai/sandboxes/get-started/)
|
|
70
|
-
5. [Docker Sandboxes Workflows](https://docs.docker.com/ai/sandboxes/workflows/)
|
|
71
|
-
6. [Docker Sandboxes Network Policies](https://docs.docker.com/ai/sandboxes/network-policies/)
|
|
72
|
-
7. [Docker Sandboxes Advanced](https://docs.docker.com/ai/sandboxes/advanced/)
|
|
73
|
-
8. [BoxLite Introduction](https://docs.boxlite.ai/introduction)
|
|
74
|
-
9. [BoxLite BoxRun](https://docs.boxlite.ai/concepts/boxrun)
|
|
75
|
-
10. `<repo-root>/docs/BOXLITE_SANDBOX_FEASIBILITY.md:19`
|
|
76
|
-
11. `<repo-root>/src/sandbox/executor.ts:5`
|
|
77
|
-
12. `<repo-root>/src/agent/session-factory.ts:168`
|
|
@@ -1,119 +0,0 @@
|
|
|
1
|
-
# 扩展系统架构(V3)
|
|
2
|
-
|
|
3
|
-
## 1. 目标
|
|
4
|
-
|
|
5
|
-
V3 将扩展系统对齐 VSCode extension 使用体验:
|
|
6
|
-
|
|
7
|
-
- 扩展按需下载与安装。
|
|
8
|
-
- 扩展在独立目录管理,不污染宿主依赖树。
|
|
9
|
-
- 启用与安装分离:配置声明启用,扩展目录提供安装事实。
|
|
10
|
-
- 宿主不再提供任何 `plugins/*` 或 `dist/plugins/*` 回退加载。
|
|
11
|
-
|
|
12
|
-
## 2. 核心模型
|
|
13
|
-
|
|
14
|
-
### 2.1 安装目录
|
|
15
|
-
|
|
16
|
-
- 扩展 store 固定在 `<data.rootDir>/extensions`。
|
|
17
|
-
- 目录结构:
|
|
18
|
-
- `<data.rootDir>/extensions/package.json`
|
|
19
|
-
- `<data.rootDir>/extensions/package-lock.json`
|
|
20
|
-
- `<data.rootDir>/extensions/node_modules/*`
|
|
21
|
-
|
|
22
|
-
### 2.2 配置语义
|
|
23
|
-
|
|
24
|
-
- `extensions.allowList`:声明哪些包允许加载。
|
|
25
|
-
- `providers/connectors/sandboxes.items`:绑定 `type + inline config`。
|
|
26
|
-
- `routes`:定义可复用的执行 profile。
|
|
27
|
-
- `bindings`:把 connector source 绑定到 route。
|
|
28
|
-
|
|
29
|
-
新增不变量:
|
|
30
|
-
- allowList 中每个启用包必须能从扩展 store 解析;否则启动 fail-fast。
|
|
31
|
-
|
|
32
|
-
### 2.3 Manifest 约束
|
|
33
|
-
|
|
34
|
-
- 扩展包必须包含 `dobby.manifest.json`。
|
|
35
|
-
- `contributions[*].entry` 必须是插件包内构建好的 JS 入口(`.js/.mjs/.cjs`)。
|
|
36
|
-
- entry 必须位于插件包根目录内部(禁止越界路径)。
|
|
37
|
-
- 仓库里的 `plugins/*` 仅作源码参考,宿主不会回退加载这些源码路径。
|
|
38
|
-
|
|
39
|
-
## 3. 宿主职责边界
|
|
40
|
-
|
|
41
|
-
宿主仅负责:
|
|
42
|
-
|
|
43
|
-
- 读取配置
|
|
44
|
-
- 从扩展 store 解析 allowList 包
|
|
45
|
-
- 解析 manifest 并动态 import entry
|
|
46
|
-
- 注册 contribution 并实例化 provider/connector/sandbox
|
|
47
|
-
- 运行 gateway 主流程
|
|
48
|
-
|
|
49
|
-
宿主不负责:
|
|
50
|
-
|
|
51
|
-
- 插件源码热加载
|
|
52
|
-
- 插件开发态 fallback
|
|
53
|
-
- 自动改写用户配置
|
|
54
|
-
|
|
55
|
-
## 4. CLI 设计
|
|
56
|
-
|
|
57
|
-
在 `src/main.ts` 提供子命令:
|
|
58
|
-
|
|
59
|
-
- `extension install <packageSpec>`
|
|
60
|
-
- 执行:`npm install --prefix <extensionsDir> --save-exact <packageSpec>`
|
|
61
|
-
- 输出:已安装包、contributions、可粘贴配置模板(allowList + instances)
|
|
62
|
-
- `extension uninstall <packageName>`
|
|
63
|
-
- 执行:`npm uninstall --prefix <extensionsDir> <packageName>`
|
|
64
|
-
- `extension list`
|
|
65
|
-
- 列出扩展 store 中已安装包及其 contributions
|
|
66
|
-
|
|
67
|
-
`start` 命令(默认)维持网关启动逻辑。
|
|
68
|
-
|
|
69
|
-
## 5. 加载流程
|
|
70
|
-
|
|
71
|
-
1. 读取 `gateway.json` 并归一化 `data.rootDir`。
|
|
72
|
-
2. 计算 `extensionsDir = <data.rootDir>/extensions`。
|
|
73
|
-
3. 使用 `createRequire(<extensionsDir>/package.json)` 解析 allowList 包。
|
|
74
|
-
4. 读取并校验 manifest。
|
|
75
|
-
5. 动态加载 contribution entry。
|
|
76
|
-
6. 进行 contribution kind 一致性校验。
|
|
77
|
-
7. 注册并实例化所需实例。
|
|
78
|
-
|
|
79
|
-
## 6. 错误策略
|
|
80
|
-
|
|
81
|
-
### 6.1 缺包
|
|
82
|
-
|
|
83
|
-
当 allowList 包无法解析时,直接启动失败,并输出明确命令:
|
|
84
|
-
|
|
85
|
-
`dobby extension install <package>`
|
|
86
|
-
|
|
87
|
-
### 6.2 非法 manifest / entry
|
|
88
|
-
|
|
89
|
-
以下情况直接启动失败:
|
|
90
|
-
|
|
91
|
-
- manifest 不存在或结构非法
|
|
92
|
-
- entry 非 JS 文件
|
|
93
|
-
- entry 指向包外路径
|
|
94
|
-
- entry 文件不存在
|
|
95
|
-
- contribution kind 与模块导出不一致
|
|
96
|
-
|
|
97
|
-
## 7. 插件包契约(发布侧)
|
|
98
|
-
|
|
99
|
-
- 第三方依赖放在插件自身 `dependencies`。
|
|
100
|
-
- `@dobby.ai/plugin-sdk` 作为插件契约依赖(通常 `peerDependencies`)。
|
|
101
|
-
- connector capability 需显式声明 `updateStrategy`(`edit | final_only | append`),由网关统一决定出站发送策略(update / final-only / append)。
|
|
102
|
-
- 开发态可通过 `devDependencies` 使用 `file:../plugin-sdk`,保证本地类型可用;运行态不依赖宿主回退。
|
|
103
|
-
- 插件运行时不得依赖宿主源码路径或宿主 dist 路径。
|
|
104
|
-
|
|
105
|
-
## 8. Breaking 变更总结
|
|
106
|
-
|
|
107
|
-
- 宿主 `package.json` 不再使用 `file:plugins/*` 依赖。
|
|
108
|
-
- 宿主编译边界收敛到 `src/**/*.ts`。
|
|
109
|
-
- 插件入口不再 `try src / catch dist`。
|
|
110
|
-
- manifest entry 改为包内 dist JS。
|
|
111
|
-
- 插件 npm scope 统一为 `@dobby.ai/*`(旧 `@dobby/*` 配置需手动迁移)。
|
|
112
|
-
|
|
113
|
-
## 9. 验收基线
|
|
114
|
-
|
|
115
|
-
1. allowList 缺包时,启动 fail-fast,报错含 install 命令。
|
|
116
|
-
2. 安装扩展后启动成功,日志可见已加载包和 contributions。
|
|
117
|
-
3. 根 `node_modules` 中存在同名包时,loader 不回退解析(只认扩展 store)。
|
|
118
|
-
4. `extension install` 输出模板可直接用于 `gateway.json`。
|
|
119
|
-
5. `npm run check` 与 `npm run build` 通过。
|
package/docs/MVP.md
DELETED
|
@@ -1,135 +0,0 @@
|
|
|
1
|
-
# Discord-First MVP(独立仓库,依赖 pi 包,不改 pi 源码)
|
|
2
|
-
|
|
3
|
-
## Summary
|
|
4
|
-
最终落地决策如下:
|
|
5
|
-
1. 不在 `pi-mono` 内开发 MVP,不修改其源码。
|
|
6
|
-
2. 新建你自己的独立仓库(建议名:`dobby`)。
|
|
7
|
-
3. 通过 NPM 稳定版依赖 `@mariozechner/pi-*` 包。
|
|
8
|
-
4. MVP 仅做 Discord。
|
|
9
|
-
5. 架构采用 `Gateway Core + Connector 插件`,单进程运行。
|
|
10
|
-
6. 频道能力通过静态 `channelId -> route profile` 映射实现。
|
|
11
|
-
7. 沙箱 MVP 先 Docker,Boxlite 作为后续里程碑。
|
|
12
|
-
|
|
13
|
-
## 1. 代码放置位置
|
|
14
|
-
建议新目录(仓库外):
|
|
15
|
-
1. `~/workspace/dobby`(或你的组织仓库)。
|
|
16
|
-
2. `pi-mono` 作为只读参考,不参与提交。
|
|
17
|
-
|
|
18
|
-
## 2. 新仓库结构(MVP)
|
|
19
|
-
```text
|
|
20
|
-
dobby/
|
|
21
|
-
package.json
|
|
22
|
-
tsconfig.json
|
|
23
|
-
.env.example
|
|
24
|
-
config/
|
|
25
|
-
gateway.example.json # 可提交示例;复制为 gateway.json 后本地使用
|
|
26
|
-
src/
|
|
27
|
-
main.ts
|
|
28
|
-
core/
|
|
29
|
-
gateway.ts
|
|
30
|
-
routing.ts
|
|
31
|
-
types.ts
|
|
32
|
-
runtime-registry.ts
|
|
33
|
-
dedup-store.ts
|
|
34
|
-
connectors/
|
|
35
|
-
discord/
|
|
36
|
-
connector.ts
|
|
37
|
-
mapper.ts
|
|
38
|
-
agent/
|
|
39
|
-
session-factory.ts
|
|
40
|
-
event-forwarder.ts
|
|
41
|
-
sandbox/
|
|
42
|
-
executor.ts # interface
|
|
43
|
-
docker-executor.ts
|
|
44
|
-
host-executor.ts
|
|
45
|
-
data/
|
|
46
|
-
sessions/
|
|
47
|
-
attachments/
|
|
48
|
-
logs/
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
## 3. 依赖策略(已锁定)
|
|
52
|
-
`package.json` 依赖使用 NPM 稳定版(固定 minor,按需要升级):
|
|
53
|
-
1. `@mariozechner/pi-coding-agent`
|
|
54
|
-
2. `@mariozechner/pi-agent-core`
|
|
55
|
-
3. `@mariozechner/pi-ai`
|
|
56
|
-
4. `discord.js`
|
|
57
|
-
5. 你选择的日志与配置库(如 `pino`、`zod`)
|
|
58
|
-
|
|
59
|
-
不使用:
|
|
60
|
-
1. `file:` 本地路径依赖
|
|
61
|
-
2. 直接改 `pi-mono/packages/*`
|
|
62
|
-
|
|
63
|
-
## 4. 与 pi 的边界(不修改源码)
|
|
64
|
-
只通过公开 API 使用:
|
|
65
|
-
1. `createAgentSession`
|
|
66
|
-
2. `SessionManager`
|
|
67
|
-
3. `AuthStorage`
|
|
68
|
-
4. `ModelRegistry`
|
|
69
|
-
5. `createCodingTools(cwd)` / `createReadOnlyTools(cwd)`
|
|
70
|
-
|
|
71
|
-
你自己的业务逻辑放在独立仓库:
|
|
72
|
-
1. Discord 事件接入
|
|
73
|
-
2. Channel 路由
|
|
74
|
-
3. 队列与幂等
|
|
75
|
-
4. 审计与监控
|
|
76
|
-
5. 沙箱后端选择
|
|
77
|
-
|
|
78
|
-
## 5. 频道差异化能力(Discord)
|
|
79
|
-
配置文件固定支持:
|
|
80
|
-
```json
|
|
81
|
-
{
|
|
82
|
-
"channelMap": {
|
|
83
|
-
"1234567890": "projectA",
|
|
84
|
-
"2234567890": "projectB"
|
|
85
|
-
},
|
|
86
|
-
"routes": {
|
|
87
|
-
"projectA": {
|
|
88
|
-
"projectRoot": "/Users/you/workspace/project-a",
|
|
89
|
-
"tools": "full",
|
|
90
|
-
"systemPromptFile": "/Users/you/config/prompts/project-a.md"
|
|
91
|
-
},
|
|
92
|
-
"projectB": {
|
|
93
|
-
"projectRoot": "/Users/you/workspace/project-b",
|
|
94
|
-
"tools": "full",
|
|
95
|
-
"systemPromptFile": "/Users/you/config/prompts/project-b.md"
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
```
|
|
100
|
-
这样每个 channel 会绑定不同项目目录与行为。
|
|
101
|
-
|
|
102
|
-
## 6. Sandbox 方案
|
|
103
|
-
MVP:
|
|
104
|
-
1. 默认 `docker` 执行器。
|
|
105
|
-
2. `host` 仅调试可选。
|
|
106
|
-
|
|
107
|
-
Post-MVP:
|
|
108
|
-
1. 新增 `BoxliteExecutor`,实现同一 `Executor` 接口。
|
|
109
|
-
2. 配置切换 `sandbox.backend = "boxlite"`。
|
|
110
|
-
3. 对接完成后做稳定性与性能回归。
|
|
111
|
-
|
|
112
|
-
## 7. 里程碑(更新后)
|
|
113
|
-
1. M0:独立仓库初始化 + 配置加载 + 类型定义 + 运行骨架。
|
|
114
|
-
2. M1:Discord Connector + Gateway Pipeline + Session 串行队列。
|
|
115
|
-
3. M2:频道静态路由(不同 channel -> 不同 projectRoot)。
|
|
116
|
-
4. M3:工具全能力 + Docker sandbox + 审计日志。
|
|
117
|
-
5. M4:错误恢复、重试、幂等、上线监控。
|
|
118
|
-
6. M5:Boxlite 集成(非 MVP)。
|
|
119
|
-
7. M6:Telegram/WhatsApp(MVP 后)。
|
|
120
|
-
|
|
121
|
-
## Test Cases
|
|
122
|
-
1. 两个 Discord channel 分别写入不同项目目录,互不污染。
|
|
123
|
-
2. 同 channel 并发消息串行执行,不乱序。
|
|
124
|
-
3. `message_update` 流式编辑稳定,无覆盖错乱。
|
|
125
|
-
4. 工具调用日志完整记录(开始、结束、错误)。
|
|
126
|
-
5. Docker 模式下不能越界访问未挂载路径。
|
|
127
|
-
6. 进程重启后会话可恢复。
|
|
128
|
-
|
|
129
|
-
## Assumptions & Defaults
|
|
130
|
-
1. 你不会修改 `pi-mono` 源码。
|
|
131
|
-
2. 依赖源固定为 NPM 稳定版。
|
|
132
|
-
3. MVP 只支持 Discord。
|
|
133
|
-
4. 默认工具权限 `full`。
|
|
134
|
-
5. 默认 sandbox 为 Docker。
|
|
135
|
-
6. channel 路由采用静态配置,不做动态 `/bind`。
|
package/docs/RUNBOOK.md
DELETED
|
@@ -1,242 +0,0 @@
|
|
|
1
|
-
# dobby 操作手册(v3)
|
|
2
|
-
|
|
3
|
-
本文档用于在本机启动 `dobby` 并完成最小验收。
|
|
4
|
-
当前配置模型是扩展系统 v3,默认 sandbox 为 `host.builtin`。
|
|
5
|
-
|
|
6
|
-
> Scope 变更说明:扩展包已硬切到 `@dobby.ai/*`。若你的旧配置仍使用 `@dobby/*`,请先手动替换后再执行安装/启动命令。
|
|
7
|
-
|
|
8
|
-
## 1. 前置条件
|
|
9
|
-
|
|
10
|
-
1. Node.js >= 20(见 `<repo-root>/package.json`)。
|
|
11
|
-
2. 已安装 npm。
|
|
12
|
-
3. 已创建 Discord Bot,并拿到 Token。
|
|
13
|
-
4. Discord Bot 已开启 `MESSAGE CONTENT INTENT`,并被邀请到目标服务器。
|
|
14
|
-
5. 已准备至少一个本地项目目录(作为 route 的 `projectRoot`)。
|
|
15
|
-
|
|
16
|
-
## 2. 初始化项目
|
|
17
|
-
|
|
18
|
-
在仓库根目录执行:
|
|
19
|
-
|
|
20
|
-
```bash
|
|
21
|
-
npm install
|
|
22
|
-
npm run check
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
## 3. 环境变量
|
|
26
|
-
|
|
27
|
-
复制示例:
|
|
28
|
-
|
|
29
|
-
```bash
|
|
30
|
-
cp .env.example .env
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
编辑 `.env`,至少设置:
|
|
34
|
-
|
|
35
|
-
```bash
|
|
36
|
-
DISCORD_BOT_TOKEN=你的真实Token
|
|
37
|
-
LOG_LEVEL=info
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
说明:
|
|
41
|
-
1. `npm run start --` 不会自动加载 `.env`,请先导出变量。
|
|
42
|
-
2. `npm run start:local --` 会通过 `--env-file-if-exists=.env` 自动加载。
|
|
43
|
-
|
|
44
|
-
手动导出方式:
|
|
45
|
-
|
|
46
|
-
```bash
|
|
47
|
-
set -a
|
|
48
|
-
source .env
|
|
49
|
-
set +a
|
|
50
|
-
```
|
|
51
|
-
|
|
52
|
-
## 4. 准备配置文件
|
|
53
|
-
|
|
54
|
-
配置路径优先级:
|
|
55
|
-
1. `DOBBY_CONFIG_PATH`(若设置)
|
|
56
|
-
2. 在 `dobby` 仓库内运行时自动使用 `./config/gateway.json`
|
|
57
|
-
3. 默认 `~/.dobby/gateway.json`
|
|
58
|
-
|
|
59
|
-
示例(强制指定配置文件):
|
|
60
|
-
|
|
61
|
-
```bash
|
|
62
|
-
DOBBY_CONFIG_PATH=/tmp/gateway.dev.json npm run start -- config show providers --json
|
|
63
|
-
```
|
|
64
|
-
|
|
65
|
-
```bash
|
|
66
|
-
cp config/gateway.example.json config/gateway.json
|
|
67
|
-
```
|
|
68
|
-
|
|
69
|
-
说明:
|
|
70
|
-
1. 若你使用 `dobby init` 并选择了 `provider.pi`,`models.custom.json` 会在缺失时自动生成。
|
|
71
|
-
2. 手动维护配置时,仍可参考 `config/models.custom.example.json`。
|
|
72
|
-
|
|
73
|
-
### 4.1 CLI config 命令(硬切)
|
|
74
|
-
|
|
75
|
-
`config` 已切换为交互与结构化查看,不再支持路径式 `get/set/unset`。
|
|
76
|
-
|
|
77
|
-
可用命令:
|
|
78
|
-
|
|
79
|
-
```bash
|
|
80
|
-
dobby config show [section] [--json]
|
|
81
|
-
dobby config list [section] [--json]
|
|
82
|
-
dobby config edit
|
|
83
|
-
dobby config schema list [--json]
|
|
84
|
-
dobby config schema show <contributionId> [--json]
|
|
85
|
-
```
|
|
86
|
-
|
|
87
|
-
说明:
|
|
88
|
-
1. `config edit` 与 `configure` 在编辑 provider/connector 实例时,会优先读取扩展暴露的 `configSchema` 动态生成字段输入。
|
|
89
|
-
2. 默认仅询问关键字段;带默认值的高级选项可在提示时按需展开。
|
|
90
|
-
3. 若某个 contribution 没有可用 `configSchema`,CLI 会先提示原因(例如扩展 disabled/未安装);未加载 schema 时会要求你确认是否继续使用 JSON 文本输入。
|
|
91
|
-
4. `dobby init` 也会在安装扩展后按 `configSchema` 动态询问 provider/connector 的配置字段(Discord connector 保留专用引导配置)。
|
|
92
|
-
|
|
93
|
-
旧命令映射:
|
|
94
|
-
1. `config get ...` -> `config show` 或 `config list`
|
|
95
|
-
2. `config set ...` -> `config edit`
|
|
96
|
-
3. `config unset ...` -> 使用专用删除命令(`channel unset`、`route remove`、`extension uninstall`)
|
|
97
|
-
|
|
98
|
-
`init` 语义说明:
|
|
99
|
-
1. `dobby init` 仅用于首次初始化。
|
|
100
|
-
2. 若配置文件已存在,`init` 会直接报错;请改用 `dobby config edit` 或 `dobby configure`。
|
|
101
|
-
|
|
102
|
-
## 5. 关键配置说明(v3)
|
|
103
|
-
|
|
104
|
-
编辑 `<repo-root>/config/gateway.json`。
|
|
105
|
-
|
|
106
|
-
必须检查:
|
|
107
|
-
1. `extensions.allowList`:声明启用的扩展包(仅声明启用,不等于已安装)。
|
|
108
|
-
2. `providers.items`:至少有一个 provider 实例,并与 `providers.default` 对应。
|
|
109
|
-
3. `connectors.items`:至少有一个 connector 实例(Discord)。
|
|
110
|
-
4. `routes.items.*.projectRoot`:改成你机器上的真实目录。
|
|
111
|
-
5. `bindings.items.*`:为每个入口声明 `(connector, source.type, source.id) -> route`。
|
|
112
|
-
6. `routes.items.*.provider`:可省略;省略时走 `routes.defaults.provider`。
|
|
113
|
-
7. `routes.items.*.sandbox`:可省略;省略时走 `routes.defaults.sandbox`。
|
|
114
|
-
|
|
115
|
-
默认 sandbox:
|
|
116
|
-
1. 全局默认是 `sandboxes.default = "host.builtin"`。
|
|
117
|
-
2. route 里若显式写 `sandbox`,则按 route 覆盖。
|
|
118
|
-
|
|
119
|
-
当前默认示例(推荐):
|
|
120
|
-
|
|
121
|
-
```json
|
|
122
|
-
"sandboxes": {
|
|
123
|
-
"default": "host.builtin",
|
|
124
|
-
"items": {}
|
|
125
|
-
}
|
|
126
|
-
```
|
|
127
|
-
|
|
128
|
-
## 6. 扩展安装
|
|
129
|
-
|
|
130
|
-
首次运行前,需把 allowList 里的扩展安装到 extension store(`data/extensions`):
|
|
131
|
-
|
|
132
|
-
```bash
|
|
133
|
-
npm run start -- extension install @dobby.ai/provider-pi
|
|
134
|
-
npm run start -- extension install @dobby.ai/connector-discord
|
|
135
|
-
```
|
|
136
|
-
|
|
137
|
-
可选扩展:
|
|
138
|
-
|
|
139
|
-
```bash
|
|
140
|
-
npm run start -- extension install @dobby.ai/provider-claude
|
|
141
|
-
npm run start -- extension install @dobby.ai/provider-claude-cli
|
|
142
|
-
npm run start -- extension install @dobby.ai/sandbox-core
|
|
143
|
-
```
|
|
144
|
-
|
|
145
|
-
Claude provider 说明:
|
|
146
|
-
1. `provider.claude`(`@dobby.ai/provider-claude`)走 Claude Agent SDK。
|
|
147
|
-
2. `provider.claude-cli`(`@dobby.ai/provider-claude-cli`)走 Claude Code CLI(当前为 host-only)。
|
|
148
|
-
|
|
149
|
-
若使用 `provider.claude-cli`,启动前建议检查:
|
|
150
|
-
|
|
151
|
-
```bash
|
|
152
|
-
claude --version
|
|
153
|
-
claude auth status --json
|
|
154
|
-
```
|
|
155
|
-
|
|
156
|
-
说明:
|
|
157
|
-
1. 若配置 `authMode=subscription`,`claude auth status --json` 需显示 `loggedIn: true`。
|
|
158
|
-
2. 若配置 `authMode=apiKey`,需在网关启动环境提供 `ANTHROPIC_API_KEY`。
|
|
159
|
-
|
|
160
|
-
查看已安装扩展:
|
|
161
|
-
|
|
162
|
-
```bash
|
|
163
|
-
npm run start -- extension list
|
|
164
|
-
```
|
|
165
|
-
|
|
166
|
-
## 7. 启动网关
|
|
167
|
-
|
|
168
|
-
```bash
|
|
169
|
-
npm run build
|
|
170
|
-
npm run start --
|
|
171
|
-
```
|
|
172
|
-
|
|
173
|
-
或:
|
|
174
|
-
|
|
175
|
-
```bash
|
|
176
|
-
npm run start:local --
|
|
177
|
-
```
|
|
178
|
-
|
|
179
|
-
## 8. 最小验收
|
|
180
|
-
|
|
181
|
-
启动成功后,日志应包含:
|
|
182
|
-
1. `Extension packages loaded`
|
|
183
|
-
2. `Discord connector ready`
|
|
184
|
-
3. `Gateway started`
|
|
185
|
-
|
|
186
|
-
在 Discord 中验证:
|
|
187
|
-
1. 在已绑定频道发送消息(群聊若 `mentions="required"` 需 @bot)。
|
|
188
|
-
2. Bot 先回复 `_Thinking..._`,随后流式更新。
|
|
189
|
-
3. 发送 `stop`、`/stop` 或 `/cancel` 可取消当前会话中正在执行和排队中的任务。
|
|
190
|
-
4. 发送 `/new` 或 `/reset` 会归档当前会话状态,并让下一条消息从新会话开始。
|
|
191
|
-
|
|
192
|
-
## 9. 切换到 Docker / BoxLite(可选)
|
|
193
|
-
|
|
194
|
-
如果需要容器沙箱,不再使用 `sandbox.backend` 字段,而是通过扩展实例配置:
|
|
195
|
-
|
|
196
|
-
1. 安装 `@dobby.ai/sandbox-core`。
|
|
197
|
-
2. 在 `sandboxes.items` 定义实例(如 `sandbox.docker` 或 `sandbox.boxlite`)。
|
|
198
|
-
3. 将 `sandboxes.default` 或 `routes.items.*.sandbox` 指向对应实例。
|
|
199
|
-
|
|
200
|
-
示意(只展示结构):
|
|
201
|
-
|
|
202
|
-
```json
|
|
203
|
-
"sandboxes": {
|
|
204
|
-
"default": "docker.main",
|
|
205
|
-
"items": {
|
|
206
|
-
"docker.main": {
|
|
207
|
-
"type": "sandbox.docker",
|
|
208
|
-
"container": "im-agent-sandbox",
|
|
209
|
-
"hostWorkspaceRoot": "/Users/you/workspace",
|
|
210
|
-
"containerWorkspaceRoot": "/workspace"
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
```
|
|
215
|
-
|
|
216
|
-
## 10. 数据目录
|
|
217
|
-
|
|
218
|
-
运行后会自动创建:
|
|
219
|
-
1. `<repo-root>/data/sessions`
|
|
220
|
-
2. `<repo-root>/data/attachments`
|
|
221
|
-
3. `<repo-root>/data/logs`
|
|
222
|
-
4. `<repo-root>/data/state`
|
|
223
|
-
5. `<repo-root>/data/extensions`
|
|
224
|
-
|
|
225
|
-
## 11. 常见问题
|
|
226
|
-
|
|
227
|
-
1. `Discord bot token env 'DISCORD_BOT_TOKEN' is not set`
|
|
228
|
-
- 未导出环境变量,先执行 `set -a; source .env; set +a`,或使用 `npm run start:local`。
|
|
229
|
-
|
|
230
|
-
2. `Configured model 'provider/model' not found`
|
|
231
|
-
- 检查 provider 实例中的 `provider/model/modelsFile` 是否和 `config/models.custom.json` 一致。
|
|
232
|
-
|
|
233
|
-
3. `Extension package 'xxx' is not installed in '.../data/extensions'`
|
|
234
|
-
- 先执行 `npm run start -- extension install <package>`。
|
|
235
|
-
|
|
236
|
-
4. Docker 沙箱报 `container is not running` 或越界错误
|
|
237
|
-
- 检查 docker container 状态,以及 `hostWorkspaceRoot` 是否覆盖 route 的 `projectRoot`。
|
|
238
|
-
|
|
239
|
-
5. 机器人在群里没反应
|
|
240
|
-
- 检查入口是否已经写进 `bindings.items`。
|
|
241
|
-
- 检查是否需要 @bot(`mentions="required"`)。
|
|
242
|
-
- 检查 bot 在频道内的读写权限与消息内容权限。
|