Files
nanoclaw/docs/zh/setup-wiring.md
2026-05-12 13:14:17 +00:00

102 lines
5.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 安装连线——状态与剩余工作
最后更新2026-04-09
## 已完成
### 双库拆分Session DB 写入隔离)
- Session DB 拆分为 `inbound.db`(宿主机拥有)和 `outbound.db`(容器拥有)
- 每个文件有且仅有一个写入者——消除了跨越宿主机-容器挂载的 SQLite 写入竞争
- 宿主机使用偶数 seq 号,容器使用奇数(无冲突)
- 容器心跳通过文件 touch`/workspace/.heartbeat`)而非 DB UPDATE
- 调度 MCP 工具通过 messages_out 发出系统操作;宿主机在 `delivery.ts:handleSystemAction()` 中将其应用到 inbound.db
- 宿主机 sweep 读取 `processing_ack` 表 + 心跳文件 mtime 以检测过期
- 容器在启动时清除过期的 `processing_ack` 条目(崩溃恢复)
- 文件:`src/db/schema.ts`INBOUND_SCHEMA + OUTBOUND_SCHEMA`src/session-manager.ts``src/delivery.ts``src/host-sweep.ts``container/agent-runner/src/db/connection.ts``messages-in.ts``messages-out.ts``poll-loop.ts``mcp-tools/scheduling.ts``mcp-tools/interactive.ts`
- 容器镜像已使用 tsconfig`container/agent-runner/tsconfig.json`)重建
- E2E 已验证:宿主机 → Docker 容器 → Claude 响应 → "E2E works!" ✓
### OneCLI 集成
-`src/container-runner.ts` 中,`ensureAgent()` 调用已添加在 `applyContainerConfig()` 之前
- 如果没有 `ensureAgent`OneCLI 会拒绝未知的 agent 标识符并返回 false使容器没有凭据
- E2E 已验证 OneCLI 凭据注入 ✓
### 频道 Barrel
- `src/index.ts` 导入 `./channels/index.js`barrel
- 主干仅提供 barrel + Chat SDK 桥接;`/add-<channel>` 技能将适配器文件放入并通过 barrel 槽注册
- 主干不提供任何频道适配器
### 安装注册(部分完成)
- `setup/register.ts``data/v2.db` 中创建实体(`agent_groups``messaging_groups``messaging_group_agents`
- 接受 `--platform-id` 标志
- `getMessagingGroupAgentByPair()` 防止重复连线
- `setup/verify.ts` 检查中央库(统计有连线的 agent group 数量)
### 路由日志
- `src/router.ts` 在没有 agent 连线时以 WARN 级别记录 `MESSAGE DROPPED`,并提供可操作的指导
---
## 之前未完成——现已解决
### 1. ~~频道技能不注册 Group~~ ✅
频道技能现在在其"下一步"部分指向 `/manage-channels`。注册由 `/manage-channels` 技能处理,该技能读取每个频道的 `## Channel Info` 部分以获取平台特定指导。频道技能保持精简(仅凭据)。
### 2. ~~安装 SKILL.md 缺少 Group 注册步骤~~ ✅
在频道安装(第 5 步)和挂载白名单(第 6 步)之间添加了第 5a 步"将频道连接到 Agent Group"。此步骤调用 `/manage-channels`,它处理 agent group 创建、隔离级别决策和连线。
### 3. ~~频道技能应知道频道类型~~ ✅
每个频道技能都有一个结构化的 `## Channel Info` 部分包含type、terminology、how-to-find-id、supports-threads、typical-use、default-isolation。`/manage-channels` 技能读取这些信息以提供上下文建议。
### 4. ~~验证步骤频道认证检查~~ ✅
`setup/verify.ts` 检查所有频道 tokenDISCORD_BOT_TOKEN、TELEGRAM_BOT_TOKEN、SLACK_BOT_TOKEN+SLACK_APP_TOKEN、GITHUB_TOKEN、LINEAR_API_KEY、GCHAT_CREDENTIALS、TEAMS_APP_ID+TEAMS_APP_PASSWORD、WEBEX_BOT_TOKEN、MATRIX_ACCESS_TOKEN、RESEND_API_KEY、WHATSAPP_ACCESS_TOKEN、IMESSAGE_ENABLED以及 WhatsApp Baileys 认证目录。
### 5. Agent-Shared Session 模式 ✅
添加了 `session_mode: 'agent-shared'` 用于跨频道共享 session例如 GitHub + Slack 在同一对话中。当设置此模式时Session 解析按 agent_group_id 而非 messaging_group_id 查找。
---
## 架构参考
### 实体模型
```
agent_groups (id, name, folder, agent_provider, container_config)
↕ 多对多
messaging_groups (id, channel_type, platform_id, name, is_group, unknown_sender_policy)
通过
messaging_group_agents (messaging_group_id, agent_group_id, trigger_rules, session_mode, priority)
users (id, kind, display_name) -- 命名空间为 "<channel>:<handle>"
user_roles (user_id, role, agent_group_id) -- owner / admin全局或限定范围
agent_group_members (user_id, agent_group_id) -- 非特权访问关卡
user_dms (user_id, channel_type, messaging_group_id) -- 冷启动 DM 缓存
```
权限是用户级别的概念——没有"主"agent group 或"管理员"messaging group。`user_roles` 携带 `owner`(仅全局,首次配对设置)和 `admin`(全局或限定到一个 `agent_group_id`)。未知发送者门控是按 messaging group 的,通过 `messaging_groups.unknown_sender_policy``strict | request_approval | public`)。
### 消息流程
```
频道适配器 → routeInbound() → 解析 messaging_group → 通过 messaging_group_agents 解析 agent
→ 解析/创建 session → 写入 inbound.db → 唤醒容器 → agent-runner 轮询 inbound.db
→ agent 响应 → 写入 outbound.db → 宿主机投递轮询读取 outbound.db → 通过适配器投递
```
### 关键文件
| 文件 | 用途 |
|------|---------|
| `src/index.ts` | 入口点,导入频道 barrel |
| `src/channels/index.ts` | 频道 barrel——主干仅包含注册表/Chat SDK 桥接;技能将适配器放入 |
| `src/router.ts` | 入站路由,自动创建 messaging group |
| `src/session-manager.ts` | 为每个 session 创建 inbound.db + outbound.db |
| `src/delivery.ts` | 轮询 outbound.db投递处理系统操作 |
| `src/host-sweep.ts` | 同步 processing_ack过期检测重复执行 |
| `src/container-runner.ts` | 启动容器OneCLI ensureAgent + applyContainerConfig |
| `setup/register.ts` | 创建实体agent_group、messaging_group、连线 |
| `setup/verify.ts` | 检查中央库中已注册的 group |
| `container/agent-runner/src/db/connection.ts` | 双库连接层inbound 只读outbound 读写) |