chore(工作区): 纳入版本控制基线(回收 411 MB 过程产物)

回收 411 MB(470 M → 58.8 M),全部经回收站,可恢复:
- 待清理/(146.2 M,含 relay 分片 128 M 与 42 项过程目录)
- tmp/(32.4 M,按接续棒命名的过程临时区)
- .workbuddy/tmp/(39.5 M)
- 4 份 workbuddy.db 冗余副本(101 M,09-23 事故的坏副本 / 抢救产物)
- tmp/im16/gw/centrifugo 二进制(63.9 M,可重下)+ 缓存残留

入库范围:常驻规则(CODEBUDDY.md / README.md / state.py)、在途接续入口与
接续包、docs/、交付物/、交接单/、归档/、scripts/、.codebuddy/、
.workbuddy/memory/;共 398 件,其中 >60 KB 的 26 件全为文档。

排除(.gitignore):tmp/、待清理/、运行态日志与缓存、*.db 与 DB 备份整目录、
打包二进制(*.tar.gz / *.tgz)、记忆修复前备份。
This commit is contained in:
admin committed 2026-09-24 07:51:03 +08:00
commit ce8e6ceed9
396 files changed
+66045

No files matched your search

@@ -0,0 +1,81 @@
# 自动化执行记录 · IM 线接续棒
> 只记高层摘要:本轮做了什么、读到什么、判了什么。⛔ 不放完整交付物与正文。
---
## 2026-09-22 21:1x · IM 线第 8 棒(执行棒)
**任务**:开工 D 单(`交接单/IM群组-D-插件SDK与扩展点契约.md`),IM 五单合流第四单。
**结果**:✅ 完成。判据全绿,收尾五件套已走完(回填 / 放锁 / 门禁 / 入口 / 日志)。
**关键读数**
- `npm run build` rc=0;`node --test test/im-sdk.test.mjs` = **66/66 过 0 败**;`npm test`(Node 22)= **366/364 过 0 败 2 跳过**(基线 300 ⇒ +66);`check-layering` rc=0 无新增违规。
- 内核零改动:`git diff` 对三个内核文件为空 + `git status --short src/im` 无 `M` 标记。
- 交付:`src/im/sdk/{types,host,index}.ts`(1191 行)+ 三个示例插件(office/mud/trpg,475 行)+ `test/im-sdk.test.mjs`(66 用例)+ SDK 说明页 + `package.json` 2 处登记。
**本轮新固化的坑(重要)**
1. 「内核零改动」判据不能用 `git status --short`(未 commit ⇒ 显示 `??`,假红)⇒ 必须用内容级 `git diff` + 无 `M` 标记。
2. 文档库 `Edit`/`Write` 要求**先持全局执行锁** ⇒ 追加类操作要分批抢锁(写文档 → 放锁 → 门禁 → 再抢锁写入口)。
3. 写库测试的桩必须做表全名归一(`p_<pluginId>_<name>`),否则 ACL 类判据假绿。
4. 熔断降级方向 = **放行**(不是拒绝),否则「插件故障不拖垮房间」被写反。
**未登记下一棒(等拍板,非硬失败)**
E 单开工前必须先定 **UI 落点**,三案(A 门户内嵌 / B 独立页 / C 实例内 slots)各有优有劣、无客观优劣 ⇒ 属 §1 边界外「体验偏好」,⛔ 不替用户拍。⇒ 按 prompt 明示规则**不登记 E 单接续棒**,停手等拍板;已把三案优缺点写进入口 §0 与工作区日志。
另一项仍悬:连接层三候选(E-5 已证「分时扇出」无效)拍板前 ⛔ 不引入外部组件。
**下一棒该做什么**:等用户拍「UI 落点」;拍板到手后登记 E 单(`交接单/IM群组-E-会话界面UI.md`)执行棒。
---
## 2026-09-23 05:2x · IM 线 · 用户「实例内 tab 页」形态可行性调研(只读)
**任务**:回答用户 09-22 末的提问「能否整合到 dsh 会话页面展示,通过 tab 页的方式(dsh 会话、群组会话1、群组会话2…)」。
**结果**:✅ 调研完成,**结论 = 可行,且非新机制**。⛔ 未抢锁、未改文件、未登记接续棒(落点仍待用户拍板)。
**关键证据(5 条,全部来自现网/生产 profile)**
1. 会话区是可寻址 DOM slot:`dsh-plugin-mcn/lib/client.js:306` → `[data-slot="main.conversation"]`(0.1.5-rc.1 起)+ 旧名 `[data-slot="conversation"]` 兜底。
2. 唯一注册式 slot 只用到 `sidebar.footer.action`(`client.js:3025`);官方 slots 表面很窄,会话区靠 **DOM 接管**而非 `slots.register`。
3. MCN 的既有手法 = **嵌入式分栏**(`client.js:453-495`):insertBefore wrapper 接管 conversation + resizer(30~70%) + panel + `createPortal`;CSS `!important` 驱动 flex(防 React 重置 inline);卸载时反向还原。
4. `mcnNav_tabs` / `mcnNav_tab` / `mcnNav_tabActive` **已是现成样式**,但只用在页面内部 —— 用户的诉求即把这套前置到会话区层级。
5. 数据通路免新增:`/api/im/**` 走 `supervisor/proxy.ts` 委托钩子,未命中则原样交回既有子域隧道 ⇒ 实例内用**同源相对路径**即可达;`imAuth` 会话优先,实例内浏览器 tab 天然带 `sid` cookie ⇒ 认用户本人,⛔ 不必动 instance-token 面。
**红线核对**:✅ 不触 R2 —— 走官方公开扩展面,MCN 已在生产如此运行。
**新识别风险**:会话区接管依赖 `[data-slot]` 选择器,官方改槽名会**静默失效**(已被咬过一次)⇒ 必须多选择器兜底 + 失效可见提示。
**用户这案 = 新第四案(C′)**:C 的变体 —— 同为实例内,但「tab 切换」取代「并排分栏」。独有取舍点 = **tab 保活策略**(`display:none` 保存状态 vs 卸载省内存),切 tab 时原 dsh 会话的滚动位置/草稿是否保留。
**仍待拍板 3 项**:① C′ vs A vs B 落点 ② tab 保活策略 ③ 群组 tab 数量上限与新建入口。
---
## 2026-09-23 05:39 · 用户已拍板 + 新建入口调研
**拍板**:落点 = **C 案**(实例内会话区 tab);保活 = **候选一**(`display:none`);群组 tab 上限 = **5**。
新建入口 = **放在插件里**,且用户点名要「**找开源群聊界面作为插件,能看到用户在线情况,点击按钮加入群聊**」。
**🔴 调研发现(E 单必须补的缺口)**:`src/web/routes/im.ts` 只有 6 条路由,`GET /rooms` **按 `isMember` 过滤**、加人要求 `owner|admin` ⇒ **普通用户无法「发现群 → 点按钮加入」**,用户要的按钮**后端无接口**。
- 改动面可控:`rooms.config_json` 已解析成 `room.config`(无需迁移即可放标志);但「公开可加入」属授权语义 ⇒ 按 R7 走**显式列 + v15 迁移(只增)**更合规。
- 在线态**已内建**(`hub.ts` presence,1 s 批合并)⇒ 「看在线情况」有数据源。
- 容量上限 `ROOM_LIMITS.maxMembers = 2000`。
**开源 UI 倾向(需用户确认)**:不引完整开源 IM 前端,改为自建 client bundle + 复用开源**消息区组件**(气泡/虚拟滚动/输入框/@选择器)。理由:dsh 插件 client bundle 有既定形态与 slots 接法,而 Rocket.Chat/Mattermost 是整站应用且数据模型(channel/workspace)与 room/member 不同构,剥离成本 ≈ 重写。
**🔴 锁阻塞**:05:40 起被 `插件投放与分库线-执行棒②` 占用 ⇒ 按 R9 停手。**E 单文档本轮未回填**(拍板结论暂存工作区日志 `2026-09-23.md`),待锁释放后补写 E 单 §四 + 入口 §0。⛔ 未登记接续棒、⛔ 未动仓库文件。
---
## 2026-09-23 05:50–06:00 · 拍板固化完成 + 第 9 棒已登记
**用户第五次拍板**(原话):**「意思是要借鉴 优秀的群聊项目界面功能和交互(按照 ①方案)」** ⇒ 确认**只借鉴交互与组件、⛔ 不引整站开源 IM**。
**执行结果**:✅ 全部落点完成(05:5x 抢到锁 —— `插件投放与分库线-执行棒②` 已放锁)。
- **E 单**(`dsh-server-docs/交接单/IM群组-E-会话界面UI.md`,115 → **169 行**):头部状态改为「✅ 落点已拍板,可开工」;§四-4(C′ + 保活候选一 + 上限 5)/§四-5(新建入口在插件内 + 借鉴开源交互 + **补缺口方案表**);§三 范围重写(改实例内 client bundle + 平台 API 增量);§五 步骤 **新增步 0(补可发现/自助加入)+ 步 2(接管会话区+tab 骨架)+ 步 3(保活与上限)+ 步 8(新建入口+加入交互)**,步骤重编号至 10;§六 判据 **新增 8–13**(tab 形态/保活/上限/槽位失效可见/在线态/发现+加入)+ 判据 7 加例外说明(步 0 若走显式列 ⇒ 新增 v15 属本单声明增量);§七 回滚改为「插件停用 + 卸载反向还原」;§八 回报格式同步。
- **入口**(`接续入口_IM线_20260922.md`,247 行):§0 追加拍板状态行(含技术依据/缺口/风险)+ 下一棒 ID;§2 新增「⏭️ 第 9 棒」节(6 条动作 + 环境注意 + 上游固化事实);§4-1 标记已拍板 + 标志位选型归执行棒自决。
- **登记门禁**:✅ 未命中硬冲突。**已登记第 9 棒** = `b4312852-71ae-41a1-9304-a857cb1d7eba`(`scheduledAt = 2026-09-23T06:03`)。
- ⛔ 未 commit/push/scp、⛔ 未动 47/106、⛔ 未改任何代码文件(本棒 = 落点固化,代码留给第 9 棒)。
**E 单步 0 的二选一(归执行棒自决)**:路线甲 `rooms` 显式列 + v15 只增迁移(倾向)/路线乙 复用 `config_json`。