Files
dsh_ai1net_server/交付物/IM插件接入面-20260925.md
T
admin c1b5e4d966 chore(工作区): 全量入库 + 补齐 .gitignore(以工作区为准)
- 变更规模:新增 514 / 修改 62 / 重命名 155 / 删除 4(归档重组与文档轮次)
- .gitignore 修:`归档/**/db-cwd归一-备份-*/` —— 原规则写绝对层级(归档/db-cwd归一-…),
  目录搬进 归档/配置与备份/ 后**静默失效**,43 MB 的 DB 备份又变成未跟踪
- .gitignore 补:嵌套 git 内部数据(归档/内嵌git-20261008/、归档/skills-git-旧线-20261007/dotgit-原样移出/)
- .gitignore 补:运行态与部署副本(.workbuddy/collab/、.workbuddy/tools/、.workbuddy/.load-pending、.workbuddy/tmp-*)
- .gitignore 补:备份件(*.bak-*)
- 未跟踪文件从 2190 降到 890(其余为 归档/ 归档件与 .workbuddy/memory/ 知识文件,按口径入库)
2026-10-10 23:13:22 +08:00

4.7 KiB
Raw Blame History

交付物 · IM 插件接入面(2026-09-25)

工作区:E:/ProgramData/AIProject/aliyun-dsh-server(⛔ 未改任何别的工作区文件) 起点:群组插件对接单 E:/ProgramData/AIProject/dsh-plugin-partment/对接单_平台侧-IM板块待优化与Macro改造可行性_20260925.md(只读) 代码基线:D:/github/dsh_shenxian(生产口径 dshs)|域锁 3 域,收口后已反序释放 上位:01-规范/09-IM插件SDK与扩展点契约.md(本次已同步)


1. 一句话

把「IM 基础」改造成双向可接入:此前插件只能被宿主调用(入向),没有任何写入口; 现在补上出向端口(广播 / 落库发言)、面板动作、运行时接线器, ⇒ 对接单里那三类插件(协作文档 / 任务卡 / 团队记忆 bot)与后续各类功能插件都能接进来。

2. 查出的总根(比对接单更靠前)

# 实证 后果
G0 new ImSdkHost(...) 在 src/** 零命中;插件 check / onEvent / render 零调用点 「有契约、无载体」:插件注册成功,跑起来一片安静
G1 无任何出向出口(hub.deliverFrame 只在宿主内部用) 交互型插件做不了(无写入口)
G2 PanelContract 只有 render(只读),无 onAction "从面板一键建卡"做不了
G3 ColumnType / COLUMN_SQL 漏 bigtext(底层与 08/DB-03 一直是 9 种) 按规范写 bigtext 会被注册校验拒
G4 08 §3-4 路由指针错(真在 plugin-data.ts) 作者按文档找不到取数实现

3. 交付(本机代码面 · 7 文件 · 内核改动均为纯插入)

文件 加了什么
src/im/sdk/types.ts 扩展点 8 · 出向端口(OutboundContract / ImOutboundPort:frame 不落库广播 · message 落库发言)· 面板动作 PanelActionInput / onAction · 事件补 `panel.opened
src/im/sdk/host.ts 出向注册校验 · 归属闸(缺省 fail-closed)· FrameThrottle 硬上限 · dispatchPanelAction · panelsFor · hasPlugins() 短路 · COLUMN_SQL 补 bigtext
src/im/sdk/binding.ts(新) 接线器:beforeWrite(写前问发言规则)· afterAppend(后台派发;private 不派发)· 面板动作(成员校验)· 四项 fail-closed
src/im/sdk/index.ts 门面导出
src/im/ws.ts(+41/−0) send 分支两处接线
src/web/routes/im.ts(+155/−0) 装配 + 两处钩子 + 两个插件面端点(GET /panels · POST /panels/:panelId/actions)
test/im-sdk.test.mjs +12 用例(⇒ 78 例)

🔴 关键设计取舍(可推翻):对接单建议"给 MessageVisibility 加 system / hidden 档", 未采纳 —— 改内核枚举会连带改 messages 的 CHECK 约束与迁移。本次改用通道分离: 高频 ephemeral 走 frame(不落库、不进历史、不走去重),要历史就走 message(落库)。 ⇒ 一行内核枚举没动,且语义比"加档位"更干净。

4. 判据读数

  • npm run build rc=0
  • node --test test/im-sdk.test.mjs = 78 / 75 过 / 0 败 / 3 跳过
  • npm test = 604 / 594 过 / 5 败 / 5 跳过
  • npm run check:layering rc=0 ✅ 无新增违规
  • 内核改动形态:store.ts / hub.ts 零改动;ws.ts / routes/im.ts 纯插入(numstat 删除列 = 0)

⚠️ 两处失败/跳过都是本机环境问题,⛔ 与本改造无关:IM 侧 3 例 spawnSync git EBUSY; 投放线 shared-layer-sync.test.mjs 5 例 spawnSync tar EBUSY。已把 IM 侧改成具名跳过。

5. 文档同步(对接单 §1 的 P1×2 + P2×3 已消)

  • 01-规范/09-IM插件SDK与扩展点契约.md:§2 加第 8 项 · 新增 §3.5 接线器 · §6 修「事务仅限同前缀多表」→ 本期无事务口 · 补 bigtext / 分片 · §8 判据与 EBUSY 说明 · 新增 §9 出向端口与面板动作
  • 01-规范/08-插件开发与对接规范.md:修 §3-4 路由指针 · 补 SDK 获取方式 · 顶部加 09 指针 · §11 变更记录

6. 未做(点名归属 · ⛔ 本棒不越界)

① 插件清单来源(谁调 binding.host.register(...))=投放线(本棒只装插座与接线) ② 宿主侧 ImDataPort 按 pluginId 装配(面板 reads 取数依赖它) ③ approvedRoomTypes 来源 = admin 审核面 ④ 插件侧 LLM 调用面(对接单 §2-3-4)—— 涉费用,待用户定

⛔ 未部署 · ⛔ 未动 47/106 · ⛔ 未 commit / push · ⛔ 未投放插件 · ⛔ 未改 A–E 五单结论。