Skip to content

Latest commit

 

History

History
478 lines (410 loc) · 45.1 KB

File metadata and controls

478 lines (410 loc) · 45.1 KB

MEMORY.md — 项目记忆

经验教训

  • [2026-05-16] 文档与代码严重脱节 — ARCHITECTURE-OVERVIEW 描述的"全球 AI 智能体网络"与实际代码差距巨大。已重写为诚实版本,标注每个模块的真实成熟度。教训:文档必须根植于可运行的代码,不能超前描述不存在的能力。
  • [2026-05-16] NeuralMesh 从未被实例化 — 类定义了但零引用,是死代码。neural_share 消息在 swarm.js 中未路由(已修)。教训:写完模块必须写集成代码,否则等于没写。
  • [2026-05-16] 旧 HTTP 服务器 (端口 3800) 零鉴权运行数月/shutdown/api/chat/api/config 等敏感端点无任何保护。已加 Bearer Token 鉴权。教训:两条 API 路径必须统一安全管理。
  • [2026-05-16] P2P 权重接收无数据验证 — 可投毒 NaN/Infinity/超大数组。已加 validateWeights() 和 sanitizePeerId()。教训:所有来自网络的输入必须验证,无一例外。
  • [2026-05-16] 测试 ESM/CJS 混用导致 import 失败 — package.json 声明 "type": "module" 但某些测试文件使用 CJS 风格 import。统一 ESM,不要混用。
  • [2026-05-16] bridge 根目录散落 12 个 .cjs 一次性修复脚本 — 已移到 bridge/scripts/migrations/,以后此类脚本直接放 scripts/。
  • [2026-05-16] app/ 是废弃旧版 Flutter 项目,已删除。唯一前端是 openchat-flutter/

🟢 阶段一(音频 Codec,已完成)[2026-05-29]

达成

  • MDCT 频域编解码器:48kHz, N=1024, 16 组 × 64bin, 50% 重叠 TDAC, 完美重构
  • 分类器:3 模式(窄带/宽带/全频),基于 MDCT 峰值比自动切换,2bit metadata
  • 定比分组:低频频带高 bpc(8),高频低 bpc(1-2),按频段能量分布配置
  • EPC 打包BB 01 CC [PL] [Tags] [CS] 7E,每 tag 13B(1 头 + 12 载荷)
  • 性能:jzlg 5s 48kHz → 51.6KB EPC, 22.6dB SNR, 85kbps

关键决策

  • 重叠 50% 是 MDCT 保持无损的必要条件,不叠有混叠噪音
  • FFT 基 MDCT 优化未完成(DCT-IV 公式验证失败),回退 O(N²) 预计算表
  • 阶段一只做波形,扒谱归入阶段二
  • 谱包络(LPC 替代) + HPS 音高从同一组 MDCT 系数推导,不另开 FFT

🟡 阶段二(扒谱精度验证)[2026-05-29 → 2026-05-30 完成]

核心问题:从 MDCT codec 的同一帧数据最多能扒出多少音乐信息?

11 轮实验结论

测试 结果 判决
R1 算法排名(7类×5音) HPS 31.4% 最差,YIN 85.7% 最佳,Fusion 74.3% HPS 已从生产代码移除
R2 和弦检测(双音/三音) Fusion 90%/63%,PeakTrack 80%/73% Fusion 和弦最优
R3 噪声耐受 全部通过 +10dB,YIN 0% 虚警
R4 帧耗时 Fusion 8.1ms = 19% 帧预算 每帧可跑
R5 MDCT vs FFT 谱 谱相关系数 93.5%,Hybrid-Fusion 63.9% > FFT-Fusion 41.7% MDCT 可替代 FFT
R6 重建质量梯 连续相位 73% vs 随机 1%,5 次谐波够用 相位连续性 = 关键
R7 真实 vs 合成 Fusion 保持 100%,PeakTrack 降 40% Fusion 对真实乐器鲁棒
R8 起音延迟 100% 检出,0-5.3ms
R9 连续帧抖动 100% 帧检出,边界 ~3.5st 抖动 稳态抖动 < 10ms
R10 参数敏感度 YIN 阈值 0.15 最优,FFT 2048 足够 算法对参数鲁棒
R11 编解码端到端 退化 0.0%,前后一致 Codec 对扒谱完全透明

关键技术变更

  • HPS 全面失败(31.4%)→ Fusion(YIN + PeakTrack):已替换 Dart 生产代码
  • MDCT 振幅谱 + PCM YIN = 零额外 FFT:Hybrid Fusion 直接从 MDCT pipeline 提取 Pitch
  • Bridge JS 同步:自相关 F0 → YIN 算法

剩余问题

  • MDCT 振幅谱与 FFT 峰值位置偏移(55.6% 匹配),但不影响 Hybrid Fusion 整体精度
  • C8(4186Hz)超出 YIN 搜索范围,需增加高音扩展
  • 编解码引入量化噪声后的扒谱退化尚未测试

关键指标(实时)

  • 测试: 138/138 全绿(1 flaky evolution-integration,单跑通过)
  • Lint: eslint 9.39.4 + eslint.config.js 配置完成,59项预存错误待修
  • Demo: npm run demo 一键 sandbox 体验脚本完成
  • P2P教程: docs/p2p-voice-tutorial.md 完成
  • HTTP 路径: 已统一到 Express 服务器(端口 3800),废弃 raw HTTP server
  • 基础端口: 固定为 3800,所有衍生端口以 3800 为基准推导
  • OpenAPI: /api-docs 端点可通过 Swagger UI 浏览

