7.1 KiB
7.1 KiB
Boss ClawBackendAdapter 最小接入设计
背景
Boss 已经完成了第一阶段执行底座抽象层:
ExecutionBackendExecutionBackendSelectorPromptAssemblerMemoryResolverPermissionPolicyRemoteRuntimeAdapterOrchestrationBackend
当前生产执行主链仍然是:
boss-master-agent.tsmaster-agent task queuelocal-agent/server.mjscodex exec resume/api/v1/master-agent/tasks/[taskId]/complete
现在的目标不是替换这条链,而是让 Boss 拥有一个可插拔的外部执行内核候选,为后续吸收 claw-code 的 runtime 演进打基础。
目标
本轮要实现的是:
- 在 Boss 中新增一个
ClawBackendAdapter - 让它成为
ExecutionBackend的一个可选实现 - 保持默认关闭,不影响当前生产主链
- 让 Boss 可以在显式启用时,把单次执行请求交给
claw-code - 让失败回退继续走 Boss 现有后端选择链
非目标
本轮明确不做:
- 不直接把
claw-code作为默认主执行链 - 不直接依赖
claw-code仓库内部目录结构 - 不让
claw-code接管群聊、审批、设备导入、多租户、账本或 UI - 不实现
claw-code的完整 session/runtime 集成 - 不实现
claw-code自动拉取或自动升级 - 不把
oh-my-codex一起接入这一轮
设计结论
采用“最小单次执行适配器”方案:
- Boss 保持产品层和业务层控制权
ClawBackendAdapter只负责单次执行- 当前只接:
master_agent_replythread_reply
attachment_analysis仅预留 contract
它的定位是:
- 一个新的
ExecutionBackend - 默认关闭
- 只在显式启用并且配置完整时参与 backend 选择
Boss 与 Claw 的边界
Boss 继续负责
Boss 继续负责:
- 会话模型
- 项目归档 / 线程下钻
- 群聊
- 审批流
- 设备导入
- 提示词 / 记忆
- 账本和聚合投影
- 主控切换
- 前台 Web / Android 交互
ClawBackendAdapter 只负责
ClawBackendAdapter 只负责:
- 接收标准化
ExecutionRequest - 使用
PromptAssembler产出的最终 prompt - 调用外部
claw-coderuntime - 返回统一的
ExecutionQueuedResult | ExecutionImmediateResult
接入模式
本轮采用 本地可注入 backend 模式,不采用“构建时自动拉仓库”。
原因:
claw-code上游还在持续快速更新- 当前远端仓库存在重定向到 disabled 仓库的情况,不能把生产构建绑在它的可访问性上
- Boss 需要的是稳定 adapter,不是把上游源码写死进仓库
因此本轮的外部依赖方式是:
- Boss 通过配置知道
claw-code可执行入口在哪里 - Boss 通过稳定协议调用它
- 是否提供可执行文件、脚本或包装器,由本地环境决定
适配器协议
输入
ClawBackendAdapter 接收:
ExecutionRequest- 由
PromptAssembler生成的执行 prompt - 模型覆盖
- 推理强度覆盖
- 目标项目/线程信息
输出
Boss 只认两种标准结果:
ExecutionImmediateResultExecutionQueuedResult
本轮默认优先实现:
completedfailed
如后续 claw-code 能稳定提供队列态或可恢复 session,再扩展为 queued/running。
建议协议形态
本轮建议适配器通过一个很薄的 CLI JSON 协议与 claw-code 对话:
- 输入:JSON 文件或标准输入
- 输出:JSON 到标准输出
最小输出结构:
{
"status": "completed",
"output": "..."
}
失败时:
{
"status": "failed",
"error": "..."
}
这样 Boss 不需要理解 claw-code 内部 Python/Rust 目录布局,只需要理解 adapter 协议。
新增抽象
1. ClawBackendAdapter
建议位置:
src/lib/execution/backends/claw-backend.ts
职责:
- 读取本地
clawbackend 配置 - 判断当前请求是否可由 claw 处理
- 调用
claw可执行入口 - 把结果映射成 Boss 的标准
ExecutionResult
2. ClawBackendConfig
建议位置:
src/lib/execution/backends/claw-config.ts
字段至少包含:
enabledcommandargscwddefaultModel?timeoutMs
说明:
enabled=false时,该 backend 不进入 selector 候选- 配置缺失时要明确返回不可用,而不是隐式失败
3. ClawInvocation
建议位置:
src/lib/execution/backends/claw-runner.ts
职责:
- 封装对外部
claw-code进程的调用 - 统一 stdin/stdout/stderr 处理
- 做超时、退出码、JSON 解析
Backend 选择规则
本轮 ExecutionBackendSelector 的扩展规则:
- 默认行为不变:
ready primary- 否则
aliyun_qwen -> openai -> master_codex_node - 最后 primary 兜底
claw仅在显式启用时参与候选claw只对这些请求种类可选:master_agent_replythread_reply
dispatch_execution当前仍优先沿用 Boss 既有链approval_required等审批逻辑不下沉给claw
本轮推荐规则:
- 不改变当前默认优先级
claw通过会话级或账户级显式开关进入可选范围- 只有当用户或管理员明确选择
claw作为当前对话 backend 时才启用
配置来源
本轮不做复杂后台页面,先允许通过运行时配置启用:
- 本地环境变量
- 服务器环境变量
- 后续再补 Web 后台
建议字段:
BOSS_CLAW_ENABLEDBOSS_CLAW_COMMANDBOSS_CLAW_ARGSBOSS_CLAW_WORKDIRBOSS_CLAW_TIMEOUT_MS
说明:
- 如果只配置
enabled=true,但没有command,adapter 必须明确报错不可用 - 不允许“半启用”状态默默进入生产回退链
回退策略
ClawBackendAdapter 的失败不能把主链拖死。
必须遵守:
- 若
claw不可用:- selector 视其为不可选
- 若
claw调用失败:- 记录失败
- 返回标准错误
- 允许 Boss 按现有链路继续回退
- 不允许把
claw的内部 stderr 直接原样暴露成产品态文案 - 需要生成人类可读错误摘要
测试要求
本轮至少补以下测试:
ClawBackendAdapter在未启用配置时不可选- 配置完整时,
canHandle(master_agent_reply)返回 true - 配置完整时,
canHandle(dispatch_execution)仍返回 false - 适配器能把外部 JSON 成功结果映射成
completed - 适配器能把非零退出码或非法 JSON 映射成
failed - selector 在
claw未启用时行为不变 - selector 在
claw启用且显式选中时,会优先选claw
文档更新要求
实现完成后,需要同步更新:
README.mddocs/architecture/current_runtime_and_deploy_status_cn.mddocs/architecture/api_and_service_inventory_cn.md
必须明确写:
claw-code已接入为可选执行 backend- 当前默认主链仍不是
claw - 当前接入范围只覆盖单次执行,不覆盖群聊编排和审批
结论
本轮最重要的不是“让 Boss 立即切到 claw”,而是:
- 先把
claw-code放到 Boss 的稳定 adapter 边界内 - 让它成为一个真正可插拔、可升级、可回退的执行 backend
这样后续 claw-code 继续迭代时,Boss 主要升级的是 adapter,而不是重写产品主链。