dsh-im-union 0.1.0 → 0.4.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +182 -1
- package/README.en.md +11 -4
- package/README.md +11 -4
- package/client.js +2224 -649
- package/dsh.plugin.json +7 -7
- package/lib/admin/api.js +2 -1
- package/lib/admin/channels.d.ts +27 -0
- package/lib/admin/channels.js +25 -0
- package/lib/channels/dingtalk-notify.d.ts +118 -0
- package/lib/channels/dingtalk-notify.js +389 -0
- package/lib/channels/email.d.ts +195 -0
- package/lib/channels/email.js +811 -0
- package/lib/channels/matrix-e2ee.d.ts +107 -0
- package/lib/channels/matrix-e2ee.js +338 -0
- package/lib/channels/matrix.d.ts +53 -14
- package/lib/channels/matrix.js +141 -14
- package/lib/channels/meta.d.ts +5 -0
- package/lib/channels/meta.js +42 -1
- package/lib/channels/qq-notify.d.ts +133 -0
- package/lib/channels/qq-notify.js +326 -0
- package/lib/channels/registry.js +3 -0
- package/lib/channels/types.d.ts +4 -0
- package/lib/channels/weixin.d.ts +18 -1
- package/lib/channels/weixin.js +63 -9
- package/lib/client.js +2224 -649
- package/lib/credentials/vault.d.ts +2 -2
- package/lib/credentials/vault.js +103 -5
- package/lib/engine/account-manager.d.ts +48 -3
- package/lib/engine/account-manager.js +178 -14
- package/lib/engine/commands.d.ts +18 -0
- package/lib/engine/commands.js +126 -13
- package/lib/engine/delivery-log.d.ts +2 -0
- package/lib/engine/delivery-log.js +12 -0
- package/lib/engine/gateway.d.ts +77 -1
- package/lib/engine/gateway.js +392 -46
- package/lib/engine/preset-supply.d.ts +44 -0
- package/lib/engine/preset-supply.js +114 -0
- package/lib/engine/relay.d.ts +25 -0
- package/lib/engine/relay.js +109 -0
- package/lib/engine/reply-sanitize.d.ts +25 -0
- package/lib/engine/reply-sanitize.js +68 -0
- package/lib/engine/router.d.ts +30 -2
- package/lib/engine/router.js +45 -4
- package/lib/engine/svg-render.d.ts +11 -0
- package/lib/engine/svg-render.js +57 -0
- package/lib/host-compat/services.js +22 -7
- package/lib/host-compat/session-api.d.ts +30 -1
- package/lib/host-compat/session-api.js +332 -72
- package/lib/host-compat/session-event-tap.d.ts +16 -0
- package/lib/host-compat/session-event-tap.js +45 -0
- package/lib/host-compat/settings-compat.d.ts +4 -1
- package/lib/host-compat/settings-compat.js +22 -7
- package/lib/index.d.ts +14 -1
- package/lib/index.js +264 -8
- package/lib/plugin-log.d.ts +12 -0
- package/lib/plugin-log.js +68 -0
- package/locale/en.json +1 -1
- package/locale/zh.json +1 -1
- package/package.json +15 -9
- package/src/admin/api.ts +2 -1
- package/src/admin/channels.ts +48 -0
- package/src/channels/dingtalk-notify.ts +457 -0
- package/src/channels/email.ts +926 -0
- package/src/channels/matrix-e2ee.ts +368 -0
- package/src/channels/matrix.ts +164 -25
- package/src/channels/meta.ts +47 -1
- package/src/channels/qq-notify.ts +429 -0
- package/src/channels/registry.ts +3 -0
- package/src/channels/types.ts +4 -0
- package/src/channels/weixin.ts +72 -7
- package/src/credentials/vault.ts +102 -5
- package/src/engine/account-manager.ts +199 -15
- package/src/engine/commands.ts +133 -12
- package/src/engine/delivery-log.ts +11 -0
- package/src/engine/gateway.ts +436 -37
- package/src/engine/preset-supply.ts +129 -0
- package/src/engine/relay.ts +133 -0
- package/src/engine/reply-sanitize.ts +81 -0
- package/src/engine/router.ts +129 -78
- package/src/engine/svg-render.ts +71 -0
- package/src/host-compat/services.ts +20 -6
- package/src/host-compat/session-api.ts +664 -384
- package/src/host-compat/session-event-tap.ts +57 -0
- package/src/host-compat/settings-compat.ts +20 -6
- package/src/index.ts +246 -8
- package/src/plugin-log.ts +74 -0
package/CHANGELOG.md
CHANGED
|
@@ -2,9 +2,190 @@
|
|
|
2
2
|
|
|
3
3
|
本项目版本号遵循语义化版本;发布面与宿主兼容矩阵见 `scripts/hosts.mjs`(README 管理块同源)。
|
|
4
4
|
|
|
5
|
+
## 0.4.7(/relay 别名解析)
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
|
|
9
|
+
- **通知账号可用别名绑定**:`/relay <账号>` 先按代理键 `accountId` 直查,缺位再按别名唯一匹配(`AccountPolicy.alias` 由 account-manager 在 registerAccount/updatePolicy 两处同步给引擎);**别名歧义绝不猜账号**(与主动投递「歧义不猜」同纪),回执明确要用户改用账号 ID;`/relay` 无参未绑定时回可操作用法提示(钉钉无需目标 / QQ 用 `账号:openid`)
|
|
10
|
+
|
|
11
|
+
## 0.4.6(IM 简洁预设 + SVG 图表 + 富结构净化)
|
|
12
|
+
|
|
13
|
+
### Added
|
|
14
|
+
|
|
15
|
+
- **IM 简洁预设 `im-concise`(预设层屏蔽,架构正解)**:插件把内置 agent 预设幂等供给到 `$DSH_HOME/.agent-presets/im-concise/`(`managed-by` 所有权头;用户自管不覆盖),IM 会话默认使用(账号级 agentPreset 优先)。`persona.complete: true` 完整系统提示模式——genui(dsh-ui 围栏教学)与 dsh-raw-html-v2(裸 HTML 引导)追加的 prompt 段一律进不来,从源头压掉结构体输出;persona 是系统提示,不随轮次累积(prompt cache 可命中),比每回合前缀省 token
|
|
16
|
+
- **SVG 图表出图**:IM 会话输出 svg 围栏 → 出站提取 → sharp 渲染 PNG(宿主 profile 自带则用,缺位降级)→ 渠道图片消息发送(微信 iLink type:2 image_item);失败不阻断正文
|
|
17
|
+
- **出站净化(兜底,零 prompt 成本)**:dsh-ui / html 围栏替换为省略提示;裸 svg 抽为图表;raw-html 卡片(vcp-root/style 等)剥结构留文字;其它代码围栏占位保护不误伤;SVG 上限 3 张
|
|
18
|
+
|
|
19
|
+
### Changed
|
|
20
|
+
|
|
21
|
+
- **每回合 IM 纪律前缀默认关闭**(imReplyDiscipline 默认 false):每轮拼接会进对话历史累积浪费;仅预设不可用的老宿主需置 true
|
|
22
|
+
|
|
23
|
+
## 0.4.4(任务树过滤 + tab 随会话类型)
|
|
24
|
+
|
|
25
|
+
### Fixed
|
|
26
|
+
|
|
27
|
+
- **任务页不再出现「未分组 IM 会话」**:官方任务树吃 `props.useSessions`,改注入过滤版(ids 滤 `im:` 前缀 + byId 重建)
|
|
28
|
+
- **tab 随会话类型而非硬切**:打开 `im:` 会话留在/切到「频道」,打开普通任务切回「任务」
|
|
29
|
+
|
|
30
|
+
## 0.4.3(wrap 样式对齐参考 + 会话点击修复)
|
|
31
|
+
|
|
32
|
+
### Fixed
|
|
33
|
+
|
|
34
|
+
- **tab 样式去自造框**:任务/频道切换改为参考(dsh-im-connect `ima-tab`)同款——无框透明底、`gap:18px`、底部 1px 分隔线、选中态 `box-shadow:inset 0 -2px 0 currentColor` 下划线高亮;删除自造圆角边框按钮
|
|
35
|
+
- **频道内会话点击无效**:`openUnionSession` 旧实现直读 `ctx.uiWorkspace`(未 inject 服务属性访问被 Cordis 代理抛错并吞掉,且 alpha.2+ 宿主 `sessions.retain` 存在时 `sessions.open` 不写 mainView);改 `probeService` 软读(reflect.get → ctx.get)+ 参考同款打开链:`props.openSession/open` 优先 → `uiWorkspace.openSession` → `retain` 存在禁回退 → `sessions.open`;打开成功后自动切回任务页(参考 followSidebarTab 同语义)
|
|
36
|
+
|
|
37
|
+
## 0.4.2(侧栏 wrap 真形态:任务/频道分离标签)
|
|
38
|
+
|
|
39
|
+
### Fixed
|
|
40
|
+
|
|
41
|
+
- **任务/频道分离标签(Phase 6 task_20 补正)**:0.4.1 仍在往宿主 `__dshNativeTabs` registry 插页签(宿主无该面时整块不显示)——按用户裁定重写为真 wrap:直接包裹 `sidebar.workspaces` 官方任务树组件,自建顶部「任务 / 频道」两页签(任务=渲染原官方组件,频道=本插件 rail),`slots.subscribe` + 250ms×40 重试环保同步;已包裹检测(`__imConnectWrapped`/`__dshNativeTabHost`/`__dshAutomationWrapped`)绝不插手;渲染失败 ErrorBoundary 回落官方树
|
|
42
|
+
|
|
43
|
+
## 0.4.1(渠道视图自持 + 标题投影 + 模型白名单 + relay 抄送)
|
|
44
|
+
|
|
45
|
+
### Added
|
|
46
|
+
|
|
47
|
+
- **模型白名单(Phase 7)**:插件级 `model-whitelist.json` 存储,`/models` 只列白名单内模型,`/model` 越界拒绝并列可用项;空数组=不限(现状兼容);admin `GET/POST /model-whitelist` 管理面 + 设置面板 textarea 编辑
|
|
48
|
+
- **final 抄送 relay(Phase 8)**:会话级绑定到通知渠道账号(`relay-bindings.json`,持久化,多对一);收轮后 `finalText` 自动推送到对应通知渠道(带 `[渠道/会话]` 前缀 + 同款收轮后缀);`/relay <账号|->` 命令绑定/解绑/列表;admin `GET/POST /relay-bindings` 端点 + 设置面板通知账号行「绑定会话」UI;支持 `accountId:targetId` 形(qq-notify 等显式推送目标)
|
|
49
|
+
- **/sessions 标题投影**:两级提取 `projections.values.title` → `r.title`(参考 dsh-im-connect chat-commands.ts:17),行格式「N. 标题〔标注〕+ 次行完整 id」,无标题回退 chatId 段
|
|
50
|
+
- **渠道视图自持(Phase 6)**:不再插别人注册的切换标签,自持 wrap 形态包裹宿主官方会话树(检测 `__dshNativeTabHost`/`__imConnectWrapped` 即绝不插手、隔离优先);rail 降级为设置面板「渠道」卡片可用
|
|
51
|
+
|
|
52
|
+
## 0.4.0(会话轮换 + 会话过滤 + 原生渠道侧栏 + 发送链路加固)
|
|
53
|
+
|
|
54
|
+
### Added
|
|
55
|
+
|
|
56
|
+
- **/new 真轮换**:会话 id 此前确定性派生(`im:union:<channel>:<kind>:<chatId>`,无纪元),/new 解绑后下一条消息重建同 id,宿主原样续旧会话——「/new 无效」根因。现轮换 id 追加 13 位毫秒纪元(同毫秒单调自增防撞,dsh-im-connect session-id 同款);空闲守卫(运行中提示先 /stop);先建新会话成功才换绑(失败保持旧绑定可用,D7 邻近纪律);旧绑定转入历史(`/sessions` 标「已解绑」、`/session` 可再接续)
|
|
57
|
+
- **/sessions 过滤口径**:默认只列 `im:union:` 前缀的本插件会话(防未归档会话刷屏,用户裁定),每页 10 条 + ←当前/[运行中]/[已解绑] 标注;`/sessions all` 展开宿主全量同分页;序号选择走 15 分钟 TTL 缓存(≤256 条,chatKey 隔离,dsh-im-connect 同款量级)——所见即所绑
|
|
58
|
+
- **原生渠道侧栏(渠道视角)**:数据面 `GET /api/dsh-im-union/channels`(im:union: 会话按渠道分组,合并绑定/历史/最近出站态,行键白名单零 secret,扫描上限 500);客户端 rail(渠道分组 + 搜索框 + 运行状态点 + 相对时间 + 点击打开会话),挂载降级链:原生 tab registry(宿主自带或 im-connect 壳)插 `im-union-channels` 页签 → 独立 `sidebar.channels` 槽 → 仅日志;`--dsw-alias-*` 令牌全带 fallback;9 语本地化
|
|
59
|
+
|
|
60
|
+
### Fixed
|
|
61
|
+
|
|
62
|
+
- **发送链路「受理≠送达」(desktop 实证:ret=0 受理但微信端不显示)**:getupdates 游标持久化(滚动即落盘、connect 恢复,dsh-im setGetUpdatesBuf 对齐)——重启不再空游标重放旧消息窗;sendmessage 应答落 info 日志(to/项数/ret,不落正文);token/context 类确定性失败换最近入站 token 单次重发(被拒发送无重复投递,不违 D7),token 无更新不重发如实抛;账号行「最近发送」诊断位(lastSendOk/lastSendAt)
|
|
63
|
+
|
|
64
|
+
## 0.3.9(入站失聪根因 + 全链路排障可见性)
|
|
65
|
+
|
|
66
|
+
### Fixed
|
|
67
|
+
|
|
68
|
+
- **多轮对话后「无反应」且零日志(desktop 真机实证)**:投递账本显示插件侧四个回合全部 `delivered`(微信服务器受理),但 12:16 后入站零记录——微信 iLink 长轮询循环在会话过期(`-14`)等故障下**静默退出**,而连接器生命周期日志从未接线(工厂调用漏传 `logger`,缺省无操作函数),排障死角。现:连接器日志接通 plugin.log(info 级:连接建立/轮询退出/`-14` 过期/退避重试全部可见);`-14` 会话过期在设置页账号行以红条提示「需重新扫码」;`TimeoutError` 死分支清理(超时已被归一为不确定错误走退避重试,永不退轮——回归测试锁定)
|
|
69
|
+
- **排障基线日志(plugin.log 可见)**:入站到达(渠道/类型/用户)、会话解析(请求 id → 宿主实际 id,UI 会话列表对号的关键证据)、回合完成摘要(turn/收轮原因/投递字数)三级 info 落盘——此后任何「没反应」都能在日志对上号
|
|
70
|
+
|
|
71
|
+
## 0.3.8(会话事件总线 + im: 前缀——频道分组与回传闭环)
|
|
72
|
+
|
|
73
|
+
### Fixed
|
|
74
|
+
|
|
75
|
+
- **回答不回传(desktop 真机实证)**:@Remote('follow') 是 stream 形态,直调结果不产出事件帧——回合事件零到达,全部走 10 分钟看门狗超时。新增会话事件面:宿主 cordis 总线 **session/event**(core/session Events 声明的全量 firehose,envelope {type,seq,time,data} 与引擎消费形一致)按 sessionId 扇出给每回合订阅者,总线优先、缺位自动回退 follow 旧路;启动日志标明当前事件面
|
|
76
|
+
- **wx 会话落在「任务/未分组」**:宿主侧栏按 sessionId 前缀分「频道」页(dsh-im-connect 源码锚点:「IM 与任务的区分靠 sessionId 的 im: 前缀」),旧 imu: 前缀永远进不了频道。隐式会话 id 改为 **im:union:<channel>:<kind>:<chatId>**(union 段防其它 IM 插件撞名)。旧绑定在内存、重启即换新前缀;旧 imu: 会话仍在盘上,可从任务列表手动删除
|
|
77
|
+
|
|
78
|
+
## 0.3.7(0.2.x 宿主 Remote 形态收敛——任务提交 roundtrip 闭环)
|
|
79
|
+
|
|
80
|
+
### Fixed
|
|
81
|
+
|
|
82
|
+
- **desktop 真机实证「任务提交失败:Cannot read properties of undefined (reading 'throwIfAborted')」**:0.2.x 线 `@Remote('prompt')` 签名是 `(request, signal)`(index.ts:346-349 进门即 `signal.throwIfAborted()`),旧调用只传 request 一参。现 prompt/steer/list 全部按新形态带 `AbortController().signal`,并补 `clientTimeZone`(类型面可选);老线位置参形保留为回退
|
|
83
|
+
- **follow 双形态收敛**:0.2.x 线 `follow({address}, signal)` 返回 **AsyncIterable 帧流**(snapshot / event / assistant-stream 三种),旧线 `(sessionId, onEvent) → 退订函数`。运行时探测:返回异步迭代器即泵帧(只投 `event` 帧的 `.event`,snapshot 防重放、assistant-stream 为 Web 呈现专用均不投),否则以正确实参落旧形态;退订 = abort 泵
|
|
84
|
+
|
|
85
|
+
## 0.3.6(插件自有文件日志 + 检查连接不再 500)
|
|
86
|
+
|
|
87
|
+
### Added
|
|
88
|
+
|
|
89
|
+
- **`<stateDir>/plugin.log`**:desktop/Electron 宿主的日志管线无文件落点(AppData 只有 crash dump,~/.dsh/logs 只有 CLI 启动日志),管理面 500 的「请查看本机日志」无处可看。插件现在把 info/warn/error 分流追加到 plugin.log(512KB 滚动保留 .1),宿主管线照走;管理面 500 的真实错误随之落盘
|
|
90
|
+
- 「检查连接」在适配器构建失败(如凭据缺失工厂即抛)时不再抛 500「操作失败」——转诊断行 `{name:'connect', status:'failed', hint}`,面板直接看到原因
|
|
91
|
+
|
|
92
|
+
## 0.3.5(凭据读取面修复——botToken「缺失」真相收口)
|
|
93
|
+
|
|
94
|
+
### Fixed
|
|
95
|
+
|
|
96
|
+
- **凭据缺失(真机 desktop 实证三层叠加,token 其实一直在库里)**:
|
|
97
|
+
① `ServiceVault.resolve` 只解包 `{ secret }`,而宿主锚点(packages/credentials/credentials)的 resolve 回 **`ResolvedCredential { value, source }`**——值在宿主凭据库里、读取永远 miss。现按 `裸串 / { value } / { secret }` 三形解包,空串按缝规则视作未存储;
|
|
98
|
+
② 历史写入路径遗留**双前缀 ref**(真机 `.credentials.yaml` 里是 `IM_UNION_WEIXIN_WEIXIN_<id>_BOTTOKEN`,规范 ref 是单前缀)——读取增加旧别名兜底,命中即自愈写回规范 ref(归一失败不阻断本次应答);
|
|
99
|
+
③ 0.3.3 迁移包装的顺序缺陷:`primary.set` 后**不回读就删旧文件副本**——主库读写形态不一致时会把唯一副本删成永久丢失。现改为回读校验通过才清理,回读失败保留旧副本并告警(set 路径同纪律)
|
|
100
|
+
|
|
101
|
+
## 0.3.4(会话后端惰性升级 + 权限预设/命令执行开关——账号设置补齐)
|
|
102
|
+
|
|
103
|
+
### Fixed
|
|
104
|
+
|
|
105
|
+
- desktop 装上 0.3.2/0.3.3 后仍报「当前宿主缺少 会话后端 接口」:真机证明会话子系统在 desktop 上是**晚于插件 apply 才提供**(不是已提供未激活——reflect 非严格读同样拿不到),任何 apply 期冻结探测都必然误判 none 且永不恢复
|
|
106
|
+
- session-api 重构为**惰性后端**:apply 未见子系统时起步 none 面,`backend` 每次访问(引擎每回合 / /session-catalog / /state 诊断都经此)重新软读;子系统一旦就绪立即升级原生面并**粘住不回退**(服务提供后不会消失),升级打一条 info 日志;`probeSessionBackend` 导出供诊断复用;agentPresets 改升级时点软读(不再依赖 caps 快照)
|
|
107
|
+
|
|
108
|
+
### Added
|
|
109
|
+
|
|
110
|
+
- **权限预设**(对齐 dsh-im-connect / webhook 宿主锚点 `permissionPresets`):账号会话偏好新增「权限预设」——`/session-catalog` 回宿主 `permissionPresets` 目录(names+optionOf+defaultPreset);新会话在 create 后 `permissionPresets.set(session, preset)` 落位(webhook 范式);**改偏好即生效**:对该账号已回路会话逐个补应用(同值重存不重复)
|
|
111
|
+
- **命令执行开关**(im-connect 同款语义):账号设置新增「私聊命令执行」「群聊命令执行」两档,关闭只拦 `/` 命令并回提示明说,普通对话不受影响;`/mute` 保留为静音期唯一逃生门
|
|
112
|
+
- 编辑弹窗设置面常显:后端未就绪时不再整块隐藏——准入/命令开关/工作区(插件本地语义)照常可编辑即时生效,模型/预设/权限等宿主目录类下拉禁用并提示自动升级
|
|
113
|
+
|
|
114
|
+
## 0.3.3(凭据迁移 + 会话偏好可见性)
|
|
115
|
+
|
|
116
|
+
### Fixed
|
|
117
|
+
|
|
118
|
+
- **0.3.2 回归**:desktop 上 credentials 服务接线修好后 vault 主存从文件切到宿主凭据库,旧文件库里已存的 secret(微信 botToken)被孤儿化 → 账号「凭据缺失」掉线。vault 增加迁移包装:主库 resolve 未命中时查历史文件库,命中即自动搬迁进主库再返回(带日志);set/unset 双清旧文件副本防旧值复活;迁移失败不阻断(本次按旧值应答,下次再试)
|
|
119
|
+
|
|
120
|
+
### Changed
|
|
121
|
+
|
|
122
|
+
- 账号卡新增会话偏好摘要行(目录尾段 · 预设 · 模型@推理档),有值才显示——修「新设置藏在编辑弹窗里不可见」
|
|
123
|
+
|
|
124
|
+
## 0.3.2(desktop/Electron 宿主会话后端修复 + 软读接线全面审计)
|
|
125
|
+
|
|
126
|
+
### Fixed
|
|
127
|
+
|
|
128
|
+
- desktop/Electron 宿主报「当前宿主缺少 会话后端 接口,该能力已降级」且会话偏好全区不可选——两处宿主线差异叠加:
|
|
129
|
+
① desktop 上插件 apply 可能早于 agents/sessionController 提供方 fiber 激活,`ctx.get` 的 strict 语义(cordis lib/index.js:770,fiber.state!==2 即 undefined)把已在册的服务读丢 → `optionalService` 增加 `ctx.reflect.get(name, false)` 非严格反射兜底(cordis :756 免 inject 要求读取口);
|
|
130
|
+
② 顶层 inject 只声明 webServer,未走 cordis 等待语义 → 对照 dsh-im-connect 同 peer range 同款先例,inject 增加 `agents`/`agentPresets`,宿主备好服务才跑 apply
|
|
131
|
+
- 同类软读接线全量审计后补齐(同一 strict 语义下的另外两处静默降级):
|
|
132
|
+
inject 再增 `credentials`(读丢 → 凭据静默降级明文文件 vault,安全质量损失)与 `llm`(读丢 → 图片输入视觉判定永远 unknown,图片一律走降级文案)——两者均为 dsh-im-connect 同 peer range inject 表成员(全支持线必有)且有实际消费点;`settings-compat.configFormsOf` 的裸 `ctx.get` 补同一 reflect 兜底(内联实现,避免与 services.ts 成 import 环)
|
|
133
|
+
- 接线判定口径(审计结论,注释同步进 inject 声明处):核心必有服务(webServer/agents/agentPresets/credentials/llm)走 inject 等待语义;真可选面(sessionController/workspaceController/sessionPersistence/connection/configForms/fileUploads/workspaceFiles)保持软读 + reflect 兜底,缺位照旧诚实降级;无消费点的 permissionPresets/agentDefaultModel/tools 不接线
|
|
134
|
+
|
|
135
|
+
## 0.3.1(中文环境语言修复 + 投稿审查修复)
|
|
136
|
+
|
|
137
|
+
### Added
|
|
138
|
+
|
|
139
|
+
- `@whiskeysockets/baileys` 声明为 `optionalDependencies`(^6.7.24,随包分发;离线被跳过时渠道启动明确报错不崩溃),修复 awesome 投稿审查指出的「WhatsApp 依赖不随包」问题
|
|
140
|
+
- README 双语新增「安装前提」小节:baileys 随包机制、飞书语音档需系统 ffmpeg(二进制不随包)、iMessage 仅 macOS
|
|
141
|
+
|
|
142
|
+
### Fixed
|
|
143
|
+
|
|
144
|
+
- 声明面陈旧枚举串同步:`package.json` description、`dsh.plugin.json` 双语 description、`scripts/gen-locales.mjs`(及 9 语 locale 产物)中「0.2.1-alpha.3」统一改「0.2.1-rc.2」,与 hosts.mjs 12 tag 枚举对齐(管理块本就同源,此次清的是手写残留)
|
|
145
|
+
- 中文环境面板锁英文:宿主初始 HTML 是 `<html lang="en">`,i18n 启动后才改写为真实语言(真机实测 zh-CN);client 在 factory 顶层冻结语言判定,装载早于宿主 i18n → 中文环境锁死英文面。改为**取词时懒解析** `<html lang>`(`currentLang()`),未知/缺空前缀保守归 zh,其余语言缺键逐条回落 zh 词典;宿主词典层保留逐键优先(`hostDictionary`),语言判定不再走它
|
|
146
|
+
|
|
147
|
+
## 0.3.0(私聊准入 + 会话偏好 + 连接保稳)
|
|
148
|
+
|
|
149
|
+
针对真机反馈三连修:发消息无反应(白名单静默拒)、无预设/模型入口(创建参数丢失)、编辑触发替换凭据(全量重建)。
|
|
150
|
+
|
|
151
|
+
### Added
|
|
152
|
+
|
|
153
|
+
- 私聊准入两档(对齐 IM助理):`approved`=仅白名单(缺省,D6 默认拒绝不变)/`all`=所有私聊;账号行显示「私聊全开」标签,编辑弹窗可切
|
|
154
|
+
- 拒绝可见化:私聊被拒回一次带对方 userId 的未授权提示(每用户 10 分钟冷却,防回复风暴);群聊仅在显式 @ 且开关关闭时提示一次,未 @ 保持静默
|
|
155
|
+
- 账号级会话偏好:工作区 cwd / Agent 预设 / 模型(provider+model)/ 推理等级,仅在该账号新建会话时应用;存储于 accounts.json(`session` 对象),设置页弹窗编辑(选项来自新 `/session-catalog` 目录:现有会话 cwd 去重 + sessionController.modelCatalog + agentPresets.list)
|
|
156
|
+
- createSession 主路径换 `sessionController.create`(锚点 dsh-repo packages/api/session-controller:SessionCreateRequest 收 `sessionId/cwd/agentPreset`,sessionIdHint 幂等采纳;老线回退 agents.create meta 路径);模型偏好 create 后 `selectModel` 落位,失败只降级不阻断建会话
|
|
157
|
+
- `/session-catalog` 只读目录接口(回包零凭据)
|
|
158
|
+
|
|
159
|
+
### Fixed
|
|
160
|
+
|
|
161
|
+
- 「发消息无反应」根因:扫码绑定后无任何代码把用户加入白名单(网关注释声称「渠道层自动入表」但渠道层未实现)→ 全部私聊被静默丢弃;现由拒绝提示 + 准入两档双路解决
|
|
162
|
+
- 编辑保存触发「替换凭据」体感:upsert 原来无条件 teardown+重连;现在仅渠道/config 变化或提供新 secret 值才重建,别名/白名单/准入/偏好编辑原位生效(`updatePolicy` 下发,不再重挂 onMessage——顺带修掉 setAllowlist 重复注册监听导致的消息双投)
|
|
163
|
+
|
|
164
|
+
## 0.2.0(设置面板重设计)
|
|
165
|
+
|
|
166
|
+
对齐 dsh-im(DSH-IM)渠道卡视觉与 dsh-im-connect(IM助理)账号手风琴两个参照系的净室重写。
|
|
167
|
+
|
|
168
|
+
### Added
|
|
169
|
+
|
|
170
|
+
- 面板 v2 骨架:头部(品牌 + 副标语 + GitHub/刷新)→ 统计条(渠道/账号/在线)→ 折叠「运行时诊断」(代际/后端/凭据/上传/产物/Connector + 渠道实现度清单)→ 渠道手风琴卡
|
|
171
|
+
- 渠道卡:品牌色块 logo(15 渠道净室简化 glyph,非官方素材)+ 「仅通知 / 仅 macOS / 规划中」标签 + 账号数 + 添加账号;未实现渠道垫底灰显
|
|
172
|
+
- 账号行:别名 + 内部键 + 状态徽章(已连接/未连接/已暂停)+ 凭据缺失提示(缺哪些键)+ 检查连接 / 编辑 / 暂停恢复 / 两步删除;白名单编辑收进折叠节,纯通知渠道自动隐藏
|
|
173
|
+
- 添加/编辑统一弹窗:微信为扫码流(先建档 skipConnect 再取码,confirmed 后别名/配置保留);其余渠道按 meta.fields 出双列表单,secret 用 password 框(留空=保持)、helpUrl 外链、必填星标
|
|
174
|
+
- 账号编辑:/accounts 回显明文 config(按 meta plain 字段白名单过滤,secret 永不回显,D4 同源)供编辑预填
|
|
175
|
+
- UI 语言按宿主 `<html lang>` 选取内置词典(9 语,缺键逐条回落 zh)
|
|
176
|
+
|
|
177
|
+
### Fixed
|
|
178
|
+
|
|
179
|
+
- client 把 plain 字段也塞进 secrets 提交,而 upsert 只入库 secret 字段——email 的 address/imapHost/smtpHost 等必填明文、飞书语音档位等全部被静默丢弃;现按字段类型归位(plain → record.config,secret → secrets)
|
|
180
|
+
|
|
181
|
+
### Changed
|
|
182
|
+
|
|
183
|
+
- 样式从内联 style 改为单 `<style data-plugin>` 注入;颜色全部走 `var(--dsw-alias-*, fallback)` 消费链(本地 `--diu-*` 别名),暗/浅色零分支,窄容器容器查询降列
|
|
184
|
+
- /state 渠道清单增发 hostRequirement(设置页打「仅 macOS」标签)
|
|
185
|
+
|
|
5
186
|
## 0.1.0(首个功能版,dist-tag=latest)
|
|
6
187
|
|
|
7
|
-
M1–M3 代码侧全量:
|
|
188
|
+
M1–M3 代码侧全量:12 渠道适配器(11 平台)+ 跨版本窄腰 + 会话引擎 + 管理面。
|
|
8
189
|
|
|
9
190
|
### Added
|
|
10
191
|
|
package/README.en.md
CHANGED
|
@@ -3,17 +3,18 @@
|
|
|
3
3
|
A union IM bridge for DeepSeek Harness — a clean-room reimplementation merging the capability sets of xmanrui/dsh-im and MichengAI/dsh-im-connect, with no source copied from either.
|
|
4
4
|
|
|
5
5
|
<!-- host-compat:begin — generated by scripts/sync-hosts.mjs from scripts/hosts.mjs; DO NOT EDIT -->
|
|
6
|
-
- **Supported DSH hosts:** `0.1.2-rc.1` `0.1.5-rc.1` `0.1.5-rc.2` `0.1.5-rc.3` `0.1.7-rc.1` `0.1.7-rc.2` `0.2.0-rc.1` `0.2.0-rc.2` `0.2.1-alpha.2` `0.2.1-alpha.3` `0.2.1-rc.1` (
|
|
6
|
+
- **Supported DSH hosts:** `0.1.2-rc.1` `0.1.5-rc.1` `0.1.5-rc.2` `0.1.5-rc.3` `0.1.7-rc.1` `0.1.7-rc.2` `0.2.0-rc.1` `0.2.0-rc.2` `0.2.1-alpha.2` `0.2.1-alpha.3` `0.2.1-rc.1` `0.2.1-rc.2` (12 rc/alpha releases across lines 0.1.2 / 0.1.5 / 0.1.7 / 0.2.0 / 0.2.1)
|
|
7
7
|
<!-- host-compat:end -->
|
|
8
8
|
|
|
9
9
|
## Status
|
|
10
10
|
|
|
11
|
-
**0.
|
|
11
|
+
**0.4.7**: all 15 channel adapters (12 platforms including email; WeCom/DingTalk/QQ each contribute two: bot + self-built app or notify tier), the cross-version narrow waist, session engine, approval/question IM loop, multi-account management, the native Tasks/Channels sidebar split, the IM-tuned agent preset with reply sanitisation, svg-fence-to-image rendering and `/relay` final-answer mirroring are delivered (728 unit tests; host-farm smoke green on 0.1.2 / 0.1.5 / 0.1.7 / 0.2.1 lines; verified end to end on a real desktop profile with browser inspection up to 0.4.6). Outstanding real-device acceptance items are registered in CHANGELOG.
|
|
12
12
|
|
|
13
13
|
Highlights:
|
|
14
14
|
|
|
15
|
-
- **Channels**: WeChat (official iLink QR bind), Feishu/Lark (long-connection, streaming cards, optional voice tier), Telegram, Discord, WeCom intelligent bot, DingTalk (stream + AI Card), QQ official bot, Slack (Socket Mode, zero SDK), WhatsApp (Baileys QR pairing), Matrix, iMessage (macOS only), WeCom self-built app (signed callback webhook), and more; unconfigured channels load nothing (lazy imports).
|
|
16
|
-
- **In-chat loop**:
|
|
15
|
+
- **Channels**: WeChat (official iLink QR bind), Feishu/Lark (long-connection, streaming cards, optional voice tier requiring system ffmpeg), Telegram, Discord, WeCom intelligent bot, DingTalk (stream + AI Card, plus a custom-robot notify tier), QQ official bot (plus notify tier), Slack (Socket Mode, zero SDK), WhatsApp (Baileys QR pairing; the dependency ships as an optionalDependency), Matrix, iMessage (macOS only), WeCom self-built app (signed callback webhook), Email (IMAP/SMTP thread routing), and more; unconfigured channels load nothing (lazy imports).
|
|
16
|
+
- **In-chat loop**: 25 commands (`/help /status /new /stop /steer /model(s) /reasoning /preset(s) /session(s) /workspace(s) /fork /rename /queue /mute /unbind /goal /delivery /export /speak /relay /menu`); tool approvals and agent questions answered in the originating chat (deny-by-default, 5-minute expiry, initiator only).
|
|
17
|
+
- **IM-friendly output**: a native sidebar that splits **Tasks / Channels** into two self-owned tabs (wraps the host's official task tree, IM sessions filtered out of Tasks; stands down entirely when another plugin already owns the slot); an `im-concise` agent preset whose complete-mode persona keeps rich-structure injections (GenUI fences, raw HTML) out of text-only chats, with reply sanitisation as a backstop; ```svg fences rendered to PNG and sent as images (degrades to plain text when no renderer is present); a model allowlist as an out-of-channel guardrail; and `/relay` mirroring of each turn's final answer to notify channels (DingTalk group webhook / QQ active push), addressable by account ID **or** alias.
|
|
17
18
|
- **Cross-version**: settings surface auto-adapts gen1/gen2/gen3; capability probing only, never version branches.
|
|
18
19
|
|
|
19
20
|
## Install
|
|
@@ -24,6 +25,12 @@ dsh plugin --profile web add dsh-im-union@latest --registry=https://registry.npm
|
|
|
24
25
|
|
|
25
26
|
Then add accounts in the "IM union bridge" panel: most channels use credential binding (secrets are one-way into the vault and never echoed back); WeChat/WhatsApp use QR pairing; the WeCom self-built app channel requires pointing your callback URL (`/api/dsh-im-union/wecom-app/callback`) in its console. See `SECURITY.md` for the non-negotiable privacy red lines and `THIRD_PARTY_NOTICES.md` for the clean-room provenance.
|
|
26
27
|
|
|
28
|
+
**Install prerequisites**:
|
|
29
|
+
|
|
30
|
+
- The WhatsApp channel's `@whiskeysockets/baileys` is declared in `optionalDependencies` and installs with the package; if skipped while offline, the channel fails fast with a clear "not installed" message instead of crashing.
|
|
31
|
+
- The Feishu voice tier requires system `ffmpeg` on PATH (the transcoding binary is not shipped; it is only invoked when the voice tier is enabled).
|
|
32
|
+
- The iMessage channel is macOS only.
|
|
33
|
+
|
|
27
34
|
## Development
|
|
28
35
|
|
|
29
36
|
```sh
|
package/README.md
CHANGED
|
@@ -3,17 +3,18 @@
|
|
|
3
3
|
DeepSeek Harness 的 IM 联合桥——净室重写,能力合集来自社区两仓(xmanrui/dsh-im 与 MichengAI/dsh-im-connect),不复制其源码。
|
|
4
4
|
|
|
5
5
|
<!-- host-compat:begin — generated by scripts/sync-hosts.mjs from scripts/hosts.mjs; DO NOT EDIT -->
|
|
6
|
-
- **支持的 DSH 宿主:** `0.1.2-rc.1` `0.1.5-rc.1` `0.1.5-rc.2` `0.1.5-rc.3` `0.1.7-rc.1` `0.1.7-rc.2` `0.2.0-rc.1` `0.2.0-rc.2` `0.2.1-alpha.2` `0.2.1-alpha.3` `0.2.1-rc.1`(覆盖 0.1.2 / 0.1.5 / 0.1.7 / 0.2.0 / 0.2.1 共
|
|
6
|
+
- **支持的 DSH 宿主:** `0.1.2-rc.1` `0.1.5-rc.1` `0.1.5-rc.2` `0.1.5-rc.3` `0.1.7-rc.1` `0.1.7-rc.2` `0.2.0-rc.1` `0.2.0-rc.2` `0.2.1-alpha.2` `0.2.1-alpha.3` `0.2.1-rc.1` `0.2.1-rc.2`(覆盖 0.1.2 / 0.1.5 / 0.1.7 / 0.2.0 / 0.2.1 共 12 个 rc/alpha)
|
|
7
7
|
<!-- host-compat:end -->
|
|
8
8
|
|
|
9
9
|
## 状态
|
|
10
10
|
|
|
11
|
-
**0.
|
|
11
|
+
**0.4.7**:15 个渠道适配器(覆盖 12 个平台,含邮件;企微/钉钉/QQ 各含机器人与自建应用或推送两档)、跨版本窄腰、会话引擎、审批/提问 IM 闭环、多账号管理面、原生「任务/频道」侧栏分离、IM 简洁预设与出站净化、SVG 图表转图、final 抄送 relay 均已交付(单测 728 项;宿主农场 0.1.2/0.1.5/0.1.7/0.2.1 四线冒烟全绿;桌面 profile 真机装机与浏览器目视实证至 0.4.6)。真机验收项逐项登记在 CHANGELOG;能力分期见开发仓计划台账。
|
|
12
12
|
|
|
13
13
|
能力总览:
|
|
14
14
|
|
|
15
|
-
- **渠道**:微信(官方 iLink
|
|
16
|
-
- **IM 内闭环**:
|
|
15
|
+
- **渠道**:微信(官方 iLink 扫码)、飞书(长连/流式卡片/语音档可选,语音需系统 ffmpeg)、Telegram、Discord、企微智能机器人(长连)、钉钉(stream+AI Card,另有自定义机器人推送档)、QQ 官方机器人(另有推送档)、Slack(Socket Mode)、WhatsApp(Baileys 扫码,依赖随包 optionalDependencies 分发)、Matrix、iMessage(仅 macOS)、企微自建应用(回调)、邮件(IMAP/SMTP 线程路由)等;未配置渠道零依赖零加载(懒 import)。
|
|
16
|
+
- **IM 内闭环**:25 命令面板(/help /status /new /stop /steer /model(s) /reasoning /preset(s) /session(s) /workspace(s) /fork /rename /queue /mute /unbind /goal /delivery /export /speak /relay /menu);工具审批与交互提问原聊天回答(默认拒绝、5 分钟超时、发起者限定)。
|
|
17
|
+
- **IM 友好呈现**:原生侧栏「任务/频道」两页签自持分离(包裹宿主官方任务树,过滤 IM 会话不入任务页;检测到他人已接管则绝不插手);`im-concise` 智能体预设(persona 完整模式从源头阻断 GenUI 围栏/裸 HTML 等富结构注入)+ 出站净化兜底;```svg 围栏自动转 PNG 图片发送(需宿主侧渲染依赖在位,缺位降级纯文字);模型白名单护栏(渠道外兜底集合);`/relay` 回合结果镜像到通知渠道(钉钉群 webhook / QQ 主动推送,可用账号 ID 或别名绑定)。
|
|
17
18
|
- **跨版本**:设置面 gen1/gen2/gen3 三态自适配;能力探测优先,禁版本号分支。
|
|
18
19
|
|
|
19
20
|
## 安装
|
|
@@ -24,6 +25,12 @@ dsh plugin --profile web add dsh-im-union@latest --registry=https://registry.npm
|
|
|
24
25
|
|
|
25
26
|
装好后在宿主侧栏/设置页的「IM 联合桥」面板添加账号:大部分渠道走凭据绑定(Bot Token/App 凭据,secret 字段只单向入库不回显);微信/WhatsApp 走扫码绑定;企微自建应用需将本插件管理面回调 URL(`/api/dsh-im-union/wecom-app/callback`)配入后台接收服务器。隐私与凭据红线见 `SECURITY.md`;第三方依赖声明见 `THIRD_PARTY_NOTICES.md`(净室重实现,不复制任何上游源码)。
|
|
26
27
|
|
|
28
|
+
**安装前提**:
|
|
29
|
+
|
|
30
|
+
- WhatsApp 渠道的 `@whiskeysockets/baileys` 已声明为 `optionalDependencies`,随包自动安装;若安装时离线被跳过,渠道启动时会明确报「未安装」并拒绝,不崩溃。
|
|
31
|
+
- 飞书语音档需要系统 `ffmpeg` 在 PATH 中(转码二进制不随包分发,仅启用语音档时才会调用)。
|
|
32
|
+
- iMessage 渠道仅 macOS 可用。
|
|
33
|
+
|
|
27
34
|
## 开发
|
|
28
35
|
|
|
29
36
|
```sh
|