最近会话摘要

  • [2026-06-03] Bridge agent 端到端打通:手机录音 → 微信 → Qiniu → bridge → agent → 文字气泡,中午实测成功。provider-kit 收口为单 import gate(provider-service.js),agent 改为 2-pass 系统(call-tools + final-answer),加 response cache + 上下文截断,prompt 改 20-token CoT。修复 config.json 缺逗号导致的静默 parse 失败。

  • [2026-06-24] EPC 旁路检测门 + 流式修复 (18项修复,未推送):

    • BYPASS 门架构chat-poller.mjs 新增 validateEpcFrame()/validateEpcBuffer() 结构校验器。流式每 chunk encodeEpcFrame → validateEpcFrame → 失败则 raw text 入 meta.bypassText(零 EPC 处理)。非流式 validateEpcBuffer(r.epc) → 失败则 raw content 入 meta.bypassText。Flutter _pollReplies 读 meta.bypass 标志,直接显示 bypassText 不走 content 解析。删了伪 hash 自比旁路(sha8(r.epc)===sha8(epcBuf) 永远 true → else 死代码)。
    • 流式真正工作:3 个互相掩盖的 CRITICAL bug — parseLlmReply 覆盖不拼接(只显最后一段)、_seenReplyKeys 拦 stream.bin 导致不重读、found=true 对 stream.bin 也设导致首条流式即停轮询。全部修通后流式才真正渐进更新。
    • 上传失败不死锁_sendText putBinary 失败 → _isWaiting=false + log。Qiniu 未初始化同理。
    • dispose 全生命周期_startReplyPoll/_sendText.then()/_endVmRecordmounted 守卫,_init() 失败时 _pollTimer?.cancel()_qiniu = null
    • 桥端 200ms throttle 移除:每 chunk 即时写 S3。Flutter 轮询简化到固定 1s(取消 adaptive backoff)。
    • 教训parseLlmReply= 覆盖是大模型常犯的"逐帧处理不考虑流式"错误。_seenReplyKeys 加 stream.bin 是"用同一个 set 管理两种不同语义的 key"。
    • 未推送:GitHub push 被墙。本地 main 已有全部 commit。
  • [2026-06-11] lingbao 子项目落地 + M3 档 3 baseline (本地 14 commit, 未推送):

    • lingbao — 工地临时漏电 AI 协同防护,9/15 子任务完成 (60%),5 新原语 (40-45):waveform-sim/signal-algo/mqtt-push/doc-gen/calendar-parse, 4 task demo (10/13/14/15) 端到端跑通 (push 33ms, 5620B 报告, 1741B 方案书)。L1 硬件+L3 UI 依赖外部环境标 skeleton。
    • cap/60.mjs — M3 能力档位诊断骨架,5 档任务 baseline 5/5 通过(simulateIdealLLM)。U 假说雏形:retry-state 状态机下沉到 tool 层,LLM 只调 recordAttempt()。下一步跑真实 M3 填 failure-taxonomy.json。
    • verify-commit 升级:支持 .mjs 白名单 + invariants 检查 + 排除 lingbao/tasks/ demo 目录。
    • 教训:cap 实验的"baseline 5/5"是硬编码理想 LLM, 不是真实 M3。S 路线结论必须等真实 M3 跑完才能下, 当前数据不足以做 S/T/U 决策。
  • [2026-05-25] 音频链路 E1 完成:队列播放 + 淡入淡出 + Opus 集成 + SDUI 三模式可切(raw/opus/neural)。RNNoise/AGC/VAD 管线已接入并通过 CI。AGENTS.md 新增 SDUI 优先原则(UI 变动先问 SDUI 能不能做,不 rebuild)。AGENTS.md 新增 Flutter API 签对签规则(推送前去 pub.dev 逐行核对 API)。修复 OpenRouter API key 泄露(git filter-repo 误删仓库后从 CI 引用恢复)。清理 33 个 apk-* tag 和所有旧 Actions runs。

  • [2026-05-16] 项目定位大讨论:通过多角色审视(VC、安全研究员、贡献者、核心工程师、Petals 开发者、考古学家、学生用户、记者、Flutter App 视角)确认项目真实竞争力在 P2P 语音通讯,而非分布式大模型。AI 居民社区方向保留但标注为实验。

  • [2026-05-16] 安全加固:修复 neural-mesh.js 权重验证+路径穿越、swarm.js neural_share 路由、main.js 旧 HTTP 鉴权。

  • [2026-05-16] 文档大修:重写 ARCHITECTURE-OVERVIEW.md、docs/README.md、GLOSSARY.md,与代码真实状态对齐。

  • [2026-05-16] 项目审核:发现并修复 AGENTS.md 空文件、MEMORY.md 空文件、测试 ESM 问题、清理废弃 app/ 目录。

主题文件路由表

涉及以下领域时读取对应文件

触发词 文件 说明
Bridge/后端/main.js memory/core-logic.md Bridge 核心启动流程、配置加载、模块初始化
P2P/DHT/节点发现 memory/p2p.md hyperswarm P2P 网络、节点发现、消息路由
Agent/代理/多AI memory/agents.md 5 种代理角色、反馈聚合、决策系统
热更新/Watchdog memory/hot-update.md SafeEvolution、热更新流程、回滚机制
API/REST/端点 memory/api.md 31 个 API 端点、认证、限流
Flutter/客户端/UI memory/flutter.md openchat-flutter 架构、API Client 层
语音/音频/WebRTC memory/audio.md RNNoise、神经编解码、语音网关
调试经验 memory/debugging.md 常见 bug、调试技巧
lingbao/工地漏电/cap 档位 memory/lingbao.md 灵保 5 原语 + 4 demo, M3 能力档位诊断

