16 KiB
16 KiB
项目文件治理计划
当前会话任务:AgentBus 渠道独立根路径与 404 修复
- 状态: 已完成;重复兼容记录清理和 listener 状态竞态修复均已加载运行。
- 问题事实: 当前
control-plane/src/server.ts和.build/control-plane/src/server.js已包含/api/channels;此前的 404 是旧进程未加载路由。默认渠道改名后旧进程曾补建重复兼容渠道;随后 listener 重载又暴露出“内部重载被写成已停用”的异步状态竞态。 - 本轮边界: 新增独立
/channels管理页和页面路由;数据接口继续使用/api/channels,渠道数据仍按当前管理员所属组织隔离;重复兼容记录只停用/隐藏,不物理删除。
实施清单
- 将 AgentBus 渠道面板从 AI 工作台移到独立
/channels根路径。 - 增加
/channels静态页面路由、导航激活态和缓存版本号。 - 保留
/api/channelsCRUD/轮换接口并补充页面/路由契约测试。 - 完成全量验证并记录旧进程需要重启后才能加载新路由。
- 经用户授权重启控制面,验证
/api/channels返回鉴权响应、/channels返回 200、AgentBus session ready。 - 在独立渠道目录中增加“维护名称”,默认兼容渠道也可改名。
- 防止默认兼容渠道改名后重启生成重复渠道,并在启动时停用已产生的重复兼容记录。
- 修复渠道重载时把内部
stop异步写成“已停用”的竞态;重载只写连接中/已连接,真正停用仍由管理员操作或服务关闭触发。 - 修复启动阶段同一渠道状态写入乱序;按渠道串行化
connecting→connected状态落库。 - 经用户授权重启控制面,验证王徐明、阿虹两个 listener 均
enabled=true、connected=true、session_ready=true。
当前会话任务:多 AgentBus 用户渠道与插件串行队列
- 状态: 已完成;用户已确认方案并授权开始实施。
- 目标: 支持多个 AgentBus 来源/外部用户渠道,每个渠道独立保存 AgentBus key;插件/ERP 浏览器自动化同一组织同一时间只执行一个任务。
- 安全边界: 不读取或输出真实密钥;不执行 ERP 写入、生产部署或外部业务发送;本轮服务重启已获用户明确授权并完成。
已确认决策
- 队列范围: 同一组织的 ERP 浏览器自动化全局单槽;其他任务在服务端持久化 FIFO,按
created_at,id排队。 - 渠道边界: 每个外部用户渠道拥有独立 AgentBus listener/WebSocket 连接和独立 key;渠道身份不创建后台登录账号,由管理员管理。
- 可靠性: 入站路由、受理通知和最终回执使用持久化 outbox;断线、进程重启或排队期间可重试,不因内存超时误报。
- 配置: WebSocket URL、client type、重连参数使用全局环境配置;渠道独立加密保存 key,可覆盖 bot address;旧的全局 token/bot 配置保留兼容。
- 生命周期: 渠道支持启用/禁用和 key 轮换,不做物理删除;禁用不清理已有任务和待发送回执。
- 范围排除: 不实现具体微信协议,不改变 Agent/Skill operation Schema,不做渠道级自动化策略。
实施阶段
- 读取项目记忆、业务登记表、相关 Skill/Schema/mapping/实现,并确认工作区脏改动需保留。
- 新增 migration 012:
user_channels、tasks.channel_id、agentbus_deliveries。 - 新增渠道服务和
AgentBusManager:加密 key、CRUD/轮换、每渠道 listener、运行状态。 - 接入 durable AgentBus:按渠道幂等、受理 outbox、终态回执 outbox、断线释放租约、重连补发。
- 接入控制面 API 与操作台渠道管理;key 不回显。
- 接入组织级 FIFO ERP claim、排队信息和平台自动派发单任务防护。
- 同步配置示例、控制面文档、测试夹具及契约断言。
- 完成计划压缩后的仓库卫生、全量测试、构建和差异检查。
关键实现位置
control-plane/migrations/012_agentbus_user_channels.sqlcontrol-plane/src/agentbus-channels.tscontrol-plane/src/agentbus.tscontrol-plane/src/task-service.tscontrol-plane/src/server.tsLianSyn-platform/app.js、index.html、styles.csscontrol-plane/README.md、.env.example、.env.production.example
验证记录
- 已通过:控制面测试 53/53,含 listener 启动/重载状态回归和 durable channel listener 重投回归;
build、git diff --check通过。 check:repo/test:legacy当前仅被既有根目录.DS_Store和dist/老挝联泰AI指令表-0.5.118.docx哈希不一致阻断;这些用户既有文件未修改。check已完成且无失败输出。- 根目录活动计划压缩前完整快照:
archive/project-history/2026-08-17/task_plan-pre-compression-agentbus-channels.md。
当前风险与收口条件
- 无可用生产 PostgreSQL/AgentBus 真实连接时,仅验证迁移文本、静态契约、单元测试和构建;不以本地模拟代替真实部署授权。
- 若全量验证发现与本轮无关的既有脏改动问题,只记录并保留,不回退用户改动。
- 所有源码验证和运行态检查已完成;清理采用停用/隐藏,不物理删除;未执行 ERP 写入、部署或外部发送。
当前会话任务:插件单任务/历史任务超时自愈
- 状态: 已完成;源码、发布包、运行态重启、历史任务收口和回归验证均已完成。
- 目标: 插件实际领取任务后 10 分钟无最终结果自动失败;历史任务超过 30 分钟无处理进展退出活动队列,避免单条卡死任务永久阻塞组织级 ERP 槽位。
- 安全边界: 不自动重试可能已跨过 ERP 写入边界的任务;历史任务只做失败标记和队列释放,保留回查证据;本轮未主动发起 ERP 写入。
实施清单
- 明确并实现单任务 10 分钟结果超时与租约释放。
- 明确并实现历史任务 30 分钟维护超时与活动执行槽解耦。
- 为
no_erp_write与可能已写入 ERP 两类结果保留不同安全路径。 - 增加控制面、插件和队列回归测试,覆盖幂等、断线和重复清理。
- 完成插件构建/版本同步及可恢复运行态清理;运行态检查未发现可清除任务,未删除不确定写入历史。
- 修复历史维护查询的
42P10错误,并立即收口 15 条超过 30 分钟的reconciliation_pending任务。 - 运行项目规定的完整检查、测试和构建。
交付与运行态备注
- 控制面已按用户授权优雅重启,当前进程 PID
93460;两个 AgentBus 会话均已session_ready,重启后未再出现error_42p10或回调上下文错误。 - 历史 15 条任务已自动失败并释放执行队列;当前数据库中超过 30 分钟仍处于
reconciliation_pending的任务为 0 条,未删除任何回查证据。 - 当前 Chrome 运行时清理入口已执行并返回 0 个运行中超时、0 个孤儿任务、0 个被清除的当前指针;此前浏览器心跳报告扩展版本
0.5.132且状态connected,当前发布插件已递增到0.5.133。 - 用户本次测试任务已由持久化结果记录为
completed,AgentBus accepted/result 均为delivered;该任务自身结果记录write_attempted=true,不将其误报为“未写 ERP”。 - 当前发布插件为 0.5.133,发布清单和版本化 ZIP 已同步;不确定是否已跨 ERP 写入边界的历史任务只退出活动槽,不自动重试或删除证据。
已确认决策
- 单任务 10 分钟计时从插件实际领取并开始执行起算,不从 AgentBus“已受理”或服务端排队起算。
- 历史维护超时为 30 分钟;超时任务不自动重跑。
- 明确未写 ERP 的任务可失败并释放执行槽;可能已写入 ERP 的任务保留回查保护,但不能永久占用新任务活动槽。
错误记录
- 首次追加本阶段计划时使用了不存在的旧上下文行,补丁未应用;随后改为以文件末尾现有内容为锚点,未产生部分修改。
- 本轮首次追加团队文件回传计划时沿用了已压缩文件中的错误锚点,补丁未应用;随后改用实际文件末尾锚点,未产生部分修改。
当前会话任务:团队文件源文件回传 AgentBus 来源渠道
- 状态: 实现已完成;功能验证通过,仓库卫生仍保留用户既有阻断。
- 目标:
confirmation_export任务成功取得 ERP 源文件后,将原始文件作为最终返回消息的一部分,沿任务记录的 AgentBus 来源渠道回传;现有平台附件保存与后台鉴权下载能力继续保留。 - 已确认事实: 当前链路能读取并保存源文件,但 AgentBus 入站只使用
payload.text,已有记录显示带附件的入站探测被受理而最终回执没有附件。 - 已确认决策: AgentBus 最终回执直接携带原始文件附件,同时保留现有下载地址作为兜底;需要限制消息大小、避免日志泄露,并兼容 OSS/数据库两种存储。
实施阶段
- 按治理规则读取项目入口、规划记忆、业务登记表及
confirmation_export相关契约。 - 核对 AgentBus 当前出站帧、附件模型、来源渠道路由和回归测试边界。
- 定位附件“已落库但下载消失”的交付断点:后台地址需要登录且为相对路径;durable result 未投影顶层附件;当前结果文件名存在 UTF-8/Latin-1 乱码。
- 实现源文件回传,并同步契约/测试/配置(direct/durable 附件、大小上限、OSS 取件、文件名修复已落源码)。
- 执行项目规定的检查、测试和构建;
check、控制面 53/53、build、git diff --check通过,check:repo/legacy 仅受既有.DS_Store与 DOCX 哈希漂移阻断;不执行真实 ERP 写入、部署或外部发送。
本轮错误记录
- 首次合并附件修复补丁因当前工作区已有
getContent/OSS 回传骨架,锚点与实际源码不一致,补丁未应用;随后按实际函数边界拆分为小补丁,未产生部分修改。 - 类型检查首次复跑发现
attachmentMetadataFrame的新增可选参数与Array.map的索引参数不兼容;改为显式箭头回调,未产生运行时失败。 - 全量门槛首次复跑发现根
.DS_Store、既有发布 DOCX 哈希漂移和findings.md超限;已将完整 findings 冻结到archive/project-history/2026-08-17/findings-pre-compression-attachment.md并压缩活动 findings,.DS_Store与 DOCX 保留为用户既有阻断,未修改。 - 一次跨文件补丁误以为
getContent位于task-service.ts,未应用且未产生部分修改;随后按实际artifact-store.ts边界拆分补丁并通过check。
当前会话追加:截图复核与运行态收口
- 状态: 控制面已按用户授权重启并恢复;历史文件名兼容修复和回归已完成,未发送外部消息。
- 证据: 截图显示
confirmation_export仍只有文字回执且文件名乱码;当前控制面 PID 2545 于 21:44 启动,附件回传源码于 22:19 修改、.build于 22:23 生成,运行进程未加载本次修复。 - 兼容性事实: 已新增共享读取时文件名纠正;新旧 artifact 在成功回执、AgentBus 附件和任务元数据路径统一修复,数据库原始记录与文件字节不变。
追加阶段
- 将截图内容视为问题证据,未把图片中的聊天文本当成操作指令。
- 只读核对源码、构建时间、控制面进程和附件读取路径。
- 用户授权后重启控制面并验证
/health/ready、/api/status均显示 AgentBusconnected=true、session_ready=true。 - 增加读取时的旧文件名修复并完成回归验证;控制面测试 54/54 通过。
追加验证
check、build、git diff --check通过;check:repo/test:legacy仍仅受既有.DS_Store与 DOCX 发布哈希漂移阻断。- 控制面第二次重启后的 PID 为
24031,未执行 ERP 写入、部署或外部发送。
当前会话追加:平台下载入口与渠道附件缺失复核
- 状态: 控制面与平台修复已完成;外部渠道是否渲染附件仍待上游协议确认。截图显示成功文字中有文件名,但 AgentBus 渠道未出现文件对象,平台“后台附件”区域也没有下载按钮。
- 已定位的前端缺口:
LianSyn-platform/app.js的renderTaskArtifacts()只从task.result.report.artifacts[*].download_url生成按钮,没有使用成功回执中的success_receipt.receipt.reply_attachments和important_message.attachments作为详情页兜底。 - 完成项: 已核对任务详情 API 实际返回的
result、success_receipt和附件 URL,修复平台显示链路,并用本地契约测试验证 AgentBus 直接/持久化载荷仍携带源文件内容。
当前复核结果
- 已在登录态平台页面核对真实任务
TASK-20260817144147-1MYf84I:后台附件区域已显示LLW-261202A-A 客户确认书.doc和“下载文件”按钮,链接含该任务的 artifact ID。 - 该任务 API 详情同时返回完整
result.report.artifacts、success_receipt.receipt.reply_attachments和important_message.attachments;平台兜底修复已在页面生效。 - 控制面本地 direct/durable 契约测试曾确认旧实现会投影
payload.attachments[*].content_base64;更新后的微信适配器文档已提供权威 URL-only 附件协议,当前实现已切换为 HTTPSurl元数据。 - AgentBus 渠道实际渲染仍缺少上游可观测回执;当前不发送新的外部探测消息,保留“控制面已生成附件载荷、渠道适配器是否支持/渲染待上游确认”的边界。
当前会话追加:按微信渠道适配器协议切换 URL-only 附件
- 状态: 已完成;代码、运行配置和控制面重启均已完成,未发送真实外部文件测试。
- 协议事实:
task.progress/task.result使用payload.attachments元数据,附件必须提供 HTTPSurl;适配器按白名单下载并顺序发送,AgentBus 不应携带 base64。 - 将 direct/durable 出站附件从
download_url/content_base64改为id、name、content_type、size、inline: false、HTTPSurl和可选sha256。 - 拒绝 HTTP、数据库后台鉴权 URL 和无可访问 URL 的外部附件,保留平台后台下载能力。
- 同步 AgentBus 契约、控制面 README、环境示例和回归测试。
- 运行源码检查、控制面 54/54、构建和
git diff --check;check:repo/test:legacy仍仅受既有.DS_Store与 DOCX 哈希漂移阻断。 - 在实际运行环境启用 OSS 配置并重启控制面;健康检查通过,重新生成团队文件任务和真实外部文件测试仍待用户安排。
当前会话追加:文件获取统一转 PDF
- 状态: 已完成;用户确认仅
confirmation_export转 PDF,转换失败回退源文件。 - 已定位范围: 当前登记的文件获取 action 为
confirmation_export;现有链路保存 ERP 原始文件,converted=false,未接入转换器。 - 已确认决策: 转换失败时保留并回传源文件;不改变其他任务附件。
- 核对 PDF 转换运行时、部署依赖、源格式和附件回传字段。
- 实现平台 PDF 转换、超时/无效输出回退源文件、测试并同步容器配置。
- 重建确认导出 Skill/DOCX/扩展发布物,完成仓库卫生、全量测试、构建和渲染检查。
- 按用户授权重启面板并验证运行态转换器与 AgentBus 健康状态。
- 运行态: 面板已重启;
/health/ready返回数据库、Schema 和 3 个 AgentBus 渠道均正常且session_ready=true。
当前会话追加:AgentBus 渠道状态同步修复
- 状态: 已完成;用户确认修复并重启。
- 防止旧进程停机回写覆盖新进程的 AgentBus 渠道状态。
/api/channels合并实时 listener 状态,避免面板显示陈旧的“已停用”。- 增加会话 epoch 防护和回归测试;控制面 59/59、类型检查、构建通过。
- 运行态: 当前 3 个启用渠道均为
enabled=true、connected=true、session_ready=true;重复兼容渠道保持管理员停用状态。