开放线程

  • [2026-05-18] 泛化引擎已实现 — generalization.js (300行) + 集成到 resident-manager think() 流程。当用户提问时:vector memory 搜相关经验 → generalization 分析模式 → LLM 生成多解法 → 回存知识库 → gossip 同步全网。实现了"一次查询,所有居民复用"的闭环。

  • [2026-05-18] AI 居民内部循环 — 已完整链路:状态机 + 能量系统 + vector memory + generalization + gossip。think() 不再是裸 LLM 调用。

  • [2026-05-16] Dashboard 实时推送 — 后端状态变化需要通过 WebSocket 推送到前端,而非前端轮询。

  • [2026-05-18] bridge/src/main.js 已从 ~1900 行拆至 26 行(死代码清理后),但 MEMORY.md 和 MAINJS_REFACTOR_PLAN.md 保留旧数据导致专家评审反复吃假粮。教训:文档中的数字指标必须在代码变更后立即同步更新,否则自动摘要工具会重复传播过期信息。

  • [2026-05-18] protocol/README.md 存在(265 行协议文档),之前误记为空目录。已保留。

  • [2026-05-18] 四轮专家评审共执行 24 项 P0,Bridge 根目录清理 12 个 Python 遗留文件,AI 居民状态机+多路径推理替换预制回答。教训:专家评审每轮都套用相同提问模式——架构/测试/安全/AI——不会问完全重复的问题。当评审开始聚焦"居民不够聪明"和"知识不共享"时,说明基础设施债已还完,轮到产品力了。

  • [2026-05-20] 第五轮专家评审 — HTTP 路径统一 + 首次全绿:测试从 98/98 推进到 120/120(第五轮 98→第六轮 120,最终全绿)。完成 5 项 P0 执行:Express 监听端口 3800,废弃 raw HTTP server,所有衍生端口以 3800 为基准。教训:大量遗留代码(startServer 中的 ~250 行路由/WebSocket 逻辑)在首次 edit 时未完全匹配删除,因文件行号已因前序 edit 偏移。大段替换时必须用唯一匹配锚点(如 } + 下一方法签名)。

  • [2026-05-20] 第七轮专家评审 — console.log→pino 结构化日志:114→115 测试(全绿)。完成 7 轮共 29 项 P0。134 个文件批量替换 console.log → logger.info/warn/error,pino 集成带敏感数据脱敏。教训:PowerShell Set-Content -NoNewline 会以错误编码写入文件,导致 UTF-8 多字节字符损坏。文件修改必须统一用 Node.js fs.writeFileSync(file, content, 'utf-8')pino.transport() 创建 worker 线程会阻止 Node.js test runner 退出,必须用同步 pino API。

  • [2026-05-20] 第八轮专家评审 — 安全加固+CoT+测试+目录精简:128/128 全绿。完成 7 项 P0 执行:mathjs 替代 Function()、SSRF 防护、CoT 超时/token门禁、14 个 tool-registry 测试、src 目录 22→11、README 差异化描述、CI npm pack+docker build。教训:大量目录合并涉及跨文件 import 路径更新,必须先 grep 所有引用再移动。git stash 可用于对比 pre-existing test failures 与引入的失败。

  • [2026-05-20] 第九轮专家评审 — catch{}系统性清理+死代码删除+子系统测试:138/138 全绿(新增10个子系统测试)。完成5项P0执行:105处catch{}加日志(36文件)、19个.log垃圾文件清理、bridge.js死代码删除、ConvergenceEngine+FairyGuardian测试(10个)、evolution-integration确认仍flaky。教训:R4修catch{}只限于topic-registry,这次grep出全项目105处。单文件"已修"不代表全项目已修,每次评审必须做全量扫描。

  • [2026-05-20] 第十轮专家评审 — core/ 129文件拆10子目录:129文件从core/扁平→10语义子目录(agent/ evolution/ security/ convergence/ p2r/ monitoring/ memory/ audio/ collaboration/ quality/)。137/138测试全绿(仅剩evolution-integration flaky)。教训:跨目录文件移动必须用自动化脚本处理import路径。PowerShell glob/正则局限性大,Node.js脚本更可靠。../xxx/yyy.js中xxx可能同时是src/xxx和core/xxx,必须按core/xxx优先解析。动态import(await import())容易被批量替换漏掉,必须全量grep确认。17个test.mjs文件漏了动态import。

| R14 | Flutter编译状态验证 | Flutter开发者 | P0-5 | ❌ 待修(部分完成) | Flutter开发者 | | R14 | evolution-integration flaky续存 | 测试工程师 | P1-6 | ✅ 已修(R16) | 测试工程师 | | R15 | CLI体验改造 — sandbox交互(颜色/持久化) | 技术经理 | P0-1 | ✅ 已修(R15) | 用户支持+架构师+竞品分析师 | | R15 | Flutter编译验证+CI(端口3000→3800) | 技术经理 | P0-2 | ✅ 已修(R15) | Flutter开发者+安全研究员 | | R15 | lint error 59→48 (comment-eats-code/duplicate/mac) | 技术经理 | P0-3 | ✅ 已修(R15) | 核心工程师+SRE | | R15 | evolution-integration flaky根因分析 | 技术经理 | P0-4 | ✅ 已修(R16) | 测试工程师 | | R15 | 单分支开发整改(清理bridge_setup.py+BRANCH_STRATEGY.md) | 技术经理 | P0-5 | ✅ 已修(R15) | Git专家 | | R15 | Agent loop闭环验证 | 技术经理 | P1-6 | ❌ 待修 | AI研究员+测试工程师 | | R15 | 模块级README | 技术经理 | P1-9 | ❌ 待修 | 架构师+开源社区经理+技术写作者 | | R16 | resident-scheduler syntax error修复(demo崩溃) | 技术经理 | P0-1 | ✅ 已修(R16) | 全体13位专家 | | R16 | 全量编码损坏文件扫描+修复(house-orchestrator) | 技术经理 | P0-2 | ✅ 已修(R16) | 安全研究员 | | R16 | 添加 smoke test(所有src/文件node --check) | 技术经理 | P0-3 | ✅ 已修(R16) | 测试工程师+架构师 | | R16 | evolution-integration重写为node:test(根除flaky) | 技术经理 | P0-4 | ✅ 已修(R16) | 测试工程师 | | R16 | 618 lint warnings清零(eslint --fix) | 技术经理 | P0-5 | ✅ 已修(R16) | 核心工程师+SRE |

版本历史

轮次 意见摘要 提出专家 对应任务 状态 验收人
R1 死代码太多(analysis-*.cjs, .js.js) Git专家 P0-1 清理4770文件 ✅ 已修(R1) Git专家
R1 测试20%失败率不可接受 测试工程师 P0-2 修复17个失败 ✅ 已修(R2) 测试工程师
R1 旧HTTP无鉴权 安全研究员 P0-3 API鉴权统一 ✅ 已修(R2) 安全研究员
R1 P2P零测试 测试工程师 P0-4 8个P2P测试 ✅ 已修(R2) 测试工程师
R1 agent-engine session store缺失 核心工程师 P0-1 注入deps ✅ 已修(R2) 核心工程师
R2 两条HTTP路径共存 架构师 P0-1 废弃raw HTTP ✅ 已修(R3) 架构师
R2 agent-session混用jest/ESM 测试工程师 P0-2 删除jest测试 ✅ 已修(R3) 测试工程师
R2 Flutter API对齐未验证 Flutter开发者 P0-3 baseUrl确认 ✅ 已修(R3) Flutter开发者
R3 //注释吃掉后续代码(3处) 核心工程师 修复topic-registry/route-handlers ✅ 已修(R4) 核心工程师
R4 WS clients未追踪 Code Review server.js加this.clients ✅ 已修(R4) Code Review
R4 _queryTopicPeers递归爆栈 Code Review 改为_getLocalPeers ✅ 已修(R4) Code Review
R4 catch{}吞异常 安全研究员 topic-registry加日志 ✅ 已修(R4) 安全研究员
R4 isMain端口检测被移除 Code Review 恢复port===DEFAULT_PORT ✅ 已修(R4) Code Review
R5 forge.js零测试覆盖 核心工程师 16个测试 ✅ 已修(R5) 核心工程师
R5 generalization单测试不可信 AI研究员 基准重算+扩展 ✅ 已修(R6) AI研究员
R5 evolution-integration flaky 测试工程师 重写为node:test ✅ 已修(R6) 测试工程师
R6 产品无一句话定位 VC/投资人 README重写 ✅ 已修(R7) VC/投资人
R6 无新人onboarding 开源社区经理 first-steps.md ✅ 已修(R7) 开源社区经理
R6 无CI SRE/运维 .github/workflows/ci.yml ✅ 已修(R7) SRE/运维
R6 eval-report残留 Git专家 清理+.gitignore ✅ 已修(R7) Git专家
R7 console.log→pino结构化日志 SRE/运维 P0-1 替换134文件 ✅ 已修(R7) 测试工程师
R7 AI居民CoT+tool-use AI研究员 P0-4 tool-registry + CoT loop ✅ 已修(R7) 核心工程师
R8 calculate Function()构造器RCE 安全研究员/核心工程师 P0-1 mathjs替代 ✅ 已修(R8) 安全研究员
R8 web_fetch SSRF无防护 安全研究员/核心工程师 P0-2 URL验证+内网阻断 ✅ 已修(R8) 安全研究员
R8 CoT无inter-iteration超时 核心工程师/AI研究员 P0-3 per-iteration timeout+token门禁 ✅ 已修(R8) 核心工程师
R8 tool-registry+CoT零测试 测试工程师 P0-4 14个测试(128→128) ✅ 已修(R8) 测试工程师
R8 src目录22个膨胀 架构师 P0-5 22→11目录合并 ✅ 已修(R8) 架构师
R8 README未突出P2P语音差异 竞品分析师/VC P0-6 差异化描述+Features表格 ✅ 已修(R8) 竞品分析师
R8 CI无构建产出验证 SRE/运维 P0-7 npm pack+docker build ✅ 已修(R8) SRE/运维
R9 105处catch{}吞异常(36文件) 安全研究员/核心工程师 P0-1 批量加logger.warn ✅ 已修(R9) 安全研究员
R9 19个.log垃圾文件 SRE/运维 P0-2 删除+gitignore已有 ✅ 已修(R9) SRE/运维
R9 bridge.js独立入口=死代码 核心工程师/架构师 P0-3 删除bridge.js ✅ 已修(R9) 核心工程师
R9 core/目录149文件膨胀 → 10子目录 架构师 P0-5 拆分子目录 ✅ 已修(R10) 架构师
R9 main.js start() 470行 核心工程师 P0-2 拆阶段方法(待执行) ❌ 待修 核心工程师
R9 evolution-integration flaky未根除 测试工程师 P0-6 确认仍flaky(非R9引入) ❌ 待修 测试工程师
R9 P2P通话step-by-step教程 用户支持/竞品分析师 P0-7 文档(待执行) ❌ 待修 用户支持
R10 core/ 129文件拆10子目录 架构师 P0-1 core/拆分 ✅ 已修(R10) 架构师
R10 evolution-integration重写为node:test 核心工程师 P0-3 evolution重写 ❌ 待修 测试工程师
R10 main.js start() 470行拆分 核心工程师 P0-2 main.js拆分 ❌ 待修 核心工程师
R10 lint接入CI SRE P0-5 lint配置 ❌ 待修 SRE
R10 P2P教程+demo 竞品分析师 P0-12 P2P教程制作 ❌ 待修 用户支持
R13 四项原则评审—可交付版本验收标准 技术经理 写入AGENTS.md原则4 ✅ 已修(R13) VC/投资人+SRE
R13 四项原则评审—PRINCIPLE_TRACKING.json Git专家 创建跟踪文件 ✅ 已修(R13) Git专家
R13 四项原则评审—原则3强制执行机制 Code Review 写入AGENTS.md原则3 ✅ 已修(R13) 技术写作者
R13 四项原则评审—换方案触发机制 核心工程师 写入AGENTS.md原则1 ✅ 已修(R13) 核心工程师
R13 四项原则评审—每3轮硬性版号 竞品分析师 写入AGENTS.md原则4 ✅ 已修(R13) 竞品分析师
R14 main.js空catch加logger(5处) 安全研究员 P0-4 ✅ 已修(R14) 安全研究员
R14 CI lint替换eslint.config.js+devDependencies SRE/运维 P0-2 ✅ 已修(R14) SRE/运维
R14 npm run demo一键sandbox体验脚本 用户支持 P0-1 ✅ 已修(R14) 用户支持
R14 P2P端到端demo教程 竞品分析师 P0-3 ✅ 已修(R14) 竞品分析师
R14 src/*.js 59项预存lint错误(no-undef/no-empty等) SRE/运维 P1-后续 ✅ 已修(R15, 59→48) SRE/运维
R14 evolution-integration flaky续存 测试工程师 P1-6 ❌ 待修 测试工程师
R14 Flutter编译状态验证 Flutter开发者 P0-5 ❌ 待修(部分完成) Flutter开发者
R17 测试超时 — --test-force-exit 修复 技术经理 P0-1 ✅ 已修(R17) 测试工程师
R17 lint no-undef 41 → 0 (commands.js 缺 import) 技术经理 P0-2 ✅ 已修(R17) 核心工程师
R17 main.js start() 拆 lifecycle 方法 (_printBanner/_initCoreSystems/_enterSandboxMode) 技术经理 P0-3 ✅ 已修(R17) 架构师
R17 core/ restructure import 路径修复 (agent-monitor/ai-personhood 等12处) 技术经理 P0-3 ✅ 已修(R17) 核心工程师
R17 CI lint gate 加固 (--max-warnings=0) 技术经理 P0-2 ✅ 已修(R17) SRE/运维
R17 evolution-memory.test.mjs import 路径修复 技术经理 P0-1 ✅ 已修(R17) 测试工程师
R17 resident-scheduler class 导出供测试 技术经理 P0-1 ✅ 已修(R17) 测试工程师
R17 agent-loop-e2e 3 个 scheduler 测试全部修复 技术经理 P0-1 ✅ 已修(R17) 测试工程师
R17 main.js 6 处空 catch 加 logger 安全研究员 P0-2 ✅ 已修(R17) 安全研究员
R18 voice_client.dart 编译修复(_onAudioData 重复/UdpHolePunch 孤儿代码/RawDatagramSocket API) 技术经理 P0-1 ✅ 已修(R18) Flutter 开发者
R18 main.js:612 getPublicIPv4 未定义修复 技术经理 P0-2 ✅ 已修(R18) 核心工程师
R18 全项目 39+ no-empty lint 清零 技术经理 P0-3 ✅ 已修(R18) 核心工程师
R18 CI lint gate 升级 --max-warnings=0 技术经理 P0-4 ✅ 已修(R18) SRE/运维
R19 提交 R18 变更并推送 CI 技术经理 P0-1 ✅ 已修(R19) 13 位专家
R19 语音数据流文档 docs/voice-data-flow.md 技术经理 P0-6 ✅ 已修(R19) 技术写作者
R19 CI 全绿 — bridge lint error(getPublicIPv4) + Flutter analyze(voice_client+pubspec) 技术经理 P0-1 ✅ 已修(R19) 全体
R19 Flutter 依赖修复 — web_socket_channel 加回 pubspec 技术经理 P0-2 ✅ 已修(R19) Flutter 开发者
R19 端到端语音通话验证 — APK 构建通过(CI) 技术经理 P0-3 ⚠️ APK 已生成,待双手机实测 竞品分析师+用户支持
R20 app_themes.dart 死代码删除 架构师/Flutter开发者/Git专家/核心工程师/开源社区经理 P0-1 ✅ 已修(R20) 架构师
R20 README Quick start 加最短路径(下载APK→输入peerId→看到用户) 用户支持/Flutter开发者/竞品分析师/开源社区经理 P0-8 ✅ 已修(R20) 用户支持
R20 README 引用 first-steps.md + p2p-voice-tutorial.md 开源社区经理/用户支持/SRE P1-14 ✅ 已修(R20) 开源社区经理
R20 COMPILATION_BOUNDARY.md 补充 CI paths-ignore: docs/** 架构师/测试工程师/SRE P1-5 ✅ 已修(R20) 架构师
R20 version.dart 硬编码预签名 URL 删除,改为运行时 _presignedUrl() Qiniu/S3专家/Git专家/SRE P1-9 ✅ 已修(R20) Qiniu/S3专家
R20 qiniu-direct-arch.md 补充音频文件 ACL 说明 + 删除过期 UDP hole punch 描述 安全研究员/Qiniu专家/测试工程师 P1-10 ✅ 已修(R20) 安全研究员
R21 voice_room_screen.dart 改为 SDUI 渲染(+增强 _button 支持 icon/iconSize/size/color + mic_off/call_end 图标) 技术经理 (P0-2 12票) P0-2 ✅ 已修(R21) 全体
R21 RS API 残留代码从 Flutter 客户端完全删除(_rsPut/_rsGet/_rsList/_rsDelete + _uploadToken + 4 个 per-op flag),默认全走 S3 V4 安全研究员/Qiniu专家/核心工程师 P1-8 ✅ 已修(R21) 安全研究员
R21 CI workflow_dispatch 默认 build_apk: false + 条件检查 inputs.build_apk 测试工程师/SRE/Git专家 P0-4 ✅ 已修(R21) 测试工程师
R21 COMPILATION_BOUNDARY.md 诚实标注 voice_room 非 SDUI(P0-2 12票承认) 技术写作者/竞品分析师 P1-7 ⚠️ 已修: voice_room 改为 SDUI,数字从 95%→85% 技术写作者
R22 _handleAction 改为可扩展(_customActions map + exec: 前缀),新 action 可通过 map 注册 架构师/Flutter开发者/核心工程师/竞品分析师/开源社区经理 P0-2 ✅ 已修(R22) 架构师
R22 catch(_) 吞异常加日志(_pollResponse/record stream/pollEncodedAudio) 安全研究员/用户支持/Flutter开发者 P0-4 ✅ 已修(R22) 安全研究员
R22 CI flutter-apk 拆分:analyze-only(所有 Flutter 改动)+ build-only(仅 Dart/pubspec/gradle) 时间管理师/测试工程师/SRE/Git专家 P0-3 ✅ 已修(R22) SRE/运维
R22 COMPILATION_BOUNDARY.md 重写:85%+诚实列出 APK 场景+决策树修正 技术写作者 P0-5 ✅ 已修(R22) 技术写作者
R22 AGENTS.md "95%→85%" 技术写作者 P0-5 ✅ 已修(R22) 技术写作者
R22 AK/SK + endpoint/region 硬编码(仍需 APK) 架构师/安全研究员/Qiniu专家/SRE/竞品分析师 P0-1 ❌ 待修(需 Bridge 端签名代理) 安全研究员
R23 Bridge GET /api/v1/config/storage-config 端点 + Flutter initFromBridge() 运行时下发凭证 架构师/安全研究员/Qiniu专家/SRE/竞品分析师 P0-1 ✅ 已修(R23) 安全研究员
R23 _handleAction 可扩展(_customActions map) 架构师/Flutter开发者/核心工程师/竞品分析师/开源社区经理 P0-2 ✅ 已修(R22) 架构师
R23 CI flutter-build 拆分(analyze-only × build-only)+ 所有 catch 日志 时间管理师/测试工程师/SRE P0-3/4 ✅ 已修(R23) SRE/运维
R23 版本宣布 v0.2.0-alpha 时间管理师/竞品分析师 P0-5 ✅ 已修(R23) 时间管理师
R23 docs/sdui-quickstart.md — 5 分钟改 UI 指南 用户支持/技术写作者/开源社区经理 P0-8 ✅ 已修(R23) 用户支持
R24 SDUI null fallback 改为功能完整的硬编码 UI(按钮/图标/文字) 用户支持/时间管理师 P0-3 ✅ 已修(R24) 用户支持
R24 fetchConfigFile 加 in-memory 缓存,失败时返回上次成功加载的配置 Qiniu专家/用户支持/SRE P0-2 ✅ 已修(R24) Qiniu专家
R24 docs/sdui-quickstart.md 补充 _customActions 注册文档 技术写作者/开源社区经理 P0-5 ✅ 已修(R24) 技术写作者
R24 exec: 前缀 RCE — 已不存在于代码中(R23 cleanup 时已删除,专家误判) 安全研究员 P0-1 ✅ 无需修改 安全研究员
R24 voice_room 5 个 crash 点全加固(null 断言+try-catch) 用户/架构师 ✅ 已修(R24) 架构师
R24 chat_list_screen.dart → SDUI(加载 oc/config/ui_chat_list.json) 用户 ✅ 已修(R24) 用户
R24 docs/ui_chat_list.json 参考 JSON 技术写作者 ✅ 已修(R24) 技术写作者
R25 fetchConfigFile 重试 (指数退避 0/1/2s) + 缓存保底 SRE/Qiniu专家 P0-4 ✅ 已修(R25) SRE
R25 docs/sdui-coverage.md 覆盖矩阵 技术写作者/用户支持 P1-6 ✅ 已修(R25) 技术写作者
R25 核心 4 页全硬编码 (P0-1 11票) — 转换为 chat_screen SDUI + main_shell 导航 全体 P0-1 ✅ 已修(R25) 架构师
R25 dev_ide 重写为 SDUI 调试控制台 + agent_hub/resident_detail 从导航移除(AI居民弃用) 用户 ✅ 已修(R25) 用户
R25 双机语音验证 (P0-2 7票) 时间管理师/竞品分析师 P0-2 ⚠️ 待执行 用户支持
R25 SDUI 数据绑定 (P0-3 5票) 架构师/核心工程师 P0-3 ⏳ 待修(R26) 核心工程师
R21 CI workflow_dispatch 默认 build_apk: false + 条件检查 inputs.build_apk 测试工程师/SRE/Git专家 P0-4 ✅ 已修(R21) 测试工程师
R21 COMPILATION_BOUNDARY.md 诚实标注 voice_room 非 SDUI(P0-2 12票承认"当前无法零APK") 技术写作者/竞品分析师 P1-7 ✅ 已修(R21) 技术写作者
R20 ui_design_system.md 更新日期 + 清理旧版引用 技术写作者/竞品分析师 P2-12 ✅ 已修(R20) 技术写作者
R20 双机端到端语音实测 时间管理师/AI研究员/核心工程师 P0-4 ⚠️ 待执行 用户支持+竞品分析师

关键指标(实时)

  • 测试: 147/147 全绿 + 39 provider-kit 测试全绿
  • Lint: 0 errors, 0 warnings ✅
  • CI: 全线全绿(bridge-lint、bridge-test、flutter-test、flutter-apk)
  • APK: 手动触发构建成功,artifact 可下载
  • Flutter: voice_client.dart 编译修复 + people_screen.dart 修复 + record pkg 升级到 6.x
  • Demo: npm run demo 一键 sandbox 体验脚本正常
  • P2P教程: docs/p2p-voice-tutorial.md 完成
  • Bridge Agent E2E: ✅ 手机录音 → 微信 → Qiniu → bridge → agent → 文字气泡 (2026-06-03)

版本计划(时间管理师监管)

多条工作线并行推进,版本号标识当前综合成熟度。每条线独立迭代,不互相阻塞。

工作线 A:音频通路 — 最优先

版本 交付 状态
A1 录音→Qiniu→播放完整链路(队列播放、淡入淡出、Opus/raw/neural 三模式 SDUI 可切、GET 改用 Qiniu RS API 修复手机时钟偏差) ✅ v1.0.0
A2 双手机端到端通话验证 ⏳ 待测试
A3 延迟优化(bufferMs/pollMs SDUI 可调)
A4 UDP 打洞直连

工作线 B:基础设施 — 已完成

版本 交付 状态
B1 Qiniu Direct 架构(注册/发现/预签名 URL)
B2 SDUI 引擎 + 远程配置(JSON→Widget) ✅ CI 编译中
B3 Debug 命令通道 ✅ CI 编译中
B4 远程配置 + 轮询间隔可调 ✅ 代码已提交
B5 CHANGELOG + README 更新 ✅ 已提交

工作线 C:SDUI 化 — 硬编码 UI 逐步迁移到远程配置

版本 交付 状态
C1 Audio mode 切换按钮(Raw/Opus/Neural)→ 纯 SDUI file:write
C2 Voice room 通话界面(状态文字、mute/挂断按钮)→ SDUI 模板变量 📋
C3 Settings/Home 页移除硬编码兜底 📋
C4 新建 UI 功能默认走 SDUI,不改 Dart 📋

工作线 D:双机通话 — 依赖 A 线完成后

版本 交付 状态
D1 互相发现→呼叫→接听→音频通
D2 通话中状态管理(mic mute、挂断)
D3 联系人管理、通话记录

工作线 E:Neural Codec 升级 — 完成 v1 全部迭代

版本 交付 状态
E1 音频链路修复 + AudioProcessor 接入 CI
E2 32 频段 Mel 滤波器组替代 4 正弦波,正弦+噪声混合合成
E3 瞬态编码:能量 onset 检测 + 指数衰减噪声瞬态层
E4 音色模型:16-class 码本 + 残差编码 + 合成时音色整形
E5 Source separation:HPSS 谐波-打击乐分离 + 多轨合成
E6 乐谱表示:自相关 F0 追踪 + 脉冲列激励 + 有声/无声判断

工作线 F:Bridge Agent + IM Bot — Walking Skeleton 已通

版本 交付 状态
F1 provider-kit 收口为单 import gate (provider-service.js)
F2 agent 2-pass 系统 (call-tools + final-answer)
F3 system prompt 改 20-token CoT
F4 response cache + 上下文截断
F5 skeleton-agent.mjs + skeleton.mjs walking skeleton
F6 端到端 IM 链路 (手机录音 → Qiniu → bridge → 文字气泡) ✅ v0.3.0 (2026-06-03)
F7 国内免费模型 + forge proxy 评估 📋

里程碑

版本 含义 条件
v1.0.0 首次可用 单机 Demo 能完整走通(看到用户→呼叫→听到声音)
v1.1.0 双机通话 两台设备端到端语音通
v2.0.0 生产可用 多人组会 + AI 居民接入 + 加密
v3.0.0 高音质音乐通话 Neural Codec E3 以上 + 音乐场景可闻无损

专家意见跟踪

轮次 意见摘要 提出专家 对应任务 状态 验收人
R1 编译边界文档(定义什么需要 APK 编译 vs 远程配置) 架构师 P0-1 ✅ 已修(R1) 架构师
R1 fetchConfigFile 删除 RS API 残留,全程走 S3 Qiniu/S3 专家 P0-2 ✅ 已修(R1) Qiniu/S3 专家
R1 file:write 加路径白名单(oc/config/ oc/debug/ oc/logs/) 安全研究员 P0-3 ✅ 已修(R1) 安全研究员
R1 音频参数远程化(bufferMs、pollMs、codec、采样率等) Flutter 开发者 P0-4 ✅ 已修(R0,audio_config.dart 已有) Flutter 开发者
R1 CI 路径过滤——只有 flutter 改动触发 APK 构建 时间管理师 P0-5 ✅ 已修(R0,CI 已有 dorny/paths-filter) 时间管理师
R1 信令行为远程化(call 流程状态文案/超时/按钮标签) Flutter 开发者 P1-6 ⏳ 待评估
R1 SDUI 行为扩展(action 路由表远程化) 架构师 P1-7 ⏳ 待评估
R1 新人 5 分钟体验文档(不改 Flutter 代码看到效果) 用户支持 P1-8 ⏳ 待评估
R1 CHANGE_DECISION_TREE.md(20 种改动决策表) 技术写作者 P1-10 ⏳ 待评估
R1 改动积攒策略(Flutter 改动每周/攒够 3 个才提交) 时间管理师 P2-11 ✅ 已修(R1,当前策略) 时间管理师
R2 voice_room 状态文本远程化(Calling/Connected 等抽取到 ui_voice.json) Flutter 开发者 P0-1 ✅ 已修(R2) Flutter 开发者
R2 audio.json 新增 DSP 常量(fadeBytes/fadeSamples/demoDelayMs) Qiniu/S3 专家 P0-4 ✅ 已修(R2) Qiniu/S3 专家
R2 来电弹窗文本远程化(incomingTitle/incomingBody/acceptLabel/declineLabel) 用户支持 P0-3 ✅ 已修(R2) 用户支持
R3 AudioConfig/VoiceUiConfig 换方案:Map<String,dynamic> 泛型包装,新增字段零 Dart 改动 架构师 P0-1 ✅ 已修(R3) 架构师
R3 空 catch 吞异常修复(log() 记录错误) 安全研究员 P0-2 ✅ 已修(R3) 安全研究员
R3 版号宣布:v0.1.0-alpha 技术经理 ✅ 已宣布(R3) 技术经理

🔑 关键定位笔记(自检发现,非专家评审结论)

这章节是用户/我自检得出的项目结构定位,不是 13 专家评审流的意见。专门记"以后别再找不到了"的关键路径与能力对照。

38 个实验的"opencode/claudecode 等价物"

位置 bridge/src/experiments/lib/dev-repl.mjssrc/core/dev-repl.mjs 是 1 行跳板)
CLI 入口 bridge/bin/openchat.jsopenchat / openchat server / openchat -c / openchat --goal X
自我定位 实验 22 tool-loop 第 5 行注释:"Multi-turn tool loop ... (like opencode goal)"
实验 10 关系 dev-aux 名字直接含 dev-repl,是它的"骨架测试"(只测模块可加载)
38 里和它最像的 22 tool-loop(多轮工具循环)/ 10 dev-aux(CLI 骨架)
本质 CLI agent 循环:读 ~/.config/openchat/config.json → 建降级链 → 拉 5 个工具模块(system-exec/coding/multi-edit/ast-edit/diff-review)→ provider.chat() 多轮 → 输出 think/tool_call 着色到 stdout
关键能力对照 ✅ 多轮循环 / 工具缓存 / 错误引导 / 思考折叠 / 降级链
❌ 启动 doctor(已补)/ slash 命令(已补 P0)/ 流式输出(未做)/ history 续接(未做)/ TUI(未做)/ subagent(未做)

38 个实验清单速查(桥接实验树

  • 原子层 01-20:01 config / 02 feature-flag / 03 provider-kit / 04 skill-loader / 05 codec / 06 isolation / 07 compressor / 08 qiniu / 09 coding / 10 dev-aux / 11 backpressure / 12 multi-session / 13 process-recovery / 14 code-reviewer / 15 verify-commit / 16 tool-rescue / 17 step-workflow / 18 guardrails-pipeline / 19 guardian / 20 neural-brain
  • 单依赖层 21-34:21 teach-me / 22 tool-loop / 23 code-search / 24 edit-advanced / 25 dev-tools / 26 retry-guidance / 27 storage / 28 relay / 29 p2p / 30 naming / 31 session-tree / 32 system-exec / 33 memory / 34 orchestrator
  • 多依赖层 35-38:35 chat-poller / 36 poll-one / 37 dream-consolidation / 38 goal
  • 灵保并列 5(39-43):waveform-sim / signal-algo / mqtt-push / doc-gen / calendar-parse(在 experiments/lingbao/

用户报"老提示"的真实源头(已修)

用户说 实际位置 修复
"做实验时提示本地没有 LLM 可用" experiments/lib/dev-repl.mjs:127 throw new Error('No available provider') 替换为 await diagnose({silent:false}) 打印 actionable 报告 + 友好 throw
"38 实验里没对应到" 25 dev-tools 有 check_failover 但只读 config 不 ping 端点 provider-health.mjs 补 check_provider_alive 等价能力

2026-06-11 提交(P0 补完 3 项)

文件 作用
bridge/src/experiments/lib/provider-health.mjs 启动 doctor:5 维检查(config 存在/JSON 合法/current.provider/apiKey/真 ping 端点)+ actionable 修复
bridge/src/experiments/lib/provider-health.spec.md R3 spec
bridge/src/experiments/lib/slash-commands.mjs opencode 风格 P0 slash:/help /status /clear /model /exit
bridge/src/experiments/lib/slash-commands.spec.md R3 spec
bridge/src/experiments/lib/dev-repl.mjs +38/-4:调 diagnose 替换 throw + readline 顶部 slash dispatch + banner 升级
AGENTS.md 顶部加 38 实验路由(防下次再找)

2026-06-11 提交(ABC 补完 3 项)

# 文件 作用
A bridge/src/experiments/10.mjs 实验 10 dev-aux 升级:5a/5b 验证 provider-health 契约 + slash 7 用例 + applySlash 关键路径(+43 行)
B bridge/src/experiments/lib/dev-repl.mjs +48/-4 流式输出:接 provider.chatStream,累积 content/toolCalls 边写 stdout,lastStreamed 防重复打印 + 修 max-rounds fallback 边界
C bridge/src/experiments/lib/dev-repl.mjs +18/-2 history 续接:调 repl-history 落盘 user/assistant/tool,-c 启动时灌回 messages,/clear 触发清空
bridge/src/experiments/lib/repl-history.mjs 93 行,消息持久化(~/.openchat/repl-history/<chatId>.json),原子写 + 路径穿越防护 + 1000 条裁剪
bridge/src/experiments/lib/repl-history.spec.md R3 spec
bridge/tests/integration/dev-repl-smoke.mjs 153 行,14 用例端到端 smoke(diagnose/slash/history/消息流),无需 apiKey 也能跑通
MEMORY.md 本节

2026-06-11 评估搁置

  • P2 TUI 升级:opencode-style inquirer TUI(多行编辑/翻历史/Markdown 渲染)。不做:拉新依赖 + diff 超 500 + 收益纯体验。重启条件:dev-repl 成为日常主入口或 ≥2 用户主动提。

2026-06-11 提交(/resume 命令 P0)

文件 作用
bridge/src/experiments/lib/slash-commands.mjs +/resume 命令:无参列 ≤20 个有历史的 session(按 lastActivity 倒序,当前标记)+ by id / 序号跳;+availableSessions ctx 注入(不硬耦合 repl-history)
bridge/src/experiments/lib/slash-commands.spec.md 更新 C1-C8 检查点
bridge/src/experiments/lib/dev-repl.mjs +resumeTo sideEffect 处理:重置 resumedHistory + 灌入目标 session msgs(读不写,保护原 session
bridge/src/experiments/lib/repl-history.mjs 修 Windows EPERM:writeFileSync 替代 .tmp+rename(单用户可接受非原子)
bridge/src/experiments/lib/repl-history.spec.md 同步更新不变量块
bridge/src/experiments/10.mjs 契约测试 7→9 用例(含 /resume 无参/有参)
bridge/tests/integration/dev-repl-smoke.mjs +6 用例 /resume:空/列表/by id/by 序号/当前/找不到;parseSlash 7→9;listCommands 6→7
MEMORY.md 本节

2026-06-11 提交(1+2:provider-failover + /commit 一键提交)

# 文件 作用
1 bridge/src/experiments/lib/failover-picker.mjs pickFirstAlive(fallbacks, cfg) — 对每个候选先 ping 3s, 首个 alive 再 createProvider+connect, 省 5-10s
1 bridge/src/experiments/lib/failover-picker.spec.md R3 spec
1 bridge/src/experiments/lib/provider-health.mjs +导出 pingProvider(name, pcfg, opts) 供 picker 复用(baseUrl 拼接唯一源)
1 bridge/src/experiments/lib/dev-repl.mjs 启动 + 运行时切降级链改用 picker(替代 connect 试错)
2 bridge/src/experiments/lib/slash-commands.mjs +/commit 命令:async 调 ctx.onCommit 拿结果(committed true/false/error),applySlash 改 async 兼容
2 bridge/src/experiments/lib/slash-commands.spec.md C8-C10 检查点(commit 4 结果分支)
2 bridge/src/experiments/lib/dev-repl.mjs 注入 onCommit 回调(动态 import auto-commit, hasGitRepo/gitDiff/generateMessage/autoCommit)
2 bridge/src/experiments/10.mjs parseSlash 9→10 用例
2 bridge/tests/integration/dev-repl-smoke.mjs +4 /commit 用例 + 6 pingProvider + 1 pickFirstAlive;listCommands 7→8
MEMORY.md 本节

2026-06-11 提交(4+5:lint-on-edit + 清理警告)

# 文件 作用
4 bridge/src/experiments/lib/edit-quality-gate.mjs edit_file/write_file/multi_edit/ast_edit 后异步跑 lint, 失败塞 messages+history, 不阻塞 REPL (8s 超时)
4 bridge/src/experiments/lib/edit-quality-gate.spec.md R3 spec
4 bridge/src/experiments/lib/dev-repl.mjs edit tool 完成异步 fire-and-forget checkEditedFile, 失败 [lint-gate] 黄色提示 + 写入 history
4 bridge/tests/integration/dev-repl-smoke.mjs +5 用例:isEditTool 6 + checkEditedFile .json skip + null + 不存在 .js + run 契约
5 bridge/src/experiments/lib/dev-repl.mjs 顶部加 // === invariants === 块(8 条不变量)
5 bridge/src/experiments/lib/slash-commands.mjs 顶部加 invariants 块(7 条)
5 bridge/tests/integration/dev-repl-smoke.mjs 顶部加 invariants 块(5 条)
MEMORY.md 本节

2026-06-11 提交(1:provider cost 统计)

文件 作用
bridge/src/experiments/lib/cost-tracker.mjs 字符→token 粗估(4 字符/token)+ DEFAULT_COST 主流 model 单价 + user 覆盖(providers.<name>.costPer1k)+ CostTracker 类(record/summary/formatSummary/reset)+ compose 入口
bridge/src/experiments/lib/cost-tracker.spec.md R3 spec
bridge/src/experiments/lib/dev-repl.mjs 启动时 new CostTracker(cfg) + 每轮 chat 后 recordUsage + 注入 ctx.costSummary
bridge/src/experiments/lib/slash-commands.mjs /status 加 costSummary 块(多 model 列表)
bridge/tests/integration/dev-repl-smoke.mjs +7 用例:charToToken 5 + lookupCost 3 + 基础 record + 多 model + 未知 model + formatSummary + compose 入口
MEMORY.md 本节

2026-06-24 测试模式:桥端到端验证

快速测试bridge/scripts/test-bridge.mjs):

cd bridge && node scripts/test-bridge.mjs "你好,测试"

自动:写 .msg → Qiniu → 等桥处理 → 读 .reply.epc → 解析 EPC 内容 → 清理。

手动对照

#
node -e "const {qiniuPut}=await import('./src/experiments/lib/storage-lib.mjs'); await qiniuPut('oc/chat/测试会话/'+Date.now()+'.msg', Buffer.from(JSON.stringify({type:'text',text:'你好'}),'utf8'))"

# 收(等几秒)
node -e "const {qiniuList,qiniuGet}=await import('./src/experiments/lib/storage-lib.mjs'); const {parseEpcPayload}=await import('provider-kit'); const f=(await qiniuList('oc/chat/测试会话/')).find(x=>(x.key||x).endsWith('-reply.epc')); if(f){const r=parseEpcPayload(await qiniuGet(f.key||f));console.log(r.content?.slice(0,500))}"

#
node -e "const {qiniuList,qiniuDelete}=await import('./src/experiments/lib/storage-lib.mjs'); (await qiniuList('oc/chat/测试会话/')).forEach(f=>qiniuDelete(f.key||f))"